@Override
  public PsiClass doMoveClass(@NotNull PsiClass aClass, @NotNull PsiDirectory moveDestination) throws IncorrectOperationException {
    if (!aClass.getLanguage().equals(GroovyLanguage.INSTANCE)) return null;
    PsiFile file = aClass.getContainingFile();
    if (!(file instanceof GroovyFile)) return null;

    final PsiPackage newPackage = JavaDirectoryService.getInstance().getPackage(moveDestination);
    LOG.assertTrue(newPackage != null);

    PsiClass newClass = null;

    final String newPackageName = newPackage.getQualifiedName();
    if (aClass instanceof GroovyScriptClass) {
      final PsiClass[] classes = ((GroovyFile)file).getClasses();
      if (classes.length == 1) {
        if (!moveDestination.equals(file.getContainingDirectory())) {
          Project project = file.getProject();
          MoveFilesOrDirectoriesUtil.doMoveFile(file, moveDestination);

          DumbService.getInstance(project).completeJustSubmittedTasks();

          file = moveDestination.findFile(file.getName());
          assert file != null;
          ((PsiClassOwner)file).setPackageName(newPackageName);
        }
        return ((GroovyFile)file).getScriptClass();
      }
      //script class is moved the first from the file due to MoveClassOrPackageProcessor:88 (element sort)
      correctSelfReferences(aClass, newPackage);
      final GroovyFile newFile = generateNewScript((GroovyFile)file, newPackage);

      for (PsiElement child : file.getChildren()) {
        if (!(child instanceof GrTopStatement || child instanceof PsiComment)) continue;
        if (child instanceof PsiClass || child instanceof GrImportStatement || child instanceof GrPackageDefinition) continue;
        if (child instanceof GrDocComment) {
          final GrDocCommentOwner owner = GrDocCommentUtil.findDocOwner((GrDocComment)child);
          if (owner instanceof PsiClass) continue;
        }
        child.delete();
      }


      if (!moveDestination.equals(file.getContainingDirectory())) {
        moveDestination.add(newFile);

        //aClass.getManager().moveFile(newFile, moveDestination);
      }
      newClass = newFile.getClasses()[0];
      correctOldClassReferences(newClass, aClass);
    }
    else {
      if (!moveDestination.equals(file.getContainingDirectory()) && moveDestination.findFile(file.getName()) != null) {
        // moving second of two classes which were in the same file to a different directory (IDEADEV-3089)
        correctSelfReferences(aClass, newPackage);
        PsiFile newFile = moveDestination.findFile(file.getName());
        final FileASTNode fileNode = newFile.getNode();
        fileNode.addChild(Factory.createSingleLeafElement(GroovyTokenTypes.mNLS, "\n\n", 0, 2, null, aClass.getManager()));
        final PsiDocComment docComment = aClass.getDocComment();
        if (docComment != null) {
          newFile.add(docComment);
          fileNode.addChild(Factory.createSingleLeafElement(GroovyTokenTypes.mNLS, "\n", 0, 1, null, aClass.getManager()));
        }
        newClass = (GrTypeDefinition)newFile.add(aClass);
        correctOldClassReferences(newClass, aClass);
        aClass.delete();
      }
      else if (((GroovyFile)file).getClasses().length > 1) {
        correctSelfReferences(aClass, newPackage);
        Project project = aClass.getProject();
        PsiFileFactory fileFactory = PsiFileFactory.getInstance(project);
        GroovyFile newFile = (GroovyFile)moveDestination.add(fileFactory.createFileFromText(
          aClass.getName() + "." + GroovyFileType.DEFAULT_EXTENSION,
          GroovyLanguage.INSTANCE,
          "class XXX {}"
        ));
        final PsiClass created = newFile.getClasses()[0];
        PsiDocComment docComment = aClass.getDocComment();
        if (docComment != null) {
          newFile.addBefore(docComment, created);
          docComment.delete();
        }
        newClass = (PsiClass)created.replace(aClass);
        setPackageDefinition((GroovyFile)file, newFile, newPackageName);
        correctOldClassReferences(newClass, aClass);
        aClass.delete();
      }
    }
    return newClass;
  }
@Override
  public PsiClass doMoveClass(@NotNull PsiClass aClass, @NotNull PsiDirectory moveDestination)