diff --git a/python/src/META-INF/IdeTipsAndTricks.xml b/python/src/META-INF/IdeTipsAndTricks.xml
new file mode 100644
index 0000000..41a5feb
--- /dev/null
+++ b/python/src/META-INF/IdeTipsAndTricks.xml
@@ -0,0 +1,113 @@
+<idea-plugin version="2">
+  <extensions defaultExtensionNs="com.intellij">
+    <tipAndTrick file="Welcome.html"/>
+    <tipAndTrick file="MultipleProjects.html"/>
+    <tipAndTrick file="GoToClass.html"/>
+    <tipAndTrick file="CodeCompletion.html"/>
+    <tipAndTrick file="ClassNameCompletion.html"/>
+    <tipAndTrick file="FindUsages.html"/>
+    <tipAndTrick file="QuickJavaDoc.html"/>
+    <tipAndTrick file="GoToDeclaration.html"/>
+    <tipAndTrick file="FileStructurePopup.html"/>
+    <tipAndTrick file="Rename.html"/>
+    <tipAndTrick file="TabInLookups.html"/>
+    <tipAndTrick file="TabInEditorClose.html"/>
+    <tipAndTrick file="SelectIn.html"/>
+    <tipAndTrick file="SpeedSearch.html"/>
+    <tipAndTrick file="Escape.html"/>
+    <tipAndTrick file="CtrlW.html"/>
+    <tipAndTrick file="ExtractVariable.html"/>
+    <tipAndTrick file="CtrlD.html"/>
+    <tipAndTrick file="MoveUpDown.html"/>
+    <tipAndTrick file="JoinLines.html"/>
+    <tipAndTrick file="ParameterInfo.html"/>
+    <tipAndTrick file="JumpToLastEdit.html"/>
+    <tipAndTrick file="HighlightUsagesInFile.html"/>
+    <tipAndTrick file="LocalVCS.html"/>
+    <tipAndTrick file="RecentFiles.html"/>
+    <tipAndTrick file="MethodSeparators.html"/>
+    <tipAndTrick file="CodeCompletionMiddle.html"/>
+    <tipAndTrick file="MethodUpDown.html"/>
+    <tipAndTrick file="ClipboardStack.html"/>
+    <tipAndTrick file="QuickJavaDocInLookups.html"/>
+    <tipAndTrick file="OverrideImplementMethods.html"/>
+    <tipAndTrick file="MenuItemsDescriptions.html"/>
+    <tipAndTrick file="GoToSymbol.html"/>
+    <tipAndTrick file="RecentChanges.html"/>
+    <tipAndTrick file="ImageFileCompletion.html"/>
+    <tipAndTrick file="QuickSwitchScheme.html"/>
+    <tipAndTrick file="CamelPrefixesInNavigationPopups.html"/>
+    <tipAndTrick file="ColumnSelection.html"/>
+    <tipAndTrick file="PyColorFiles.html"/>
+    <tipAndTrick file="CopyWithNoSelection.html"/>
+    <tipAndTrick file="MoveToChangelist.html"/>
+    <tipAndTrick file="moveFileToChangelist.html"/>
+    <tipAndTrick file="ShowUsages.html"/>
+    <tipAndTrick file="GoToAction.html"/>
+    <tipAndTrick file="GoToInspection.html"/>
+    <tipAndTrick file="SearchInSettings.html"/>
+    <tipAndTrick file="SelectRunDebugConfiguration.html"/>
+    <tipAndTrick file="ShowAppliedStyles.html"/>
+    <tipAndTrick file="ImagesLookup.html"/>
+    <tipAndTrick file="RenameCssSelector.html"/>
+    <tipAndTrick file="ColorEditingInCss.html"/>
+    <tipAndTrick file="Spellchecker.html"/>
+    <tipAndTrick file="SpellcheckerDictionaries.html"/>
+    <tipAndTrick file="TagNameCompletion.html"/>
+    <tipAndTrick file="WildcardsInNavigationPopups.html"/>
+    <tipAndTrick file="VcsQuickList.html"/>
+    <tipAndTrick file="Comment.html"/>
+    <tipAndTrick file="NavBar.html"/>
+    <tipAndTrick file="ChangesView.html"/>
+    <tipAndTrick file="Surround.html"/>
+    <tipAndTrick file="Consoles.html"/>
+    <tipAndTrick file="ConsolesCodeCompletion.html"/>
+    <tipAndTrick file="ConsolesHistory.html"/>
+    <tipAndTrick file="QuickFixRightArrow.html"/>
+    <tipAndTrick file="NavigateToFilePath.html"/>
+    <tipAndTrick file="IssueNavigation.html"/>
+    <tipAndTrick file="Managepy.html"/>
+    <tipAndTrick file="Templates.html"/>
+    <tipAndTrick file="Switcher.html"/>
+    <tipAndTrick file="DragToOpen.html"/>
+    <tipAndTrick file="CloseOthers.html"/>
+    <tipAndTrick file="EnterDirectoryInGotoFile.html"/>
+    <tipAndTrick file="GotoLineInFile.html"/>
+    <tipAndTrick file="LineEndings.html"/>
+    <tipAndTrick file="LineEndingsFolder.html"/>
+    <tipAndTrick file="HierarchyBrowser.html"/>
+    <tipAndTrick file="ShowHideSideBars.html"/>
+    <tipAndTrick file="ExcludeFromProject.html"/>
+    <tipAndTrick file="CodeCompletionNoShift.html"/>
+    <tipAndTrick file="CommitCtrlK.html"/>
+    <tipAndTrick file="FindReplaceToggle.html"/>
+    <tipAndTrick file="ScopesInTODO.html"/>
+    <tipAndTrick file="PreviewTODO.html"/>
+    <tipAndTrick file="SelectTasks.html"/>
+    <tipAndTrick file="RunConfigFolders.html"/>
+    <tipAndTrick file="LiveTemplatesDjango.html"/>
+    <tipAndTrick file="LiveTemplates.html"/>
+    <tipAndTrick file="SpeedSearchinLiveTemplates.html"/>
+    <tipAndTrick file="LaunchConsole.html"/>
+    <tipAndTrick file="Interpreter.html"/>
+    <tipAndTrick file="RemoteInterpreter.html"/>
+    <tipAndTrick file="BreakpointSpeedmenu.html"/>
+    <tipAndTrick file="BuiltInServer.html"/>
+    <tipAndTrick file="ConfiguringTerminal.html"/>
+    <tipAndTrick file="Terminal.html"/>
+    <tipAndTrick file="SearchEverywhere.html"/>
+    <tipAndTrick file="WideScreen.html"/>
+    <tipAndTrick file="WordCompletion.html"/>
+    <tipAndTrick file="Reopen.html"/>
+    <tipAndTrick file="Emmet.html"/>
+    <tipAndTrick file="RefactorThis.html"/>
+    <tipAndTrick file="ToolWindowsQuickAccess.html"/>
+    <tipAndTrick file="CamelHumpsInCodeCompletion.html"/>
+    <tipAndTrick file="CancelByControlArrows.html"/>
+    <tipAndTrick file="ChangeSorting.html"/>
+    <tipAndTrick file="CheckRegExp.html"/>
+    <tipAndTrick file="CtrlDotInLookups.html"/>
+    <tipAndTrick file="FinishByControlEnter.html"/>
+    <tipAndTrick file="HorizontalScrolling.html"/>
+  </extensions>
+</idea-plugin>
\ No newline at end of file
diff --git a/python/src/META-INF/pycharm-core.xml b/python/src/META-INF/pycharm-core.xml
index 7a4a9c6..dc95bd0 100644
--- a/python/src/META-INF/pycharm-core.xml
+++ b/python/src/META-INF/pycharm-core.xml
@@ -1,5 +1,6 @@
 <idea-plugin version="2" xmlns:xi="http://www.w3.org/2001/XInclude">
   <!-- Components and extensions declared in this file work ONLY in PyCharm, not in Python plugin. -->
+  <xi:include href="/META-INF/IdeTipsAndTricks.xml" xpointer="xpointer(/idea-plugin/*)"/>
   <xi:include href="/META-INF/PlatformLangPlugin.xml" xpointer="xpointer(/idea-plugin/*)"/>
   <xi:include href="/META-INF/XmlPlugin.xml" xpointer="xpointer(/idea-plugin/*)"/>
   <xi:include href="/META-INF/ImagesPlugin.xml" xpointer="xpointer(/idea-plugin/*)">
@@ -24,14 +25,12 @@
   </project-components>
 
   <module value="com.intellij.modules.xml"/>
-  <module value="com.intellij.modules.python"/>
 
   <extensions defaultExtensionNs="com.intellij">
     <projectViewPane implementation="com.intellij.ide.projectView.impl.ProjectViewPane"/>
 
     <projectAttachProcessor implementation="com.intellij.platform.ModuleAttachProcessor"/>
 
-    <!--<applicationConfigurable instance="com.jetbrains.python.configuration.PythonSdkConfigurable"/>-->
     <projectConfigurable instance="com.jetbrains.python.configuration.PythonContentEntriesConfigurable"/>
     <projectConfigurable instance="com.jetbrains.python.buildout.BuildoutModulesConfigurable"/>
     <projectConfigurable instance="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable"/>
diff --git a/python/src/META-INF/python-core.xml b/python/src/META-INF/python-core.xml
index 6c4665d..f97820d 100644
--- a/python/src/META-INF/python-core.xml
+++ b/python/src/META-INF/python-core.xml
@@ -3,6 +3,8 @@
 
   <resource-bundle>com.jetbrains.python.PyBundle</resource-bundle>
 
+  <module value="com.intellij.modules.python"/>
+
   <extensions defaultExtensionNs="com.intellij">
     <nameSuggestionProvider implementation="com.jetbrains.python.refactoring.PyNameSuggestionProvider"/>
     <methodNavigationOffsetProvider implementation="com.jetbrains.python.codeInsight.PyMethodNavigationOffsetProvider"/>
@@ -18,6 +20,7 @@
     <lang.foldingBuilder language="Python" implementationClass="com.jetbrains.python.PythonFoldingBuilder"/>
     <lang.findUsagesProvider language="Python" implementationClass="com.jetbrains.python.findUsages.PythonFindUsagesProvider"/>
     <lang.formatter language="Python" implementationClass="com.jetbrains.python.formatter.PythonFormattingModelBuilder"/>
+    <preFormatProcessor implementation="com.jetbrains.python.formatter.PyPreFormatProcessor"/>
     <lang.whiteSpaceFormattingStrategy language="Python"
                                        implementationClass="com.jetbrains.python.formatter.PyWhiteSpaceFormattingStrategy"/>
     <lang.lineWrapStrategy language="Python" implementationClass="com.jetbrains.python.formatter.PyLineWrapPositionStrategy"/>
@@ -114,7 +117,7 @@
 
     <runConfigurationProducer implementation="com.jetbrains.python.testing.unittest.PythonUnitTestConfigurationProducer"/>
     <testSrcLocator implementation="com.jetbrains.python.testing.PythonUnitTestTestIdUrlProvider"/>
-    <testSrcLocator implementation="com.jetbrains.django.testRunner.DjangoTestTestIdUrlProvider"/>
+    
     <testSrcLocator implementation="com.jetbrains.python.testing.nosetest.PythonNoseTestUrlProvider"/>
 
     <runConfigurationProducer implementation="com.jetbrains.python.testing.pytest.PyTestConfigurationProducer"/>
@@ -131,7 +134,6 @@
     <highlightUsagesHandlerFactory implementation="com.jetbrains.python.codeInsight.highlighting.PyHighlightExitPointsHandlerFactory"/>
 
     <joinLinesHandler implementation="com.jetbrains.python.editor.PyJoinLinesHandler"/>
-    <duplicates.profile implementation="com.jetbrains.python.duplocator.PyDuplicatesProfile"/>
 
     <intentionAction>
       <className>com.jetbrains.python.codeInsight.intentions.PyConvertMethodToPropertyIntention</className>
diff --git a/python/src/com/jetbrains/NotNullPredicate.java b/python/src/com/jetbrains/NotNullPredicate.java
new file mode 100644
index 0000000..b34ab62
--- /dev/null
+++ b/python/src/com/jetbrains/NotNullPredicate.java
@@ -0,0 +1,29 @@
+package com.jetbrains;
+
+import com.google.common.base.Predicate;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Filters out nullable elements allowing children to filter not-null elements
+ *
+ * @author Ilya.Kazakevich
+ */
+public class NotNullPredicate<T> implements Predicate<T> {
+  /**
+   * Simply filters nulls
+   */
+  public static final Predicate<Object> INSTANCE = new NotNullPredicate<Object>();
+
+  @Override
+  public final boolean apply(@Nullable final T input) {
+    if (input == null) {
+      return false;
+    }
+    return applyNotNull(input);
+  }
+
+  protected boolean applyNotNull(@NotNull final T input) {
+    return true;
+  }
+}
diff --git a/python/src/com/jetbrains/python/PyBundle.java b/python/src/com/jetbrains/python/PyBundle.java
index 3cb565d..28b853e 100644
--- a/python/src/com/jetbrains/python/PyBundle.java
+++ b/python/src/com/jetbrains/python/PyBundle.java
@@ -18,33 +18,34 @@
 import com.intellij.CommonBundle;
 import com.intellij.reference.SoftReference;
 import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.PropertyKey;
 
 import java.lang.ref.Reference;
 import java.util.ResourceBundle;
 
 // A copy of Ruby's.
+
 /**
  * Resource bundle access.
  * Date: Nov 25, 2008 2:36:10 AM
  */
 public class PyBundle {
-  private static Reference<ResourceBundle> ourBundle;
 
+  public static String message(@NotNull @PropertyKey(resourceBundle = BUNDLE) String key, @NotNull Object... params) {
+    return CommonBundle.message(getBundle(), key, params);
+  }
+
+  private static Reference<ResourceBundle> ourBundle;
   @NonNls
   private static final String BUNDLE = "com.jetbrains.python.PyBundle";
 
   private PyBundle() {
   }
 
-  public static String message(@PropertyKey(resourceBundle = BUNDLE)String key, Object... params) {
-    return CommonBundle.message(getBundle(), key, params);
-  }
-
   // Cached loading
   private static ResourceBundle getBundle() {
-    ResourceBundle bundle = null;
-    if (ourBundle != null) bundle = ourBundle.get();
+    ResourceBundle bundle = SoftReference.dereference(ourBundle);
     if (bundle == null) {
       bundle = ResourceBundle.getBundle(BUNDLE);
       ourBundle = new SoftReference<ResourceBundle>(bundle);
diff --git a/python/src/com/jetbrains/python/PyBundle.properties b/python/src/com/jetbrains/python/PyBundle.properties
index c8755a0..7bc5469 100644
--- a/python/src/com/jetbrains/python/PyBundle.properties
+++ b/python/src/com/jetbrains/python/PyBundle.properties
@@ -533,9 +533,11 @@
 
 # pull up
 refactoring.pull.up.dialog.title=Pull members up to
+refactoring.pull.up.dialog.move.members.to.class=Move members to class
+refactoring.pull.up.dialog.members.to.be.moved=Following members would be moved
 refactoring.pull.up.error.cannot.perform.refactoring.using.selected.elements=Cannot perform pull member up using selected element(s)
 refactoring.pull.up.error.cannot.perform.refactoring.not.inside.class=Cannot perform pull member up: not inside the class
-refactoring.pull.up.error.cannot.perform.refactoring.no.base.classes=Class {0} has no super classes
+refactoring.pull.up.error.cannot.perform.refactoring.no.base.classes=Class {0} has no super classes or none of them could be used for refactoring
 
 # push down
 refactoring.push.down.dialog.title=Push members down from
@@ -558,7 +560,8 @@
 
 # extract superclass
 refactoring.extract.super.target.path.outside.roots=Target directory is outside the project.<br>Must be within content roots
-refactoring.extract.super.name.0.must.be.ident=Name ''{0}'' is invalid.<br/>Must be a valid Python identifier
+refactoring.extract.super.name.0.must.be.ident=Name ''{0}'' is invalid. Must be a valid Python identifier
+refactoring.extract.super.class.no.members.allowed=None of members could be extracted
 
 # move
 refactoring.move.class.or.function=Move class or function
diff --git a/python/src/com/jetbrains/python/PyParameterInfoHandler.java b/python/src/com/jetbrains/python/PyParameterInfoHandler.java
index b3f99f2..5aec444 100644
--- a/python/src/com/jetbrains/python/PyParameterInfoHandler.java
+++ b/python/src/com/jetbrains/python/PyParameterInfoHandler.java
@@ -51,7 +51,7 @@
     return ArrayUtil.EMPTY_OBJECT_ARRAY;  // we don't
   }
 
-  public PyArgumentList findElementForParameterInfo(final CreateParameterInfoContext context) {
+  public PyArgumentList findElementForParameterInfo(@NotNull final CreateParameterInfoContext context) {
     PyArgumentList arglist = findArgumentList(context);
     if (arglist != null) {
       final TypeEvalContext typeEvalContext = TypeEvalContext.userInitiated(arglist.getContainingFile());
@@ -69,11 +69,11 @@
     return ParameterInfoUtils.findParentOfType(context.getFile(), context.getOffset(), PyArgumentList.class);
   }
 
-  public void showParameterInfo(@NotNull final PyArgumentList element, final CreateParameterInfoContext context) {
+  public void showParameterInfo(@NotNull final PyArgumentList element, @NotNull final CreateParameterInfoContext context) {
     context.showHint(element, element.getTextOffset(), this);
   }
 
-  public PyArgumentList findElementForUpdatingParameterInfo(final UpdateParameterInfoContext context) {
+  public PyArgumentList findElementForUpdatingParameterInfo(@NotNull final UpdateParameterInfoContext context) {
     return findArgumentList(context);
   }
 
@@ -82,7 +82,7 @@
    We cannot store an index since we cannot determine what is an argument until we actually map arguments to parameters.
    This is because a tuple in arguments may be a whole argument or map to a tuple parameter.
    */
-  public void updateParameterInfo(@NotNull final PyArgumentList arglist, final UpdateParameterInfoContext context) {
+  public void updateParameterInfo(@NotNull final PyArgumentList arglist, @NotNull final UpdateParameterInfoContext context) {
     if (context.getParameterOwner() != arglist) {
       context.removeHint();
       return;
@@ -125,7 +125,7 @@
   }
 
   @Override
-  public void updateUI(final CallArgumentsMapping prevResult, final ParameterInfoUIContext context) {
+  public void updateUI(final CallArgumentsMapping prevResult, @NotNull final ParameterInfoUIContext context) {
     if (prevResult == null) return;
     final PyArgumentList argList = prevResult.getArgumentList();
     if (!argList.isValid()) return;
diff --git a/python/src/com/jetbrains/python/codeInsight/PyBreakContinueGotoProvider.java b/python/src/com/jetbrains/python/codeInsight/PyBreakContinueGotoProvider.java
index 51ff238..778999a 100644
--- a/python/src/com/jetbrains/python/codeInsight/PyBreakContinueGotoProvider.java
+++ b/python/src/com/jetbrains/python/codeInsight/PyBreakContinueGotoProvider.java
@@ -26,15 +26,15 @@
 import com.jetbrains.python.PyTokenTypes;
 import com.jetbrains.python.PythonLanguage;
 import com.jetbrains.python.psi.*;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Provides reaction on ctrl+click for {@code break} and {@code continue} statements.
- * User: dcheryasov
- * Date: Nov 5, 2009 4:58:54 AM
+ * @author dcheryasov
  */
 public class PyBreakContinueGotoProvider extends GotoDeclarationHandlerBase {
-
-  public PsiElement getGotoDeclarationTarget(PsiElement source, Editor editor) {
+  @Override
+  public PsiElement getGotoDeclarationTarget(@Nullable PsiElement source, Editor editor) {
     if (source != null && source.getLanguage() instanceof PythonLanguage) {
       final PyLoopStatement loop = PsiTreeUtil.getParentOfType(source, PyLoopStatement.class, false, PyFunction.class, PyClass.class);
       if (loop != null) {
@@ -66,6 +66,7 @@
         }
       }
     }
+
     return null;
   }
 }
diff --git a/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java b/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java
index 2b466d9..24318f8 100644
--- a/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java
+++ b/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java
@@ -71,12 +71,12 @@
       final PsiFile originalFile = parameters.getOriginalFile();
       addVariantsFromIndex(result, originalFile, PyClassNameIndex.KEY,
                            parent instanceof PyStringLiteralExpression ? STRING_LITERAL_INSERT_HANDLER : IMPORTING_INSERT_HANDLER,
-                           Conditions.<PyClass>alwaysTrue());
+                           Conditions.<PyClass>alwaysTrue(), PyClass.class);
       addVariantsFromIndex(result, originalFile, PyFunctionNameIndex.KEY,
-                           getFunctionInsertHandler(parent), IS_TOPLEVEL);
+                           getFunctionInsertHandler(parent), IS_TOPLEVEL, PyFunction.class);
       addVariantsFromIndex(result, originalFile, PyVariableNameIndex.KEY,
                            parent instanceof PyStringLiteralExpression ? STRING_LITERAL_INSERT_HANDLER : IMPORTING_INSERT_HANDLER,
-                           IS_TOPLEVEL);
+                           IS_TOPLEVEL, PyTargetExpression.class);
       addVariantsFromModules(result, originalFile, parent instanceof PyStringLiteralExpression);
     }
   }
@@ -117,13 +117,13 @@
                                                                        final PsiFile targetFile,
                                                                        final StubIndexKey<String, T> key,
                                                                        final InsertHandler<LookupElement> insertHandler,
-                                                                       final Condition<? super T> condition) {
+                                                                       final Condition<? super T> condition, Class<T> elementClass) {
     final Project project = targetFile.getProject();
     GlobalSearchScope scope = PyProjectScopeBuilder.excludeSdkTestsScope(targetFile);
 
     Collection<String> keys = StubIndex.getInstance().getAllKeys(key, project);
     for (final String elementName : CompletionUtil.sortMatching(resultSet.getPrefixMatcher(), keys)) {
-      for (T element : StubIndex.getInstance().get(key, elementName, project, scope)) {
+      for (T element : StubIndex.getElements(key, elementName, project, scope, elementClass)) {
         if (condition.value(element)) {
           resultSet.addElement(LookupElementBuilder.createWithIcon(element)
                                  .withTailText(" " + ((NavigationItem)element).getPresentation().getLocationString(), true)
diff --git a/python/src/com/jetbrains/python/codeInsight/controlflow/ControlFlowCache.java b/python/src/com/jetbrains/python/codeInsight/controlflow/ControlFlowCache.java
index 02b7040..a8db9b6 100644
--- a/python/src/com/jetbrains/python/codeInsight/controlflow/ControlFlowCache.java
+++ b/python/src/com/jetbrains/python/codeInsight/controlflow/ControlFlowCache.java
@@ -39,7 +39,7 @@
 
   public static ControlFlow getControlFlow(@NotNull ScopeOwner element) {
     SoftReference<ControlFlow> ref = element.getUserData(CONTROL_FLOW_KEY);
-    ControlFlow flow = ref != null ? ref.get() : null;
+    ControlFlow flow = SoftReference.dereference(ref);
     if (flow == null) {
       flow = new PyControlFlowBuilder().buildControlFlow(element);
       element.putUserData(CONTROL_FLOW_KEY, new SoftReference<ControlFlow>(flow));
@@ -50,7 +50,7 @@
   @NotNull
   public static Scope getScope(@NotNull ScopeOwner element) {
     SoftReference<Scope> ref = element.getUserData(SCOPE_KEY);
-    Scope scope = ref != null ? ref.get() : null;
+    Scope scope = SoftReference.dereference(ref);
     if (scope == null) {
       scope = new ScopeImpl(element);
       element.putUserData(SCOPE_KEY, new SoftReference<Scope>(scope));
diff --git a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java
index aa6563f..1c09ee2 100644
--- a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java
+++ b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java
@@ -21,6 +21,7 @@
 import com.intellij.openapi.module.ModuleUtilCore;
 import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.*;
 import com.intellij.util.IncorrectOperationException;
@@ -179,7 +180,6 @@
     }
     return true;
   }
-
   /**
    * Adds an "import ... from ..." statement below other top-level imports.
    *
diff --git a/python/src/com/jetbrains/python/codeInsight/testIntegration/CreateTestDialog.java b/python/src/com/jetbrains/python/codeInsight/testIntegration/CreateTestDialog.java
index 08f3d19..c01a1b2 100644
--- a/python/src/com/jetbrains/python/codeInsight/testIntegration/CreateTestDialog.java
+++ b/python/src/com/jetbrains/python/codeInsight/testIntegration/CreateTestDialog.java
@@ -22,6 +22,7 @@
 import com.intellij.openapi.ui.TextFieldWithBrowseButton;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.ui.BooleanTableCellRenderer;
+import com.intellij.ui.TableUtil;
 import org.jetbrains.annotations.NotNull;
 
 import javax.swing.*;
@@ -29,7 +30,6 @@
 import javax.swing.event.DocumentListener;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.TableColumn;
-import javax.swing.table.TableColumnModel;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.ArrayList;
@@ -72,14 +72,12 @@
     myTableModel = new DefaultTableModel(methods, 2);
     myMethodsTable.setModel(myTableModel);
 
-    TableColumnModel model = myMethodsTable.getColumnModel();
-    model.getColumn(0).setMaxWidth(new JCheckBox().getPreferredSize().width);
-
     TableColumn checkColumn = myMethodsTable.getColumnModel().getColumn(0);
+    TableUtil.setupCheckboxColumn(checkColumn);
     checkColumn.setCellRenderer(new BooleanTableCellRenderer());
     checkColumn.setCellEditor(new DefaultCellEditor(new JCheckBox()));
 
-    model.getColumn(1).setHeaderValue("Test method");
+    myMethodsTable.getColumnModel().getColumn(1).setHeaderValue("Test method");
     checkColumn.setHeaderValue("");
     getOKAction().setEnabled(true);
   }
diff --git a/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java b/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java
index 5ee041c..ea6db07 100644
--- a/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java
+++ b/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java
@@ -83,7 +83,7 @@
     }
     if (!ourNoSkeletonsErrorReported && ourUserSkeletonsDirectory == null) {
       ourNoSkeletonsErrorReported = true;
-      LOG.error("python-skeletons directory not found in paths: " + getPossibleUserSkeletonsPaths());
+      LOG.warn("python-skeletons directory not found in paths: " + getPossibleUserSkeletonsPaths());
     }
     return ourUserSkeletonsDirectory;
   }
diff --git a/python/src/com/jetbrains/python/console/PydevConsoleExecuteActionHandler.java b/python/src/com/jetbrains/python/console/PydevConsoleExecuteActionHandler.java
index 3dd6187..809d957 100644
--- a/python/src/com/jetbrains/python/console/PydevConsoleExecuteActionHandler.java
+++ b/python/src/com/jetbrains/python/console/PydevConsoleExecuteActionHandler.java
@@ -22,7 +22,6 @@
 import com.intellij.execution.runners.ConsoleExecuteActionHandler;
 import com.intellij.openapi.application.Result;
 import com.intellij.openapi.command.WriteCommandAction;
-import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.editor.EditorModificationUtil;
 import com.intellij.openapi.fileTypes.PlainTextLanguage;
@@ -64,7 +63,7 @@
   }
 
   @Override
-  public void processLine(final String text) {
+  public void processLine(@NotNull final String text) {
     processLine(text, false);
   }
 
@@ -202,6 +201,7 @@
         executingPrompt(console);
       }
       myConsoleCommunication.execInterpreter(code, new Function<InterpreterResponse, Object>() {
+        @Override
         public Object fun(final InterpreterResponse interpreterResponse) {
           // clear
           myInputBuffer = null;
@@ -335,7 +335,7 @@
   private void indentEditor(final Editor editor, final int indentSize) {
     new WriteCommandAction(getProject()) {
       @Override
-      protected void run(Result result) throws Throwable {
+      protected void run(@NotNull Result result) throws Throwable {
         EditorModificationUtil.insertStringAtCaret(editor, IndentHelperImpl.fillIndent(getProject(), PythonFileType.INSTANCE, indentSize));
       }
     }.execute();
@@ -344,7 +344,7 @@
   private void cleanEditor(final Editor editor) {
     new WriteCommandAction(getProject()) {
       @Override
-      protected void run(Result result) throws Throwable {
+      protected void run(@NotNull Result result) throws Throwable {
         editor.getDocument().setText("");
       }
     }.execute();
@@ -367,27 +367,26 @@
   }
 
   @Override
-  public void runExecuteAction(@NotNull LanguageConsoleImpl languageConsole) {
+  public void runExecuteAction(@NotNull LanguageConsoleView console) {
     if (isEnabled()) {
       if (!canExecuteNow()) {
-        HintManager.getInstance().showErrorHint(languageConsole.getConsoleEditor(), getPrevCommandRunningMessage());
+        HintManager.getInstance().showErrorHint(console.getConsole().getConsoleEditor(), getPrevCommandRunningMessage());
       }
       else {
-        doRunExecuteAction(languageConsole);
+        doRunExecuteAction(console);
       }
     }
     else {
-      HintManager.getInstance().showErrorHint(languageConsole.getConsoleEditor(), getConsoleIsNotEnabledMessage());
+      HintManager.getInstance().showErrorHint(console.getConsole().getConsoleEditor(), getConsoleIsNotEnabledMessage());
     }
   }
 
-  private void doRunExecuteAction(LanguageConsoleImpl languageConsole) {
-    if (shouldCopyToHistory(languageConsole)) {
-      copyToHistoryAndExecute(languageConsole);
+  private void doRunExecuteAction(LanguageConsoleView console) {
+    if (shouldCopyToHistory(console.getConsole())) {
+      copyToHistoryAndExecute(console);
     }
     else {
-      final Document document = languageConsole.getConsoleEditor().getDocument();
-      processLine(document.getText());
+      processLine(console.getConsole().getConsoleEditor().getDocument().getText());
     }
   }
 
@@ -395,8 +394,8 @@
     return !PyConsoleUtil.isPagingPrompt(console.getPrompt());
   }
 
-  private void copyToHistoryAndExecute(LanguageConsoleImpl languageConsole) {
-    super.runExecuteAction(languageConsole);
+  private void copyToHistoryAndExecute(LanguageConsoleView console) {
+    super.runExecuteAction(console);
   }
 
   public boolean canExecuteNow() {
diff --git a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java
index c7b9ceb..e7952a3 100644
--- a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java
+++ b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java
@@ -134,7 +134,7 @@
 
     final String encoding = defaultCharset != null ? defaultCharset.name() : "utf-8";
     setPythonIOEncoding(setPythonUnbuffered(envs), encoding);
-    
+
     PythonSdkFlavor.initPythonPath(envs, true, PythonCommandLineState.getAddedPaths(sdk));
     return envs;
   }
@@ -296,8 +296,11 @@
   private Process createRemoteConsoleProcess(PythonRemoteInterpreterManager manager, String[] command, Map<String, String> env)
     throws ExecutionException {
     RemoteSdkData data = (RemoteSdkData)mySdk.getSdkAdditionalData();
+    assert data != null;
 
     GeneralCommandLine commandLine = new GeneralCommandLine(command);
+
+
     commandLine.getEnvironment().putAll(env);
 
     commandLine.getParametersList().set(1, PythonRemoteInterpreterManager.toSystemDependent(new File(data.getHelpersPath(),
@@ -311,7 +314,6 @@
 
     myCommandLine = commandLine.getCommandLineString();
 
-
     RemoteSshProcess remoteProcess =
       manager.createRemoteProcess(getProject(), data, commandLine, true);
 
diff --git a/python/src/com/jetbrains/python/console/PythonConsoleView.java b/python/src/com/jetbrains/python/console/PythonConsoleView.java
index 27d964a..a815e68 100644
--- a/python/src/com/jetbrains/python/console/PythonConsoleView.java
+++ b/python/src/com/jetbrains/python/console/PythonConsoleView.java
@@ -67,12 +67,12 @@
 
   private static final Logger LOG = Logger.getInstance(PythonConsoleView.class);
 
-  private Project myProject;
+  private final Project myProject;
   private PydevConsoleExecuteActionHandler myExecuteActionHandler;
   private PyConsoleSourceHighlighter mySourceHighlighter;
   private boolean myIsIPythonOutput = false;
-  private PyHighlighter myPyHighlighter;
-  private EditorColorsScheme myScheme;
+  private final PyHighlighter myPyHighlighter;
+  private final EditorColorsScheme myScheme;
   private boolean myHyperlink;
 
   private final LanguageConsoleViewImpl myLanguageConsoleView;
@@ -103,6 +103,7 @@
     myExecuteActionHandler = consoleExecuteActionHandler;
   }
 
+  @Override
   public void requestFocus() {
     IdeFocusManager.findInstance().requestFocus(getPythonLanguageConsole().getConsoleEditor().getContentComponent(), true);
     myLanguageConsoleView.updateUI();
@@ -120,6 +121,7 @@
   @Override
   public void executeCode(final @NotNull String code, @Nullable final Editor editor) {
     ProgressManager.getInstance().run(new Task.Backgroundable(null, "Executing code in console...", false) {
+      @Override
       public void run(@NotNull final ProgressIndicator indicator) {
         long time = System.currentTimeMillis();
         while (!myExecuteActionHandler.isEnabled() || !myExecuteActionHandler.canExecuteNow()) {
@@ -140,7 +142,7 @@
           try {
             Thread.sleep(300);
           }
-          catch (InterruptedException e) {
+          catch (InterruptedException ignored) {
           }
         }
         if (!indicator.isCanceled()) {
@@ -164,7 +166,7 @@
         String text = getPythonLanguageConsole().getConsoleEditor().getDocument().getText();
 
         getPythonLanguageConsole().setTextToEditor(code);
-        myExecuteActionHandler.runExecuteAction(getPythonLanguageConsole());
+        myExecuteActionHandler.runExecuteAction(myLanguageConsoleView);
 
         if (!StringUtil.isEmpty(text)) {
           getPythonLanguageConsole().setTextToEditor(text);
@@ -186,7 +188,8 @@
     myLanguageConsoleView.print(text, outputType);
   }
 
-  public void print(String text, final ConsoleViewContentType outputType) {
+  @Override
+  public void print(@NotNull String text, @NotNull final ConsoleViewContentType outputType) {
     detectIPython(text, outputType);
     if (PyConsoleUtil.detectIPythonEnd(text)) {
       myIsIPythonOutput = false;
diff --git a/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java b/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java
index 71b4e21..b807b3c 100644
--- a/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java
+++ b/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java
@@ -141,7 +141,7 @@
   }
 
   @Override
-  public void print(String s, ConsoleViewContentType contentType) {
+  public void print(@NotNull String s, @NotNull ConsoleViewContentType contentType) {
     myPydevConsoleView.print(s, contentType);
     myTextConsole.print(s, contentType);
   }
@@ -242,19 +242,23 @@
       myConsole = console;
     }
 
+    @Override
     public boolean isSelected(final AnActionEvent event) {
       return myConsole.isDebugConsole();
     }
 
+    @Override
     public void setSelected(final AnActionEvent event, final boolean flag) {
       myConsole.showDebugConsole(flag);
       ApplicationManager.getApplication().invokeLater(new Runnable() {
+        @Override
         public void run() {
           update(event);
         }
       });
     }
 
+    @Override
     public void update(final AnActionEvent event) {
       super.update(event);
       final Presentation presentation = event.getPresentation();
diff --git a/python/src/com/jetbrains/python/debugger/PyDebugProcess.java b/python/src/com/jetbrains/python/debugger/PyDebugProcess.java
index 1c1b814..312db25 100644
--- a/python/src/com/jetbrains/python/debugger/PyDebugProcess.java
+++ b/python/src/com/jetbrains/python/debugger/PyDebugProcess.java
@@ -186,6 +186,7 @@
     return myPositionConverter;
   }
 
+  @NotNull
   @Override
   public XBreakpointHandler<?>[] getBreakpointHandlers() {
     return myBreakpointHandlers;
@@ -672,7 +673,7 @@
   }
 
   public PyStackFrame createStackFrame(PyStackFrameInfo frameInfo) {
-    return new PyStackFrame(this.getSession().getProject(), this, frameInfo,
+    return new PyStackFrame(getSession().getProject(), this, frameInfo,
                             getPositionConverter().convertFromPython(frameInfo.getPosition()));
   }
 
diff --git a/python/src/com/jetbrains/python/debugger/PyDebugRunner.java b/python/src/com/jetbrains/python/debugger/PyDebugRunner.java
index 7ca044b..c6db6ba 100644
--- a/python/src/com/jetbrains/python/debugger/PyDebugRunner.java
+++ b/python/src/com/jetbrains/python/debugger/PyDebugRunner.java
@@ -19,11 +19,11 @@
 import com.intellij.execution.ExecutionException;
 import com.intellij.execution.ExecutionResult;
 import com.intellij.execution.configurations.*;
+import com.intellij.execution.console.LanguageConsoleBuilder;
 import com.intellij.execution.executors.DefaultDebugExecutor;
 import com.intellij.execution.process.ProcessHandler;
 import com.intellij.execution.runners.ExecutionEnvironment;
 import com.intellij.execution.runners.GenericProgramRunner;
-import com.intellij.execution.runners.LanguageConsoleBuilder;
 import com.intellij.execution.ui.ExecutionConsole;
 import com.intellij.execution.ui.RunContentDescriptor;
 import com.intellij.openapi.application.ApplicationManager;
@@ -76,9 +76,9 @@
            ((AbstractPythonRunConfiguration)profile).canRunWithCoverage();
   }
 
-  protected RunContentDescriptor doExecute(final Project project, RunProfileState profileState,
+  protected RunContentDescriptor doExecute(@NotNull final Project project, @NotNull RunProfileState profileState,
                                            RunContentDescriptor contentToReuse,
-                                           ExecutionEnvironment env) throws ExecutionException {
+                                           @NotNull ExecutionEnvironment env) throws ExecutionException {
     FileDocumentManager.getInstance().saveAllDocuments();
 
     final PythonCommandLineState pyState = (PythonCommandLineState)profileState;
@@ -133,7 +133,7 @@
       pythonConsoleView.setExecutionHandler(consoleExecuteActionHandler);
 
       debugProcess.getSession().addSessionListener(consoleExecuteActionHandler);
-      new LanguageConsoleBuilder().console(pythonConsoleView).processHandler(processHandler).initActions(consoleExecuteActionHandler, "py");
+      new LanguageConsoleBuilder(pythonConsoleView).processHandler(processHandler).initActions(consoleExecuteActionHandler, "py");
     }
   }
 
diff --git a/python/src/com/jetbrains/python/documentation/PyDocumentationSettings.java b/python/src/com/jetbrains/python/documentation/PyDocumentationSettings.java
index edde7f2..6ea6540 100644
--- a/python/src/com/jetbrains/python/documentation/PyDocumentationSettings.java
+++ b/python/src/com/jetbrains/python/documentation/PyDocumentationSettings.java
@@ -37,7 +37,7 @@
        storages = {@Storage(file = "$MODULE_FILE$")}
 )
 public class PyDocumentationSettings implements PersistentStateComponent<PyDocumentationSettings> {
-  public String myDocStringFormat = "";
+  public String myDocStringFormat = DocStringFormat.REST;
   public boolean analyzeDoctest = true;
 
   public boolean isEpydocFormat(PsiFile file) {
diff --git a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java
index 3a504aa..55bc1e4 100644
--- a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java
+++ b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java
@@ -487,7 +487,7 @@
                                                ".\nWould you like to configure it now?",
                                                "Python External Documentation",
                                                Messages.getQuestionIcon());
-          if (rc == 0) {
+          if (rc == Messages.OK) {
             ShowSettingsUtilImpl.showSettingsDialog(project, PythonDocumentationConfigurable.ID, "");
           }
         }
diff --git a/python/src/com/jetbrains/python/editor/PythonEnterHandler.java b/python/src/com/jetbrains/python/editor/PythonEnterHandler.java
index 16bf3c7..c055606 100644
--- a/python/src/com/jetbrains/python/editor/PythonEnterHandler.java
+++ b/python/src/com/jetbrains/python/editor/PythonEnterHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/python/src/com/jetbrains/python/findUsages/PyFindUsagesHandlerFactory.java b/python/src/com/jetbrains/python/findUsages/PyFindUsagesHandlerFactory.java
index efc1e68..78d9d65 100644
--- a/python/src/com/jetbrains/python/findUsages/PyFindUsagesHandlerFactory.java
+++ b/python/src/com/jetbrains/python/findUsages/PyFindUsagesHandlerFactory.java
@@ -71,13 +71,13 @@
                                                                           " overrides method of class " +
                                                                           ((PyFunction)next).getContainingClass().getName() +
                                                                           ".\nDo you want to find usages of the base method?",  "Find Usages", Messages.getQuestionIcon());
-            if (rc == 0) {
+            if (rc == Messages.YES) {
               List<PsiElement> allMethods = new ArrayList<PsiElement>();
               allMethods.add(element);
               allMethods.addAll(superMethods);
               return new PyFunctionFindUsagesHandler(element, allMethods);
             }
-            if (rc == 1) {
+            if (rc == Messages.NO) {
               return new PyFunctionFindUsagesHandler(element);
             }
             return FindUsagesHandler.NULL_HANDLER;
diff --git a/python/src/com/jetbrains/python/formatter/PyBlock.java b/python/src/com/jetbrains/python/formatter/PyBlock.java
index d160749..0c535c1 100644
--- a/python/src/com/jetbrains/python/formatter/PyBlock.java
+++ b/python/src/com/jetbrains/python/formatter/PyBlock.java
@@ -141,6 +141,33 @@
     Wrap wrap = null;
     Indent childIndent = Indent.getNoneIndent();
     Alignment childAlignment = null;
+
+    if (parentType == PyElementTypes.BINARY_EXPRESSION && !isInControlStatement()) {
+      //Setup alignments for binary expression
+      childAlignment = getAlignmentForChildren();
+
+      PyBlock p = myParent; //Check grandparents
+      while (p != null) {
+        ASTNode pNode = p.getNode();
+        if (ourListElementTypes.contains(pNode.getElementType())) {
+          if (needListAlignment(child) && !isEmptyList(_node.getPsi())) {
+
+            childAlignment = p.getChildAlignment();
+            break;
+          }
+        }
+        else if (pNode == PyElementTypes.BINARY_EXPRESSION) {
+          childAlignment = p.getChildAlignment();
+        }
+        if (!breaksAlignment(pNode.getElementType())) {
+          p = p.myParent;
+        }
+        else {
+          break;
+        }
+      }
+    }
+
     if (childType == PyElementTypes.STATEMENT_LIST) {
       if (hasLineBreaksBefore(child, 1) || needLineBreakInStatement()) {
         childIndent = Indent.getNormalIndent();
@@ -173,14 +200,6 @@
                                                                        PyStatementPart.class);
         childIndent = parens != null ? Indent.getNormalIndent() : Indent.getContinuationIndent();
       }
-      else {
-        if (grandparentType == PyElementTypes.BINARY_EXPRESSION && myParent != null) {
-          childAlignment = myParent.getAlignmentForChildren();
-        }
-        else {
-          childAlignment = getAlignmentForChildren();
-        }
-      }
     }
 
     if (parentType == PyElementTypes.LIST_LITERAL_EXPRESSION || parentType == PyElementTypes.LIST_COMP_EXPRESSION) {
@@ -309,6 +328,10 @@
     return new PyBlock(this, child, childAlignment, childIndent, wrap, myContext);
   }
 
+  private static boolean breaksAlignment(IElementType type) {
+    return type != PyElementTypes.BINARY_EXPRESSION;
+  }
+
   private static Alignment getAlignmentOfChild(PyBlock b, int childNum) {
     if (b.getSubBlocks().size() > childNum) {
       ChildAttributes attributes = b.getChildAttributes(childNum);
@@ -516,7 +539,7 @@
         }
       }
 
-      if (psi2 instanceof PsiComment && !hasLineBreaksBefore(psi2.getNode(), 1)) {
+      if (psi2 instanceof PsiComment && !hasLineBreaksBefore(psi2.getNode(), 1) && myContext.getPySettings().SPACE_BEFORE_NUMBER_SIGN) {
         return Spacing.createSpacing(2, 0, 0, false, 0);
       }
     }
diff --git a/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java b/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java
index 961ca72..88ddd41 100644
--- a/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java
+++ b/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java
@@ -38,6 +38,9 @@
   public boolean NEW_LINE_AFTER_COLON = false;
   public boolean NEW_LINE_AFTER_COLON_MULTI_CLAUSE = true;
 
+  public boolean SPACE_AFTER_NUMBER_SIGN = true;
+  public boolean SPACE_BEFORE_NUMBER_SIGN = true;
+
   public PyCodeStyleSettings(CodeStyleSettings container) {
     super("Python", container);
   }
diff --git a/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java b/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java
index c26a1a1..9e7f97d 100644
--- a/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java
+++ b/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java
@@ -72,9 +72,12 @@
       consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_AROUND_EQ_IN_KEYWORD_ARGUMENT", "Around = in keyword argument",
                                 SPACES_AROUND_OPERATORS);
       consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_WITHIN_BRACES", "Braces", SPACES_WITHIN);
-      consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_PY_COLON", ApplicationBundle.message("checkbox.spaces.before.colon"), SPACES_OTHER);
+      consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_PY_COLON",
+                                ApplicationBundle.message("checkbox.spaces.before.colon"), SPACES_OTHER);
       consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_AFTER_PY_COLON", ApplicationBundle.message("checkbox.spaces.after.colon"), SPACES_OTHER);
       consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_BACKSLASH", "Before '\\'", SPACES_OTHER);
+      consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_NUMBER_SIGN", "Before '#'", SPACES_OTHER);
+      consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_AFTER_NUMBER_SIGN", "After '#'", SPACES_OTHER);
     }
     else if (settingsType == SettingsType.BLANK_LINES_SETTINGS) {
       consumer.showStandardOptions("BLANK_LINES_AROUND_CLASS",
@@ -112,7 +115,7 @@
     CommonCodeStyleSettings.IndentOptions indentOptions = defaultSettings.initIndentOptions();
     indentOptions.INDENT_SIZE = 4;
     defaultSettings.ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true;
-    return defaultSettings; 
+    return defaultSettings;
   }
 
   @Override
diff --git a/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java b/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java
index d7fa5f0..47b6b7c 100644
--- a/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java
+++ b/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java
@@ -24,6 +24,7 @@
 import com.intellij.psi.PsiFile;
 import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.util.text.CharArrayUtil;
+import com.jetbrains.python.PyTokenTypes;
 import com.jetbrains.python.psi.StringLiteralExpression;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -44,9 +45,6 @@
     addRule(new Rule('(', WrapCondition.AFTER));
     addRule(new Rule('[', WrapCondition.AFTER));
     addRule(new Rule('{', WrapCondition.AFTER));
-
-    // Symbols to wrap before
-    addRule(new Rule('.', WrapCondition.BEFORE));
   }
 
   @Override
@@ -75,11 +73,20 @@
                                    int maxPreferredOffset,
                                    boolean allowToBeyondMaxPreferredOffset,
                                    boolean virtual) {
+
     int wrapPosition =
       super.calculateWrapPosition(document, project, startOffset, endOffset, maxPreferredOffset, allowToBeyondMaxPreferredOffset, virtual);
     if (wrapPosition < 0) return wrapPosition;
     final CharSequence text = document.getCharsSequence();
 
+    if (wrapPosition > 0) {
+      char charBefore = text.charAt(wrapPosition - 1);
+      if (charBefore == '\'' || charBefore == '"') {
+        //don't wrap the first char of string literal
+        return wrapPosition + 1;
+      }
+    }
+
     char c = text.charAt(wrapPosition);
     if (!StringUtil.isWhiteSpace(c) || project == null) {
       return wrapPosition;
diff --git a/python/src/com/jetbrains/python/formatter/PyPreFormatProcessor.java b/python/src/com/jetbrains/python/formatter/PyPreFormatProcessor.java
new file mode 100644
index 0000000..ee56016
--- /dev/null
+++ b/python/src/com/jetbrains/python/formatter/PyPreFormatProcessor.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.formatter;
+
+import com.intellij.lang.ASTNode;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.PsiComment;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.codeStyle.CodeStyleSettings;
+import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
+import com.intellij.psi.impl.source.codeStyle.PreFormatProcessor;
+import com.jetbrains.python.PythonLanguage;
+import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.psi.PyElementGenerator;
+import com.jetbrains.python.psi.PyRecursiveElementVisitor;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author traff
+ */
+public class PyPreFormatProcessor implements PreFormatProcessor {
+  @NotNull
+  @Override
+  public TextRange process(@NotNull ASTNode element, @NotNull TextRange range) {
+    PsiElement psiElement = element.getPsi();
+    if (psiElement == null) return range;
+
+    if (!psiElement.getLanguage().is(PythonLanguage.getInstance())) return range;
+
+    PsiFile file = psiElement.isValid() ? psiElement.getContainingFile() : null;
+    if (file == null) return range;
+
+    Project project = psiElement.getProject();
+
+    return new PyCommentFormatter(project).process(psiElement, range);
+  }
+
+  /**
+   * @author traff
+   */
+  public static class PyCommentFormatter extends PyRecursiveElementVisitor {
+    private final Project myProject;
+    private final CodeStyleSettings mySettings;
+    private final PyCodeStyleSettings myPyCodeStyleSettings;
+    private TextRange myRange;
+    private int myDelta = 0;
+
+    public PyCommentFormatter(Project project) {
+      myProject = project;
+      mySettings = CodeStyleSettingsManager.getSettings(project);
+      myPyCodeStyleSettings = mySettings.getCustomSettings(PyCodeStyleSettings.class);
+    }
+
+    public TextRange process(PsiElement element, TextRange range) {
+      if (!myPyCodeStyleSettings.SPACE_AFTER_NUMBER_SIGN) {
+        return range;
+      }
+      myRange = range;
+      element.accept(this);
+      return TextRange.create(range.getStartOffset(), range.getEndOffset() + myDelta);
+    }
+
+    @Override
+    public void visitComment(PsiComment element) {
+      if (!myRange.contains(element.getTextRange())) {
+        return;
+      }
+      String text = element.getText();
+      int commentStart = text.indexOf('#');
+      if (commentStart != -1 && (commentStart + 1) < text.length()) {
+        String commentText = StringUtil.trimLeading(text.substring(commentStart + 1));
+
+        String newText = "# " + commentText;
+        if (!newText.equals(text)) {
+          myDelta += newText.length() - text.length();
+          element.replace(
+            PyElementGenerator.getInstance(myProject).createFromText(LanguageLevel.getDefault(), PsiComment.class, newText));
+        }
+      }
+    }
+  }
+}
diff --git a/python/src/com/jetbrains/python/inspections/PyAssignmentToLoopOrWithParameterInspection.java b/python/src/com/jetbrains/python/inspections/PyAssignmentToLoopOrWithParameterInspection.java
index aefbc34..2efaf98 100644
--- a/python/src/com/jetbrains/python/inspections/PyAssignmentToLoopOrWithParameterInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyAssignmentToLoopOrWithParameterInspection.java
@@ -132,17 +132,7 @@
     if (element instanceof PySubscriptionExpression) {
       element = ((PySubscriptionExpression)element).getRootOperand();
     }
-    while (true) {
-      PsiReference reference = element.getReference();
-      if (reference == null) {
-        break;
-      }
-      PsiElement resolve = reference.resolve();
-      if (resolve == null || resolve.equals(element) || !PyUtil.inSameFile(resolve, element)) {
-        break;
-      }
-      element = resolve;
-    }
+    element = PyUtil.resolveToTheTop(element);
     return element;
   }
 
diff --git a/python/src/com/jetbrains/python/lexer/PythonEditorHighlighter.java b/python/src/com/jetbrains/python/lexer/PythonEditorHighlighter.java
index d0e3de6..9893d4f 100644
--- a/python/src/com/jetbrains/python/lexer/PythonEditorHighlighter.java
+++ b/python/src/com/jetbrains/python/lexer/PythonEditorHighlighter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -80,7 +80,7 @@
   }
 
   @Override
-  public void setEditor(HighlighterClient editor) {
+  public void setEditor(@NotNull HighlighterClient editor) {
     Lexer l = getLexer();
     if (l instanceof LayeredLexer) {
       editor.getDocument().putUserData(KEY, editor.getDocument().getText().indexOf(PyNames.UNICODE_LITERALS) == -1);
diff --git a/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java b/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java
index 546724f..29fb657 100644
--- a/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java
+++ b/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java
@@ -194,9 +194,6 @@
     if (DUMP_TOKENS) {
       System.out.println("\n--- LEXER START---");
     }
-    if (startOffset != 0 || initialState != 0) {
-      throw new RuntimeException("Indenting lexer does not support incremental lexing");
-    }
   }
 
   private void setStartState() {
diff --git a/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java b/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java
index fecce4f..3118157 100644
--- a/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java
+++ b/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -261,7 +261,7 @@
             }
           }, ModalityState.current());
         }
-        if (warning[0] != 0) return true;
+        if (warning[0] != Messages.YES) return true;
       }
       catch (PyExternalProcessException e) {
         LOG.info("Error loading packages dependents: " + e.getMessage(), e);
diff --git a/python/src/com/jetbrains/python/parsing/FunctionParsing.java b/python/src/com/jetbrains/python/parsing/FunctionParsing.java
index 768fa0a..cd61f6e 100644
--- a/python/src/com/jetbrains/python/parsing/FunctionParsing.java
+++ b/python/src/com/jetbrains/python/parsing/FunctionParsing.java
@@ -16,6 +16,7 @@
 package com.jetbrains.python.parsing;
 
 import com.intellij.lang.PsiBuilder;
+import com.intellij.lang.WhitespacesBinders;
 import com.intellij.psi.tree.IElementType;
 import com.jetbrains.python.PyElementTypes;
 import com.jetbrains.python.PyTokenTypes;
@@ -81,7 +82,7 @@
       }
       else { // empty arglist node, so we always have it
         PsiBuilder.Marker argListMarker = myBuilder.mark();
-        argListMarker.setCustomEdgeTokenBinders(LeftBiasedWhitespaceBinder.INSTANCE, null);
+        argListMarker.setCustomEdgeTokenBinders(WhitespacesBinders.GREEDY_LEFT_BINDER, null);
         argListMarker.done(PyElementTypes.ARGUMENT_LIST);
       }
       if (atToken(PyTokenTypes.STATEMENT_BREAK)) {
@@ -110,6 +111,7 @@
       myBuilder.error(message("PARSE.expected.@.or.def"));
       PsiBuilder.Marker parameterList = myBuilder.mark(); // To have non-empty parameters list at all the time.
       parameterList.done(PyElementTypes.PARAMETER_LIST);
+      myBuilder.mark().done(PyElementTypes.STATEMENT_LIST); // To have non-empty empty statement list
       endMarker.done(getFunctionType());
     }
   }
diff --git a/python/src/com/jetbrains/python/parsing/LeftBiasedWhitespaceBinder.java b/python/src/com/jetbrains/python/parsing/LeftBiasedWhitespaceBinder.java
deleted file mode 100644
index 38bd079..0000000
--- a/python/src/com/jetbrains/python/parsing/LeftBiasedWhitespaceBinder.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.parsing;
-
-import com.intellij.lang.WhitespacesAndCommentsBinder;
-import com.intellij.psi.tree.IElementType;
-
-import java.util.List;
-
-/**
- * @author yole
- */
-public class LeftBiasedWhitespaceBinder implements WhitespacesAndCommentsBinder {
-  public static LeftBiasedWhitespaceBinder INSTANCE = new LeftBiasedWhitespaceBinder();
-
-  @Override
-  public int getEdgePosition(List<IElementType> tokens, boolean atStreamEdge, TokenTextGetter getter) {
-    return 0;
-  }
-}
diff --git a/python/src/com/jetbrains/python/psi/PyUtil.java b/python/src/com/jetbrains/python/psi/PyUtil.java
index bcaf70d..8af009b 100644
--- a/python/src/com/jetbrains/python/psi/PyUtil.java
+++ b/python/src/com/jetbrains/python/psi/PyUtil.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  */
 package com.jetbrains.python.psi;
 
+import com.google.common.collect.Collections2;
 import com.google.common.collect.Maps;
 import com.intellij.codeInsight.FileModificationService;
 import com.intellij.codeInsight.completion.PrioritizedLookupElement;
@@ -51,7 +52,7 @@
 import com.intellij.util.PlatformIcons;
 import com.intellij.util.SmartList;
 import com.intellij.util.containers.ContainerUtil;
-import com.intellij.util.containers.HashSet;
+import com.jetbrains.NotNullPredicate;
 import com.jetbrains.python.PyBundle;
 import com.jetbrains.python.PyNames;
 import com.jetbrains.python.PyTokenTypes;
@@ -63,6 +64,7 @@
 import com.jetbrains.python.psi.impl.PyPsiUtils;
 import com.jetbrains.python.psi.types.*;
 import com.jetbrains.python.refactoring.classes.extractSuperclass.PyExtractSuperclassHelper;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -104,21 +106,6 @@
     return node != null && node.getElementType().equals(TokenType.WHITE_SPACE);
   }
 
-
-  @NotNull
-  public static Set<PsiElement> getComments(PsiElement start) {
-    final Set<PsiElement> comments = new HashSet<PsiElement>();
-    PsiElement seeker = start.getPrevSibling();
-    if (seeker == null) seeker = start.getParent().getPrevSibling();
-    while (seeker instanceof PsiWhiteSpace || seeker instanceof PsiComment) {
-      if (seeker instanceof PsiComment) {
-        comments.add(seeker);
-      }
-      seeker = seeker.getPrevSibling();
-    }
-    return comments;
-  }
-
   @Nullable
   public static PsiElement getFirstNonCommentAfter(PsiElement start) {
     PsiElement seeker = start;
@@ -713,6 +700,38 @@
     return PyElementGenerator.getInstance(element.getProject()).createNameIdentifier(name, LanguageLevel.forElement(element));
   }
 
+  /**
+   * Finds element declaration by resolving its references top the top but not further than file (to prevent unstubing)
+   * @param element element to resolve
+   * @return its declaration
+   */
+  @NotNull
+  public static PsiElement resolveToTheTop(@NotNull final PsiElement elementToResolve) {
+    PsiElement currentElement = elementToResolve;
+    while (true) {
+      final PsiReference reference = currentElement.getReference();
+      if (reference == null) {
+        break;
+      }
+      final PsiElement resolve = reference.resolve();
+      if ((resolve == null) || resolve.equals(currentElement) || !inSameFile(resolve, currentElement)) {
+        break;
+      }
+      currentElement = resolve;
+    }
+    return currentElement;
+  }
+
+  /**
+   * Gets class init method
+   * @param pyClass class where to find init
+   * @return class init method if any
+   */
+  @Nullable
+  public static PyFunction getInitMethod(@NotNull final PyClass pyClass) {
+    return pyClass.findMethodByName(PyNames.INIT, false);
+  }
+
   public static class KnownDecoratorProviderHolder {
     public static PyKnownDecoratorProvider[] KNOWN_DECORATOR_PROVIDERS = Extensions.getExtensions(PyKnownDecoratorProvider.EP_NAME);
 
@@ -915,6 +934,10 @@
     return selfName;
   }
 
+  /**
+   *
+   * @return Source roots <strong>and</strong> content roots for element's project
+   */
   @NotNull
   public static Collection<VirtualFile> getSourceRoots(@NotNull PsiElement foothold) {
     final Module module = ModuleUtilCore.findModuleForPsiElement(foothold);
@@ -924,6 +947,10 @@
     return Collections.emptyList();
   }
 
+  /**
+   *
+   * @return Source roots <strong>and</strong> content roots for module
+   */
   @NotNull
   public static Collection<VirtualFile> getSourceRoots(@NotNull Module module) {
     final Set<VirtualFile> result = new LinkedHashSet<VirtualFile>();
@@ -1092,6 +1119,11 @@
       }
       return null;
     }
+
+    //TODO: Doc
+    public boolean isInstanceMethod() {
+      return ! (myIsClassMethod || myIsStaticMethod);
+    }
   }
 
   public static boolean isSuperCall(@NotNull PyCallExpression node) {
@@ -1398,4 +1430,57 @@
     }
     return false;
   }
+
+  public static boolean isInit(@NotNull final PyFunction function) {
+    return PyNames.INIT.equals(function.getName());
+  }
+
+
+  private static boolean isObject(@NotNull final PyMemberInfo<PyElement> classMemberInfo) {
+    final PyElement element = classMemberInfo.getMember();
+    if ((element instanceof PyClass) && PyNames.OBJECT.equals(element.getName())) {
+      return true;
+    }
+    return false;
+
+  }
+
+  /**
+   * Filters out {@link com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo}
+   * that should not be displayed in this refactoring (like object)
+   *
+   * @param pyMemberInfos collection to sort
+   * @return sorted collection
+   */
+  @NotNull
+  public static Collection<PyMemberInfo<PyElement>> filterOutObject(@NotNull final Collection<PyMemberInfo<PyElement>> pyMemberInfos) {
+    return Collections2.filter(pyMemberInfos, new ObjectPredicate(false));
+  }
+
+  /**
+   * Filters only pyclass object (new class)
+   */
+  public static class ObjectPredicate extends NotNullPredicate<PyMemberInfo<PyElement>> {
+    private final boolean myAllowObjects;
+
+    /**
+     * @param allowObjects allows only objects if true. Allows all but objects otherwise.
+     */
+    public ObjectPredicate(final boolean allowObjects) {
+      myAllowObjects = allowObjects;
+    }
+
+    @Override
+    public boolean applyNotNull(@NotNull final PyMemberInfo<PyElement> input) {
+      return myAllowObjects == isObject(input);
+    }
+
+    private static boolean isObject(@NotNull final PyMemberInfo<PyElement> classMemberInfo) {
+      final PyElement element = classMemberInfo.getMember();
+      if ((element instanceof PyClass) && PyNames.OBJECT.equals(element.getName())) {
+        return true;
+      }
+      return false;
+    }
+  }
 }
diff --git a/python/src/com/jetbrains/python/psi/impl/PyArgumentListImpl.java b/python/src/com/jetbrains/python/psi/impl/PyArgumentListImpl.java
index 50ba541..dfe12ca 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyArgumentListImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyArgumentListImpl.java
@@ -15,13 +15,15 @@
  */
 package com.jetbrains.python.psi.impl;
 
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Queues;
 import com.intellij.lang.ASTFactory;
 import com.intellij.lang.ASTNode;
-import com.intellij.psi.PsiElement;
 import com.intellij.psi.tree.IElementType;
 import com.intellij.psi.tree.TokenSet;
 import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.util.IncorrectOperationException;
+import com.jetbrains.NotNullPredicate;
 import com.jetbrains.python.PyElementTypes;
 import com.jetbrains.python.PyTokenTypes;
 import com.jetbrains.python.PythonDialectsTokenSetProvider;
@@ -30,9 +32,13 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.Arrays;
+import java.util.*;
 
 public class PyArgumentListImpl extends PyElementImpl implements PyArgumentList {
+
+  // Filters all expressions but keyword arguments
+  private static final NoKeyArguments NO_KEY_ARGUMENTS = new NoKeyArguments();
+
   public PyArgumentListImpl(ASTNode astNode) {
     super(astNode);
   }
@@ -61,47 +67,64 @@
     return null;
   }
 
-  public void addArgument(PyExpression arg) {
-    // it should find the comma after the argument to add after, and add after
-    // that. otherwise it won't deal with comments nicely
+  @Override
+  public void addArgument(@NotNull final PyExpression arg) {
+    final PyElementGenerator generator = new PyElementGeneratorImpl(getProject());
+
+    // Adds param to appropriate place
+    final Deque<PyKeywordArgument> keywordArguments = getKeyWordArguments();
+    final Deque<PyExpression> parameters = getParameters();
+
+    if (keywordArguments.isEmpty() && parameters.isEmpty()) {
+      generator.insertItemIntoListRemoveRedundantCommas(this, null, arg);
+      return;
+    }
+
+
     if (arg instanceof PyKeywordArgument) {
-      PyKeywordArgument keywordArgument = (PyKeywordArgument)arg;
-      PyKeywordArgument lastKeyArg = null;
-      PyExpression firstNonKeyArg = null;
-      for (PsiElement element : getChildren()) {
-        if (element instanceof PyKeywordArgument) {
-          lastKeyArg = (PyKeywordArgument)element;
-        }
-        else if (element instanceof PyExpression && firstNonKeyArg == null) {
-          firstNonKeyArg = (PyExpression)element;
-        }
-      }
-      if (lastKeyArg != null) {
-        // add after last key arg
-        addArgumentNode(keywordArgument, lastKeyArg.getNode().getTreeNext(), true);
-
-      }
-      else if (firstNonKeyArg != null) {
-        // add before first non key arg
-        addArgumentNode(keywordArgument, firstNonKeyArg.getNode(), true);
-
+      if (parameters.isEmpty()) {
+        generator.insertItemIntoListRemoveRedundantCommas(this, keywordArguments.getLast(), arg);
       }
       else {
-        // add as only argument
-        addArgumentLastWithoutComma(arg);
+        if (keywordArguments.isEmpty()) {
+          generator.insertItemIntoListRemoveRedundantCommas(this, parameters.getLast(), arg);
+        }
+        else {
+          generator.insertItemIntoListRemoveRedundantCommas(this, keywordArguments.getLast(), arg);
+        }
       }
     }
     else {
-      final PyExpression[] args = getArguments();
-      if (args.length > 0) {
-        addArgumentAfter(arg, args [args.length-1]);
+      if (parameters.isEmpty()) {
+        generator.insertItemIntoListRemoveRedundantCommas(this, null, arg);
       }
       else {
-        addArgumentLastWithoutComma(arg);
+        generator.insertItemIntoListRemoveRedundantCommas(this, parameters.getLast(), arg);
       }
     }
   }
 
+
+  /**
+   * @return parameters (as opposite to keyword arguments)
+   */
+  @NotNull
+  private Deque<PyExpression> getParameters() {
+    final PyExpression[] childrenOfType = PsiTreeUtil.getChildrenOfType(this, PyExpression.class);
+    if (childrenOfType == null) {
+      return new ArrayDeque<PyExpression>(0);
+    }
+    return Queues.newArrayDeque(Collections2.filter(Arrays.asList(childrenOfType), NO_KEY_ARGUMENTS));
+  }
+
+  /**
+   * @return keyword arguments (as opposite to parameters)
+   */
+  @NotNull
+  private Deque<PyKeywordArgument> getKeyWordArguments() {
+    return Queues.newArrayDeque(PsiTreeUtil.findChildrenOfType(this, PyKeywordArgument.class));
+  }
+
   public void addArgumentFirst(PyExpression arg) {
     ASTNode node = getNode();
     ASTNode[] pars = node.getChildren(TokenSet.create(PyTokenTypes.LPAR));
@@ -113,13 +136,12 @@
       catch (IncorrectOperationException e1) {
         throw new IllegalStateException(e1);
       }
-
     }
     else {
       ASTNode before = PyUtil.getNextNonWhitespace(pars[0]);
       ASTNode anchorBefore;
       if (before != null && elementPrecedesElementsOfType(before, PythonDialectsTokenSetProvider.INSTANCE.getExpressionTokens())) {
-        ASTNode comma = PyElementGenerator.getInstance(getProject()).createComma();
+        ASTNode comma = createComma();
         node.addChild(comma, before);
         node.addChild(ASTFactory.whitespace(" "), before);
         anchorBefore = comma;
@@ -137,6 +159,14 @@
     }
   }
 
+  /**
+   * @return newly created comma
+   */
+  @NotNull
+  private ASTNode createComma() {
+    return PyElementGenerator.getInstance(getProject()).createComma();
+  }
+
   private static boolean elementPrecedesElementsOfType(ASTNode before, TokenSet expressions) {
     ASTNode node = before;
     while (node != null) {
@@ -279,4 +309,11 @@
     }
     return ret;
   }
+
+  private static class NoKeyArguments extends NotNullPredicate<PyExpression> {
+    @Override
+    protected boolean applyNotNull(@NotNull final PyExpression input) {
+      return (PsiTreeUtil.getParentOfType(input, PyKeywordArgument.class) == null) && !(input instanceof PyKeywordArgument);
+    }
+  }
 }
diff --git a/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java b/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java
index bd33be4..781dc28 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java
@@ -43,6 +43,7 @@
   }
 
   /**
+   * TODO: Copy/Paste with {@link com.jetbrains.python.psi.PyArgumentList#addArgument(com.jetbrains.python.psi.PyExpression)}
    * Adds an argument to the end of argument list.
    * @param us the arg list
    * @param expression what to add
@@ -507,7 +508,9 @@
                 }
               }
             }
-            else if (((PyFile)call.getContainingFile()).getLanguageLevel().isPy3K() && containingClass != null) {
+            else if ((call.getContainingFile() instanceof PyFile) &&
+                     ((PyFile)call.getContainingFile()).getLanguageLevel().isPy3K() &&
+                     (containingClass != null)) {
               return new Maybe<PyType>(getSuperClassUnionType(containingClass));
             }
           }
diff --git a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java
index 877e5fb..afca292 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java
@@ -148,6 +148,7 @@
     pyVisitor.visitPyClass(this);
   }
 
+  @Override
   @NotNull
   public PyStatementList getStatementList() {
     final PyStatementList statementList = childToPsi(PyElementTypes.STATEMENT_LIST);
diff --git a/python/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java b/python/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java
index 1a8f123..c306116 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java
@@ -15,6 +15,8 @@
  */
 package com.jetbrains.python.psi.impl;
 
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Queues;
 import com.intellij.lang.ASTNode;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Pair;
@@ -23,9 +25,12 @@
 import com.intellij.psi.PsiFile;
 import com.intellij.psi.PsiFileFactory;
 import com.intellij.psi.impl.PsiFileFactoryImpl;
+import com.intellij.psi.impl.source.tree.LeafPsiElement;
 import com.intellij.psi.tree.TokenSet;
+import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.testFramework.LightVirtualFile;
 import com.intellij.util.IncorrectOperationException;
+import com.jetbrains.NotNullPredicate;
 import com.jetbrains.python.PyTokenTypes;
 import com.jetbrains.python.PythonFileType;
 import com.jetbrains.python.PythonLanguage;
@@ -37,12 +42,15 @@
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetEncoder;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Deque;
 import java.util.Formatter;
 
 /**
  * @author yole
  */
 public class PyElementGeneratorImpl extends PyElementGenerator {
+  private static final CommasOnly COMMAS_ONLY = new CommasOnly();
   private final Project myProject;
 
   public PyElementGeneratorImpl(Project project) {
@@ -173,6 +181,30 @@
     return dot.copyElement();
   }
 
+  @Override
+  @NotNull
+  public PsiElement insertItemIntoListRemoveRedundantCommas(
+    @NotNull final PyElement list,
+    @Nullable final PyExpression afterThis,
+    @NotNull final PyExpression toInsert) {
+    // TODO: #insertItemIntoList is probably buggy. In such case, fix it and get rid of this method
+    final PsiElement result = insertItemIntoList(list, afterThis, toInsert);
+    final LeafPsiElement[] leafs = PsiTreeUtil.getChildrenOfType(list, LeafPsiElement.class);
+    if (leafs != null) {
+      final Deque<LeafPsiElement> commas = Queues.newArrayDeque(Collections2.filter(Arrays.asList(leafs), COMMAS_ONLY));
+      if (! commas.isEmpty()) {
+        final LeafPsiElement lastComma = commas.getLast();
+        if (PsiTreeUtil.getNextSiblingOfType(lastComma, PyExpression.class) == null) { //Comma has no expression after it
+          lastComma.delete();
+        }
+      }
+    }
+
+    return result;
+  }
+
+  // TODO: Adds comma to empty list: adding "foo" to () will create (foo,). That is why "insertItemIntoListRemoveRedundantCommas" was created.
+  // We probably need to fix this method and delete insertItemIntoListRemoveRedundantCommas
   public PsiElement insertItemIntoList(PyElement list, @Nullable PyExpression afterThis, PyExpression toInsert)
     throws IncorrectOperationException {
     ASTNode add = toInsert.getNode().copyElement();
@@ -225,6 +257,7 @@
     return createExpressionFromText(LanguageLevel.getDefault(), text);
   }
 
+  @NotNull
   public PyExpression createExpressionFromText(final LanguageLevel languageLevel, final String text) {
     final PsiFile dummyFile = createDummyFile(languageLevel, text);
     final PsiElement element = dummyFile.getFirstChild();
@@ -364,4 +397,11 @@
     return createFromText(LanguageLevel.getDefault(),
                           PyExpressionStatement.class, content + "\n");
   }
+
+  private static class CommasOnly extends NotNullPredicate<LeafPsiElement> {
+    @Override
+    protected boolean applyNotNull(@NotNull final LeafPsiElement input) {
+      return input.getNode().getElementType().equals(PyTokenTypes.COMMA);
+    }
+  }
 }
diff --git a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java
index 68aaa79..1fa4b21 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java
@@ -59,8 +59,7 @@
   private final Map<FutureFeature, Boolean> myFutureFeatures;
   private List<String> myDunderAll;
   private boolean myDunderAllCalculated;
-  private SoftReference<ExportedNameCache> myExportedNameCache = new SoftReference<ExportedNameCache>(null);
-  private final Object myENCLock = new Object();
+  private volatile SoftReference<ExportedNameCache> myExportedNameCache = new SoftReference<ExportedNameCache>(null);
   private final PsiModificationTracker myModificationTracker;
 
   private class ExportedNameCache {
@@ -305,19 +304,12 @@
   }
 
   public boolean isAcceptedFor(@NotNull Class visitorClass) {
-    final FileViewProvider viewProvider = getViewProvider();
-    final Language lang;
-    if (viewProvider instanceof TemplateLanguageFileViewProvider) {
-      lang = viewProvider.getBaseLanguage();
-    }
-    else {
-      lang = getLanguage();
-    }
-    final List<PythonVisitorFilter> filters = PythonVisitorFilter.INSTANCE.allForLanguage(lang);
-    if (filters.isEmpty()) return true;
-    for (PythonVisitorFilter filter : filters) {
-      if (!filter.isSupported(visitorClass, this))
-        return false;
+    for (Language lang : getViewProvider().getLanguages()) {
+      final List<PythonVisitorFilter> filters = PythonVisitorFilter.INSTANCE.allForLanguage(lang);
+      for (PythonVisitorFilter filter : filters) {
+        if (!filter.isSupported(visitorClass, this))
+          return false;
+      }
     }
     return true;
   }
@@ -441,17 +433,15 @@
 
   private ExportedNameCache getExportedNameCache() {
     ExportedNameCache cache;
-    synchronized (myENCLock) {
-      cache = myExportedNameCache != null ? myExportedNameCache.get() : null;
-      final long modificationStamp = getModificationStamp();
-      if (myExportedNameCache != null && cache != null && modificationStamp != cache.getModificationStamp()) {
-        myExportedNameCache.clear();
-        cache = null;
-      }
-      if (cache == null) {
-        cache = new ExportedNameCache(modificationStamp);
-        myExportedNameCache = new SoftReference<ExportedNameCache>(cache);
-      }
+    cache = myExportedNameCache != null ? myExportedNameCache.get() : null;
+    final long modificationStamp = getModificationStamp();
+    if (myExportedNameCache != null && cache != null && modificationStamp != cache.getModificationStamp()) {
+      myExportedNameCache.clear();
+      cache = null;
+    }
+    if (cache == null) {
+      cache = new ExportedNameCache(modificationStamp);
+      myExportedNameCache = new SoftReference<ExportedNameCache>(cache);
     }
     return cache;
   }
@@ -747,9 +737,7 @@
     ControlFlowCache.clear(this);
     myDunderAllCalculated = false;
     myFutureFeatures.clear(); // probably no need to synchronize
-    synchronized (myENCLock) {
-      myExportedNameCache.clear();
-    }
+    myExportedNameCache.clear();
   }
 
   @Override
diff --git a/python/src/com/jetbrains/python/psi/impl/PyFunctionBuilder.java b/python/src/com/jetbrains/python/psi/impl/PyFunctionBuilder.java
index 82b21ad..53dea09 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyFunctionBuilder.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyFunctionBuilder.java
@@ -20,25 +20,78 @@
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.codeStyle.CodeStyleSettings;
 import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
+import com.intellij.util.ArrayUtil;
 import com.jetbrains.python.PyNames;
 import com.jetbrains.python.PythonFileType;
-import com.jetbrains.python.psi.LanguageLevel;
-import com.jetbrains.python.psi.PyElementGenerator;
-import com.jetbrains.python.psi.PyFunction;
+import com.jetbrains.python.psi.*;
+
+import org.jetbrains.annotations.NotNull;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.regex.Pattern;
 
 /**
  * @author yole
  */
 public class PyFunctionBuilder {
+  private static final String COMMENTS_BOUNDARY = "\"\"\"";
+  private static final Pattern INDENT_REMOVE_PATTERN = Pattern.compile("^\\s+", Pattern.MULTILINE);
   private final String myName;
   private final List<String> myParameters = new ArrayList<String>();
   private final List<String> myStatements = new ArrayList<String>();
   private final List<String> myDecorators = new ArrayList<String>();
   private String myAnnotation = null;
+  private String[] myDocStringLines = null;
+
+  /**
+   * Creates builder copying signature and doc from another one.
+   * @param source what to copy
+   * @param decoratorsToCopyIfExist list of decorator names to be copied to new function.
+   * @return builder configured by this function
+   */
+  @NotNull
+  public static PyFunctionBuilder copySignature(@NotNull final PyFunction source, @NotNull final String... decoratorsToCopyIfExist) {
+    final String name = source.getName();
+    final PyFunctionBuilder functionBuilder = new PyFunctionBuilder((name != null) ? name : "");
+    for (final PyParameter parameter : source.getParameterList().getParameters()) {
+      final String parameterName = parameter.getName();
+      if (parameterName != null) {
+        functionBuilder.parameter(parameterName);
+      }
+    }
+    final PyDecoratorList decoratorList = source.getDecoratorList();
+    if (decoratorList != null) {
+      for (final PyDecorator decorator : decoratorList.getDecorators()) {
+        final String decoratorName = decorator.getName();
+        if (decoratorName != null) {
+          if (ArrayUtil.contains(decoratorName, decoratorsToCopyIfExist)) {
+            functionBuilder.decorate(decoratorName);
+          }
+        }
+      }
+    }
+    final String docString = source.getDocStringValue();
+    if (docString != null) {
+      functionBuilder.docString(docString);
+    }
+    return functionBuilder;
+  }
+
+  /**
+   * Adds docstring to function. Provide doc with out of comment blocks.
+   * @param docString doc
+   */
+  public void docString(@NotNull final String docString) {
+    myDocStringLines = StringUtil.splitByLines(removeIndent(docString));
+  }
+
+  @NotNull
+  private String removeIndent(@NotNull final String string) {
+    return INDENT_REMOVE_PATTERN.matcher(string).replaceAll("");
+  }
 
   public PyFunctionBuilder(String name) {
     myName = name;
@@ -47,7 +100,7 @@
   public PyFunctionBuilder parameter(String baseName) {
     String name = baseName;
     int uniqueIndex = 0;
-    while(myParameters.contains(name)) {
+    while (myParameters.contains(name)) {
       uniqueIndex++;
       name = baseName + uniqueIndex;
     }
@@ -66,11 +119,11 @@
   }
 
   public PyFunction addFunction(PsiElement target, final LanguageLevel languageLevel) {
-    return (PyFunction) target.add(buildFunction(target.getProject(), languageLevel));
+    return (PyFunction)target.add(buildFunction(target.getProject(), languageLevel));
   }
 
   public PyFunction addFunctionAfter(PsiElement target, PsiElement anchor, final LanguageLevel languageLevel) {
-    return (PyFunction) target.addAfter(buildFunction(target.getProject(), languageLevel), anchor);
+    return (PyFunction)target.addAfter(buildFunction(target.getProject(), languageLevel), anchor);
   }
 
   public PyFunction buildFunction(Project project, final LanguageLevel languageLevel) {
@@ -93,6 +146,16 @@
     }
     builder.append(":");
     List<String> statements = myStatements.isEmpty() ? Collections.singletonList(PyNames.PASS) : myStatements;
+
+    if (myDocStringLines != null) {
+      final List<String> comments = new ArrayList<String>(myDocStringLines.length + 2);
+      comments.add(COMMENTS_BOUNDARY);
+      comments.addAll(Arrays.asList(myDocStringLines));
+      comments.add(COMMENTS_BOUNDARY);
+      statements = new ArrayList<String>(statements);
+      statements.addAll(0, comments);
+    }
+
     final CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getInstance(project).getCurrentSettings();
     int indentSize = codeStyleSettings.getIndentOptions(PythonFileType.INSTANCE).INDENT_SIZE;
     String indent = StringUtil.repeatSymbol(' ', indentSize);
@@ -105,4 +168,11 @@
   public void decorate(String decoratorName) {
     myDecorators.add("@" + decoratorName);
   }
+
+  @NotNull
+  private static String getIndent(@NotNull final Project project) {
+    final CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getInstance(project).getCurrentSettings();
+    final int indentSize = codeStyleSettings.getIndentOptions(PythonFileType.INSTANCE).INDENT_SIZE;
+    return StringUtil.repeatSymbol(' ', indentSize);
+  }
 }
diff --git a/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java
index 8c71346..2ffc8e6 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java
@@ -143,9 +143,12 @@
     return getRequiredStubOrPsiChild(PyElementTypes.PARAMETER_LIST);
   }
 
-  @Nullable
+  @Override
+  @NotNull
   public PyStatementList getStatementList() {
-    return childToPsi(PyElementTypes.STATEMENT_LIST);
+    final PyStatementList statementList = childToPsi(PyElementTypes.STATEMENT_LIST);
+    assert statementList != null : "Statement list missing for function " + getText();
+    return statementList;
   }
 
   public PyClass getContainingClass() {
diff --git a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java
index 9c34062..6ad33d6 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java
@@ -238,6 +238,9 @@
           if (defaultValue != null) {
             final PyType type = context.getType(defaultValue);
             if (type != null && !(type instanceof PyNoneType)) {
+              if (type instanceof PyTupleType) {
+                return PyTypeParser.getTypeByName(this, "collections.Iterable");
+              }
               return type;
             }
           }
@@ -249,15 +252,18 @@
             @Override
             public boolean process(@NotNull PyCallExpression call) {
               final PyResolveContext resolveContext = PyResolveContext.noImplicits().withTypeEvalContext(context);
-              final CallArgumentsMapping mapping = call.getArgumentList().analyzeCall(resolveContext);
-              for (Map.Entry<PyExpression, PyNamedParameter> entry : mapping.getPlainMappedParams().entrySet()) {
-                if (entry.getValue() == PyNamedParameterImpl.this) {
-                  final PyExpression argument = entry.getKey();
-                  if (argument != null) {
-                    final PyType type = context.getType(argument);
-                    if (type != null) {
-                      types.add(type);
-                      return true;
+              final PyArgumentList argumentList = call.getArgumentList();
+              if (argumentList != null) {
+                final CallArgumentsMapping mapping = argumentList.analyzeCall(resolveContext);
+                for (Map.Entry<PyExpression, PyNamedParameter> entry : mapping.getPlainMappedParams().entrySet()) {
+                  if (entry.getValue() == PyNamedParameterImpl.this) {
+                    final PyExpression argument = entry.getKey();
+                    if (argument != null) {
+                      final PyType type = context.getType(argument);
+                      if (type != null) {
+                        types.add(type);
+                        return true;
+                      }
                     }
                   }
                 }
diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java
index c5e60eb..47ae589 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java
@@ -17,6 +17,7 @@
 
 import com.intellij.lang.ASTNode;
 import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.extensions.ExtensionException;
 import com.intellij.openapi.extensions.Extensions;
 import com.intellij.openapi.util.Ref;
 import com.intellij.psi.*;
@@ -309,7 +310,7 @@
         }
       }
       catch (AbstractMethodError e) {
-        LOG.info(e);
+        LOG.info(new ExtensionException(provider.getClass()));
       }
     }
     return null;
diff --git a/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionImpl.java
index 340ae09..bf51973 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionImpl.java
@@ -218,7 +218,15 @@
         str = unicode ? new String(new char[]{(char)Integer.parseInt(unicode16, 16)}) : wholeMatch;
       }
       else if (escapedUnicode && unicode32 != null) {
-        str = unicode ? new String(Character.toChars((int)Long.parseLong(unicode32, 16))) : wholeMatch;
+        String s = wholeMatch;
+        if (unicode) {
+          try {
+            s = new String(Character.toChars((int)Long.parseLong(unicode32, 16)));
+          }
+          catch (IllegalArgumentException ignored) {
+          }
+        }
+        str = s;
       }
       else if (raw) {
         str = wholeMatch;
diff --git a/python/src/com/jetbrains/python/psi/search/PyClassInheritorsSearchExecutor.java b/python/src/com/jetbrains/python/psi/search/PyClassInheritorsSearchExecutor.java
index 4a7f084..bb29b7a 100644
--- a/python/src/com/jetbrains/python/psi/search/PyClassInheritorsSearchExecutor.java
+++ b/python/src/com/jetbrains/python/psi/search/PyClassInheritorsSearchExecutor.java
@@ -56,8 +56,8 @@
       if (processed.contains(superClass)) return true;
       processed.add(superClass);
       Project project = superClass.getProject();
-      final Collection<PyClass> candidates = StubIndex.getInstance().get(PySuperClassIndex.KEY, superClassName, project,
-                                                                         ProjectScope.getAllScope(project));
+      final Collection<PyClass> candidates = StubIndex.getElements(PySuperClassIndex.KEY, superClassName, project,
+                                                                   ProjectScope.getAllScope(project), PyClass.class);
       for (PyClass candidate : candidates) {
         final PyClass[] classes = candidate.getSuperClasses();
         for (PyClass superClassCandidate : classes) {
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndex.java b/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndex.java
index 8aed157..814f450 100644
--- a/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndex.java
+++ b/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndex.java
@@ -41,7 +41,7 @@
   }
 
   public static Collection<PyClass> find(String name, Project project, GlobalSearchScope scope) {
-    return StubIndex.getInstance().get(KEY, name, project, scope);
+    return StubIndex.getElements(KEY, name, project, scope, PyClass.class);
   }
 
   public static Collection<PyClass> find(String name, Project project, boolean includeNonProjectItems) {
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndexInsensitive.java b/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndexInsensitive.java
index e65ba65..a275426 100644
--- a/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndexInsensitive.java
+++ b/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndexInsensitive.java
@@ -38,6 +38,6 @@
   }
 
   public static Collection<PyClass> find(String name, Project project) {
-    return StubIndex.getInstance().get(KEY, name.toLowerCase(), project, ProjectScope.getProjectScope(project));
+    return StubIndex.getElements(KEY, name.toLowerCase(), project, ProjectScope.getProjectScope(project), PyClass.class);
   }
 }
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyFunctionNameIndex.java b/python/src/com/jetbrains/python/psi/stubs/PyFunctionNameIndex.java
index 8b01c2b..ba87608 100644
--- a/python/src/com/jetbrains/python/psi/stubs/PyFunctionNameIndex.java
+++ b/python/src/com/jetbrains/python/psi/stubs/PyFunctionNameIndex.java
@@ -39,11 +39,11 @@
   }
 
   public static Collection<PyFunction> find(String name, Project project, GlobalSearchScope scope) {
-    return StubIndex.getInstance().get(KEY, name, project, scope);
+    return StubIndex.getElements(KEY, name, project, scope, PyFunction.class);
   }
 
   public static Collection<PyFunction> find(String name, Project project) {
-    return StubIndex.getInstance().get(KEY, name, project, ProjectScope.getAllScope(project));
+    return StubIndex.getElements(KEY, name, project, ProjectScope.getAllScope(project), PyFunction.class);
   }
 
   public static Collection<String> allKeys(Project project) {
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyInstanceAttributeIndex.java b/python/src/com/jetbrains/python/psi/stubs/PyInstanceAttributeIndex.java
index 94b196f..58ea933 100644
--- a/python/src/com/jetbrains/python/psi/stubs/PyInstanceAttributeIndex.java
+++ b/python/src/com/jetbrains/python/psi/stubs/PyInstanceAttributeIndex.java
@@ -43,6 +43,6 @@
   }
 
   public static Collection<PyTargetExpression> find(String name, Project project, GlobalSearchScope scope) {
-    return StubIndex.getInstance().get(KEY, name, project, scope);
+    return StubIndex.getElements(KEY, name, project, scope, PyTargetExpression.class);
   }
 }
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyVariableNameIndex.java b/python/src/com/jetbrains/python/psi/stubs/PyVariableNameIndex.java
index ca7b420..1fce6df 100644
--- a/python/src/com/jetbrains/python/psi/stubs/PyVariableNameIndex.java
+++ b/python/src/com/jetbrains/python/psi/stubs/PyVariableNameIndex.java
@@ -42,6 +42,6 @@
   }
 
   public static Collection<PyTargetExpression> find(String name, Project project, GlobalSearchScope scope) {
-    return StubIndex.getInstance().get(KEY, name, project, scope);
+    return StubIndex.getElements(KEY, name, project, scope, PyTargetExpression.class);
   }
 }
diff --git a/python/src/com/jetbrains/python/psi/types/functionalParser/FunctionalParserBase.java b/python/src/com/jetbrains/python/psi/types/functionalParser/FunctionalParserBase.java
index bde4559..6d33b68 100644
--- a/python/src/com/jetbrains/python/psi/types/functionalParser/FunctionalParserBase.java
+++ b/python/src/com/jetbrains/python/psi/types/functionalParser/FunctionalParserBase.java
@@ -203,11 +203,9 @@
         myCache.clear();
       }
       final SoftReference<Pair<R, State>> ref = myCache.get(state.getPos());
-      if (ref != null) {
-        final Pair<R, State> cached = ref.get();
-        if (cached != null) {
-          return cached;
-        }
+      final Pair<R, State> cached = SoftReference.dereference(ref);
+      if (cached != null) {
+        return cached;
       }
       final Pair<R, State> result = myParser.parse(tokens, state);
       myCache.put(state.getPos(), new SoftReference<Pair<R, State>>(result));
diff --git a/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureHandler.java b/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureHandler.java
index 200c11e..719bc83 100644
--- a/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureHandler.java
@@ -17,8 +17,6 @@
 
 import com.intellij.openapi.actionSystem.CommonDataKeys;
 import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.actionSystem.LangDataKeys;
-import com.intellij.openapi.actionSystem.PlatformDataKeys;
 import com.intellij.openapi.application.ex.ApplicationManagerEx;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.project.Project;
@@ -171,9 +169,9 @@
                                                 REFACTORING_NAME, Messages.getQuestionIcon());
       }
       switch (choice) {
-        case 0:
+        case Messages.YES:
           return deepestSuperMethod;
-        case 1:
+        case Messages.NO:
           return function;
         default:
           return null;
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java b/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java
index 71f920c..d2a0b0a 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java
@@ -22,6 +22,7 @@
 import com.intellij.refactoring.classMembers.MemberInfoBase;
 import com.jetbrains.python.psi.PyClass;
 import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
 
 /**
  * @author Dennis.Ushakov
@@ -30,7 +31,7 @@
 
   public static PyMemberInfoStorage getSelectedMemberInfos(PyClass clazz, PsiElement element1, PsiElement element2) {
     final PyMemberInfoStorage infoStorage = new PyMemberInfoStorage(clazz);
-    for (PyMemberInfo member : infoStorage.getClassMemberInfos(clazz)) {
+    for (PyMemberInfo<PyElement> member : infoStorage.getClassMemberInfos(clazz)) {
       final PyElement function = member.getMember();
       member.setChecked(PsiTreeUtil.isAncestor(function, element1, false) ||
                         PsiTreeUtil.isAncestor(function, element2, false));
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringHandler.java b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringHandler.java
index ebb20ff..54c5dd1 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringHandler.java
@@ -19,6 +19,7 @@
 import com.intellij.openapi.actionSystem.DataContext;
 import com.intellij.openapi.actionSystem.LangDataKeys;
 import com.intellij.openapi.actionSystem.PlatformDataKeys;
+import com.intellij.openapi.application.ex.ApplicationManagerEx;
 import com.intellij.openapi.editor.CaretModel;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.editor.Editor;
@@ -31,6 +32,7 @@
 import com.intellij.refactoring.util.CommonRefactoringUtil;
 import com.jetbrains.python.PyBundle;
 import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyUtil;
 import org.jetbrains.annotations.NotNull;
 
 /**
@@ -68,7 +70,27 @@
     doRefactor(project, elements[0], elements[elements.length - 1], editor, file, dataContext);
   }
 
-  protected abstract void doRefactor(Project project, PsiElement element1, PsiElement element2, Editor editor, PsiFile file, DataContext dataContext);
+  private void doRefactor(Project project, PsiElement element1, PsiElement element2, Editor editor, PsiFile file, DataContext dataContext) {
+    if (ApplicationManagerEx.getApplicationEx().isUnitTestMode()) return;
+
+    CommonRefactoringUtil.checkReadOnlyStatus(project, file);
+
+    final PyClass clazz = PyUtil.getContainingClassOrSelf(element1);
+    if (!inClass(clazz, project, editor, "refactoring.pull.up.error.cannot.perform.refactoring.not.inside.class")) return;
+    assert clazz != null;
+
+    final PyMemberInfoStorage infoStorage = PyClassMembersRefactoringSupport.getSelectedMemberInfos(clazz, element1, element2);
+
+    doRefactorImpl(project, clazz, infoStorage, editor);
+  }
+
+
+  protected abstract void doRefactorImpl(@NotNull final Project project,
+                                         @NotNull final PyClass classUnderRefactoring,
+                                         @NotNull final PyMemberInfoStorage infoStorage,
+                                         @NotNull final Editor editor);
+
+
 
   protected boolean inClass(PyClass clazz, Project project, Editor editor, String errorMessageId) {
     if (clazz == null) {
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java
index 9b11d15..1033661 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java
@@ -15,21 +15,24 @@
  */
 package com.jetbrains.python.refactoring.classes;
 
+import com.google.common.collect.Collections2;
+import com.intellij.lang.ASTNode;
 import com.intellij.lang.injection.InjectedLanguageManager;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.Comparing;
 import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.*;
 import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.psi.util.PsiUtilBase;
-import com.intellij.psi.util.PsiUtilCore;
 import com.intellij.psi.util.QualifiedName;
+import com.intellij.util.ArrayUtil;
+import com.jetbrains.NotNullPredicate;
 import com.jetbrains.python.PyNames;
-import com.jetbrains.python.PythonFileType;
 import com.jetbrains.python.codeInsight.PyCodeInsightSettings;
 import com.jetbrains.python.codeInsight.imports.AddImportHelper;
+import com.jetbrains.python.codeInsight.imports.PyImportOptimizer;
 import com.jetbrains.python.psi.*;
 import com.jetbrains.python.psi.impl.PyBuiltinCache;
 import com.jetbrains.python.psi.impl.PyImportedModule;
@@ -43,137 +46,124 @@
 /**
  * @author Dennis.Ushakov
  */
-public class PyClassRefactoringUtil {
+public final class PyClassRefactoringUtil {
   private static final Logger LOG = Logger.getInstance(PyClassRefactoringUtil.class.getName());
   private static final Key<PsiNamedElement> ENCODED_IMPORT = Key.create("PyEncodedImport");
   private static final Key<Boolean> ENCODED_USE_FROM_IMPORT = Key.create("PyEncodedUseFromImport");
   private static final Key<String> ENCODED_IMPORT_AS = Key.create("PyEncodedImportAs");
 
-  private PyClassRefactoringUtil() {}
 
-  public static void moveSuperclasses(PyClass clazz, Set<String> superClasses, PyClass superClass) {
-    if (superClasses.size() == 0) return;
-    final Project project = clazz.getProject();
-    final List<PyExpression> toAdd = removeAndGetSuperClasses(clazz, superClasses);
-    addSuperclasses(project, superClass, toAdd, superClasses);
+  private PyClassRefactoringUtil() {
   }
 
-  public static void addSuperclasses(Project project, PyClass superClass,
-                                     @Nullable Collection<PyExpression> superClassesAsPsi,
-                                     Collection<String> superClassesAsStrings) {
-    if (superClassesAsStrings.size() == 0) return;
-    PyArgumentList argList = superClass.getSuperClassExpressionList();
-    if (argList != null) {
-      if (superClassesAsPsi != null) {
-        for (PyExpression element : superClassesAsPsi) {
-          argList.addArgument(element);
-        }
-      }
-      else {
-        for (String s : superClassesAsStrings) {
-          argList.addArgument(PyElementGenerator.getInstance(project).createExpressionFromText(s));
-        }
-      }
-    } else {
-      addSuperclasses(project, superClass, superClassesAsStrings);
+
+  /**
+   * Copies class field declarations to some other place
+   *
+   * @param assignmentStatement list of class fields
+   * @return new (copied) fields
+   */
+  @NotNull
+  public static List<PyAssignmentStatement> copyFieldDeclarationToStatement(@NotNull final Collection<PyAssignmentStatement> assignmentStatement,
+                                                                            @NotNull final PyStatementList superClassStatement) {
+    final List<PyAssignmentStatement> declations = new ArrayList<PyAssignmentStatement>(assignmentStatement.size());
+    for (final PyAssignmentStatement expression : assignmentStatement) {
+      final PyAssignmentStatement newDeclaration = (PyAssignmentStatement)expression.copy();
+      declations.add((PyAssignmentStatement)PyUtil.addElementToStatementList(newDeclaration, superClassStatement, true));
+      PyPsiUtils.removeRedundantPass(superClassStatement);
     }
+    return declations;
   }
 
-  public static List<PyExpression> removeAndGetSuperClasses(PyClass clazz, Set<String> superClasses) {
-    if (superClasses.size() == 0) return Collections.emptyList();
-    final List<PyExpression> toAdd = new ArrayList<PyExpression>();
-    final PyExpression[] elements = clazz.getSuperClassExpressions();
-    for (PyExpression element : elements) {
-      if (superClasses.contains(element.getText())) {
-        toAdd.add(element);
-        PyUtil.removeListNode(element);
-      }
+  @NotNull
+  public static List<PyFunction> copyMethods(Collection<PyFunction> methods, PyClass superClass) {
+    if (methods.isEmpty()) {
+      return Collections.emptyList();
     }
-    return toAdd;
-  }
-
-  public static void addSuperclasses(Project project, PyClass superClass, Collection<String> superClasses) {
-    if (superClasses.size() == 0) return;
-    final StringBuilder builder = new StringBuilder("(");
-    boolean hasChanges = false;
-    for (String element : superClasses) {
-      if (builder.length() > 1) builder.append(",");
-      if (!alreadyHasSuperClass(superClass, element)) {
-        builder.append(element);
-        hasChanges = true;
-      }
-    }
-    builder.append(")");
-    if (!hasChanges) return;
-
-    final PsiFile file = PsiFileFactory.getInstance(project).createFileFromText(superClass.getName() + "temp", PythonFileType.INSTANCE, builder.toString());
-    final PsiElement expression = file.getFirstChild().getFirstChild();
-    PsiElement colon = superClass.getFirstChild();
-    while (colon != null && !colon.getText().equals(":")) {
-      colon = colon.getNextSibling();
-    }
-    LOG.assertTrue(colon != null && expression != null);
-    PyPsiUtils.addBeforeInParent(colon, expression);
-  }
-
-  private static boolean alreadyHasSuperClass(PyClass superClass, String className) {
-    for (PyClass aClass : superClass.getSuperClasses()) {
-      if (Comparing.strEqual(aClass.getName(), className)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public static void moveMethods(Collection<PyFunction> methods, PyClass superClass) {
-    if (methods.size() == 0) return;
     for (PsiElement e : methods) {
       rememberNamedReferences(e);
     }
-    final PyElement[] elements = methods.toArray(new PyElement[methods.size()]);
-    addMethods(superClass, elements, true);
-    removeMethodsWithComments(elements);
+    final PyFunction[] elements = methods.toArray(new PyFunction[methods.size()]);
+    return addMethods(superClass, elements);
   }
 
-  private static void removeMethodsWithComments(PyElement[] elements) {
-    for (PyElement element : elements) {
-      final Set<PsiElement> comments = PyUtil.getComments(element);
-      if (comments.size() > 0) {
-        PyPsiUtils.removeElements(PsiUtilCore.toPsiElementArray(comments));
+  /**
+   * Adds methods to class.
+   *
+   * @param destination where to add methods
+   * @param methods     methods
+   * @return newly added methods
+   */
+  @NotNull
+  public static List<PyFunction> addMethods(@NotNull final PyClass destination, @NotNull final PyFunction... methods) {
+
+    final PyStatementList destStatementList = destination.getStatementList();
+    final List<PyFunction> newlyCreatedMethods = new ArrayList<PyFunction>(methods.length);
+
+    for (final PyFunction method : methods) {
+
+      if (destination.findMethodByName(method.getName(), false) != null) {
+        continue; //We skip adding if class already has this method. I am not sure if this behaviour is correct, but it was here, so I left if for backward compatibility
+      }
+
+
+      final PyFunction newMethod = insertMethodInProperPlace(destStatementList, method);
+      newlyCreatedMethods.add(newMethod);
+      restoreNamedReferences(newMethod);
+    }
+
+    PyPsiUtils.removeRedundantPass(destStatementList);
+    return newlyCreatedMethods;
+  }
+
+  /**
+   * Adds init methods before all other methods (but after class vars and docs).
+   * Adds all other methods to the bottom
+   *
+   * @param destStatementList where to add methods
+   * @param method            method to add
+   * @return newlty added method
+   */
+  @NotNull
+  private static PyFunction insertMethodInProperPlace(
+    @NotNull final PyStatementList destStatementList,
+    @NotNull final PyFunction method) {
+    boolean methodIsInit = PyUtil.isInit(method);
+    if (!methodIsInit) {
+      //Not init method could be inserted in the bottom
+      return (PyFunction)destStatementList.add(method);
+    }
+
+    //We should find appropriate place for init
+    for (final PsiElement element : destStatementList.getChildren()) {
+      final boolean elementComment = element instanceof PyExpressionStatement;
+      final boolean elementClassField = element instanceof PyAssignmentStatement;
+
+      if (!(elementComment || elementClassField)) {
+        return (PyFunction)destStatementList.addBefore(method, element);
       }
     }
-    PyPsiUtils.removeElements(elements);
+    return (PyFunction)destStatementList.add(method);
   }
 
-  public static void insertPassIfNeeded(PyClass clazz) {
-    final PyStatementList statements = clazz.getStatementList();
+
+  public static <T extends PyElement & PyStatementListContainer> void insertPassIfNeeded(@NotNull T element) {
+    final PyStatementList statements = element.getStatementList();
     if (statements.getStatements().length == 0) {
-      statements.add(PyElementGenerator.getInstance(clazz.getProject()).createFromText(LanguageLevel.getDefault(), PyPassStatement.class, PyNames.PASS));
+      statements.add(
+        PyElementGenerator.getInstance(element.getProject())
+          .createFromText(LanguageLevel.getDefault(), PyPassStatement.class, PyNames.PASS)
+      );
     }
   }
 
-  public static void addMethods(final PyClass superClass, final PyElement[] elements, final boolean up) {
-    if (elements.length == 0) return;
-    final PyStatementList statements = superClass.getStatementList();
-    for (PyElement newStatement : elements) {
-      if (up && newStatement instanceof PyFunction) {
-        final String name = newStatement.getName();
-        if (name != null && superClass.findMethodByName(name, false) != null) {
-          continue;
-        }
-      }
-      if (newStatement instanceof PyExpressionStatement && newStatement.getFirstChild() instanceof PyStringLiteralExpression) continue;
-      final PsiElement anchor = statements.add(newStatement);
-      restoreNamedReferences(anchor);
-      final Set<PsiElement> comments = PyUtil.getComments(newStatement);
-      for (PsiElement comment : comments) {
-        statements.addBefore(comment, anchor);
-      }
-    }
-    PyPsiUtils.removeRedundantPass(statements);
-  }
-
-  public static void restoreNamedReferences(@NotNull PsiElement element) {
+  /**
+   * Restores references saved by {@link #rememberNamedReferences(com.intellij.psi.PsiElement, String...)}.
+   *
+   * @param element newly created element to restore references
+   * @see #rememberNamedReferences(com.intellij.psi.PsiElement, String...)
+   */
+  public static void restoreNamedReferences(@NotNull final PsiElement element) {
     restoreNamedReferences(element, null);
   }
 
@@ -197,6 +187,7 @@
     });
   }
 
+
   private static void restoreReference(final PyReferenceExpression node) {
     PsiNamedElement target = node.getCopyableUserData(ENCODED_IMPORT);
     final String asName = node.getCopyableUserData(ENCODED_IMPORT_AS);
@@ -238,7 +229,7 @@
     if (components.isEmpty()) {
       return false;
     }
-    for (String s: components) {
+    for (String s : components) {
       if (!PyNames.isIdentifier(s) || PyNames.isReserved(s)) {
         return false;
       }
@@ -282,7 +273,16 @@
     }
   }
 
-  public static void rememberNamedReferences(@NotNull final PsiElement element) {
+  /**
+   * Searches for references inside some element (like {@link com.jetbrains.python.psi.PyAssignmentStatement}, {@link com.jetbrains.python.psi.PyFunction} etc
+   * and stored them.
+   * After that you can add element to some new parent. Newly created element then should be processed via {@link #restoreNamedReferences(com.intellij.psi.PsiElement)}
+   * and all references would be restored.
+   *
+   * @param element     element to store references for
+   * @param namesToSkip if reference inside of element has one of this names, it will not be saved.
+   */
+  public static void rememberNamedReferences(@NotNull final PsiElement element, @NotNull final String... namesToSkip) {
     element.acceptChildren(new PyRecursiveElementVisitor() {
       @Override
       public void visitPyReferenceExpression(PyReferenceExpression node) {
@@ -294,7 +294,9 @@
         if (importElement != null && PsiTreeUtil.isAncestor(element, importElement, false)) {
           return;
         }
-        rememberReference(node, element);
+        if (!ArrayUtil.contains(node.getText(), namesToSkip)) { //Do not remember name if it should be skipped
+          rememberReference(node, element);
+        }
       }
     });
   }
@@ -346,7 +348,7 @@
     final String name = getOriginalName(element);
     if (name != null) {
       PyImportElement importElement = null;
-      for (PyImportElement e: importStatement.getImportElements()) {
+      for (PyImportElement e : importStatement.getImportElements()) {
         if (name.equals(getOriginalName(e))) {
           importElement = e;
         }
@@ -363,11 +365,14 @@
         }
         if (deleteImportElement) {
           if (importStatement.getImportElements().length == 1) {
-            final boolean isInjected = InjectedLanguageManager.getInstance(importElement.getProject()).isInjectedFragment(importElement.getContainingFile());
-            if (!isInjected)
+            final boolean isInjected =
+              InjectedLanguageManager.getInstance(importElement.getProject()).isInjectedFragment(importElement.getContainingFile());
+            if (!isInjected) {
               importStatement.delete();
-            else
+            }
+            else {
               deleteImportStatementFromInjected(importStatement);
+            }
           }
           else {
             importElement.delete();
@@ -380,8 +385,7 @@
   private static void deleteImportStatementFromInjected(@NotNull final PyImportStatementBase importStatement) {
     final PsiElement sibling = importStatement.getPrevSibling();
     importStatement.delete();
-    if (sibling instanceof PsiWhiteSpace)
-      sibling.delete();
+    if (sibling instanceof PsiWhiteSpace) sibling.delete();
   }
 
   @Nullable
@@ -404,4 +408,108 @@
     }
     return null;
   }
+
+  /**
+   * Adds super classes to certain class.
+   *
+   * @param project      project where refactoring takes place
+   * @param clazz        destination
+   * @param superClasses classes to add
+   */
+  public static void addSuperclasses(@NotNull final Project project,
+                                     @NotNull final PyClass clazz,
+                                     @NotNull final PyClass... superClasses) {
+
+    final Collection<String> superClassNames = new ArrayList<String>();
+
+
+    for (final PyClass superClass : Collections2.filter(Arrays.asList(superClasses), NotNullPredicate.INSTANCE)) {
+      if (superClass.getName() != null) {
+        superClassNames.add(superClass.getName());
+        insertImport(clazz, superClass);
+      }
+    }
+
+    addSuperClassExpressions(project, clazz, superClassNames, null);
+  }
+
+
+  /**
+   * Adds expressions to superclass list
+   *
+   * @param project          project
+   * @param clazz            class to add expressions to superclass list
+   * @param paramExpressions param expressions. Like "object" or "MySuperClass". Will not add any param exp. if null.
+   * @param keywordArguments keyword args like "metaclass=ABCMeta". key-value pairs.  Will not add any keyword arg. if null.
+   */
+  public static void addSuperClassExpressions(@NotNull final Project project,
+                                              @NotNull final PyClass clazz,
+                                              @Nullable final Collection<String> paramExpressions,
+                                              @Nullable final Collection<Pair<String, String>> keywordArguments) {
+    final PyElementGenerator generator = PyElementGenerator.getInstance(project);
+    final LanguageLevel languageLevel = LanguageLevel.forElement(clazz);
+
+    PyArgumentList superClassExpressionList = clazz.getSuperClassExpressionList();
+    boolean addExpression = false;
+    if (superClassExpressionList == null) {
+      superClassExpressionList = generator.createFromText(languageLevel, PyClass.class, "class foo():pass").getSuperClassExpressionList();
+      assert superClassExpressionList != null : "expression not created";
+      addExpression = true;
+    }
+
+
+    generator.createFromText(LanguageLevel.PYTHON34, PyClass.class, "class foo(object, metaclass=Foo): pass").getSuperClassExpressionList();
+    if (paramExpressions != null) {
+      for (final String paramExpression : paramExpressions) {
+        superClassExpressionList.addArgument(generator.createParameter(paramExpression));
+      }
+    }
+
+    if (keywordArguments != null) {
+      for (final Pair<String, String> keywordArgument : keywordArguments) {
+        superClassExpressionList.addArgument(generator.createKeywordArgument(languageLevel, keywordArgument.first, keywordArgument.second));
+      }
+    }
+
+    // If class has no expression list, then we need to add it manually.
+    if (addExpression) {
+      final ASTNode classNameNode = clazz.getNameNode(); // For nameless classes we simply add expression list directly to them
+      final PsiElement elementToAddAfter = (classNameNode == null) ? clazz.getFirstChild() : classNameNode.getPsi();
+      clazz.addAfter(superClassExpressionList, elementToAddAfter);
+    }
+  }
+
+  /**
+   * Optimizes imports resorting them and removing unneeded
+   *
+   * @param file file to optimize imports
+   */
+  public static void optimizeImports(@NotNull final PsiFile file) {
+    new PyImportOptimizer().processFile(file).run();
+  }
+
+  /**
+   * Adds class attributeName (field) if it does not exist. like __metaclass__ = ABCMeta. Or CLASS_FIELD = 42.
+   *
+   * @param aClass        where to add
+   * @param attributeName attribute's name. Like __metaclass__ or CLASS_FIELD
+   * @param value         it's value. Like ABCMeta or 42.
+   * @return newly inserted attribute
+   */
+  @Nullable
+  public static PsiElement addClassAttributeIfNotExist(
+    @NotNull final PyClass aClass,
+    @NotNull final String attributeName,
+    @NotNull final String value) {
+    if (aClass.findClassAttribute(attributeName, false) != null) {
+      return null; //Do not add any if exist already
+    }
+    final PyElementGenerator generator = PyElementGenerator.getInstance(aClass.getProject());
+    final String text = String.format("%s = %s", attributeName, value);
+    final LanguageLevel level = LanguageLevel.forElement(aClass);
+
+    final PyAssignmentStatement assignmentStatement = generator.createFromText(level, PyAssignmentStatement.class, text);
+    //TODO: Add metaclass to the top. Add others between last attributeName and first method
+    return PyUtil.addElementToStatementList(assignmentStatement, aClass.getStatementList(), true);
+  }
 }
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java b/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java
index 5c51118..5efb352 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java
@@ -29,6 +29,7 @@
 
   @Override
   public void collect(PyElement member) {
+    //TODO: Move to MembersManager as well
     final PyRecursiveElementVisitor visitor = new PyRecursiveElementVisitor() {
       @Override
       public void visitPyCallExpression(PyCallExpression node) {
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfo.java b/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfo.java
deleted file mode 100644
index 405e6e5..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfo.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes;
-
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.classMembers.MemberInfoBase;
-import com.jetbrains.python.psi.*;
-import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyMemberInfo extends MemberInfoBase<PyElement> {
-  public PyMemberInfo(PyElement member) {
-    super(member);
-    final PyClass clazz = PyUtil.getContainingClassOrSelf(member);
-    assert clazz != null;
-
-    if (member instanceof PyFunction) {
-      PyFunction function = (PyFunction)member;
-      displayName = buildDisplayMethodName(function);
-      for (PyClass aClass : clazz.getSuperClasses()) {
-        final PyFunction parentMethod = aClass.findMethodByName(function.getName(), true);
-        if (parentMethod != null) {
-          overrides = true;
-        }
-      }
-    } else if (member instanceof PyClass) {
-      displayName = RefactoringBundle.message("member.info.extends.0", PyClassCellRenderer.getClassText((PyClass)member));
-    }
-  }
-
-  private static String buildDisplayMethodName(PyFunction method) {
-    final StringBuilder builder = new StringBuilder(method.getName());
-    builder.append("(");
-    final PyParameter[] arguments = method.getParameterList().getParameters();
-    for (PyParameter parameter : arguments) {
-      builder.append(parameter.getName());
-      if (arguments.length > 1 && parameter != arguments[arguments.length - 1]) {
-        builder.append(", ");
-      }
-    }
-    builder.append(")");
-    return builder.toString();
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof PyMemberInfo) {
-      return getMember().equals(((PyMemberInfo)obj).getMember());
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    return getMember().hashCode();
-  }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java b/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java
index e5c050a..91d9093 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java
@@ -15,23 +15,22 @@
  */
 package com.jetbrains.python.refactoring.classes;
 
-import com.intellij.psi.PsiElement;
 import com.intellij.refactoring.classMembers.AbstractMemberInfoStorage;
 import com.intellij.refactoring.classMembers.MemberInfoBase;
+import com.intellij.util.containers.HashSet;
 import com.jetbrains.python.psi.PyClass;
 import com.jetbrains.python.psi.PyElement;
 import com.jetbrains.python.psi.PyFunction;
 import com.jetbrains.python.refactoring.PyRefactoringUtil;
+import com.jetbrains.python.refactoring.classes.membersManager.MembersManager;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
 
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
 
 /**
  * @author Dennis.Ushakov
  */
-public class PyMemberInfoStorage extends AbstractMemberInfoStorage<PyElement, PyClass, PyMemberInfo> {
-  private Collection<PyClass> myClasses;
+public class PyMemberInfoStorage extends AbstractMemberInfoStorage<PyElement, PyClass, PyMemberInfo<PyElement>> {
 
   public PyMemberInfoStorage(PyClass aClass) {
     this(aClass, new MemberInfoBase.EmptyFilter<PyElement>());
@@ -53,12 +52,8 @@
 
   private void buildSubClassesMapImpl(PyClass aClass, HashSet<PyClass> visited) {
     visited.add(aClass);
-    if (myClasses == null) {
-      myClasses = new HashSet<PyClass>();
-    }
     for (PyClass clazz : aClass.getSuperClasses()) {
       getSubclasses(clazz).add(aClass);
-      myClasses.add(clazz);
       if (!visited.contains(clazz)) {
         buildSubClassesMapImpl(clazz, visited);
       }
@@ -66,13 +61,8 @@
   }
 
   @Override
-  protected void extractClassMembers(PyClass aClass, ArrayList<PyMemberInfo> temp) {
-    for (PyFunction function : aClass.getMethods()) {
-      temp.add(new PyMemberInfo(function));
-    }
-    for (PyClass pyClass : aClass.getSuperClasses()) {
-      temp.add(new PyMemberInfo(pyClass));
-    }
+  protected void extractClassMembers(PyClass aClass, ArrayList<PyMemberInfo<PyElement>> temp) {
+    temp.addAll(MembersManager.getAllMembersCouldBeMoved(aClass));
   }
 
   @Override
@@ -80,8 +70,4 @@
     return member1 instanceof PyFunction && member instanceof PyFunction &&
            PyRefactoringUtil.areConflictingMethods((PyFunction)member, (PyFunction)member1);
   }
-
-  public Collection<PyClass> getClasses() {
-    return myClasses;
-  }
 }
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassDialog.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassDialog.java
deleted file mode 100644
index c0bc437..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassDialog.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.extractSuperclass;
-
-import com.intellij.lang.LanguageNamesValidation;
-import com.intellij.lang.refactoring.NamesValidator;
-import com.intellij.openapi.fileChooser.FileChooserDescriptor;
-import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.ProjectRootManager;
-import com.intellij.openapi.ui.TextComponentAccessor;
-import com.intellij.openapi.ui.TextFieldWithBrowseButton;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.classMembers.AbstractUsesDependencyMemberInfoModel;
-import com.intellij.refactoring.classMembers.DependencyMemberInfoModel;
-import com.intellij.refactoring.ui.ConflictsDialog;
-import com.jetbrains.python.PyBundle;
-import com.jetbrains.python.PythonLanguage;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
-import com.jetbrains.python.refactoring.classes.ui.UpDirectedMembersMovingDialog;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import javax.swing.*;
-import java.awt.*;
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyExtractSuperclassDialog  extends UpDirectedMembersMovingDialog {
-  private final NamesValidator myNamesValidator = LanguageNamesValidation.INSTANCE.forLanguage(PythonLanguage.getInstance());
-  protected JTextField mySourceClassField;
-  protected JLabel mySuperNameLabel;
-  protected JTextField myExtractedSuperNameField;
-  protected TextFieldWithBrowseButton myTargetDirField;
-  protected JLabel myDirLabel;
-  private static final String FILE_BROWSER_TITLE = "Extract superclass to file or directory:";
-
-  public PyExtractSuperclassDialog(Project project, PyClass clazz, PyMemberInfoStorage infoStorage) {
-    super(project, clazz);
-    myMemberInfos = infoStorage.getClassMemberInfos(myClass);
-
-    myExtractedSuperNameField = new JTextField();
-    myTargetDirField = new TextFieldWithBrowseButton();
-    initSourceClassField();
-
-    setTitle(PyExtractSuperclassHandler.REFACTORING_NAME);
-
-    init();
-  }
-
-  protected void initSourceClassField() {
-    mySourceClassField = new JTextField();
-    mySourceClassField.setEditable(false);
-    mySourceClassField.setText(myClass.getName());
-  }
-
-  @Override
-  protected void doOKAction() {
-    final String name = getSuperBaseName();
-    if (!myNamesValidator.isIdentifier(name, myClass.getProject())) {
-      setErrorText(PyBundle.message("refactoring.extract.super.name.0.must.be.ident", name));
-      return;
-    }
-    boolean found_root = false;
-    try {
-      String target_dir = FileUtil.toSystemIndependentName(new File(myTargetDirField.getText()).getCanonicalPath());
-      for (VirtualFile file : ProjectRootManager.getInstance(myClass.getProject()).getContentRoots()) {
-        if (StringUtil.startsWithIgnoreCase(target_dir, file.getPath())) {
-          found_root = true;
-          break;
-        }
-      }
-    }
-    catch (IOException ignore) {
-    }
-    if (! found_root) {
-      setErrorText(PyBundle.message("refactoring.extract.super.target.path.outside.roots"));
-      return;
-    }
-    super.doOKAction();
-  }
-
-  @Override
-  public JComponent getPreferredFocusedComponent() {
-    return myExtractedSuperNameField;
-  }
-
-  protected JPanel createNorthPanel() {
-    Box box = createBox();
-    box.add(Box.createVerticalStrut(10));
-
-    JPanel panel = new JPanel(new BorderLayout());
-    panel.add(box, BorderLayout.CENTER);
-    return panel;
-  }
-
-  protected Box createBox() {
-    Box box = Box.createVerticalBox();
-
-    JPanel _panel = new JPanel(new BorderLayout());
-    _panel.add(new JLabel(RefactoringBundle.message("extract.superclass.from")), BorderLayout.NORTH);
-    _panel.add(mySourceClassField, BorderLayout.CENTER);
-    box.add(_panel);
-
-    box.add(Box.createVerticalStrut(10));
-
-    mySuperNameLabel = new JLabel();
-    mySuperNameLabel.setText(RefactoringBundle.message("superclass.name"));
-
-    _panel = new JPanel(new BorderLayout());
-    _panel.add(mySuperNameLabel, BorderLayout.NORTH);
-    _panel.add(myExtractedSuperNameField, BorderLayout.CENTER);
-    box.add(_panel);
-    box.add(Box.createVerticalStrut(5));
-
-    final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor();
-    final VirtualFile root = getRoot();
-    assert root != null;
-
-    final Project project = myClass.getProject();
-    descriptor.setRoots(ProjectRootManager.getInstance(project).getContentRoots());
-    descriptor.setIsTreeRootVisible(true);
-    myTargetDirField.setText(FileUtil.toSystemDependentName(root.getPath()));
-    myTargetDirField.addBrowseFolderListener(FILE_BROWSER_TITLE,
-                                       null, project, descriptor, TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT);
-
-    _panel = new JPanel(new BorderLayout());
-    myDirLabel = new JLabel();
-    myDirLabel.setText(FILE_BROWSER_TITLE);
-
-    _panel.add(myDirLabel, BorderLayout.NORTH);
-    _panel.add(myTargetDirField, BorderLayout.CENTER);
-    box.add(_panel);
-    return box;
-  }
-
-  @Nullable
-  protected VirtualFile getRoot() {
-    return myClass.getContainingFile().getVirtualFile();
-  }
-
-  @Override
-  protected String getMembersBorderTitle() {
-    return RefactoringBundle.message("members.to.form.superclass");
-  }
-
-  @Override
-  protected String getHelpId() {
-    return "python.reference.extractSuperclass";
-  }
-
-  @Override
-  protected DependencyMemberInfoModel<PyElement, PyMemberInfo> createMemberInfoModel() {
-    return new MyMemberInfoModel(myClass);
-  }
-
-  @Override
-  public boolean checkConflicts() {
-    final Collection<PyMemberInfo> infos = getSelectedMemberInfos();
-    if (!checkWritable(myClass, infos)) return false;
-    if (infos.size() == 0) {
-      ConflictsDialog conflictsDialog = new ConflictsDialog(myClass.getProject(), RefactoringBundle.message("no.members.selected"));
-      conflictsDialog.show();
-      return conflictsDialog.isOK();
-    }
-    return true;
-  }
-
-  public String getSuperBaseName() {
-    return myExtractedSuperNameField.getText();
-  }
-
-  public String getTargetFile() {
-    return myTargetDirField.getText();
-  }
-
-  private static class MyMemberInfoModel extends AbstractUsesDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo> {
-    public MyMemberInfoModel(PyClass clazz) {
-      super(clazz, null, false);
-    }
-
-    public boolean isAbstractEnabled(PyMemberInfo member) {
-      return false;
-    }
-
-    public int checkForProblems(@NotNull PyMemberInfo member) {
-      return member.isChecked() ? OK : super.checkForProblems(member);
-    }
-
-    @Override
-    protected int doCheck(@NotNull PyMemberInfo memberInfo, int problem) {
-      return problem;
-    }
-  }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java
index a68860d..747d9bf 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java
@@ -15,23 +15,18 @@
  */
 package com.jetbrains.python.refactoring.classes.extractSuperclass;
 
-import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.application.ex.ApplicationManagerEx;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
 import com.intellij.refactoring.RefactoringBundle;
 import com.intellij.refactoring.util.CommonRefactoringUtil;
-import com.intellij.util.PsiNavigateUtil;
+import com.jetbrains.python.PyBundle;
 import com.jetbrains.python.psi.PyClass;
 import com.jetbrains.python.psi.PyUtil;
-import com.jetbrains.python.refactoring.classes.PyClassMembersRefactoringSupport;
 import com.jetbrains.python.refactoring.classes.PyClassRefactoringHandler;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
 import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
-
-import java.util.Collection;
+import com.jetbrains.python.vp.Creator;
+import com.jetbrains.python.vp.ViewPresenterUtils;
+import org.jetbrains.annotations.NotNull;
 
 /**
  * @author Dennis.Ushakov
@@ -39,27 +34,39 @@
 public class PyExtractSuperclassHandler extends PyClassRefactoringHandler {
   public static final String REFACTORING_NAME = RefactoringBundle.message("extract.superclass.title");
 
+
   @Override
-  protected void doRefactor(Project project, PsiElement element1, PsiElement element2, Editor editor, PsiFile file, DataContext dataContext) {
-    CommonRefactoringUtil.checkReadOnlyStatus(project, file);
-
-    final PyClass clazz = PyUtil.getContainingClassOrSelf(element1);
-    if (!inClass(clazz, project, editor, "refactoring.pull.up.error.cannot.perform.refactoring.not.inside.class")) return;
-
-    final PyMemberInfoStorage infoStorage = PyClassMembersRefactoringSupport.getSelectedMemberInfos(clazz, element1, element2);
-
-    if (ApplicationManagerEx.getApplicationEx().isUnitTestMode()) return;
-
-    final PyExtractSuperclassDialog dialog = new PyExtractSuperclassDialog(project, clazz, infoStorage);
-    dialog.show();
-    if(dialog.isOK()) {
-      extractWithHelper(clazz, dialog.getSelectedMemberInfos(), dialog.getSuperBaseName(), dialog.getTargetFile());
+  protected void doRefactorImpl(@NotNull final Project project,
+                                @NotNull final PyClass classUnderRefactoring,
+                                @NotNull final PyMemberInfoStorage infoStorage,
+                                @NotNull final Editor editor) {
+    //TODO: Move to presenter
+    if (PyUtil.filterOutObject(infoStorage.getClassMemberInfos(classUnderRefactoring)).isEmpty()) {
+      CommonRefactoringUtil.showErrorHint(project, editor, PyBundle
+        .message("refactoring.extract.super.class.no.members.allowed"), RefactoringBundle.message("extract.superclass.elements.header"),
+                                          null);
+      return;
     }
+
+    ViewPresenterUtils.linkViewWithPresenterAndLaunch(PyExtractSuperclassPresenter.class, PyExtractSuperclassView.class,
+                                                      new Creator<PyExtractSuperclassView, PyExtractSuperclassPresenter>() {
+                                                        @NotNull
+                                                        @Override
+                                                        public PyExtractSuperclassPresenter createPresenter(@NotNull final PyExtractSuperclassView view) {
+                                                          return new PyExtractSuperclassPresenterImpl(view, classUnderRefactoring,
+                                                                                                      infoStorage);
+                                                        }
+
+                                                        @NotNull
+                                                        @Override
+                                                        public PyExtractSuperclassView createView(@NotNull final PyExtractSuperclassPresenter presenter) {
+                                                          return new PyExtractSuperclassViewSwingImpl(classUnderRefactoring, project,
+                                                                                                      presenter);
+                                                        }
+                                                      }
+    );
   }
 
-  private static void extractWithHelper(PyClass clazz, Collection<PyMemberInfo> selectedMemberInfos, String superBaseName, String targetFile) {
-    PsiNavigateUtil.navigate(PyExtractSuperclassHelper.extractSuperclass(clazz, selectedMemberInfos, superBaseName, targetFile));
-  }
 
   @Override
   protected String getTitle() {
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java
index 0d80337..52657c6 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java
@@ -15,95 +15,89 @@
  */
 package com.jetbrains.python.refactoring.classes.extractSuperclass;
 
-import com.intellij.openapi.application.ApplicationManager;
+import com.google.common.base.Predicate;
 import com.intellij.openapi.application.ex.ApplicationManagerEx;
-import com.intellij.openapi.command.CommandProcessor;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.ProjectRootManager;
 import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VfsUtil;
+import com.intellij.openapi.vfs.VfsUtilCore;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.vfs.VirtualFileManager;
 import com.intellij.psi.*;
-import com.intellij.refactoring.RefactoringBundle;
 import com.intellij.util.PathUtil;
 import com.jetbrains.python.PyNames;
 import com.jetbrains.python.PythonFileType;
 import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.impl.PyPsiUtils;
 import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.MembersManager;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 
 /**
  * @author Dennis.Ushakov
  */
-public class PyExtractSuperclassHelper {
+public final class PyExtractSuperclassHelper {
   private static final Logger LOG = Logger.getInstance(PyExtractSuperclassHelper.class.getName());
+  /**
+   * Accepts only those members whose element is PyClass object (new classes)
+   */
+  private static final Predicate<PyMemberInfo<PyElement>> ALLOW_OBJECT = new PyUtil.ObjectPredicate(true);
 
-  private PyExtractSuperclassHelper() {}
+  private PyExtractSuperclassHelper() {
+  }
 
-  public static PsiElement extractSuperclass(final PyClass clazz,
-                                             final Collection<PyMemberInfo> selectedMemberInfos,
-                                             final String superBaseName,
-                                             final String targetFile) {
-    final Set<String> superClasses = new HashSet<String>();
-    final Set<PsiNamedElement> extractedClasses = new HashSet<PsiNamedElement>();
-    final List<PyFunction> methods = new ArrayList<PyFunction>();
-    for (PyMemberInfo member : selectedMemberInfos) {
-      final PyElement element = member.getMember();
-      if (element instanceof PyFunction) methods.add((PyFunction)element);
-      else if (element instanceof PyClass) {
-        extractedClasses.add((PyClass)element);
-        superClasses.add(element.getName());
+  static void extractSuperclass(final PyClass clazz,
+                                @NotNull Collection<PyMemberInfo<PyElement>> selectedMemberInfos,
+                                final String superBaseName,
+                                final String targetFile) {
+    //We will need to change it probably while param may be read-only
+    //noinspection AssignmentToMethodParameter
+    selectedMemberInfos = new ArrayList<PyMemberInfo<PyElement>>(selectedMemberInfos);
+
+    // PY-12171
+    final PyMemberInfo<PyElement> objectMember = MembersManager.findMember(selectedMemberInfos, ALLOW_OBJECT);
+    if (LanguageLevel.forElement(clazz).isPy3K()) {
+      // Remove object from list if Py3
+      if (objectMember != null) {
+        selectedMemberInfos.remove(objectMember);
       }
-      else LOG.error("unmatched member class " + element.getClass());
-    }
-
-    // 'object' superclass is always pulled up, even if not selected explicitly
-    for (PyExpression expr : clazz.getSuperClassExpressions()) {
-      if (PyNames.OBJECT.equals(expr.getText()) && !superClasses.contains(PyNames.OBJECT)) {
-        superClasses.add(PyNames.OBJECT);
+    } else {
+      // Always add object if < Py3
+      if (objectMember == null) {
+        final PyMemberInfo<PyElement> object = MembersManager.findMember(clazz, ALLOW_OBJECT);
+        if (object != null) {
+          selectedMemberInfos.add(object);
+        }
       }
     }
 
     final Project project = clazz.getProject();
-    final Ref<PyClass> newClassRef = new Ref<PyClass>();
-    CommandProcessor.getInstance().executeCommand(project, new Runnable() {
-      public void run() {
-        ApplicationManager.getApplication().runWriteAction(new Runnable() {
-          public void run() {
-            final PyElement[] elements = methods.toArray(new PyElement[methods.size()]);
-            final String text = "class " + superBaseName + ":\n  pass" + "\n";
-            PyClass newClass = PyElementGenerator.getInstance(project).createFromText(LanguageLevel.getDefault(), PyClass.class, text);
-            newClass = placeNewClass(project, newClass, clazz, targetFile);
-            newClassRef.set(newClass);
-            PyClassRefactoringUtil.moveMethods(methods, newClass);
-            PyClassRefactoringUtil.moveSuperclasses(clazz, superClasses, newClass);
-            PyClassRefactoringUtil.addSuperclasses(project, clazz, null, Collections.singleton(superBaseName));
-            PyClassRefactoringUtil.insertImport(newClass, extractedClasses);
-            if (elements.length > 0) {
-              PyPsiUtils.removeElements(elements);
-            }
-            PyClassRefactoringUtil.insertPassIfNeeded(clazz);
-          }
-        });
-      }
-    }, RefactoringBundle.message("extract.superclass.command.name", superBaseName, clazz.getName()), null);
-    return newClassRef.get();
+
+    final String text = "class " + superBaseName + ":\n  pass" + "\n";
+    PyClass newClass = PyElementGenerator.getInstance(project).createFromText(LanguageLevel.getDefault(), PyClass.class, text);
+
+    newClass = placeNewClass(project, newClass, clazz, targetFile);
+    MembersManager.moveAllMembers(selectedMemberInfos, clazz, newClass);
+    if (! newClass.getContainingFile().equals(clazz.getContainingFile())) {
+      PyClassRefactoringUtil.optimizeImports(clazz.getContainingFile()); // To remove unneeded imports only if user used different file
+    }
+    PyClassRefactoringUtil.addSuperclasses(project, clazz, null, newClass);
+
   }
 
-  private static PyClass placeNewClass(Project project, PyClass newClass, @NotNull PyClass clazz, String targetFile) {
-    VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(ApplicationManagerEx.getApplicationEx().isUnitTestMode() ? targetFile : VfsUtil.pathToUrl(targetFile));
+  private static PyClass placeNewClass(final Project project, PyClass newClass, @NotNull final PyClass clazz, final String targetFile) {
+    VirtualFile file = VirtualFileManager.getInstance()
+      .findFileByUrl(ApplicationManagerEx.getApplicationEx().isUnitTestMode() ? targetFile : VfsUtilCore.pathToUrl(targetFile));
     // file is the same as the source
     if (Comparing.equal(file, clazz.getContainingFile().getVirtualFile())) {
       return (PyClass)clazz.getParent().addBefore(newClass, clazz);
@@ -131,7 +125,8 @@
       else { // existing file
         psiFile = PsiManager.getInstance(project).findFile(file);
       }
-    } catch (IOException e) {
+    }
+    catch (IOException e) {
       LOG.error(e);
     }
 
@@ -147,6 +142,7 @@
 
   /**
    * Places a file at the end of given path, creating intermediate dirs and inits.
+   *
    * @param project
    * @param path
    * @param filename
@@ -157,6 +153,7 @@
     return placeFile(project, path, filename, null);
   }
 
+  //TODO: Mover to the other class? That is not good to dependent PyUtils on this class
   public static PsiFile placeFile(Project project, String path, String filename, @Nullable String content) throws IOException {
     PsiDirectory psiDir = createDirectories(project, path);
     LOG.assertTrue(psiDir != null);
@@ -177,8 +174,9 @@
 
   /**
    * Create all intermediate dirs with inits from one of roots up to target dir.
+   *
    * @param project
-   * @param target a full path to target dir
+   * @param target  a full path to target dir
    * @return deepest child directory, or null if target is not in roots or process fails at some point.
    */
   @Nullable
@@ -198,7 +196,7 @@
       }
     }
     if (the_root == null) {
-      throw new IOException("Can't find '"+ target +"' among roots");
+      throw new IOException("Can't find '" + target + "' among roots");
     }
     if (the_rest != null) {
       final LocalFileSystem lfs = LocalFileSystem.getInstance();
@@ -213,7 +211,9 @@
             throw new IOException("Expected dir, but got non-dir: " + subdir.getPath());
           }
         }
-        else subdir = the_root.createChildDirectory(lfs, dirs[i]);
+        else {
+          subdir = the_root.createChildDirectory(lfs, dirs[i]);
+        }
         VirtualFile init_vfile = subdir.findChild(PyNames.INIT_DOT_PY);
         if (init_vfile == null) init_vfile = subdir.createChildData(lfs, PyNames.INIT_DOT_PY);
         /*
@@ -235,5 +235,4 @@
     }
     return ret;
   }
-
 }
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInfoModel.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInfoModel.java
new file mode 100644
index 0000000..2bae38a
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInfoModel.java
@@ -0,0 +1,31 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.intellij.refactoring.classMembers.AbstractUsesDependencyMemberInfoModel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+class PyExtractSuperclassInfoModel extends AbstractUsesDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo<PyElement>> {
+  PyExtractSuperclassInfoModel(@NotNull final PyClass clazz) {
+    super(clazz, null, false);
+  }
+
+  @Override
+  public boolean isAbstractEnabled(final PyMemberInfo<PyElement> member) {
+    return member.isCouldBeAbstract() && isMemberEnabled(member);
+  }
+
+  @Override
+  public int checkForProblems(@NotNull final PyMemberInfo<PyElement> member) {
+    return member.isChecked() ? OK : super.checkForProblems(member);
+  }
+
+  @Override
+  protected int doCheck(@NotNull final PyMemberInfo<PyElement> memberInfo, final int problem) {
+    return problem;
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInitializationInfo.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInitializationInfo.java
new file mode 100644
index 0000000..9ba93c2
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInitializationInfo.java
@@ -0,0 +1,46 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+
+/**
+ * View configuration for "extract superclass"
+ *
+ * @author Ilya.Kazakevich
+ */
+class PyExtractSuperclassInitializationInfo extends MembersViewInitializationInfo {
+
+  @NotNull
+  private final String myDefaultFilePath;
+  @NotNull
+  private final VirtualFile[] myRoots;
+
+  /**
+   * @param defaultFilePath module file path to display. User will be able to change it later.
+   * @param roots           virtual files where user may add new module
+   */
+  PyExtractSuperclassInitializationInfo(@NotNull final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> memberInfoModel,
+                                        @NotNull final Collection<PyMemberInfo<PyElement>> memberInfos,
+                                        @NotNull final String defaultFilePath,
+                                        @NotNull final VirtualFile... roots) {
+    super(memberInfoModel, memberInfos);
+    myDefaultFilePath = defaultFilePath;
+    myRoots = roots.clone();
+  }
+
+  @NotNull
+  public String getDefaultFilePath() {
+    return myDefaultFilePath;
+  }
+
+  @NotNull
+  public VirtualFile[] getRoots() {
+    return myRoots.clone();
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenter.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenter.java
new file mode 100644
index 0000000..4e5edf7
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenter.java
@@ -0,0 +1,10 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenter;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public interface PyExtractSuperclassPresenter extends MembersBasedPresenter {
+  //TODO: Remove?
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenterImpl.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenterImpl.java
new file mode 100644
index 0000000..4d2190a
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenterImpl.java
@@ -0,0 +1,99 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.intellij.lang.LanguageNamesValidation;
+import com.intellij.lang.refactoring.NamesValidator;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.RefactoringBundle;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.PythonLanguage;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.psi.PyUtil;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.BadDataException;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenterNoPreviewImpl;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+class PyExtractSuperclassPresenterImpl extends MembersBasedPresenterNoPreviewImpl<PyExtractSuperclassView>
+  implements PyExtractSuperclassPresenter {
+  private final NamesValidator myNamesValidator = LanguageNamesValidation.INSTANCE.forLanguage(PythonLanguage.getInstance());
+
+
+  @NotNull
+  private static final MultiMap<PsiElement, String> EMPTY_MAP = MultiMap.create();
+
+  PyExtractSuperclassPresenterImpl(@NotNull final PyExtractSuperclassView view,
+                                   @NotNull final PyClass classUnderRefactoring,
+                                   @NotNull final PyMemberInfoStorage infoStorage) {
+    super(view, classUnderRefactoring, infoStorage);
+  }
+
+  @NotNull
+  @Override
+  protected MultiMap<PsiElement, String> getConflicts() {
+    return EMPTY_MAP; //There are no conflicts for extracting
+  }
+
+  @Override
+  protected void validateView() throws BadDataException {
+    super.validateView();
+    final Project project = myClassUnderRefactoring.getProject();
+    if (!myNamesValidator.isIdentifier(myView.getSuperClassName(), project)) {
+      throw new BadDataException(PyBundle.message("refactoring.extract.super.name.0.must.be.ident", myView.getSuperClassName()));
+    }
+    boolean rootFound = false;
+    try {
+      final String targetDir = FileUtil.toSystemIndependentName(new File(myView.getModuleFile()).getCanonicalPath());
+      for (final VirtualFile file : ProjectRootManager.getInstance(project).getContentRoots()) {
+        if (StringUtil.startsWithIgnoreCase(targetDir, file.getPath())) {
+          rootFound = true;
+          break;
+        }
+      }
+    }
+    catch (final IOException ignore) {
+    }
+    if (!rootFound) {
+      throw new BadDataException(PyBundle.message("refactoring.extract.super.target.path.outside.roots"));
+    }
+  }
+
+  @Override
+  public void launch() {
+    final String defaultFilePath = FileUtil.toSystemDependentName(myClassUnderRefactoring.getContainingFile().getVirtualFile().getPath());
+    final VirtualFile[] roots = ProjectRootManager.getInstance(myClassUnderRefactoring.getProject()).getContentRoots();
+    final Collection<PyMemberInfo<PyElement>> pyMemberInfos =
+      PyUtil.filterOutObject(myStorage.getClassMemberInfos(myClassUnderRefactoring));
+    myView.configure(
+      new PyExtractSuperclassInitializationInfo(new PyExtractSuperclassInfoModel(myClassUnderRefactoring), pyMemberInfos, defaultFilePath,
+                                                roots));
+    myView.initAndShow();
+
+  }
+
+  @NotNull
+  @Override
+  protected String getCommandName() {
+    return RefactoringBundle.message("extract.superclass.command.name", myView.getSuperClassName(), myClassUnderRefactoring.getName());
+  }
+
+  @Override
+  protected void refactorNoPreview() {
+    PyExtractSuperclassHelper
+      .extractSuperclass(myClassUnderRefactoring, myView.getSelectedMemberInfos(), myView.getSuperClassName(), myView.getModuleFile());
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassView.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassView.java
new file mode 100644
index 0000000..d4dd249
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassView.java
@@ -0,0 +1,25 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public interface PyExtractSuperclassView extends MembersBasedView<PyExtractSuperclassInitializationInfo> {
+
+  /**
+   *
+   * @return path to destination file (module) where user wants to create new class
+   */
+  @NotNull
+  String getModuleFile();
+
+  /**
+   *
+   * @return name user wants to give to new class
+   */
+  @NotNull
+  String getSuperClassName();
+
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassViewSwingImpl.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassViewSwingImpl.java
new file mode 100644
index 0000000..aed7301
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassViewSwingImpl.java
@@ -0,0 +1,108 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.intellij.openapi.fileChooser.FileChooserDescriptor;
+import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.ui.TextComponentAccessor;
+import com.intellij.openapi.ui.TextFieldWithBrowseButton;
+import com.intellij.refactoring.RefactoringBundle;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedViewSwingImpl;
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+class PyExtractSuperclassViewSwingImpl
+  extends MembersBasedViewSwingImpl<PyExtractSuperclassPresenter, PyExtractSuperclassInitializationInfo>
+  implements PyExtractSuperclassView {
+
+  private static final String FILE_OR_DIRECTORY = RefactoringBundle.message("extract.superclass.elements.header");
+  @NotNull
+  private final JTextArea myExtractedSuperNameField = new JTextArea();
+  @NotNull
+  private final FileChooserDescriptor myFileChooserDescriptor;
+  @NotNull
+  private final TextFieldWithBrowseButton myTargetDirField;
+
+  PyExtractSuperclassViewSwingImpl(@NotNull final PyClass classUnderRefactoring,
+                                   @NotNull final Project project,
+                                   @NotNull final PyExtractSuperclassPresenter presenter) {
+    super(project, presenter, RefactoringBundle.message("extract.superclass.from"), true);
+    setTitle(PyExtractSuperclassHandler.REFACTORING_NAME);
+
+
+    final Box box = Box.createVerticalBox();
+
+    JPanel panel = new JPanel(new BorderLayout());
+    panel.add(new JLabel(RefactoringBundle.message("extract.superclass.from")), BorderLayout.NORTH);
+    final JTextField sourceClassField = new JTextField();
+    sourceClassField.setEditable(false);
+    sourceClassField.setText(classUnderRefactoring.getName());
+    panel.add(sourceClassField, BorderLayout.CENTER);
+    box.add(panel);
+
+    box.add(Box.createVerticalStrut(10));
+
+    final JLabel superNameLabel = new JLabel();
+    superNameLabel.setText(RefactoringBundle.message("superclass.name"));
+
+    panel = new JPanel(new BorderLayout());
+    panel.add(superNameLabel, BorderLayout.NORTH);
+    panel.add(myExtractedSuperNameField, BorderLayout.CENTER);
+    box.add(panel);
+    box.add(Box.createVerticalStrut(5));
+
+    myFileChooserDescriptor = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor();
+
+
+    myFileChooserDescriptor.setRoots(ProjectRootManager.getInstance(project).getContentRoots());
+    myFileChooserDescriptor.setIsTreeRootVisible(true);
+    myTargetDirField = new TextFieldWithBrowseButton();
+    myTargetDirField
+      .addBrowseFolderListener(FILE_OR_DIRECTORY, null, project, myFileChooserDescriptor, TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT);
+
+    panel = new JPanel(new BorderLayout());
+    final JLabel dirLabel = new JLabel();
+    dirLabel.setText(FILE_OR_DIRECTORY); //u18n
+
+    panel.add(dirLabel, BorderLayout.NORTH);
+    panel.add(myTargetDirField, BorderLayout.CENTER);
+    box.add(panel);
+
+    box.add(Box.createVerticalStrut(10));
+
+
+    myTopPanel.add(box, BorderLayout.CENTER);
+    myCenterPanel.add(myPyMemberSelectionPanel, BorderLayout.CENTER);
+    setPreviewResults(false);
+  }
+
+  @Override
+  public JComponent getPreferredFocusedComponent() {
+    return myExtractedSuperNameField;
+  }
+
+  @Override
+  public void configure(@NotNull final PyExtractSuperclassInitializationInfo configInfo) {
+    super.configure(configInfo);
+    myFileChooserDescriptor.setRoots(configInfo.getRoots());
+    myTargetDirField.setText(configInfo.getDefaultFilePath());
+  }
+
+  @NotNull
+  @Override
+  public String getModuleFile() {
+    return myTargetDirField.getText();
+  }
+
+  @NotNull
+  @Override
+  public String getSuperClassName() {
+    return myExtractedSuperNameField.getText();
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/package-info.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/package-info.java
new file mode 100644
index 0000000..32852cb
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * "Extract superclass" refactoring
+ * @author Ilya.Kazakevich
+ */
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java
new file mode 100644
index 0000000..b6faa3a
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java
@@ -0,0 +1,50 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.jetbrains.python.psi.PyAssignmentStatement;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.psi.PyTargetExpression;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Moves class attributes up
+ *
+ * @author Ilya.Kazakevich
+ */
+class ClassFieldsManager extends FieldsManager {
+
+  ClassFieldsManager() {
+    super(true);
+  }
+
+
+  @Override
+  protected Collection<PyElement> moveAssignments(@NotNull final PyClass from,
+                                 @NotNull final Collection<PyAssignmentStatement> statements,
+                                 @NotNull final PyClass... to) {
+    //TODO: Copy/paste with InstanceFieldsManager. Move to parent?
+    final List<PyElement> result = new ArrayList<PyElement>();
+    for (final PyClass destClass : to) {
+      result.addAll(PyClassRefactoringUtil.copyFieldDeclarationToStatement(statements, destClass.getStatementList()));
+    }
+    deleteElements(statements);
+    PyClassRefactoringUtil.insertPassIfNeeded(from);
+    return result;
+  }
+
+  @Override
+  protected boolean classHasField(@NotNull final PyClass pyClass, @NotNull final String fieldName) {
+    return pyClass.findClassAttribute(fieldName, true) != null;
+  }
+
+  @NotNull
+  @Override
+  protected List<PyTargetExpression> getFieldsByClass(@NotNull final PyClass pyClass) {
+    return pyClass.getClassAttributes();
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/FieldsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/FieldsManager.java
new file mode 100644
index 0000000..d27ec8e
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/FieldsManager.java
@@ -0,0 +1,119 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.psi.PyAssignmentStatement;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.psi.PyTargetExpression;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Parent of all field-based plugins (like class fields, instance fields and so on)
+ *
+ * @author Ilya.Kazakevich
+ */
+abstract class FieldsManager extends MembersManager<PyTargetExpression> {
+  private static final SimpleAssignmentsOnly SIMPLE_ASSIGNMENTS_ONLY = new SimpleAssignmentsOnly();
+  private static final AssignmentTransform ASSIGNMENT_TRANSFORM = new AssignmentTransform();
+  private final boolean myStatic;
+
+  /**
+   * @param isStatic is field static or not?
+   */
+  protected FieldsManager(final boolean isStatic) {
+    super(PyTargetExpression.class);
+    myStatic = isStatic;
+  }
+
+  @Override
+  protected Collection<? extends PyElement> getElementsToStoreReferences(@NotNull final Collection<PyTargetExpression> elements) {
+    // We need to save references from assignments
+    return Collections2.transform(elements, ASSIGNMENT_TRANSFORM);
+  }
+
+  @NotNull
+  @Override
+  protected List<PyElement> getMembersCouldBeMoved(@NotNull final PyClass pyClass) {
+    return Lists.<PyElement>newArrayList(Collections2.filter(getFieldsByClass(pyClass), SIMPLE_ASSIGNMENTS_ONLY));
+  }
+
+  @Override
+  protected Collection<PyElement> moveMembers(@NotNull final PyClass from,
+                                              @NotNull final Collection<PyMemberInfo<PyTargetExpression>> members,
+                                              @NotNull final PyClass... to) {
+    return moveAssignments(from, Collections2.filter(Collections2.transform(fetchElements(members), ASSIGNMENT_TRANSFORM), NotNullPredicate.INSTANCE),
+                           to);
+  }
+
+  protected abstract Collection<PyElement> moveAssignments(@NotNull PyClass from,
+                                                           @NotNull Collection<PyAssignmentStatement> statements,
+                                                           @NotNull PyClass... to);
+
+  /**
+   * Checks if class has fields. Only child may know how to obtain field
+   *
+   * @param pyClass   class to check
+   * @param fieldName field name
+   * @return true if has one
+   */
+  protected abstract boolean classHasField(@NotNull PyClass pyClass, @NotNull String fieldName);
+
+  /**
+   * Returns all fields by class. Only child may know how to obtain fields
+   *
+   * @param pyClass class to check
+   * @return list of fields in target expression (declaration) form
+   */
+  @NotNull
+  protected abstract List<PyTargetExpression> getFieldsByClass(@NotNull PyClass pyClass);
+
+
+  @NotNull
+  @Override
+  public PyMemberInfo<PyTargetExpression> apply(@NotNull final PyTargetExpression input) {
+    return new PyMemberInfo<PyTargetExpression>(input, myStatic, input.getText(), isOverrides(input), this, false);
+  }
+
+  @Nullable
+  private Boolean isOverrides(@NotNull final PyTargetExpression input) {
+    final PyClass aClass = input.getContainingClass();
+    final String name = input.getName();
+    if (name == null) {
+      return null; //Field with out of name can't override something
+    }
+
+    assert aClass != null : "Target expression declared outside of class:" + input;
+
+    return classHasField(aClass, name) ? true : null;
+  }
+
+
+  private static class SimpleAssignmentsOnly extends NotNullPredicate<PyTargetExpression> {
+    //Support only simplest cases like CLASS_VAR = 42.
+    //Tuples (CLASS_VAR_1, CLASS_VAR_2) = "spam", "eggs" are not supported by now
+    @Override
+    public boolean applyNotNull(@NotNull final PyTargetExpression input) {
+      final PsiElement parent = input.getParent();
+      return (parent != null) && PyAssignmentStatement.class.isAssignableFrom(parent.getClass());
+    }
+  }
+
+
+  //Transforms expressions to its assignment step
+  private static class AssignmentTransform implements Function<PyTargetExpression, PyAssignmentStatement> {
+    @Nullable
+    @Override
+    public PyAssignmentStatement apply(@NotNull final PyTargetExpression input) {
+      return PsiTreeUtil.getParentOfType(input, PyAssignmentStatement.class);
+    }
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/InstanceFieldsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/InstanceFieldsManager.java
new file mode 100644
index 0000000..ba6cb0c
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/InstanceFieldsManager.java
@@ -0,0 +1,113 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.collect.Collections2;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.psi.*;
+import com.jetbrains.python.psi.impl.PyFunctionBuilder;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+class InstanceFieldsManager extends FieldsManager {
+
+  // PY-12170
+
+  InstanceFieldsManager() {
+    super(false);
+  }
+
+
+  @Override
+  protected Collection<PyElement> moveAssignments(@NotNull final PyClass from,
+                                                  @NotNull final Collection<PyAssignmentStatement> statements,
+                                                  @NotNull final PyClass... to) {
+    //TODO: Copy/paste with ClassFieldsManager. Move to parent?
+
+    final List<PyElement> result = new ArrayList<PyElement>();
+    for (final PyClass destClass : to) {
+      result.addAll(copyInstanceFields(statements, destClass));
+    }
+    // Delete only declarations made in __init__ to prevent PY-12170
+    final PyFunction fromInitMethod = PyUtil.getInitMethod(from);
+    if (fromInitMethod != null) { // If class has no init method that means all its fields declared in other methods, so nothing to remove
+      deleteElements(Collections2.filter(statements, new InitsOnly(fromInitMethod)));
+      //We can't leave class constructor with empty body
+      PyClassRefactoringUtil.insertPassIfNeeded(fromInitMethod);
+    }
+    return result;
+  }
+
+  /**
+   * Copies class' fields in form of assignments (instance fields) to another class.
+   * Creates init method if there is no any
+   *
+   * @param members assignments to copy
+   * @param to      destination
+   * @return newly created fields
+   */
+  @NotNull
+  private static List<PyAssignmentStatement> copyInstanceFields(@NotNull final Collection<PyAssignmentStatement> members,
+                                                                @NotNull final PyClass to) {
+    //We need __init__ method, and if there is no any -- we need to create it
+    PyFunction toInitMethod = PyUtil.getInitMethod(to);
+    if (toInitMethod == null) {
+      toInitMethod = createInitMethod(to);
+    }
+    final PyStatementList statementList = toInitMethod.getStatementList();
+    return PyClassRefactoringUtil.copyFieldDeclarationToStatement(members, statementList);
+  }
+
+  /**
+   * Creates init method and adds it to certain class.
+   *
+   * @param to Class where method should be added
+   * @return newly created method
+   */
+  //TODO: Move to utils?
+  @NotNull
+  private static PyFunction createInitMethod(@NotNull final PyClass to) {
+    final PyFunctionBuilder functionBuilder = new PyFunctionBuilder(PyNames.INIT);
+    functionBuilder.parameter(PyNames.CANONICAL_SELF); //TODO: Take param from codestyle?
+    final PyFunction function = functionBuilder.buildFunction(to.getProject(), LanguageLevel.forElement(to));
+    return PyClassRefactoringUtil.addMethods(to, function).get(0);
+  }
+
+  @Override
+  protected boolean classHasField(@NotNull final PyClass pyClass, @NotNull final String fieldName) {
+    return pyClass.findInstanceAttribute(fieldName, true) != null;
+  }
+
+  @NotNull
+  @Override
+  protected List<PyTargetExpression> getFieldsByClass(@NotNull final PyClass pyClass) {
+    return pyClass.getInstanceAttributes();
+  }
+
+  private static class InitsOnly extends NotNullPredicate<PyAssignmentStatement> {
+    @NotNull
+    private final PyFunction myInitMethod;
+
+    private InitsOnly(@NotNull final PyFunction initMethod) {
+      myInitMethod = initMethod;
+    }
+
+    @Override
+    protected boolean applyNotNull(@NotNull final PyAssignmentStatement input) {
+      final PyExpression expression = input.getLeftHandSideExpression();
+      if (expression == null) {
+        return false;
+      }
+
+      final PyFunction functionWhereDeclared = PsiTreeUtil.getParentOfType(PyUtil.resolveToTheTop(expression), PyFunction.class);
+      return myInitMethod.equals(functionWhereDeclared);
+    }
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java
new file mode 100644
index 0000000..6be3f9d
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java
@@ -0,0 +1,286 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.base.Function;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Multimap;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiNamedElement;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.TestOnly;
+
+import java.util.*;
+
+/**
+ * Moves members between classes via its plugins (managers).
+ * To move members use {@link #getAllMembersCouldBeMoved(com.jetbrains.python.psi.PyClass)}   and {@link #moveAllMembers(java.util.Collection, com.jetbrains.python.psi.PyClass, com.jetbrains.python.psi.PyClass...)}
+ * To add new manager, extend this class and add it to {@link #MANAGERS}
+ *
+ * @author Ilya.Kazakevich
+ */
+public abstract class MembersManager<T extends PyElement> implements Function<T, PyMemberInfo<T>> {
+  /**
+   * List of managers. Class delegates all logic to them.
+   */
+  private static final Collection<? extends MembersManager<? extends PyElement>> MANAGERS =
+    Arrays.asList(new MethodsManager(), new SuperClassesManager(), new ClassFieldsManager(), new InstanceFieldsManager());
+
+  @NotNull
+  private final Class<T> myExpectedClass;
+
+  protected MembersManager(@NotNull final Class<T> expectedClass) {
+    myExpectedClass = expectedClass;
+  }
+
+  /**
+   * Get all members that could be moved out of certain class
+   *
+   * @param pyClass class to find members
+   * @return list of members could be moved
+   */
+  @NotNull
+  public static List<PyMemberInfo<PyElement>> getAllMembersCouldBeMoved(@NotNull final PyClass pyClass) {
+    final List<PyMemberInfo<PyElement>> result = new ArrayList<PyMemberInfo<PyElement>>();
+
+    for (final MembersManager<? extends PyElement> manager : MANAGERS) {
+      result.addAll(transformSafely(pyClass, manager));
+    }
+    return result;
+  }
+
+
+  /**
+   * Transforms elements, manager says it could move to appropriate {@link com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo}.
+   * Types are checked at runtime.
+   * @param pyClass class whose members we want to move
+   * @param manager manager that should check class and report list of memebers
+   * @return member infos
+   */
+  //TODO: Move to  TypeSafeMovingStrategy
+  @NotNull
+  @SuppressWarnings({"unchecked", "rawtypes"}) //We check type at runtime
+  private static Collection<PyMemberInfo<PyElement>> transformSafely(@NotNull final PyClass pyClass, @NotNull final MembersManager<?> manager) {
+    final List<PyElement> membersCouldBeMoved = manager.getMembersCouldBeMoved(pyClass);
+    manager.checkElementTypes((Collection)membersCouldBeMoved);
+    return (Collection<PyMemberInfo<PyElement>>)Collections2.transform(membersCouldBeMoved, (Function)manager);
+  }
+
+
+  /**
+   * Moves members from one class to another
+   *
+   * @param memberInfos members to move
+   * @param from        source
+   * @param to          destination
+   */
+  public static void moveAllMembers(
+    @NotNull final Collection<PyMemberInfo<PyElement>> memberInfos,
+    @NotNull final PyClass from,
+    @NotNull final PyClass... to
+  ) {
+    final Multimap<MembersManager<PyElement>, PyMemberInfo<PyElement>> managerToMember = ArrayListMultimap.create();
+    //Collect map (manager)->(list_of_memebers)
+    for (final PyMemberInfo<PyElement> memberInfo : memberInfos) {
+      managerToMember.put(memberInfo.getMembersManager(), memberInfo);
+    }
+    //Move members via manager
+    for (final MembersManager<PyElement> membersManager : managerToMember.keySet()) {
+      final Collection<PyMemberInfo<PyElement>> members = managerToMember.get(membersManager);
+      TypeSafeMovingStrategy.moveCheckingTypesAtRunTime(from, membersManager, members, to);
+    }
+    PyClassRefactoringUtil.insertPassIfNeeded(from);
+  }
+
+
+
+  /**
+   * Checks that all elements has allowed type for manager
+   *
+   * @param members elements to check against manager
+   */
+  void checkElementTypes(@NotNull final Collection<T> elements) {
+    for (final PyElement pyElement : elements) {
+      Preconditions.checkArgument(myExpectedClass.isAssignableFrom(pyElement.getClass()),
+                                  String.format("Manager %s expected %s but got %s", this, myExpectedClass, pyElement));
+    }
+  }
+
+  /**
+   * Finds member by predicate
+   *
+   * @param members   where to find
+   * @param predicate what to find
+   * @return member or null if not found
+   */
+  @Nullable
+  public static PyMemberInfo<PyElement> findMember(@NotNull final Collection<PyMemberInfo<PyElement>> members,
+                                                   @NotNull final Predicate<PyMemberInfo<PyElement>> predicate) {
+    for (final PyMemberInfo<PyElement> pyMemberInfo : members) {
+      if (predicate.apply(pyMemberInfo)) {
+        return pyMemberInfo;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Finds member of class by predicate
+   *
+   * @param predicate what to find
+   * @param pyClass   class to find members
+   * @return member or null if not found
+   */
+  @Nullable
+  public static PyMemberInfo<PyElement> findMember(@NotNull final PyClass pyClass,
+                                                   @NotNull final Predicate<PyMemberInfo<PyElement>> predicate) {
+    return findMember(getAllMembersCouldBeMoved(pyClass), predicate);
+  }
+
+  /**
+   * Finds member in class. It is here only for backward compatibility with some tests.
+   */
+  //TODO: mark deprecated?
+  @TestOnly
+  @NotNull
+  public static PyMemberInfo<PyElement> findMember(@NotNull final PyClass pyClass, @NotNull final PyElement pyElement) {
+    final PyMemberInfo<PyElement> result = findMember(pyClass, new FindByElement(pyElement));
+    if (result != null) {
+      return result;
+    }
+    throw new IllegalArgumentException(String.format("Element %s not found in class %s or can't be moved", pyElement, pyClass));
+  }
+
+  /**
+   * Get list of elements certain plugin could move out of the class
+   *
+   * @param pyClass class with members
+   * @return list of members
+   */
+  @NotNull
+  protected abstract List<PyElement> getMembersCouldBeMoved(@NotNull PyClass pyClass);
+
+
+  /**
+   * Filters out named elements (ones that subclasses {@link com.intellij.psi.PsiNamedElement}) and {@link com.jetbrains.python.psi.PyElement})
+   * that are null or has null name.
+   * You need it sometimes when code has errors (i.e. bad formatted code with annotation may treat annotation as method with null name.
+   * note: we should probably throw exceptions in such cases and display "refactoring not available" window in handler)
+   *
+   * @param elementsToFilter collection of elements to filter
+   * @param <T>              element type
+   * @return collection of T with out of nulls and elemens whos {@link com.intellij.psi.PsiNamedElement#getName()}  returns null
+   */
+  @NotNull
+  protected static <T extends PsiNamedElement & PyElement> Collection<T> filterNameless(@NotNull final Collection<T> elementsToFilter) {
+    return Collections2.filter(elementsToFilter, new NamelessFilter<T>());
+  }
+
+  /**
+   * Returns list of elements that may require reference storing aid from {@link com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil#rememberNamedReferences(com.intellij.psi.PsiElement, String...)}
+   *
+   * @param elements members chosen by user. In most cases members their selves could be stored, but different managers may support other strategies
+   * @return elements to store
+   * @see #moveAllMembers(java.util.Collection, com.jetbrains.python.psi.PyClass, com.jetbrains.python.psi.PyClass...)
+   */
+  protected Collection<? extends PyElement> getElementsToStoreReferences(@NotNull final Collection<T> elements) {
+    return elements;
+  }
+
+  /**
+   * Moves element from one class to another. Returns members that may require reference restoring aid from
+   * ({@link com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil#restoreNamedReferences(com.intellij.psi.PsiElement)})
+   *
+   * @see #getElementsToStoreReferences(java.util.Collection)
+   */
+  protected abstract Collection<PyElement> moveMembers(
+    @NotNull PyClass from,
+    @NotNull Collection<PyMemberInfo<T>> members,
+    @NotNull PyClass... to);
+
+
+  /**
+   * Creates {@link com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo} from {@link com.jetbrains.python.psi.PyElement}
+   * This process is plugin-specific and should be implemented in each plugin
+   *
+   * @param input element
+   * @return member info
+   */
+  @SuppressWarnings("NullableProblems") //IDEA-120100
+  @NotNull
+  @Override
+  public abstract PyMemberInfo<T> apply(@NotNull T input);
+
+  /**
+   * Deletes all elements
+   *
+   * @param pyElementsToDelete elements to delete
+   */
+  protected static void deleteElements(@NotNull final Collection<? extends PsiElement> pyElementsToDelete) {
+    for (final PsiElement element : pyElementsToDelete) {
+      element.delete();
+    }
+  }
+
+  /**
+   * Fetches elements from member info.
+   * @param memberInfos member info to fetch elements from
+   * @param <T> type of element
+   * @return list of elements
+   */
+  @NotNull
+  protected static <T extends PyElement> Collection<T> fetchElements(@NotNull final Collection<PyMemberInfo<T>> memberInfos) {
+    return Collections2.transform(memberInfos, new PyMemberExtractor<T>());
+  }
+
+  private static class PyMemberExtractor<T extends PyElement> implements Function<PyMemberInfo<T>, T> {
+    @SuppressWarnings("NullableProblems") //IDEA-120100
+    @Override
+    public T apply(@NotNull final PyMemberInfo<T> input) {
+      return input.getMember();
+    }
+  }
+
+  private static class NamelessFilter<T extends PyElement & PsiNamedElement> extends NotNullPredicate<T> {
+    @Override
+    public boolean applyNotNull(@NotNull final T input) {
+      return input.getName() != null;
+    }
+  }
+
+  private static class FindByElement extends NotNullPredicate<PyMemberInfo<PyElement>> {
+    private final PyElement myPyElement;
+
+    private FindByElement(final PyElement pyElement) {
+      myPyElement = pyElement;
+    }
+
+    @Override
+    public boolean applyNotNull(@NotNull final PyMemberInfo<PyElement> input) {
+      return input.getMember().equals(myPyElement);
+    }
+  }
+}
+
+
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java
new file mode 100644
index 0000000..264261e
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java
@@ -0,0 +1,230 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+import com.intellij.openapi.util.Pair;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.codeInsight.imports.AddImportHelper;
+import com.jetbrains.python.psi.*;
+import com.jetbrains.python.psi.impl.PyFunctionBuilder;
+import com.jetbrains.python.psi.types.PyClassLikeType;
+import com.jetbrains.python.psi.types.TypeEvalContext;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.*;
+
+/**
+ * Plugin that moves class methods
+ *
+ * @author Ilya.Kazakevich
+ */
+class MethodsManager extends MembersManager<PyFunction> {
+  private static final String ABC_META_CLASS = "ABCMeta";
+
+  /**
+   * Some decorators should be copied with methods if method is marked abstract. Here is list.
+   */
+  private static final String[] DECORATORS_MAY_BE_COPIED_TO_ABSTRACT =
+    {PyNames.PROPERTY, PyNames.CLASSMETHOD, PyNames.STATICMETHOD};
+
+  public static final String ABC_META_PACKAGE = "abc";
+
+  MethodsManager() {
+    super(PyFunction.class);
+  }
+
+  @NotNull
+  @Override
+  protected List<PyElement> getMembersCouldBeMoved(@NotNull final PyClass pyClass) {
+    return Lists.<PyElement>newArrayList(filterNameless(Arrays.asList(pyClass.getMethods())));
+  }
+
+  @Override
+  protected Collection<PyElement> moveMembers(@NotNull final PyClass from,
+                                              @NotNull final Collection<PyMemberInfo<PyFunction>> members,
+                                              @NotNull final PyClass... to) {
+    final Collection<PyFunction> methodsToMove = fetchElements(Collections2.filter(members, new AbstractFilter(false)));
+    final Collection<PyFunction> methodsToAbstract = fetchElements(Collections2.filter(members, new AbstractFilter(true)));
+
+    makeMethodsAbstract(methodsToAbstract, to);
+    return moveMethods(from, methodsToMove, to);
+  }
+
+  /**
+   * Creates abstract version of each method in each class (does not touch method itself as opposite to {@link #moveMethods(com.jetbrains.python.psi.PyClass, java.util.Collection, com.jetbrains.python.psi.PyClass...)})
+   *
+   * @param currentFunctions functions to make them abstract
+   * @param to               classes where abstract method should be created
+   */
+  private static void makeMethodsAbstract(final Collection<PyFunction> currentFunctions, final PyClass... to) {
+    final Set<PsiFile> filesToCheckImport = new HashSet<PsiFile>();
+    final Set<PyClass> classesToAddMetaAbc = new HashSet<PyClass>();
+
+    for (final PyFunction function : currentFunctions) {
+      for (final PyClass destClass : to) {
+        final PyFunctionBuilder functionBuilder = PyFunctionBuilder.copySignature(function, DECORATORS_MAY_BE_COPIED_TO_ABSTRACT);
+        functionBuilder.decorate(PyNames.ABSTRACTMETHOD);
+        final LanguageLevel level = LanguageLevel.forElement(destClass);
+        PyClassRefactoringUtil.addMethods(destClass, functionBuilder.buildFunction(destClass.getProject(), level));
+        classesToAddMetaAbc.add(destClass);
+      }
+    }
+
+    // Add ABCMeta to new classes if needed
+    for (final PyClass aClass : classesToAddMetaAbc) {
+      if (addMetaAbcIfNeeded(aClass)) {
+        filesToCheckImport.add(aClass.getContainingFile());
+      }
+    }
+
+    // Add imports for ABC if needed
+    for (final PsiFile file : filesToCheckImport) {
+      addImportFromAbc(file, PyNames.ABSTRACTMETHOD);
+      addImportFromAbc(file, ABC_META_CLASS);
+      PyClassRefactoringUtil.optimizeImports(file); //To remove redundant imports
+    }
+  }
+
+  /**
+   * Adds metaclass = ABCMeta for class if has no.
+   *
+   * @param aClass class where it should be added
+   * @return true if added. False if class already has metaclass so we did not touch it.
+   */
+  // TODO: Copy/Paste with PyClass.getMeta..
+  private static boolean addMetaAbcIfNeeded(@NotNull final PyClass aClass) {
+    final PsiFile file = aClass.getContainingFile();
+    final PyClassLikeType type = aClass.getMetaClassType(TypeEvalContext.userInitiated(file));
+    if (type != null) {
+      return false; //User already has metaclass. He probably knows about metaclasses, so we should not add ABCMeta
+    }
+    final LanguageLevel languageLevel = LanguageLevel.forElement(aClass);
+    if (languageLevel.isPy3K()) { //TODO: Copy/paste, use strategy because we already has the same check in #couldBeAbstract
+      // Add (metaclass= for Py3K
+      PyClassRefactoringUtil
+        .addSuperClassExpressions(aClass.getProject(), aClass, null, Collections.singletonList(Pair.create(PyNames.METACLASS,
+                                                                                                           ABC_META_CLASS)));
+    }
+    else {
+      // Add __metaclass__ for Py2
+      PyClassRefactoringUtil.addClassAttributeIfNotExist(aClass, PyNames.DUNDER_METACLASS, ABC_META_CLASS);
+    }
+    return true;
+  }
+
+  /**
+   * Adds import from ABC module
+   *
+   * @param file         where to add import
+   * @param nameToImport what to import
+   */
+  private static void addImportFromAbc(@NotNull final PsiFile file, @NotNull final String nameToImport) {
+    AddImportHelper.addImportFromStatement(file, ABC_META_PACKAGE, nameToImport, null,
+                                           AddImportHelper.ImportPriority.BUILTIN);
+  }
+
+  /**
+   * Moves methods (as opposite to {@link #makeMethodsAbstract(java.util.Collection, com.jetbrains.python.psi.PyClass...)})
+   *
+   * @param from          source
+   * @param methodsToMove what to move
+   * @param to            where
+   * @return newly added methods
+   */
+  private static List<PyElement> moveMethods(final PyClass from, final Collection<PyFunction> methodsToMove, final PyClass... to) {
+    final List<PyElement> result = new ArrayList<PyElement>();
+    for (final PyClass destClass : to) {
+      //We move copies here because there may be several destinations
+      final List<PyFunction> copies = new ArrayList<PyFunction>(methodsToMove.size());
+      for (final PyFunction element : methodsToMove) {
+        final PyFunction newMethod = (PyFunction)element.copy();
+        copies.add(newMethod);
+      }
+
+      result.addAll(PyClassRefactoringUtil.copyMethods(copies, destClass));
+    }
+    deleteElements(methodsToMove);
+
+    PyClassRefactoringUtil.insertPassIfNeeded(from);
+    return result;
+  }
+
+  @NotNull
+  @Override
+  public PyMemberInfo<PyFunction> apply(@NotNull final PyFunction pyFunction) {
+    final PyUtil.MethodFlags flags = PyUtil.MethodFlags.of(pyFunction);
+    assert flags != null : "No flags return while element is function " + pyFunction;
+    final boolean isStatic = flags.isStaticMethod() || flags.isClassMethod();
+    return new PyMemberInfo<PyFunction>(pyFunction, isStatic, buildDisplayMethodName(pyFunction), isOverrides(pyFunction), this,
+                                        couldBeAbstract(pyFunction));
+  }
+
+  /**
+   * @return if method could be made abstract? (that means "create abstract version if method in parent class")
+   */
+  private static boolean couldBeAbstract(@NotNull final PyFunction function) {
+    if (PyUtil.isInit(function)) {
+      return false; // Who wants to make __init__ abstract?!
+    }
+    final PyUtil.MethodFlags flags = PyUtil.MethodFlags.of(function);
+    assert flags != null : "Function should be called on method!";
+
+    final boolean py3K = LanguageLevel.forElement(function).isPy3K();
+
+    //TODO: use strategy because we already has the same check in #addMetaAbcIfNeeded
+    return flags.isInstanceMethod() || py3K; //Any method could be made abstract in py3
+  }
+
+
+  @Nullable
+  private static Boolean isOverrides(final PyFunction pyFunction) {
+    final PyClass clazz = PyUtil.getContainingClassOrSelf(pyFunction);
+    assert clazz != null : "Refactoring called on function, not method: " + pyFunction;
+    for (final PyClass parentClass : clazz.getSuperClasses()) {
+      final PyFunction parentMethod = parentClass.findMethodByName(pyFunction.getName(), true);
+      if (parentMethod != null) {
+        return true;
+      }
+    }
+    return null;
+  }
+
+  @NotNull
+  private static String buildDisplayMethodName(@NotNull final PyFunction pyFunction) {
+    final StringBuilder builder = new StringBuilder(pyFunction.getName());
+    builder.append('(');
+    final PyParameter[] arguments = pyFunction.getParameterList().getParameters();
+    for (final PyParameter parameter : arguments) {
+      builder.append(parameter.getName());
+      if (arguments.length > 1 && parameter != arguments[arguments.length - 1]) {
+        builder.append(", ");
+      }
+    }
+    builder.append(')');
+    return builder.toString();
+  }
+
+
+  /**
+   * Filters member infos to find if they should be abstracted
+   */
+  private static class AbstractFilter extends NotNullPredicate<PyMemberInfo<PyFunction>> {
+    private final boolean myAllowAbstractOnly;
+
+    /**
+     * @param allowAbstractOnly returns only methods to be abstracted. Returns only methods to be moved otherwise.
+     */
+    private AbstractFilter(final boolean allowAbstractOnly) {
+      myAllowAbstractOnly = allowAbstractOnly;
+    }
+
+    @Override
+    protected boolean applyNotNull(@NotNull final PyMemberInfo<PyFunction> input) {
+      return input.isToAbstract() == myAllowAbstractOnly;
+    }
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMemberInfo.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMemberInfo.java
new file mode 100644
index 0000000..650350b
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMemberInfo.java
@@ -0,0 +1,75 @@
+/*
+ * 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.jetbrains.python.refactoring.classes.membersManager;
+
+import com.intellij.refactoring.classMembers.MemberInfoBase;
+import com.jetbrains.python.psi.PyElement;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author Dennis.Ushakov
+ */
+public class PyMemberInfo<T extends PyElement> extends MemberInfoBase<T> {
+  @NotNull
+  private final MembersManager<T> myMembersManager;
+  private final boolean myCouldBeAbstract;
+
+  /**
+   * TODO: Doc new param
+   * @param member         element itself
+   * @param isStatic       is it static or not?
+   * @param displayName    element display name
+   * @param overrides      does it overrides something? TRUE if is overriden, FALSE if implemented, null if not implemented or overriden
+   *                       TODO: use primitive instead? "Implemeneted" has nothing to do with python duck-typing
+   * @param membersManager manager that knows how to handle this member
+   */
+  PyMemberInfo(@NotNull final T member,
+               final boolean isStatic,
+               @NotNull final String displayName,
+               @Nullable final Boolean overrides,
+               @NotNull final MembersManager<T> membersManager,
+               final boolean couldBeAbstract) {
+    super(member);
+    this.isStatic = isStatic;
+    this.displayName = displayName;
+    this.overrides = overrides;
+    myMembersManager = membersManager;
+    myCouldBeAbstract = couldBeAbstract;
+  }
+
+  @NotNull
+  MembersManager<T> getMembersManager() {
+    return myMembersManager;
+  }
+
+  public boolean isCouldBeAbstract() {
+    return myCouldBeAbstract;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof PyMemberInfo) {
+      return getMember().equals(((PyMemberInfo<?>)obj).getMember());
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return getMember().hashCode();
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMembersRefactoringBaseProcessor.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMembersRefactoringBaseProcessor.java
new file mode 100644
index 0000000..983deb6
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMembersRefactoringBaseProcessor.java
@@ -0,0 +1,86 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.usageView.UsageInfo;
+import com.intellij.usageView.UsageViewDescriptor;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Processor for member-based refactorings. It moves members from one place to another using {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager}.
+ * Inheritors only need to implement {@link com.intellij.usageView.UsageViewDescriptor} methods (while this interface is also implemented by this class)
+ *
+ * @author Ilya.Kazakevich
+ */
+public abstract class PyMembersRefactoringBaseProcessor extends BaseRefactoringProcessor implements UsageViewDescriptor {
+
+  @NotNull
+  protected final Collection<PyMemberInfo<PyElement>> myMembersToMove;
+  @NotNull
+  protected final PyClass myFrom;
+  @NotNull
+  private final PyClass[] myTo;
+
+  /**
+   * @param membersToMove what to move
+   * @param from          source
+   * @param to            where to move
+   */
+  protected PyMembersRefactoringBaseProcessor(
+    @NotNull final Project project,
+    @NotNull final Collection<PyMemberInfo<PyElement>> membersToMove,
+    @NotNull final PyClass from,
+    @NotNull final PyClass... to) {
+    super(project);
+    myFrom = from;
+    myMembersToMove = new ArrayList<PyMemberInfo<PyElement>>(membersToMove);
+    myTo = to.clone();
+  }
+
+  @NotNull
+  @Override
+  protected UsageViewDescriptor createUsageViewDescriptor(final UsageInfo[] usages) {
+    return this;
+  }
+
+  @NotNull
+  @Override
+  public PsiElement[] getElements() {
+    return myTo.clone();
+  }
+
+  /**
+   * @return destinations (so user would be able to choose if she wants to move member to certain place or not)
+   */
+  @NotNull
+  @Override
+  protected final PyUsageInfo[] findUsages() {
+    final List<PyUsageInfo> result = new ArrayList<PyUsageInfo>(myTo.length);
+    for (final PyClass pyDestinationClass : myTo) {
+      result.add(new PyUsageInfo(pyDestinationClass));
+    }
+    return result.toArray(new PyUsageInfo[result.size()]);
+  }
+
+  @Override
+  protected final void performRefactoring(final UsageInfo[] usages) {
+    final Collection<PyClass> destinations = new ArrayList<PyClass>(usages.length);
+    for (final UsageInfo usage : usages) {
+      if (!(usage instanceof PyUsageInfo)) {
+        throw new IllegalArgumentException("Only PyUsageInfo is accepted here");
+      }
+      //We collect destination info to pass it to members manager
+      destinations.add(((PyUsageInfo)usage).getTo());
+    }
+    MembersManager.moveAllMembers(myMembersToMove, myFrom, destinations.toArray(new PyClass[destinations.size()]));
+    PyClassRefactoringUtil.optimizeImports(myFrom.getContainingFile()); // To remove unneeded imports
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyUsageInfo.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyUsageInfo.java
new file mode 100644
index 0000000..c8e1f1f
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyUsageInfo.java
@@ -0,0 +1,26 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.intellij.usageView.UsageInfo;
+import com.jetbrains.python.psi.PyClass;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * TODO: Make it generic to allow to reuse in another projects?
+ * Usage info that displays destination (where should member be moved)
+ *
+ * @author Ilya.Kazakevich
+ */
+class PyUsageInfo extends UsageInfo {
+  @NotNull
+  private final PyClass myTo;
+
+  PyUsageInfo(@NotNull final PyClass to) {
+    super(to, true); //TODO: Make super generic and get rid of field?
+    myTo = to;
+  }
+
+  @NotNull
+  public PyClass getTo() {
+    return myTo;
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java
new file mode 100644
index 0000000..82ce209
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java
@@ -0,0 +1,76 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+import com.intellij.refactoring.RefactoringBundle;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.psi.*;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Plugin that moves superclasses from one class to another
+ *
+ * @author Ilya.Kazakevich
+ */
+class SuperClassesManager extends MembersManager<PyClass> {
+
+  private static final NoFakeSuperClasses NO_FAKE_SUPER_CLASSES = new NoFakeSuperClasses();
+
+  SuperClassesManager() {
+    super(PyClass.class);
+  }
+
+
+  @NotNull
+  @Override
+  protected List<PyElement> getMembersCouldBeMoved(@NotNull final PyClass pyClass) {
+    return Lists.<PyElement>newArrayList(Collections2.filter(Arrays.asList(pyClass.getSuperClasses()), NO_FAKE_SUPER_CLASSES));
+  }
+
+  @Override
+  protected Collection<PyElement> moveMembers(@NotNull final PyClass from,
+                                              @NotNull final Collection<PyMemberInfo<PyClass>> members,
+                                              @NotNull final PyClass... to) {
+    final Collection<PyClass> elements = fetchElements(members);
+    for (final PyClass destClass : to) {
+      PyClassRefactoringUtil.addSuperclasses(from.getProject(), destClass, elements.toArray(new PyClass[members.size()]));
+    }
+
+    for (final PyExpression expression : from.getSuperClassExpressions()) {
+      // Remove all superclass expressions that point to class from memberinfo
+      if (!(expression instanceof PyQualifiedExpression)) {
+        continue;
+      }
+      final PyReferenceExpression reference = (PyReferenceExpression)expression;
+      for (final PyClass element : elements) {
+        if (reference.getReference().isReferenceTo(element)) {
+          expression.delete();
+        }
+      }
+    }
+    return Collections.emptyList(); //Hack: we know that "superclass expression" can't have reference
+  }
+
+  @NotNull
+  @Override
+  public PyMemberInfo<PyClass> apply(@NotNull final PyClass input) {
+    final String name = RefactoringBundle.message("member.info.extends.0", PyClassCellRenderer.getClassText(input));
+    //TODO: Check for "overrides"
+    return new PyMemberInfo<PyClass>(input, false, name, false, this, false);
+  }
+
+  private static class NoFakeSuperClasses extends NotNullPredicate<PyClass> {
+    @Override
+    protected boolean applyNotNull(@NotNull final PyClass input) {
+      return !PyNames.FAKE_OLD_BASE.equals(input.getName());
+    }
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/TypeSafeMovingStrategy.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/TypeSafeMovingStrategy.java
new file mode 100644
index 0000000..2cf9efd
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/TypeSafeMovingStrategy.java
@@ -0,0 +1,70 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Moves members checking types at runtime.
+ *
+ * @author Ilya.Kazakevich
+ */
+class TypeSafeMovingStrategy<T extends PyElement> {
+  @NotNull private final PyClass myFrom;
+  @NotNull private final MembersManager<T> myManager;
+  @NotNull private final Collection<PyMemberInfo<T>> myMemberInfoCollection;
+  @NotNull private final PyClass[] myTo;
+
+  /**
+   * Move members.
+   * @param from source
+   * @param manager manager to be used
+   * @param memberInfoCollection what to move
+   * @param to where
+   */
+  @SuppressWarnings({"unchecked", "rawtypes"}) //We check types at runtime
+  static void moveCheckingTypesAtRunTime(@NotNull final PyClass from,
+                   @NotNull final MembersManager<?> manager,
+                   @NotNull final Collection<PyMemberInfo<PyElement>> memberInfoCollection,
+                   @NotNull final PyClass... to) {
+    manager.checkElementTypes((Collection)MembersManager.fetchElements(memberInfoCollection));
+    new TypeSafeMovingStrategy(from, manager, memberInfoCollection, to).moveTyped();
+  }
+
+  private TypeSafeMovingStrategy(@NotNull final PyClass from,
+                                 @NotNull final MembersManager<T> manager,
+                                 @NotNull final Collection<PyMemberInfo<T>> memberInfoCollection,
+                                 @NotNull final PyClass[] to) {
+    myFrom = from;
+    myManager = manager;
+    myMemberInfoCollection = new ArrayList<PyMemberInfo<T>>(memberInfoCollection);
+    myTo = to.clone();
+  }
+
+
+  /**
+   * While types are already checked at runtime, this method could move everything in type-safe manner.
+   */
+  private void moveTyped() {
+    final Collection<T> elementsCollection = MembersManager.fetchElements(myMemberInfoCollection);
+    final Collection<? extends PyElement> references = myManager.getElementsToStoreReferences(elementsCollection);
+
+    // Store references to add required imports
+    for (final PyElement element : references) {
+      PyClassRefactoringUtil.rememberNamedReferences(element, PyNames.CANONICAL_SELF); //"self" is not reference we need to move
+    }
+
+    // Move
+    final Collection<PyElement> newElements = myManager.moveMembers(myFrom, myMemberInfoCollection, myTo);
+
+    // Restore references to add appropriate imports
+    for (final PyElement element : newElements) {
+      PyClassRefactoringUtil.restoreNamedReferences(element);
+    }
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/package-info.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/package-info.java
new file mode 100644
index 0000000..9fb380a
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/package-info.java
@@ -0,0 +1,12 @@
+/**
+ * Incapsulates knowledge about class members that could be moved to some other class.
+ * To use (get list of members to move or actually move them) use {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager#getAllMembersCouldBeMoved(com.jetbrains.python.psi.PyClass)}
+ * and                                                            {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager#moveAllMembers(java.util.Collection, com.jetbrains.python.psi.PyClass, com.jetbrains.python.psi.PyClass)}
+ *
+ * This class delegates its behaviour to its managers (some kind of plugins). There is one for each member type (one for method, one for field etc).
+ * You need to extend {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager} to add some. See its javadoc for more info.
+ *
+ *
+ * @author Ilya.Kazakevich
+ */
+package com.jetbrains.python.refactoring.classes.membersManager;
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/BadDataException.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/BadDataException.java
new file mode 100644
index 0000000..684576d
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/BadDataException.java
@@ -0,0 +1,18 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * To be thrown when {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedViewSwingImpl} or its children
+ * assumes that data entered by user in {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView} is invalid.
+ * See {@link MembersBasedPresenterImpl#validateView()} for info why exception user
+ * @author Ilya.Kazakevich
+ */
+public class BadDataException extends Exception {
+  /**
+   * @param message what exactly is wrong with data
+   */
+  public BadDataException(@NotNull final String message) {
+    super(message);
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenter.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenter.java
new file mode 100644
index 0000000..f57f280
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenter.java
@@ -0,0 +1,21 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.jetbrains.python.vp.Presenter;
+
+/**
+ * Presenter for dialogs that display members
+ *
+ * @author Ilya.Kazakevich
+ */
+public interface MembersBasedPresenter extends Presenter {
+  /**
+   * User clicked on "ok" button
+   */
+  void okClicked();
+
+  /**
+   * @return true if dialog button "preview" should be displayed.
+   * Preview uses {@link com.jetbrains.python.refactoring.classes.membersManager.PyMembersRefactoringBaseProcessor}
+   */
+  boolean showPreview();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterImpl.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterImpl.java
new file mode 100644
index 0000000..118b3d6
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterImpl.java
@@ -0,0 +1,83 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.RefactoringBundle;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * All presenters that use members inherits this class.
+ * <strong>Warning</strong>: Do not inherit it directly.
+ * Check {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenterNoPreviewImpl}
+ * or {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenterWithPreviewImpl} instead
+ *
+ * @param <T> view for that presenter
+ * @author Ilya.Kazakevich
+ */
+abstract class MembersBasedPresenterImpl<T extends MembersBasedView<?>> implements MembersBasedPresenter {
+  @NotNull
+  protected final T myView;
+  @NotNull
+  protected final PyClass myClassUnderRefactoring;
+  @NotNull
+  protected final PyMemberInfoStorage myStorage;
+
+  /**
+   * @param view                  View for presenter
+   * @param classUnderRefactoring class to be refactored
+   * @param infoStorage           info storage
+   */
+  MembersBasedPresenterImpl(@NotNull final T view,
+                            @NotNull final PyClass classUnderRefactoring,
+                            @NotNull final PyMemberInfoStorage infoStorage) {
+    myView = view;
+    myClassUnderRefactoring = classUnderRefactoring;
+    myStorage = infoStorage;
+  }
+
+  //TODO: Mark Async ?
+  @Override
+  public void okClicked() {
+
+    final MultiMap<PsiElement, String> conflicts = getConflicts();
+    if (conflicts.isEmpty() || myView.showConflictsDialog(conflicts)) {
+      try {
+        validateView();
+        doRefactor();
+      }
+      catch (final BadDataException e) {
+        myView.showError(e.getMessage()); //Show error message if presenter says view in invalid
+      }
+    }
+  }
+
+  /**
+   * Validates view (used by presenter to check if view is valid).
+   * When overwrite, <strong>always</strong> call "super" <strong>first</strong>!
+   * Throw {@link com.jetbrains.python.refactoring.classes.membersManager.vp.BadDataException} in case of error.
+   * Do nothing, otherwise.
+   * Method is designed to be overwritten and exception is used to simplify this process: children do not need parent's result.
+   * They just call super.
+   *
+   * @throws BadDataException
+   */
+  protected void validateView() throws BadDataException {
+    if (myView.getSelectedMemberInfos().isEmpty()) {
+      throw new BadDataException(RefactoringBundle.message("no.members.selected"));
+    }
+  }
+
+  /**
+   * Does refactoring itself
+   */
+  abstract void doRefactor();
+
+  /**
+   * @return map of conflicts (if any)
+   */
+  @NotNull
+  protected abstract MultiMap<PsiElement, String> getConflicts();
+
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterNoPreviewImpl.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterNoPreviewImpl.java
new file mode 100644
index 0000000..199ac7a
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterNoPreviewImpl.java
@@ -0,0 +1,60 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.command.CommandProcessor;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Presenter that has not preview. Children should implement {@link #refactorNoPreview()}.
+ * To "preview" button would be displayed
+ * @param <T> view for this presenter
+ * @author Ilya.Kazakevich
+ */
+
+public abstract class MembersBasedPresenterNoPreviewImpl<T extends MembersBasedView<?>> extends MembersBasedPresenterImpl<T> {
+  /**
+   *
+   * @param view view for this presenter
+   * @param classUnderRefactoring class to refactor
+   * @param infoStorage info storage
+   */
+  protected MembersBasedPresenterNoPreviewImpl(@NotNull final T view,
+                                               @NotNull final PyClass classUnderRefactoring,
+                                               @NotNull final PyMemberInfoStorage infoStorage) {
+    super(view, classUnderRefactoring, infoStorage);
+  }
+
+  @Override
+  public boolean showPreview() {
+    return false;
+  }
+
+  @Override
+  void doRefactor() {
+    CommandProcessor.getInstance().executeCommand(myClassUnderRefactoring.getProject(), new Runnable() {
+      @Override
+      public void run() {
+        ApplicationManager.getApplication().runWriteAction(new Runnable() {
+          @Override
+          public void run() {
+            refactorNoPreview();
+          }
+        });
+      }
+    }, getCommandName(), null);
+    myView.close();
+  }
+
+  /**
+   * @return Command name for this preview
+   */
+  @NotNull
+  protected abstract String getCommandName();
+
+  /**
+   * Do refactor with out of preview. Implement this method to do refactoring.
+   */
+  protected abstract void refactorNoPreview();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterWithPreviewImpl.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterWithPreviewImpl.java
new file mode 100644
index 0000000..ab68548
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterWithPreviewImpl.java
@@ -0,0 +1,45 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Does refactoring with preview (based on {@link com.intellij.refactoring.BaseRefactoringProcessor}).
+ * Child must implement {@link #createProcessor()} and return appropriate processor.
+ * "Preview" button would be displayed.
+ *
+ * @param <T> view for this presenter
+ * @author Ilya.Kazakevich
+ */
+public abstract class MembersBasedPresenterWithPreviewImpl<T extends MembersBasedView<?>> extends MembersBasedPresenterImpl<T> {
+
+
+  /**
+   * @param view                  view for this presenter
+   * @param classUnderRefactoring class to refactor
+   * @param infoStorage           info storage
+   */
+  protected MembersBasedPresenterWithPreviewImpl(@NotNull final T view,
+                                                 @NotNull final PyClass classUnderRefactoring,
+                                                 @NotNull final PyMemberInfoStorage infoStorage) {
+    super(view, classUnderRefactoring, infoStorage);
+  }
+
+  @Override
+  public boolean showPreview() {
+    return true;
+  }
+
+  @Override
+  protected void doRefactor() {
+    myView.invokeRefactoring(createProcessor());
+  }
+
+  /**
+   * @return processor for refactoring
+   */
+  @NotNull
+  public abstract BaseRefactoringProcessor createProcessor();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedView.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedView.java
new file mode 100644
index 0000000..70496d0
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedView.java
@@ -0,0 +1,69 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+
+/**
+ * View to display dialog with members.
+ * First, configure it with {@link #configure(MembersViewInitializationInfo)}.
+ * Then, display with {@link #initAndShow()}
+ *
+ * @param <C> initialization info for this view. See {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo}
+ *            for more info
+ * @author Ilya.Kazakevich
+ */
+public interface MembersBasedView<C extends MembersViewInitializationInfo> {
+  /**
+   * Display conflict dialogs.
+   *
+   * @param conflicts conflicts.
+   * @return true if user's choice is "continue". False if "cancel"
+   */
+  boolean showConflictsDialog(@NotNull MultiMap<PsiElement, String> conflicts);
+
+  /**
+   * Displays error message
+   *
+   * @param message message to display
+   */
+  void showError(@NotNull String message);
+
+  /**
+   * Configures view and <strong>must</strong> be called once, before {@link #initAndShow()}
+   * It accepts configuration info class
+   * Children may rewrite method to do additional configuration, but they should <strong>always</strong> call "super" first!
+   *
+   * @param configInfo configuration info
+   */
+  void configure(@NotNull C configInfo);
+
+  /**
+   * @return collection of member infos user selected
+   */
+  @NotNull
+  Collection<PyMemberInfo<PyElement>> getSelectedMemberInfos();
+
+  /**
+   * Runs refactoring based on {@link com.intellij.refactoring.BaseRefactoringProcessor}.
+   * It may display "preview" first.
+   *
+   * @param processor refactoring processor
+   */
+  void invokeRefactoring(@NotNull BaseRefactoringProcessor processor);
+
+  /**
+   * Displays dialog. Be sure to run {@link #configure(MembersViewInitializationInfo)} first
+   */
+  void initAndShow();
+
+  /**
+   * Closes dialog
+   */
+  void close();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedViewSwingImpl.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedViewSwingImpl.java
new file mode 100644
index 0000000..1fc5e53
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedViewSwingImpl.java
@@ -0,0 +1,138 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.google.common.base.Preconditions;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.refactoring.ui.ConflictsDialog;
+import com.intellij.refactoring.ui.RefactoringDialog;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.ui.PyMemberSelectionPanel;
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.Collection;
+
+/**
+ * {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView} implementation on swing.
+ * Consists of {@link #myTopPanel} and {@link #myCenterPanel}. Children must fill them in constructor.
+ * Presenter is stored in {@link #myPresenter}.
+ * Panel with members in {@link #myPyMemberSelectionPanel}
+ *
+ * @param <P> View presenter class
+ * @param <C> View configuration class
+ */
+public abstract class MembersBasedViewSwingImpl<P extends MembersBasedPresenter, C extends MembersViewInitializationInfo>
+  extends RefactoringDialog implements MembersBasedView<C> {
+
+  /**
+   * Panel to be displayed on the top
+   */
+  @NotNull
+  protected final JPanel myTopPanel;
+  /**
+   * Panel to be displayed at the center
+   */
+  @NotNull
+  protected final JComponent myCenterPanel;
+
+  /**
+   * Presenter
+   */
+  @NotNull
+  protected final P myPresenter;
+
+  /**
+   * Panel with members
+   */
+  @NotNull
+  protected final PyMemberSelectionPanel myPyMemberSelectionPanel;
+
+  private boolean myConfigured;
+
+
+  /**
+   *
+   * @param project         project this view runs
+   * @param presenter       view's presenter
+   * @param title           window title
+   * @param supportAbstract supports "abstract" column?
+   */
+  protected MembersBasedViewSwingImpl(@NotNull final Project project, @NotNull final P presenter, @NotNull final String title,
+                                      final boolean supportAbstract) {
+    super(project, true);
+    myTopPanel = new JPanel(new BorderLayout());
+    myCenterPanel = new JPanel(new BorderLayout());
+    myPresenter = presenter;
+    myPyMemberSelectionPanel = new PyMemberSelectionPanel(title, supportAbstract);
+    //TODO: Take this from presenter to prevent inconsistence: now it is possible to create view that supports abstract backed by presenter that does not. And vice versa.
+  }
+
+  @Override
+  public boolean showConflictsDialog(@NotNull final MultiMap<PsiElement, String> conflicts) {
+    Preconditions.checkArgument(!conflicts.isEmpty(), "Can't show dialog for empty conflicts");
+    final ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts);
+    conflictsDialog.show();
+    return conflictsDialog.isOK();
+  }
+
+  @Override
+  public void showError(@NotNull final String message) {
+    Messages.showErrorDialog(getContentPane(), message);
+  }
+
+  @Override
+  protected boolean hasPreviewButton() {
+    return myPresenter.showPreview();
+  }
+
+  @Override
+  protected void doAction() {
+    myPresenter.okClicked();
+  }
+
+  @NotNull
+  @Override
+  protected JComponent createNorthPanel() {
+    return myTopPanel;
+  }
+
+  @Override
+  public void close() {
+    close(OK_EXIT_CODE);
+  }
+
+  @Override
+  protected JComponent createCenterPanel() {
+    return myCenterPanel;
+  }
+
+  @NotNull
+  @Override
+  public Collection<PyMemberInfo<PyElement>> getSelectedMemberInfos() {
+    return myPyMemberSelectionPanel.getSelectedMemberInfos();
+  }
+
+  @Override
+  public void invokeRefactoring(@NotNull final BaseRefactoringProcessor processor) {
+    super.invokeRefactoring(processor);
+  }
+
+  @Override
+  public void configure(@NotNull final C configInfo) {
+    Preconditions.checkArgument(!myConfigured, "Already configured");
+    myConfigured = true;
+    myPyMemberSelectionPanel.init(configInfo.getMemberInfoModel(), configInfo.getMemberInfos());
+  }
+
+  @Override
+  public void initAndShow() {
+    Preconditions.checkArgument(myConfigured, "Not configured, run 'configure' first!");
+    init();
+    show();
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersViewInitializationInfo.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersViewInitializationInfo.java
new file mode 100644
index 0000000..7803105
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersViewInitializationInfo.java
@@ -0,0 +1,49 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Configuration for {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView}
+ *
+ * @author Ilya.Kazakevich
+ */
+public class MembersViewInitializationInfo {
+
+  @NotNull
+  private final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> myMemberInfoModel;
+  @NotNull
+  private final Collection<PyMemberInfo<PyElement>> myMemberInfos;
+
+  /**
+   * @param memberInfoModel model to be used in members panel
+   * @param memberInfos     members to displau
+   */
+  public MembersViewInitializationInfo(@NotNull final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> memberInfoModel,
+                                       @NotNull final Collection<PyMemberInfo<PyElement>> memberInfos) {
+    myMemberInfos = new ArrayList<PyMemberInfo<PyElement>>(memberInfos);
+    myMemberInfoModel = memberInfoModel;
+  }
+
+  /**
+   * @return model to be used in members panel
+   */
+  @NotNull
+  public MemberInfoModel<PyElement, PyMemberInfo<PyElement>> getMemberInfoModel() {
+    return myMemberInfoModel;
+  }
+
+  /**
+   * @return members to display
+   */
+  @NotNull
+  public Collection<PyMemberInfo<PyElement>> getMemberInfos() {
+    return Collections.unmodifiableCollection(myMemberInfos);
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/package-info.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/package-info.java
new file mode 100644
index 0000000..f714797
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/package-info.java
@@ -0,0 +1,6 @@
+/**
+ * MVP ({@link com.jetbrains.python.vp}) implementation for refactorings that use members ({@link com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo})
+ * and package {@link com.jetbrains.python.refactoring.classes.membersManager}
+ * @author Ilya.Kazakevich
+ */
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyAncestorsUtils.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyAncestorsUtils.java
new file mode 100644
index 0000000..05c41c4
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyAncestorsUtils.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Sets;
+import com.intellij.openapi.vfs.VfsUtilCore;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyUtil;
+import com.jetbrains.python.psi.types.TypeEvalContext;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+class PyAncestorsUtils extends NotNullPredicate<PyClass> {
+  @NotNull
+  private final Set<VirtualFile> mySourceRoots;
+
+  /**
+   * Returns list of class parents that are under user control
+   *
+   * @param pyClass class to  find parents for
+   * @return list of parents
+   */
+  @NotNull
+  static Collection<PyClass> getAncestorsUnderUserControl(@NotNull final PyClass pyClass) {
+    final List<PyClass> allAncestors = pyClass.getAncestorClasses(TypeEvalContext.userInitiated(pyClass.getContainingFile()));
+    return Collections2.filter(allAncestors, new PyAncestorsUtils(PyUtil.getSourceRoots(pyClass)));
+  }
+
+  private PyAncestorsUtils(@NotNull final Collection<VirtualFile> sourceRoots) {
+    mySourceRoots = Sets.newHashSet(sourceRoots);
+  }
+
+  @Override
+  public boolean applyNotNull(@NotNull final PyClass input) {
+    return VfsUtilCore.isUnder(input.getContainingFile().getVirtualFile(), mySourceRoots);
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PullUpConflictsUtil.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpConflictsUtil.java
similarity index 82%
rename from python/src/com/jetbrains/python/refactoring/classes/pullUp/PullUpConflictsUtil.java
rename to python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpConflictsUtil.java
index ee659c1..9c63a62 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PullUpConflictsUtil.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpConflictsUtil.java
@@ -20,23 +20,27 @@
 import com.intellij.refactoring.util.RefactoringUIUtil;
 import com.intellij.util.containers.MultiMap;
 import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
 import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.Collection;
 
 /**
  * @author Dennis.Ushakov
  */
-public class PullUpConflictsUtil {
-  private PullUpConflictsUtil() {
+final class PyPullUpConflictsUtil {
+  private PyPullUpConflictsUtil() {
   }
 
-  public static MultiMap<PsiElement, String> checkConflicts(final Collection<PyMemberInfo> infos, final PyClass superClass) {
+  @NotNull
+  static MultiMap<PsiElement, String> checkConflicts(final Collection<PyMemberInfo<PyElement>> infos, @NotNull final PyClass superClass) {
     final MultiMap<PsiElement, String> conflictsList = new MultiMap<PsiElement, String>();
-    for (PyMemberInfo info : infos) {
+    for (PyMemberInfo<PyElement> info : infos) {
       PsiElement member = info.getMember();
       boolean isConflict = false;
+      //TODO: Delegate to MemeberManagers here
       if (member instanceof PyFunction) {
         final String name = ((PyFunction)member).getName();
         if (name == null) continue;
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpDialog.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpDialog.java
deleted file mode 100644
index e9631a8..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpDialog.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.pullUp;
-
-import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.classMembers.AbstractUsesDependencyMemberInfoModel;
-import com.intellij.refactoring.classMembers.DependencyMemberInfoModel;
-import com.intellij.refactoring.ui.ConflictsDialog;
-import com.intellij.util.containers.MultiMap;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
-import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer;
-import com.jetbrains.python.refactoring.classes.ui.UpDirectedMembersMovingDialog;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.TreeSet;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPullUpDialog extends UpDirectedMembersMovingDialog {
-  private JComboBox myClassCombo;
-  private Collection<PyClass> mySuperClasses;
-  private final PyMemberInfoStorage myStorage;
-
-  public PyPullUpDialog(final Project project, final PyClass clazz, final Collection<PyClass> superClasses, final PyMemberInfoStorage storage) {
-    super(project, clazz);
-    myStorage = storage;
-    mySuperClasses = new TreeSet<PyClass>(new Comparator<PyClass>() {
-      public int compare(final PyClass o1, final PyClass o2) {
-        final String name1 = PyClassCellRenderer.getClassText(o1);
-        final String name2 = PyClassCellRenderer.getClassText(o2);
-        return name1 == null ? -1 : name1.compareTo(name2);
-      }
-    });
-    mySuperClasses = superClasses;
-    myMemberInfos = myStorage.getClassMemberInfos(myClass);
-
-    setTitle(PyPullUpHandler.REFACTORING_NAME);
-
-    init();
-  }
-
-  protected DependencyMemberInfoModel<PyElement, PyMemberInfo> createMemberInfoModel() {
-    return new MyMemberInfoModel(myClass);
-  }
-
-  protected String getHelpId() {
-    return "python.reference.pullMembersUp";
-  }
-
-  protected JComponent createNorthPanel() {
-    JPanel panel = new JPanel();
-    panel.setLayout(new GridBagLayout());
-    GridBagConstraints gbConstraints = new GridBagConstraints();
-
-    gbConstraints.insets = new Insets(4, 8, 4, 8);
-    gbConstraints.weighty = 1;
-    gbConstraints.weightx = 1;
-    gbConstraints.gridy = 0;
-    gbConstraints.gridwidth = GridBagConstraints.REMAINDER;
-    gbConstraints.fill = GridBagConstraints.BOTH;
-    gbConstraints.anchor = GridBagConstraints.WEST;
-    final JLabel classComboLabel = new JLabel();
-    panel.add(classComboLabel, gbConstraints);
-
-    myClassCombo = new JComboBox(mySuperClasses.toArray());
-    myClassCombo.setRenderer(new PyClassCellRenderer());
-    final String fqn = PyClassCellRenderer.getClassText(myClass);
-    classComboLabel.setText(RefactoringBundle.message("pull.up.members.to", fqn));
-    classComboLabel.setLabelFor(myClassCombo);
-    myClassCombo.addItemListener(new ItemListener() {
-      public void itemStateChanged(ItemEvent e) {
-        if (e.getStateChange() == ItemEvent.SELECTED) {
-          updateMembersInfo();
-          if (myMemberSelectionPanel != null) {
-            ((MyMemberInfoModel)myMemberInfoModel).setSuperClass(getSuperClass());
-            myMemberSelectionPanel.getTable().setMemberInfos(myMemberInfos);
-            myMemberSelectionPanel.getTable().fireExternalDataChange();
-          }
-        }
-      }
-    });
-    gbConstraints.gridy++;
-    panel.add(myClassCombo, gbConstraints);
-    updateMembersInfo();
-
-    return panel;
-  }
-
-  private void updateMembersInfo() {
-    final PyClass targetClass = (PyClass)myClassCombo.getSelectedItem();
-    myMemberInfos = myStorage.getIntermediateMemberInfosList(targetClass);
-  }
-
-  @Override
-  public boolean checkConflicts() {
-    final Collection<PyMemberInfo> infos = getSelectedMemberInfos();
-    PyClass superClass = getSuperClass();
-    if (!checkWritable(superClass, infos)) return false;
-    MultiMap<PsiElement,String> conflicts = PullUpConflictsUtil.checkConflicts(infos, superClass);
-    if (!conflicts.isEmpty()) {
-      ConflictsDialog conflictsDialog = new ConflictsDialog(myClass.getProject(), conflicts);
-      conflictsDialog.show();
-      final boolean ok = conflictsDialog.isOK();
-      if (!ok && conflictsDialog.isShowConflicts()) close(CANCEL_EXIT_CODE);
-      return ok;
-    }
-    return true;
-  }
-
-  @Nullable
-  public PyClass getSuperClass() {
-    return myClassCombo != null ? (PyClass)myClassCombo.getSelectedItem() : null;
-  }
-
-  protected String getMembersBorderTitle() {
-    return RefactoringBundle.message("members.to.be.pulled.up");
-  }
-
-  private class MyMemberInfoModel extends AbstractUsesDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo> {
-    public MyMemberInfoModel(PyClass clazz) {
-      super(clazz, getSuperClass(), false);
-    }
-
-
-    public boolean isMemberEnabled(PyMemberInfo member) {
-      PyClass currentSuperClass = getSuperClass();
-      return (currentSuperClass == null ||
-             !myStorage.getDuplicatedMemberInfos(currentSuperClass).contains(member)) &&
-             member.getMember() != currentSuperClass;
-    }
-
-    public boolean isAbstractEnabled(PyMemberInfo member) {
-      return false;
-    }
-
-    public int checkForProblems(@NotNull PyMemberInfo member) {
-      return member.isChecked() ? OK : super.checkForProblems(member);
-    }
-
-    @Override
-    protected int doCheck(@NotNull PyMemberInfo memberInfo, int problem) {
-      if (problem == ERROR && memberInfo.isStatic()) {
-        return WARNING;
-      }
-      return problem;
-    }
-  }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHandler.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHandler.java
index 0e95700..6dcb3b6 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHandler.java
@@ -15,24 +15,17 @@
  */
 package com.jetbrains.python.refactoring.classes.pullUp;
 
-import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.application.ex.ApplicationManagerEx;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
 import com.intellij.refactoring.RefactoringBundle;
 import com.intellij.refactoring.util.CommonRefactoringUtil;
-import com.intellij.util.PsiNavigateUtil;
 import com.jetbrains.python.PyBundle;
 import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyUtil;
-import com.jetbrains.python.refactoring.classes.PyClassMembersRefactoringSupport;
 import com.jetbrains.python.refactoring.classes.PyClassRefactoringHandler;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
 import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
-
-import java.util.Collection;
+import com.jetbrains.python.vp.Creator;
+import com.jetbrains.python.vp.ViewPresenterUtils;
+import org.jetbrains.annotations.NotNull;
 
 /**
  * @author: Dennis.Ushakov
@@ -41,33 +34,39 @@
   public static final String REFACTORING_NAME = PyBundle.message("refactoring.pull.up.dialog.title");
 
   @Override
-  protected void doRefactor(Project project, PsiElement element1, PsiElement element2, Editor editor, PsiFile file, DataContext dataContext) {
-    CommonRefactoringUtil.checkReadOnlyStatus(project, file);
+  protected void doRefactorImpl(@NotNull final Project project,
+                                @NotNull final PyClass classUnderRefactoring,
+                                @NotNull final PyMemberInfoStorage infoStorage,
+                                @NotNull final Editor editor) {
+    //TODO: Move to vp (presenter) as well
 
-    final PyClass clazz = PyUtil.getContainingClassOrSelf(element1);
-    if (!inClass(clazz, project, editor, "refactoring.pull.up.error.cannot.perform.refactoring.not.inside.class")) return;
-
-    final PyMemberInfoStorage infoStorage = PyClassMembersRefactoringSupport.getSelectedMemberInfos(clazz, element1, element2);
-    final Collection<PyClass> classes = infoStorage.getClasses();
-    if (classes.size() == 0) {
-      assert clazz != null;
-      CommonRefactoringUtil.showErrorHint(project, editor, PyBundle.message("refactoring.pull.up.error.cannot.perform.refactoring.no.base.classes", clazz.getName()),
-                                          RefactoringBundle.message("pull.members.up.title"),
-                                          "members.pull.up");
+    if (PyAncestorsUtils.getAncestorsUnderUserControl(classUnderRefactoring).isEmpty() ||
+        infoStorage.getClassMemberInfos(classUnderRefactoring).isEmpty()) {
+      CommonRefactoringUtil.showErrorHint(project, editor, PyBundle
+                                            .message("refactoring.pull.up.error.cannot.perform.refactoring.no.base.classes",
+                                                     classUnderRefactoring.getName()), RefactoringBundle.message("pull.members.up.title"),
+                                          "members.pull.up"
+      );
       return;
     }
 
-    if (ApplicationManagerEx.getApplicationEx().isUnitTestMode()) return;
-       
-    final PyPullUpDialog dialog = new PyPullUpDialog(project, clazz, classes, infoStorage);
-    dialog.show();
-    if(dialog.isOK()) {
-      pullUpWithHelper(clazz, dialog.getSelectedMemberInfos(), dialog.getSuperClass());
-    }
-  }
 
-  private static void pullUpWithHelper(PyClass clazz, Collection<PyMemberInfo> selectedMemberInfos, PyClass superClass) {
-    PsiNavigateUtil.navigate(PyPullUpHelper.pullUp(clazz, selectedMemberInfos, superClass));
+    ViewPresenterUtils
+      .linkViewWithPresenterAndLaunch(PyPullUpPresenter.class, PyPullUpView.class, new Creator<PyPullUpView, PyPullUpPresenter>() {
+                                        @NotNull
+                                        @Override
+                                        public PyPullUpPresenter createPresenter(@NotNull final PyPullUpView view) {
+                                          return new PyPullUpPresenterImpl(view, infoStorage, classUnderRefactoring);
+                                        }
+
+                                        @NotNull
+                                        @Override
+                                        public PyPullUpView createView(@NotNull final PyPullUpPresenter presenter) {
+                                          return new PyPullUpViewSwingImpl(project, presenter, classUnderRefactoring);
+                                        }
+                                      }
+      );
+
   }
 
   @Override
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHelper.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHelper.java
deleted file mode 100644
index 0046ba2..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHelper.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.pullUp;
-
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.command.CommandProcessor;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.psi.PsiNamedElement;
-import com.intellij.refactoring.RefactoringBundle;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-
-import java.util.*;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPullUpHelper {
-  private static final Logger LOG = Logger.getInstance(PyPullUpHelper.class.getName());
-  private PyPullUpHelper() {}
-
-  public static PyElement pullUp(final PyClass clazz, final Collection<PyMemberInfo> selectedMemberInfos, final PyClass superClass) {
-    final Set<String> superClasses = new HashSet<String>();
-    final Set<PsiNamedElement> extractedClasses = new HashSet<PsiNamedElement>();
-    final List<PyFunction> methods = new ArrayList<PyFunction>();
-    for (PyMemberInfo member : selectedMemberInfos) {
-      final PyElement element = member.getMember();
-      if (element instanceof PyFunction) methods.add((PyFunction)element);
-      else if (element instanceof PyClass) {
-        superClasses.add(element.getName());
-        extractedClasses.add((PyClass)element);
-      }
-      else LOG.error("unmatched member class " + element.getClass());
-    }
-    
-    CommandProcessor.getInstance().executeCommand(clazz.getProject(), new Runnable() {
-      public void run() {
-        ApplicationManager.getApplication().runWriteAction(new Runnable() {
-          public void run() {
-            // move methods
-            PyClassRefactoringUtil.moveMethods(methods, superClass);
-
-            // move superclasses declarations
-            PyClassRefactoringUtil.moveSuperclasses(clazz, superClasses, superClass);
-            PyClassRefactoringUtil.insertImport(superClass, extractedClasses);
-            PyClassRefactoringUtil.insertPassIfNeeded(clazz);
-          }
-        });
-      }
-    }, RefactoringBundle.message("pull.members.up.title"), null);
-
-    return superClass;
-  }
-
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenter.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenter.java
new file mode 100644
index 0000000..d98433f
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenter.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenter;
+
+/**
+ * Presenter for pull-up refactoring
+ *
+ * TODO: Interface left empty. Remove?
+ *
+ * @author Ilya.Kazakevich
+ */
+public interface PyPullUpPresenter extends MembersBasedPresenter {
+
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterImpl.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterImpl.java
new file mode 100644
index 0000000..83c2f0b
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterImpl.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.google.common.base.Preconditions;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.refactoring.classMembers.AbstractUsesDependencyMemberInfoModel;
+import com.intellij.refactoring.util.CommonRefactoringUtil;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.psi.PyUtil;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenterWithPreviewImpl;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Pull-up presenter implementation
+ *
+ * @author Ilya.Kazakevich
+ */
+class PyPullUpPresenterImpl extends MembersBasedPresenterWithPreviewImpl<PyPullUpView> implements PyPullUpPresenter {
+  @NotNull
+  private final Collection<PyClass> myParents;
+
+  /**
+   * @param view        view
+   * @param infoStorage member storage
+   * @param clazz       class to refactor
+   */
+  PyPullUpPresenterImpl(@NotNull final PyPullUpView view, @NotNull final PyMemberInfoStorage infoStorage, @NotNull final PyClass clazz) {
+    super(view, clazz, infoStorage);
+    myParents = PyAncestorsUtils.getAncestorsUnderUserControl(clazz);
+    Preconditions.checkArgument(!myParents.isEmpty(), "No parents found");
+  }
+
+
+  @Override
+  public void launch() {
+    myView.configure(
+      new PyPullUpViewInitializationInfo(new PyPullUpInfoModel(), myStorage.getClassMemberInfos(myClassUnderRefactoring), myParents));
+    myView.initAndShow();
+  }
+
+  @Override
+  public void okClicked() {
+    if (!isWritable()) {
+      return; //TODO: Strange behaviour
+    }
+    super.okClicked();
+  }
+
+  @NotNull
+  @Override
+  public BaseRefactoringProcessor createProcessor() {
+    return new PyPullUpProcessor(myClassUnderRefactoring, myView.getSelectedParent(), myView.getSelectedMemberInfos());
+  }
+
+  private boolean isWritable() {
+    final Collection<PyMemberInfo<PyElement>> infos = myView.getSelectedMemberInfos();
+    if (infos.isEmpty()) {
+      return true;
+    }
+    final PyElement element = infos.iterator().next().getMember();
+    final Project project = element.getProject();
+    if (!CommonRefactoringUtil.checkReadOnlyStatus(project, myView.getSelectedParent())) return false;
+    final PyClass container = PyUtil.getContainingClassOrSelf(element);
+    if (container == null || !CommonRefactoringUtil.checkReadOnlyStatus(project, container)) return false;
+    for (final PyMemberInfo<PyElement> info : infos) {
+      final PyElement member = info.getMember();
+      if (!CommonRefactoringUtil.checkReadOnlyStatus(project, member)) return false;
+    }
+    return true;
+  }
+
+
+  @Override
+  @NotNull
+  public MultiMap<PsiElement, String> getConflicts() {
+    final Collection<PyMemberInfo<PyElement>> infos = myView.getSelectedMemberInfos();
+    final PyClass superClass = myView.getSelectedParent();
+    return PyPullUpConflictsUtil.checkConflicts(infos, superClass);
+  }
+
+  private class PyPullUpInfoModel extends AbstractUsesDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo<PyElement>> {
+
+    PyPullUpInfoModel() {
+      super(myClassUnderRefactoring, null, false);
+    }
+
+    @Override
+    public boolean isAbstractEnabled(final PyMemberInfo<PyElement> member) {
+      return member.isCouldBeAbstract() && isMemberEnabled(member); // TODO: copy paste with other models, get rid of
+    }
+
+    @Override
+    public int checkForProblems(@NotNull final PyMemberInfo<PyElement> member) {
+      return member.isChecked() ? OK : super.checkForProblems(member);
+    }
+
+
+    @Override
+    protected int doCheck(@NotNull final PyMemberInfo<PyElement> memberInfo, final int problem) {
+      if (problem == ERROR && memberInfo.isStatic()) {
+        return WARNING;
+      }
+      return problem;
+    }
+
+    @Override
+    public boolean isMemberEnabled(final PyMemberInfo<PyElement> member) {
+      final PyClass currentSuperClass = myView.getSelectedParent();
+      if (member.getMember() instanceof PyClass) {
+        //TODO: Delegate to Memebers Managers
+        final PyClass memberClass = (PyClass)member.getMember();
+        if (memberClass.isSubclass(currentSuperClass) || currentSuperClass.isSubclass(memberClass)) {
+          return false; //Class is already parent of superclass
+        }
+      }
+      if (!PyPullUpConflictsUtil.checkConflicts(Collections.singletonList(member), myView.getSelectedParent()).isEmpty()) {
+        return false; //Member has conflict
+      }
+      return (!myStorage.getDuplicatedMemberInfos(currentSuperClass).contains(member)) && member.getMember() != currentSuperClass;
+    }
+  }
+}
+
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpProcessor.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpProcessor.java
new file mode 100644
index 0000000..1eaa742
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpProcessor.java
@@ -0,0 +1,45 @@
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMembersRefactoringBaseProcessor;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+
+/**
+ *
+ *
+ * @author Ilya.Kazakevich
+ */
+class PyPullUpProcessor extends PyMembersRefactoringBaseProcessor {
+
+  PyPullUpProcessor(@NotNull final PyClass from, @NotNull final PyClass to, @NotNull final Collection<PyMemberInfo<PyElement>> membersToMove) {
+    super(from.getProject(), membersToMove, from, to);
+  }
+
+
+  @Override
+  protected String getCommandName() {
+    return PyPullUpHandler.REFACTORING_NAME;
+  }
+
+  @Override
+  public String getProcessedElementsHeader() {
+    return PyBundle.message("refactoring.pull.up.dialog.move.members.to.class");
+  }
+
+  @Override
+  public String getCodeReferencesText(final int usagesCount, final int filesCount) {
+    return PyBundle.message("refactoring.pull.up.dialog.members.to.be.moved");
+  }
+
+  @Nullable
+  @Override
+  public String getCommentReferencesText(final int usagesCount, final int filesCount) {
+    return getCodeReferencesText(usagesCount, filesCount);
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpView.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpView.java
new file mode 100644
index 0000000..b0a42e0
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpView.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Ilya.Kazakevich
+ *         View for pull-up refactoring
+ */
+public interface PyPullUpView extends MembersBasedView<PyPullUpViewInitializationInfo> {
+
+  /**
+   * @return Parent that user selected
+   */
+  @NotNull
+  PyClass getSelectedParent();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewInitializationInfo.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewInitializationInfo.java
new file mode 100644
index 0000000..c438e84
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewInitializationInfo.java
@@ -0,0 +1,38 @@
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Configuration for pull-up view
+ *
+ * @author Ilya.Kazakevich
+ */
+class PyPullUpViewInitializationInfo extends MembersViewInitializationInfo {
+  @NotNull
+  private final Collection<PyClass> myParents;
+
+  /**
+   * @param parents list of possible parents to display.
+   */
+  PyPullUpViewInitializationInfo(@NotNull final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> memberInfoModel,
+                                 @NotNull final List<PyMemberInfo<PyElement>> memberInfos,
+                                 @NotNull final Collection<PyClass> parents) {
+    super(memberInfoModel, memberInfos);
+    myParents = new ArrayList<PyClass>(parents);
+  }
+
+  @NotNull
+  public Collection<PyClass> getParents() {
+    return Collections.unmodifiableCollection(myParents);
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewSwingImpl.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewSwingImpl.java
new file mode 100644
index 0000000..2a457f8
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewSwingImpl.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.ComboBox;
+import com.intellij.refactoring.RefactoringBundle;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedViewSwingImpl;
+import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer;
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+
+/**
+ * @author Ilya.Kazakevich
+ *         Pull up view implementation
+ */
+class PyPullUpViewSwingImpl extends MembersBasedViewSwingImpl<PyPullUpPresenter, PyPullUpViewInitializationInfo> implements PyPullUpView,
+                                                                                                                            ItemListener {
+  @NotNull
+  private final ComboBox myParentsCombo;
+  @NotNull
+  private final DefaultComboBoxModel myParentsComboBoxModel;
+
+  /**
+   * @param project   project where refactoring takes place
+   * @param presenter presenter for this view
+   * @param clazz     class to refactor
+   */
+  PyPullUpViewSwingImpl(@NotNull final Project project, @NotNull final PyPullUpPresenter presenter, @NotNull final PyClass clazz) {
+    super(project, presenter, RefactoringBundle.message("members.to.be.pulled.up"), true);
+    setTitle(PyPullUpHandler.REFACTORING_NAME);
+
+    myParentsComboBoxModel = new DefaultComboBoxModel();
+
+    myParentsCombo = new ComboBox(myParentsComboBoxModel);
+    myParentsCombo.setRenderer(new PyClassCellRenderer());
+
+    final JLabel mainLabel = new JLabel();
+    mainLabel.setText(RefactoringBundle.message("pull.up.members.to", PyClassCellRenderer.getClassText(clazz)));
+    mainLabel.setLabelFor(myParentsCombo);
+
+
+    myTopPanel.setLayout(new GridBagLayout());
+    final GridBagConstraints gbConstraints = new GridBagConstraints();
+
+    gbConstraints.insets = new Insets(4, 8, 4, 8);
+    gbConstraints.weighty = 1;
+    gbConstraints.weightx = 1;
+    gbConstraints.gridy = 0;
+    gbConstraints.gridwidth = GridBagConstraints.REMAINDER;
+    gbConstraints.fill = GridBagConstraints.BOTH;
+    gbConstraints.anchor = GridBagConstraints.WEST;
+    myTopPanel.add(mainLabel, gbConstraints);
+    myTopPanel.add(mainLabel, gbConstraints);
+    gbConstraints.gridy++;
+    myTopPanel.add(myParentsCombo, gbConstraints);
+
+    gbConstraints.gridy++;
+    myCenterPanel.add(myPyMemberSelectionPanel, BorderLayout.CENTER);
+  }
+
+  @Override
+  @NotNull
+  protected String getHelpId() {
+    return "python.reference.pullMembersUp";
+  }
+
+
+  @NotNull
+  @Override
+  public PyClass getSelectedParent() {
+    return (PyClass)myParentsComboBoxModel.getSelectedItem();
+  }
+
+
+
+  @Override
+  public void configure(@NotNull final PyPullUpViewInitializationInfo configInfo) {
+    super.configure(configInfo);
+    for (final PyClass parent : configInfo.getParents()) {
+      myParentsComboBoxModel.addElement(parent);
+    }
+    myParentsCombo.addItemListener(this);
+  }
+
+  @Override
+  public void itemStateChanged(final ItemEvent e) {
+    if (e.getStateChange() == ItemEvent.SELECTED) {
+      myPyMemberSelectionPanel.redraw();
+    }
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/package-info.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/package-info.java
new file mode 100644
index 0000000..4623236
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * "Pull members up" refactoring
+ * @author Ilya.Kazakevich
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java
index c159b2f..9eee6c9 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java
@@ -25,7 +25,7 @@
 import com.intellij.util.containers.MultiMap;
 import com.jetbrains.python.psi.*;
 import com.jetbrains.python.psi.resolve.PyResolveContext;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -34,29 +34,29 @@
 /**
  * @author Dennis.Ushakov
  */
-public class PyPushDownConflicts {
+class PyPushDownConflicts {
   private static final Logger LOG = Logger.getInstance(PyPushDownProcessor.class.getName());
 
   private final PyClass myClass;
-  private final Collection<PyMemberInfo> myMembers;
+  private final Collection<PyMemberInfo<PyElement>> myMembers;
   private final MultiMap<PsiElement, String> myConflicts;
 
-  public PyPushDownConflicts(final PyClass clazz, final Collection<PyMemberInfo> members) {
+  public PyPushDownConflicts(final PyClass clazz, final Collection<PyMemberInfo<PyElement>> members) {
     myClass = clazz;
     myMembers = members;
     myConflicts = new MultiMap<PsiElement, String>();
   }
 
-  public MultiMap<PsiElement, String> getConflicts() {
+  MultiMap<PsiElement, String> getConflicts() {
     return myConflicts;
   }
 
-  public void checkTargetClassConflicts(PyClass clazz) {
+  void checkTargetClassConflicts(PyClass clazz) {
     checkPlacementConflicts(clazz);    
   }
 
   private void checkPlacementConflicts(PyClass clazz) {
-    for (PyMemberInfo member : myMembers) {
+    for (PyMemberInfo<PyElement> member : myMembers) {
       final PyElement element = member.getMember();
       if (element instanceof PyFunction) {
         for (PyFunction function : clazz.getMethods()) {
@@ -73,8 +73,8 @@
   }
 
   public void checkSourceClassConflicts() {
-    final List<PyElement> elements = ContainerUtil.map(myMembers, new Function<PyMemberInfo, PyElement>() {
-      public PyElement fun(PyMemberInfo pyMemberInfo) {
+    final List<PyElement> elements = ContainerUtil.map(myMembers, new Function<PyMemberInfo<PyElement>, PyElement>() {
+      public PyElement fun(PyMemberInfo<PyElement> pyMemberInfo) {
         return pyMemberInfo.getMember();
       }
     });
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownDialog.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownDialog.java
deleted file mode 100644
index 2235c57..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownDialog.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.pushDown;
-
-import com.intellij.openapi.project.Project;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.classMembers.MemberInfoChange;
-import com.intellij.refactoring.classMembers.MemberInfoModel;
-import com.intellij.refactoring.classMembers.UsedByDependencyMemberInfoModel;
-import com.intellij.refactoring.ui.RefactoringDialog;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
-import com.jetbrains.python.refactoring.classes.ui.PyMemberSelectionPanel;
-
-import javax.swing.*;
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPushDownDialog extends RefactoringDialog {
-  private final List<PyMemberInfo> myMemberInfos;
-  private final PyClass myClass;
-  private MemberInfoModel<PyElement, PyMemberInfo> myMemberInfoModel;
-
-  public PyPushDownDialog(Project project, PyClass aClass, PyMemberInfoStorage memberInfos) {
-    super(project, true);
-    myMemberInfos = memberInfos.getClassMemberInfos(aClass);
-    myClass = aClass;
-
-    setTitle(PyPushDownHandler.REFACTORING_NAME);
-
-    init();
-  }
-
-  protected String getHelpId() {
-    return "python.reference.pushMembersDown";
-  }
-
-  @Override
-  protected void doAction() {
-    if(!isOKActionEnabled()) return;
-
-    final PyPushDownProcessor processor = new PyPushDownProcessor(getProject(), myClass, getSelectedMemberInfos());
-    invokeRefactoring(processor);
-  }
-
-  protected JComponent createNorthPanel() {
-    GridBagConstraints gbConstraints = new GridBagConstraints();
-
-    JPanel panel = new JPanel(new GridBagLayout());
-
-    gbConstraints.insets = new Insets(4, 0, 4, 8);
-    gbConstraints.weighty = 1;
-    gbConstraints.weightx = 1;
-    gbConstraints.gridy = 0;
-    gbConstraints.gridwidth = GridBagConstraints.REMAINDER;
-    gbConstraints.fill = GridBagConstraints.BOTH;
-    gbConstraints.anchor = GridBagConstraints.WEST;
-    final String fqn = myClass.getName();
-    panel.add(new JLabel(RefactoringBundle.message("push.members.from.0.down.label", fqn)), gbConstraints);
-    return panel;
-  }
-
-  protected JComponent createCenterPanel() {
-    JPanel panel = new JPanel(new BorderLayout());
-    final PyMemberSelectionPanel memberSelectionPanel = new PyMemberSelectionPanel(
-      RefactoringBundle.message("members.to.be.pushed.down.panel.title"),
-      myMemberInfos, null);
-    panel.add(memberSelectionPanel, BorderLayout.CENTER);
-
-    myMemberInfoModel = new UsedByDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo>(myClass);
-    myMemberInfoModel.memberInfoChanged(new MemberInfoChange<PyElement, PyMemberInfo>(myMemberInfos));
-    memberSelectionPanel.getTable().setMemberInfoModel(myMemberInfoModel);
-    memberSelectionPanel.getTable().addMemberInfoChangeListener(myMemberInfoModel);
-
-    return panel;
-  }
-
-  public Collection<PyMemberInfo> getSelectedMemberInfos() {
-    ArrayList<PyMemberInfo> list = new ArrayList<PyMemberInfo>(myMemberInfos.size());
-    for (PyMemberInfo info : myMemberInfos) {
-      if (info.isChecked() && myMemberInfoModel.isMemberEnabled(info)) {
-        list.add(info);
-      }
-    }
-    return list;
-  }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownHandler.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownHandler.java
index 689d508..08fda71 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownHandler.java
@@ -15,21 +15,18 @@
  */
 package com.jetbrains.python.refactoring.classes.pushDown;
 
-import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.application.ex.ApplicationManagerEx;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
 import com.intellij.refactoring.RefactoringBundle;
 import com.intellij.refactoring.util.CommonRefactoringUtil;
 import com.intellij.util.Query;
 import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyUtil;
 import com.jetbrains.python.psi.search.PyClassInheritorsSearch;
-import com.jetbrains.python.refactoring.classes.PyClassMembersRefactoringSupport;
 import com.jetbrains.python.refactoring.classes.PyClassRefactoringHandler;
 import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.vp.Creator;
+import com.jetbrains.python.vp.ViewPresenterUtils;
+import org.jetbrains.annotations.NotNull;
 
 /**
  * @author Dennis.Ushakov
@@ -38,26 +35,33 @@
   public static final String REFACTORING_NAME = RefactoringBundle.message("push.members.down.title");
 
   @Override
-  protected void doRefactor(Project project, PsiElement element1, PsiElement element2, Editor editor, PsiFile file, DataContext dataContext) {
-    CommonRefactoringUtil.checkReadOnlyStatus(project, file);
+  protected void doRefactorImpl(@NotNull final Project project,
+                                @NotNull final PyClass classUnderRefactoring,
+                                @NotNull final PyMemberInfoStorage infoStorage,
+                                @NotNull Editor editor) {
 
-    final PyClass clazz = PyUtil.getContainingClassOrSelf(element1);
-    if (!inClass(clazz, project, editor, "refactoring.pull.up.error.cannot.perform.refactoring.not.inside.class")) return;
-
-    final Query<PyClass> query = PyClassInheritorsSearch.search(clazz, false);
+    //TODO: Move to presenter?
+    final Query<PyClass> query = PyClassInheritorsSearch.search(classUnderRefactoring, false);
     if (query.findFirst() == null) {
-      assert clazz != null;
-      final String message = RefactoringBundle.message("class.0.does.not.have.inheritors", clazz.getName());
+      final String message = RefactoringBundle.message("class.0.does.not.have.inheritors", classUnderRefactoring.getName());
       CommonRefactoringUtil.showErrorHint(project, editor, message, getTitle(), getHelpId());
       return;
     }
 
-    final PyMemberInfoStorage infoStorage = PyClassMembersRefactoringSupport.getSelectedMemberInfos(clazz, element1, element2);
+    ViewPresenterUtils
+      .linkViewWithPresenterAndLaunch(PyPushDownPresenter.class, PyPushDownView.class, new Creator<PyPushDownView, PyPushDownPresenter>() {
+        @NotNull
+        @Override
+        public PyPushDownPresenter createPresenter(@NotNull PyPushDownView view) {
+          return new PyPushDownPresenterImpl(project, view, classUnderRefactoring, infoStorage);
+        }
 
-    if (ApplicationManagerEx.getApplicationEx().isUnitTestMode()) return;
-
-    final PyPushDownDialog dialog = new PyPushDownDialog(project, clazz, infoStorage);
-    dialog.show();
+        @NotNull
+        @Override
+        public PyPushDownView createView(@NotNull PyPushDownPresenter presenter) {
+          return new PyPushDownViewSwingImpl(classUnderRefactoring, project, presenter);
+        }
+      });
   }
 
   @Override
@@ -69,5 +73,4 @@
   protected String getHelpId() {
     return "members.push.down";
   }
-
 }
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenter.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenter.java
new file mode 100644
index 0000000..357aa66
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenter.java
@@ -0,0 +1,9 @@
+package com.jetbrains.python.refactoring.classes.pushDown;
+
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenter;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public interface PyPushDownPresenter extends MembersBasedPresenter {
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenterImpl.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenterImpl.java
new file mode 100644
index 0000000..1e9cabd
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenterImpl.java
@@ -0,0 +1,52 @@
+package com.jetbrains.python.refactoring.classes.pushDown;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.refactoring.classMembers.UsedByDependencyMemberInfoModel;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.psi.PyUtil;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenterWithPreviewImpl;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public class PyPushDownPresenterImpl extends MembersBasedPresenterWithPreviewImpl<PyPushDownView> implements PyPushDownPresenter {
+  @NotNull
+  private final Project myProject;
+
+  public PyPushDownPresenterImpl(@NotNull final Project project,
+                                 @NotNull final PyPushDownView view,
+                                 @NotNull final PyClass classUnderRefactoring,
+                                 @NotNull final PyMemberInfoStorage infoStorage) {
+    super(view, classUnderRefactoring, infoStorage);
+    myProject = project;
+  }
+
+  @NotNull
+  @Override
+  public BaseRefactoringProcessor createProcessor() {
+    return new PyPushDownProcessor(myProject, myView.getSelectedMemberInfos(), myClassUnderRefactoring);
+  }
+
+  @NotNull
+  @Override
+  protected MultiMap<PsiElement, String> getConflicts() {
+    return new PyPushDownConflicts(myClassUnderRefactoring, myStorage.getClassMemberInfos(myClassUnderRefactoring)).getConflicts();
+  }
+
+  @Override
+  public void launch() {
+    UsedByDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo<PyElement>> model =
+      new UsedByDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo<PyElement>>(myClassUnderRefactoring);
+    myView
+      .configure(new MembersViewInitializationInfo(model, PyUtil.filterOutObject(myStorage.getClassMemberInfos(myClassUnderRefactoring))));
+    myView.initAndShow();
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java
index e7026aa..a0fcf53 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java
@@ -15,120 +15,51 @@
  */
 package com.jetbrains.python.refactoring.classes.pushDown;
 
-import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.ui.Messages;
-import com.intellij.openapi.util.Ref;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiNamedElement;
-import com.intellij.refactoring.BaseRefactoringProcessor;
 import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.usageView.UsageInfo;
-import com.intellij.usageView.UsageViewDescriptor;
-import com.intellij.util.Function;
-import com.intellij.util.containers.ContainerUtil;
+import com.intellij.usageView.UsageViewBundle;
 import com.jetbrains.python.psi.PyClass;
 import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.psi.PyExpression;
-import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.psi.impl.PyPsiUtils;
 import com.jetbrains.python.psi.search.PyClassInheritorsSearch;
-import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMembersRefactoringBaseProcessor;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
-import java.util.*;
+import java.util.Collection;
 
 /**
  * @author Dennis.Ushakov
  */
-public class PyPushDownProcessor extends BaseRefactoringProcessor {
-  private static final Logger LOG = Logger.getInstance(PyPushDownProcessor.class.getName());
+public class PyPushDownProcessor extends PyMembersRefactoringBaseProcessor {
 
-  private PyClass myClass;
-  private final Collection<PyMemberInfo> mySelectedMemberInfos;
+  private static final String HEADER = RefactoringBundle.message("push.down.members.elements.header");
 
-  public PyPushDownProcessor(Project project, PyClass clazz, Collection<PyMemberInfo> selectedMemberInfos) {
-    super(project);
-    myClass = clazz;
-    mySelectedMemberInfos = selectedMemberInfos;
+  public PyPushDownProcessor(
+    @NotNull final Project project,
+    @NotNull final Collection<PyMemberInfo<PyElement>> membersToMove,
+    @NotNull final PyClass from) {
+    super(project, membersToMove, from, getChildren(from));
   }
 
   @NotNull
-  @Override
-  protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) {
-    return new PyPushDownUsageViewDescriptor(myClass);
+  private static PyClass[] getChildren(@NotNull final PyClass from) {
+    Collection<PyClass> all = PyClassInheritorsSearch.search(from, false).findAll();
+    return all.toArray(new PyClass[all.size()]);
   }
 
-  @NotNull
-  @Override
-  protected UsageInfo[] findUsages() {
-    final Collection<PyClass> subClasses = PyClassInheritorsSearch.search(myClass, false).findAll();
-    final UsageInfo[] result = new UsageInfo[subClasses.size()];
-    ContainerUtil.map2Array(subClasses, result, new Function<PyClass, UsageInfo>() {
-      public UsageInfo fun(PyClass pyClass) {
-        return new UsageInfo(pyClass);
-      }
-    });
-    return result;
+
+  public String getProcessedElementsHeader() {
+    return HEADER;
   }
 
-  @Override
-  protected void refreshElements(PsiElement[] elements) {
-    if (elements.length == 1 && elements[0] instanceof PyClass) {
-      myClass = (PyClass)elements[0];
-    }
+  public String getCodeReferencesText(int usagesCount, int filesCount) {
+    return RefactoringBundle.message("classes.to.push.down.members.to", UsageViewBundle.getReferencesString(usagesCount, filesCount));
   }
 
-  @Override
-  protected void performRefactoring(UsageInfo[] usages) {
-    final Set<String> superClasses = new HashSet<String>();
-    final Set<PsiNamedElement> extractedClasses = new HashSet<PsiNamedElement>();
-    final List<PyFunction> methods = new ArrayList<PyFunction>();
-    for (PyMemberInfo member : mySelectedMemberInfos) {
-      final PyElement element = member.getMember();
-      if (element instanceof PyFunction) methods.add((PyFunction)element);
-      else if (element instanceof PyClass) {
-        superClasses.add(element.getName());
-        extractedClasses.add((PyClass)element);
-      }
-      else LOG.error("unmatched member class " + element.getClass());
-    }
-    final PyElement[] elements = methods.toArray(new PyElement[methods.size()]);
-
-    final List<PyExpression> superClassesElements = PyClassRefactoringUtil.removeAndGetSuperClasses(myClass, superClasses);
-
-    for (UsageInfo usage : usages) {
-      final PyClass targetClass = (PyClass)usage.getElement();
-      PyClassRefactoringUtil.addMethods(targetClass, elements, false);
-      PyClassRefactoringUtil.addSuperclasses(myClass.getProject(), targetClass, superClassesElements, superClasses);
-      PyClassRefactoringUtil.insertImport(targetClass, extractedClasses);
-    }
-
-    if (methods.size() != 0) {
-      PyPsiUtils.removeElements(elements);
-      PyClassRefactoringUtil.insertPassIfNeeded(myClass);
-    }
-  }
-
-  @Override
-  protected boolean preprocessUsages(Ref<UsageInfo[]> ref) {
-    final UsageInfo[] usages = ref.get();
-    final PyPushDownConflicts conflicts = new PyPushDownConflicts(myClass, mySelectedMemberInfos);
-    conflicts.checkSourceClassConflicts();
-
-    if (usages.length == 0) {
-      final String message = RefactoringBundle.message("class.0.does.not.have.inheritors", myClass.getName()) + "\nPushing members down will result in them being deleted";
-      final int answer = Messages.showYesNoDialog(message, PyPushDownHandler.REFACTORING_NAME, Messages.getWarningIcon());
-      if (answer != 0) {
-        return false;
-      }
-    }
-
-    for (UsageInfo usage : usages) {
-       conflicts.checkTargetClassConflicts((PyClass)usage.getElement());
-    }
-    return showConflicts(conflicts.getConflicts(), usages);
+  @Nullable
+  public String getCommentReferencesText(int usagesCount, int filesCount) {
+    return null;
   }
 
   @Override
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownUsageViewDescriptor.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownUsageViewDescriptor.java
deleted file mode 100644
index 97f858a..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownUsageViewDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.pushDown;
-
-import com.intellij.psi.PsiElement;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.usageView.UsageViewBundle;
-import com.intellij.usageView.UsageViewDescriptor;
-import com.jetbrains.python.psi.PyClass;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPushDownUsageViewDescriptor implements UsageViewDescriptor {
-  private final PyClass myClass;
-  private static final String HEADER = RefactoringBundle.message("push.down.members.elements.header");
-
-  public PyPushDownUsageViewDescriptor(final PyClass clazz) {
-    myClass = clazz;
-  }
-
-  @NotNull
-  public PsiElement[] getElements() {
-    return new PsiElement[] {myClass};
-  }
-
-  public String getProcessedElementsHeader() {
-    return HEADER;
-  }
-
-  public String getCodeReferencesText(int usagesCount, int filesCount) {
-    return RefactoringBundle.message("classes.to.push.down.members.to", UsageViewBundle.getReferencesString(usagesCount, filesCount));
-  }
-
-  @Nullable
-  public String getCommentReferencesText(int usagesCount, int filesCount) {
-    return null;
-  }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownView.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownView.java
new file mode 100644
index 0000000..5b1848e
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownView.java
@@ -0,0 +1,10 @@
+package com.jetbrains.python.refactoring.classes.pushDown;
+
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public interface PyPushDownView extends MembersBasedView<MembersViewInitializationInfo> {
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownViewSwingImpl.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownViewSwingImpl.java
new file mode 100644
index 0000000..9fd0cb5
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownViewSwingImpl.java
@@ -0,0 +1,26 @@
+package com.jetbrains.python.refactoring.classes.pushDown;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.refactoring.RefactoringBundle;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedViewSwingImpl;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.awt.*;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public class PyPushDownViewSwingImpl extends MembersBasedViewSwingImpl<PyPushDownPresenter, MembersViewInitializationInfo>
+  implements PyPushDownView {
+  public PyPushDownViewSwingImpl(
+    @NotNull final PyClass classUnderRefactoring,
+    @NotNull final Project project,
+    @NotNull final PyPushDownPresenter presenter) {
+    super(project, presenter, RefactoringBundle.message("push.members.from.0.down.label", classUnderRefactoring.getName()), false);
+
+    myCenterPanel.add(myPyMemberSelectionPanel, BorderLayout.CENTER);
+    setTitle(PyPushDownHandler.REFACTORING_NAME);
+  }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java
index cc4357e..6b380b4 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java
@@ -15,39 +15,95 @@
  */
 package com.jetbrains.python.refactoring.classes.ui;
 
+import com.google.common.base.Preconditions;
 import com.intellij.refactoring.classMembers.MemberInfoModel;
 import com.intellij.ui.IdeBorderFactory;
 import com.intellij.ui.ScrollPaneFactory;
 import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
 
 import javax.swing.*;
 import javax.swing.border.Border;
 import java.awt.*;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 /**
+ * Panel that handles table with list of class members with selection checkboxes.
+ *
  * @author Dennis.Ushakov
  */
 public class PyMemberSelectionPanel extends JPanel {
+  private static final List<PyMemberInfo<PyElement>> EMPTY_MEMBER_INFO = Collections.emptyList();
   private final PyMemberSelectionTable myTable;
+  private boolean myInitialized;
 
-  public PyMemberSelectionPanel(String title, List<PyMemberInfo> memberInfo, final MemberInfoModel<PyElement, PyMemberInfo> model) {
-    super();
+
+  /**
+   * Creates empty panel to be filled later by {@link #init(com.intellij.refactoring.classMembers.MemberInfoModel, java.util.Collection)}
+   *
+   * @param title
+   */
+  public PyMemberSelectionPanel(@NotNull String title, boolean supportAbstract) {
+    this(title, EMPTY_MEMBER_INFO, null, supportAbstract);
+  }
+
+  /**
+   * Creates panel and fills its table (see {@link #init(com.intellij.refactoring.classMembers.MemberInfoModel, java.util.Collection)} ) with members info
+   *
+   * @param title      Title for panel
+   * @param memberInfo list of members
+   * @param model      model
+   */
+  public PyMemberSelectionPanel(
+    String title,
+    List<PyMemberInfo<PyElement>> memberInfo,
+    final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> model,
+    final boolean supportAbstract) {
     Border titledBorder = IdeBorderFactory.createTitledBorder(title, false);
     Border emptyBorder = BorderFactory.createEmptyBorder(0, 5, 5, 5);
     Border border = BorderFactory.createCompoundBorder(titledBorder, emptyBorder);
     setBorder(border);
     setLayout(new BorderLayout());
 
-    myTable = new PyMemberSelectionTable(memberInfo, model);
+    myTable = new PyMemberSelectionTable(memberInfo, model, supportAbstract);
     JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTable);
 
 
     add(scrollPane, BorderLayout.CENTER);
   }
 
-  public PyMemberSelectionTable getTable() {
-    return myTable;
+
+  /**
+   * Inits panel.
+   *
+   * @param memberInfoModel model to display memebers in table
+   * @param members         members to display
+   */
+  public void init(@NotNull final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> memberInfoModel,
+                   @NotNull final Collection<PyMemberInfo<PyElement>> members) {
+    Preconditions.checkState(!myInitialized, "Already myInitialized");
+    myTable.setMemberInfos(members);
+    myTable.setMemberInfoModel(memberInfoModel);
+    myTable.addMemberInfoChangeListener(memberInfoModel);
+    myInitialized = true;
+  }
+
+  /**
+   * @return list of members, selected by user
+   */
+  @NotNull
+  public Collection<PyMemberInfo<PyElement>> getSelectedMemberInfos() {
+    Preconditions.checkState(myInitialized, "Call #init first");
+    return myTable.getSelectedMemberInfos();
+  }
+
+  /**
+   * Redraws table. Call it when some new data is available.
+   */
+  public void redraw() {
+    myTable.fireExternalDataChange();
   }
 }
diff --git a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java
index 11d3e42..229b2b5 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java
@@ -17,12 +17,15 @@
 
 import com.intellij.icons.AllIcons;
 import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.RefactoringBundle;
 import com.intellij.refactoring.classMembers.MemberInfoModel;
 import com.intellij.refactoring.ui.AbstractMemberSelectionTable;
 import com.intellij.ui.RowIcon;
 import com.jetbrains.python.psi.PyElement;
 import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 import java.util.List;
@@ -30,23 +33,37 @@
 /**
  * @author Dennis.Ushakov
  */
-public class PyMemberSelectionTable extends AbstractMemberSelectionTable<PyElement, PyMemberInfo> {
-  public PyMemberSelectionTable(final List<PyMemberInfo> memberInfos,
-                                  final MemberInfoModel<PyElement, PyMemberInfo> model) {
-    super(memberInfos, model, null);
+public class PyMemberSelectionTable extends AbstractMemberSelectionTable<PyElement, PyMemberInfo<PyElement>> {
+
+  private static final String ABSTRACT_TITLE = RefactoringBundle.message("make.abstract");
+  private final boolean mySupportAbstract;
+
+  public PyMemberSelectionTable(
+    @NotNull final List<PyMemberInfo<PyElement>> memberInfos,
+    @Nullable final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> model,
+    final boolean supportAbstract) {
+    super(memberInfos, model, (supportAbstract ? ABSTRACT_TITLE : null));
+    mySupportAbstract = supportAbstract;
   }
 
-  protected Object getAbstractColumnValue(PyMemberInfo memberInfo) {
-    return null;
+  @Nullable
+  @Override
+  protected Object getAbstractColumnValue(final PyMemberInfo<PyElement> memberInfo) {
+    //TODO: Too many logic, move to presenters
+    return (mySupportAbstract && memberInfo.isChecked() && myMemberInfoModel.isAbstractEnabled(memberInfo)) ? memberInfo.isToAbstract() : null;
   }
 
-  protected boolean isAbstractColumnEditable(int rowIndex) {
-    return false;
+  @Override
+  protected boolean isAbstractColumnEditable(final int rowIndex) {
+    return mySupportAbstract && myMemberInfoModel.isAbstractEnabled(myMemberInfos.get(rowIndex));
   }
 
-  protected void setVisibilityIcon(PyMemberInfo memberInfo, RowIcon icon) {}
+  @Override
+  protected void setVisibilityIcon(PyMemberInfo<PyElement> memberInfo, RowIcon icon) {
+  }
 
-  protected Icon getOverrideIcon(PyMemberInfo memberInfo) {
+  @Override
+  protected Icon getOverrideIcon(PyMemberInfo<PyElement> memberInfo) {
     final PsiElement member = memberInfo.getMember();
     Icon overrideIcon = EMPTY_OVERRIDE_ICON;
     if (member instanceof PyFunction && memberInfo.getOverrides() != null && memberInfo.getOverrides()) {
diff --git a/python/src/com/jetbrains/python/refactoring/classes/ui/UpDirectedMembersMovingDialog.java b/python/src/com/jetbrains/python/refactoring/classes/ui/UpDirectedMembersMovingDialog.java
deleted file mode 100644
index 7ac313d..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/ui/UpDirectedMembersMovingDialog.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.ui;
-
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.ui.DialogWrapper;
-import com.intellij.refactoring.classMembers.DependencyMemberInfoModel;
-import com.intellij.refactoring.classMembers.MemberInfoChange;
-import com.intellij.refactoring.util.CommonRefactoringUtil;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.psi.PyUtil;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-
-import javax.swing.*;
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Dennis.Ushakov
- */
-public abstract class UpDirectedMembersMovingDialog extends DialogWrapper {
-  protected DependencyMemberInfoModel<PyElement, PyMemberInfo> myMemberInfoModel;
-  protected PyMemberSelectionPanel myMemberSelectionPanel;
-  protected PyClass myClass;
-  protected List<PyMemberInfo> myMemberInfos;
-
-  public UpDirectedMembersMovingDialog(Project project, final PyClass clazz) {
-    super(project, true);
-    myClass = clazz;
-  }
-
-  protected JComponent createCenterPanel() {
-    JPanel panel = new JPanel(new BorderLayout());
-    myMemberSelectionPanel = new PyMemberSelectionPanel(getMembersBorderTitle(), myMemberInfos, null);
-    myMemberInfoModel = createMemberInfoModel();
-    myMemberInfoModel.memberInfoChanged(new MemberInfoChange<PyElement, PyMemberInfo>(myMemberInfos));
-    myMemberSelectionPanel.getTable().setMemberInfoModel(myMemberInfoModel);
-    myMemberSelectionPanel.getTable().addMemberInfoChangeListener(myMemberInfoModel);
-    panel.add(myMemberSelectionPanel, BorderLayout.CENTER);
-
-    return panel;
-  }
-
-  protected abstract String getMembersBorderTitle();
-
-  protected abstract DependencyMemberInfoModel<PyElement, PyMemberInfo> createMemberInfoModel();
-
-  protected void doOKAction() {
-    if(!checkConflicts()) return;
-    close(OK_EXIT_CODE);
-  }
-
-  public boolean isOKActionEnabled() {
-    return getSelectedMemberInfos().size() > 0 && super.isOKActionEnabled();
-  }
-
-  public abstract boolean checkConflicts();
-
-  protected static boolean checkWritable(final PyClass superClass, final Collection<PyMemberInfo> infos) {
-    if (infos.size() ==0) {
-      return true;
-    }
-    final PyElement element = infos.iterator().next().getMember();
-    final Project project = element.getProject();
-    if (!CommonRefactoringUtil.checkReadOnlyStatus(project, superClass)) return false;
-    final PyClass container = PyUtil.getContainingClassOrSelf(element);
-    if (container == null || !CommonRefactoringUtil.checkReadOnlyStatus(project, container)) return false;
-    for (PyMemberInfo info : infos) {
-      final PyElement member = info.getMember();
-      if (!CommonRefactoringUtil.checkReadOnlyStatus(project, member)) return false;
-    }
-    return true;
-  }
-
-  public Collection<PyMemberInfo> getSelectedMemberInfos() {
-    ArrayList<PyMemberInfo> list = new ArrayList<PyMemberInfo>(myMemberInfos.size());
-    for (PyMemberInfo info : myMemberInfos) {
-      if (info.isChecked() && myMemberInfoModel.isMemberEnabled(info)) {
-        list.add(info);
-      }
-    }
-    return list;
-  }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/extractmethod/PyExtractMethodUtil.java b/python/src/com/jetbrains/python/refactoring/extractmethod/PyExtractMethodUtil.java
index aeb1efa..d16712d 100644
--- a/python/src/com/jetbrains/python/refactoring/extractmethod/PyExtractMethodUtil.java
+++ b/python/src/com/jetbrains/python/refactoring/extractmethod/PyExtractMethodUtil.java
@@ -59,6 +59,7 @@
 import java.util.*;
 
 /**
+ * * TODO: Merge with {@link com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil#createMethod(String, com.jetbrains.python.psi.PyClass, com.jetbrains.python.psi.PyFunction.Modifier, java.util.Collection, String...)}
  * @author oleg
  */
 public class PyExtractMethodUtil {
@@ -564,7 +565,7 @@
           throw new CommonRefactoringUtil.RefactoringErrorHintException(error);
         }
         if (Messages.showOkCancelDialog(error + ". " + RefactoringBundle.message("do.you.wish.to.continue"),
-                                        RefactoringBundle.message("warning.title"), Messages.getWarningIcon()) != 0){
+                                        RefactoringBundle.message("warning.title"), Messages.getWarningIcon()) != Messages.OK){
           throw new CommonRefactoringUtil.RefactoringErrorHintException(error);
         }
       }
diff --git a/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java b/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java
index 21c2604..e5f5c26 100644
--- a/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java
+++ b/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java
@@ -140,7 +140,7 @@
     // TODO: Remove extra empty lines after the removed element
     element.delete();
     if (file != null) {
-      optimizeImports(file);
+      PyClassRefactoringUtil.optimizeImports(file);
     }
   }
 
@@ -209,15 +209,12 @@
       if (resolvesToLocalStarImport(usage)) {
         PyClassRefactoringUtil.insertImport(usage, newElement);
         if (usageFile != null) {
-          optimizeImports(usageFile);
+          PyClassRefactoringUtil.optimizeImports(usageFile);
         }
       }
     }
   }
 
-  private static void optimizeImports(@NotNull PsiFile file) {
-    new PyImportOptimizer().processFile(file).run();
-  }
 
   private static boolean resolvesToLocalStarImport(@NotNull PsiElement element) {
     final PsiReference ref = element.getReference();
diff --git a/python/src/com/jetbrains/python/refactoring/rename/RenamePyFunctionProcessor.java b/python/src/com/jetbrains/python/refactoring/rename/RenamePyFunctionProcessor.java
index ce91ea6..36e0a00 100644
--- a/python/src/com/jetbrains/python/refactoring/rename/RenamePyFunctionProcessor.java
+++ b/python/src/com/jetbrains/python/refactoring/rename/RenamePyFunctionProcessor.java
@@ -79,10 +79,10 @@
       String message = "Method " + function.getName() + " of class " + containingClass.getQualifiedName() + "\noverrides method of class "
                        + deepestSuperMethod.getContainingClass().getQualifiedName() + ".\nDo you want to rename the base method?";
       int rc = Messages.showYesNoCancelDialog(element.getProject(), message, "Rename", Messages.getQuestionIcon());
-      if (rc == 0) {
+      if (rc == Messages.YES) {
         return deepestSuperMethod;
       }
-      if (rc == 1) {
+      if (rc == Messages.NO) {
         return function;
       }
       return null;
@@ -98,8 +98,8 @@
                                              property.getName(), function.getName());
         final int rc = Messages.showYesNoCancelDialog(element.getProject(), message, "Rename", Messages.getQuestionIcon());
         switch (rc) {
-          case 0: return site;
-          case 1: return function;
+          case Messages.YES: return site;
+          case Messages.NO: return function;
           default: return null;
         }
       }
diff --git a/python/src/com/jetbrains/python/run/PythonRunner.java b/python/src/com/jetbrains/python/run/PythonRunner.java
index c2a8937..b95da7c 100644
--- a/python/src/com/jetbrains/python/run/PythonRunner.java
+++ b/python/src/com/jetbrains/python/run/PythonRunner.java
@@ -44,10 +44,10 @@
 
   @Override
   protected RunContentDescriptor doExecute(
-    Project project,
-    RunProfileState state,
+    @NotNull Project project,
+    @NotNull RunProfileState state,
     RunContentDescriptor contentToReuse,
-    ExecutionEnvironment env
+    @NotNull ExecutionEnvironment env
   ) throws ExecutionException {
     FileDocumentManager.getInstance().saveAllDocuments();
 
diff --git a/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.form b/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.form
index bd84b37..ea6172e 100644
--- a/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.form
+++ b/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.form
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.jetbrains.python.sdk.CreateVirtualEnvDialog">
-  <grid id="cbd77" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="7" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+  <grid id="cbd77" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="6" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
     <margin top="0" left="0" bottom="0" right="0"/>
     <constraints>
       <xy x="48" y="54" width="550" height="342"/>
@@ -16,7 +16,7 @@
       </component>
       <vspacer id="b277d">
         <constraints>
-          <grid row="6" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+          <grid row="5" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
         </constraints>
       </vspacer>
       <component id="48fd" class="com.intellij.ui.components.JBLabel">
@@ -60,30 +60,22 @@
       </component>
       <component id="41e08" class="com.intellij.ui.components.JBCheckBox" binding="myMakeAvailableToAllProjectsCheckbox">
         <constraints>
-          <grid row="5" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+          <grid row="4" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
         </constraints>
         <properties>
           <selected value="false"/>
           <text value="Make available to &amp;all projects"/>
         </properties>
       </component>
-      <component id="9835d" class="com.intellij.ui.components.JBCheckBox" binding="mySitePackagesCheckBox">
+      <component id="d10a9" class="com.intellij.ui.components.JBCheckBox" binding="mySitePackagesCheckBox">
         <constraints>
-          <grid row="3" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+          <grid row="3" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
         </constraints>
         <properties>
+          <selected value="false"/>
           <text value="&amp;Inherit global site-packages"/>
         </properties>
       </component>
-      <component id="fd5f3" class="com.intellij.ui.components.JBCheckBox" binding="mySetAsProjectInterpreterCheckbox" default-binding="true">
-        <constraints>
-          <grid row="4" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
-        </constraints>
-        <properties>
-          <selected value="true"/>
-          <text value="&amp;Set as project interpreter for this project"/>
-        </properties>
-      </component>
     </children>
   </grid>
 </form>
diff --git a/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.java b/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.java
index e86fca4..165d737 100644
--- a/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.java
+++ b/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.java
@@ -15,6 +15,8 @@
  */
 package com.jetbrains.python.sdk;
 
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
 import com.intellij.facet.ui.FacetEditorValidator;
 import com.intellij.facet.ui.FacetValidatorsManager;
 import com.intellij.openapi.application.Application;
@@ -67,18 +69,16 @@
   private JTextField myName;
   private JBCheckBox mySitePackagesCheckBox;
   private JBCheckBox myMakeAvailableToAllProjectsCheckbox;
-  private JBCheckBox mySetAsProjectInterpreterCheckbox;
   @Nullable private Project myProject;
   private String myInitialPath;
 
   public interface VirtualEnvCallback {
-    void virtualEnvCreated(Sdk sdk, boolean associateWithProject, boolean setAsProjectInterpreter);
+    void virtualEnvCreated(Sdk sdk, boolean associateWithProject);
   }
 
-  private static void setupVirtualEnvSdk(List<Sdk> allSdks,
+  private void setupVirtualEnvSdk(List<Sdk> allSdks,
                                          final String path,
                                          boolean associateWithProject,
-                                         final boolean makeActive,
                                          VirtualEnvCallback callback) {
     final VirtualFile sdkHome =
       ApplicationManager.getApplication().runWriteAction(new Computable<VirtualFile>() {
@@ -92,46 +92,45 @@
         SdkConfigurationUtil.createUniqueSdkName(PythonSdkType.getInstance(), sdkHome.getPath(), allSdks);
       final ProjectJdkImpl sdk = new ProjectJdkImpl(name, PythonSdkType.getInstance());
       sdk.setHomePath(sdkHome.getPath());
-      callback.virtualEnvCreated(sdk, associateWithProject, makeActive);
+      callback.virtualEnvCreated(sdk, associateWithProject);
+      PythonSdkType.setupSdkPaths(sdk, myProject, null);
     }
   }
 
   public CreateVirtualEnvDialog(Project project,
-                                boolean isNewProject,
                                 final List<Sdk> allSdks,
                                 @Nullable Sdk suggestedBaseSdk) {
     super(project);
-    setupDialog(project, isNewProject, allSdks, suggestedBaseSdk);
+    setupDialog(project, allSdks, suggestedBaseSdk);
   }
 
   public CreateVirtualEnvDialog(Component owner,
-                                boolean isNewProject,
                                 final List<Sdk> allSdks,
                                 @Nullable Sdk suggestedBaseSdk) {
     super(owner);
-    setupDialog(null, isNewProject, allSdks, suggestedBaseSdk);
+    setupDialog(null, allSdks, suggestedBaseSdk);
   }
 
-  private void setupDialog(Project project, boolean isNewProject, List<Sdk> allSdks, @Nullable Sdk suggestedBaseSdk) {
+  private void setupDialog(Project project, List<Sdk> allSdks, @Nullable Sdk suggestedBaseSdk) {
     myProject = project;
     init();
     setTitle("Create Virtual Environment");
     if (suggestedBaseSdk == null && allSdks.size() > 0) {
+      Iterables.removeIf(allSdks, new Predicate<Sdk>() {
+        @Override
+        public boolean apply(Sdk s) {
+          return PythonSdkType.isInvalid(s) || PythonSdkType.isVirtualEnv(s) || RemoteSdkDataHolder.isRemoteSdk(s.getHomePath());
+        }
+      });
       List<Sdk> sortedSdks = new ArrayList<Sdk>(allSdks);
       Collections.sort(sortedSdks, new PreferredSdkComparator());
       suggestedBaseSdk = sortedSdks.get(0);
     }
     updateSdkList(allSdks, suggestedBaseSdk);
 
-    myMakeAvailableToAllProjectsCheckbox.setBorder(BorderFactory.createEmptyBorder(8, 0, 0, 0));
     if (project == null || project.isDefault() || !PlatformUtils.isPyCharm()) {
       myMakeAvailableToAllProjectsCheckbox.setSelected(true);
       myMakeAvailableToAllProjectsCheckbox.setVisible(false);
-      mySetAsProjectInterpreterCheckbox.setSelected(false);
-      mySetAsProjectInterpreterCheckbox.setVisible(false);
-    }
-    else if (isNewProject) {
-      mySetAsProjectInterpreterCheckbox.setText("Set as project interpreter for the project being created");
     }
 
     setOKActionEnabled(false);
@@ -238,17 +237,7 @@
 
   private void updateSdkList(final List<Sdk> allSdks, @Nullable Sdk initialSelection) {
     mySdkCombo.setRenderer(new PySdkListCellRenderer());
-    List<Sdk> baseSdks = new ArrayList<Sdk>();
-    for (Sdk s : allSdks) {
-      if (!PythonSdkType.isInvalid(s) && !PythonSdkType.isVirtualEnv(s) && !RemoteSdkDataHolder.isRemoteSdk(s.getHomePath())) {
-        baseSdks.add(s);
-      }
-      else if (s.equals(initialSelection)){
-        initialSelection = null;
-      }
-    }
-
-    mySdkCombo.setModel(new CollectionComboBoxModel(baseSdks, initialSelection));
+    mySdkCombo.setModel(new CollectionComboBoxModel(allSdks, initialSelection));
   }
 
   @Override
@@ -288,10 +277,6 @@
     return !myMakeAvailableToAllProjectsCheckbox.isSelected();
   }
 
-  public boolean setAsProjectInterpreter() {
-    return mySetAsProjectInterpreterCheckbox.isSelected();
-  }
-
   @Override
   public JComponent getPreferredFocusedComponent() {
     return myName;
@@ -326,7 +311,7 @@
           application.invokeLater(new Runnable() {
             @Override
             public void run() {
-              setupVirtualEnvSdk(allSdks, myPath, associateWithProject(), setAsProjectInterpreter(), callback);
+              setupVirtualEnvSdk(allSdks, myPath, associateWithProject(), callback);
             }
           }, ModalityState.any());
         }
diff --git a/python/src/com/jetbrains/python/sdk/InterpreterPathChooser.java b/python/src/com/jetbrains/python/sdk/InterpreterPathChooser.java
deleted file mode 100644
index ab57e35..0000000
--- a/python/src/com/jetbrains/python/sdk/InterpreterPathChooser.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.sdk;
-
-import com.google.common.collect.Lists;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.application.ModalityState;
-import com.intellij.openapi.options.ShowSettingsUtil;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.projectRoots.Sdk;
-import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
-import com.intellij.openapi.ui.Messages;
-import com.intellij.openapi.ui.popup.JBPopupFactory;
-import com.intellij.openapi.ui.popup.ListPopup;
-import com.intellij.openapi.ui.popup.ListPopupStep;
-import com.intellij.openapi.ui.popup.PopupStep;
-import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.ui.awt.RelativePoint;
-import com.intellij.util.NullableConsumer;
-import com.intellij.util.SystemProperties;
-import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
-import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import javax.swing.*;
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-/**
-* @author yole
-*/
-public class InterpreterPathChooser extends BaseListPopupStep<String> {
-  private final Project myProject;
-  private final Component myOwnerComponent;
-  private final Sdk[] myExistingSdks;
-  private final NullableConsumer<Sdk> myCallback;
-
-  private static final String LOCAL = "Local...";
-  private static final String REMOTE = "Remote...";
-  private static final String VIRTUALENV = "Create VirtualEnv...";
-
-  public static void show(final Project project,
-                          final Sdk[] existingSdks,
-                          final RelativePoint popupPoint,
-                          final boolean showVirtualEnv,
-                          final NullableConsumer<Sdk> callback) {
-    ListPopupStep sdkHomesStep = new InterpreterPathChooser(project, popupPoint.getComponent(), existingSdks, showVirtualEnv, callback);
-    final ListPopup popup = JBPopupFactory.getInstance().createListPopup(sdkHomesStep);
-    popup.show(popupPoint);
-  }
-
-  public InterpreterPathChooser(Project project,
-                                Component ownerComponent,
-                                Sdk[] existingSdks,
-                                boolean showVirtualEnv,
-                                NullableConsumer<Sdk> callback) {
-    super("Select Interpreter Path", getSuggestedPythonSdkPaths(existingSdks, showVirtualEnv));
-    myProject = project;
-    myOwnerComponent = ownerComponent;
-    myExistingSdks = existingSdks;
-    myCallback = callback;
-  }
-
-  private static List<String> getSuggestedPythonSdkPaths(Sdk[] existingSdks, boolean showVirtualEnv) {
-    List<String> paths = new ArrayList<String>();
-    Collection<String> sdkHomes = PythonSdkType.getInstance().suggestHomePaths();
-    for (String sdkHome : SdkConfigurationUtil.filterExistingPaths(PythonSdkType.getInstance(), sdkHomes, existingSdks)) {
-      paths.add(FileUtil.getLocationRelativeToUserHome(sdkHome));
-    }
-    paths.add(LOCAL);
-    if (PythonRemoteInterpreterManager.getInstance() != null) {
-      paths.add(REMOTE);
-    }
-    if (showVirtualEnv) {
-      paths.add(VIRTUALENV);
-    }
-    return paths;
-  }
-
-  @Nullable
-  @Override
-  public Icon getIconFor(String aValue) {
-    if (LOCAL.equals(aValue) || REMOTE.equals(aValue) || VIRTUALENV.equals(aValue)) return null;
-    String filePath = aValue;
-    if (StringUtil.startsWithChar(filePath, '~')) {
-      String home = SystemProperties.getUserHome();
-      filePath = home + filePath.substring(1);
-    }
-    final PythonSdkFlavor flavor = PythonSdkFlavor.getPlatformIndependentFlavor(filePath);
-    return flavor != null ? flavor.getIcon() : PythonSdkType.getInstance().getIcon();
-  }
-
-  @NotNull
-  @Override
-  public String getTextFor(String value) {
-    return FileUtil.toSystemDependentName(value);
-  }
-
-  private void sdkSelected(final String selectedValue) {
-    if (LOCAL.equals(selectedValue)) {
-      createLocalSdk();
-    }
-    else if (REMOTE.equals(selectedValue)) {
-      createRemoteSdk();
-    }
-    else if (VIRTUALENV.equals(selectedValue)) {
-      createVirtualEnvSdk();
-    }
-    else {
-      createSdkFromPath(selectedValue);
-    }
-  }
-
-  private void createLocalSdk() {
-    ApplicationManager.getApplication().invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        SdkConfigurationUtil.createSdk(myProject, myExistingSdks, myCallback, PythonSdkType.getInstance());
-      }
-    }, ModalityState.any());
-  }
-
-  private void createRemoteSdk() {
-    PythonRemoteInterpreterManager remoteInterpreterManager = PythonRemoteInterpreterManager.getInstance();
-    if (remoteInterpreterManager != null) {
-      remoteInterpreterManager.addRemoteSdk(myProject, myOwnerComponent, Lists.newArrayList(myExistingSdks), myCallback);
-    }
-    else {
-      Messages.showErrorDialog("The Remote Hosts Access plugin is missing. Please enable the plugin in " +
-                               ShowSettingsUtil.getSettingsMenuName() +
-                               " | Plugins.", "Add Remote Interpreter");
-    }
-  }
-
-  private void createSdkFromPath(String selectedPath) {
-    String filePath = selectedPath;
-    if (StringUtil.startsWithChar(filePath, '~')) {
-      String home = SystemProperties.getUserHome();
-      filePath = home + filePath.substring(1);
-    }
-    Sdk sdk = SdkConfigurationUtil.setupSdk(myExistingSdks,
-                                            LocalFileSystem.getInstance().findFileByPath(filePath),
-                                            PythonSdkType.getInstance(), false, null, null);
-    myCallback.consume(sdk);
-  }
-
-  private void createVirtualEnvSdk() {
-    final CreateVirtualEnvDialog dialog;
-    final List<Sdk> allSdks = Arrays.asList(myExistingSdks);
-    if (myProject != null) {
-      dialog = new CreateVirtualEnvDialog(myProject, false, allSdks, null);
-    }
-    else {
-      dialog = new CreateVirtualEnvDialog(myOwnerComponent, false, allSdks, null);
-    }
-    dialog.show();
-    if (dialog.isOK()) {
-      dialog.createVirtualEnv(allSdks, new CreateVirtualEnvDialog.VirtualEnvCallback() {
-        @Override
-        public void virtualEnvCreated(Sdk sdk, boolean associateWithProject, boolean setAsProjectInterpreter) {
-          myCallback.consume(sdk);
-        }
-      });
-    }
-  }
-
-  @Override
-  public boolean canBeHidden(String value) {
-    return true;
-  }
-
-  @Override
-  public PopupStep onChosen(final String selectedValue, boolean finalChoice) {
-    return doFinalStep(new Runnable() {
-      public void run() {
-        sdkSelected(selectedValue);
-      }
-    });
-  }
-}
diff --git a/python/src/com/jetbrains/python/sdk/PreferredSdkComparator.java b/python/src/com/jetbrains/python/sdk/PreferredSdkComparator.java
index 50bc771..ff1cea9 100644
--- a/python/src/com/jetbrains/python/sdk/PreferredSdkComparator.java
+++ b/python/src/com/jetbrains/python/sdk/PreferredSdkComparator.java
@@ -37,6 +37,12 @@
     if (remote1Weight != remote2Weight) {
       return remote2Weight - remote1Weight;
     }
+    int detectedWeight1 = o1 instanceof PyDetectedSdk ? 0 : 1;
+    int detectedWeight2 = o2 instanceof PyDetectedSdk ? 0 : 1;
+    if (detectedWeight1 != detectedWeight2) {
+      return detectedWeight2 - detectedWeight1;
+    }
+
     int venv1weight = PythonSdkType.isVirtualEnv(o1) ? 0 : 1;
     int venv2weight = PythonSdkType.isVirtualEnv(o2) ? 0 : 1;
     if (venv1weight != venv2weight) {
@@ -47,6 +53,7 @@
     if (flavor1weight != flavor2weight) {
       return flavor2weight - flavor1weight;
     }
+
     return -Comparing.compare(o1.getVersionString(), o2.getVersionString());
   }
 }
diff --git a/python/src/com/jetbrains/python/sdk/PyDetectedSdk.java b/python/src/com/jetbrains/python/sdk/PyDetectedSdk.java
new file mode 100644
index 0000000..098462e
--- /dev/null
+++ b/python/src/com/jetbrains/python/sdk/PyDetectedSdk.java
@@ -0,0 +1,11 @@
+package com.jetbrains.python.sdk;
+
+import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
+
+public class PyDetectedSdk extends ProjectJdkImpl {
+  public PyDetectedSdk(String name) {
+    super(name, PythonSdkType.getInstance());
+    setHomePath(name);
+  }
+
+}
diff --git a/python/src/com/jetbrains/python/sdk/PySdkListCellRenderer.java b/python/src/com/jetbrains/python/sdk/PySdkListCellRenderer.java
index 9065d37..9886224 100644
--- a/python/src/com/jetbrains/python/sdk/PySdkListCellRenderer.java
+++ b/python/src/com/jetbrains/python/sdk/PySdkListCellRenderer.java
@@ -19,6 +19,7 @@
 import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.openapi.projectRoots.SdkModificator;
 import com.intellij.openapi.projectRoots.SdkType;
+import com.intellij.openapi.util.IconLoader;
 import com.intellij.ui.LayeredIcon;
 import com.intellij.ui.ListCellRendererWrapper;
 import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
@@ -27,9 +28,10 @@
 import javax.swing.*;
 import java.util.Map;
 
-public class PySdkListCellRenderer extends ListCellRendererWrapper<Sdk> {
+public class PySdkListCellRenderer extends ListCellRendererWrapper<Object> {
   private final String myNullText;
   private final Map<Sdk, SdkModificator> mySdkModifiers;
+  public static final String SEPARATOR = "separator";
 
   public PySdkListCellRenderer() {
     myNullText = "";
@@ -42,8 +44,9 @@
   }
 
   @Override
-  public void customize(JList list, Sdk sdk, int index, boolean selected, boolean hasFocus) {
-    if (sdk != null) {
+  public void customize(JList list, Object item, int index, boolean selected, boolean hasFocus) {
+    if (item instanceof Sdk) {
+      Sdk sdk = (Sdk)item;
       final PythonSdkFlavor flavor = PythonSdkFlavor.getPlatformIndependentFlavor(sdk.getHomePath());
       final Icon icon = flavor != null ? flavor.getIcon() : ((SdkType)sdk.getSdkType()).getIcon();
 
@@ -54,7 +57,6 @@
       else {
         name = sdk.getName();
       }
-
       if (PythonSdkType.isInvalid(sdk)) {
         setText("[invalid] " + name);
         setIcon(wrapIconWithWarningDecorator(icon));
@@ -63,17 +65,22 @@
         setText("[incomplete] " + name);
         setIcon(wrapIconWithWarningDecorator(icon));
       }
+      else if (sdk instanceof PyDetectedSdk){
+        setText(name);
+        setIcon(IconLoader.getTransparentIcon(icon));
+      }
       else {
         setText(name);
         setIcon(icon);
       }
     }
-    else {
+    else if (SEPARATOR.equals(item))
+      setSeparator();
+    else if (item == null)
       setText(myNullText);
-    }
   }
 
-  private LayeredIcon wrapIconWithWarningDecorator(Icon icon) {
+  private static LayeredIcon wrapIconWithWarningDecorator(Icon icon) {
     final LayeredIcon layered = new LayeredIcon(2);
     layered.setIcon(icon, 0);
     // TODO: Create a separate invalid SDK overlay icon (DSGN-497)
diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkDetailsStep.java b/python/src/com/jetbrains/python/sdk/PythonSdkDetailsStep.java
new file mode 100644
index 0000000..8e3f18a
--- /dev/null
+++ b/python/src/com/jetbrains/python/sdk/PythonSdkDetailsStep.java
@@ -0,0 +1,186 @@
+/*
+ * 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.jetbrains.python.sdk;
+
+import com.google.common.collect.Lists;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.ModalityState;
+import com.intellij.openapi.options.ShowSettingsUtil;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.projectRoots.SdkAdditionalData;
+import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
+import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
+import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.ui.popup.*;
+import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
+import com.intellij.ui.awt.RelativePoint;
+import com.intellij.util.NullableConsumer;
+import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
+import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
+import org.jetbrains.annotations.Nullable;
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class PythonSdkDetailsStep extends BaseListPopupStep<String> {
+  private static DialogWrapper myMore;
+  private final Project myProject;
+  private final Component myOwnerComponent;
+  private final Sdk[] myExistingSdks;
+  private final NullableConsumer<Sdk> myCallback;
+
+  private static final String LOCAL = "Add Local";
+  private static final String REMOTE = "Add Remote";
+  private static final String VIRTUALENV = "Create VirtualEnv";
+  private static final String MORE = "More...";
+
+  public static void show(final Project project,
+                          final Sdk[] existingSdks,
+                          DialogWrapper component, final RelativePoint popupPoint,
+                          final boolean showMore,
+                          final NullableConsumer<Sdk> callback) {
+    myMore = component;
+    final ListPopupStep sdkHomesStep = new PythonSdkDetailsStep(project, popupPoint.getComponent(), existingSdks, showMore, callback);
+    final ListPopup popup = JBPopupFactory.getInstance().createListPopup(sdkHomesStep);
+    popup.show(popupPoint);
+  }
+
+  public PythonSdkDetailsStep(Project project,
+                              Component ownerComponent,
+                              Sdk[] existingSdks,
+                              boolean showMore,
+                              NullableConsumer<Sdk> callback) {
+    super(null, getAvailableOptions(showMore));
+    myProject = project;
+    myOwnerComponent = ownerComponent;
+    myExistingSdks = existingSdks;
+    myCallback = callback;
+  }
+
+  private static List<String> getAvailableOptions(boolean showMore) {
+    final List<String> options = new ArrayList<String>();
+    options.add(LOCAL);
+    if (PythonRemoteInterpreterManager.getInstance() != null) {
+      options.add(REMOTE);
+    }
+    options.add(VIRTUALENV);
+
+    if (showMore) {
+      options.add(MORE);
+    }
+    return options;
+  }
+
+  @Nullable
+  @Override
+  public ListSeparator getSeparatorAbove(String value) {
+    return MORE.equals(value) ? new ListSeparator() : null;
+  }
+
+  private void optionSelected(final String selectedValue) {
+    if (LOCAL.equals(selectedValue)) {
+      createLocalSdk();
+    }
+    else if (REMOTE.equals(selectedValue)) {
+      createRemoteSdk();
+    }
+    else if (VIRTUALENV.equals(selectedValue)) {
+      createVirtualEnvSdk();
+    }
+    else {
+      myMore.show();
+    }
+  }
+
+  private void createLocalSdk() {
+    ApplicationManager.getApplication().invokeLater(new Runnable() {
+      @Override
+      public void run() {
+        SdkConfigurationUtil.createSdk(myProject, myExistingSdks, myCallback, false, PythonSdkType.getInstance());
+      }
+    }, ModalityState.any());
+  }
+
+  private void createRemoteSdk() {
+    PythonRemoteInterpreterManager remoteInterpreterManager = PythonRemoteInterpreterManager.getInstance();
+    if (remoteInterpreterManager != null) {
+      remoteInterpreterManager.addRemoteSdk(myProject, myOwnerComponent, Lists.newArrayList(myExistingSdks), myCallback);
+    }
+    else {
+      Messages.showErrorDialog("The Remote Hosts Access plugin is missing. Please enable the plugin in " +
+                               ShowSettingsUtil.getSettingsMenuName() +
+                               " | Plugins.", "Add Remote Interpreter");
+    }
+  }
+
+  private void createVirtualEnvSdk() {
+    CreateVirtualEnvDialog.VirtualEnvCallback callback = new CreateVirtualEnvDialog.VirtualEnvCallback() {
+      @Override
+      public void virtualEnvCreated(Sdk sdk, boolean associateWithProject) {
+        PythonSdkType.setupSdkPaths(sdk, myProject, null);
+        if (associateWithProject) {
+          SdkAdditionalData additionalData = sdk.getSdkAdditionalData();
+          if (additionalData == null) {
+            additionalData = new PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(sdk.getHomePath()));
+            ((ProjectJdkImpl)sdk).setSdkAdditionalData(additionalData);
+          }
+          ((PythonSdkAdditionalData)additionalData).associateWithProject(myProject);
+        }
+        myCallback.consume(sdk);
+      }
+    };
+
+    final CreateVirtualEnvDialog dialog;
+    final List<Sdk> allSdks = Lists.newArrayList(myExistingSdks);
+
+    final List<PythonSdkFlavor> flavors = PythonSdkFlavor.getApplicableFlavors(false);
+    for (PythonSdkFlavor flavor : flavors) {
+      final Collection<String> strings = flavor.suggestHomePaths();
+      for (String string : strings) {
+        allSdks.add(new PyDetectedSdk(string));
+      }
+    }
+
+    if (myProject != null) {
+      dialog = new CreateVirtualEnvDialog(myProject, allSdks, null);
+    }
+    else {
+      dialog = new CreateVirtualEnvDialog(myOwnerComponent, allSdks, null);
+    }
+    dialog.show();
+    if (dialog.isOK()) {
+      dialog.createVirtualEnv(allSdks, callback);
+    }
+  }
+
+  @Override
+  public boolean canBeHidden(String value) {
+    return true;
+  }
+
+  @Override
+  public PopupStep onChosen(final String selectedValue, boolean finalChoice) {
+    return doFinalStep(new Runnable() {
+      public void run() {
+        optionSelected(selectedValue);
+      }
+    });
+  }
+}
diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkType.java b/python/src/com/jetbrains/python/sdk/PythonSdkType.java
index 92654e9..3ad05e0 100644
--- a/python/src/com/jetbrains/python/sdk/PythonSdkType.java
+++ b/python/src/com/jetbrains/python/sdk/PythonSdkType.java
@@ -45,8 +45,12 @@
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.util.text.CharFilter;
 import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.*;
+import com.intellij.openapi.vfs.JarFileSystem;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VfsUtilCore;
+import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiElement;
+import com.intellij.reference.SoftReference;
 import com.intellij.remotesdk.RemoteSdkData;
 import com.intellij.remotesdk.RemoteSdkDataHolder;
 import com.intellij.ui.awt.RelativePoint;
@@ -76,6 +80,7 @@
 import java.awt.*;
 import java.io.File;
 import java.io.FilenameFilter;
+import java.io.IOException;
 import java.lang.ref.WeakReference;
 import java.util.*;
 import java.util.List;
@@ -143,6 +148,10 @@
   @NonNls
   @Nullable
   public String suggestHomePath() {
+    final String pythonFromPath = findPythonInPath();
+    if (pythonFromPath != null) {
+      return pythonFromPath;
+    }
     for (PythonSdkFlavor flavor : PythonSdkFlavor.getApplicableFlavors()) {
       TreeSet<String> candidates = createVersionSet();
       candidates.addAll(flavor.suggestHomePaths());
@@ -155,6 +164,23 @@
     return null;
   }
 
+  @Nullable
+  private static String findPythonInPath() {
+    final String defaultCommand = SystemInfo.isWindows ? "python.exe" : "python";
+    final String path = System.getenv("PATH");
+    for (String root : path.split(File.pathSeparator)) {
+      final File file = new File(root, defaultCommand);
+      if (file.exists()) {
+        try {
+          return file.getCanonicalPath();
+        }
+        catch (IOException ignored) {
+        }
+      }
+    }
+    return null;
+  }
+
   @Override
   public Collection<String> suggestHomePaths() {
     List<String> candidates = new ArrayList<String>();
@@ -254,15 +280,16 @@
 
   public void showCustomCreateUI(SdkModel sdkModel, final JComponent parentComponent, final Consumer<Sdk> sdkCreatedCallback) {
     Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(parentComponent));
-    InterpreterPathChooser.show(project, sdkModel.getSdks(), RelativePoint.getCenterOf(parentComponent), true, new NullableConsumer<Sdk>() {
-      @Override
-      public void consume(@Nullable Sdk sdk) {
-        if (sdk != null) {
-          sdk.putUserData(SDK_CREATOR_COMPONENT_KEY, new WeakReference<Component>(parentComponent));
-          sdkCreatedCallback.consume(sdk);
+    PythonSdkDetailsStep
+      .show(project, sdkModel.getSdks(), null, RelativePoint.getCenterOf(parentComponent), true, new NullableConsumer<Sdk>() {
+        @Override
+        public void consume(@Nullable Sdk sdk) {
+          if (sdk != null) {
+            sdk.putUserData(SDK_CREATOR_COMPONENT_KEY, new WeakReference<Component>(parentComponent));
+            sdkCreatedCallback.consume(sdk);
+          }
         }
-      }
-    });
+      });
   }
 
   public static boolean isVirtualEnv(Sdk sdk) {
@@ -460,11 +487,8 @@
 
   public void setupSdkPaths(@NotNull final Sdk sdk) {
     final Project project;
-    Component ownerComponent = null;
     final WeakReference<Component> ownerComponentRef = sdk.getUserData(SDK_CREATOR_COMPONENT_KEY);
-    if (ownerComponentRef != null) {
-      ownerComponent = ownerComponentRef.get();
-    }
+    Component ownerComponent = SoftReference.dereference(ownerComponentRef);
     if (ownerComponent != null) {
       project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(ownerComponent));
     }
diff --git a/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java
index 780effe..5d241b6 100644
--- a/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java
+++ b/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java
@@ -16,6 +16,7 @@
 package com.jetbrains.python.sdk.flavors;
 
 import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VFileProperty;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
 
@@ -57,7 +58,7 @@
             if (binDir != null && binDir.isDirectory()) {
               for (String name : POSSIBLE_BINARY_NAMES) {
                 final VirtualFile child = binDir.findChild(name);
-                if (child != null) {
+                if (child != null && !child.is(VFileProperty.SYMLINK)) {
                   candidates.add(child.getPath());
                   break;
                 }
diff --git a/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java
index 60fa802..07c8e1c 100644
--- a/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java
+++ b/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java
@@ -72,6 +72,10 @@
   }
 
   public static List<PythonSdkFlavor> getApplicableFlavors() {
+    return getApplicableFlavors(true);
+  }
+
+  public static List<PythonSdkFlavor> getApplicableFlavors(boolean addPlatformIndependent) {
     List<PythonSdkFlavor> result = new ArrayList<PythonSdkFlavor>();
 
     if (SystemInfo.isWindows) {
@@ -84,7 +88,8 @@
       result.add(UnixPythonSdkFlavor.INSTANCE);
     }
 
-    result.addAll(getPlatformIndependentFlavors());
+    if (addPlatformIndependent)
+      result.addAll(getPlatformIndependentFlavors());
 
     return result;
   }
diff --git a/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java
index c28587c..2440661 100644
--- a/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java
+++ b/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java
@@ -16,6 +16,7 @@
 package com.jetbrains.python.sdk.flavors;
 
 import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VFileProperty;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
 
@@ -47,14 +48,15 @@
       if (rootDir instanceof NewVirtualFile) {
         ((NewVirtualFile)rootDir).markDirty();
       }
-      rootDir.refresh(false, false);
+      rootDir.refresh(true, false);
       VirtualFile[] suspects = rootDir.getChildren();
       for (VirtualFile child : suspects) {
         if (!child.isDirectory()) {
           final String childName = child.getName();
           for (String name : NAMES) {
             if (childName.startsWith(name)) {
-              if (!childName.endsWith("-config") && !childName.startsWith("pythonw")) {
+              if (!childName.endsWith("-config") && !childName.startsWith("pythonw") &&
+                  !childName.endsWith("m") && !child.is(VFileProperty.SYMLINK)) {
                 candidates.add(child.getPath());
               }
               break;
diff --git a/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java
index 5bdecd7..b9de2e2 100644
--- a/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java
+++ b/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java
@@ -83,7 +83,7 @@
   public static Collection<String> findInDirectory(VirtualFile rootDir) {
     List<String> candidates = new ArrayList<String>();
     if (rootDir != null) {
-      rootDir.refresh(false, false);
+      rootDir.refresh(true, false);
       VirtualFile[] suspects = rootDir.getChildren();
       for (VirtualFile child : suspects) {
         if (child.isDirectory()) {
diff --git a/python/src/com/jetbrains/python/validation/PyMultiplePsiFilesVisitorFilter.java b/python/src/com/jetbrains/python/validation/PyMultiplePsiFilesVisitorFilter.java
new file mode 100644
index 0000000..9b6e6b7
--- /dev/null
+++ b/python/src/com/jetbrains/python/validation/PyMultiplePsiFilesVisitorFilter.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.validation;
+
+import com.intellij.psi.MultiplePsiFilesPerDocumentFileViewProvider;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.python.inspections.PythonVisitorFilter;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author vlan
+ */
+public class PyMultiplePsiFilesVisitorFilter implements PythonVisitorFilter {
+  @Override
+  public boolean isSupported(@NotNull Class visitorClass, @NotNull PsiFile file) {
+    if (visitorClass == StringLiteralQuotesAnnotator.class &&
+        file.getViewProvider() instanceof MultiplePsiFilesPerDocumentFileViewProvider) {
+      return false;
+    }
+    return true;
+  }
+}
diff --git a/python/src/com/jetbrains/python/vp/Creator.java b/python/src/com/jetbrains/python/vp/Creator.java
new file mode 100644
index 0000000..3d5bffe
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/Creator.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.vp;
+
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Creates view and presenter allowing them to have links to each other.
+ * Implement it and pass to {@link com.jetbrains.python.vp.ViewPresenterUtils#linkViewWithPresenterAndLaunch(Class, Class, Creator)}
+ *
+ * @author Ilya.Kazakevich
+ * @param <V> view interface
+ * @param <P> presenter interface
+ */
+public interface Creator<V, P extends Presenter> {
+
+  /**
+   * Create presenter
+   *
+   * @param view for that presenter
+   * @return presenter
+   */
+  @NotNull
+  P createPresenter(@NotNull V view);
+
+  /**
+   * Creates view
+   *
+   * @param presenter for this view
+   * @return view
+   */
+  @NotNull
+  V createView(@NotNull P presenter);
+
+}
diff --git a/python/src/com/jetbrains/python/vp/Presenter.java b/python/src/com/jetbrains/python/vp/Presenter.java
new file mode 100644
index 0000000..251aff6
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/Presenter.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.vp;
+
+
+/**
+ * Interface each presenter should implement
+ * @author Ilya.Kazakevich
+ */
+public interface Presenter {
+  /**
+   * Launches dialog. Presenter should fetch data and start view.
+   * TODO: Say you run initand show and launch
+   */
+  void launch();
+}
diff --git a/python/src/com/jetbrains/python/vp/PresenterHandler.java b/python/src/com/jetbrains/python/vp/PresenterHandler.java
new file mode 100644
index 0000000..e610604
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/PresenterHandler.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.vp;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+/**
+ * Wrapper for presenter.
+ * @author Ilya.Kazakevich
+ * @param <C> presenter class
+ */
+class PresenterHandler<C> implements InvocationHandler {
+  /**
+   * Presenter, created by user with {@link com.jetbrains.python.vp.Creator#createPresenter(Object)}
+   */
+  private C realPresenter;
+
+  void setRealPresenter(@NotNull C realPresenter) {
+    this.realPresenter = realPresenter;
+  }
+
+  @Override
+  public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable {
+    /**
+     * TODO: Implement async call.
+     * The idea is void methods marked with @Async should be called in background thread.
+     * That will allow presenter to be agnostic about EDT
+     */
+    return method.invoke(realPresenter, args);
+  }
+}
diff --git a/python/src/com/jetbrains/python/vp/ViewHandler.java b/python/src/com/jetbrains/python/vp/ViewHandler.java
new file mode 100644
index 0000000..84e9963
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/ViewHandler.java
@@ -0,0 +1,87 @@
+/*
+ * 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.jetbrains.python.vp;
+
+import com.google.common.base.Preconditions;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.ModalityState;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Wrapper for view.
+ * @author Ilya.Kazakevich
+ * @param <C> view class
+ */
+class ViewHandler<C> implements InvocationHandler {
+  /**
+   * Real view, created by user using {@link com.jetbrains.python.vp.Creator#createView(Presenter)}
+   */
+  private C realView;
+
+  public void setRealView(@NotNull C realView) {
+    this.realView = realView;
+  }
+
+  @Override
+  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+    Preconditions.checkState(realView != null, "Real view not set");
+    Invoker invoker = new Invoker(realView, method, args);
+    ApplicationManager.getApplication().invokeAndWait(invoker, ModalityState.defaultModalityState());
+    if (invoker.exception != null) {
+      throw invoker.exception;
+    }
+    return invoker.result;
+  }
+
+  /**
+   * Class that invokes view methods in appropriate thread
+   */
+  private static class Invoker implements Runnable {
+    @NotNull
+    private final Method method;
+    @Nullable
+    private final Object[] args;
+    @NotNull
+    private final Object target;
+
+    private InvocationTargetException exception;
+    private Object result;
+
+    private Invoker(@NotNull Object target, @NotNull Method method, @Nullable Object[] args) {
+      this.target = target;
+      this.method = method;
+      this.args = args;
+    }
+
+    @Override
+    public void run() {
+      try {
+        result = method.invoke(target, args);
+      }
+      catch (IllegalAccessException e) {
+        throw new IllegalStateException("Method is unaccessible: " + method, e);
+      }
+      catch (InvocationTargetException e) {
+        exception = e;
+      }
+    }
+  }
+}
diff --git a/python/src/com/jetbrains/python/vp/ViewPresenterUtils.java b/python/src/com/jetbrains/python/vp/ViewPresenterUtils.java
new file mode 100644
index 0000000..cfd9677
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/ViewPresenterUtils.java
@@ -0,0 +1,69 @@
+/*
+ * 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.jetbrains.python.vp;
+
+
+import com.google.common.base.Preconditions;
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+
+/**
+ * Entry point to package. Use {@link #linkViewWithPresenterAndLaunch(Class, Class, Creator)}
+ * @author Ilya.Kazakevich
+ */
+public final class ViewPresenterUtils {
+  private ViewPresenterUtils() {
+  }
+
+  /**
+   * TODO: Write about do not call anything in constructor
+   * Creates link between view and presenter and launches them using {@link Presenter#launch()}. Be sure to read package info first.
+   *
+   * @param presenterInterface presenter interface
+   * @param viewInterface      view interface
+   * @param creator            class that handles presenter and view instances actual creation
+   * @param <V>                view interface
+   * @param <P>                presenter interface
+   */
+  public static <V, P extends Presenter> void linkViewWithPresenterAndLaunch(@NotNull Class<P> presenterInterface,
+                                                                             @NotNull Class<V> viewInterface,
+                                                                             @NotNull Creator<V, P> creator) {
+    Preconditions.checkArgument(presenterInterface.isInterface(), "Presenter is not interface");
+    Preconditions.checkArgument(viewInterface.isInterface(), "View is not interface");
+
+    //TODO: Use cglib?
+    PresenterHandler<P> presenterHandler = new PresenterHandler<P>();
+    ViewHandler<V> viewHandler = new ViewHandler<V>();
+    V viewProxy = createProxy(viewInterface, viewHandler);
+    P presenterProxy = createProxy(presenterInterface, presenterHandler);
+
+    V realView = creator.createView(presenterProxy);
+    viewHandler.setRealView(realView);
+    P realPresenter = creator.createPresenter(viewProxy);
+    presenterHandler.setRealPresenter(realPresenter);
+    realPresenter.launch();
+  }
+
+
+  @SuppressWarnings("unchecked") //Proxy always returns correct class
+  private static <C> C createProxy(Class<C> clazz, InvocationHandler handler) {
+    assert clazz != null;
+    assert handler != null;
+    return (C)Proxy.newProxyInstance(ViewPresenterUtils.class.getClassLoader(), new Class[]{clazz}, handler);
+  }
+}
diff --git a/python/src/com/jetbrains/python/vp/package-info.java b/python/src/com/jetbrains/python/vp/package-info.java
new file mode 100644
index 0000000..834ca29
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/package-info.java
@@ -0,0 +1,26 @@
+/**
+ * <h1>Model-view presenter package</h1>
+ * <h2>How to use?</h2>
+ * <p>
+ *   <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter">MVP</a> pattern implementation with only view and presenter for now.
+ * <dl>
+ *  <dt>Presenter</dt>
+ *  <dd>Handles all business logic and has <strong>no</strong> references to awt/swing, so it is 100% testable</dd>
+ *  <dt>View</dt>
+ *  <dd>Handles only view: it may import any swing/awt packages but should contain almost no logic, because it is untestable.</dd>
+ *  </dl>
+ *  One implements <strong>Presenter</strong> and <strong>View</strong>. Both may have links to each other.
+ *  You run {@link com.jetbrains.python.vp.ViewPresenterUtils#linkViewWithPresenterAndLaunch(Class, Class, Creator)} to link and launch them.
+ *  See its javadoc
+ * </p>
+ * <h2>Threading issues</h2>
+ *
+ * <p>
+ *   Presenter and View should be thread-agnostic.
+ *   Any call to <strong>view</strong> is invoked in EDT automatically. <br/>
+ *   Call to <strong>presenter</strong> may be invoked in background (not implemented yet, see {@link com.jetbrains.python.vp.PresenterHandler})
+ * </p>
+ *
+ * @author Ilya.Kazakevich
+ */
+package com.jetbrains.python.vp;
\ No newline at end of file
diff --git a/python/src/icons/PythonIcons.java b/python/src/icons/PythonIcons.java
index c942e0c..a65d468 100644
--- a/python/src/icons/PythonIcons.java
+++ b/python/src/icons/PythonIcons.java
@@ -32,6 +32,7 @@
 
     }
     public static final Icon Dotnet = load("/icons/com/jetbrains/python/dotnet.png"); // 16x16
+    public static final Icon InterpreterGear = load("/icons/com/jetbrains/python/interpreterGear.png"); // 16x16
     public static final Icon Jython = load("/icons/com/jetbrains/python/jython.png"); // 16x16
     
     public static class Nodes {
@@ -48,6 +49,7 @@
     public static final Icon Python_24 = load("/icons/com/jetbrains/python/python_24.png"); // 24x24
     public static final Icon PythonClosed = load("/icons/com/jetbrains/python/pythonClosed.png"); // 16x16
     public static final Icon PythonTests = load("/icons/com/jetbrains/python/pythonTests.png"); // 16x16
+    public static final Icon Skeleton = load("/icons/com/jetbrains/python/skeleton.png"); // 16x16
     public static final Icon Virtualenv = load("/icons/com/jetbrains/python/virtualenv.png"); // 16x16
 
   }
