[scala-2.10] 51/61: Imported Upstream version 2.11.8

Emmanuel Bourg ebourg-guest at moszumanska.debian.org
Tue Nov 15 12:44:14 UTC 2016


This is an automated email from the git hooks/post-receive script.

ebourg-guest pushed a commit to branch scala-2.11
in repository scala-2.10.

commit aacf8f7f942858a0f9a1603e4aaeb77dd845aae0
Author: Emmanuel Bourg <ebourg at apache.org>
Date:   Mon Aug 1 15:15:33 2016 +0200

    Imported Upstream version 2.11.8
---
 .gitattributes                                     |   30 +-
 .gitignore                                         |    9 +
 .travis.yml                                        |    7 +-
 CONTRIBUTING.md                                    |  102 +-
 Gemfile                                            |    4 +-
 README.md                                          |  133 +-
 bincompat-backward.whitelist.conf                  |    9 +
 bincompat-forward.whitelist.conf                   |   62 +
 build-ant-macros.xml                               |    7 +-
 build.number                                       |   12 +-
 build.sbt                                          |  853 +++++
 build.xml                                          |  149 +-
 compare-build-dirs-ignore-patterns                 |    8 +
 compare-build-dirs.sh                              |    5 +
 doc/LICENSE.md                                     |    4 +-
 doc/License.rtf                                    |    4 +-
 docs/TODO                                          |    2 +-
 project/JarJar.scala                               |   92 +
 project/Osgi.scala                                 |   69 +
 project/ParserUtil.scala                           |   52 +
 project/PartestUtil.scala                          |   92 +
 project/ScalaOptionParser.scala                    |  129 +
 project/ScalaTool.scala                            |   51 +
 project/ScriptCommands.scala                       |   19 +
 project/VersionUtil.scala                          |  126 +
 project/build.properties                           |    1 +
 project/plugins.sbt                                |    5 +
 scripts/common                                     |    3 +
 scripts/jobs/integrate/bootstrap                   |  360 +-
 scripts/jobs/integrate/ide                         |    2 +-
 scripts/jobs/integrate/windows                     |   15 +
 scripts/jobs/validate/publish-core                 |   13 +-
 scripts/jobs/validate/test                         |    2 +-
 scripts/repositories-scala-release                 |    7 -
 spec/01-lexical-syntax.md                          |  362 +-
 spec/02-identifiers-names-and-scopes.md            |    4 +-
 spec/03-types.md                                   |   26 +-
 spec/04-basic-declarations-and-definitions.md      |   36 +-
 spec/05-classes-and-objects.md                     |   62 +-
 spec/06-expressions.md                             |   26 +-
 spec/07-implicit-parameters-and-views.md           |  432 ---
 spec/07-implicits.md                               |  442 +++
 spec/08-pattern-matching.md                        |    8 +-
 spec/09-top-level-definitions.md                   |    2 +-
 spec/10-xml-expressions-and-patterns.md            |    2 +-
 spec/11-annotations.md                             |  174 +
 spec/11-user-defined-annotations.md                |  163 -
 spec/12-the-scala-standard-library.md              |   12 +-
 spec/13-syntax-summary.md                          |    6 +-
 spec/15-changelog.md                               |  847 +++++
 spec/README.md                                     |    2 +-
 spec/_config.yml                                   |    2 -
 spec/_includes/numbering.css                       |    2 -
 spec/_layouts/default.yml                          |   72 +-
 spec/_layouts/toc.yml                              |   26 +-
 spec/index.md                                      |   21 +-
 spec/public/fonts/Heuristica-Bold.woff             |  Bin 0 -> 106188 bytes
 spec/public/fonts/Heuristica-BoldItalic.woff       |  Bin 0 -> 104316 bytes
 spec/public/fonts/Heuristica-Regular.woff          |  Bin 0 -> 141416 bytes
 spec/public/fonts/Heuristica-RegularItalic.woff    |  Bin 0 -> 104700 bytes
 spec/public/fonts/LuxiMono-Bold.woff               |  Bin 0 -> 26560 bytes
 spec/public/fonts/LuxiMono-BoldOblique.woff        |  Bin 0 -> 29480 bytes
 spec/public/fonts/LuxiMono-Regular.woff            |  Bin 0 -> 26432 bytes
 spec/public/fonts/LuxiMono-RegularOblique.woff     |  Bin 0 -> 29300 bytes
 spec/public/fonts/LuxiSans-Bold.woff               |  Bin 0 -> 13592 bytes
 spec/public/fonts/LuxiSans-Regular.woff            |  Bin 0 -> 13568 bytes
 spec/public/highlight/LICENSE                      |   24 -
 spec/public/images/github-logo at 2x.png              |  Bin 0 -> 1753 bytes
 spec/public/images/scala-logo-red-spiral-dark.png  |  Bin 13021 -> 0 bytes
 spec/public/images/scala-spiral-white.png          |  Bin 0 -> 1442 bytes
 spec/public/scripts/LICENSE-highlight              |   24 +
 spec/public/scripts/LICENSE-toc                    |   18 +
 spec/public/scripts/main.js                        |   57 +
 spec/public/scripts/navigation.js                  |   70 -
 spec/public/scripts/toc.js                         |  128 +
 spec/public/stylesheets/fonts.css                  |   73 +
 spec/public/stylesheets/screen-small.css           |   57 +
 spec/public/stylesheets/screen-toc.css             |   37 +
 spec/public/stylesheets/screen.css                 |  225 +-
 src/actors/scala/actors/Future.scala               |    2 +-
 src/asm/README                                     |   30 -
 src/asm/scala/tools/asm/AnnotationVisitor.java     |  169 -
 src/asm/scala/tools/asm/AnnotationWriter.java      |  371 ---
 src/asm/scala/tools/asm/Attribute.java             |  255 --
 src/asm/scala/tools/asm/ByteVector.java            |  339 --
 src/asm/scala/tools/asm/ClassReader.java           | 2496 --------------
 src/asm/scala/tools/asm/ClassVisitor.java          |  320 --
 src/asm/scala/tools/asm/ClassWriter.java           | 1785 ----------
 src/asm/scala/tools/asm/Context.java               |  145 -
 src/asm/scala/tools/asm/CustomAttr.java            |   20 -
 src/asm/scala/tools/asm/Edge.java                  |   75 -
 src/asm/scala/tools/asm/FieldVisitor.java          |  150 -
 src/asm/scala/tools/asm/FieldWriter.java           |  329 --
 src/asm/scala/tools/asm/Frame.java                 | 1462 --------
 src/asm/scala/tools/asm/Handle.java                |  170 -
 src/asm/scala/tools/asm/Handler.java               |  121 -
 src/asm/scala/tools/asm/Item.java                  |  312 --
 src/asm/scala/tools/asm/Label.java                 |  560 ----
 src/asm/scala/tools/asm/MethodVisitor.java         |  880 -----
 src/asm/scala/tools/asm/MethodWriter.java          | 2924 ----------------
 src/asm/scala/tools/asm/Opcodes.java               |  361 --
 src/asm/scala/tools/asm/Type.java                  |  896 -----
 src/asm/scala/tools/asm/TypePath.java              |  193 --
 src/asm/scala/tools/asm/TypeReference.java         |  452 ---
 .../scala/tools/asm/signature/SignatureReader.java |  228 --
 .../tools/asm/signature/SignatureVisitor.java      |  238 --
 .../scala/tools/asm/signature/SignatureWriter.java |  227 --
 src/asm/scala/tools/asm/tree/AbstractInsnNode.java |  326 --
 src/asm/scala/tools/asm/tree/AnnotationNode.java   |  231 --
 src/asm/scala/tools/asm/tree/ClassNode.java        |  417 ---
 src/asm/scala/tools/asm/tree/FieldInsnNode.java    |  110 -
 src/asm/scala/tools/asm/tree/FieldNode.java        |  307 --
 src/asm/scala/tools/asm/tree/FrameNode.java        |  210 --
 src/asm/scala/tools/asm/tree/IincInsnNode.java     |   83 -
 src/asm/scala/tools/asm/tree/InnerClassNode.java   |  101 -
 src/asm/scala/tools/asm/tree/InsnList.java         |  622 ----
 src/asm/scala/tools/asm/tree/InsnNode.java         |   88 -
 src/asm/scala/tools/asm/tree/IntInsnNode.java      |   88 -
 .../tools/asm/tree/InvokeDynamicInsnNode.java      |  102 -
 src/asm/scala/tools/asm/tree/JumpInsnNode.java     |   97 -
 src/asm/scala/tools/asm/tree/LabelNode.java        |   78 -
 src/asm/scala/tools/asm/tree/LdcInsnNode.java      |   79 -
 src/asm/scala/tools/asm/tree/LineNumberNode.java   |   84 -
 .../asm/tree/LocalVariableAnnotationNode.java      |  157 -
 .../scala/tools/asm/tree/LocalVariableNode.java    |  112 -
 .../scala/tools/asm/tree/LookupSwitchInsnNode.java |  118 -
 src/asm/scala/tools/asm/tree/MethodInsnNode.java   |  140 -
 src/asm/scala/tools/asm/tree/MethodNode.java       |  839 -----
 .../tools/asm/tree/MultiANewArrayInsnNode.java     |   84 -
 src/asm/scala/tools/asm/tree/ParameterNode.java    |   76 -
 .../scala/tools/asm/tree/TableSwitchInsnNode.java  |  114 -
 .../scala/tools/asm/tree/TryCatchBlockNode.java    |  153 -
 .../scala/tools/asm/tree/TypeAnnotationNode.java   |  100 -
 src/asm/scala/tools/asm/tree/TypeInsnNode.java     |   91 -
 src/asm/scala/tools/asm/tree/VarInsnNode.java      |   94 -
 .../scala/tools/asm/tree/analysis/Analyzer.java    |  549 ---
 .../tools/asm/tree/analysis/AnalyzerException.java |   62 -
 .../tools/asm/tree/analysis/BasicInterpreter.java  |  358 --
 .../scala/tools/asm/tree/analysis/BasicValue.java  |  111 -
 .../tools/asm/tree/analysis/BasicVerifier.java     |  433 ---
 src/asm/scala/tools/asm/tree/analysis/Frame.java   |  738 -----
 .../scala/tools/asm/tree/analysis/Interpreter.java |  226 --
 .../tools/asm/tree/analysis/SimpleVerifier.java    |  320 --
 .../scala/tools/asm/tree/analysis/SmallSet.java    |  134 -
 .../tools/asm/tree/analysis/SourceInterpreter.java |  198 --
 .../scala/tools/asm/tree/analysis/SourceValue.java |   97 -
 .../scala/tools/asm/tree/analysis/Subroutine.java  |   90 -
 src/asm/scala/tools/asm/tree/analysis/Value.java   |   45 -
 src/asm/scala/tools/asm/util/ASMifiable.java       |   56 -
 src/asm/scala/tools/asm/util/ASMifier.java         | 1284 -------
 .../tools/asm/util/CheckAnnotationAdapter.java     |  136 -
 .../scala/tools/asm/util/CheckClassAdapter.java    | 1009 ------
 .../scala/tools/asm/util/CheckFieldAdapter.java    |  122 -
 .../scala/tools/asm/util/CheckMethodAdapter.java   | 1542 ---------
 .../tools/asm/util/CheckSignatureAdapter.java      |  330 --
 src/asm/scala/tools/asm/util/Printer.java          |  589 ----
 src/asm/scala/tools/asm/util/Textifiable.java      |   56 -
 src/asm/scala/tools/asm/util/Textifier.java        | 1459 --------
 .../tools/asm/util/TraceAnnotationVisitor.java     |   89 -
 .../scala/tools/asm/util/TraceClassVisitor.java    |  220 --
 .../scala/tools/asm/util/TraceFieldVisitor.java    |   87 -
 .../scala/tools/asm/util/TraceMethodVisitor.java   |  292 --
 .../tools/asm/util/TraceSignatureVisitor.java      |  317 --
 src/build/InnerObjectTestGen.scala                 |    2 +-
 src/build/genprod.scala                            |   16 +-
 src/build/maven/scala-actors-pom.xml               |    4 +-
 src/build/maven/scala-compiler-doc-pom.xml         |    4 +-
 src/build/maven/scala-compiler-interactive-pom.xml |    4 +-
 src/build/maven/scala-compiler-pom.xml             |    4 +-
 src/build/maven/scala-dist-pom.xml                 |    4 +-
 src/build/maven/scala-library-all-pom.xml          |    4 +-
 src/build/maven/scala-library-pom.xml              |    4 +-
 src/build/maven/scala-reflect-pom.xml              |    4 +-
 src/build/maven/scalap-pom.xml                     |    4 +-
 src/compiler/scala/reflect/quasiquotes/Holes.scala |    6 +-
 .../scala/reflect/quasiquotes/Parsers.scala        |    4 +
 .../scala/reflect/quasiquotes/Reifiers.scala       |    6 +-
 .../scala/reflect/reify/codegen/GenSymbols.scala   |    2 +-
 .../scala/reflect/reify/codegen/GenTrees.scala     |    4 +-
 .../scala/reflect/reify/codegen/GenUtils.scala     |    8 +-
 src/compiler/scala/tools/ant/FastScalac.scala      |    2 +-
 src/compiler/scala/tools/ant/Scalac.scala          |    2 +-
 src/compiler/scala/tools/ant/sabbus/Compiler.scala |    2 +-
 .../scala/tools/ant/sabbus/ScalacFork.scala        |    2 +-
 .../scala/tools/ant/templates/tool-unix.tmpl       |   23 +-
 src/compiler/scala/tools/nsc/EvalLoop.scala        |    3 +-
 .../scala/tools/nsc/GenericRunnerCommand.scala     |    9 +-
 src/compiler/scala/tools/nsc/Global.scala          |   35 +-
 src/compiler/scala/tools/nsc/ObjectRunner.scala    |    2 +-
 src/compiler/scala/tools/nsc/PhaseAssembly.scala   |    4 +-
 src/compiler/scala/tools/nsc/Properties.scala      |   10 +-
 src/compiler/scala/tools/nsc/Reporting.scala       |   14 +-
 src/compiler/scala/tools/nsc/ScriptRunner.scala    |   12 +-
 src/compiler/scala/tools/nsc/ast/DocComments.scala |    6 +-
 .../scala/tools/nsc/ast/NodePrinters.scala         |    1 +
 src/compiler/scala/tools/nsc/ast/TreeGen.scala     |    4 +-
 src/compiler/scala/tools/nsc/ast/Trees.scala       |    4 +-
 .../scala/tools/nsc/ast/parser/MarkupParsers.scala |  129 +-
 .../scala/tools/nsc/ast/parser/Parsers.scala       |   83 +-
 .../scala/tools/nsc/ast/parser/Scanners.scala      |    2 +-
 .../tools/nsc/ast/parser/SymbolicXMLBuilder.scala  |   25 +-
 .../scala/tools/nsc/ast/parser/TreeBuilder.scala   |   32 -
 .../scala/tools/nsc/ast/parser/xml/Utility.scala   |    0
 .../scala/tools/nsc/backend/icode/GenICode.scala   |   29 +-
 .../tools/nsc/backend/icode/ICodeCheckers.scala    |   10 +-
 .../scala/tools/nsc/backend/icode/Opcodes.scala    |    2 +-
 .../backend/icode/analysis/TypeFlowAnalysis.scala  |    4 +-
 .../scala/tools/nsc/backend/jvm/AsmUtils.scala     |   39 +-
 .../tools/nsc/backend/jvm/BCodeAsmCommon.scala     |  174 +-
 .../tools/nsc/backend/jvm/BCodeBodyBuilder.scala   |  107 +-
 .../scala/tools/nsc/backend/jvm/BCodeHelpers.scala |  211 +-
 .../tools/nsc/backend/jvm/BCodeIdiomatic.scala     |   47 +-
 .../tools/nsc/backend/jvm/BCodeSkelBuilder.scala   |   46 +-
 .../scala/tools/nsc/backend/jvm/BTypes.scala       |  399 ++-
 .../tools/nsc/backend/jvm/BTypesFromSymbols.scala  |  235 +-
 .../tools/nsc/backend/jvm/BackendReporting.scala   |  306 ++
 .../scala/tools/nsc/backend/jvm/CoreBTypes.scala   |    9 +-
 .../scala/tools/nsc/backend/jvm/GenASM.scala       |   62 +-
 .../scala/tools/nsc/backend/jvm/GenBCode.scala     |   37 +-
 .../nsc/backend/jvm/analysis/AliasingFrame.scala   |  251 ++
 .../jvm/analysis/InstructionStackEffect.scala      |  265 ++
 .../backend/jvm/analysis/NullnessAnalyzer.scala    |  282 ++
 .../backend/jvm/analysis/ProdConsAnalyzer.scala    |  478 +++
 .../nsc/backend/jvm/opt/ByteCodeRepository.scala   |  125 +-
 .../tools/nsc/backend/jvm/opt/BytecodeUtils.scala  |  219 +-
 .../tools/nsc/backend/jvm/opt/CallGraph.scala      |  317 ++
 .../nsc/backend/jvm/opt/ClosureOptimizer.scala     |  373 +++
 .../nsc/backend/jvm/opt/InlineInfoAttribute.scala  |  148 +
 .../scala/tools/nsc/backend/jvm/opt/Inliner.scala  |  775 +++++
 .../backend/jvm/opt/InstructionResultSize.scala    |  240 ++
 .../scala/tools/nsc/backend/jvm/opt/LocalOpt.scala |  122 +-
 .../nsc/backend/jvm/opt/OptimizerReporting.scala   |   24 -
 .../nsc/backend/opt/ConstantOptimization.scala     |   10 +-
 .../nsc/backend/opt/DeadCodeElimination.scala      |    6 +-
 .../nsc/backend/opt/InlineExceptionHandlers.scala  |    2 +-
 .../scala/tools/nsc/backend/opt/Inliners.scala     |    2 +-
 .../nsc/classpath/ZipAndJarFileLookupFactory.scala |    2 +-
 src/compiler/scala/tools/nsc/io/Jar.scala          |    2 +-
 .../scala/tools/nsc/javac/JavaParsers.scala        |   41 +-
 src/compiler/scala/tools/nsc/plugins/Plugin.scala  |    8 +-
 .../scala/tools/nsc/reporters/Reporter.scala       |    2 +-
 .../scala/tools/nsc/settings/ScalaSettings.scala   |   87 +-
 .../scala/tools/nsc/settings/Warnings.scala        |    4 +-
 .../scala/tools/nsc/symtab/SymbolLoaders.scala     |    5 +-
 .../nsc/symtab/classfile/ClassfileParser.scala     |   58 +-
 .../tools/nsc/symtab/classfile/ICodeReader.scala   |   10 +-
 .../scala/tools/nsc/transform/AddInterfaces.scala  |    6 +-
 .../scala/tools/nsc/transform/Constructors.scala   |    7 +-
 .../scala/tools/nsc/transform/Delambdafy.scala     |  295 +-
 .../scala/tools/nsc/transform/Erasure.scala        |   15 +-
 .../scala/tools/nsc/transform/ExplicitOuter.scala  |    2 +-
 .../scala/tools/nsc/transform/LambdaLift.scala     |   14 +-
 .../scala/tools/nsc/transform/LazyVals.scala       |    4 +-
 src/compiler/scala/tools/nsc/transform/Mixin.scala |   28 +-
 .../tools/nsc/transform/SampleTransform.scala      |    2 +-
 .../tools/nsc/transform/SpecializeTypes.scala      |   29 +-
 .../scala/tools/nsc/transform/UnCurry.scala        |   77 +-
 .../scala/tools/nsc/transform/patmat/Logic.scala   |   70 +-
 .../tools/nsc/transform/patmat/MatchAnalysis.scala |  199 +-
 .../tools/nsc/transform/patmat/MatchCodeGen.scala  |    2 +-
 .../nsc/transform/patmat/MatchOptimization.scala   |    6 +-
 .../nsc/transform/patmat/MatchTranslation.scala    |   20 +-
 .../nsc/transform/patmat/MatchTreeMaking.scala     |    4 +-
 .../tools/nsc/transform/patmat/MatchWarnings.scala |    2 +-
 .../nsc/transform/patmat/PatternExpander.scala     |   18 +-
 .../transform/patmat/ScalacPatternExpanders.scala  |   56 +-
 .../scala/tools/nsc/transform/patmat/Solving.scala |  153 +-
 .../tools/nsc/typechecker/AnalyzerPlugins.scala    |    4 +-
 .../scala/tools/nsc/typechecker/Checkable.scala    |    2 +-
 .../tools/nsc/typechecker/ContextErrors.scala      |   39 +-
 .../scala/tools/nsc/typechecker/Contexts.scala     |   72 +-
 .../scala/tools/nsc/typechecker/Implicits.scala    |   34 +-
 .../scala/tools/nsc/typechecker/Infer.scala        |   13 +-
 .../scala/tools/nsc/typechecker/Macros.scala       |   16 +-
 .../tools/nsc/typechecker/MethodSynthesis.scala    |    7 +-
 .../scala/tools/nsc/typechecker/Namers.scala       |   19 +-
 .../tools/nsc/typechecker/PatternTypers.scala      |    8 +-
 .../scala/tools/nsc/typechecker/RefChecks.scala    |  101 +-
 .../tools/nsc/typechecker/StdAttachments.scala     |    2 +-
 .../tools/nsc/typechecker/SuperAccessors.scala     |    2 +-
 .../tools/nsc/typechecker/SyntheticMethods.scala   |    3 +-
 .../scala/tools/nsc/typechecker/Tags.scala         |    4 +-
 .../scala/tools/nsc/typechecker/TreeCheckers.scala |   15 +-
 .../tools/nsc/typechecker/TypeDiagnostics.scala    |   11 +-
 .../scala/tools/nsc/typechecker/Typers.scala       |   68 +-
 .../tools/nsc/typechecker/TypersTracking.scala     |    2 +-
 .../scala/tools/nsc/typechecker/Unapplies.scala    |    1 +
 src/compiler/scala/tools/nsc/util/ClassPath.scala  |    2 +-
 src/compiler/scala/tools/nsc/util/DocStrings.scala |    6 +-
 .../scala/tools/reflect/ReflectGlobal.scala        |   16 +
 .../scala/tools/reflect/ToolBoxFactory.scala       |    2 +-
 src/eclipse/README.md                              |   17 +-
 src/eclipse/asm/.classpath                         |    6 -
 src/eclipse/asm/.project                           |   29 -
 src/eclipse/interactive/.classpath                 |    1 +
 src/eclipse/interactive/.gitignore                 |    2 +
 src/eclipse/partest/.classpath                     |    4 +-
 src/eclipse/partest/.gitignore                     |    2 +
 src/eclipse/reflect/.gitignore                     |    2 +
 src/eclipse/repl/.classpath                        |   16 +-
 src/eclipse/repl/.gitignore                        |    2 +
 src/eclipse/scala-compiler/.classpath              |    2 +-
 src/eclipse/scala-compiler/.gitignore              |    2 +
 src/eclipse/scala-library/.gitignore               |    2 +
 src/eclipse/scaladoc/.classpath                    |    8 +-
 src/eclipse/scaladoc/.gitignore                    |    2 +
 src/eclipse/scalap/.gitignore                      |    2 +
 src/eclipse/test-junit/.classpath                  |    6 +-
 src/eclipse/test-junit/.gitignore                  |    2 +
 .../concurrent/forkjoin/ThreadLocalRandom.java     |    2 +-
 src/intellij-14/README                             |   12 -
 src/intellij-14/actors.iml.SAMPLE                  |   14 -
 src/intellij-14/asm.iml.SAMPLE                     |   12 -
 src/intellij-14/compiler.iml.SAMPLE                |   16 -
 src/intellij-14/diff.sh                            |    8 -
 src/intellij-14/forkjoin.iml.SAMPLE                |   11 -
 src/intellij-14/interactive.iml.SAMPLE             |   16 -
 src/intellij-14/library.iml.SAMPLE                 |   13 -
 src/intellij-14/manual.iml.SAMPLE                  |   15 -
 src/intellij-14/partest-extras.iml.SAMPLE          |   18 -
 src/intellij-14/partest-javaagent.iml.SAMPLE       |   13 -
 src/intellij-14/reflect.iml.SAMPLE                 |   13 -
 src/intellij-14/repl.iml.SAMPLE                    |   17 -
 src/intellij-14/scala.iml.SAMPLE                   |   11 -
 src/intellij-14/scala.ipr.SAMPLE                   |  261 --
 src/intellij-14/scaladoc.iml.SAMPLE                |   18 -
 src/intellij-14/scalap.iml.SAMPLE                  |   15 -
 src/intellij-14/setup.sh                           |   17 -
 src/intellij-14/test-junit.iml.SAMPLE              |   22 -
 src/intellij-14/test.iml.SAMPLE                    |   22 -
 src/intellij-14/update.sh                          |   22 -
 src/intellij/README                                |   12 -
 src/intellij/README.md                             |   13 +
 src/intellij/actors.iml.SAMPLE                     |   15 +-
 src/intellij/asm.iml.SAMPLE                        |    3 +-
 src/intellij/compiler.iml.SAMPLE                   |   18 +-
 src/intellij/forkjoin.iml.SAMPLE                   |    3 +-
 src/intellij/interactive.iml.SAMPLE                |   19 +-
 src/intellij/library.iml.SAMPLE                    |   17 +-
 src/intellij/manual.iml.SAMPLE                     |   17 +-
 src/intellij/partest-extras.iml.SAMPLE             |   17 +-
 src/intellij/partest-javaagent.iml.SAMPLE          |    5 +-
 src/intellij/reflect.iml.SAMPLE                    |   16 +-
 src/intellij/repl.iml.SAMPLE                       |   19 +-
 src/intellij/scala-build.iml.SAMPLE                |  109 +
 src/intellij/scala-lang.ipr.SAMPLE                 |  287 --
 src/intellij/scala.iml.SAMPLE                      |    3 +-
 src/intellij/scala.ipr.SAMPLE                      |  129 +
 src/intellij/scaladoc.iml.SAMPLE                   |   21 +-
 src/intellij/scalap.iml.SAMPLE                     |   17 +-
 src/intellij/setup.sh                              |    3 +
 src/intellij/test-junit.iml.SAMPLE                 |   21 +-
 src/intellij/test-osgi.iml.SAMPLE                  |   23 -
 src/intellij/test.iml.SAMPLE                       |   25 +-
 .../test/files/pos/virtpatmat_exhaust_big.scala    |   34 -
 .../tools/nsc/interactive/CompilerControl.scala    |   11 +-
 .../scala/tools/nsc/interactive/Global.scala       |  129 +-
 .../scala/tools/nsc/interactive/Lexer.scala        |    2 +-
 src/library-aux/scala/Any.scala                    |    4 +-
 src/library-aux/scala/AnyRef.scala                 |    4 +-
 src/library/scala/AnyVal.scala                     |    4 +-
 src/library/scala/Array.scala                      |    2 +-
 src/library/scala/Byte.scala                       |    8 +-
 src/library/scala/Char.scala                       |    8 +-
 src/library/scala/Equals.scala                     |    5 +-
 src/library/scala/Function0.scala                  |    8 +-
 src/library/scala/Function1.scala                  |    7 +-
 src/library/scala/Function2.scala                  |    6 -
 src/library/scala/Int.scala                        |    8 +-
 src/library/scala/Long.scala                       |    8 +-
 src/library/scala/Mutable.scala                    |    2 +-
 src/library/scala/Option.scala                     |    2 +-
 src/library/scala/Predef.scala                     |   17 +-
 src/library/scala/Product1.scala                   |    2 +-
 src/library/scala/Product10.scala                  |    2 +-
 src/library/scala/Product11.scala                  |    2 +-
 src/library/scala/Product12.scala                  |    2 +-
 src/library/scala/Product13.scala                  |    2 +-
 src/library/scala/Product14.scala                  |    2 +-
 src/library/scala/Product15.scala                  |    2 +-
 src/library/scala/Product16.scala                  |    2 +-
 src/library/scala/Product17.scala                  |    2 +-
 src/library/scala/Product18.scala                  |    2 +-
 src/library/scala/Product19.scala                  |    2 +-
 src/library/scala/Product2.scala                   |    2 +-
 src/library/scala/Product20.scala                  |    2 +-
 src/library/scala/Product21.scala                  |    2 +-
 src/library/scala/Product22.scala                  |    2 +-
 src/library/scala/Product3.scala                   |    2 +-
 src/library/scala/Product4.scala                   |    2 +-
 src/library/scala/Product5.scala                   |    2 +-
 src/library/scala/Product6.scala                   |    2 +-
 src/library/scala/Product7.scala                   |    2 +-
 src/library/scala/Product8.scala                   |    2 +-
 src/library/scala/Product9.scala                   |    2 +-
 src/library/scala/Short.scala                      |    8 +-
 src/library/scala/StringContext.scala              |    2 +-
 src/library/scala/annotation/switch.scala          |    3 +
 src/library/scala/collection/BitSetLike.scala      |    2 +-
 src/library/scala/collection/GenMapLike.scala      |    3 +-
 src/library/scala/collection/GenSeqLike.scala      |    3 +-
 .../scala/collection/GenTraversableLike.scala      |   20 +-
 .../scala/collection/GenTraversableOnce.scala      |  133 +-
 .../scala/collection/IndexedSeqOptimized.scala     |    0
 src/library/scala/collection/Iterator.scala        |  270 +-
 src/library/scala/collection/JavaConverters.scala  |    5 +-
 .../scala/collection/LinearSeqOptimized.scala      |   10 +-
 src/library/scala/collection/MapLike.scala         |    8 +-
 src/library/scala/collection/Searching.scala       |   12 +-
 src/library/scala/collection/SeqLike.scala         |   77 +-
 src/library/scala/collection/Traversable.scala     |    2 +-
 src/library/scala/collection/TraversableLike.scala |   51 +-
 src/library/scala/collection/TraversableOnce.scala |   37 +-
 .../scala/collection/TraversableProxyLike.scala    |    2 +-
 src/library/scala/collection/concurrent/Map.scala  |    2 +-
 .../scala/collection/convert/DecorateAsJava.scala  |   12 +-
 .../scala/collection/convert/Wrappers.scala        |   41 +-
 .../scala/collection/generic/FilterMonadic.scala   |    0
 .../scala/collection/generic/HasNewBuilder.scala   |    0
 .../generic/MutableSortedSetFactory.scala          |    2 +-
 src/library/scala/collection/generic/Sorted.scala  |    2 +-
 .../collection/generic/TraversableForwarder.scala  |    2 +-
 .../scala/collection/immutable/DefaultMap.scala    |    0
 .../scala/collection/immutable/HashMap.scala       |    4 +-
 .../scala/collection/immutable/HashSet.scala       |   14 +-
 .../scala/collection/immutable/IntMap.scala        |    4 +-
 src/library/scala/collection/immutable/List.scala  |   30 +-
 .../scala/collection/immutable/ListMap.scala       |    2 +-
 .../scala/collection/immutable/ListSet.scala       |    9 +-
 .../scala/collection/immutable/LongMap.scala       |    2 +-
 src/library/scala/collection/immutable/Map.scala   |    8 +-
 .../scala/collection/immutable/MapLike.scala       |    5 +
 .../scala/collection/immutable/NumericRange.scala  |   94 +-
 .../scala/collection/immutable/PagedSeq.scala      |    7 +-
 src/library/scala/collection/immutable/Queue.scala |    9 +-
 src/library/scala/collection/immutable/Range.scala |   31 +-
 .../scala/collection/immutable/RedBlackTree.scala  |    7 +-
 src/library/scala/collection/immutable/Set.scala   |  112 +-
 .../scala/collection/immutable/SortedMap.scala     |    6 +
 .../scala/collection/immutable/Stream.scala        |   45 +-
 .../scala/collection/immutable/StringLike.scala    |    4 +-
 .../scala/collection/immutable/StringOps.scala     |    7 +-
 .../scala/collection/immutable/TreeMap.scala       |    2 +-
 .../scala/collection/immutable/TreeSet.scala       |    2 +-
 .../scala/collection/immutable/Vector.scala        |   34 +-
 src/library/scala/collection/mutable/AVLTree.scala |    4 +-
 .../scala/collection/mutable/AnyRefMap.scala       |  116 +-
 .../scala/collection/mutable/ArraySeq.scala        |    2 +-
 .../scala/collection/mutable/ArrayStack.scala      |    2 +-
 src/library/scala/collection/mutable/HashMap.scala |    6 +-
 src/library/scala/collection/mutable/HashSet.scala |    2 +-
 .../scala/collection/mutable/HashTable.scala       |    2 +-
 .../collection/mutable/ImmutableSetAdaptor.scala   |    2 +-
 .../collection/mutable/IndexedSeqOptimized.scala   |    0
 .../scala/collection/mutable/LinkedListLike.scala  |    2 +-
 .../scala/collection/mutable/ListBuffer.scala      |    2 +-
 src/library/scala/collection/mutable/ListMap.scala |    2 +-
 src/library/scala/collection/mutable/LongMap.scala |  122 +-
 .../scala/collection/mutable/OpenHashMap.scala     |   19 +-
 .../scala/collection/mutable/PriorityQueue.scala   |   15 +-
 src/library/scala/collection/mutable/Queue.scala   |    2 +-
 src/library/scala/collection/mutable/SetLike.scala |    4 +-
 .../scala/collection/mutable/SynchronizedSet.scala |    2 +-
 .../scala/collection/mutable/UnrolledBuffer.scala  |   14 +-
 .../scala/collection/mutable/WrappedArray.scala    |    2 +-
 src/library/scala/collection/package.scala         |   41 +-
 .../collection/parallel/ParIterableLike.scala      |   19 +-
 .../scala/collection/parallel/ParMapLike.scala     |    8 +-
 .../readme-if-you-want-to-add-something.txt        |    0
 src/library/scala/compat/Platform.scala            |    2 +-
 src/library/scala/concurrent/Future.scala          |    4 +-
 src/library/scala/concurrent/JavaConversions.scala |    2 +-
 src/library/scala/concurrent/SyncVar.scala         |    2 +-
 .../scala/concurrent/duration/Duration.scala       |    9 +-
 .../scala/concurrent/impl/AbstractPromise.java     |   37 +-
 src/library/scala/io/Codec.scala                   |    4 +-
 src/library/scala/math/BigDecimal.scala            |    8 +-
 src/library/scala/math/Numeric.scala               |    6 +-
 src/library/scala/math/package.scala               |   12 +
 src/library/scala/ref/WeakReference.scala          |    5 +-
 .../reflect/ClassManifestDeprecatedApis.scala      |    4 +-
 src/library/scala/reflect/Manifest.scala           |    7 +-
 src/library/scala/reflect/NameTransformer.scala    |    0
 src/library/scala/reflect/ScalaLongSignature.java  |    2 +-
 src/library/scala/reflect/ScalaSignature.java      |    2 +-
 src/library/scala/runtime/BoxesRunTime.java        |    6 +-
 src/library/scala/runtime/ScalaRunTime.scala       |    2 +-
 src/library/scala/runtime/TraitSetter.java         |    0
 src/library/scala/runtime/Tuple2Zipped.scala       |    8 +-
 src/library/scala/runtime/Tuple3Zipped.scala       |    8 +-
 src/library/scala/runtime/VolatileBooleanRef.java  |    0
 src/library/scala/runtime/VolatileByteRef.java     |    0
 src/library/scala/runtime/VolatileCharRef.java     |    0
 src/library/scala/runtime/VolatileDoubleRef.java   |    0
 src/library/scala/runtime/VolatileFloatRef.java    |    0
 src/library/scala/runtime/VolatileIntRef.java      |    0
 src/library/scala/runtime/VolatileLongRef.java     |    0
 src/library/scala/runtime/VolatileObjectRef.java   |    0
 src/library/scala/runtime/VolatileShortRef.java    |    0
 src/library/scala/sys/BooleanProp.scala            |    8 +-
 src/library/scala/sys/Prop.scala                   |    4 +
 src/library/scala/sys/process/BasicIO.scala        |    2 +-
 src/library/scala/sys/process/Process.scala        |    8 +-
 src/library/scala/sys/process/ProcessLogger.scala  |    2 +-
 src/library/scala/sys/process/package.scala        |    3 +-
 src/library/scala/util/Either.scala                |   12 +-
 src/library/scala/util/MurmurHash.scala            |    2 +-
 src/library/scala/util/Properties.scala            |    4 +-
 src/library/scala/util/Sorting.scala               |  712 ++--
 src/library/scala/util/Try.scala                   |   11 +-
 src/library/scala/util/control/Exception.scala     |    4 +-
 src/library/scala/util/hashing/MurmurHash3.scala   |    4 +-
 src/library/scala/util/matching/Regex.scala        |    2 +-
 src/manual/scala/man1/Command.scala                |    2 +-
 src/manual/scala/man1/fsc.scala                    |    6 +-
 src/manual/scala/man1/scala.scala                  |   15 +-
 src/manual/scala/man1/scalac.scala                 |   62 +-
 src/manual/scala/tools/docutil/ManMaker.scala      |   12 +-
 .../scala/tools/partest/ASMConverters.scala        |   82 +-
 .../scala/tools/partest/IcodeComparison.scala      |    9 +-
 .../scala/tools/partest/ParserTest.scala           |   21 +
 .../scala/tools/partest/ReplTest.scala             |   73 +-
 src/reflect/scala/reflect/api/Constants.scala      |    2 +-
 src/reflect/scala/reflect/api/FlagSets.scala       |    2 +-
 src/reflect/scala/reflect/api/Internals.scala      |    4 +-
 src/reflect/scala/reflect/api/Names.scala          |    8 +-
 src/reflect/scala/reflect/api/Printers.scala       |    2 +-
 src/reflect/scala/reflect/api/Quasiquotes.scala    |    2 +-
 .../scala/reflect/api/StandardLiftables.scala      |    2 +-
 src/reflect/scala/reflect/api/Trees.scala          |    6 +-
 src/reflect/scala/reflect/api/TypeTags.scala       |    2 +-
 src/reflect/scala/reflect/api/Types.scala          |    4 +-
 .../reflect/internal/AnnotationCheckers.scala      |    2 +-
 .../scala/reflect/internal/AnnotationInfos.scala   |    2 +-
 .../reflect/internal/ClassfileConstants.scala      |   17 +-
 .../scala/reflect/internal/Definitions.scala       |   24 +-
 .../reflect/internal/ExistentialsAndSkolems.scala  |    2 +-
 src/reflect/scala/reflect/internal/FlagSets.scala  |    2 +-
 src/reflect/scala/reflect/internal/Flags.scala     |  155 +-
 src/reflect/scala/reflect/internal/HasFlags.scala  |   83 +-
 src/reflect/scala/reflect/internal/Importers.scala |    2 +-
 src/reflect/scala/reflect/internal/Kinds.scala     |    2 +-
 src/reflect/scala/reflect/internal/Positions.scala |    9 +-
 src/reflect/scala/reflect/internal/Printers.scala  |    4 +-
 .../reflect/internal/ReificationSupport.scala      |    4 +-
 src/reflect/scala/reflect/internal/StdNames.scala  |    4 +-
 .../scala/reflect/internal/SymbolPairs.scala       |    2 +-
 .../scala/reflect/internal/SymbolTable.scala       |    8 +
 src/reflect/scala/reflect/internal/Symbols.scala   |   97 +-
 src/reflect/scala/reflect/internal/TreeGen.scala   |   13 +-
 src/reflect/scala/reflect/internal/Trees.scala     |    6 +-
 src/reflect/scala/reflect/internal/Types.scala     |   25 +-
 src/reflect/scala/reflect/internal/Variances.scala |   24 +-
 .../reflect/internal/pickling/UnPickler.scala      |    6 +-
 .../scala/reflect/internal/tpe/FindMembers.scala   |    2 +-
 .../reflect/internal/tpe/TypeConstraints.scala     |    2 +-
 .../scala/reflect/internal/tpe/TypeMaps.scala      |   24 +-
 .../scala/reflect/internal/transform/Erasure.scala |    4 +-
 .../scala/reflect/internal/transform/UnCurry.scala |   22 +-
 .../internal/util/AbstractFileClassLoader.scala    |    2 +-
 .../internal/util/StripMarginInterpolator.scala    |    2 +-
 .../scala/reflect/internal/util/WeakHashSet.scala  |    6 +-
 src/reflect/scala/reflect/io/Streamable.scala      |    8 +
 src/reflect/scala/reflect/macros/Attachments.scala |    2 +-
 src/reflect/scala/reflect/macros/FrontEnds.scala   |    2 +-
 .../scala/reflect/macros/blackbox/Context.scala    |    2 +-
 src/reflect/scala/reflect/macros/package.scala     |    4 +-
 .../scala/reflect/macros/whitebox/Context.scala    |    2 +-
 .../scala/reflect/runtime/JavaMirrors.scala        |   32 +-
 .../scala/reflect/runtime/JavaUniverseForce.scala  |    6 +-
 .../scala/reflect/runtime/ReflectionUtils.scala    |    4 +-
 .../scala/reflect/runtime/SymbolLoaders.scala      |    3 +-
 .../scala/reflect/runtime/SymbolTable.scala        |    2 +-
 .../scala/reflect/runtime/SynchronizedOps.scala    |    4 +-
 .../scala/reflect/runtime/SynchronizedTypes.scala  |    4 +-
 .../scala/reflect/runtime/TwoWayCache.scala        |    3 +-
 .../scala/reflect/runtime/TwoWayCaches.scala       |    3 +-
 src/reflect/scala/reflect/runtime/package.scala    |    6 +-
 .../nsc/interpreter/jline/FileBackedHistory.scala  |   93 +
 .../nsc/interpreter/jline/JLineDelimiter.scala     |   25 +
 .../tools/nsc/interpreter/jline/JLineHistory.scala |   77 +
 .../tools/nsc/interpreter/jline/JLineReader.scala  |  169 +
 .../nsc/interpreter/ConsoleReaderHelper.scala      |  160 -
 .../scala/tools/nsc/interpreter/Delimited.scala    |   41 -
 .../scala/tools/nsc/interpreter/Formatting.scala   |   30 +-
 src/repl/scala/tools/nsc/interpreter/ILoop.scala   |  299 +-
 src/repl/scala/tools/nsc/interpreter/IMain.scala   |  122 +-
 src/repl/scala/tools/nsc/interpreter/Imports.scala |   59 +-
 .../tools/nsc/interpreter/InteractiveReader.scala  |    2 +
 .../tools/nsc/interpreter/JLineCompletion.scala    |    5 +-
 .../scala/tools/nsc/interpreter/JLineReader.scala  |   75 -
 .../scala/tools/nsc/interpreter/JavapClass.scala   |   44 +-
 .../tools/nsc/interpreter/MemberHandlers.scala     |   11 +-
 src/repl/scala/tools/nsc/interpreter/Parsed.scala  |   19 +
 src/repl/scala/tools/nsc/interpreter/Pasted.scala  |   64 +-
 src/repl/scala/tools/nsc/interpreter/Power.scala   |   41 +-
 .../nsc/interpreter/PresentationCompilation.scala  |  110 +
 .../PresentationCompilerCompleter.scala            |  139 +
 .../scala/tools/nsc/interpreter/ReplProps.scala    |   47 +-
 .../scala/tools/nsc/interpreter/Tabulators.scala   |  112 +
 .../interpreter/session/FileBackedHistory.scala    |   84 -
 .../tools/nsc/interpreter/session/History.scala    |    3 +
 .../nsc/interpreter/session/JLineHistory.scala     |   49 -
 .../nsc/interpreter/session/SimpleHistory.scala    |   12 +-
 .../tools/nsc/interpreter/session/package.scala    |    5 -
 src/scaladoc/scala/tools/nsc/doc/Index.scala       |    2 +
 .../scala/tools/nsc/doc/ScaladocAnalyzer.scala     |    4 +-
 src/scaladoc/scala/tools/nsc/doc/Settings.scala    |   47 +-
 .../tools/nsc/doc/base/CommentFactoryBase.scala    |   67 +-
 src/scaladoc/scala/tools/nsc/doc/base/LinkTo.scala |    0
 .../tools/nsc/doc/base/MemberLookupBase.scala      |    2 +-
 .../scala/tools/nsc/doc/base/comment/Body.scala    |    0
 .../scala/tools/nsc/doc/base/comment/Comment.scala |    2 +-
 .../scala/tools/nsc/doc/html/HtmlFactory.scala     |    2 +
 .../scala/tools/nsc/doc/html/HtmlPage.scala        |   48 +-
 .../scala/tools/nsc/doc/html/SyntaxHigh.scala      |   34 +-
 .../tools/nsc/doc/html/page/DeprecatedIndex.scala  |   58 +
 .../scala/tools/nsc/doc/html/page/Index.scala      |    7 +-
 .../tools/nsc/doc/html/page/ReferenceIndex.scala   |    0
 .../scala/tools/nsc/doc/html/page/Source.scala     |  127 -
 .../scala/tools/nsc/doc/html/page/Template.scala   |   16 +-
 .../nsc/doc/html/page/diagram/DiagramStats.scala   |    2 +-
 .../html/page/diagram/DotDiagramGenerator.scala    |    2 +-
 .../nsc/doc/html/page/diagram/DotRunner.scala      |   12 +-
 .../scala/tools/nsc/doc/html/resource/lib/index.js |   12 +-
 .../nsc/doc/html/resource/lib/jquery.layout.js     |    6 +-
 .../nsc/doc/html/resource/lib/modernizr.custom.js  | 1265 -------
 .../tools/nsc/doc/html/resource/lib/ref-index.css  |    0
 .../tools/nsc/doc/html/resource/lib/template.css   |    2 +
 .../tools/nsc/doc/html/resource/lib/template.js    |    2 +-
 .../scala/tools/nsc/doc/model/CommentFactory.scala |    2 +-
 .../scala/tools/nsc/doc/model/Entity.scala         |    8 +-
 .../tools/nsc/doc/model/IndexModelFactory.scala    |    8 +-
 .../scala/tools/nsc/doc/model/ModelFactory.scala   |    4 +-
 .../doc/model/ModelFactoryImplicitSupport.scala    |   14 +-
 .../nsc/doc/model/ModelFactoryTypeSupport.scala    |    2 +-
 .../scala/tools/nsc/doc/model/TreeFactory.scala    |    0
 .../tools/nsc/doc/model/diagram/Diagram.scala      |    2 +-
 .../nsc/doc/model/diagram/DiagramFactory.scala     |    4 +-
 src/scalap/decoder.properties                      |    2 +-
 src/scalap/scala/tools/scalap/CodeWriter.scala     |    2 +-
 src/scalap/scala/tools/scalap/Decode.scala         |    2 +-
 src/scalap/scala/tools/scalap/JavaWriter.scala     |    8 +-
 src/scalap/scala/tools/scalap/Main.scala           |    1 +
 src/scalap/scala/tools/scalap/MetaParser.scala     |   16 +-
 .../scala/tools/scalap/scalax/rules/Result.scala   |    2 +-
 .../scalax/rules/scalasig/ClassFileParser.scala    |    6 +
 .../scalap/scalax/rules/scalasig/ScalaSig.scala    |   22 +-
 .../scalax/rules/scalasig/ScalaSigPrinter.scala    |    6 +-
 .../parallel/benchmarks/misc/Coder.scala           |    4 +-
 .../benchmarks/parallel_array/SequentialOps.scala  |    6 +-
 test/disabled/coder/Coder.scala                    |    4 +-
 test/disabled/pos/spec-List.scala                  |    2 +-
 test/disabled/pos/t1545.scala                      |    0
 .../akka/src/akka/actor/ActorRef.scala             |    2 +-
 .../akka/src/akka/actor/Supervisor.scala           |    2 +-
 .../presentation/timeofday/src/timeofday.scala     |    4 +-
 test/disabled/run/coder2/Coder2.scala              |    2 +-
 test/files/bench/equality/eq.scala                 |    0
 test/files/bench/equality/eqeq.scala               |    0
 test/files/filters                                 |    1 +
 .../instrumented/inline-in-constructors.flags      |    2 +-
 test/files/jvm/bytecode-test-example/Test.scala    |    2 +-
 test/files/jvm/constant-optimization/Foo_1.flags   |    2 +-
 test/files/jvm/inner.scala                         |    2 +-
 test/files/jvm/innerClassAttribute.check           |   30 +-
 test/files/jvm/innerClassAttribute/Classes_1.scala |   30 +-
 test/files/jvm/innerClassAttribute/Test.scala      |   53 +-
 .../jvm/innerClassEnclMethodJavaReflection.scala   |   11 +-
 test/files/jvm/interpreter.check                   |   20 +-
 test/files/jvm/javaReflection/Classes_1.scala      |   18 +-
 test/files/jvm/javaReflection/Test.scala           |    6 +-
 test/files/jvm/patmat_opt_ignore_underscore.flags  |    2 +-
 test/files/jvm/patmat_opt_no_nullcheck.flags       |    2 +-
 test/files/jvm/patmat_opt_primitive_typetest.flags |    2 +-
 test/files/jvm/protectedacc.scala                  |    2 +-
 test/files/jvm/t7006/Foo_1.flags                   |    2 +-
 test/files/jvm/t7006/Foo_1.scala                   |    2 +-
 test/files/jvm/t8689.scala                         |    9 +-
 test/files/jvm/throws-annot-from-java.check        |   10 +-
 test/files/jvm/unreachable/Test.scala              |    2 +-
 test/files/jvm/xml05.check                         |    2 -
 test/files/neg/case-collision2.flags               |    2 +-
 test/files/neg/choices.check                       |    6 +-
 test/files/neg/depmet_1.check                      |    4 +-
 test/files/neg/inlineMaxSize.check                 |    9 +
 test/files/neg/inlineMaxSize.flags                 |    1 +
 test/files/neg/inlineMaxSize.scala                 |    8 +
 test/files/neg/macro-invalidshape.check            |    5 +-
 test/files/neg/macro-invalidusage-badargs.check    |    3 +-
 test/files/neg/macro-without-xmacros-a.check       |    2 +-
 test/files/neg/macro-without-xmacros-b.check       |    2 +-
 test/files/neg/missing-arg-list.check              |   21 +
 test/files/neg/missing-arg-list.scala              |   13 +
 test/files/neg/name-lookup-stable.check            |    2 +-
 test/files/neg/name-lookup-stable.scala            |    2 +-
 test/files/neg/names-defaults-neg.check            |    4 +-
 test/files/neg/names-defaults-neg.scala            |    4 +-
 test/files/neg/override.scala                      |    0
 test/files/neg/partestInvalidFlag.check            |    4 +
 test/files/neg/partestInvalidFlag.flags            |    1 +
 test/files/neg/partestInvalidFlag.scala            |    1 +
 test/files/neg/patmatexhaust-huge.check            |    7 +
 test/files/neg/patmatexhaust-huge.flags            |    1 +
 test/files/neg/patmatexhaust-huge.scala            |  806 +++++
 test/files/neg/reflection-names-neg.check          |   13 -
 test/files/neg/reflection-names-neg.scala          |    6 -
 test/files/neg/t0899.check                         |    6 +-
 test/files/neg/t2336.scala                         |    0
 test/files/neg/t2494.scala                         |    0
 test/files/neg/t2773.scala                         |    0
 test/files/neg/t2779.scala                         |    0
 test/files/neg/t2866.check                         |    2 +-
 test/files/neg/t2866.scala                         |    2 +-
 test/files/neg/t2870.scala                         |    0
 test/files/neg/t2918.scala                         |    0
 test/files/neg/t3006.scala                         |    0
 test/files/neg/t3224.scala                         |    0
 test/files/neg/t3234.flags                         |    2 +-
 test/files/neg/t3995.scala                         |    2 +-
 test/files/neg/t4425b.check                        |   22 +-
 test/files/neg/t5120.scala                         |    2 +-
 test/files/neg/t5376.scala                         |    2 +-
 test/files/neg/t562.check                          |    2 +-
 test/files/neg/t6013/Base.java                     |    2 +-
 test/files/neg/t6040.check                         |    2 +-
 test/files/neg/t6120.check                         |    2 +-
 test/files/neg/t6446-additional.check              |    0
 test/files/neg/t6446-list.check                    |    0
 test/files/neg/t6446-missing.check                 |    0
 test/files/neg/t6666d.check                        |    4 -
 test/files/neg/t6895.check                         |    6 +
 test/files/neg/t6895.scala                         |   26 +
 test/files/neg/t6895b.check                        |    9 +
 test/files/neg/t6895b.scala                        |   39 +
 test/files/neg/t6952.check                         |    2 +-
 test/files/neg/t7157.check                         |   36 +-
 test/files/neg/t7214neg.scala                      |    2 +-
 test/files/neg/t7623.check                         |   24 +-
 test/files/neg/t7623.scala                         |    8 +-
 test/files/neg/t771.scala                          |    0
 test/files/neg/t7848-interp-warn.check             |    5 +-
 test/files/neg/t7848-interp-warn.scala             |    2 +-
 test/files/neg/t8127a.check                        |    4 +
 test/files/neg/t8127a.scala                        |   12 +
 test/files/neg/t8237-default.scala                 |    2 +-
 test/files/neg/t836.scala                          |    2 +-
 test/files/neg/t8431.scala                         |    2 +-
 test/files/neg/t8463.scala                         |    2 +-
 test/files/neg/t8597b.scala                        |    2 +-
 test/files/neg/t8675b.scala                        |    4 +-
 test/files/neg/t8731.check                         |    5 +-
 test/files/neg/t8736-c.check                       |    2 +-
 test/files/neg/t8777.check                         |    6 +
 test/files/neg/t8777.scala                         |    4 +
 test/files/neg/t8892.check                         |    7 +
 test/files/neg/t8892.scala                         |    2 +
 test/files/neg/t8989.check                         |    4 +
 test/files/neg/t8989.scala                         |   14 +
 test/files/neg/t9127.check                         |   12 +
 test/files/neg/t9127.flags                         |    1 +
 test/files/neg/t9127.scala                         |    7 +
 test/files/neg/t9231.check                         |    4 +
 test/files/neg/t9231.scala                         |    9 +
 test/files/neg/t9273.check                         |   10 +
 test/files/neg/t9273.scala                         |    9 +
 test/files/neg/t9286a.check                        |    7 +
 test/files/neg/t9286a.scala                        |   13 +
 test/files/neg/t9286b.check                        |    7 +
 test/files/neg/t9286b.scala                        |    5 +
 test/files/neg/t9286c.check                        |    7 +
 test/files/neg/t9286c.scala                        |   14 +
 test/files/neg/t9401.check                         |    4 +
 test/files/neg/t9401.scala                         |    4 +
 test/files/neg/t9572.check                         |    7 +
 test/files/neg/t9572.scala                         |    6 +
 .../files/neg/virtpatmat_exhaust_big.check         |    0
 .../files/neg/virtpatmat_exhaust_big.flags         |    0
 .../files/neg/virtpatmat_exhaust_big.scala         |    0
 test/files/neg/virtpatmat_exhaust_compound.scala   |    2 +-
 test/files/neg/warn-unused-imports.check           |   46 +-
 test/files/neg/warn-unused-imports.scala           |  125 -
 test/files/neg/warn-unused-imports/sample_1.scala  |   17 +
 .../warn-unused-imports_2.scala                    |  155 +
 test/files/neg/warn-unused-privates.scala          |    2 +-
 test/files/pos/SI-4012-b.scala                     |    2 +-
 test/files/pos/delambdafy-patterns.scala           |    2 +-
 test/files/pos/existental-slow-compile2.scala      |    7 +
 test/files/pos/existential-slow-compile1.flags     |    1 +
 test/files/pos/existential-slow-compile1.scala     |    7 +
 test/files/pos/jesper.scala                        |   30 +
 test/files/pos/lexical.scala                       |    0
 test/files/pos/packageobjs.scala                   |    0
 test/files/pos/spec-t6286.scala                    |    0
 test/files/pos/t1459/AbstractBase.java             |    0
 test/files/pos/t1459/App.scala                     |    0
 test/files/pos/t1459/Caller.java                   |    0
 test/files/pos/t1722/Test.scala                    |    0
 test/files/pos/t1722/Top.scala                     |    0
 test/files/pos/t1756.scala                         |    0
 test/files/pos/t2060.scala                         |    0
 test/files/pos/t2082.scala                         |    0
 test/files/pos/t2179.scala                         |    0
 test/files/pos/t2405.scala                         |    4 +-
 test/files/pos/t2425.scala                         |    0
 test/files/pos/t2429.scala                         |    0
 test/files/pos/t2433/A.java                        |    0
 test/files/pos/t2433/B.java                        |    0
 test/files/pos/t2433/Test.scala                    |    0
 test/files/pos/t2484.scala                         |    0
 test/files/pos/t2504.scala                         |    0
 test/files/pos/t2545.scala                         |    0
 test/files/pos/t2635.scala                         |    0
 test/files/pos/t2683.scala                         |    0
 test/files/pos/t2913.scala                         |    0
 test/files/pos/t2956/t2956.scala                   |    0
 test/files/pos/t3174.scala                         |    0
 test/files/pos/t3174b.scala                        |    0
 test/files/pos/t3368.flags                         |    1 +
 test/files/pos/t3368.scala                         |    5 +
 test/files/pos/t3420.flags                         |    2 +-
 test/files/pos/t3568.scala                         |    0
 test/files/pos/t4553.scala                         |    0
 test/files/pos/t6089b.scala                        |    2 +-
 test/files/pos/t6575b.scala                        |    2 +-
 test/files/pos/t6601/UsePrivateValueClass_2.scala  |    2 +-
 test/files/pos/t6648.scala                         |    2 +-
 test/files/{neg => pos}/t6666d.scala               |    0
 test/files/pos/t6942.flags                         |    2 +-
 test/files/pos/t7200b.scala                        |    2 +-
 test/files/pos/t7689.scala                         |    2 +-
 test/files/pos/t7815.scala                         |    2 +-
 test/files/pos/t8002-nested-scope.scala            |    2 +-
 test/files/pos/t8111.scala                         |    6 +-
 .../t8359-closelim-crash.flags}                    |    0
 test/files/pos/t8359-closelim-crash.scala          |   23 +
 test/files/pos/t8861.flags                         |    1 +
 test/files/pos/t8861.scala                         |   11 +
 test/files/pos/t8947/Macro_1.scala                 |    2 +-
 test/files/pos/t8954/t2.scala                      |    2 +-
 test/files/pos/t9020.flags                         |    1 +
 test/files/pos/t9020.scala                         |   10 +
 test/files/pos/t9111-inliner-workaround.flags      |    1 +
 test/files/pos/t9111-inliner-workaround/A_1.java   |   13 +
 .../pos/t9111-inliner-workaround/Test_1.scala      |   10 +
 test/files/pos/t9181.flags                         |    1 +
 test/files/pos/t9181.scala                         |  806 +++++
 test/files/pos/t9239/Declaration.scala             |    3 +
 test/files/pos/t9239/Usage.java                    |   15 +
 test/files/pos/t9285.flags                         |    1 +
 test/files/pos/t9285.scala                         |    1 +
 test/files/pos/t9321.scala                         |   10 +
 test/files/pos/t9356/Foo_2.scala                   |    6 +
 test/files/pos/t9356/MyAnnotation.java             |   12 +
 test/files/pos/t9356/Test_3.scala                  |    3 +
 .../files/pos/t9369.flags                          |    0
 test/files/pos/t9369.scala                         |   24 +
 test/files/pos/t9370/ThePlugin.scala               |   31 +
 test/files/pos/t9370/sample_2.flags                |    1 +
 test/files/pos/t9370/sample_2.scala                |    6 +
 test/files/pos/t9370/scalac-plugin.xml             |    5 +
 test/files/pos/t9392/client_2.scala                |    4 +
 test/files/pos/t9392/macro_1.scala                 |   16 +
 test/files/pos/t9393/NamedImpl_1.java              |   15 +
 test/files/pos/t9393/NamedImpl_2.java              |   15 +
 test/files/pos/t9393/Named_1.java                  |    3 +
 test/files/pos/t9393/Named_2.java                  |    3 +
 test/files/pos/t9393/test_2.scala                  |    4 +
 test/files/pos/t9442.scala                         |   14 +
 test/files/pos/t9475.scala                         |   19 +
 test/files/pos/virtpatmat_exhaust_big.scala        |   33 +
 test/files/presentation/callcc-interpreter.check   |   11 +-
 test/files/presentation/doc/doc.scala              |    6 +
 test/files/presentation/doc/src/Class.scala        |    0
 test/files/presentation/doc/src/p/Base.scala       |    0
 test/files/presentation/doc/src/p/Derived.scala    |    0
 .../presentation/t8941b/IdempotencyTest.scala      |    6 +-
 test/files/res/t9170.check                         |    7 +
 test/files/res/t9170.res                           |    2 +
 test/files/res/t9170/A.scala                       |    4 +
 test/files/run/ReplacementMatching.scala           |    4 +-
 test/files/run/bcodeInlinerMixed.flags             |    1 +
 test/files/run/bcodeInlinerMixed/A_1.java          |    3 +
 test/files/run/bcodeInlinerMixed/B_1.scala         |   20 +
 test/files/run/bcodeInlinerMixed/Test.scala        |   16 +
 test/files/run/blame_eye_triple_eee-double.check   |    2 +-
 test/files/run/blame_eye_triple_eee-double.scala   |    2 +-
 test/files/run/blame_eye_triple_eee-float.check    |    2 +-
 test/files/run/blame_eye_triple_eee-float.scala    |    2 +-
 test/files/run/class-symbol-contravariant.check    |   10 +-
 test/files/run/classfile-format-51.scala           |    4 +-
 test/files/run/classfile-format-52.scala           |    2 +-
 test/files/run/colltest1.scala                     |    2 +-
 test/files/run/compiler-asSeenFrom.scala           |    2 +-
 test/files/run/complicatedmatch.scala              |    2 +-
 test/files/run/constant-type.check                 |   10 +-
 test/files/run/constrained-types.check             |   10 +-
 test/files/run/dead-code-elimination.scala         |    2 +-
 test/files/run/deeps.scala                         |    2 +-
 test/files/run/delambdafy-specialized.check        |    1 +
 test/files/run/delambdafy-specialized.flags        |    1 +
 test/files/run/delambdafy-specialized.scala        |    6 +
 test/files/run/delambdafy_t6028.check              |   51 +-
 test/files/run/delambdafy_t6028.scala              |   10 +-
 test/files/run/delambdafy_t6555.check              |    8 +-
 test/files/run/delambdafy_t6555.scala              |    2 +-
 .../run/delambdafy_uncurry_byname_method.check     |    6 +-
 .../run/delambdafy_uncurry_byname_method.scala     |    4 +-
 test/files/run/disable-assertions.flags            |    1 +
 test/files/run/disable-assertions.scala            |   14 +
 test/files/run/existentials-in-compiler.scala      |    2 +-
 test/files/run/finally.check                       |    2 +-
 test/files/run/finally.scala                       |    6 +-
 test/files/run/function-null-unbox.scala           |    8 +
 test/files/run/idempotency-case-classes.check      |    3 +-
 test/files/run/indylambda-boxing/VC.scala          |    2 +
 test/files/run/indylambda-boxing/test.scala        |   29 +
 test/files/run/iq.scala                            |    2 +-
 test/files/run/is-valid-num.scala                  |    2 +-
 test/files/run/iterator-from.scala                 |    2 +-
 test/files/run/kind-repl-command.check             |    8 +-
 test/files/run/kmpSliceSearch.flags                |    1 +
 test/files/run/lambda-serialization-gc.scala       |   40 +
 test/files/run/lambda-serialization.scala          |   35 +
 test/files/run/list_map.scala                      |    0
 test/files/run/lub-visibility.check                |    2 -
 test/files/run/macro-bundle-repl.check             |    2 -
 test/files/run/macro-repl-basic.check              |    2 -
 test/files/run/macro-repl-dontexpand.check         |    2 -
 test/files/run/macro-system-properties.check       |    2 -
 test/files/run/mapConserve.scala                   |    2 +-
 test/files/run/names-defaults.scala                |    6 +-
 test/files/run/nothingTypeNoFramesNoDce.scala      |    2 +-
 test/files/run/nothingTypeNoOpt.scala              |    2 +-
 test/files/run/nullable-lazyvals.scala             |    2 +-
 test/files/run/pc-conversions.scala                |    2 +-
 test/files/run/private-inline.flags                |    2 +-
 test/files/run/range.scala                         |   18 +-
 test/files/run/reflection-equality.check           |    2 -
 .../run/reflection-fieldmirror-ctorparam.check     |    6 +-
 test/files/run/reflection-magicsymbols-repl.check  |    2 -
 test/files/run/reflection-repl-classes.check       |    2 -
 test/files/run/reflection-repl-elementary.check    |    2 -
 test/files/run/reify-repl-fail-gracefully.check    |    8 +-
 test/files/run/reify_newimpl_22.check              |    8 +-
 test/files/run/reify_newimpl_23.check              |    4 +-
 test/files/run/reify_newimpl_25.check              |    8 +-
 test/files/run/reify_newimpl_26.check              |    4 +-
 test/files/run/reify_newimpl_35.check              |    2 -
 test/files/run/reify_timeofday.scala               |    4 +-
 test/files/run/repl-assign.check                   |    2 -
 test/files/run/repl-bare-expr.check                |   38 +-
 test/files/run/repl-colon-type.check               |    6 +-
 test/files/run/repl-empty-package.check            |    2 -
 test/files/run/repl-javap-app.check                |    9 +-
 test/files/run/repl-javap-lambdas.scala            |    6 +-
 test/files/run/repl-out-dir.check                  |    2 -
 test/files/run/repl-parens.check                   |   38 +-
 test/files/run/repl-paste-2.check                  |    6 +-
 test/files/run/repl-paste-3.check                  |    2 -
 test/files/run/repl-paste-4.scala                  |    4 +-
 test/files/run/repl-paste-5.check                  |   28 +
 test/files/run/repl-paste-5.scala                  |   18 +
 test/files/run/repl-paste-raw.scala                |    4 +-
 test/files/run/repl-paste.check                    |    2 -
 test/files/run/repl-power.check                    |   13 +-
 test/files/run/repl-power.scala                    |    5 +-
 test/files/run/repl-reset.check                    |   26 +-
 test/files/run/repl-save.scala                     |    4 +-
 test/files/run/repl-serialization.check            |   24 +
 test/files/run/repl-serialization.scala            |   68 +
 test/files/run/repl-term-macros.check              |    2 -
 test/files/run/repl-transcript.check               |    4 +-
 test/files/run/repl-trim-stack-trace.scala         |   10 +-
 test/files/run/repl-type-verbose.check             |    2 -
 test/files/run/sbt-icode-interface.scala           |   42 +
 test/files/run/scalapInvokedynamic.check           |    5 +
 test/files/run/scalapInvokedynamic.scala           |   11 +
 test/files/run/stringinterpolation_macro-run.scala |    2 +-
 test/files/run/synchronized.check                  |    1 -
 test/files/run/synchronized.scala                  |    3 +
 test/files/run/t0631.scala                         |    2 +-
 test/files/run/t1931.scala                         |   43 +
 test/files/run/t1987b/cce_test.scala               |    2 +-
 test/files/run/t2106.check                         |    7 +
 test/files/run/t2106.flags                         |    2 +-
 test/files/run/t2127.scala                         |    2 +-
 test/files/run/t2318.scala                         |    1 +
 test/files/run/t2503.scala                         |    0
 test/files/run/t2526.scala                         |    2 +-
 test/files/run/t3026.scala                         |    0
 test/files/run/t3368-b.check                       |   89 +
 test/files/run/t3368-b.scala                       |   26 +
 test/files/run/t3368-c.check                       |   85 +
 test/files/run/t3368-c.scala                       |   26 +
 test/files/run/t3368-d.check                       |   89 +
 test/files/run/t3368-d.scala                       |   26 +
 test/files/run/t3368.check                         |   85 +
 test/files/run/t3368.scala                         |   26 +
 test/files/run/t3376.check                         |    2 -
 test/files/run/t3647.check                         |    1 +
 test/files/run/t4025.check                         |    2 -
 test/files/run/t4172.check                         |    2 -
 test/files/run/t4216.check                         |    2 -
 test/files/run/t4285.check                         |    2 -
 test/files/run/t4542.check                         |    4 +-
 test/files/run/t4594-repl-settings.scala           |   36 +-
 test/files/run/t4658.check                         |    7 +-
 test/files/run/t4658.scala                         |   11 +-
 test/files/run/t4671.check                         |    2 -
 test/files/run/t4710.check                         |    2 -
 test/files/run/t4950.check                         |    9 -
 test/files/run/t4950.scala                         |   24 +-
 test/files/run/t5072.check                         |    2 -
 test/files/run/t5256d.check                        |    2 -
 test/files/run/t5535.check                         |    2 -
 test/files/run/t5537.check                         |    2 -
 test/files/run/t5583.check                         |    2 -
 test/files/run/t5655.check                         |   14 +-
 test/files/run/t5699.check                         |    0
 test/files/run/t5699.scala                         |   14 +-
 test/files/run/t5717.scala                         |    0
 test/files/run/t5789.check                         |    2 -
 test/files/run/t6086-repl.check                    |    2 -
 test/files/run/t6102.check                         |    5 +
 test/files/run/t6146b.check                        |   10 +-
 test/files/run/t6187.check                         |    2 -
 test/files/run/t6240-universe-code-gen.scala       |    4 +-
 test/files/run/t6273.check                         |    2 -
 test/files/run/t6320.check                         |    2 -
 test/files/run/t6329_repl.check                    |    2 -
 test/files/run/t6329_repl_bug.check                |    2 -
 test/files/run/t6381.check                         |    2 -
 test/files/run/t6434.check                         |    2 -
 test/files/run/t6439.check                         |   10 +-
 test/files/run/t6440b.scala                        |    2 +-
 test/files/run/t6502.scala                         |   78 +-
 test/files/run/t6507.check                         |    4 -
 test/files/run/t6549.check                         |    2 -
 test/files/run/t6937.check                         |    2 -
 test/files/run/t7096.scala                         |    2 +-
 test/files/run/t7185.check                         |    2 -
 test/files/run/t720.scala                          |   48 +
 test/files/run/t7214.scala                         |    2 +-
 test/files/run/t7246.check                         |    0
 test/files/run/t7246/Outer.java                    |    0
 test/files/run/t7246/Test.scala                    |    0
 test/files/run/t7246b.check                        |    0
 test/files/run/t7246b/Base.scala                   |    0
 test/files/run/t7246b/Outer.java                   |    0
 test/files/run/t7246b/Test.scala                   |    0
 test/files/run/t7319.check                         |   20 +-
 test/files/run/t7341.flags                         |    0
 test/files/run/t7341.scala                         |    0
 test/files/run/t7407.flags                         |    2 +-
 test/files/run/t7407b.flags                        |    2 +-
 test/files/run/t7482a.check                        |    2 -
 test/files/run/t7582.check                         |    1 -
 test/files/run/t7582/InlineHolder.scala            |    3 +
 test/files/run/t7582b.check                        |    1 -
 test/files/run/t7582b/InlineHolder.scala           |    3 +
 test/files/run/t7634.check                         |    6 +-
 test/files/run/t7634.scala                         |    2 +-
 test/files/run/t7741a/GroovyInterface$1Dump.java   |  222 ++
 test/files/run/t7741a/GroovyInterfaceDump.java     |   51 +
 test/files/run/t7741a/Test.scala                   |   47 +
 test/files/run/t7741b.check                        |    3 +
 test/files/run/t7741b/HasInner.java                |    3 +
 test/files/run/t7741b/Test.scala                   |   29 +
 test/files/run/t7747-repl.check                    |  135 +-
 test/files/run/t7747-repl.scala                    |    6 +
 test/files/run/t7801.check                         |    2 -
 test/files/run/t7805-repl-i.check                  |    3 +-
 test/files/run/t7817-tree-gen.scala                |    2 +-
 test/files/run/t7850c.scala                        |   11 +
 test/files/run/t7850d.scala                        |   17 +
 test/files/run/t7974.check                         |   23 +-
 test/files/run/t7974/Test.scala                    |   14 +-
 test/files/run/t8010.scala                         |    4 +-
 test/files/run/t8047.scala                         |    2 +-
 test/files/run/t8346.check                         |    6 -
 test/files/run/t8346.scala                         |   34 -
 test/files/run/t8502b.scala                        |   46 +
 test/files/run/t8601-closure-elim.flags            |    2 +-
 test/files/run/t8601-closure-elim.scala            |    2 +-
 test/files/run/t8708_b/Test_2.scala                |    2 +-
 test/files/run/t8843-repl-xlat.scala               |    4 +-
 test/files/run/t8845.flags                         |    2 +-
 test/files/run/t8893b.scala                        |    2 +-
 test/files/run/t8925.flags                         |    2 +-
 test/files/run/t9029.flags                         |    1 +
 test/files/run/t9029.scala                         |   15 +
 test/files/run/t9029b.check                        |    1 +
 test/files/run/t9029b.scala                        |   31 +
 test/files/run/t9029c.scala                        |   21 +
 test/files/run/t9097.scala                         |    2 +-
 test/files/run/t9102.scala                         |   81 +
 test/files/run/t9170.scala                         |   56 +
 test/files/run/t9182.check                         |    3 +
 test/files/run/t9182.scala                         |   12 +
 test/files/run/t9206.scala                         |   37 +
 test/files/run/t9219.check                         |    3 +
 test/files/run/t9219.scala                         |   11 +
 test/files/run/t9223.scala                         |    8 +
 test/files/run/t9223b.scala                        |    8 +
 test/files/run/t9252.check                         |    1 +
 test/files/run/t9252.scala                         |    5 +
 test/files/run/t9268.check                         |    5 +
 test/files/run/t9268/Java.java                     |   12 +
 test/files/run/t9268/Test.scala                    |   40 +
 test/files/run/t9298/Test.java                     |    7 +
 test/files/run/t9298/VC.scala                      |    5 +
 test/files/run/t9298b/Test.java                    |    7 +
 test/files/run/t9298b/VC.scala                     |    8 +
 test/files/run/t9359.check                         |   18 +
 test/files/run/t9359/A_1.java                      |   19 +
 test/files/run/t9359/B_2.java                      |   19 +
 test/files/run/t9359/Test_2.scala                  |   28 +
 test/files/run/t9365.check                         |    2 +
 test/files/run/t9365.scala                         |   18 +
 test/files/run/t9375.check                         |   60 +
 test/files/run/t9375.scala                         |  279 ++
 test/files/run/t9387.scala                         |   20 +
 test/files/run/t9387b.check                        |    1 +
 test/files/run/t9387b.scala                        |   16 +
 test/files/run/t9388-bin-compat.scala              |   16 +
 test/files/run/t9403.flags                         |    1 +
 test/files/run/t9403/C_1.scala                     |    5 +
 test/files/run/t9403/Test_2.scala                  |   29 +
 test/files/run/t9422.scala                         |   11 +
 test/files/run/t9425.scala                         |    8 +
 test/files/run/t9546.scala                         |   13 +
 test/files/run/t9546b.scala                        |   13 +
 test/files/run/t9546c.scala                        |   13 +
 test/files/run/t9546d.scala                        |   16 +
 test/files/run/t9546e.scala                        |   15 +
 test/files/run/t9567.scala                         |   18 +
 test/files/run/t9567b.scala                        |   19 +
 test/files/run/t9567c.scala                        |   29 +
 test/files/run/test-cpp.scala                      |    2 +-
 test/files/run/toolbox-varargs/Test.scala          |   13 +
 test/files/run/toolbox-varargs/Varargs.java        |    8 +
 test/files/run/toolbox_expand_macro.check          |    1 +
 test/files/run/toolbox_expand_macro.scala          |   23 +
 test/files/run/tpeCache-tyconCache.check           |   10 +-
 test/files/run/valueClassSelfType.scala            |   52 +
 test/files/run/viewtest.scala                      |    0
 test/files/run/weakconform.scala                   |    0
 test/files/run/xMigration.check                    |   20 +-
 .../quasiquotes/ArbitraryTreesAndNames.scala       |    4 +-
 .../quasiquotes/DefinitionConstructionProps.scala  |    4 +-
 test/files/scalacheck/quasiquotes/ErrorProps.scala |    2 +-
 .../scalacheck/quasiquotes/RuntimeErrorProps.scala |    2 +-
 test/files/scalacheck/range.scala                  |   17 +-
 test/files/scalacheck/redblacktree.scala           |    2 +-
 test/files/scalap/t8679.check                      | 3503 ++++++++++++++++++++
 test/files/scalap/t8679.scala                      | 3502 +++++++++++++++++++
 test/files/specialized/constant_lambda.scala       |    2 +-
 .../scala/collection/IterableViewLikeTest.scala    |    1 +
 test/junit/scala/collection/IteratorTest.scala     |   38 +
 test/junit/scala/collection/SearchingTest.scala    |   48 +
 .../scala/collection/immutable/PagedSeqTest.scala  |    6 +
 .../immutable/RangeConsistencyTest.scala           |   35 +
 .../scala/collection/immutable/SetTests.scala      |   81 +
 .../scala/collection/immutable/VectorTest.scala    |   30 +
 .../scala/collection/mutable/OpenHashMapTest.scala |   42 +
 .../scala/collection/mutable/SetLikeTest.scala     |   26 +
 .../collection/mutable/UnrolledBufferTest.scala    |   25 +
 .../scala/collection/mutable/VectorTest.scala      |    1 -
 .../concurrent/duration/SerializationTest.scala    |   24 +
 test/junit/scala/math/BigDecimalTest.scala         |   32 +
 test/junit/scala/math/NumericTest.scala            |   28 +-
 test/junit/scala/reflect/ClassTag.scala            |   12 +-
 .../scala/tools/nsc/backend/jvm/BTypesTest.scala   |   52 +-
 .../scala/tools/nsc/backend/jvm/CodeGenTools.scala |  125 +-
 .../tools/nsc/backend/jvm/DirectCompileTest.scala  |   31 +-
 .../jvm/analysis/NullnessAnalyzerTest.scala        |  220 ++
 .../jvm/analysis/ProdConsAnalyzerTest.scala        |  291 ++
 .../backend/jvm/opt/BTypesFromClassfileTest.scala  |   16 +-
 .../tools/nsc/backend/jvm/opt/CallGraphTest.scala  |  152 +
 .../jvm/opt/CompactLocalVariablesTest.scala        |    4 +-
 .../jvm/opt/EmptyExceptionHandlersTest.scala       |   23 +-
 .../jvm/opt/EmptyLabelsAndLineNumbersTest.scala    |    6 +-
 .../tools/nsc/backend/jvm/opt/InlineInfoTest.scala |   67 +
 .../nsc/backend/jvm/opt/InlineWarningTest.scala    |  194 ++
 .../backend/jvm/opt/InlinerIllegalAccessTest.scala |  202 ++
 .../jvm/opt/InlinerSeparateCompilationTest.scala   |  115 +
 .../tools/nsc/backend/jvm/opt/InlinerTest.scala    |  994 ++++++
 .../nsc/backend/jvm/opt/MethodLevelOpts.scala      |   17 +-
 .../nsc/backend/jvm/opt/ScalaInlineInfoTest.scala  |   85 +
 .../nsc/backend/jvm/opt/SimplifyJumpsTest.scala    |   24 +-
 .../nsc/backend/jvm/opt/UnreachableCodeTest.scala  |   41 +-
 .../backend/jvm/opt/UnusedLocalVariablesTest.scala |   12 +-
 .../nsc/classpath/FlatClassPathResolverTest.scala  |    2 +-
 .../scala/tools/nsc/doc/html/HtmlDocletTest.scala  |   22 +
 .../tools/nsc/interpreter/CompletionTest.scala     |  180 +
 .../tools/nsc/interpreter/TabulatorTest.scala      |   20 +
 test/junit/scala/tools/nsc/symtab/FlagsTest.scala  |   89 +
 .../scala/tools/nsc/symtab/SymbolTableTest.scala   |    4 +-
 .../nsc/transform/delambdafy/DelambdafyTest.scala  |   73 +
 .../tools/nsc/transform/patmat/SolvingTest.scala   |   61 +-
 .../junit/scala/tools/testing/ClearAfterClass.java |   20 +
 test/junit/scala/tools/testing/TempDir.scala       |   18 +
 test/junit/scala/util/SortingTest.scala            |   69 +
 test/partest                                       |    9 +-
 test/partest.bat                                   |  104 -
 test/pending/jvm/javasigs.scala                    |    2 +-
 test/pending/pos/t1786.scala                       |    2 +-
 .../pending/run/delambdafy-lambdametafactory.scala |   50 +
 .../run/idempotency-partial-functions.scala        |    2 +-
 test/pending/run/t3609.scala                       |    0
 test/scaladoc/filters                              |    1 +
 test/scaladoc/resources/SI-4476.scala              |    9 +
 test/scaladoc/resources/Trac4420.scala             |    2 +-
 test/scaladoc/resources/doc-root/AnyRef.scala      |    4 +-
 test/scaladoc/resources/implicits-base-res.scala   |    2 +-
 test/scaladoc/resources/links.scala                |    2 +-
 test/scaladoc/run/SI-191.check                     |    0
 test/scaladoc/run/SI-191.scala                     |    0
 test/scaladoc/run/SI-7367.check                    |    0
 test/scaladoc/run/SI-7367.scala                    |    0
 test/scaladoc/run/SI-8210.check                    |    1 +
 test/scaladoc/run/SI-8210.scala                    |   24 +
 test/scaladoc/run/SI-8479.scala                    |    0
 test/scaladoc/run/groups.scala                     |    2 +-
 test/scaladoc/run/implicits-base.scala             |    2 +-
 test/scaladoc/run/links.scala                      |    2 +-
 test/scaladoc/run/t5795.check                      |    4 +
 test/scaladoc/run/t5795.scala                      |   63 +
 test/scaladoc/run/tag-requirements.check           |   16 +
 test/scaladoc/run/tag-requirements.scala           |   53 +
 test/scaladoc/scalacheck/CommentFactoryTest.scala  |   20 +-
 test/scaladoc/scalacheck/DeprecatedIndexTest.scala |   50 +
 test/scaladoc/scalacheck/HtmlFactoryTest.scala     |    6 +-
 test/scaladoc/scalacheck/IndexTest.scala           |    8 +-
 test/script-tests/README                           |    0
 tools/binary-repo-lib.sh                           |    6 +-
 tools/get-scala-commit-date.bat                    |    4 +-
 tools/get-scala-commit-sha.bat                     |    4 +-
 tools/scaladoc-compare                             |    2 +-
 tools/scaladoc-diff                                |  117 +
 versions.properties                                |   31 +-
 1242 files changed, 31413 insertions(+), 40541 deletions(-)

diff --git a/.gitattributes b/.gitattributes
index ac98781..da4421c 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,20 +2,24 @@
 # this must be first so later entries will override it
 * text=auto
 
+# check out text files with lf, not crlf, on Windows.  (especially
+# important for Scala source files, since """ preserves line endings)
+text eol=lf
+
 # These files are text and should be normalized (convert crlf => lf)
-*.c       text
-*.check   text
-*.css     text
-*.flags   text
-*.html    text
-*.java    text
-*.js      text
-*.policy  text
-*.sbt     text
-*.scala   text
-*.sh      text
-*.txt     text
-*.xml     text
+*.c       eol=lf
+*.check   eol=lf
+*.css     eol=lf
+*.flags   eol=lf
+*.html    eol=lf
+*.java    eol=lf
+*.js      eol=lf
+*.policy  eol=lf
+*.sbt     eol=lf
+*.scala   eol=lf
+*.sh      eol=lf
+*.txt     eol=lf
+*.xml     eol=lf
 
 # Windows-specific files get windows endings
 *.bat     eol=crlf
diff --git a/.gitignore b/.gitignore
index 20d700d..061cd27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,6 +26,9 @@
 /build.properties
 /buildcharacter.properties
 
+# might get generated when testing Jenkins scripts locally
+/jenkins.properties
+
 # target directories for ant build
 /build/
 /dists/
@@ -48,3 +51,9 @@
 
 # Standard symbolic link to build/quick/bin
 /qbin
+
+# Sbt's target directories
+/target/
+/project/target/
+/project/project/target
+/build-sbt/
diff --git a/.travis.yml b/.travis.yml
index e90fc35..236e002 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,11 @@
+# opt-in to Travis's newer/faster container-based infrastructure
+sudo: false
+
 # this builds the spec using jekyll
 # based on http://www.paperplanes.de/2013/8/13/deploying-your-jekyll-blog-to-s3-with-travis-ci.html
 language: ruby
 rvm:
-  - 1.9.3
+  - 2.2
 script: bundle exec jekyll build -s spec/ -d build/spec
 install: bundle install
 
@@ -17,4 +20,4 @@ after_success:
   - openssl aes-256-cbc -pass "pass:$PRIV_KEY_SECRET" -in spec/id_dsa_travis.enc -out spec/id_dsa_travis -d -a
   - chmod 600 spec/id_dsa_travis
   - eval "$(ssh-agent)"
-  - '[ "${TRAVIS_PULL_REQUEST}" = "false" ] && ssh-add -D && ssh-add spec/id_dsa_travis && rsync -e "ssh -o StrictHostKeyChecking=no" -rzv build/spec/ scalatest at chara.epfl.ch:/home/linuxsoft/archives/scala/spec/2.11/'
\ No newline at end of file
+  - '[ "${TRAVIS_PULL_REQUEST}" = "false" ] && ssh-add -D && ssh-add spec/id_dsa_travis && rsync -e "ssh -o StrictHostKeyChecking=no" -rzv build/spec/ scalatest at chara.epfl.ch:/home/linuxsoft/archives/scala/spec/2.11/'
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e9505c2..6177342 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,15 +4,19 @@ We follow the standard GitHub [fork & pull](https://help.github.com/articles/usi
 You're always welcome to submit your PR straight away and start the discussion (without reading the rest of this wonderful doc, or the `READMEnot^H^H^H.md`). The goal of these notes is to make your experience contributing to Scala as smooth and pleasant as possible. We're happy to guide you through the process once you've submitted your PR.
 
 ## The Scala Community
-Last year, you -- the Scala community -- matched the core team at EPFL in number of commits contributed to Scala 2.11, doubling the percentage of commits from outside EPFL/Typesafe since 2.10. Excellent work! (The split is roughly 25/25/50 for you/epfl/typesafe. By the way, the team at Typesafe is: @adriaanm, @gkossakowski, @lrytz and @retronym.)
+In 2014, you -- the Scala community -- matched the core team at EPFL in number of commits contributed to Scala 2.11, doubling the percentage of commits from outside EPFL/Lightbend since 2.10. Excellent work! (The split was roughly 25/25/50 for you/EPFL/Lightbend.)
 
 We are super happy about this, and are eager to make your experience contributing to Scala productive and satisfying, so that we can keep up this growth. We can't do this alone (nor do we want to)!
 
 This is why we're collecting these notes on how to contribute, and we hope you'll share your experience to improve the process for the next contributor! (Feel free to send a PR for this note, send your thoughts to scala-internals, or tweet about it to @adriaanm.)
 
+By the way, the team at Lightbend is: @adriaanm, @lrytz, @retronym, @SethTisue, and @szeiger.
+
 ## What kind of PR are you submitting?
 
-Regardless of the nature of your Pull Request, we have to ask you to sign the [Scala CLA](http://typesafe.com/contribute/cla/scala), to protect the OSS nature of the code base.
+Regardless of the nature of your Pull Request, we have to ask you to digitally sign the [Scala CLA](http://www.lightbend.com/contribute/cla/scala), to protect the OSS nature of the code base.
+
+You don't need to submit separate PRs for 2.11.x, 2.12.x, and 2.13.x. Any changes accepted on one of these branches will, in time, be merged into the later branches.
 
 ### Documentation
 Whether you finally decided you couldn't stand that annoying typo anymore, you fixed the outdated code sample in some comment, or you wrote a nice, comprehensive, overview for an under-documented package, some docs for a class or the specifics about a method, your documentation improvement is very much appreciated, and we will do our best to fasttrack it.
@@ -28,25 +32,99 @@ The kind of code we can accept depends on the life cycle for the release you're
 
 #### Bug Fix
 
-Prefix your commit title with "SI-NNNN", where https://issues.scala-lang.org/browse/SI-NNNN tracks the bug you're fixing. We also recommend naming your branch after the Jira ticket number.
+Prefix your commit title with "SI-NNNN", where https://issues.scala-lang.org/browse/SI-NNNN tracks the bug you're fixing. We also recommend naming your branch after the JIRA ticket number.
 
-Please make sure the Jira ticket's fix version corresponds to the upcoming milestone for the branch your PR targets (the CI automation will automatically assign the milestone after you open the PR).
+Please make sure the JIRA ticket's fix version corresponds to the upcoming milestone for the branch your PR targets. The CI automation will automatically assign the milestone after you open the PR.
 
 #### Enhancement or New Feature
 
-For longer-running development, likely required for this category of code contributions, we suggest you include "topic" or "wip" in your branch name, to indicate that this is work in progress, and that others should be prepared to rebase if they branch off your branch.
+For longer-running development, likely required for this category of code contributions, we suggest you include "topic/" or "wip/" in your branch name, to indicate that this is work in progress, and that others should be prepared to rebase if they branch off your branch.
 
 Any language change (including bug fixes) must be accompanied by the relevant updates to the spec, which lives in the same repository for this reason.
 
 A new language feature requires a SIP (Scala Improvement Process) proposal. For more details on submitting SIPs, see [how to submit a SIP](http://docs.scala-lang.org/sips/sip-submission.html).
 
-#### Summary
+## Guidelines
+
+Here is some advice on how to craft a pull request with the best possible
+chance of being accepted.
+
+### Tests
+
+Bug fixes should include regression tests -- in the same commit as the fix.
+
+If testing isn't feasible, the commit message should explain why.
+
+New features and enhancements must be supported by a respectable test suite.
+
+Some characteristics of good tests:
+
+* includes comments: what is being tested and why?
+* be minimal, deterministic, stable (unaffected by irrelevant changes), easy to understand and review
+* have minimal dependencies: a compiler bug test should not depend on, e.g., the Scala library
+
+### Documentation
+
+This is of course required for new features and enhancements.
+
+Any API additions should include Scaladoc.
+
+Consider updating the package-level doc (in the package object), if appropriate.
+
+### Coding standards
+
+Please follow these standard code standards, though in moderation (scouts quickly learn to let sleeping dogs lie):
+
+* Don't violate [DRY](http://programmer.97things.oreilly.com/wiki/index.php/Don%27t_Repeat_Yourself).
+* Follow the [Boy Scout Rule](http://programmer.97things.oreilly.com/wiki/index.php/The_Boy_Scout_Rule).
+
+Please also have a look at the [Scala Hacker Guide](http://www.scala-lang.org/contribute/hacker-guide.html) by @xeno-by.
+
+### Clean commits, clean history
+
+A pull request should consist of commits with messages that clearly state what problem the commit resolves and how.
+
+Commit logs should be stated in the active, present tense.
+
+A commit's subject should be 72 characters or less.  Overall, think of
+the first line of the commit as a description of the action performed
+by the commit on the code base, so use the active voice and the
+present tense.  That also makes the commit subjects easy to reuse in
+release notes.
+
+For a bugfix, the title must look like "SI-NNNN - don't crash when
+moon is in wrong phase".
+
+If a commit purely refactors and is not intended to change behaviour,
+say so.
+
+Backports should be tagged as "[backport]".
+
+When working on maintenance branches (e.g., 2.11.x), include "[nomerge]"
+if this commit should not be merged forward into the next release
+branch.
+
+Here is standard advice on good commit messages:
+http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
+
+### Pass Scabot
+
+Our pull request bot, Scabot, automatically builds all the commits in a PR individually. (All, so we can `git bisect` later.)
+
+Click on the little x next to a commit sha to go to the overview of the PR validation job. To diagnose a failure, consult the console output of the job that failed.
+
+See the [scala-jenkins-infra repo](https://github.com/scala/scala-jenkins-infra) and [Scabot repo](https://github.com/scala/scabot) for full details on PR validation.  One tip you should know is that commenting `/rebuild` on a PR asks validation to be run again on the same commits. This is only necessary when a spurious failure occurred.
+
+### Pass code review
+
+Your PR will need to be assigned to one or more reviewers.  You can suggest reviewers yourself; if you're not sure, see the list in [README.md](README.md) or ask on scala-internals.
+
+To assign a reviewer, add a "review by @reviewer" to your PR description.
+
+NOTE: it's best not to @mention in commit messages, as github pings you every time a commit with your @name on it shuffles through the system (even in other repos, on merges,...).
 
-1. We require regression tests for bug fixes. New features and enhancements must be supported by a respectable test suite.
-2. Documentation. Yep! Also required :-)
-3. Please follow these standard code standards, though in moderation (scouts quickly learn to let sleeping dogs lie):
-   - Not violate [DRY](http://programmer.97things.oreilly.com/wiki/index.php/Don%27t_Repeat_Yourself).
-   - [Boy Scout Rule](http://programmer.97things.oreilly.com/wiki/index.php/The_Boy_Scout_Rule) should be applied.
+A reviewer gives the green light by commenting "LGTM" (looks good to me).
 
-Please also have a look at our [Pull Request Policy](https://github.com/scala/scala/wiki/Pull-Request-Policy), as well as the [Scala Hacker Guide](http://www.scala-lang.org/contribute/hacker-guide.html) by @xeno-by.
+A review feedback may be addressed by pushing new commits to the request, if these commits stand on their own.
 
+Once all these conditions are met, and we agree with the change (we are available on scala-internals to discuss this beforehand, before you put in the coding work!), we will merge your changes.
diff --git a/Gemfile b/Gemfile
index 53924a4..c8c926d 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,7 @@
 # To build the spec on Travis CI
 source "https://rubygems.org"
 
-gem "jekyll", "2.0.0.alpha.2"
+gem "jekyll", "2.5.3"
 gem "rouge"
 # gem 's3_website'
-# gem 'redcarpet'
+gem "redcarpet", "3.3.2"
diff --git a/README.md b/README.md
index d041978..64a09a4 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,18 @@
 # Welcome!
 This is the official repository for the [Scala Programming Language](http://www.scala-lang.org).
 
-To contribute to the Scala Standard Library, Scala Compiler and Scala Language Specification, please send us a [pull request](https://help.github.com/articles/using-pull-requests/#fork--pull) from your fork of this repository! We do have to ask you to sign the [Scala CLA](http://typesafe.com/contribute/cla/scala) before we can merge any of your work into our code base, to protect its open source nature.
+# How to contribute
 
-For more information on building and developing the core of Scala, read on! Please also check out our [guidelines for contributing](CONTRIBUTING.md).
+To contribute to the Scala Standard Library, Scala Compiler and Scala Language Specification, please send us a [pull request](https://help.github.com/articles/using-pull-requests/#fork--pull) from your fork of this repository! We do have to ask you to sign the [Scala CLA](http://www.lightbend.com/contribute/cla/scala) before we can merge any of your work into our code base, to protect its open source nature.
+
+For more information on building and developing the core of Scala, read on!
+
+Please also check out:
+
+* our [guidelines for contributing](CONTRIBUTING.md).
+* the ["Scala Hacker Guide"](http://scala-lang.org/contribute/hacker-guide.html) covers some of the same ground as this README, but in greater detail and in a more tutorial style, using a running example.
+
+# Reporting issues
 
 We're still using Jira for issue reporting, so please [report any issues](https://issues.scala-lang.org) over there.
 (We would love to start using GitHub Issues, but we're too resource-constrained to take on this migration right now.)
@@ -13,31 +22,30 @@ If you need some help with your PR at any time, please feel free to @-mention an
 
                                                                                                   | username                                                       | talk to me about...                               |
 --------------------------------------------------------------------------------------------------|----------------------------------------------------------------|---------------------------------------------------|
- <img src="https://avatars.githubusercontent.com/adriaanm"     height="50px" title="Adriaan Moors"/>        | [`@adriaanm`](https://github.com/adriaanm)           | anything (type checker, pattern matcher, CI,...)  |
- <img src="https://avatars.githubusercontent.com/gkossakowski" height="50px" title="Grzegorz Kossakowski"/> | [`@gkossakowski`](https://github.com/gkossakowski)   | infrastructure, incremental compilation, back-end |
- <img src="https://avatars.githubusercontent.com/retronym"     height="50px" title="Jason Zaugg"/>          | [`@retronym`](https://github.com/retronym)           | Java 8 lambdas, tricky bug detective work         |
- <img src="https://avatars.githubusercontent.com/Ichoran"      height="50px" title="Rex Kerr"/>             | [`@Ichoran`](https://github.com/Ichoran)             | the collections library, performance              |
+ <img src="https://avatars.githubusercontent.com/adriaanm"     height="50px" title="Adriaan Moors"/>        | [`@adriaanm`](https://github.com/adriaanm)           | type checker, pattern matcher, infrastructure, language spec |
+ <img src="https://avatars.githubusercontent.com/SethTisue"    height="50px" title="Seth Tisue"/>           | [`@SethTisue`](https://github.com/SethTisue)         | build, developer docs, community build, Jenkins, library, the welcome-to-Scala experience |
+ <img src="https://avatars.githubusercontent.com/retronym"     height="50px" title="Jason Zaugg"/>          | [`@retronym`](https://github.com/retronym)           | compiler performance, weird compiler bugs, Java 8 lambdas, REPL |
+ <img src="https://avatars.githubusercontent.com/Ichoran"      height="50px" title="Rex Kerr"/>             | [`@Ichoran`](https://github.com/Ichoran)             | collections library, performance              |
  <img src="https://avatars.githubusercontent.com/lrytz"        height="50px" title="Lukas Rytz"/>           | [`@lrytz`](https://github.com/lrytz)                 | optimizer, named & default arguments              |
- <img src="https://avatars.githubusercontent.com/dickwall"     height="50px" title="Dick Wall"/>            | [`@dickwall`](https://github.com/dickwall)           | process & documentation                           |
- <img src="https://avatars.githubusercontent.com/VladUreche"   height="50px" title="Vlad Ureche"/>          | [`@VladUreche`](https://github.com/VladUreche)       | specialization & the scaladoc tool                |
+ <img src="https://avatars.githubusercontent.com/VladUreche"   height="50px" title="Vlad Ureche"/>          | [`@VladUreche`](https://github.com/VladUreche)       | specialization, Scaladoc tool |
  <img src="https://avatars.githubusercontent.com/densh"        height="50px" title="Denys Shabalin"/>       | [`@densh`](https://github.com/densh)                 | quasiquotes, parser, string interpolators, macros in standard library |
  <img src="https://avatars.githubusercontent.com/xeno-by"      height="50px" title="Eugene Burmako"/>       | [`@xeno-by`](https://github.com/xeno-by)             | macros and reflection |
+ <img src="https://avatars.githubusercontent.com/heathermiller" height="50px" title="Heather Miller"/>      | [`@heathermiller`](https://github.com/heathermiller) | documentation |
+ <img src="https://avatars.githubusercontent.com/dickwall"     height="50px" title="Dick Wall"/>            | [`@dickwall`](https://github.com/dickwall)           | process & community, documentation |
+ <img src="https://avatars.githubusercontent.com/dragos"       height="50px" title="Iulian Dragos"/>        | [`@dragos`](https://github.com/dragos)               | specialization, back end |
+ <img src="https://avatars.githubusercontent.com/axel22"       height="50px" title="Aleksandr Prokopec"/>   | [`@axel22`](https://github.com/axel22)               | collections, concurrency, specialization |
+ <img src="https://avatars.githubusercontent.com/janekdb"      height="50px" title="Janek Bogucki"/>        | [`@janekdb`](https://github.com/janekdb)             | documentation |
 
-
-PS: If you have some spare time to help out around here, we would be delighted to add your name to this list! 
+P.S.: If you have some spare time to help out around here, we would be delighted to add your name to this list!
 
 # Handy Links
   - [A wealth of documentation](http://docs.scala-lang.org)
+  - [mailing lists](http://www.scala-lang.org/community/)
+  - [Gitter room for Scala contributors](https://gitter.im/scala/contributors)
   - [Scala CI](https://scala-ci.typesafe.com/)
-  - [Scala CI at EPFL](https://scala-webapps.epfl.ch/jenkins)
-  - [Download the latest nightly](https://scala-webapps.epfl.ch/jenkins/job/scala-nightly-main-master/ws/dists/latest/*zip*/latest.zip);
-  - Scala mailing lists:
-    - [Compiler and standard library development](https://groups.google.com/group/scala-internals)
-    - [Users of Scala](https://groups.google.com/group/scala-user)
-    - [Scala language discussion](https://groups.google.com/group/scala-language)
-    - [Scala Improvement Process](https://groups.google.com/group/scala-sips)
-    - [Debate](https://groups.google.com/group/scala-debate)
-    - [Announcements](https://groups.google.com/group/scala-announce)
+  - download the latest nightlies:
+      - [2.11.x](http://www.scala-lang.org/files/archive/nightly/2.11.x/)
+      - [2.12.x](http://www.scala-lang.org/files/archive/nightly/2.12.x/)
 
 # Repository structure
 
@@ -51,7 +59,7 @@ scala/
    +---/reflect              Scala Reflection.
    +---/compiler             Scala Compiler.
    +---/eclipse              Eclipse project files.
-   +---/intellij-14          IntelliJ project templates.
+   +---/intellij             IntelliJ project templates.
 +--scripts/                  Scripts for the CI jobs (including building releases)
 +--test/                     The Scala test suite.
 +--build/                    [Generated] Build products output directory for ant.
@@ -62,11 +70,17 @@ scala/
 
 ## Requirements
 
-You'll need a Java SDK (6 or newer), Apache Ant (version 1.8.0 or above), and curl (for `./pull-binary-libs.sh`).
+You'll need a Java SDK.  The baseline version is 6 for 2.11.x, 8 for
+2.12.x. (It's also possible to use a later SDK for local development,
+but the CI will verify against the baseline version.)
+
+You'll also need Apache Ant (version 1.9.0 or above) and curl (for `./pull-binary-libs.sh`).
+
+Mac OS X and Linux work. Windows may work if you use Cygwin. (Community help with keeping the build working on Windows is appreciated.)
 
 ## Git Hygiene
 
-As git history is forever, we take great pride in the quality of the commits we merge into the repository. The title of your commit will be read hundreds (of thousands? :-)) of times, so it pays off to spend just a little bit more time to polish it, making it descriptive and concise. Please take a minute to read the advice [most projects agree on](https://github.com/erlang/otp/wiki/Writing-good-commit-messages), and stick to 50-60 characters for the first line, wrapping subsequent ones a [...]
+As git history is forever, we take great pride in the quality of the commits we merge into the repository. The title of your commit will be read hundreds (of thousands? :-)) of times, so it pays off to spend just a little bit more time to polish it, making it descriptive and concise. Please take a minute to read the advice [most projects agree on](https://github.com/erlang/otp/wiki/Writing-good-commit-messages), and stick to 72 or fewer characters for the first line, wrapping subsequent  [...]
 
 When not sure how to formulate your commit message, imagine you're writing a bullet item for the next release notes, or describing what the commit does to the code base (use active verbs in the present tense). When your commit title is featured in the next release notes, it will be read by a lot of curious Scala users, looking for the latest improvements. Satisfy their thirst for information with as few words as possible! Also, a commit should convey clearly to your (future) fellow contr [...]
 
@@ -76,7 +90,7 @@ To pinpoint bugs, we often use git bisect, which is only effective when we can c
 
 This facilitates reviewing: a commit that reformats code can be judged quickly not to affect anything, so we can focus on the meat of the PR. It also helps when merging between long-running branches, reducing conflicts (or providing at least a limited scope for each one).
 
-Please do not @mention anyone in the commit message -- that's what the PR description and comments are for. Every time a commit is shuffled through github (in a merge in some fork, say), every @mention results in an email to that person (the core team treats them as personal email, straight to their inbox, so please don't flood us :-)).
+Please do not @-mention anyone in the commit message -- that's what the PR description and comments are for. Every time a commit is shuffled through github (in a merge in some fork, say), every @-mention results in an email to that person (the core team treats them as personal email, straight to their inbox, so please don't flood us :-)).
 
 
 ## Reviews
@@ -89,7 +103,18 @@ To help you plan your contributions, we communicate our plans on a regular basis
 
 ## Reviewing
 
-Once you've gained some experience with the code base and the process, the logical next step is to offers reviews for others's contributions. The main goal of this whole process, in the end, is to ensure the health of the Scala project by improving the quality of the code base, the documentation, as well as this process itself. Thank you for doing your part!
+Once you've gained some experience with the code base and the process, the next step is to review the contributions of others.
+
+The main goal of this whole process is to ensure the health of the Scala project by improving the quality of the code base, the documentation, as well as this process itself. Thank you for doing your part!
+
+## [Labels](https://github.com/scala/scala/labels)
+
+Label           | Description
+--------------- | -----------
+`reviewed`      | automatically added by scabot when a comment prefixed with LGTM is posted
+`welcome`       | reviewer / queue curator adds to welcome someone's first PR (for highlighting in the release notes)
+`release-notes` | reviewer / queue curator adds to make sure this PR is highlighted in the release notes
+`on-hold`       | added when this PR should not yet be merged, even though CI is green
 
 ### Tips & Tricks
 Once the `publish-core` task has completed on a commit, you can try it out in sbt as follows:
@@ -97,7 +122,7 @@ Once the `publish-core` task has completed on a commit, you can try it out in sb
 ```
 $ sbt
 
-> set resolvers += "pr" at "http://private-repo.typesafe.com/typesafe/scala-pr-validation-snapshots/"
+> set resolvers += "pr" at "https://scala-ci.typesafe.com/artifactory/scala-pr-validation-snapshots/"
 > set scalaVersion := "<milestone>-<sha7>-SNAPSHOT"
 > console
 ```
@@ -106,46 +131,47 @@ Here, `<milestone>` is the milestone targeted by the PR (e.g., 2.11.6), and `<sh
 
 ## IDE Setup
 ### Eclipse
-Download the [Scala IDE bundle](http://scala-ide.org/download/sdk.html). It comes preconfigured for optimal performance.
-
-  - Run `ant init` to download some necessary jars.
-  - Import the project (in `src/eclipse`) via `File` → `Import Existing Projects into Workspace`. Check all projects and click ok.
-
-For important details on building, debugging and file encodings, please see [the excellent tutorial on scala-ide.org](http://scala-ide.org/docs/tutorials/scalac-trunk/index.html) and the included README.md in src/eclipse.
+See `src/eclipse/README.md`.
 
-### IntelliJ 14
-Use the latest IntelliJ IDEA release and install the Scala plugin from within the IDE.
+### IntelliJ 15
+See [src/intellij/README.md](src/intellij/README.md).
 
-The following steps are required to use IntelliJ IDEA on Scala trunk
- - Run `ant init`. This will download some JARs to `./build/deps`, which are included in IntelliJ's classpath.
- - Run src/intellij-14/setup.sh
- - Open ./src/intellij-14/scala.ipr in IntelliJ
- - File, Project Settings, Project, SDK. Create an SDK entry named "1.6" containing the Java 1.6 SDK.
-   (You may use a later SDK for local development, but the CI will verify against Java 6.)
+## Building with sbt (EXPERIMENTAL)
 
-Compilation within IDEA is performed in "-Dlocker.skip=1" mode: the sources are built
-directly using the STARR compiler (which is downloaded from maven, according to `starr.version` in `versions.properties`).
+The experimental sbt-based build definition has arrived! Run `sbt package`
+to build the compiler. You can run `sbt test` to run unit (JUnit) tests.
+Use `sbt test/it:test` to run integration (partest) tests.
 
+We would like to migrate to sbt build as quickly as possible. If you would
+like to help please use the scala-internals mailing list to discuss your
+ideas and coordinate your effort with others.
 
 ## Building with Ant
 
 NOTE: we are working on migrating the build to sbt.
 
+If you are behind a HTTP proxy, include
+[`ANT_ARGS=-autoproxy`](https://ant.apache.org/manual/proxy.html) in
+your environment.
+
 Run `ant build-opt` to build an optimized version of the compiler.
 Verify your build using `ant test-opt`.
 
 The Scala build system is based on Apache Ant. Most required pre-compiled
 libraries are part of the repository (in 'lib/'). The following however is
-assumed to be installed on the build machine:
-
+assumed to be installed on the build machine: TODO
 
-### Tips and tricks
+### Ant Tips and tricks
 
 Here are some common commands. Most ant targets offer a `-opt` variant that runs under `-optimise` (CI runs the -optimize variant).
 
-  - `./pull-binary-libs.sh` [downloads](http://typesafe.artifactoryonline.com/typesafe) all binary artifacts associated with this commit.
-  - `ant -p` prints out information about the commonly used ant targets.
-  - `ant` or `ant build`: A quick compilation (to build/quick) of your changes using the locker compiler.
+Command                 | Description
+----------------------- | -----------
+`./pull-binary-libs.sh` | downloads all binary artifacts associated with this commit.
+`ant -p`                | prints out information about the commonly used ant targets.
+`ant` or `ant build`    | A quick compilation (to `build/quick`) of your changes using the locker compiler.
+`ant dist`              | builds a distribution in 'dists/latest'.
+`ant all.clean`         | removes all build files and all distributions.
 
 A typical debug cycle incrementally builds quick, then uses it to compile and run the file
 `sandbox/test.scala` as follows:
@@ -157,17 +183,14 @@ We typically alias `build/quick/bin/scalac -d sandbox` to `qsc` and `build/quick
 `ant test-opt` tests that your code is working and fit to be committed:
 
   - Runs the test suite and bootstrapping test on quick.
-  - You can run the suite only (skipping strap) with 'ant test.suite'.
+  - You can run the suite only (skipping strap) with `ant test.suite`.
 
 `ant docs` generates the HTML documentation for the library from the sources using the scaladoc tool in quick.
-Note: on most machines this requires more heap than is allocate by default.  You can adjust the parameters with ANT_OPTS. Example command line:
+Note: on most machines this requires more heap than is allocated by default.  You can adjust the parameters with `ANT_OPTS`. Example command line:
 
+```sh
+ANT_OPTS="-Xms512M -Xmx2048M -Xss1M -XX:MaxPermSize=128M" ant docs
 ```
-ANT_OPTS = "-Xms512M -Xmx2048M -Xss1M -XX:MaxPermSize=128M" ant docs
-```
-
-  - `ant dist` builds a distribution in 'dists/latest'.
-  - `ant all.clean` Removes all build files and all distributions.
 
 ### Bootstrapping concepts
 NOTE: This is somewhat outdated, but the ideas still hold.
@@ -177,7 +200,7 @@ compiles Scala in layers. Each layer is a complete compiled Scala compiler and l
 A superior layer is always compiled by the layer just below it. Here is a short
 description of the four layers that the build uses, from bottom to top:
 
-  - `starr`: the stable reference Scala release. We use an official version of Scala (specified by `starr.version` in `versions.properties`), downloaded from maven central.
+  - `starr`: the stable reference Scala release. We use an official version of Scala (specified by `starr.version` in `versions.properties`), downloaded from the Central Repository.
   - `locker`: the local reference which is compiled by starr and is the work compiler in a typical development cycle. Add `locker.skip=true` to `build.properties` to skip this step and speed up development when you're not changing code generation. In any case, after it has been built once, it is “frozen” in this state. Updating it to fit the current source code must be explicitly requested (`ant locker.unlock`).
   - `quick`: the layer which is incrementally built when testing changes in the compiler or library. This is considered an actual new version when locker is up-to-date in relation to the source code.
   - `strap`: a test layer used to check stability of the build.
diff --git a/bincompat-backward.whitelist.conf b/bincompat-backward.whitelist.conf
index a1706d1..0d85590 100644
--- a/bincompat-backward.whitelist.conf
+++ b/bincompat-backward.whitelist.conf
@@ -208,6 +208,15 @@ filter {
     {
         matchName="scala.reflect.io.ZipArchive.scala$reflect$io$ZipArchive$$walkIterator"
         problemName=MissingMethodProblem
+    },
+    // SI-8362: AbstractPromise extends AtomicReference
+    // It's ok to change a package-protected class in an impl package,
+    // even though it's not clear why it changed -- bug in generic signature generation?
+    // -public class scala.concurrent.impl.Promise$DefaultPromise<T>                          extends scala.concurrent.impl.AbstractPromise implements scala.concurrent.impl.Promise<T>
+    // +public class scala.concurrent.impl.Promise$DefaultPromise<T extends java.lang.Object> extends scala.concurrent.impl.AbstractPromise implements scala.concurrent.impl.Promise<T>
+    {
+        matchName="scala.concurrent.impl.Promise$DefaultPromise"
+        problemName=MissingTypesProblem
     }
   ]
 }
diff --git a/bincompat-forward.whitelist.conf b/bincompat-forward.whitelist.conf
index 3808083..a9fbaa7 100644
--- a/bincompat-forward.whitelist.conf
+++ b/bincompat-forward.whitelist.conf
@@ -319,6 +319,68 @@ filter {
     {
         matchName="scala.util.Random.scala$util$Random$$nextAlphaNum$1"
         problemName=MissingMethodProblem
+    },
+    // Nominally private but in practice JVM-visible methods for reworked scala.util.Sorting
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSort$default$5"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSort$mBc$sp"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSort$mFc$sp"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSort$mJc$sp"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSort"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSort$mCc$sp"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSort$mSc$sp"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$insertionSort"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSort$mZc$sp"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSort$mDc$sp"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSort$mIc$sp"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$mergeSorted"
+        problemName=MissingMethodProblem
+    },
+    {
+        matchName="scala.util.Sorting.scala$util$Sorting$$booleanSort"
+        problemName=MissingMethodProblem
+    },
+    // SI-8362: AbstractPromise extends AtomicReference
+    // It's ok to change a package-protected class in an impl package,
+    // even though it's not clear why it changed -- bug in generic signature generation?
+    // -public class scala.concurrent.impl.Promise$DefaultPromise<T>                          extends scala.concurrent.impl.AbstractPromise implements scala.concurrent.impl.Promise<T>
+    // +public class scala.concurrent.impl.Promise$DefaultPromise<T extends java.lang.Object> extends scala.concurrent.impl.AbstractPromise implements scala.concurrent.impl.Promise<T>
+    {
+        matchName="scala.concurrent.impl.Promise$DefaultPromise"
+        problemName=MissingTypesProblem
     }
   ]
 }
diff --git a/build-ant-macros.xml b/build-ant-macros.xml
index 259d6a6..ace86ca 100644
--- a/build-ant-macros.xml
+++ b/build-ant-macros.xml
@@ -91,7 +91,7 @@
 
   <macrodef name="simple-javac">
     <attribute name="project"/>
-    <!-- project: asm/forkjoin -->
+    <!-- project: forkjoin -->
     <attribute name="args" default=""/>
     <attribute name="jar" default="yes"/>
     <sequential>
@@ -371,6 +371,10 @@
         <then>
           <mkdir dir="${build-pack.dir}/${@{project}.targetdir}"/>
           <pre/>
+          <!-- can't check if a fileset is defined, so we have an additional property -->
+          <if><not><isset property="pack.@{project}.include-jars.defined"/></not><then>
+            <fileset id="pack.@{project}.include-jars" dir="." excludes="**" />
+          </then></if>
           <if>
             <not>
               <equals arg1="@{manifest}" arg2=""/>
@@ -380,6 +384,7 @@
                 <!-- update="true" makes no difference on my machine, so starting from scratch-->
                 <jar-opts/>
                 <path refid="pack.@{project}.files"/>
+                <zipgroupfileset refid="pack.@{project}.include-jars"/>
               </jar>
             </then>
             <else>
diff --git a/build.number b/build.number
index 5f8ed6d..cdba0b7 100644
--- a/build.number
+++ b/build.number
@@ -1,9 +1,13 @@
-#Tue Sep 11 19:21:09 CEST 2007
+# The version number in this file should be the next un-released minor version,
+# e.g., 2.11.7, 2.12.0, 2.12.1. It's used to determine version numbers for
+# SNAPSHOT / nightly builds and local builds of source checkouts.
+
 version.major=2
 version.minor=11
-version.patch=6
-# This is the -N part of a version.  if it's 0, it's dropped from maven versions.
+version.patch=8
+
+# This is the -N part of a version (2.9.1-1). If it's 0, it's dropped from maven versions. It should not be used again.
 version.bnum=0
 
 # To build a release, see scripts/jobs/scala-release-2.11.x-build
-# (normally run by the eponymous job on scala-ci.typesafe.com).
\ No newline at end of file
+# (normally run by the eponymous job on scala-ci.typesafe.com).
diff --git a/build.sbt b/build.sbt
new file mode 100644
index 0000000..b36f54b
--- /dev/null
+++ b/build.sbt
@@ -0,0 +1,853 @@
+/*
+ * The new, sbt-based build definition for Scala.
+ *
+ * What you see below is very much work-in-progress. The following features are implemented:
+ *   - Compiling all classses for the compiler and library ("compile" in the respective subprojects)
+ *   - Running JUnit tests ("test") and partest ("test/it:test")
+ *   - Creating build-sbt/quick with all compiled classes and launcher scripts ("dist/mkQuick")
+ *   - Creating build-sbt/pack with all JARs and launcher scripts ("dist/mkPack")
+ *   - Building all scaladoc sets ("doc")
+ *   - Publishing ("publishDists" and standard sbt tasks like "publish" and "publishLocal")
+ *
+ * You'll notice that this build definition is much more complicated than your typical sbt build.
+ * The main reason is that we are not benefiting from sbt's conventions when it comes project
+ * layout. For that reason we have to configure a lot more explicitly. I've tried explain in
+ * comments the less obvious settings.
+ *
+ * This nicely leads me to explaining goal and non-goals of this build definition. Goals are:
+ *
+ *   - to be easy to tweak it in case a bug or small inconsistency is found
+ *   - to mimic Ant's behavior as closely as possible
+ *   - to be super explicit about any departure from standard sbt settings
+ *   - to achieve functional parity with Ant build as quickly as possible
+ *   - to be readable and not necessarily succinct
+ *   - to provide the nicest development experience for people hacking on Scala
+ *
+ * Non-goals are:
+ *
+ *   - to have the shortest sbt build definition possible; we'll beat Ant definition
+ *     easily and that will thrill us already
+ *   - to remove irregularities from our build process right away
+ *   - to modularize the Scala compiler or library further
+ *
+ * It boils down to simple rules:
+ *
+ *   - project layout is set in stone for now
+ *   - if you need to work on convincing sbt to follow non-standard layout then
+ *     explain everything you did in comments
+ *   - constantly check where Ant build produces class files, artifacts, what kind of other
+ *     files generates and port all of that to here
+ *
+ * Note on bootstrapping:
+ *
+ *   Let's start with reminder what bootstrapping means in our context. It's an answer
+ *   to this question: which version of Scala are using to compile Scala? The fact that
+ *   the question sounds circular suggests trickiness. Indeed, bootstrapping Scala
+ *   compiler is a tricky process.
+ *
+ *   Ant build used to have involved system of bootstrapping Scala. It would consist of
+ *   three layers: starr, locker and quick. The sbt build for Scala ditches layering
+ *   and strives to be as standard sbt project as possible. This means that we are simply
+ *   building Scala with latest stable release of Scala.
+ *   See this discussion for more details behind this decision:
+ *     https://groups.google.com/d/topic/scala-internals/gp5JsM1E0Fo/discussion
+ */
+
+import VersionUtil._
+
+val bootstrapScalaVersion = versionProps("starr.version")
+
+def withoutScalaLang(moduleId: ModuleID): ModuleID = moduleId exclude("org.scala-lang", "*")
+
+// exclusion of the scala-library transitive dependency avoids eviction warnings during `update`.
+val actorsMigrationDep = withoutScalaLang("org.scala-lang" %% "scala-actors-migration" % versionNumber("actors-migration"))
+val akkaActorDep = withoutScalaLang("com.typesafe.akka" %% "akka-actor" % versionNumber("akka-actor"))
+val scalaContinuationsLibraryDep = withoutScalaLang("org.scala-lang.plugins" %% "scala-continuations-library" % versionNumber("scala-continuations-library"))
+val scalaContinuationsPluginDep = withoutScalaLang("org.scala-lang.plugins" % ("scala-continuations-plugin_" + versionProps("scala.full.version")) % versionNumber("scala-continuations-plugin"))
+val scalaParserCombinatorsDep = withoutScalaLang("org.scala-lang.modules" %% "scala-parser-combinators" % versionNumber("scala-parser-combinators"))
+val scalaSwingDep = withoutScalaLang("org.scala-lang.modules" %% "scala-swing" % versionNumber("scala-swing"))
+val scalaXmlDep = withoutScalaLang("org.scala-lang.modules" %% "scala-xml" % versionNumber("scala-xml"))
+val partestDep = withoutScalaLang("org.scala-lang.modules" %% "scala-partest" % versionNumber("partest"))
+val junitDep = "junit" % "junit" % "4.11"
+val junitIntefaceDep = "com.novocode" % "junit-interface" % "0.11" % "test"
+val asmDep = "org.scala-lang.modules" % "scala-asm" % versionProps("scala-asm.version")
+val jlineDep = "jline" % "jline" % versionProps("jline.version")
+val antDep = "org.apache.ant" % "ant" % "1.9.4"
+val scalacheckDep = withoutScalaLang("org.scalacheck" %% "scalacheck" % versionNumber("scalacheck") % "it")
+
+/** Publish to ./dists/maven-sbt, similar to the ANT build which publishes to ./dists/maven. This
+  * can be used to compare the output of the sbt and ANT builds during the transition period. Any
+  * real publishing should be done with sbt's standard `publish` task. */
+lazy val publishDists = taskKey[Unit]("Publish to ./dists/maven-sbt.")
+
+lazy val publishSettings : Seq[Setting[_]] = Seq(
+  publishDists := {
+    val artifacts = (packagedArtifacts in publish).value
+    val ver = VersionUtil.versionProperties.value.canonicalVersion
+    val log = streams.value.log
+    val mappings = artifacts.toSeq.map { case (a, f) =>
+      val typeSuffix = a.`type` match {
+        case "pom" => "-pom.xml"
+        case "bundle" | "jar" => ".jar"
+        case "doc" => "-docs.jar"
+        case tpe => s"-$tpe.${a.extension}"
+      }
+      val to = file("dists/maven-sbt") / ver / a.name / (a.name + typeSuffix)
+      log.info(s"Publishing $f to $to")
+      (f, to)
+    }
+    IO.copy(mappings)
+  },
+  credentials ++= {
+    val file = Path.userHome / ".credentials"
+    if (file.exists) List(Credentials(file))
+    else Nil
+  },
+  publishMavenStyle := true
+)
+
+// Set the version number: The ANT build uses the file "build.number" to get the base version. Overriding versions or
+// suffixes for certain builds is done by directly setting variables from the shell scripts. For example, in
+// publish-core this requires computing the commit SHA first and then passing it to ANT. In the sbt build we use
+// the two settings `baseVersion` and `baseVersionSuffix` to compute all versions (canonical, Maven, OSGi). See
+// VersionUtil.versionPropertiesImpl for details. The standard sbt `version` setting should not be set directly. It
+// is the same as the Maven version and derived automatically from `baseVersion` and `baseVersionSuffix`.
+globalVersionSettings
+baseVersion in Global := "2.11.8"
+baseVersionSuffix in Global := "SNAPSHOT"
+
+lazy val commonSettings = clearSourceAndResourceDirectories ++ publishSettings ++ Seq[Setting[_]](
+  organization := "org.scala-lang",
+  scalaVersion := bootstrapScalaVersion,
+  // we don't cross build Scala itself
+  crossPaths := false,
+  // do not add Scala library jar as a dependency automatically
+  autoScalaLibrary := false,
+  // we also do not add scala instance automatically because it introduces
+  // a circular instance, see: https://github.com/sbt/sbt/issues/1872
+  managedScalaInstance := false,
+  // this is a way to workaround issue described in https://github.com/sbt/sbt/issues/1872
+  // check it out for more details
+  scalaInstance := ScalaInstance(scalaVersion.value, appConfiguration.value.provider.scalaProvider.launcher getScala scalaVersion.value),
+  // we always assume that Java classes are standalone and do not have any dependency
+  // on Scala classes
+  compileOrder := CompileOrder.JavaThenScala,
+  javacOptions in Compile ++= Seq("-g", "-source", "1.5", "-target", "1.6"),
+  // we don't want any unmanaged jars; as a reminder: unmanaged jar is a jar stored
+  // directly on the file system and it's not resolved through Ivy
+  // Ant's build stored unmanaged jars in `lib/` directory
+  unmanagedJars in Compile := Seq.empty,
+  sourceDirectory in Compile := baseDirectory.value,
+  unmanagedSourceDirectories in Compile := List(baseDirectory.value),
+  unmanagedResourceDirectories in Compile += (baseDirectory in ThisBuild).value / "src" / thisProject.value.id,
+  scalaSource in Compile := (sourceDirectory in Compile).value,
+  javaSource in Compile := (sourceDirectory in Compile).value,
+  // resources are stored along source files in our current layout
+  resourceDirectory in Compile := (sourceDirectory in Compile).value,
+  // each subproject has to ask specifically for files they want to include
+  includeFilter in unmanagedResources in Compile := NothingFilter,
+  target := (baseDirectory in ThisBuild).value / "target" / thisProject.value.id,
+  classDirectory in Compile := buildDirectory.value / "quick/classes" / thisProject.value.id,
+  target in Compile in doc := buildDirectory.value / "scaladoc" / thisProject.value.id,
+  // given that classDirectory and doc target are overriden to be _outside_ of target directory, we have
+  // to make sure they are being cleaned properly
+  cleanFiles += (classDirectory in Compile).value,
+  cleanFiles += (target in Compile in doc).value,
+  fork in run := true,
+  scalacOptions in Compile in doc ++= Seq(
+    "-doc-footer", "epfl",
+    "-diagrams",
+    "-implicits",
+    "-groups",
+    "-doc-version", versionProperties.value.canonicalVersion,
+    "-doc-title", description.value,
+    "-sourcepath", (baseDirectory in ThisBuild).value.toString,
+    "-doc-source-url", s"https://github.com/scala/scala/tree/${versionProperties.value.githubTree}€{FILE_PATH}.scala#L1"
+  ),
+  homepage := Some(url("http://www.scala-lang.org")),
+  startYear := Some(2002),
+  licenses += ("BSD 3-Clause", url("http://www.scala-lang.org/license.html")),
+  apiURL := Some(url("http://www.scala-lang.org/api/" + versionProperties.value.mavenVersion + "/")),
+  pomIncludeRepository := { _ => false },
+  pomExtra := {
+    val base =
+      <scm>
+        <connection>scm:git:git://github.com/scala/scala.git</connection>
+        <url>https://github.com/scala/scala.git</url>
+      </scm>
+        <issueManagement>
+          <system>JIRA</system>
+          <url>https://issues.scala-lang.org/</url>
+        </issueManagement>
+        <developers>
+          <developer>
+            <id>lamp</id>
+            <name>EPFL LAMP</name>
+          </developer>
+          <developer>
+            <id>Lightbend</id>
+            <name>Lightbend, Inc.</name>
+          </developer>
+        </developers>
+    apiURL.value match {
+      case Some(url) => base ++
+        <properties>
+          <info.apiURL>{url.toString}</info.apiURL>
+        </properties>
+      case None => base
+    }
+  },
+  // Remove auto-generated manifest attributes
+  packageOptions in Compile in packageBin := Seq.empty,
+  packageOptions in Compile in packageSrc := Seq.empty,
+
+  // Lets us CTRL-C partest without exiting SBT entirely
+  cancelable in Global := true,
+  // When we fork subprocesses, use the base directory as the working directory.
+  // This enables `sbt> partest test/files/run/t1.scala` or `sbt> scalac sandbox/test.scala`
+  baseDirectory in Compile := (baseDirectory in ThisBuild).value,
+  baseDirectory in Test := (baseDirectory in ThisBuild).value,
+
+  // Don't log process output (e.g. of forked `compiler/runMain ...Main`), just pass it
+  // directly to stdout
+  outputStrategy in run := Some(StdoutOutput)
+)
+
+/** Extra post-processing for the published POM files. These are needed to create POMs that
+  * are equivalent to the ones from the ANT build. In the long term this should be removed and
+  * POMs, scaladocs, OSGi manifests, etc. should all use the same metadata. */
+def fixPom(extra: (String, scala.xml.Node)*): Setting[_] = {
+  /** Find elements in an XML document by a simple XPath and replace them */
+  def fixXML(n: scala.xml.Node, repl: Map[String, scala.xml.Node]): scala.xml.Node = {
+    def f(n: scala.xml.Node, p: String): scala.xml.Node = n match {
+      case e: scala.xml.Elem =>
+        val pp = p + "/" + e.label
+        repl.get(pp) match {
+          case Some(xml) => xml
+          case None => e.copy(child = e.child.map(ch => f(ch, pp)))
+        }
+      case n => n
+    }
+    f(n, "")
+  }
+  pomPostProcess := { n => fixXML(pomPostProcess.value.apply(n), Map(
+    "/project/organization" ->
+      <organization>
+        <name>LAMP/EPFL</name>
+        <url>http://lamp.epfl.ch/</url>
+      </organization>,
+    "/project/url" -> <url>http://www.scala-lang.org/</url>
+  ) ++ extra) }
+}
+
+/** Remove unwanted dependencies from the POM. */
+def removePomDependencies(deps: (String, String)*): Setting[_] = {
+  pomPostProcess := { n =>
+    val n2 = pomPostProcess.value.apply(n)
+    import scala.xml._
+    import scala.xml.transform._
+    (new RuleTransformer(new RewriteRule {
+      override def transform(node: Node) = node match {
+        case e: Elem if e.label == "dependency" &&
+            deps.exists { case (g, a) =>
+              e.child.contains(<groupId>{g}</groupId>) &&
+                (e.child.contains(<artifactId>{a}</artifactId>) || e.child.contains(<artifactId>{a + "_" + scalaBinaryVersion.value}</artifactId>))
+            } => Seq.empty
+        case n => Seq(n)
+      }
+    })).transform(Seq(n2)).head
+  }
+}
+
+val disableDocs = Seq[Setting[_]](
+  sources in (Compile, doc) := Seq.empty,
+  publishArtifact in (Compile, packageDoc) := false
+)
+
+lazy val setJarLocation: Setting[_] =
+  artifactPath in packageBin in Compile := {
+    // two lines below are copied over from sbt's sources:
+    // https://github.com/sbt/sbt/blob/0.13/main/src/main/scala/sbt/Defaults.scala#L628
+    //val resolvedScalaVersion = ScalaVersion((scalaVersion in artifactName).value, (scalaBinaryVersion in artifactName).value)
+    //val resolvedArtifactName = artifactName.value(resolvedScalaVersion, projectID.value, artifact.value)
+    // if you would like to get a jar with version number embedded in it (as normally sbt does)
+    // uncomment the other definition of the `resolvedArtifactName`
+    val resolvedArtifact = artifact.value
+    val resolvedArtifactName = s"${resolvedArtifact.name}.${resolvedArtifact.extension}"
+    buildDirectory.value / "pack/lib" / resolvedArtifactName
+  }
+lazy val scalaSubprojectSettings: Seq[Setting[_]] = commonSettings :+ setJarLocation
+
+def filterDocSources(ff: FileFilter): Seq[Setting[_]] = Seq(
+  sources in (Compile, doc) ~= (_.filter(ff.accept _)),
+  // Excluded sources may still be referenced by the included sources, so we add the compiler
+  // output to the scaladoc classpath to resolve them. For the `library` project this is
+  // always required because otherwise the compiler cannot even initialize Definitions without
+  // binaries of the library on the classpath. Specifically, we get this error:
+  // (library/compile:doc) scala.reflect.internal.FatalError: package class scala does not have a member Int
+  // Ant build does the same thing always: it puts binaries for documented classes on the classpath
+  // sbt never does this by default (which seems like a good default)
+  dependencyClasspath in (Compile, doc) += (classDirectory in Compile).value,
+  doc in Compile <<= doc in Compile dependsOn (compile in Compile)
+)
+
+def regexFileFilter(s: String): FileFilter = new FileFilter {
+  val pat = s.r.pattern
+  def accept(f: File) = pat.matcher(f.getAbsolutePath.replace('\\', '/')).matches()
+}
+
+lazy val library = configureAsSubproject(project)
+  .settings(generatePropertiesFileSettings: _*)
+  .settings(Osgi.settings: _*)
+  .settings(
+    name := "scala-library",
+    description := "Scala Standard Library",
+    scalacOptions in Compile ++= Seq[String]("-sourcepath", (scalaSource in Compile).value.toString),
+    scalacOptions in Compile in doc ++= {
+      val libraryAuxDir = (baseDirectory in ThisBuild).value / "src/library-aux"
+      Seq(
+        "-doc-no-compile", libraryAuxDir.toString,
+        "-skip-packages", "scala.concurrent.impl",
+        "-doc-root-content", (sourceDirectory in Compile).value + "/rootdoc.txt"
+      )
+    },
+    includeFilter in unmanagedResources in Compile := "*.tmpl" | "*.xml" | "*.js" | "*.css" | "rootdoc.txt",
+    // Include *.txt files in source JAR:
+    mappings in Compile in packageSrc ++= {
+      val base = (unmanagedResourceDirectories in Compile).value
+      base ** "*.txt" pair relativeTo(base)
+    },
+    // Include forkjoin classes in scala-library.jar
+    products in Compile in packageBin ++=
+      (products in Compile in packageBin in forkjoin).value,
+    Osgi.headers += "Import-Package" -> "sun.misc;resolution:=optional, *",
+    fixPom(
+      "/project/name" -> <name>Scala Library</name>,
+      "/project/description" -> <description>Standard library for the Scala Programming Language</description>,
+      "/project/packaging" -> <packaging>jar</packaging>
+    ),
+    // Remove the dependency on "forkjoin" from the POM because it is included in the JAR:
+    removePomDependencies(("org.scala-lang", "forkjoin"))
+  )
+  .settings(filterDocSources("*.scala" -- (regexFileFilter(".*/runtime/.*\\$\\.scala") ||
+                                           regexFileFilter(".*/runtime/ScalaRunTime\\.scala") ||
+                                           regexFileFilter(".*/runtime/StringAdd\\.scala"))): _*)
+  .dependsOn(forkjoin)
+
+lazy val reflect = configureAsSubproject(project)
+  .settings(generatePropertiesFileSettings: _*)
+  .settings(Osgi.settings: _*)
+  .settings(
+    name := "scala-reflect",
+    description := "Scala Reflection Library",
+    Osgi.bundleName := "Scala Reflect",
+    scalacOptions in Compile in doc ++= Seq(
+      "-skip-packages", "scala.reflect.macros.internal:scala.reflect.internal:scala.reflect.io"
+    ),
+    Osgi.headers +=
+      "Import-Package" -> ("scala.*;version=\"${range;[==,=+);${ver}}\","+
+                           "scala.tools.nsc;resolution:=optional;version=\"${range;[==,=+);${ver}}\","+
+                           "*"),
+    fixPom(
+      "/project/name" -> <name>Scala Compiler</name>,
+      "/project/description" -> <description>Compiler for the Scala Programming Language</description>,
+      "/project/packaging" -> <packaging>jar</packaging>
+    )
+  )
+  .dependsOn(library)
+
+lazy val compiler = configureAsSubproject(project)
+  .settings(generatePropertiesFileSettings: _*)
+  .settings(Osgi.settings: _*)
+  .settings(
+    name := "scala-compiler",
+    description := "Scala Compiler",
+    libraryDependencies ++= Seq(antDep, asmDep),
+    // These are only needed for the POM:
+    libraryDependencies ++= Seq(scalaXmlDep, scalaParserCombinatorsDep, jlineDep % "optional"),
+    // this a way to make sure that classes from interactive and scaladoc projects
+    // end up in compiler jar (that's what Ant build does)
+    // we need to use LocalProject references (with strings) to deal with mutual recursion
+    products in Compile in packageBin :=
+      (products in Compile in packageBin).value ++
+        Seq((dependencyClasspath in Compile).value.find(_.get(moduleID.key) == Some(asmDep)).get.data) ++
+        (products in Compile in packageBin in LocalProject("interactive")).value ++
+        (products in Compile in packageBin in LocalProject("scaladoc")).value ++
+        (products in Compile in packageBin in LocalProject("repl")).value ++
+        (products in Compile in packageBin in LocalProject("repl-jline")).value ++
+        (products in Compile in packageBin in LocalProject("repl-jline-embedded")).value,
+    includeFilter in unmanagedResources in Compile :=
+      "*.tmpl" | "*.xml" | "*.js" | "*.css" | "*.html" | "*.properties" | "*.swf" |
+      "*.png" | "*.gif" | "*.gif" | "*.txt",
+    // Also include the selected unmanaged resources and source files from the additional projects in the source JAR:
+    mappings in Compile in packageSrc ++= {
+      val base = (unmanagedResourceDirectories in Compile).value ++
+        (unmanagedResourceDirectories in Compile in LocalProject("interactive")).value ++
+        (unmanagedResourceDirectories in Compile in LocalProject("scaladoc")).value ++
+        (unmanagedResourceDirectories in Compile in LocalProject("repl")).value
+      base ** ((includeFilter in unmanagedResources in Compile).value || "*.scala" || "*.psd" || "*.ai" || "*.java") pair relativeTo(base)
+    },
+    scalacOptions in Compile in doc ++= Seq(
+      "-doc-root-content", (sourceDirectory in Compile).value + "/rootdoc.txt"
+    ),
+    Osgi.headers +=
+      "Import-Package" -> ("jline.*;resolution:=optional," +
+                           "org.apache.tools.ant.*;resolution:=optional," +
+                           "scala.util.parsing.*;version=\"${range;[====,====];"+versionNumber("scala-parser-combinators")+"}\";resolution:=optional," +
+                           "scala.xml.*;version=\"${range;[====,====];"+versionNumber("scala-xml")+"}\";resolution:=optional," +
+                           "scala.*;version=\"${range;[==,=+);${ver}}\"," +
+                           "*"),
+    // Generate the ScriptEngineFactory service definition. The ant build does this when building
+    // the JAR but sbt has no support for it and it is easier to do as a resource generator:
+    generateServiceProviderResources("javax.script.ScriptEngineFactory" -> "scala.tools.nsc.interpreter.IMain$Factory"),
+    managedResourceDirectories in Compile := Seq((resourceManaged in Compile).value),
+    fixPom(
+      "/project/name" -> <name>Scala Compiler</name>,
+      "/project/description" -> <description>Compiler for the Scala Programming Language</description>,
+      "/project/packaging" -> <packaging>jar</packaging>
+    ),
+    apiURL := None,
+    removePomDependencies(
+      ("org.apache.ant", "ant"),
+      ("org.scala-lang.modules", "scala-asm")
+    )
+  )
+  .dependsOn(library, reflect)
+
+lazy val interactive = configureAsSubproject(project)
+  .settings(disableDocs: _*)
+  .settings(
+    name := "scala-compiler-interactive",
+    description := "Scala Interactive Compiler",
+    publishArtifact := false
+  )
+  .dependsOn(compiler)
+
+lazy val repl = configureAsSubproject(project)
+  .settings(disableDocs: _*)
+  .settings(
+    connectInput in run := true,
+    publishArtifact := false,
+    run <<= (run in Compile).partialInput(" -usejavacp") // Automatically add this so that `repl/run` works without additional arguments.
+  )
+  .dependsOn(compiler, interactive)
+
+lazy val replJline = configureAsSubproject(Project("repl-jline", file(".") / "src" / "repl-jline"))
+  .settings(disableDocs: _*)
+  .settings(
+    libraryDependencies += jlineDep,
+    name := "scala-repl-jline",
+    publishArtifact := false
+  )
+  .dependsOn(repl)
+
+lazy val replJlineEmbedded = Project("repl-jline-embedded", file(".") / "target" / "repl-jline-embedded-src-dummy")
+  .settings(scalaSubprojectSettings: _*)
+  .settings(
+    name := "scala-repl-jline-embedded",
+    // There is nothing to compile for this project. Instead we use the compile task to create
+    // shaded versions of repl-jline and jline.jar. dist/mkBin puts all of quick/repl,
+    // quick/repl-jline and quick/repl-jline-shaded on the classpath for quick/bin scripts.
+    // This is different from the ant build where all parts are combined into quick/repl, but
+    // it is cleaner because it avoids circular dependencies.
+    compile in Compile <<= (compile in Compile).dependsOn(Def.task {
+      import java.util.jar._
+      import collection.JavaConverters._
+      val inputs: Iterator[JarJar.Entry] = {
+        val repljlineClasses = (products in Compile in replJline).value.flatMap(base => Path.allSubpaths(base).map(x => (base, x._1)))
+        val jlineJAR = (dependencyClasspath in Compile).value.find(_.get(moduleID.key) == Some(jlineDep)).get.data
+        val jarFile = new JarFile(jlineJAR)
+        val jarEntries = jarFile.entries.asScala.filterNot(_.isDirectory).map(entry => JarJar.JarEntryInput(jarFile, entry))
+        def compiledClasses = repljlineClasses.iterator.map { case (base, file) => JarJar.FileInput(base, file) }
+        (jarEntries ++ compiledClasses).filter(x =>
+          x.name.endsWith(".class") || x.name.endsWith(".properties") || x.name.startsWith("META-INF/native") || x.name.startsWith("META-INF/maven")
+        )
+      }
+      //println(inputs.map(_.name).mkString("\n"))
+      import JarJar.JarJarConfig._
+      val config: Seq[JarJar.JarJarConfig] = Seq(
+        Rule("org.fusesource.**", "scala.tools.fusesource_embedded. at 1"),
+        Rule("jline.**", "scala.tools.jline_embedded. at 1"),
+        Rule("scala.tools.nsc.interpreter.jline.**", "scala.tools.nsc.interpreter.jline_embedded. at 1"),
+        Keep("scala.tools.**")
+      )
+      val outdir = (classDirectory in Compile).value
+      JarJar(inputs, outdir, config)
+    }),
+    publishArtifact := false,
+    connectInput in run := true
+  )
+  .dependsOn(replJline)
+
+lazy val scaladoc = configureAsSubproject(project)
+  .settings(disableDocs: _*)
+  .settings(
+    name := "scala-compiler-doc",
+    description := "Scala Documentation Generator",
+    libraryDependencies ++= Seq(scalaXmlDep, scalaParserCombinatorsDep, partestDep),
+    publishArtifact := false,
+    includeFilter in unmanagedResources in Compile := "*.html" | "*.css" | "*.gif" | "*.png" | "*.js" | "*.txt"
+  )
+  .dependsOn(compiler)
+
+lazy val scalap = configureAsSubproject(project)
+  .settings(
+    description := "Scala Bytecode Parser",
+    // Include decoder.properties
+    includeFilter in unmanagedResources in Compile := "*.properties",
+    fixPom(
+      "/project/name" -> <name>Scalap</name>,
+      "/project/description" -> <description>bytecode analysis tool</description>,
+      "/project/properties" -> scala.xml.Text("")
+    )
+  )
+  .dependsOn(compiler)
+
+// deprecated Scala Actors project
+lazy val actors = configureAsSubproject(project)
+  .settings(generatePropertiesFileSettings: _*)
+  .settings(Osgi.settings: _*)
+  .settings(
+    name := "scala-actors",
+    description := "Scala Actors Library",
+    Osgi.bundleName := "Scala Actors",
+    startYear := Some(2006),
+    fixPom(
+      "/project/name" -> <name>Scala Actors library</name>,
+      "/project/description" -> <description>Deprecated Actors Library for Scala</description>,
+      "/project/packaging" -> <packaging>jar</packaging>
+    )
+  )
+  .settings(filterDocSources("*.scala"): _*)
+  .dependsOn(library)
+
+lazy val forkjoin = configureAsForkOfJavaProject(project)
+
+lazy val partestExtras = configureAsSubproject(Project("partest-extras", file(".") / "src" / "partest-extras"))
+  .dependsOn(replJlineEmbedded)
+  .settings(clearSourceAndResourceDirectories: _*)
+  .settings(disableDocs: _*)
+  .settings(
+    name := "scala-partest-extras",
+    description := "Scala Compiler Testing Tool (compiler-specific extras)",
+    publishArtifact := false,
+    libraryDependencies += partestDep,
+    unmanagedSourceDirectories in Compile := List(baseDirectory.value)
+  )
+
+lazy val junit = project.in(file("test") / "junit")
+  .dependsOn(library, reflect, compiler, partestExtras, scaladoc)
+  .settings(clearSourceAndResourceDirectories: _*)
+  .settings(commonSettings: _*)
+  .settings(disableDocs: _*)
+  .settings(
+    publishArtifact := false,
+    fork in Test := true,
+    libraryDependencies ++= Seq(junitDep, junitIntefaceDep),
+    testOptions += Tests.Argument(TestFrameworks.JUnit, "-a", "-v"),
+    unmanagedSourceDirectories in Test := List(baseDirectory.value)
+  )
+
+lazy val partestJavaAgent = Project("partest-javaagent", file(".") / "src" / "partest-javaagent")
+  .settings(commonSettings: _*)
+  .settings(generatePropertiesFileSettings: _*)
+  .settings(disableDocs: _*)
+  .settings(
+    libraryDependencies += asmDep,
+    publishLocal := {},
+    publish := {},
+    // Setting name to "scala-partest-javaagent" so that the jar file gets that name, which the Runner relies on
+    name := "scala-partest-javaagent",
+    description := "Scala Compiler Testing Tool (compiler-specific java agent)",
+    // writing jar file to $buildDirectory/pack/lib because that's where it's expected to be found
+    setJarLocation,
+    // add required manifest entry - previously included from file
+    packageOptions in (Compile, packageBin) +=
+      Package.ManifestAttributes( "Premain-Class" -> "scala.tools.partest.javaagent.ProfilingAgent" ),
+    // we need to build this to a JAR
+    exportJars := true
+  )
+
+lazy val test = project
+  .dependsOn(compiler, interactive, actors, replJlineEmbedded, scalap, partestExtras, partestJavaAgent, scaladoc)
+  .configs(IntegrationTest)
+  .settings(commonSettings: _*)
+  .settings(disableDocs: _*)
+  .settings(Defaults.itSettings: _*)
+  .settings(
+    publishArtifact := false,
+    libraryDependencies ++= Seq(asmDep, partestDep, scalaXmlDep, scalacheckDep),
+    unmanagedBase in IntegrationTest := baseDirectory.value / "files" / "lib",
+    unmanagedJars in IntegrationTest <+= (unmanagedBase) (j => Attributed.blank(j)) map(identity),
+    // no main sources
+    sources in Compile := Seq.empty,
+    // test sources are compiled in partest run, not here
+    sources in IntegrationTest := Seq.empty,
+    fork in IntegrationTest := true,
+    javaOptions in IntegrationTest += "-Xmx1G",
+    testFrameworks += new TestFramework("scala.tools.partest.sbt.Framework"),
+    testOptions in IntegrationTest += Tests.Setup( () => root.base.getAbsolutePath + "/pull-binary-libs.sh" ! ),
+    testOptions in IntegrationTest += Tests.Argument("-Dpartest.java_opts=-Xmx1024M -Xms64M -XX:MaxPermSize=128M"),
+    definedTests in IntegrationTest += (
+      new sbt.TestDefinition(
+        "partest",
+        // marker fingerprint since there are no test classes
+        // to be discovered by sbt:
+        new sbt.testing.AnnotatedFingerprint {
+          def isModule = true
+          def annotationName = "partest"
+        }, true, Array())
+     )
+  )
+
+lazy val manual = configureAsSubproject(project)
+  .settings(disableDocs: _*)
+  .settings(
+    publishArtifact := false,
+    libraryDependencies ++= Seq(scalaXmlDep, antDep),
+    classDirectory in Compile := (target in Compile).value / "classes"
+  )
+  .dependsOn(library)
+
+lazy val libraryAll = Project("library-all", file(".") / "target" / "library-all-src-dummy")
+  .settings(commonSettings: _*)
+  .settings(disableDocs: _*)
+  .settings(
+    name := "scala-library-all",
+    publishArtifact in (Compile, packageBin) := false,
+    publishArtifact in (Compile, packageSrc) := false,
+    libraryDependencies ++= Seq(scalaXmlDep, scalaParserCombinatorsDep, scalaContinuationsLibraryDep, scalaSwingDep, akkaActorDep, actorsMigrationDep),
+    apiURL := None,
+    fixPom(
+      "/project/name" -> <name>Scala Library Powerpack</name>,
+      "/project/description" -> <description>The Scala Standard Library and Official Modules</description>
+    )
+  )
+  .dependsOn(library, reflect)
+
+lazy val scalaDist = Project("scala-dist", file(".") / "target" / "scala-dist-dist-src-dummy")
+  .settings(commonSettings: _*)
+  .settings(disableDocs: _*)
+  .settings(
+    mappings in Compile in packageBin ++= {
+      val binBaseDir = buildDirectory.value / "pack"
+      val binMappings = (mkBin in dist).value.pair(relativeTo(binBaseDir), errorIfNone = false)
+      // With the way the resource files are spread out over the project sources we can't just add
+      // an unmanagedResourceDirectory, so we generate the mappings manually:
+      val docBaseDir = (baseDirectory in ThisBuild).value
+      val docMappings = (docBaseDir / "doc").*** pair relativeTo(docBaseDir)
+      val resBaseDir = (baseDirectory in ThisBuild).value / "src/manual/scala/tools/docutil/resources"
+      val resMappings = resBaseDir ** ("*.html" | "*.css" | "*.gif" | "*.png") pair (p => relativeTo(resBaseDir)(p).map("doc/tools/" + _))
+      docMappings ++ resMappings ++ binMappings
+    },
+    resourceGenerators in Compile += Def.task {
+      val command = "fsc, scala, scalac, scaladoc, scalap"
+      val htmlOut = (resourceManaged in Compile).value / "doc/tools"
+      val manOut = (resourceManaged in Compile).value / "genman"
+      val fixedManOut = (resourceManaged in Compile).value / "man"
+      IO.createDirectory(htmlOut)
+      IO.createDirectory(manOut / "man1")
+      toError(runner.value.run("scala.tools.docutil.ManMaker",
+        (fullClasspath in Compile in manual).value.files,
+        Seq(command, htmlOut.getAbsolutePath, manOut.getAbsolutePath),
+        streams.value.log))
+      (manOut ** "*.1" pair rebase(manOut, fixedManOut)).foreach { case (in, out) =>
+        // Generated manpages should always use LF only. There doesn't seem to be a good reason
+        // for generating them with the platform EOL first and then converting them but that's
+        // what the ant build does.
+        IO.write(out, IO.readBytes(in).filterNot(_ == '\r'))
+      }
+      (htmlOut ** "*.html").get ++ (fixedManOut ** "*.1").get
+    }.taskValue,
+    managedResourceDirectories in Compile := Seq((resourceManaged in Compile).value),
+    libraryDependencies ++= Seq(scalaContinuationsPluginDep, jlineDep),
+    apiURL := None,
+    fixPom(
+      "/project/name" -> <name>Scala Distribution Artifacts</name>,
+      "/project/description" -> <description>The Artifacts Distributed with Scala</description>,
+      "/project/packaging" -> <packaging>jar</packaging>
+    ),
+    publishArtifact in (Compile, packageSrc) := false
+  )
+  .dependsOn(libraryAll, compiler, scalap)
+
+lazy val root = (project in file("."))
+  .settings(disableDocs: _*)
+  .settings(generateBuildCharacterFileSettings: _*)
+  .settings(
+    publishArtifact := false,
+    publish := {},
+    publishLocal := {},
+    commands ++= ScriptCommands.all
+  )
+  .aggregate(library, forkjoin, reflect, compiler, interactive, repl, replJline, replJlineEmbedded,
+    scaladoc, scalap, actors, partestExtras, junit, libraryAll, scalaDist).settings(
+    sources in Compile := Seq.empty,
+    onLoadMessage := """|*** Welcome to the sbt build definition for Scala! ***
+      |This build definition has an EXPERIMENTAL status. If you are not
+      |interested in testing or working on the build itself, please use
+      |the Ant build definition for now. Check README.md for more information.""".stripMargin
+  )
+
+// The following subprojects' binaries are required for building "pack":
+lazy val distDependencies = Seq(replJline, replJlineEmbedded, compiler, library, partestExtras, partestJavaAgent, reflect, scalap, actors, scaladoc)
+
+lazy val dist = (project in file("dist"))
+  .settings(commonSettings)
+  .settings(
+    libraryDependencies ++= Seq(scalaContinuationsLibraryDep, scalaContinuationsPluginDep, scalaSwingDep, jlineDep),
+    mkBin := mkBinImpl.value,
+    mkQuick <<= Def.task {
+      val cp = (fullClasspath in IntegrationTest in LocalProject("test")).value
+      val propsFile = (buildDirectory in ThisBuild).value / "quick" / "partest.properties"
+      val props = new java.util.Properties()
+      props.setProperty("partest.classpath", cp.map(_.data.getAbsolutePath).mkString(sys.props("path.separator")))
+      IO.write(props, null, propsFile)
+    } dependsOn ((distDependencies.map(products in Runtime in _) :+ mkBin): _*),
+    mkPack <<= Def.task {} dependsOn (packagedArtifact in (Compile, packageBin), mkBin),
+    target := (baseDirectory in ThisBuild).value / "target" / thisProject.value.id,
+    packageBin in Compile := {
+      val extraDeps = Set(scalaContinuationsLibraryDep, scalaContinuationsPluginDep, scalaSwingDep, scalaParserCombinatorsDep, scalaXmlDep)
+      val targetDir = (buildDirectory in ThisBuild).value / "pack" / "lib"
+      def uniqueModule(m: ModuleID) = (m.organization, m.name.replaceFirst("_.*", ""))
+      val extraModules = extraDeps.map(uniqueModule)
+      val extraJars = (externalDependencyClasspath in Compile).value.map(a => (a.get(moduleID.key), a.data)).collect {
+        case (Some(m), f) if extraModules contains uniqueModule(m) => f
+      }
+      val jlineJAR = (dependencyClasspath in Compile).value.find(_.get(moduleID.key) == Some(jlineDep)).get.data
+      val mappings = extraJars.map(f => (f, targetDir / f.getName)) :+ (jlineJAR, targetDir / "jline.jar")
+      IO.copy(mappings, overwrite = true)
+      targetDir
+    },
+    cleanFiles += (buildDirectory in ThisBuild).value / "quick",
+    cleanFiles += (buildDirectory in ThisBuild).value / "pack",
+    packagedArtifact in (Compile, packageBin) <<= (packagedArtifact in (Compile, packageBin)).dependsOn(distDependencies.map(packagedArtifact in (Compile, packageBin) in _): _*)
+  )
+  .dependsOn(distDependencies.map(p => p: ClasspathDep[ProjectReference]): _*)
+
+/**
+ * Configures passed project as a subproject (e.g. compiler or repl)
+ * with common settings attached to it.
+ *
+ * Typical usage is:
+ *
+ *   lazy val mySubproject = configureAsSubproject(project)
+ *
+ * We pass `project` as an argument which is in fact a macro call. This macro determines
+ * project.id based on the name of the lazy val on the left-hand side.
+ */
+def configureAsSubproject(project: Project): Project = {
+  val base = file(".") / "src" / project.id
+  (project in base)
+    .settings(scalaSubprojectSettings: _*)
+    .settings(generatePropertiesFileSettings: _*)
+}
+
+/**
+ * Configuration for subprojects that are forks of some Java projects
+ * we depend on. At the moment there's just forkjoin.
+ *
+ * We do not publish artifacts for those projects but we package their
+ * binaries in a jar of other project (compiler or library).
+ *
+ * For that reason we disable docs generation, packaging and publishing.
+ */
+def configureAsForkOfJavaProject(project: Project): Project = {
+  val base = file(".") / "src" / project.id
+  (project in base)
+    .settings(commonSettings: _*)
+    .settings(disableDocs: _*)
+    .settings(
+      publishArtifact := false,
+      sourceDirectory in Compile := baseDirectory.value,
+      javaSource in Compile := (sourceDirectory in Compile).value,
+      sources in Compile in doc := Seq.empty,
+      classDirectory in Compile := buildDirectory.value / "libs/classes" / thisProject.value.id
+    )
+}
+
+lazy val buildDirectory = settingKey[File]("The directory where all build products go. By default ./build")
+lazy val mkBin = taskKey[Seq[File]]("Generate shell script (bash or Windows batch).")
+lazy val mkQuick = taskKey[Unit]("Generate a full build, including scripts, in build-sbt/quick")
+lazy val mkPack = taskKey[Unit]("Generate a full build, including scripts, in build-sbt/pack")
+
+// Defining these settings is somewhat redundant as we also redefine settings that depend on them.
+// However, IntelliJ's project import works better when these are set correctly.
+def clearSourceAndResourceDirectories = Seq(Compile, Test).flatMap(config => inConfig(config)(Seq(
+  unmanagedSourceDirectories := Nil,
+  managedSourceDirectories := Nil,
+  unmanagedResourceDirectories := Nil,
+  managedResourceDirectories := Nil
+)))
+
+lazy val mkBinImpl: Def.Initialize[Task[Seq[File]]] = Def.task {
+  import java.io.IOException
+  def mkScalaTool(mainCls: String, classpath: Seq[Attributed[File]]): ScalaTool =
+    ScalaTool(mainClass  = mainCls,
+      classpath  = classpath.toList.map(_.data.getAbsolutePath),
+      properties = Map.empty,
+      javaOpts   = "-Xmx256M -Xms32M",
+      toolFlags  = "")
+  val rootDir = (classDirectory in Compile in compiler).value
+  val quickOutDir = buildDirectory.value / "quick/bin"
+  val packOutDir = buildDirectory.value / "pack/bin"
+  def writeScripts(scalaTool: ScalaTool, file: String, outDir: File): Seq[File] = {
+    val res = Seq(
+      scalaTool.writeScript(file, "unix", rootDir, outDir),
+      scalaTool.writeScript(file, "windows", rootDir, outDir)
+    )
+    res.foreach { f =>
+      if(!f.getAbsoluteFile.setExecutable(true, /* ownerOnly: */ false))
+        throw new IOException("setExecutable failed")
+      if(!f.getAbsoluteFile.setReadable(true, /* ownerOnly: */ false))
+        throw new IOException("setReadable failed")
+    }
+    res
+  }
+
+  def mkBin(file: String, mainCls: String, classpath: Seq[Attributed[File]]): Seq[File] =
+    writeScripts(mkScalaTool(mainCls, classpath), file, quickOutDir) ++
+    writeScripts(mkScalaTool(mainCls, Nil      ), file, packOutDir)
+
+  streams.value.log.info(s"Creating scripts in $quickOutDir and $packOutDir")
+
+  mkBin("scala"    , "scala.tools.nsc.MainGenericRunner", (fullClasspath in Compile in replJlineEmbedded).value) ++
+  mkBin("scalac"   , "scala.tools.nsc.Main",              (fullClasspath in Compile in compiler).value) ++
+  mkBin("fsc"      , "scala.tools.nsc.CompileClient",     (fullClasspath in Compile in compiler).value) ++
+  mkBin("scaladoc" , "scala.tools.nsc.ScalaDoc",          (fullClasspath in Compile in scaladoc).value) ++
+  mkBin("scalap"   , "scala.tools.scalap.Main",           (fullClasspath in Compile in scalap).value)
+}
+
+/** Generate service provider definition files under META-INF/services */
+def generateServiceProviderResources(services: (String, String)*): Setting[_] =
+  resourceGenerators in Compile += Def.task {
+    services.map { case (k, v) =>
+      val f = (resourceManaged in Compile).value / "META-INF/services" / k
+      IO.write(f, v + "\n")
+      f
+    }
+  }.taskValue
+
+buildDirectory in ThisBuild := (baseDirectory in ThisBuild).value / "build-sbt"
+
+// Add tab completion to partest
+commands += Command("partest")(_ => PartestUtil.partestParser((baseDirectory in ThisBuild).value, (baseDirectory in ThisBuild).value / "test")) { (state, parsed) =>
+  ("test/it:testOnly -- " + parsed) :: state
+}
+
+// Add tab completion to scalac et al.
+commands ++= {
+  val commands =
+  List(("scalac",   "compiler", "scala.tools.nsc.Main"),
+       ("scala",    "repl-jline-embedded", "scala.tools.nsc.MainGenericRunner"),
+       ("scaladoc", "scaladoc", "scala.tools.nsc.ScalaDoc"))
+
+  commands.map {
+    case (entryPoint, projectRef, mainClassName) =>
+      Command(entryPoint)(_ => ScalaOptionParser.scalaParser(entryPoint, (baseDirectory in ThisBuild).value)) { (state, parsedOptions) =>
+        (projectRef + "/runMain " + mainClassName + " -usejavacp " + parsedOptions) :: state
+      }
+  }
+}
+
+addCommandAlias("scalap",   "scalap/compile:runMain              scala.tools.scalap.Main -usejavacp")
diff --git a/build.xml b/build.xml
old mode 100755
new mode 100644
index 5f6b04b..7b49544
--- a/build.xml
+++ b/build.xml
@@ -165,7 +165,6 @@ TODO:
   <property name="build.dir"               value="${basedir}/build"/>
   <property name="build-deps.dir"          value="${build.dir}/deps"/>
   <property name="build-libs.dir"          value="${build.dir}/libs"/>
-  <property name="build-asm.dir"           value="${build.dir}/asm"/>
   <property name="build-forkjoin.dir"      value="${build-libs.dir}"/>
   <property name="build-locker.dir"        value="${build.dir}/locker"/>
   <property name="build-quick.dir"         value="${build.dir}/quick"/>
@@ -185,7 +184,7 @@ TODO:
 
   <property name="dists.dir"               value="${basedir}/dists"/>
 
-  <property name="copyright.string"        value="Copyright 2002-2013, LAMP/EPFL"/>
+  <property name="copyright.string"        value="Copyright 2002-2016, LAMP/EPFL"/>
 
   <!-- These are NOT the flags used to run SuperSabbus, but the ones written
        into the script runners created with scala.tools.ant.ScalaTool -->
@@ -266,11 +265,20 @@ TODO:
     -->
     <if><not><isset property="maven-deps-done"></isset></not><then>
       <mkdir dir="${user.home}/.m2/repository"/>
+
+      <artifact:remoteRepository id="sonatype-release" url="https://oss.sonatype.org/content/repositories/releases"/>
+      <artifact:remoteRepository id="sonatype-snapshots" url="https://oss.sonatype.org/content/repositories/snapshots"/>
+      <artifact:remoteRepository id="extra-repo" url="${extra.repo.url}"/>
+
       <!-- This task has an issue where if the user directory does not exist, so we create it above. UGH. -->
       <artifact:dependencies pathId="extra.tasks.classpath" filesetId="extra.tasks.fileset">
         <dependency groupId="biz.aQute" artifactId="bnd" version="1.50.0"/>
       </artifact:dependencies>
 
+      <artifact:dependencies pathId="jarjar.classpath">
+        <dependency groupId="com.googlecode.jarjar" artifactId="jarjar" version="1.3"/>
+      </artifact:dependencies>
+
       <!-- JUnit -->
       <property name="junit.version" value="4.11"/>
       <artifact:dependencies pathId="junit.classpath" filesetId="junit.fileset">
@@ -307,6 +315,36 @@ TODO:
       <artifact:remoteRepository id="sonatype-release" url="https://oss.sonatype.org/content/repositories/releases"/>
       <artifact:remoteRepository id="extra-repo" url="${extra.repo.url}"/>
 
+      <!-- scala-java8-compat, used by the experimental -target jvm-1.8 support. -->
+      <if><isset property="scala-java8-compat.package"/><then>
+        <property name="scala-java8-compat.version" value="0.5.0"/>
+        <property name="scala-java8-compat.binary.version" value="2.11"/>
+        <artifact:dependencies pathId="scala-java8-compat.classpath" filesetId="scala-java8-compat.fileset">
+          <dependency groupId="org.scala-lang.modules" artifactId="scala-java8-compat_${scala-java8-compat.binary.version}" version="${scala-java8-compat.version}">
+            <exclusion groupId="org.scala-lang" artifactId="scala-library"/>
+          </dependency>
+        </artifact:dependencies>
+        <property name="scala-java8-compat-classes" value="${build-quick.dir}/scala-java8-compat"/>
+        <delete dir="${scala-java8-compat-classes}"/>
+        <unzip dest="${scala-java8-compat-classes}">
+          <fileset refid="scala-java8-compat.fileset"/>
+          <patternset>
+            <include name="**/*.class"/>
+          </patternset>
+        </unzip>
+        <path id="scala-java8-compat.libs">
+          <pathelement location="${scala-java8-compat-classes}"/>
+        </path>
+        <fileset id="scala-java8-compat.fileset" dir="${scala-java8-compat-classes}">
+          <include name="**/*"/>
+        </fileset>
+      </then>
+        <else>
+          <path id="scala-java8-compat.libs"/>
+          <fileset id="scala-java8-compat.fileset" dir="." excludes="**"/>
+        </else>
+      </if>
+
       <!-- prepare, for each of the names below, the property "@{name}.cross", set to the
            necessary cross suffix (usually something like "_2.11.0-M6". -->
       <prepareCross name="scala-xml" />
@@ -318,6 +356,11 @@ TODO:
       <prepareCross name="partest"/>
       <prepareCross name="scalacheck"/>
 
+      <artifact:dependencies pathId="asm.classpath" filesetId="asm.fileset">
+        <dependency groupId="org.scala-lang.modules" artifactId="scala-asm" version="${scala-asm.version}"/>
+      </artifact:dependencies>
+      <copy-deps project="asm"/>
+
       <!-- TODO: delay until absolutely necessary to allow minimal build, also move out partest dependency from scaladoc -->
       <artifact:dependencies pathId="partest.classpath" filesetId="partest.fileset" versionsId="partest.versions">
         <!-- uncomment the following if you're deploying your own partest locally -->
@@ -463,6 +506,11 @@ TODO:
     </condition>
 
     <fail if="has.unsupported.jdk" message="JDK ${ant.java.version} is not supported by this build!"/>
+    <fail message="Ant 1.9+ required">
+      <condition>
+        <not><antversion atleast="1.9" /></not>
+      </condition>
+    </fail>
 
     <!-- Allow this to be overridden simply -->
     <property name="sbt.latest.version"    value="0.12.4"/>
@@ -471,9 +519,9 @@ TODO:
     <property name="sbt.lib.dir"           value="${build-sbt.dir}/${sbt.latest.version}/lib"/>
 
     <property name="sbt.interface.jar"     value="${sbt.lib.dir}/interface.jar"/>
-    <property name="sbt.interface.url"     value="http://private-repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/interface/${sbt.latest.version}/jars/interface.jar"/>
+    <property name="sbt.interface.url"     value="http://dl.bintray.com/typesafe/ivy-releases/org.scala-sbt/interface/${sbt.latest.version}/jars/interface.jar"/>
     <property name="sbt.interface.src.jar" value="${sbt.src.dir}/compiler-interface-src.jar"/>
-    <property name="sbt.interface.src.url" value="http://private-repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/compiler-interface/${sbt.latest.version}/jars/compiler-interface-src.jar"/>
+    <property name="sbt.interface.src.url" value="http://dl.bintray.com/typesafe/ivy-releases/org.scala-sbt/compiler-interface/${sbt.latest.version}/jars/compiler-interface-src.jar"/>
 
 
     <!-- Additional command line arguments for scalac. They are added to all build targets -->
@@ -487,6 +535,8 @@ TODO:
     <property name="scalac.args.quick"     value="${scalac.args.all}"/>
     <property name="scalac.args.strap"     value="${scalac.args.quick}"/>
 
+    <property name="partest.scalac_opts"   value=""/> <!-- set default value, otherwise the property name will be passed to partest if undefined -->
+
     <!-- This is the start time for the distribution -->
     <tstamp prefix="time">
       <format property="human" pattern="d MMMM yyyy, HH:mm:ss" locale="en,US"/>
@@ -588,10 +638,8 @@ TODO:
       </propertyfile>
     </then></if>
 
-    <path id="forkjoin.classpath" path="${build-libs.dir}/classes/forkjoin"/>
-    <path id="asm.classpath"      path="${build-asm.dir}/classes"/>
+    <path id="forkjoin.classpath" path="${build-forkjoin.dir}/classes/forkjoin"/>
     <property name="forkjoin-classes" refid="forkjoin.classpath"/>
-    <property name="asm-classes" refid="asm.classpath"/>
 
     <!-- the following properties fully define staged-docs, staged-pack, make-bundle, copy-bundle and mvn-package for each of the projects -->
     <property name="library.description"           value="Scala Standard Library"/>
@@ -658,8 +706,8 @@ TODO:
     <property name="partest-extras.description"    value="Scala Compiler Testing Tool (compiler-specific extras)"/>
     <property name="partest-javaagent.description" value="Scala Compiler Testing Tool (compiler-specific java agent)"/>
 
-    <!-- projects without project-specific options: asm, forkjoin, manual, bin, repl -->
-    <for list="actors,compiler,interactive,scaladoc,library,parser-combinators,partest,partest-extras,partest-javaagent,reflect,scalap,swing,xml,continuations-plugin,continuations-library" param="project">
+    <!-- projects without project-specific options: forkjoin, manual, bin, repl -->
+    <for list="actors,compiler,interactive,scaladoc,library,parser-combinators,partest,partest-extras,partest-javaagent,reflect,scalap,swing,xml,continuations-plugin,continuations-library,repl-jline" param="project">
       <sequential>
         <!-- description is mandatory -->
         <init-project-prop project="@{project}" name="package"     default=""/> <!-- used by mvn-package, copy-bundle, make-bundle -->
@@ -718,6 +766,7 @@ TODO:
       <pathelement location="${build-locker.dir}/classes/library"/>
       <path refid="forkjoin.classpath"/>
       <path refid="aux.libs"/>
+      <path refid="scala-java8-compat.libs"/>
     </path>
 
     <path id="locker.reflect.build.path">
@@ -739,6 +788,7 @@ TODO:
       <pathelement location="${build-quick.dir}/classes/library"/>
       <path refid="forkjoin.classpath"/>
       <path refid="aux.libs"/>
+      <path refid="scala-java8-compat.libs"/>
     </path>
 
     <path id="quick.actors.build.path">
@@ -759,7 +809,13 @@ TODO:
 
     <path id="quick.repl.build.path">
       <path refid="quick.compiler.build.path"/>
+      <path refid="quick.interactive.build.path"/>
       <pathelement location="${build-quick.dir}/classes/repl"/>
+    </path>
+
+    <path id="quick.repl-jline.build.path">
+      <path refid="quick.repl.build.path"/>
+      <pathelement location="${build-quick.dir}/classes/repl-jline"/>
       <path refid="repl.deps.classpath"/>
     </path>
 
@@ -794,7 +850,7 @@ TODO:
     </path>
 
     <path id="quick.bin.tool.path">
-      <path refid="quick.repl.build.path"/>
+      <path refid="quick.repl-jline.build.path"/>
       <path refid="quick.actors.build.path"/>
       <pathelement location="${build-quick.dir}/classes/scalap"/>
       <pathelement location="${build-quick.dir}/classes/scaladoc"/>
@@ -827,12 +883,15 @@ TODO:
     <path id="pack.library.files">
       <fileset dir="${build-quick.dir}/classes/library"/>
       <fileset dir="${forkjoin-classes}"/>
+      <fileset refid="scala-java8-compat.fileset"/>
     </path>
 
     <path id="pack.actors.files">
       <fileset dir="${build-quick.dir}/classes/actors"/>
     </path>
 
+    <path id="pack.repl-jline.files">    <fileset dir="${build-quick.dir}/classes/repl-jline"/> </path>
+
     <path id="pack.compiler.files">
       <fileset dir="${build-quick.dir}/classes/compiler"/>
 
@@ -840,8 +899,9 @@ TODO:
       <fileset dir="${build-quick.dir}/classes/scaladoc"/>
       <fileset dir="${build-quick.dir}/classes/interactive"/>
       <fileset dir="${build-quick.dir}/classes/repl"/>
-      <fileset dir="${asm-classes}"/>
     </path>
+    <fileset id="pack.compiler.include-jars" refid="asm.fileset"/>
+    <property name="pack.compiler.include-jars.defined" value="yeah"/>
 
     <!-- TODO modularize compiler.
     <path id="pack.scaladoc.files">   <fileset dir="${build-quick.dir}/classes/scaladoc"/> </path>
@@ -978,6 +1038,7 @@ TODO:
       <pathelement location="${test.junit.classes}"/>
       <path refid="quick.compiler.build.path"/>
       <path refid="quick.repl.build.path"/>
+      <path refid="quick.scaladoc.build.path"/>
       <path refid="quick.partest-extras.build.path"/>
       <path refid="junit.classpath"/>
     </path>
@@ -1034,14 +1095,15 @@ TODO:
     </patternset>
 
     <taskdef resource="scala/tools/ant/sabbus/antlib.xml" classpathref="starr.compiler.path"/>
+    <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask" classpathref="jarjar.classpath" />
   </target>
 
 <!-- ===========================================================================
                                   CLEANLINESS
 =============================================================================-->
-  <target name="libs.clean">                        <clean build="libs"/> <clean build="asm"/>                            </target>
-  <target name="quick.clean"  depends="libs.clean">   <clean build="quick"/> <clean build="pack"/> <clean build="strap"/> </target>
-  <target name="locker.clean" depends="quick.clean">    <clean build="locker"/>                                           </target>
+  <target name="libs.clean">                         <clean build="libs"/>                                               </target>
+  <target name="quick.clean"  depends="libs.clean">  <clean build="quick"/> <clean build="pack"/> <clean build="strap"/> </target>
+  <target name="locker.clean" depends="quick.clean"> <clean build="locker"/>                                             </target>
 
   <target name="docs.clean"> <clean build="docs"/> <delete dir="${build.dir}/manmaker" includeemptydirs="yes" quiet="yes" failonerror="no"/> </target>
   <target name="dist.clean"> <delete dir="${dists.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> </target>
@@ -1059,8 +1121,7 @@ TODO:
                                   LOCAL DEPENDENCIES
 ============================================================================ -->
 
-  <target name="asm.done"      depends="init"> <simple-javac project="asm" jar="no"/> </target>
-  <target name="forkjoin.done" depends="init"> <simple-javac project="forkjoin" args="-XDignore.symbol.file"/></target>
+  <target name="forkjoin.done" depends="init"> <simple-javac project="forkjoin" args="-XDignore.symbol.file" jar="no"/></target>
 
   <!-- For local development only. We only allow released versions of Scala for STARR.
     This builds quick (core only) and publishes it with a generated version number,
@@ -1082,7 +1143,7 @@ TODO:
 <!-- ===========================================================================
                                   LOCAL REFERENCE BUILD (LOCKER)
 ============================================================================ -->
-  <target name="locker.start"  depends="asm.done, forkjoin.done">
+  <target name="locker.start"  depends="forkjoin.done">
     <condition property="locker.locked"><available file="${build-locker.dir}/locker.locked"/></condition></target>
 
   <target name="locker.lib"    depends="locker.start"     unless="locker.locked">
@@ -1115,11 +1176,35 @@ TODO:
   <target name="quick.comp"       depends="quick.reflect">
     <staged-build with="locker"   stage="quick" project="compiler"/> </target>
 
-  <target name="quick.repl"       depends="quick.comp">
-    <staged-build with="locker"   stage="quick" project="repl"/> </target>
+  <target name="quick.repl"       depends="quick.comp, quick.interactive">
+    <staged-build with="locker"   stage="quick" project="repl"/>
+    <staged-build with="locker"   stage="quick" project="repl-jline"/>
+
+    <staged-pack project="repl-jline"/>
+
+    <!-- make jline_embedded jar with classes of repl-jline and jline, then shade-->
+    <jarjar jarfile="${build-pack.dir}/${repl-jline.targetdir}/scala-repl-jline-embedded.jar" whenmanifestonly="fail">
+      <zipfileset src="${jline:jline:jar}"/>
+      <zipfileset src="${build-pack.dir}/${repl-jline.targetdir}/${repl-jline.targetjar}"/>
+
+      <rule pattern="org.fusesource.**" result="scala.tools.fusesource_embedded. at 1"/>
+      <rule pattern="jline.**" result="scala.tools.jline_embedded. at 1"/>
+      <rule pattern="scala.tools.nsc.interpreter.jline.**" result="scala.tools.nsc.interpreter.jline_embedded. at 1"/>
+      <keep pattern="scala.tools.**"/>
+    </jarjar>
+
+    <!-- unzip jar to repl's class dir to obtain
+           - standard repl-jline
+           - a shaded repl-jline (scala/tools/nsc/interpreter/jline_embedded) & jline (scala.tools.jline_embedded)
+    -->
+    <copy todir="${build-quick.dir}/classes/repl">
+      <zipfileset src="${build-pack.dir}/${repl-jline.targetdir}/${repl-jline.targetjar}"/>
+      <zipfileset src="${build-pack.dir}/${repl-jline.targetdir}/scala-repl-jline-embedded.jar"/>
+    </copy>
+  </target>
 
   <target name="quick.scaladoc"   depends="quick.comp">
-    <staged-build with="locker"   stage="quick" project="scaladoc" version="scaladoc"/> </target>
+    <staged-build with="locker"   stage="quick" project="scaladoc"/> </target>
 
   <target name="quick.interactive" depends="quick.comp, quick.scaladoc">
     <staged-build with="locker"    stage="quick" project="interactive"/> </target>
@@ -1150,7 +1235,7 @@ TODO:
   <target name="pack.reflect" depends="quick.reflect"> <staged-pack project="reflect"/> </target>
 
   <!-- TODO modularize compiler. Remove other quick targets when they become modules. -->
-  <target name="pack.comp"    depends="quick.comp, quick.scaladoc, quick.interactive, quick.repl, asm.done">
+  <target name="pack.comp"    depends="quick.comp, quick.scaladoc, quick.interactive, quick.repl">
     <staged-pack project="compiler" manifest="${build-pack.dir}/META-INF/MANIFEST.MF">
       <pre> <!-- TODO the files copied here do not influence actuality of this target (nor does the manifest) -->
         <copy todir="${build-pack.dir}/lib">
@@ -1448,6 +1533,15 @@ TODO:
   <target name="test.junit.comp" depends="pack.done">
     <stopwatch name="test.junit.compiler.timer"/>
     <mkdir dir="${test.junit.classes}"/>
+    <javac
+      debug="true"
+      srcdir="${test.junit.src}"
+      destdir="${test.junit.classes}"
+      classpathref="test.junit.compiler.build.path"
+      target="1.6"
+      source="1.5"
+      compiler="javac1.6"
+      includes="**/*.java"/>
     <scalacfork
       destdir="${test.junit.classes}"
       compilerpathref="quick.compiler.path"
@@ -1550,7 +1644,7 @@ TODO:
     <mkdir dir="${bc-build.dir}"/>
     <!-- Pull down MIMA -->
     <artifact:dependencies pathId="mima.classpath">
-      <dependency groupId="com.typesafe" artifactId="mima-reporter_2.10" version="0.1.6"/>
+      <dependency groupId="com.typesafe" artifactId="mima-reporter_2.10" version="0.1.8"/>
     </artifact:dependencies>
     <artifact:dependencies pathId="old.bc.classpath">
       <dependency groupId="org.scala-lang" artifactId="scala-library" version="${bc-reference-version}"/>
@@ -1592,20 +1686,15 @@ TODO:
   <target name="docs.lib" depends="docs.start" unless="docs.skip">
     <staged-docs project="library">
       <include name="**/*.scala"/>
-      <exclude name="runtime/*$.scala"/>
-      <exclude name="runtime/ScalaRunTime.scala"/>
-      <exclude name="runtime/StringAdd.scala"/>
+      <exclude name="**/runtime/*$.scala"/>
+      <exclude name="**/runtime/ScalaRunTime.scala"/>
+      <exclude name="**/runtime/StringAdd.scala"/>
     </staged-docs>
   </target>
 
   <target name="docs.reflect" depends="docs.start" unless="docs.skip">
     <staged-docs project="reflect">
       <include name="**/*.scala"/>
-      <exclude name="reflect/Code.scala"/>
-      <exclude name="reflect/Print.scala"/>
-      <exclude name="reflect/Symbol.scala"/>
-      <exclude name="reflect/Tree.scala"/>
-      <exclude name="reflect/Type.scala"/>
     </staged-docs>
   </target>
 
diff --git a/compare-build-dirs-ignore-patterns b/compare-build-dirs-ignore-patterns
new file mode 100644
index 0000000..8c8160b
--- /dev/null
+++ b/compare-build-dirs-ignore-patterns
@@ -0,0 +1,8 @@
+.DS_Store
+*.complete
+locker
+deps
+scala-continuations-*.jar
+scala-parser-combinators*.jar
+scala-swing*.jar
+scala-xml*.jar
diff --git a/compare-build-dirs.sh b/compare-build-dirs.sh
new file mode 100755
index 0000000..f6806dd
--- /dev/null
+++ b/compare-build-dirs.sh
@@ -0,0 +1,5 @@
+# Compares build directories generated by Ant and sbt build definitions
+# This let's us to see how far are we from achieving perfect parity
+# between the builds
+
+diff -X compare-build-dirs-ignore-patterns -qr build/ build-sbt/
diff --git a/doc/LICENSE.md b/doc/LICENSE.md
index 6b039af..c56b38d 100644
--- a/doc/LICENSE.md
+++ b/doc/LICENSE.md
@@ -2,9 +2,9 @@ Scala is licensed under the [BSD 3-Clause License](http://opensource.org/license
 
 ## Scala License
 
-Copyright (c) 2002-2013 EPFL
+Copyright (c) 2002-2016 EPFL
 
-Copyright (c) 2011-2013 Typesafe, Inc.
+Copyright (c) 2011-2016 Lightbend, Inc.
 
 All rights reserved.
 
diff --git a/doc/License.rtf b/doc/License.rtf
index 62ec2d0..c8f2483 100644
--- a/doc/License.rtf
+++ b/doc/License.rtf
@@ -10,8 +10,8 @@
 \fs48 Scala License
 \fs40 \
 
-\fs26 Copyright (c) 2002-2013 EPFL\
-Copyright (c) 2011-2013 Typesafe, Inc.\
+\fs26 Copyright (c) 2002-2016 EPFL\
+Copyright (c) 2011-2016 Lightbend, Inc.\
 All rights reserved.\
 \
 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\
diff --git a/docs/TODO b/docs/TODO
index 094202f..558aa87 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -53,7 +53,7 @@
 
   The process is about the same for symbols in PolyTypes. The main
   difference is that type parameters may be referenced and thus we
-  need something like De Bruijn indicies to represent these
+  need something like De Bruijn indices to represent these
   references.
 
 
diff --git a/project/JarJar.scala b/project/JarJar.scala
new file mode 100644
index 0000000..918060c
--- /dev/null
+++ b/project/JarJar.scala
@@ -0,0 +1,92 @@
+import org.pantsbuild.jarjar
+import org.pantsbuild.jarjar._
+import org.pantsbuild.jarjar.util._
+import scala.collection.JavaConverters._
+import java.util.jar._
+import java.io._
+import sbt._
+
+object JarJar {
+  sealed abstract class JarJarConfig {
+    def toPatternElement: PatternElement
+  }
+  object JarJarConfig {
+    case class Rule(pattern: String, result: String) extends JarJarConfig {
+      def toPatternElement: PatternElement = {
+        val rule = new jarjar.Rule
+        rule.setPattern(pattern)
+        rule.setResult(result)
+        rule
+      }
+    }
+    case class Keep(pattern: String) extends JarJarConfig {
+      def toPatternElement: PatternElement = {
+        val keep = new jarjar.Keep
+        keep.setPattern(pattern)
+        keep
+      }
+    }
+  }
+
+  sealed abstract class Entry {
+    def name: String
+    def time: Long
+    def data: Array[Byte]
+  }
+
+  case class JarEntryInput(jarFile: JarFile, entry: JarEntry) extends Entry {
+    def name = entry.getName.replace('\\', '/')
+    def time = entry.getTime
+    def data = sbt.IO.readBytes(jarFile.getInputStream(entry))
+  }
+  case class FileInput(base: File, file: File) extends Entry {
+    def name = file.relativeTo(base).get.getPath.replace('\\', '/')
+    def time = file.lastModified
+    def data = sbt.IO.readBytes(file)
+  }
+
+  private def newMainProcessor(patterns: java.util.List[PatternElement], verbose: Boolean, skipManifest: Boolean): JarProcessor = {
+    val cls = Class.forName("org.pantsbuild.jarjar.MainProcessor")
+    val constructor = cls.getConstructor(classOf[java.util.List[_]], java.lang.Boolean.TYPE, java.lang.Boolean.TYPE)
+    constructor.setAccessible(true)
+    constructor.newInstance(patterns, Boolean.box(verbose), Boolean.box(skipManifest)).asInstanceOf[JarProcessor]
+  }
+
+  def apply(in: Iterator[Entry], outdir: File,
+            config: Seq[JarJarConfig], verbose: Boolean = false): Seq[File] = {
+    val patterns = config.map(_.toPatternElement).asJava
+    val processor = newMainProcessor(patterns, verbose, false)
+    def process(e: Entry): Option[File] = {
+      val struct = new EntryStruct()
+      struct.name = e.name
+      struct.time = e.time
+      struct.data = e.data
+      if (processor.process(struct)) {
+        if (struct.name.endsWith("/")) None
+        else {
+          val f = outdir / struct.name
+          try {
+            f.getParentFile.mkdirs()
+            sbt.IO.write(f, struct.data)
+          } catch {
+            case ex: Exception =>
+              throw new IOException(s"Failed to write ${e.name} / ${f.getParentFile} / ${f.getParentFile.exists}", ex)
+          }
+          Some(f)
+        }
+      }
+      else None
+    }
+    val processed = in.flatMap(entry => process(entry)).toSet
+    val getter = processor.getClass.getDeclaredMethod("getExcludes")
+    getter.setAccessible(true)
+    val excludes = getter.invoke(processor).asInstanceOf[java.util.Set[String]].asScala
+    val excluded = excludes.map { name =>
+      val f: File = outdir / name
+      if(f.exists && !f.delete())
+        throw new IOException("Failed to delete excluded file $f")
+      f
+    }
+    (processed -- excluded).toSeq
+  }
+}
diff --git a/project/Osgi.scala b/project/Osgi.scala
new file mode 100644
index 0000000..ed961d1
--- /dev/null
+++ b/project/Osgi.scala
@@ -0,0 +1,69 @@
+import aQute.lib.osgi.Builder
+import aQute.lib.osgi.Constants._
+import java.util.Properties
+import sbt._
+import sbt.Keys._
+import scala.collection.JavaConversions._
+import VersionUtil.versionProperties
+
+/** OSGi packaging for the Scala build, distilled from sbt-osgi. We do not use sbt-osgi because it
+  * depends on a newer version of BND which gives slightly different output (probably OK to upgrade
+  * in the future but for now it would make comparing the sbt and ant build output harder) and does
+  * not allow a crucial bit of configuration that we need: Setting the classpath for BND. In sbt-osgi
+  * this is always `fullClasspath in Compile` whereas we want `products in Compile in packageBin`. */
+object Osgi {
+  val bundle = TaskKey[File]("osgiBundle", "Create an OSGi bundle.")
+  val bundleName = SettingKey[String]("osgiBundleName", "The Bundle-Name for the manifest.")
+  val bundleSymbolicName = SettingKey[String]("osgiBundleSymbolicName", "The Bundle-SymbolicName for the manifest.")
+  val headers = SettingKey[Seq[(String, String)]]("osgiHeaders", "Headers and processing instructions for BND.")
+
+  def settings: Seq[Setting[_]] = Seq(
+    bundleName := description.value,
+    bundleSymbolicName := organization.value + "." + name.value,
+    headers := {
+      val v = VersionUtil.versionProperties.value.osgiVersion
+      Seq(
+        "Bundle-Name" -> bundleName.value,
+        "Bundle-SymbolicName" -> bundleSymbolicName.value,
+        "ver" -> v,
+        "Export-Package" -> ("*;version=${ver}"),
+        "Import-Package" -> ("scala.*;version=\"${range;[==,=+);${ver}}\",*"),
+        "Bundle-Version" -> v,
+        "Bundle-RequiredExecutionEnvironment" -> "JavaSE-1.6, JavaSE-1.7",
+        "-eclipse" -> "false"
+      )
+    },
+    bundle <<= Def.task {
+      bundleTask(headers.value.toMap, (products in Compile in packageBin).value,
+        (artifactPath in (Compile, packageBin)).value, Nil, streams.value)
+    },
+    packagedArtifact in (Compile, packageBin) <<= (artifact in (Compile, packageBin), bundle).identityMap,
+    // Also create OSGi source bundles:
+    artifact in (Compile, packageBin) ~= (_.copy(`type` = "bundle")),
+    packageOptions in (Compile, packageSrc) += Package.ManifestAttributes(
+      "Bundle-Name" -> (description.value + " Sources"),
+      "Bundle-SymbolicName" -> (bundleSymbolicName.value + ".source"),
+      "Bundle-Version" -> versionProperties.value.osgiVersion,
+      "Eclipse-SourceBundle" -> (bundleSymbolicName.value + ";version=\"" + versionProperties.value.osgiVersion + "\";roots:=\".\"")
+    )
+  )
+
+  def bundleTask(headers: Map[String, String], fullClasspath: Seq[File], artifactPath: File,
+                 resourceDirectories: Seq[File], streams: TaskStreams): File = {
+    val log = streams.log
+    val builder = new Builder
+    builder.setClasspath(fullClasspath.toArray)
+    headers foreach { case (k, v) => builder.setProperty(k, v) }
+    val includeRes = resourceDirectories.filter(_.exists).map(_.getAbsolutePath).mkString(",")
+    if(!includeRes.isEmpty) builder.setProperty(INCLUDERESOURCE, includeRes)
+    builder.getProperties.foreach { case (k, v) => log.debug(s"bnd: $k: $v") }
+    // builder.build is not thread-safe because it uses a static SimpleDateFormat.  This ensures
+    // that all calls to builder.build are serialized.
+    val jar = synchronized { builder.build }
+    builder.getWarnings.foreach(s => log.warn(s"bnd: $s"))
+    builder.getErrors.foreach(s => log.error(s"bnd: $s"))
+    IO.createDirectory(artifactPath.getParentFile)
+    jar.write(artifactPath)
+    artifactPath
+  }
+}
diff --git a/project/ParserUtil.scala b/project/ParserUtil.scala
new file mode 100644
index 0000000..cdaf883
--- /dev/null
+++ b/project/ParserUtil.scala
@@ -0,0 +1,52 @@
+import sbt._
+import sbt.complete.Parser._
+import sbt.complete.Parsers._
+import sbt.complete._
+
+object ParserUtil {
+  def notStartingWith(parser: Parser[String], c: Char): Parser[String] = parser & not(c ~> any.*, "value cannot start with " + c + ".")
+  def concat(p: Parser[(String, String)]): Parser[String] = {
+    p.map(x => x._1 + x._2)
+  }
+
+  def Opt(a: Parser[String]) = a.?.map(_.getOrElse(""))
+
+  val StringBasicNotStartingWithDash = notStartingWith(StringBasic, '-')
+  val IsDirectoryFilter = new SimpleFileFilter(_.isDirectory)
+  val JarOrDirectoryParser = FileParser(GlobFilter("*.jar") || IsDirectoryFilter)
+  def FileParser(fileFilter: FileFilter, dirFilter: FileFilter = AllPassFilter, base: File = file(".")) = {
+    def matching(prefix: String): List[String] = {
+      val preFile = file(prefix)
+      val cwd = base
+      val parent = Option(preFile.getParentFile).getOrElse(cwd)
+      if (preFile.exists) {
+        if (preFile.isDirectory) {
+          preFile.*(IsDirectoryFilter.&&(dirFilter) || fileFilter).get.map(_.getPath).toList
+        } else {
+          List(preFile).filter(fileFilter.accept).map(_.getPath)
+        }
+      }
+      else if (parent != null) {
+        def ensureSuffix(s: String, suffix: String) = if (s.endsWith(suffix)) s else s + suffix
+        def pathOf(f: File): String = {
+          val f1 = if (preFile.getParentFile == null) f.relativeTo(cwd).getOrElse(f) else f
+          if (f1.isDirectory && !fileFilter.accept(f1)) ensureSuffix(f1.getPath, "/") else f1.getPath
+        }
+        val childFilter = GlobFilter(preFile.name + "*") && ((IsDirectoryFilter && dirFilter) || fileFilter)
+        val children = parent.*(childFilter).get
+        children.map(pathOf).toList
+      } else Nil
+    }
+    def displayPath = Completions.single(Completion.displayOnly("<path>"))
+    token(StringBasic, TokenCompletions.fixed((seen, level) => if (seen.isEmpty) displayPath else matching(seen) match {
+      case Nil => displayPath
+      case x :: Nil =>
+        if (fileFilter.accept(file(x)))
+          Completions.strict(Set(Completion.tokenDisplay(x.stripPrefix(seen), x)))
+        else
+          Completions.strict(Set(Completion.suggestion(x.stripPrefix(seen))))
+      case xs =>
+        Completions.strict(xs.map(x => Completion.tokenDisplay(x.stripPrefix(seen), x)).toSet)
+    })).filter(!_.startsWith("-"), x => x)
+  }
+}
\ No newline at end of file
diff --git a/project/PartestUtil.scala b/project/PartestUtil.scala
new file mode 100644
index 0000000..4b18c94
--- /dev/null
+++ b/project/PartestUtil.scala
@@ -0,0 +1,92 @@
+import sbt._
+import sbt.complete._, Parser._, Parsers._
+
+object PartestUtil {
+  private case class TestFiles(srcPath: String, globalBase: File, testBase: File) {
+    private val testCaseDir = new SimpleFileFilter(f => f.isDirectory && f.listFiles.nonEmpty && !(f.getParentFile / (f.name + ".res")).exists)
+    private val testCaseFilter = GlobFilter("*.scala") | GlobFilter("*.java") | GlobFilter("*.res") || testCaseDir
+    private def testCaseFinder = (testBase / srcPath).*(AllPassFilter).*(testCaseFilter)
+    private val basePaths = allTestCases.map(_._2.split('/').take(3).mkString("/") + "/").distinct
+
+    def allTestCases = testCaseFinder.pair(relativeTo(globalBase))
+    def basePathExamples = new FixedSetExamples(basePaths)
+    private def equiv(f1: File, f2: File) = f1.getCanonicalFile == f2.getCanonicalFile
+    def parentChain(f: File): Iterator[File] =
+      if (f == null || !f.exists) Iterator()
+      else Iterator(f) ++ (if (f.getParentFile == null) Nil else parentChain(f.getParentFile))
+    def isParentOf(parent: File, f2: File, maxDepth: Int) =
+      parentChain(f2).take(maxDepth).exists(p1 => equiv(p1, parent))
+    def isTestCase(f: File) = {
+      val grandParent = if (f != null && f.getParentFile != null) f.getParentFile.getParentFile else null
+      grandParent != null && equiv(grandParent, testBase / srcPath) && testCaseFilter.accept(f)
+    }
+    def mayContainTestCase(f: File) = {
+      isParentOf(testBase / srcPath, f, 2) || isParentOf(f, testBase / srcPath, Int.MaxValue)
+    }
+  }
+  /** A parser for the custom `partest` command */
+  def partestParser(globalBase: File, testBase: File): Parser[String] = {
+    val knownUnaryOptions = List(
+      "--pos", "--neg", "--run", "--jvm", "--res", "--ant", "--scalap", "--specialized",
+      "--scalacheck", "--instrumented", "--presentation", "--failed", "--update-check",
+      "--show-diff", "--verbose", "--terse", "--debug", "--version", "--self-test", "--help")
+    val srcPathOption = "--srcpath"
+    val grepOption = "--grep"
+
+    // HACK: if we parse `--srpath scaladoc`, we overwrite this var. The parser for test file paths
+    // then lazily creates the examples based on the current value.
+    // TODO is there a cleaner way to do this with SBT's parser infrastructure?
+    var srcPath = "files"
+    var _testFiles: TestFiles = null
+    def testFiles = {
+      if (_testFiles == null || _testFiles.srcPath != srcPath) _testFiles = new TestFiles(srcPath, globalBase, testBase)
+      _testFiles
+    }
+    val TestPathParser = ParserUtil.FileParser(
+      new SimpleFileFilter(f => testFiles.isTestCase(f)),
+      new SimpleFileFilter(f => testFiles.mayContainTestCase(f)), globalBase)
+
+    // allow `--grep "is unchecked" | --grep *t123*, in the spirit of ./bin/partest-ack
+    // superset of the --grep built into partest itself.
+    val Grep = {
+      def expandGrep(x: String): Seq[String] = {
+        val matchingFileContent = try {
+          val Pattern = ("(?i)" + x).r
+          testFiles.allTestCases.filter {
+            case (testFile, testPath) =>
+              val assocFiles = List(".check", ".flags").map(testFile.getParentFile / _)
+              val sourceFiles = if (testFile.isFile) List(testFile) else testFile.**(AllPassFilter).get.toList
+              val allFiles = testFile :: assocFiles ::: sourceFiles
+              allFiles.exists { f => f.exists && f.isFile && Pattern.findFirstIn(IO.read(f)).isDefined }
+          }
+        } catch {
+          case _: Throwable => Nil
+        }
+        val matchingFileName = try {
+          val filter = GlobFilter("*" + x + "*")
+          testFiles.allTestCases.filter(x => filter.accept(x._1.name))
+        } catch {
+          case t: Throwable => Nil
+        }
+        (matchingFileContent ++ matchingFileName).map(_._2).distinct.sorted
+      }
+
+      val completion = Completions.strict(Set("<filename glob>", "<regex> (for source, flags or checkfile contents)").map(s => Completion.displayOnly(s)))
+      val tokenCompletion = TokenCompletions.fixed((seen, level) => completion)
+
+      val globOrPattern = StringBasic.map(expandGrep).flatMap {
+        case Seq() => failure("no tests match pattern / glob")
+        case x => success(x.mkString(" "))
+      }
+      token(grepOption <~ Space) ~> token(globOrPattern, tokenCompletion)
+    }
+
+    val SrcPath = ((token(srcPathOption) <~ Space) ~ token(StringBasic.examples(Set("files", "pending", "scaladoc")))) map {
+      case opt ~ path =>
+        srcPath = path
+        opt + " " + path
+    }
+    val P = oneOf(knownUnaryOptions.map(x => token(x))) | SrcPath | TestPathParser | Grep
+    (Space ~> repsep(P, oneOrMore(Space))).map(_.mkString(" ")).?.map(_.getOrElse("")) <~ OptSpace
+  }
+}
diff --git a/project/ScalaOptionParser.scala b/project/ScalaOptionParser.scala
new file mode 100644
index 0000000..da8a3bf
--- /dev/null
+++ b/project/ScalaOptionParser.scala
@@ -0,0 +1,129 @@
+import ParserUtil._
+import sbt._
+import sbt.complete.Parser._
+import sbt.complete.Parsers._
+import sbt.complete._
+
+object ScalaOptionParser {
+  /** A SBT parser for the Scala command line runners (scala, scalac, etc) */
+  def scalaParser(entryPoint: String, globalBase: File): Parser[String] = {
+    def BooleanSetting(name: String): Parser[String] =
+      token(name)
+    def StringSetting(name: String): Parser[String] = {
+      val valueParser = name match {
+        case "-d" => JarOrDirectoryParser
+        case _ => token(StringBasic, TokenCompletions.displayOnly("<value>"))
+      }
+      concat(concat(token(name ~ Space.string)) ~ valueParser)
+    }
+    def MultiStringSetting(name: String): Parser[String] =
+      concat(concat(token(name ~ ":")) ~ repsep(token(StringBasicNotStartingWithDash, TokenCompletions.displayOnly("<value>")), token(",")).map(_.mkString))
+    def IntSetting(name: String): Parser[String] =
+      concat(concat(token(name ~ ":")) ~ token(IntBasic.map(_.toString), TokenCompletions.displayOnly("<integer>")))
+    def ChoiceSetting(name: String, choices: List[String]): Parser[String] =
+      concat(token(concat(name ~ ":")) ~ token(StringBasic.examples(choices: _*)).map(_.mkString))
+    def MultiChoiceSetting(name: String, choices: List[String]): Parser[String] =
+      concat(token(concat(name ~ ":")) ~ rep1sep(token(StringBasic.examples(choices: _*)), token(",")).map(_.mkString))
+    def PathSetting(name: String): Parser[String] = {
+      concat(concat(token(name) ~ Space.string) ~ rep1sep(JarOrDirectoryParser.filter(!_.contains(":"), x => x), token(java.io.File.pathSeparator)).map(_.mkString))
+    }
+    def FileSetting(name: String): Parser[String] = {
+      concat(concat(token(name) ~ Space.string) ~ rep1sep(JarOrDirectoryParser.filter(!_.contains(":"), x => x), token(java.io.File.pathSeparator)).map(_.mkString))
+    }
+    val Phase = token(NotSpace.examples(phases: _*))
+    def PhaseSettingParser(name: String): Parser[String] = {
+      MultiChoiceSetting(name, phases)
+    }
+    def ScalaVersionSetting(name: String): Parser[String] = {
+      concat(concat(token(name ~ Space.string)) ~ token(StringBasic, TokenCompletions.displayOnly("<scala version>")))
+    }
+    val Property: Parser[String] = {
+      val PropName = concat(token("-D" ~ oneOrMore(NotSpaceClass & not('=', "not =")).string, TokenCompletions.displayOnly("-D<property name>")))
+      val EqualsValue = concat("=" ~ token(OptNotSpace, TokenCompletions.displayOnly("<property value>")))
+      concat(PropName ~ EqualsValue.?.map(_.getOrElse("")))
+    }
+
+    val sourceFile = FileParser(GlobFilter("*.scala") | GlobFilter("*.java"))
+
+    // TODO Allow JVM settings via -J-... and temporarily add them to the ForkOptions
+    val UniversalOpt = Property | oneOf(pathSettingNames.map(PathSetting) ++ phaseSettings.map(PhaseSettingParser) ++ booleanSettingNames.map(BooleanSetting) ++ stringSettingNames.map(StringSetting) ++ multiStringSettingNames.map(MultiStringSetting) ++ intSettingNames.map(IntSetting) ++ choiceSettingNames.map { case (k, v) => ChoiceSetting(k, v) } ++ multiChoiceSettingNames.map { case (k, v) => MultiChoiceSetting(k, v) } ++ scalaVersionSettings.map(ScalaVersionSetting))
+    val ScalacOpt = sourceFile | UniversalOpt
+
+    val ScalaExtraSettings = oneOf(
+      scalaChoiceSettingNames.map { case (k, v) => ChoiceSetting(k,v)}.toList
+      ++ scalaStringSettingNames.map(StringSetting)
+      ++ scalaBooleanSettingNames.map(BooleanSetting))
+    val ScalaOpt = UniversalOpt | ScalaExtraSettings
+
+    val ScalaDocExtraSettings = oneOf(
+      scalaDocBooleanSettingNames.map(BooleanSetting)
+      ++ scalaDocIntSettingNames.map(IntSetting)
+      ++ scalaDocChoiceSettingNames.map { case (k, v) => ChoiceSetting(k, v)}
+      ++ scaladocStringSettingNames.map(StringSetting)
+      ++ scaladocPathSettingNames.map(PathSetting)
+      ++ scaladocMultiStringSettingNames.map(MultiStringSetting)
+    )
+    val ScalaDocOpt = ScalacOpt | ScalaDocExtraSettings
+
+    val P = entryPoint match {
+      case "scala" =>
+        val runnable = token(StringBasicNotStartingWithDash, TokenCompletions.displayOnly("<script|class|object|jar>")).filter(!_.startsWith("-"), x => x)
+        val runnableAndArgs = concat(runnable ~ Opt(concat(Space.string ~ repsep(token(StringBasic, TokenCompletions.displayOnly("<arg>")), Space).map(_.mkString(" ")))))
+        val options = rep1sep(ScalaOpt, Space).map(_.mkString(" "))
+        Opt(Space ~> (options | concat(concat(options ~ Space.string) ~ runnableAndArgs) | runnableAndArgs))
+      case "scaladoc" =>
+        Opt(Space ~> Opt(repsep(ScalaDocOpt, Space).map(_.mkString(" "))))
+      case "scalac" =>
+        Opt(Space ~> repsep(ScalacOpt, Space).map(_.mkString(" ")))
+    }
+    P <~ token(OptSpace)
+  }
+
+  // TODO retrieve this data programatically, ala https://github.com/scala/scala-tool-support/blob/master/bash-completion/src/main/scala/BashCompletion.scala
+  private def booleanSettingNames = List("-X", "-Xcheckinit", "-Xdev", "-Xdisable-assertions", "-Xexperimental", "-Xfatal-warnings", "-Xfull-lubs", "-Xfuture", "-Xlog-free-terms", "-Xlog-free-types", "-Xlog-implicit-conversions", "-Xlog-implicits", "-Xlog-reflective-calls",
+    "-Xno-forwarders", "-Xno-patmat-analysis", "-Xno-uescape", "-Xnojline", "-Xprint-pos", "-Xprint-types", "-Xprompt", "-Xresident", "-Xshow-phases", "-Xstrict-inference", "-Xverify", "-Y",
+    "-Ybreak-cycles", "-Yclosure-elim", "-Yconst-opt", "-Ydead-code", "-Ydebug", "-Ycompact-trees", "-Ydisable-unreachable-prevention", "-YdisableFlatCpCaching", "-Ydoc-debug",
+    "-Yeta-expand-keeps-star", "-Yide-debug", "-Yinfer-argument-types", "-Yinfer-by-name", "-Yinfer-debug", "-Yinline", "-Yinline-handlers",
+    "-Yinline-warnings", "-Yissue-debug", "-Ylog-classpath", "-Ymacro-debug-lite", "-Ymacro-debug-verbose", "-Ymacro-no-expand",
+    "-Yno-completion", "-Yno-generic-signatures", "-Yno-imports", "-Yno-load-impl-class", "-Yno-predef", "-Ynooptimise",
+    "-Yoverride-objects", "-Yoverride-vars", "-Ypatmat-debug", "-Yno-adapted-args", "-Ypos-debug", "-Ypresentation-debug",
+    "-Ypresentation-strict", "-Ypresentation-verbose", "-Yquasiquote-debug", "-Yrangepos", "-Yreify-copypaste", "-Yreify-debug", "-Yrepl-class-based",
+    "-Yrepl-sync", "-Yshow-member-pos", "-Yshow-symkinds", "-Yshow-symowners", "-Yshow-syms", "-Yshow-trees", "-Yshow-trees-compact", "-Yshow-trees-stringified", "-Ytyper-debug",
+    "-Ywarn-adapted-args", "-Ywarn-dead-code", "-Ywarn-inaccessible", "-Ywarn-infer-any", "-Ywarn-nullary-override", "-Ywarn-nullary-unit", "-Ywarn-numeric-widen", "-Ywarn-unused", "-Ywarn-unused-import", "-Ywarn-value-discard",
+    "-deprecation", "-explaintypes", "-feature", "-help", "-no-specialization", "-nobootcp", "-nowarn", "-optimise", "-print", "-unchecked", "-uniqid", "-usejavacp", "-usemanifestcp", "-verbose", "-version")
+  private def stringSettingNames = List("-Xgenerate-phase-graph", "-Xmain-class", "-Xpluginsdir", "-Xshow-class", "-Xshow-object", "-Xsource-reader", "-Ydump-classes", "-Ygen-asmp",
+    "-Ygen-javap", "-Ypresentation-log", "-Ypresentation-replay", "-Yrepl-outdir", "-d", "-dependencyfile", "-encoding", "-Xscript")
+  private def pathSettingNames = List("-bootclasspath", "-classpath", "-extdirs", "-javabootclasspath", "-javaextdirs", "-sourcepath", "-toolcp")
+  private val phases = List("all", "parser", "namer", "packageobjects", "typer", "patmat", "superaccessors", "extmethods", "pickler", "refchecks", "uncurry", "tailcalls", "specialize", "explicitouter", "erasure", "posterasure", "lazyvals", "lambdalift", "constructors", "flatten", "mixin", "cleanup", "delambdafy", "icode", "jvm", "terminal")
+  private val phaseSettings = List("-Xprint-icode", "-Ystop-after", "-Yskip", "-Yshow", "-Ystop-before", "-Ybrowse", "-Ylog", "-Ycheck", "-Xprint")
+  private def multiStringSettingNames = List("-Xmacro-settings", "-Xplugin", "-Xplugin-disable", "-Xplugin-require")
+  private def intSettingNames = List("-Xmax-classfile-name", "-Xelide-below", "-Ypatmat-exhaust-depth", "-Ypresentation-delay", "-Yrecursion")
+  private def choiceSettingNames = Map[String, List[String]](
+    "-Ybackend" -> List("GenASM", "GenBCode"),
+    "-YclasspathImpl" -> List("flat", "recursive"),
+    "-Ydelambdafy" -> List("inline", "method"),
+    "-Ylinearizer" -> List("dfs", "dump", "normal", "rpo"),
+    "-Ymacro-expand" -> List("discard", "none"),
+    "-Yresolve-term-conflict" -> List("error", "object", "package"),
+    "-g" -> List("line", "none", "notailcails", "source", "vars"),
+    "-target" -> List("jvm-1.5", "jvm-1.6", "jvm-1.7", "jvm-1.8"))
+  private def multiChoiceSettingNames = Map[String, List[String]](
+    "-Xlint" -> List("adapted-args", "nullary-unit", "inaccessible", "nullary-override", "infer-any", "missing-interpolator", "doc-detached", "private-shadow", "type-parameter-shadow", "poly-implicit-overload", "option-implicit", "delayedinit-select", "by-name-right-associative", "package-object-classes", "unsound-match", "stars-align"),
+    "-language" -> List("help", "_", "dynamics", "postfixOps", "reflectiveCalls", "implicitConversions", "higherKinds", "existentials", "experimental.macros"),
+    "-Yopt" -> List("l:none", "l:default", "l:method", "l:project", "l:classpath", "unreachable-code", "simplify-jumps", "empty-line-numbers", "empty-labels", "compact-locals", "nullness-tracking", "closure-elimination", "inline-project", "inline-global"),
+    "-Ystatistics" -> List("parser", "typer", "patmat", "erasure", "cleanup", "jvm")
+  )
+  private def scalaVersionSettings = List("-Xmigration", "-Xsource")
+
+  private def scalaChoiceSettingNames = Map("-howtorun" -> List("object", "script", "jar", "guess"))
+  private def scalaStringSettingNames = List("-i", "-e")
+  private def scalaBooleanSettingNames = List("-nc", "-save")
+
+  private def scalaDocBooleanSettingNames = List("-Yuse-stupid-types", "-implicits", "-implicits-debug", "-implicits-show-all", "-implicits-sound-shadowing", "-implicits-hide", "-author", "-diagrams", "-diagrams-debug", "-raw-output", "-no-prefixes", "-no-link-warnings", "-expand-all-types", "-groups")
+  private def scalaDocIntSettingNames = List("-diagrams-max-classes", "-diagrams-max-implicits", "-diagrams-dot-timeout", "-diagrams-dot-restart")
+  private def scalaDocChoiceSettingNames = Map("-doc-format" -> List("html"))
+  private def scaladocStringSettingNames = List("-doc-title", "-doc-version", "-doc-footer", "-doc-no-compile", "-doc-source-url", "-doc-generator", "-skip-packages")
+  private def scaladocPathSettingNames = List("-doc-root-content", "-diagrams-dot-path")
+  private def scaladocMultiStringSettingNames = List("-doc-external-doc")
+
+}
diff --git a/project/ScalaTool.scala b/project/ScalaTool.scala
new file mode 100644
index 0000000..e9531f2
--- /dev/null
+++ b/project/ScalaTool.scala
@@ -0,0 +1,51 @@
+import sbt._
+import org.apache.commons.lang3.SystemUtils
+import org.apache.commons.lang3.StringUtils.replaceEach
+
+/**
+ * A class that generates a shell or batch script to execute a Scala program.
+ *
+ * This is a simplified copy of Ant task (see scala.tools.ant.ScalaTool).
+ */
+case class ScalaTool(mainClass: String,
+                     classpath: List[String],
+                     properties: Map[String, String],
+                     javaOpts: String,
+                     toolFlags: String) {
+  //  For classpath, the platform specific
+  //  demarcation of any script variables (e.g. `${SCALA_HOME}` or
+  //  `%SCALA_HOME%`) can be specified in a platform independent way (e.g.
+  //  `@SCALA_HOME@`) and automatically translated for you.
+  def patchedToolScript(template: String, forWindows: Boolean) = {
+    val varRegex = """@(\w+)@""" // the group should be able to capture each of the keys of the map below
+    val platformClasspath =
+      if(forWindows) classpath.mkString(";").replace('/', '\\').replaceAll(varRegex, "%$1%")
+      else if(SystemUtils.IS_OS_WINDOWS) {
+        // When building on Windows, use a Windows classpath in the shell script (for MSYS/Cygwin).
+        // This is only used for "quick", which uses absolute paths, so it is not portable anyway.
+        classpath.mkString(";").replace("\\", "\\\\").replaceAll(varRegex, """\${$1}""")
+      } else classpath.mkString(":").replace('\\', '/').replaceAll(varRegex, """\${$1}""")
+
+    val variables = Map(
+      ("@@"           -> "@"), // for backwards compatibility
+      ("@class@"      -> mainClass),
+      ("@properties@" -> (properties map { case (k, v) => s"""-D$k="$v""""} mkString " ")),
+      ("@javaflags@"  -> javaOpts),
+      ("@toolflags@"  -> toolFlags),
+      ("@classpath@"  -> platformClasspath)
+    )
+
+    val (from, to) = variables.unzip
+    replaceEach(template, from.toArray, to.toArray)
+  }
+
+  def writeScript(file: String, platform: String, rootDir: File, outDir: File): File = {
+    val forWindows   = platform match { case "windows" => true case _ => false }
+    val templatePath = s"scala/tools/ant/templates/tool-$platform.tmpl"
+    val suffix       = if(forWindows) ".bat" else ""
+    val scriptFile   = outDir / s"$file$suffix"
+    val patched      = patchedToolScript(IO.read(rootDir / templatePath).replace("\r", ""), forWindows)
+    IO.write(scriptFile, if(forWindows) patched.replace("\n", "\r\n") else patched)
+    scriptFile
+  }
+}
diff --git a/project/ScriptCommands.scala b/project/ScriptCommands.scala
new file mode 100644
index 0000000..537990d
--- /dev/null
+++ b/project/ScriptCommands.scala
@@ -0,0 +1,19 @@
+import sbt._
+import Keys._
+import complete.DefaultParsers._
+
+/** Custom commands for use by the Jenkins scripts. This keeps the surface area and call syntax small. */
+object ScriptCommands {
+  def all = Seq(setupPublishCore)
+
+  /** Set up the environment for `validate/publish-core`. The argument is the Artifactory snapshot repository URL. */
+  def setupPublishCore = Command.single("setupPublishCore") { case (state, url) =>
+      Project.extract(state).append(Seq(
+        VersionUtil.baseVersionSuffix in Global := "SHA-SNAPSHOT",
+        // Append build.timestamp to Artifactory URL to get consistent build numbers (see https://github.com/sbt/sbt/issues/2088):
+        publishTo in Global := Some("scala-pr" at url.replaceAll("/$", "") + ";build.timestamp=" + System.currentTimeMillis),
+        publishArtifact in (Compile, packageDoc) in ThisBuild := false,
+        scalacOptions in Compile in ThisBuild += "-optimise"
+      ), state)
+    }
+}
diff --git a/project/VersionUtil.scala b/project/VersionUtil.scala
new file mode 100644
index 0000000..6c8aebf
--- /dev/null
+++ b/project/VersionUtil.scala
@@ -0,0 +1,126 @@
+import sbt._
+import Keys._
+import java.util.Properties
+import java.io.FileInputStream
+import scala.collection.JavaConverters._
+
+object VersionUtil {
+  lazy val baseVersion = settingKey[String]("The base version number from which all others are derived")
+  lazy val baseVersionSuffix = settingKey[String]("Identifies the kind of version to build")
+  lazy val copyrightString = settingKey[String]("Copyright string.")
+  lazy val versionProperties = settingKey[Versions]("Version properties.")
+  lazy val generateVersionPropertiesFile = taskKey[File]("Generating version properties file.")
+  lazy val generateBuildCharacterPropertiesFile = taskKey[File]("Generating buildcharacter.properties file.")
+
+  lazy val globalVersionSettings = Seq[Setting[_]](
+    // Set the version properties globally (they are the same for all projects)
+    versionProperties in Global := versionPropertiesImpl.value,
+    version in Global := versionProperties.value.mavenVersion
+  )
+
+  lazy val generatePropertiesFileSettings = Seq[Setting[_]](
+    copyrightString := "Copyright 2002-2016, LAMP/EPFL",
+    resourceGenerators in Compile += generateVersionPropertiesFile.map(file => Seq(file)).taskValue,
+    generateVersionPropertiesFile := generateVersionPropertiesFileImpl.value
+  )
+
+  lazy val generateBuildCharacterFileSettings = Seq[Setting[_]](
+    generateBuildCharacterPropertiesFile := generateBuildCharacterPropertiesFileImpl.value
+  )
+
+  case class Versions(canonicalVersion: String, mavenVersion: String, osgiVersion: String, commitSha: String, commitDate: String, isRelease: Boolean) {
+    val githubTree =
+      if(isRelease) "v" + mavenVersion
+      else if(commitSha != "unknown") commitSha
+      else "master"
+
+    override def toString = s"Canonical: $canonicalVersion, Maven: $mavenVersion, OSGi: $osgiVersion, github: $githubTree"
+
+    def toMap: Map[String, String] = Map(
+      "version.number" -> canonicalVersion,
+      "maven.version.number" -> mavenVersion,
+      "osgi.version.number" -> osgiVersion
+    )
+  }
+
+  /** Compute the canonical, Maven and OSGi version number from `baseVersion` and `baseVersionSuffix`.
+    * Examples of the generated versions:
+    *
+    * ("2.11.8", "SNAPSHOT"    ) -> ("2.11.8-20151215-133023-7559aed3c5", "2.11.8-SNAPSHOT",            "2.11.8.v20151215-133023-7559aed3c5")
+    * ("2.11.8", "SHA-SNAPSHOT") -> ("2.11.8-20151215-133023-7559aed3c5", "2.11.8-7559aed3c5-SNAPSHOT", "2.11.8.v20151215-133023-7559aed3c5")
+    * ("2.11.8", ""            ) -> ("2.11.8",                            "2.11.8",                     "2.11.8.v20151215-133023-VFINAL-7559aed3c5")
+    * ("2.11.8", "M3"          ) -> ("2.11.8-M3",                         "2.11.8-M3",                  "2.11.8.v20151215-133023-M3-7559aed3c5")
+    * ("2.11.8", "RC4"         ) -> ("2.11.8-RC4",                        "2.11.8-RC4",                 "2.11.8.v20151215-133023-RC4-7559aed3c5")
+    * ("2.11.8-RC4", "SPLIT"   ) -> ("2.11.8-RC4",                        "2.11.8-RC4",                 "2.11.8.v20151215-133023-RC4-7559aed3c5")
+    *
+    * A `baseVersionSuffix` of "SNAPSHOT" is the default, which is used for local snapshot builds. The PR validation
+    * job uses "SHA-SNAPSHOT". An empty suffix is used for releases. All other suffix values are treated as RC /
+    * milestone builds. The special suffix value "SPLIT" is used to split the real suffix off from `baseVersion`
+    * instead and then apply the usual logic. */
+  private lazy val versionPropertiesImpl: Def.Initialize[Versions] = Def.setting {
+
+    val (base, suffix) = {
+      val (b, s) = (baseVersion.value, baseVersionSuffix.value)
+      if(s == "SPLIT") {
+        val split = """([\w+\.]+)(-[\w+\.]+)??""".r
+        val split(b2, sOrNull) = b
+        (b2, Option(sOrNull).map(_.drop(1)).getOrElse(""))
+      } else (b, s)
+    }
+
+    def executeTool(tool: String) = {
+      val cmd =
+        if (System.getProperty("os.name").toLowerCase.contains("windows"))
+          s"cmd.exe /c tools\\$tool.bat -p"
+        else s"tools/$tool"
+      Process(cmd).lines.head
+    }
+
+    val date = executeTool("get-scala-commit-date")
+    val sha = executeTool("get-scala-commit-sha").substring(0, 7) // The script produces 10 digits at the moment
+
+    val (canonicalV, mavenV, osgiV, release) = suffix match {
+      case "SNAPSHOT"     => (s"$base-$date-$sha", s"$base-SNAPSHOT",      s"$base.v$date-$sha",         false)
+      case "SHA-SNAPSHOT" => (s"$base-$date-$sha", s"$base-$sha-SNAPSHOT", s"$base.v$date-$sha",         false)
+      case ""             => (s"$base",            s"$base",               s"$base.v$date-VFINAL-$sha",  true)
+      case suffix         => (s"$base-$suffix",    s"$base-$suffix",       s"$base.v$date-$suffix-$sha", true)
+    }
+
+    Versions(canonicalV, mavenV, osgiV, sha, date, release)
+  }
+
+  private lazy val generateVersionPropertiesFileImpl: Def.Initialize[Task[File]] = Def.task {
+    writeProps(versionProperties.value.toMap + ("copyright.string" -> copyrightString.value),
+      (resourceManaged in Compile).value / s"${thisProject.value.id}.properties")
+  }
+
+  private lazy val generateBuildCharacterPropertiesFileImpl: Def.Initialize[Task[File]] = Def.task {
+    writeProps(versionProperties.value.toMap, (baseDirectory in ThisBuild).value / "buildcharacter.properties")
+  }
+
+  private def writeProps(m: Map[String, String], propFile: File): File = {
+    val props = new Properties
+    m.foreach { case (k, v) => props.put(k, v) }
+    // unfortunately, this will write properties in arbitrary order
+    // this makes it harder to test for stability of generated artifacts
+    // consider using https://github.com/etiennestuder/java-ordered-properties
+    // instead of java.util.Properties
+    IO.write(props, null, propFile)
+    propFile
+  }
+
+  /** The global versions.properties data */
+  lazy val versionProps: Map[String, String] = {
+    val props = new Properties()
+    val in = new FileInputStream(file("versions.properties"))
+    try props.load(in)
+    finally in.close()
+    props.asScala.toMap.map {
+      case (k, v) => (k, sys.props.getOrElse(k, v)) // allow system properties to override versions.properties
+    }
+  }
+
+  /** Get a subproject version number from `versionProps` */
+  def versionNumber(name: String): String =
+    versionProps(s"$name.version.number")
+}
diff --git a/project/build.properties b/project/build.properties
new file mode 100644
index 0000000..43b8278
--- /dev/null
+++ b/project/build.properties
@@ -0,0 +1 @@
+sbt.version=0.13.11
diff --git a/project/plugins.sbt b/project/plugins.sbt
new file mode 100644
index 0000000..c21824b
--- /dev/null
+++ b/project/plugins.sbt
@@ -0,0 +1,5 @@
+libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.3.2"
+
+libraryDependencies += "org.pantsbuild" % "jarjar" % "1.6.0"
+
+libraryDependencies += "biz.aQute" % "bndlib" % "1.50.0"
diff --git a/scripts/common b/scripts/common
index b075469..bfddf3d 100644
--- a/scripts/common
+++ b/scripts/common
@@ -18,6 +18,9 @@ IVY_CACHE="$WORKSPACE/.ivy2"
 mkdir -p $IVY_CACHE
 rm -rf $IVY_CACHE/cache/org.scala-lang
 
+SBT_CMD=${sbtCmd-sbt}
+SBT_CMD="$SBT_CMD -sbt-version 0.13.11"
+
 # temp dir where all 'non-build' operation are performed
 TMP_ROOT_DIR=$(mktemp -d -t pr-scala.XXXX)
 TMP_DIR="${TMP_ROOT_DIR}/tmp"
diff --git a/scripts/jobs/integrate/bootstrap b/scripts/jobs/integrate/bootstrap
old mode 100755
new mode 100644
index 46d6100..a81c672
--- a/scripts/jobs/integrate/bootstrap
+++ b/scripts/jobs/integrate/bootstrap
@@ -1,74 +1,87 @@
 #!/bin/bash -e
-# TODO: different scripts for the different phases -- usually we don't need to bootstrap the modules,
-# since we can use the previous version of scala for STARR as well as for compiling the modules (assuming it's binary compatible)
-# We should move away from the complicated bootstrap and set up our release schedule so we always have a previous build that satisfies these criteria.
-# (Potentially trivially, by splitting up this script, and publishing locker as if it were a real release.)
-
-# requirements:
-# sbtCmd must point to sbt from sbt-extras (this is the standard on the Scala jenkins, so we only support that one)
-# - ~/.sonatype-curl that consists of user = USER:PASS
-# - ~/.m2/settings.xml with credentials for sonatype
-    # <server>
-    #   <id>private-repo</id>
-    #   <username>jenkinside</username>
-    #   <password></password>
-    # </server>
-# - ~/.credentials (for sonatype)
-    # realm=Sonatype Nexus Repository Manager
-    # host=oss.sonatype.org
-    # user=lamp
-    # password=
-# - ~/.credentials-private-repo for private-repo.typesafe.com, as follows:
-    # realm=Artifactory Realm
-    # host=private-repo.typesafe.com
-    # user=jenkinside
-    # password=
-# - ~/.sbt/0.13/plugins/gpg.sbt with:
-#   addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8.1")
-
-# Modus operandi:
-#
-# Determine Scala version as:
-#
-# $SCALA_VER_BASE$SCALA_VER_SUFFIX (if former variable is set)
-# By parsing the tag (if HEAD is tagged as v$base$suffix)
-# By parsing build.number for the base version, suffixing with -$sha-nightly
-# Serialize these versions to jenkins.properties, which are passed downstream to scala-release-2.11.x-dist.
-# This also removes the need to tag scala/scala-dist (not possible for nightlies, still encouraged for releases, but not a hard requirement).
-#
-# Determine Module Versions
-#
-# When running in "versions.properties" mode (the default), derive tags from these versions and build, publishing only those modules that are not available yet.
-# Otherwise, build HEAD for all modules, derive a -nightly version for them.
-# Bootstrap:
-#
-# Build minimal core of Scala as this version (aka locker), publish to private-repo
-# Build modules required to bootstrap, publish to private-repo
-# Build Scala using the previously built core and bootstrap modules, publish to private-repo This overwrites the minimal core on private-repo
-# Stage to sonatype (unless building a -nightly release):
+
+# Script Overview
+#  - determine scala version
+#  - determine module versions
+#  - build minimal core (aka locker) of Scala, use the determined version number, publish to private-repo
+#  - build those modules where a binary compatible version doesn't exist, publish to private-repo
+#  - build Scala using the previously built core and bootstrap modules, publish to private-repo (overwrites the minimal core version on private-repo)
+#  - for releases (not nightlies)
+#    - stage Scala on sonatype
+#    - rebuild modules that needed a rebuild with this Scala build, and stage them on sonatype
+#  - for nightlies
+#    - force rebuild all modules and publish them locally (for testing purposes)
+#  - the Scala version is serialized to jenkins.properties, which is passed downstream to scala-release jobs
+#    - this removes the need to tag scala/scala-dist (it's still encouraged for releases, but not a hard requirement)
+
+
+# Specifying the Scala version:
+#  - To build a release (this enables publishing to sonatype):
+#    - Either specify SCALA_VER_BASE. You may also specify SCALA_VER_SUFFIX, the Scala version is SCALA_VER=$SCALA_VER_BASE$SCALA_VER_SUFFIX.
+#    - Or have the current HEAD tagged as v$base$suffix
+#    - To prevent staging on sonatype (for testing), set publishToSonatype to anything but "yes"
+#    - Note: After building a release, the jenkins job provides an updated versions.properties file as artifact.
+#      Put this file in the Scala repo and create a pull request, and also update the file build.number.
 #
-# Stage this Scala build on sonatype
-# Rebuild modules with this Scala build, and stage them on sonatype as well
-# This script can be run in multiple modes. It is design to work without any input,
-# so that it could be run in Travis CI. In that mode, it'll build a release when
-# the current HEAD of the checkout in $WORKSPACE is tagged, and stage to sonatype. Otherwise,
-# it'll build a nightly.
+# - Otherwise, a nightly release is built:
+#    - version number is read from the build.number file, extended with -$sha-nightly
+
+
+# Specifying module versions: there are two modes
+#  - If moduleVersioning="versions.properties" (default): in this mode we use release versions for the modules.
+#    - Module versions are read from the versions.properties file.
+#    - Set <MODULE>_VER to override the default, e.g. XML_VER="1.0.4".
+#    - The git revision is set to <MODULE>_REF="v$<MODULE>_VER". Make sure the tag exists (you can't override <MODULE>_REF).
 #
-# Since the nightlies are intended to be a drop in replacement, all modules are built with the
-# full Scala version as their binary version, so that you can just set scalaVersion to the
-# nightly's sha-derived version and be good to go.
+#  - Otherwise (moduleVersioning has some other value): in this mode we use nightly version numbers for modules.
+#    - By default the script sets all <MODULE>_REF to "HEAD", override to build a specific revision.
+#    - The <MODULE>_VER is set to a nightly version, for example "1.0.3-7-g14888a2-nightly" (you can't override <MODULE>_VER)
+
+
+# Modules are automatically built if necessary.
+#  - A module is built if it doesn't exist in the maven repository. Note that the lookup uses two versions:
+#    - The version of the module (see below how it's determined)
+#    - The binary version of of the SCALA_VER release that is being built
+#  - sbt computes the binary version when looking up / building modules (*). Examples:
+#    - 2.12.0-M1, 2.12.0-RC3: the full version is used
+#    - 2.12.0, 2.12.1-M1, 2.12.1-RC3, 2.12.1: the binary version 2.12 is used
 #
-# The other way to trigger a release is by setting the SCALA_VER_BASE env var.
+#  - Example: assume that `scala-xml_2.11 % 1.0.3` and `scala-xml_2.12.0-M1 % 1.0.3` both exists
+#    - XML_VER=1.0.3 and SCALA_VER=2.11.7    => no rebuild (binary version remains 2.11)
+#    - XML_VER=1.0.3 and SCALA_VER=2.12.0-M2 => rebuild (new binary version 2.12.0-M2)
+#    - XML_VER=1.0.4 and SCALA_VER=2.11.7    => rebuild (new version for the module, not yet on maven)
+#      NOTE: this is not the recommended way of publishing a module. Instead, prefer to release `scala-xml_2.11 % 1.0.4`
+#            using the existing scala 2.11.6 compiler before releasing 2.11.7. Sometimes it's necessary though. One
+#            example was 2.11.1, which contained a fix in the backend (SerialVersionUID was ignored). All modules needed
+#            to be re-built using the 2.11.1 release, we could not use 2.11.0. We could also not release the modules
+#            after 2.11.1 was out, because that way the scala-library-all pom of 2.11.1 would depend on the old modules.
 #
-# By default, we build the versions of the modules as specified by versions.properties
-# (as specified in the HEAD commit). Set moduleVersioning to something random
-# to trigger building HEAD of each module, generating a fresh -$(git describe)-nightly version for each.
+# (*) https://github.com/sbt/sbt/blob/0.13.8/util/cross/src/main/input_sources/CrossVersionUtil.scala#L39
+
+
+# Binary incompatible changes in Modules: example with Scala 2.11 / 2.12 and scala-parser-combinators
+#  - The 1.0.x branch on scala-parser-combinators remains binary compatible with 1.0.0
+#  - Scala 2.11 will always use 1.0.x releases: we ship scala-parser-combinators with the distribution,
+#    so we cannot introduce incompatible changes in a minor release.
+#  - The master branch of scala-parser-combinators contains binary incompatible changes, versioned 1.1.x
+#  - Scala 2.12 will use 1.1.x releases
+#  - No changes to the build script required: just put the 1.1.x version number into versions.properties
 #
-# PS: set publishToSonatype to anything but "yes" to avoid publishing to sonatype
-# (publishing only done when $WORKSPACE checkout's HEAD is tagged / SCALA_VER_BASE is set.)
+# Note: It's still OK for a module to release a binary incompatible version to maven, for example
+# scala-parser-combinators_2.11 % 1.1.0. Users can depend on this in their sbt build. But for the
+# distribution (tar/zip archives, scala-library-all) we have to stay on the binary compatible version.
+
+
+# Requirements
+#  - SBT_CMD must point to sbt from sbt-extras
+#  - ~/.sonatype-curl, ~/.m2/settings.xml, ~/.credentials, ~/.credentials-sonatype, ~/.credentials-private-repo
+#    as defined by https://github.com/scala/scala-jenkins-infra/tree/master/templates/default
+#  - ~/.sbt/0.13/plugins/gpg.sbt with:
+#     addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8.1")
+
+# Note: private-repo used to be private-repo.typesafe.com. now we're running artifactory on scala-ci.typesafe.com/artifactory
 
 
-# set to something besides the default to build nightly snapshots of the modules instead of some tagged version
 moduleVersioning=${moduleVersioning-"versions.properties"}
 
 publishPrivateTask=${publishPrivateTask-"publish"}
@@ -76,24 +89,11 @@ publishSonatypeTaskCore=${publishSonatypeTaskCore-"publish-signed"}
 publishSonatypeTaskModules=${publishSonatypeTaskModules-"publish-signed"}
 publishLockerPrivateTask=${publishLockerPrivateTask-$publishPrivateTask} # set to "init" to speed up testing of the script (if you already built locker before)
 
-sbtCmd=${sbtCmd-sbt} # TESTING (this is a marker for defaults to change when testing locally: should be sbtx on my mac)
-
-# 0.13.5 does not respect "set every scalaVersion", see
-# https://github.com/scala/scala-parser-combinators/pull/27
-sbtCmd="$sbtCmd -sbt-version 0.13.2"
-
 forceRebuild=${forceRebuild-no}
 
-# publishToSonatype
-# set to anything but "yes" to avoid publishing to sonatype
-# overridden to "no" when no SCALA_VER_BASE is passed and HEAD is not tagged with a valid version tag
-#
-
 antBuildTask="${antBuildTask-nightly}" # TESTING leave empty to avoid the sanity check (don't set it to "init" because ant will croak)
 clean="clean" # TESTING leave empty to speed up testing
 
-
-
 baseDir=${WORKSPACE-`pwd`}
 scriptsDir="$baseDir/scripts"
 . $scriptsDir/common
@@ -108,8 +108,23 @@ rm -rf $baseDir/resolutionScratch_
 mkdir -p $baseDir/resolutionScratch_
 
 # repo used to publish "locker" scala to (to start the bootstrap)
-privateCred="private-repo"
-privateRepo="http://private-repo.typesafe.com/typesafe/scala-release-temp/"
+releaseTempRepoCred="private-repo"
+releaseTempRepoUrl=${releaseTempRepoUrl-"https://scala-ci.typesafe.com/artifactory/scala-release-temp/"}
+jcenterCacheUrl=${jcenterCacheUrl-"https://scala-ci.typesafe.com/artifactory/jcenter/"}
+
+# Used below in sbtArgs since we use a dedicated repository to share artifcacts between jobs,
+# so we need to configure SBT to use these rather than its default, Maven Central.
+# See http://www.scala-sbt.org/0.13/docs/Proxy-Repositories.html
+sbtRepositoryConfig="$scriptsDir/repositories-scala-release"
+cat > "$sbtRepositoryConfig" << EOF
+[repositories]
+  private-repo: $releaseTempRepoUrl
+  jcenter-cache: $jcenterCacheUrl
+  typesafe-ivy-releases: https://dl.bintray.com/typesafe/ivy-releases/, [organisation]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
+  sbt-plugin-releases: https://dl.bintray.com/sbt/sbt-plugin-releases/, [organisation]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
+  maven-central
+  local
+EOF
 
 ##### git
 gfxd() {
@@ -125,7 +140,7 @@ update() {
   cd $2
 
   git fetch --tags "https://github.com/$1/$2.git"
-  (git fetch "https://github.com/$1/$2.git" $3 && git checkout -q FETCH_HEAD) #|| git checkout -q $3 # || fallback is for local testing on tag
+  (git fetch "https://github.com/$1/$2.git" $3 && git checkout -fq FETCH_HEAD) #|| git checkout -fq $3 # || fallback is for local testing on tag
   git reset --hard
 }
 
@@ -158,19 +173,20 @@ function st_stagingRepoClose() {
 # the old version (on jenkins, and I don't want to upgrade for risk of breaking other builds) honors -sbt-dir
 # the new version of sbt-extras ignores sbt-dir, so we pass it in as -Dsbt.global.base
 # need to set sbt-dir to one that has the gpg.sbt plugin config
-sbtArgs="-no-colors -ivy $baseDir/ivy2 -Dsbt.override.build.repos=true -Dsbt.repository.config=$scriptsDir/repositories-scala-release -Dsbt.global.base=$HOME/.sbt/0.13 -sbt-dir $HOME/.sbt/0.13"
+sbtArgs="-no-colors -ivy $baseDir/ivy2 -Dsbt.override.build.repos=true -Dsbt.repository.config=$sbtRepositoryConfig -Dsbt.global.base=$HOME/.sbt/0.13 -sbt-dir $HOME/.sbt/0.13"
 
 sbtBuild() {
-  echo "### sbtBuild: "$sbtCmd $sbtArgs "${scalaVersionTasks[@]}" "${publishTasks[@]}" "$@"
-  $sbtCmd $sbtArgs "${scalaVersionTasks[@]}" "${publishTasks[@]}" "$@" >> $baseDir/logs/builds 2>&1
+  echo "### sbtBuild: "$SBT_CMD $sbtArgs "${scalaVersionTasks[@]}" "${publishTasks[@]}" "$@"
+  $SBT_CMD $sbtArgs "${scalaVersionTasks[@]}" "${publishTasks[@]}" "$@" >> $baseDir/logs/builds 2>&1
 }
 
 sbtResolve() {
   cd $baseDir/resolutionScratch_
   touch build.sbt
-  cross=${4-binary} # Disabled / binary / full
-  echo "### sbtResolve: $sbtCmd $sbtArgs " "${scalaVersionTasks[@]}" "\"$1\" % \"$2\" % \"$3\" cross CrossVersion.$cross"
-  $sbtCmd $sbtArgs "${scalaVersionTasks[@]}" \
+  # Can be set to `full` if a module requires cross-versioning against the full Scala version, like the continuations plugin.
+  cross=${4-binary}
+  echo "### sbtResolve: $SBT_CMD $sbtArgs " "${scalaVersionTasks[@]}" "\"$1\" % \"$2\" % \"$3\" cross CrossVersion.$cross"
+  $SBT_CMD $sbtArgs "${scalaVersionTasks[@]}" \
     "set libraryDependencies := Seq(\"$1\" % \"$2\" % \"$3\" cross CrossVersion.$cross)" \
       'show update' >> $baseDir/logs/resolution 2>&1
 }
@@ -222,22 +238,13 @@ buildPartest() {
   fi
 }
 
-# buildPartestIface() {
-#   if [ "$forceRebuild" != "yes" ] && ( sbtResolve "org.scala-lang.modules"  "scala-partest-interface" $PARTEST_IFACE_VER )
-#   then echo "Found scala-partest-interface $PARTEST_IFACE_VER; not building."
-#   else
-#     update scala scala-partest-interface "$PARTEST_IFACE_REF" && gfxd
-#     sbtBuild 'set version :="'$PARTEST_IFACE_VER'"' $clean "${buildTasks[@]}"
-#   fi
-# }
-
 buildContinuations() {
   if [ "$CONT_PLUG_BUILT" != "yes" ] && [ "$forceRebuild" != "yes" ] && ( sbtResolve "org.scala-lang.plugins"  "scala-continuations-plugin" $CONTINUATIONS_VER full )
   then echo "Found scala-continuations-plugin $CONTINUATIONS_VER; not building."
   else
     update scala scala-continuations $CONTINUATIONS_REF && gfxd
 
-    $sbtCmd $sbtArgs 'project plugin' "${scalaVersionTasks[@]}" "${publishTasks[@]}" \
+    $SBT_CMD $sbtArgs 'project plugin' "${scalaVersionTasks[@]}" "${publishTasks[@]}" \
       'set version := "'$CONTINUATIONS_VER'"' $clean "compile:package" test "${buildTasks[@]}" # https://github.com/scala/scala-continuations/pull/4
     CONT_PLUG_BUILT="yes"
   fi
@@ -246,7 +253,7 @@ buildContinuations() {
   then echo "Found scala-continuations-library $CONTINUATIONS_VER; not building."
   else
     update scala scala-continuations $CONTINUATIONS_REF && gfxd
-    $sbtCmd $sbtArgs 'project library' "${scalaVersionTasks[@]}" "${publishTasks[@]}" \
+    $SBT_CMD $sbtArgs 'project library' "${scalaVersionTasks[@]}" "${publishTasks[@]}" \
       'set version := "'$CONTINUATIONS_VER'"' $clean test "${buildTasks[@]}"
     CONT_LIB_BUILT="yes"
   fi
@@ -274,18 +281,21 @@ buildActorsMigration(){
   fi
 }
 
+# should only be called with publishTasks publishing to private-repo
 buildScalacheck(){
   if [ "$SCALACHECK_BUILT" != "yes" ] && [ "$forceRebuild" != "yes" ] && ( sbtResolve "org.scalacheck"  "scalacheck" $SCALACHECK_VER )
   then echo "Found scalacheck $SCALACHECK_VER; not building."
   else
     update rickynils scalacheck $SCALACHECK_REF && gfxd
-    sbtBuild 'set version := "'$SCALACHECK_VER'"' 'set VersionKeys.scalaParserCombinatorsVersion := "'$PARSERS_VER'"' $clean $publishPrivateTask # test times out NOTE: never published to sonatype
+    sbtBuild 'set version := "'$SCALACHECK_VER'"' 'set VersionKeys.scalaParserCombinatorsVersion := "'$PARSERS_VER'"' $clean publish # test times out NOTE: never published to sonatype
     SCALACHECK_BUILT="yes"
   fi
 }
 
 # build modules, using ${buildTasks[@]} (except for Scalacheck, which is hard-coded to publish to private-repo)
 buildModules() {
+  publishTasks=('set credentials += Credentials(Path.userHome / ".credentials-private-repo")' "set every publishTo := Some(\"private-repo\" at \"$releaseTempRepoUrl\")")
+  buildTasks=($publishPrivateTask)
   buildXML
   buildParsers
   buildContinuations
@@ -293,22 +303,63 @@ buildModules() {
   buildActorsMigration
   buildScalacheck
   buildPartest
-  # buildPartestIface
+}
+
+buildPublishedModules() {
+  publishTasks=('set credentials += Credentials(Path.userHome / ".credentials-sonatype")' "set pgpPassphrase := Some(Array.empty)")
+  buildTasks=($publishSonatypeTaskModules)
+  buildXML
+  buildParsers
+  buildContinuations
+  buildSwing
+  buildActorsMigration
+  buildPartest
 }
 
 
 ## BUILD STEPS:
 
+scalaVerToBinary() {
+  # $1 = SCALA_VER
+  # $2 = SCALA_VER_BASE
+  # $3 = SCALA_VER_SUFFIX
+
+  local RE='\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)'
+  local majMin="$(echo $2 | sed -e "s#$RE#\1.\2#")"
+  local patch="$(echo $2 | sed -e "s#$RE#\3#")"
+
+  # The binary version is majMin (e.g. "2.12") if
+  #  - there's no suffix            : 2.12.0, 2.12.1
+  #  - the suffix starts with "-bin": 2.12.0-bin-M1
+  #  - the patch version is > 0     : 2.12.1-M1, 1.12.3-RC2, 2.12.1-sha-nightly, 2.12.2-SNAPSHOT
+  #
+  # Otherwise, the binary version is the full version: 2.12.0-M1, 2.12.0-RC2, 2.12.0-sha-nightly, 2.12.0-SNAPSHOT
+  #
+  # Adapted from sbt: https://github.com/sbt/sbt/blob/0.13.8/util/cross/src/main/input_sources/CrossVersionUtil.scala#L39
+  #
+  # Note: during the pre-release cycle of a major release (e.g. before 2.12.0), the SCALA_BINARY_VER of nightly / SNAPSHOT
+  # versions is the full version, e.g. 2.12.0-sha-nightly, so modules are always re-built. This is in line with what sbt
+  # does: for example, with scalaVersion := "2.12.0-SNAPSHOT", sbt will resolve scala-xml as scala-xml_2.12.0-SNAPSHOT.
+  # Once the 2.12.0 release is out, the binary version is 2.12 for all versions (e.g. for 2.12.1-sha-nightly).
+
+  if [[ "$3" == "" || "${3:0:4}" == "-bin" || "$patch" != "0" ]]; then
+    echo "$majMin"
+  else
+    echo "$1"
+  fi
+}
+
 determineScalaVersion() {
   cd $WORKSPACE
   parseScalaProperties "versions.properties"
+  echo "repo_ref=2.11.x" >> $baseDir/jenkins.properties # for the -dist downstream jobs that build the actual archives
+
 
+  # each of the branches below defines the following vars: SCALA_VER_BASE, SCALA_VER_SUFFIX, SCALADOC_SOURCE_LINKS_VER, publishToSonatype
   if [ -z "$SCALA_VER_BASE" ]; then
     echo "No SCALA_VER_BASE specified."
 
-    scalaTag=$(git describe --exact-match ||:)
-
-    SCALA_BINARY_VER=${SCALA_BINARY_VER-"$scala_binary_version"}
+    scalaTag=$(git describe --tag --exact-match ||:)
 
     if [ -z "$scalaTag" ]
     then
@@ -318,9 +369,8 @@ determineScalaVersion() {
       SCALA_VER_SUFFIX="-$(git rev-parse --short HEAD)-nightly"
       SCALADOC_SOURCE_LINKS_VER=$(git rev-parse HEAD)
 
-      # TODO: publish nightly snapshot using this script
+      # TODO: publish nightly snapshot using this script - currently it's a separate jenkins job still running at EPFL.
       publishToSonatype="no"
-      echo "repo_ref=2.11.x" >> $baseDir/jenkins.properties # for the -dist downstream jobs that build the actual archives
     else
       echo "HEAD is tagged as $scalaTag."
       # borrowed from https://github.com/cloudflare/semver_bash/blob/master/semver.sh
@@ -342,13 +392,11 @@ determineScalaVersion() {
   fi
 
   SCALA_VER="$SCALA_VER_BASE$SCALA_VER_SUFFIX"
+  SCALA_BINARY_VER=$(scalaVerToBinary $SCALA_VER $SCALA_VER_BASE $SCALA_VER_SUFFIX)
+
   echo "version=$SCALA_VER" >> $baseDir/jenkins.properties
   echo "sbtDistVersionOverride=-Dproject.version=$SCALA_VER" >> $baseDir/jenkins.properties
 
-  # We don't override the scala binary version: when running in -nightly + versions.properties versioning mode,
-  # we intend to be a drop-in replacement -- all you need to do is change the Scala version
-  # In order to override this, add 'set every scalaBinaryVersion := "'$SCALA_BINARY_VER'"',
-  # which, when used with pre-release Scala version numbers, will require tweaking at the sbt usage site as well.
   scalaVersionTasks=('set every scalaVersion := "'$SCALA_VER'"')
 
   echo "Building Scala $SCALA_VER."
@@ -356,19 +404,18 @@ determineScalaVersion() {
 
 deriveVersion() {
   update $1 $2 $3 &> /dev/null
-  echo "$(git describe --match=v* | cut -dv -f2)-nightly"
+  echo "$(git describe --tag --match=v* | cut -dv -f2)-nightly"
 }
 
 deriveVersionAnyTag() {
   update $1 $2 $3 &> /dev/null
-  echo "$(git describe | cut -dv -f2)-nightly"
+  echo "$(git describe --tag | cut -dv -f2)-nightly"
 }
 
 # determineScalaVersion must have been called
 deriveModuleVersions() {
-  if [ "$moduleVersioning" == "versions.properties" ]
-  then
-    # use versions.properties as defaults when no version specified on command line
+  if [ "$moduleVersioning" == "versions.properties" ]; then
+    # use versions.properties as defaults when no version specified on the command line
                   XML_VER=${XML_VER-$scala_xml_version_number}
               PARSERS_VER=${PARSERS_VER-$scala_parser_combinators_version_number}
         CONTINUATIONS_VER=${CONTINUATIONS_VER-$scala_continuations_plugin_version_number}
@@ -377,32 +424,30 @@ deriveModuleVersions() {
               PARTEST_VER=${PARTEST_VER-$partest_version_number}
            SCALACHECK_VER=${SCALACHECK_VER-$scalacheck_version_number}
 
-     # If a _VER was not specified, the corresponding _REF will be non-empty by now (as specified, or HEAD)
-                  XML_REF=${XML_REF-"v$XML_VER"}
-              PARSERS_REF=${PARSERS_REF-"v$PARSERS_VER"}
-        CONTINUATIONS_REF=${CONTINUATIONS_REF-"v$CONTINUATIONS_VER"}
-                SWING_REF=${SWING_REF-"v$SWING_VER"}
-     ACTORS_MIGRATION_REF=${ACTORS_MIGRATION_REF-"v$ACTORS_MIGRATION_VER"}
-              PARTEST_REF=${PARTEST_REF-"v$PARTEST_VER"}
-        # PARTEST_IFACE_REF=${PARTEST_IFACE_REF-"v$PARTEST_IFACE_VER"}
-           SCALACHECK_REF=${SCALACHECK_REF-"$SCALACHECK_VER"}
+                  XML_REF="v$XML_VER"
+              PARSERS_REF="v$PARSERS_VER"
+        CONTINUATIONS_REF="v$CONTINUATIONS_VER"
+                SWING_REF="v$SWING_VER"
+     ACTORS_MIGRATION_REF="v$ACTORS_MIGRATION_VER"
+              PARTEST_REF="v$PARTEST_VER"
+           SCALACHECK_REF="$SCALACHECK_VER" # no `v` in their tags
    else
-                 XML_VER=${XML_VER-$(deriveVersion scala scala-xml "$XML_REF")}
-             PARSERS_VER=${PARSERS_VER-$(deriveVersion scala scala-parser-combinators "$PARSERS_REF")}
-       CONTINUATIONS_VER=${CONTINUATIONS_VER-$(deriveVersion scala scala-continuations "$CONTINUATIONS_REF")}
-               SWING_VER=${SWING_VER-$(deriveVersion scala scala-swing "$SWING_REF")}
-    ACTORS_MIGRATION_VER=${ACTORS_MIGRATION_VER-$(deriveVersion scala actors-migration "$ACTORS_MIGRATION_REF")}
-             PARTEST_VER=${PARTEST_VER-$(deriveVersion scala scala-partest "$PARTEST_REF")}
-          SCALACHECK_VER=${SCALACHECK_VER-$(deriveVersionAnyTag rickynils scalacheck "$SCALACHECK_REF")}
-
+    # use HEAD as default when no revision is specified on the command line
                  XML_REF=${XML_REF-"HEAD"}
              PARSERS_REF=${PARSERS_REF-"HEAD"}
        CONTINUATIONS_REF=${CONTINUATIONS_REF-"HEAD"}
                SWING_REF=${SWING_REF-"HEAD"}
     ACTORS_MIGRATION_REF=${ACTORS_MIGRATION_REF-"HEAD"}
              PARTEST_REF=${PARTEST_REF-"HEAD"}
-       # PARTEST_IFACE_REF=${PARTEST_IFACE_REF-"HEAD"}
           SCALACHECK_REF=${SCALACHECK_REF-"HEAD"}
+
+                 XML_VER=$(deriveVersion scala scala-xml "$XML_REF")
+             PARSERS_VER=$(deriveVersion scala scala-parser-combinators "$PARSERS_REF")
+       CONTINUATIONS_VER=$(deriveVersion scala scala-continuations "$CONTINUATIONS_REF")
+               SWING_VER=$(deriveVersion scala scala-swing "$SWING_REF")
+    ACTORS_MIGRATION_VER=$(deriveVersion scala actors-migration "$ACTORS_MIGRATION_REF")
+             PARTEST_VER=$(deriveVersion scala scala-partest "$PARTEST_REF")
+          SCALACHECK_VER=$(deriveVersionAnyTag rickynils scalacheck "$SCALACHECK_REF")
   fi
 
   echo "Module versions (versioning strategy: $moduleVersioning):"
@@ -414,7 +459,29 @@ deriveModuleVersions() {
   echo "SWING            = $SWING_VER at $SWING_REF"
   echo "XML              = $XML_VER at $XML_REF"
 
-  # PARTEST_IFACE_VER=${PARTEST_IFACE_VER-$(deriveVersion scala scala-partest-interface "$PARTEST_IFACE_REF")}
+}
+
+createNetrcFile() {
+  local netrcFile=$HOME/`basename $1`-netrc
+  grep 'host=' $1 | sed 's/host=\(.*\)/machine \1/'          >  $netrcFile
+  grep 'user=' $1 | sed 's/user=\(.*\)/login \1/'            >> $netrcFile
+  grep 'password=' $1 | sed 's/password=\(.*\)/password \1/' >> $netrcFile
+}
+
+removeExistingBuilds() {
+  createNetrcFile "$HOME/.credentials-private-repo"
+  local netrcFile="$HOME/.credentials-private-repo-netrc"
+
+  local storageApiUrl=`echo $releaseTempRepoUrl | sed 's/\(scala-release-temp\)/api\/storage\/\1/'`
+  local scalaLangModules=`curl -s $storageApiUrl/org/scala-lang | jq -r '.children | .[] | "org/scala-lang" + .uri'`
+
+  for module in "org/scalacheck" $scalaLangModules; do
+    local artifacts=`curl -s $storageApiUrl/$module | jq -r ".children | .[] | select(.uri | contains(\"$SCALA_VER\")) | .uri"`
+    for artifact in $artifacts; do
+      echo "Deleting $releaseTempRepoUrl$module$artifact"
+      curl -s --netrc-file $netrcFile -X DELETE $releaseTempRepoUrl$module$artifact
+    done
+  done
 }
 
 constructUpdatedModuleVersions() {
@@ -438,7 +505,6 @@ constructUpdatedModuleVersions() {
   if [ ! -z "$JLINE_VER" ]     ; then updatedModuleVersions=("${updatedModuleVersions[@]}" "-Djline.version=$JLINE_VER"); fi
 
   if [ ! -z "$SCALA_BINARY_VER" ]; then updatedModuleVersions=("${updatedModuleVersions[@]}" "-Dscala.binary.version=$SCALA_BINARY_VER"); fi
-  if [ ! -z "$SCALA_FULL_VER" ]  ; then updatedModuleVersions=("${updatedModuleVersions[@]}" "-Dscala.full.version=$SCALA_FULL_VER"); fi
 }
 
 # build locker (scala + modules) and quick, publishing everything to private-repo
@@ -458,8 +524,8 @@ bootstrap() {
   # in sabbus lingo, the resulting Scala build will be used as starr to build the released Scala compiler
   ant -Dmaven.version.number=$SCALA_VER\
       -Dremote.snapshot.repository=NOPE\
-      -Dremote.release.repository=$privateRepo\
-      -Drepository.credentials.id=$privateCred\
+      -Dremote.release.repository=$releaseTempRepoUrl\
+      -Drepository.credentials.id=$releaseTempRepoCred\
       -Dscalac.args.optimise=-optimise\
       -Ddocs.skip=1\
       -Dlocker.skip=1\
@@ -472,8 +538,6 @@ bootstrap() {
   # publish to our internal repo (so we can resolve the modules in the scala build below)
   # we only need to build the modules necessary to build Scala itself
   # since the version of locker and quick are the same
-  publishTasks=('set credentials += Credentials(Path.userHome / ".credentials-private-repo")' "set every publishTo := Some(\"private-repo\" at \"$privateRepo\")")
-  buildTasks=($publishPrivateTask)
   buildModules
 
   constructUpdatedModuleVersions
@@ -482,7 +546,7 @@ bootstrap() {
 
   echo "### Bootstrapping Scala using locker"
 
-  # # TODO: close all open staging repos so that we can be reaonably sure the only open one we see after publishing below is ours
+  # # TODO: close all open staging repos so that we can be reasonably sure the only open one we see after publishing below is ours
   # # the ant call will create a new one
   #
   # Rebuild Scala with these modules so that all binary versions are consistent.
@@ -493,15 +557,18 @@ bootstrap() {
   cd $baseDir
   rm -rf build/ # must leave everything else in $baseDir for downstream jobs
 
+  # scala.full.version determines the dependency of scala-dist on the continuations plugin,
+  # which is fully cross-versioned (for $SCALA_VER, the version we're releasing)
   ant -Dstarr.version=$SCALA_VER\
-      -Dextra.repo.url=$privateRepo\
+      -Dscala.full.version=$SCALA_VER\
+      -Dextra.repo.url=$releaseTempRepoUrl\
       -Dmaven.version.suffix=$SCALA_VER_SUFFIX\
       ${updatedModuleVersions[@]} \
       -Dupdate.versions=1\
       -Dscaladoc.git.commit=$SCALADOC_SOURCE_LINKS_VER\
       -Dremote.snapshot.repository=NOPE\
-      -Dremote.release.repository=$privateRepo\
-      -Drepository.credentials.id=$privateCred\
+      -Dremote.release.repository=$releaseTempRepoUrl\
+      -Drepository.credentials.id=$releaseTempRepoCred\
       -Dscalac.args.optimise=-optimise\
       $antBuildTask $publishPrivateTask
 
@@ -527,9 +594,7 @@ publishSonatype() {
   # (was hoping we could make everything go to the same staging repo, but it's not timing that causes two staging repos to be opened)
   # NOTE: only publish those for which versions are set
   # test and publish to sonatype, assuming you have ~/.sbt/0.13/sonatype.sbt and ~/.sbt/0.13/plugin/gpg.sbt
-  publishTasks=('set credentials += Credentials(Path.userHome / ".credentials-sonatype")' "set pgpPassphrase := Some(Array.empty)")
-  buildTasks=($publishSonatypeTaskModules)
-  buildModules
+  buildPublishedModules
 
   open=$(st_stagingReposOpen)
   allOpenUrls=$(echo $open | jq  '.repositoryURI' | tr -d \")
@@ -549,15 +614,10 @@ determineScalaVersion
 
 deriveModuleVersions
 
+removeExistingBuilds
+
 bootstrap
 
 if [ "$publishToSonatype" == "yes" ]
   then publishSonatype
-  else # build modules one more time, just to mimic the regular build as much when running as nightly
-    echo "### Rebuilding modules with quick, publishing to $baseDir/ivy/local"
-    buildTasks=(publish-local)
-    # buildScalacheck always uses publishPrivateTask (not buildTasks). we override it to avoid publishing to private-repo.
-    publishPrivateTask="publish-local"
-    forceRebuild="yes"
-    buildModules
 fi
diff --git a/scripts/jobs/integrate/ide b/scripts/jobs/integrate/ide
index 5c1e619..1651ad2 100755
--- a/scripts/jobs/integrate/ide
+++ b/scripts/jobs/integrate/ide
@@ -23,7 +23,7 @@ echo "maven.version.number=$scalaVersion" >> versions.properties
 
 # pass prRepoUrl in, which uber-build passes along to dbuild (in sbt-builds-for-ide)
 # the "-P pr-scala" maven arg accomplishes the same thing for maven (directly used in uber-build)
-BASEDIR="$baseDir" prRepoUrl="$prRepoUrl" MAVEN_ARGS="-P pr-scala"\
+BASEDIR="$baseDir" prRepoUrl="$prRepoUrl" IDE_M2_REPO="$prRepoUrl" MAVEN_ARGS="-P pr-scala"\
   $uberBuildDir/uber-build.sh $uberBuildDir/config/$uberBuildConfig $repo_ref $scalaVersion
 
 # uber-build puts its local repo under target/m2repo
diff --git a/scripts/jobs/integrate/windows b/scripts/jobs/integrate/windows
new file mode 100755
index 0000000..be68a82
--- /dev/null
+++ b/scripts/jobs/integrate/windows
@@ -0,0 +1,15 @@
+#!/bin/bash -x
+
+./pull-binary-libs.sh
+
+export ANT_OPTS="-Dfile.encoding=UTF-8 -server -XX:+AggressiveOpts -XX:+UseParNewGC -Xmx2G -Xss1M -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=128M"
+
+# TODO: don't hardcode this path, which is just where we currently have
+# ant manually installed on jenkins-worker-windows-publish.
+PATH=/cygdrive/c/apache-ant-1.9.6/bin:$PATH
+
+ant \
+  -Dstarr.version=2.11.7 \
+  -Dscalac.args.optimise=-optimise \
+  -Dlocker.skip=1 \
+  test
diff --git a/scripts/jobs/validate/publish-core b/scripts/jobs/validate/publish-core
index 9dff5a3..bb00567 100755
--- a/scripts/jobs/validate/publish-core
+++ b/scripts/jobs/validate/publish-core
@@ -15,17 +15,8 @@ case $prDryRun in
     mkdir -p build/pack ; mkdir -p dists/maven/latest
     ;;
   *)
-    sha=$(git rev-parse HEAD) # TODO: warn if $repo_ref != $sha (we shouldn't do PR validation using symbolic gitrefs)
-    echo "sha/repo_ref == $sha/$repo_ref ?"
-
-    parseScalaProperties build.number
-
-    ./pull-binary-libs.sh
-    # "noyoudont" is there juuuust in case
-    antDeployArgs="-Dmaven.version.suffix=\"-${sha:0:7}-SNAPSHOT\" -Dremote.snapshot.repository=$prRepoUrl -Drepository.credentials.id=pr-scala -Dremote.release.repository=noyoudont"
-
     echo ">>> Getting Scala version number."
-    ant -q $antDeployArgs init
+    $SBT_CMD "setupPublishCore $prRepoUrl" generateBuildCharacterPropertiesFile
     parseScalaProperties buildcharacter.properties # produce maven_version_number
 
     echo ">>> Checking availability of Scala ${maven_version_number} in $prRepoUrl."
@@ -36,7 +27,7 @@ case $prDryRun in
     if $libraryAvailable && $reflectAvailable && $compilerAvailable; then
       echo "Scala core already built!"
     else
-      ant $antDeployArgs $antBuildArgs publish-opt-nodocs
+      $SBT_CMD "setupPublishCore $prRepoUrl" $antBuildArgs publish
     fi
 
     mv buildcharacter.properties jenkins.properties # parsed by the jenkins job
diff --git a/scripts/jobs/validate/test b/scripts/jobs/validate/test
index c1c02c8..bedef2e 100755
--- a/scripts/jobs/validate/test
+++ b/scripts/jobs/validate/test
@@ -11,7 +11,7 @@ case $prDryRun in
     # (in that sense it's locker, since it was built with starr by that upstream job)
     ant -Dstarr.version=$scalaVersion \
        -Dscalac.args.optimise=-optimise \
-       -Dlocker.skip=1 -Dstarr.use.released=1 -Dextra.repo.url=$prRepoUrl \
+       -Dlocker.skip=1 -Dextra.repo.url=$prRepoUrl \
        $testExtraArgs ${testTarget-test.core docs.done}
     ;;
 esac
\ No newline at end of file
diff --git a/scripts/repositories-scala-release b/scripts/repositories-scala-release
deleted file mode 100644
index 00538a0..0000000
--- a/scripts/repositories-scala-release
+++ /dev/null
@@ -1,7 +0,0 @@
-[repositories]
-  plugins: http://dl.bintray.com/sbt/sbt-plugin-releases/, [organisation]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
-  private-repo: http://private-repo.typesafe.com/typesafe/scala-release-temp/
-  typesafe-ivy-releases: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
-  sbt-plugin-releases: http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
-  maven-central
-  local
\ No newline at end of file
diff --git a/spec/01-lexical-syntax.md b/spec/01-lexical-syntax.md
index 945dedf..53c8caf 100644
--- a/spec/01-lexical-syntax.md
+++ b/spec/01-lexical-syntax.md
@@ -59,7 +59,7 @@ idrest   ::=  {letter | digit} [‘_’ op]
 
 There are three ways to form an identifier. First, an identifier can
 start with a letter which can be followed by an arbitrary sequence of
-letters and digits. This may be followed by underscore ‘_’
+letters and digits. This may be followed by underscore `‘_‘`
 characters and another string composed of either letters and digits or
 of operator characters.  Second, an identifier can start with an operator
 character followed by an arbitrary sequence of operator characters.
@@ -90,30 +90,29 @@ syntactic class `id` of lexical identifiers.
 abstract    case        catch       class       def
 do          else        extends     false       final
 finally     for         forSome     if          implicit
-import      lazy        match       new         null
-object      override    package     private     protected
-return      sealed      super       this        throw
-trait       try         true        type        val
-var         while       with        yield
+import      lazy        macro       match       new
+null        object      override    package     private
+protected   return      sealed      super       this
+throw       trait       try         true        type
+val         var         while       with        yield
 _    :    =    =>    <-    <:    <%     >:    #    @
 ```
 
 The Unicode operators `\u21D2` ‘$\Rightarrow$’ and `\u2190` ‘$\leftarrow$’, which have the ASCII
 equivalents `=>` and `<-`, are also reserved.
 
-### Example
-Here are examples of identifiers:
-```scala
-    x         Object        maxIndex   p2p      empty_?
-    +         `yield`       αρετη     _y       dot_product_*
-    __system  _MAX_LEN_
-```
+> Here are examples of identifiers:
+> ```scala
+>     x         Object        maxIndex   p2p      empty_?
+>     +         `yield`       αρετη     _y       dot_product_*
+>     __system  _MAX_LEN_
+> ```
+
+<!-- -->
 
-### Example
-When one needs to access Java identifiers that are reserved words in Scala, use backquote-enclosed strings.
-For instance, the statement `Thread.yield()` is illegal, since
-`yield` is a reserved word in Scala. However, here's a
-work-around: `` Thread.`yield`() ``
+> When one needs to access Java identifiers that are reserved words in Scala, use backquote-enclosed strings.
+> For instance, the statement `Thread.yield()` is illegal, since `yield` is a reserved word in Scala.
+> However, here's a work-around: `` Thread.`yield`() ``
 
 ## Newline Characters
 
@@ -205,99 +204,96 @@ A single new line token is accepted
 - after an [infix operator](06-expressions.html#prefix,-infix,-and-postfix-operations),
   if the first token on the next line can start an expression,
 - in front of a [parameter clause](04-basic-declarations-and-definitions.html#function-declarations-and-definitions), and
-- after an [annotation](11-user-defined-annotations.html#user-defined-annotations).
-
-### Example
-
-The newline tokens between the two lines are not
-treated as statement separators.
-
-```scala
-if (x > 0)
-  x = x - 1
-
-while (x > 0)
-  x = x / 2
-
-for (x <- 1 to 10)
-  println(x)
-
-type
-  IntList = List[Int]
-```
-
-### Example
-
-```scala
-new Iterator[Int]
-{
-  private var x = 0
-  def hasNext = true
-  def next = { x += 1; x }
-}
-```
-
-With an additional newline character, the same code is interpreted as
-an object creation followed by a local block:
-
-```scala
-new Iterator[Int]
-
-{
-  private var x = 0
-  def hasNext = true
-  def next = { x += 1; x }
-}
-```
-
-### Example
-
-```scala
-  x < 0 ||
-  x > 10
-```
-
-With an additional newline character, the same code is interpreted as
-two expressions:
-
-```scala
-  x < 0 ||
-
-  x > 10
-```
-
-### Example
-
-```scala
-def func(x: Int)
-        (y: Int) = x + y
-```
-
-With an additional newline character, the same code is interpreted as
-an abstract function definition and a syntactically illegal statement:
-
-```scala
-def func(x: Int)
-
-        (y: Int) = x + y
-```
-
-### Example
-
-```scala
- at serializable
-protected class Data { ... }
-```
-
-With an additional newline character, the same code is interpreted as
-an attribute and a separate statement (which is syntactically
-illegal).
-
-```scala
- at serializable
-
-protected class Data { ... }
-```
+- after an [annotation](11-annotations.html#user-defined-annotations).
+
+> The newline tokens between the two lines are not
+> treated as statement separators.
+>
+> ```scala
+> if (x > 0)
+>   x = x - 1
+>
+> while (x > 0)
+>   x = x / 2
+>
+> for (x <- 1 to 10)
+>   println(x)
+>
+> type
+>   IntList = List[Int]
+> ```
+
+<!-- -->
+
+> ```scala
+> new Iterator[Int]
+> {
+>   private var x = 0
+>   def hasNext = true
+>   def next = { x += 1; x }
+> }
+> ```
+>
+> With an additional newline character, the same code is interpreted as
+> an object creation followed by a local block:
+>
+> ```scala
+> new Iterator[Int]
+>
+> {
+>   private var x = 0
+>   def hasNext = true
+>   def next = { x += 1; x }
+> }
+> ```
+
+<!-- -->
+
+> ```scala
+>   x < 0 ||
+>   x > 10
+> ```
+>
+> With an additional newline character, the same code is interpreted as
+> two expressions:
+>
+> ```scala
+>   x < 0 ||
+>
+>   x > 10
+> ```
+
+<!-- -->
+
+> ```scala
+> def func(x: Int)
+>         (y: Int) = x + y
+> ```
+>
+> With an additional newline character, the same code is interpreted as
+> an abstract function definition and a syntactically illegal statement:
+>
+> ```scala
+> def func(x: Int)
+>
+>         (y: Int) = x + y
+> ```
+
+<!-- -->
+
+> ```scala
+> @serializable
+> protected class Data { ... }
+> ```
+>
+> With an additional newline character, the same code is interpreted as
+> an attribute and a separate statement (which is syntactically illegal).
+>
+> ```scala
+> @serializable
+>
+> protected class Data { ... }
+> ```
 
 ## Literals
 
@@ -351,11 +347,9 @@ is _pt_. The numeric ranges given by these types are:
 |`Short`         | $-2\^{15}$ to $2\^{15}-1$|
 |`Char`          | $0$ to $2\^{16}-1$       |
 
-### Example
-
-```scala
-0          21          0xFFFFFFFF       -42L
-```
+> ```scala
+> 0          21          0xFFFFFFFF       -42L
+> ```
 
 ### Floating Point Literals
 
@@ -379,20 +373,18 @@ If a floating point literal in a program is followed by a token
 starting with a letter, there must be at least one intervening
 whitespace character between the two tokens.
 
-### Example
+> ```scala
+> 0.0        1e30f      3.14159f      1.0e-100      .1
+> ```
 
-```scala
-0.0        1e30f      3.14159f      1.0e-100      .1
-```
+<!-- -->
 
-### Example
+> The phrase `1.toString` parses as three different tokens:
+> the integer literal `1`, a `.`, and the identifier `toString`.
 
-The phrase `1.toString` parses as three different tokens:
-the integer literal `1`, a `.`, and the identifier `toString`.
+<!-- -->
 
-### Example
-
-`1.` is not a valid floating point literal because the mandatory digit after the `.` is missing.
+> `1.` is not a valid floating point literal because the mandatory digit after the `.` is missing.
 
 ### Boolean Literals
 
@@ -413,11 +405,9 @@ A character literal is a single character enclosed in quotes.
 The character is either a printable unicode character or is described
 by an [escape sequence](#escape-sequences).
 
-### Example
-
-```scala
-'a'    '\u0041'    '\n'    '\t'
-```
+> ```scala
+> 'a'    '\u0041'    '\n'    '\t'
+> ```
 
 Note that `'\u000A'` is _not_ a valid character literal because
 Unicode conversion is done before literal parsing and the Unicode
@@ -439,12 +429,10 @@ contains a double quote character, it must be escaped,
 i.e. `"\""`. The value of a string literal is an instance of
 class `String`.
 
-### Example
-
-```scala
-"Hello,\nWorld!"
-"This string contains a \" character."
-```
+> ```scala
+> "Hello,\nWorld!"
+> "This string contains a \" character."
+> ```
 
 #### Multi-Line String Literals
 
@@ -455,51 +443,49 @@ multiLineChars  ::=  {[‘"’] [‘"’] charNoDoubleQuote} {‘"’}
 
 A multi-line string literal is a sequence of characters enclosed in
 triple quotes `""" ... """`. The sequence of characters is
-arbitrary, except that it may contain three or more consuctive quote characters
+arbitrary, except that it may contain three or more consecutive quote characters
 only at the very end. Characters
 must not necessarily be printable; newlines or other
 control characters are also permitted.  Unicode escapes work as everywhere else, but none
 of the escape sequences [here](#escape-sequences) are interpreted.
 
-### Example
-
-```scala
-  """the present string
-     spans three
-     lines."""
-```
-
-This would produce the string:
-
-```scala
-the present string
-     spans three
-     lines.
-```
-
-The Scala library contains a utility method `stripMargin`
-which can be used to strip leading whitespace from multi-line strings.
-The expression
-
-```scala
- """the present string
-   |spans three
-   |lines.""".stripMargin
-```
-
-evaluates to
-
-```scala
-the present string
-spans three
-lines.
-```
-
-Method `stripMargin` is defined in class
-[scala.collection.immutable.StringLike](http://www.scala-lang.org/api/current/#scala.collection.immutable.StringLike).
-Because there is a predefined
-[implicit conversion](06-expressions.html#implicit-conversions) from `String` to
-`StringLike`, the method is applicable to all strings.
+> ```scala
+>   """the present string
+>      spans three
+>      lines."""
+> ```
+>
+> This would produce the string:
+>
+> ```scala
+> the present string
+>      spans three
+>      lines.
+> ```
+>
+> The Scala library contains a utility method `stripMargin`
+> which can be used to strip leading whitespace from multi-line strings.
+> The expression
+>
+> ```scala
+>  """the present string
+>    |spans three
+>    |lines.""".stripMargin
+> ```
+>
+> evaluates to
+>
+> ```scala
+> the present string
+> spans three
+> lines.
+> ```
+>
+> Method `stripMargin` is defined in class
+> [scala.collection.immutable.StringLike](http://www.scala-lang.org/api/current/#scala.collection.immutable.StringLike).
+> Because there is a predefined
+> [implicit conversion](06-expressions.html#implicit-conversions) from `String` to
+> `StringLike`, the method is applicable to all strings.
 
 ### Escape Sequences
 
@@ -587,15 +573,13 @@ The scanner switches from XML mode to Scala mode if either
 Note that no Scala tokens are constructed in XML mode, and that comments are interpreted
 as text.
 
-### Example
-
-The following value definition uses an XML literal with two embedded
-Scala expressions:
-
-```scala
-val b = <book>
-          <title>The Scala Language Specification</title>
-          <version>{scalaBook.version}</version>
-          <authors>{scalaBook.authors.mkList("", ", ", "")}</authors>
-        </book>
-```
+> The following value definition uses an XML literal with two embedded
+> Scala expressions:
+>
+> ```scala
+> val b = <book>
+>           <title>The Scala Language Specification</title>
+>           <version>{scalaBook.version}</version>
+>           <authors>{scalaBook.authors.mkList("", ", ", "")}</authors>
+>         </book>
+> ```
diff --git a/spec/02-identifiers-names-and-scopes.md b/spec/02-identifiers-names-and-scopes.md
index 62d3269..0a9c5df 100644
--- a/spec/02-identifiers-names-and-scopes.md
+++ b/spec/02-identifiers-names-and-scopes.md
@@ -1,5 +1,5 @@
 ---
-title: Identifiers, Names and Scopes
+title: Identifiers, Names & Scopes
 layout: default
 chapter: 2
 ---
@@ -69,7 +69,7 @@ the member of the type $T$ of $e$ which has the name $x$ in the same
 namespace as the identifier. It is an error if $T$ is not a [value type](03-types.html#value-types).
 The type of $e.x$ is the member type of the referenced entity in $T$.
 
-### Example
+###### Example
 
 Assume the following two definitions of objects named `X` in packages `P` and `Q`.
 
diff --git a/spec/03-types.md b/spec/03-types.md
index 5658e15..94b7916 100644
--- a/spec/03-types.md
+++ b/spec/03-types.md
@@ -147,7 +147,7 @@ A qualified type designator has the form `p.t` where `p` is
 a [path](#paths) and _t_ is a type name. Such a type designator is
 equivalent to the type projection `p.type#t`.
 
-### Example
+###### Example
 
 Some type designators and their expansions are listed below. We assume
 a local type parameter $t$, a value `maintable`
@@ -178,7 +178,8 @@ well-formed if each actual type parameter
 _conforms to its bounds_, i.e. $\sigma L_i <: T_i <: \sigma U_i$ where $\sigma$ is the
 substitution $[ a_1 := T_1 , \ldots , a_n := T_n ]$.
 
-### Example Parameterized Types
+###### Example Parameterized Types
+
 Given the partial type definitions:
 
 ```scala
@@ -202,7 +203,7 @@ F[List, Int]
 G[S, String]
 ```
 
-### Example
+###### Example
 
 Given the [above type definitions](#example-parameterized-types),
 the following types are ill-formed:
@@ -255,10 +256,10 @@ AnnotType  ::=  SimpleType {Annotation}
 ```
 
 An annotated type $T$ $a_1, \ldots, a_n$
-attaches [annotations](11-user-defined-annotations.html#user-defined-annotations)
+attaches [annotations](11-annotations.html#user-defined-annotations)
 $a_1 , \ldots , a_n$ to the type $T$.
 
-### Example
+###### Example
 
 The following type adds the `@suspendable` annotation to the type `String`:
 
@@ -304,7 +305,7 @@ A compound type may also consist of just a refinement
 $\\{ R \\}$ with no preceding component types. Such a type is
 equivalent to `AnyRef` $\\{ R \\}$.
 
-### Example
+###### Example
 
 The following example shows how to declare and use a method which
 a parameter type that contains a refinement with structural declarations.
@@ -500,7 +501,7 @@ or [tuple types](#tuple-types).
 Their expansion is then the expansion in the equivalent parameterized
 type.
 
-### Example
+###### Example
 
 Assume the class definitions
 
@@ -524,7 +525,7 @@ An alternative formulation of the first type above using wildcard syntax is:
 Ref[_ <: java.lang.Number]
 ```
 
-### Example
+###### Example
 
 The type `List[List[_]]` is equivalent to the existential type
 
@@ -532,7 +533,7 @@ The type `List[List[_]]` is equivalent to the existential type
 List[List[t] forSome { type t }] .
 ```
 
-### Example
+###### Example
 
 Assume a covariant type
 
@@ -658,7 +659,7 @@ same name, we model
 
 An overloaded type consisting of type alternatives $T_1 \commadots T_n (n \geq 2)$ is denoted internally $T_1 \overload \ldots \overload T_n$.
 
-### Example
+###### Example
 ```
 def println: Unit
 def println(s: String): Unit = $\ldots$
@@ -676,7 +677,7 @@ println:  => Unit $\overload$
           [A] (A) (A => String) Unit
 ```
 
-### Example
+###### Example
 ```
 def f(x: T): T = $\ldots$
 val f = 0
@@ -834,8 +835,7 @@ transitive relation that satisfies the following conditions.
 - For every type constructor $T$ (with any number of type parameters),
   `scala.Nothing <: $T$ <: scala.Any`.
 
-- For every class type $T$ such that `$T$ <: scala.AnyRef` and not
-  `$T$ <: scala.NotNull` one has `scala.Null <: $T$`.
+- For every class type $T$ such that `$T$ <: scala.AnyRef` one has `scala.Null <: $T$`.
 - A type variable or abstract type $t$ conforms to its upper bound and
   its lower bound conforms to $t$.
 - A class type or parameterized type conforms to any of its base-types.
diff --git a/spec/04-basic-declarations-and-definitions.md b/spec/04-basic-declarations-and-definitions.md
index 65d79dd..7790428 100644
--- a/spec/04-basic-declarations-and-definitions.md
+++ b/spec/04-basic-declarations-and-definitions.md
@@ -1,5 +1,5 @@
 ---
-title: Basic Declarations and Definitions
+title: Basic Declarations & Definitions
 layout: default
 chapter: 4
 ---
@@ -298,7 +298,7 @@ the sequence of variable definitions
 ```ebnf
 Dcl        ::=  ‘type’ {nl} TypeDcl
 TypeDcl    ::=  id [TypeParamClause] [‘>:’ Type] [‘<:’ Type]
-Def        ::=  type {nl} TypeDef
+Def        ::=  ‘type’ {nl} TypeDef
 TypeDef    ::=  id [TypeParamClause] ‘=’ Type
 ```
 
@@ -563,7 +563,7 @@ abstract class Sequence[+A] {
 }
 ```
 
-### Example
+###### Example
 
 ```scala
 abstract class OutputChannel[-A] {
@@ -620,10 +620,14 @@ well as the function body, if it is present.
 
 A value parameter clause $\mathit{ps}$ consists of zero or more formal
 parameter bindings such as `$x$: $T$` or `$x: T = e$`, which bind value
-parameters and associate them with their types. Each value parameter
+parameters and associate them with their types.
+
+### Default Arguments
+
+Each value parameter
 declaration may optionally define a default argument. The default argument
 expression $e$ is type-checked with an expected type $T'$ obtained
-by replacing all occurences of the function's type parameters in $T$ by
+by replacing all occurrences of the function's type parameters in $T$ by
 the undefined type.
 
 For every parameter $p_{i,j}$ with a default argument a method named
@@ -632,13 +636,7 @@ expression. Here, $n$ denotes the parameter's position in the method
 declaration. These methods are parametrized by the type parameter clause
 `[$\mathit{tps}\,$]` and all value parameter clauses
 `($\mathit{ps}_1$)$\ldots$($\mathit{ps}_{i-1}$)` preceding $p_{i,j}$.
-The `$f\$$default$\$$n` methods are inaccessible for
-user programs.
-
-The scope of a formal value parameter name $x$ comprises all subsequent
-parameter clauses, as well as the method return type and the function body, if
-they are given. Both type parameter names and value parameter names must
-be pairwise distinct.
+The `$f\$$default$\$$n` methods are inaccessible for user programs.
 
 ###### Example
 In the method
@@ -657,6 +655,20 @@ def compare$\$$default$\$$1[T]: Int = 0
 def compare$\$$default$\$$2[T](a: T): T = a
 ```
 
+The scope of a formal value parameter name $x$ comprises all subsequent
+parameter clauses, as well as the method return type and the function body, if
+they are given. Both type parameter names and value parameter names must
+be pairwise distinct.
+
+A default value which depends on earlier parameters uses the actual arguments
+if they are provided, not the default arguments.
+
+```scala
+def f(a: Int = 0)(b: Int = a + 1) = b // OK
+// def f(a: Int = 0, b: Int = a + 1)  // "error: not found: value a"
+f(10)()                               // returns 11 (not 1)
+```
+
 ### By-Name Parameters
 
 ```ebnf
diff --git a/spec/05-classes-and-objects.md b/spec/05-classes-and-objects.md
index fd20d6a..69828ec 100644
--- a/spec/05-classes-and-objects.md
+++ b/spec/05-classes-and-objects.md
@@ -1,5 +1,5 @@
 ---
-title: Classes and Objects
+title: Classes & Objects
 layout: default
 chapter: 5
 ---
@@ -368,7 +368,7 @@ it is possible to add new defaults (if the corresponding parameter in the
 superclass does not have a default) or to override the defaults of the
 superclass (otherwise).
 
-### Example
+###### Example
 
 Consider the definitions:
 
@@ -395,6 +395,7 @@ class C extends A with B { type T <: C }
 Let $C$ be a class type. The _inheritance closure_ of $C$ is the
 smallest set $\mathscr{S}$ of types such that
 
+- $C$ is in $\mathscr{S}$.
 - If $T$ is in $\mathscr{S}$, then every type $T'$ which forms syntactically
   a part of $T$ is also in $\mathscr{S}$.
 - If $T$ is a class type in $\mathscr{S}$, then all [parents](#templates)
@@ -498,18 +499,15 @@ the validity and meaning of a modifier are as follows.
 The `private` modifier can be used with any definition or
 declaration in a template.  Such members can be accessed only from
 within the directly enclosing template and its companion module or
-[companion class](#object-definitions). They
-are not inherited by subclasses and they may not override definitions
-in parent classes.
-
-The modifier can be _qualified_ with an identifier $C$ (e.g.
-`private[$C$]`) that must denote a class or package
-enclosing the definition.  Members labeled with such a modifier are
-accessible respectively only from code inside the package $C$ or only
-from code inside the class $C$ and its
+[companion class](#object-definitions).
+
+A `private` modifier can be _qualified_ with an identifier $C$ (e.g.
+`private[$C$]`) that must denote a class or package enclosing the definition.
+Members labeled with such a modifier are accessible respectively only from code
+inside the package $C$ or only from code inside the class $C$ and its
 [companion module](#object-definitions).
 
-An different form of qualification is `private[this]`. A member
+A different form of qualification is `private[this]`. A member
 $M$ marked with this modifier is called _object-protected_; it can be accessed only from within
 the object in which it is defined. That is, a selection $p.M$ is only
 legal if the prefix is `this` or `$O$.this`, for some
@@ -524,20 +522,20 @@ either class-private or object-private, but not if it is marked
 case the member is called _qualified private_.
 
 Class-private or object-private members may not be abstract, and may
-not have `protected` or `override` modifiers.
+not have `protected` or `override` modifiers. They are not inherited
+by subclasses and they may not override definitions in parent classes.
 
-#### `protected`
+### `protected`
 The `protected` modifier applies to class member definitions.
 Protected members of a class can be accessed from within
   - the template of the defining class,
   - all templates that have the defining class as a base class,
   - the companion module of any of those classes.
 
-A `protected` modifier can be qualified with an
-identifier $C$ (e.g.  `protected[$C$]`) that must denote a
-class or package enclosing the definition.  Members labeled with such
-a modifier are also accessible respectively from all code inside the
-package $C$ or from all code inside the class $C$ and its
+A `protected` modifier can be qualified with an identifier $C$ (e.g.
+`protected[$C$]`) that must denote a class or package enclosing the definition.
+Members labeled with such a modifier are also accessible respectively from all
+code inside the package $C$ or from all code inside the class $C$ and its
 [companion module](#object-definitions).
 
 A protected identifier $x$ may be used as a member name in a selection
@@ -557,14 +555,14 @@ legal if the prefix is `this` or `$O$.this`, for some
 class $O$ enclosing the reference. In addition, the restrictions for
 unqualified `protected` apply.
 
-#### `override`
+### `override`
 The `override` modifier applies to class member definitions or declarations.
 It is mandatory for member definitions or declarations that override some
 other concrete member definition in a parent class. If an `override`
 modifier is given, there must be at least one overridden member
 definition or declaration (either concrete or abstract).
 
-#### `abstract override`
+### `abstract override`
 The `override` modifier has an additional significance when
 combined with the `abstract` modifier.  That modifier combination
 is only allowed for value members of traits.
@@ -579,7 +577,7 @@ influence the concept whether a member is concrete or abstract. A
 member is _abstract_ if only a declaration is given for it;
 it is _concrete_ if a full definition is given.
 
-#### `abstract`
+### `abstract`
 The `abstract` modifier is used in class definitions. It is
 redundant for traits, and mandatory for all other classes which have
 incomplete members.  Abstract classes cannot be
@@ -592,7 +590,7 @@ The `abstract` modifier can also be used in conjunction with
 `override` for class member definitions. In that case the
 previous discussion applies.
 
-#### `final`
+### `final`
 The `final` modifier applies to class member definitions and to
 class definitions. A `final` class member definition may not be
 overridden in subclasses. A `final` class may not be inherited by
@@ -604,13 +602,13 @@ an explicit `final` modifier, even if they are defined in a final class or
 object. `final` may not be applied to incomplete members, and it may not be
 combined in one modifier list with `sealed`.
 
-#### `sealed`
+### `sealed`
 The `sealed` modifier applies to class definitions. A
 `sealed` class may not be directly inherited, except if the inheriting
 template is defined in the same source file as the inherited class.
 However, subclasses of a sealed class can be inherited anywhere.
 
-#### `lazy`
+### `lazy`
 The `lazy` modifier applies to value definitions. A `lazy`
 value is initialized the first time it is accessed (which might never
 happen at all). Attempting to access a lazy value during its
@@ -633,7 +631,7 @@ class Outer {
 ```
 
 Here, accesses to the method `f` can appear anywhere within
-`OuterClass`, but not outside it. Accesses to method
+`Outer`, but not outside it. Accesses to method
 `g` can appear anywhere within the package
 `outerpkg.innerpkg`, as would be the case for
 package-private methods in Java. Finally, accesses to method
@@ -699,7 +697,7 @@ Here,
     parameter section is called _polymorphic_, otherwise it is called
     _monomorphic_.
   - $as$ is a possibly empty sequence of
-    [annotations](11-user-defined-annotations.html#user-defined-annotations).
+    [annotations](11-annotations.html#user-defined-annotations).
     If any annotations are given, they apply to the primary constructor of the
     class.
   - $m$ is an [access modifier](#modifiers) such as
@@ -744,7 +742,7 @@ which when applied to parameters conforming to types $\mathit{ps}$
 initializes instances of type `$c$[$\mathit{tps}\,$]` by evaluating the template
 $t$.
 
-### Example
+###### Example – `val` and `var` parameters
 The following example illustrates `val` and `var` parameters of a class `C`:
 
 ```scala
@@ -753,7 +751,7 @@ val c = new C(1, "abc", List())
 c.z = c.y :: c.z
 ```
 
-### Example Private Constructor
+###### Example – Private Constructor
 The following class can be created only from its companion module.
 
 ```scala
@@ -835,7 +833,7 @@ This defines a class `LinkedList` with three constructors.  The
 second constructor constructs an singleton list, while the
 third one constructs a list with a given head and tail.
 
-## Case Classes
+### Case Classes
 
 ```ebnf
 TmplDef  ::=  `case' `class' ClassDef
@@ -966,7 +964,7 @@ This form of extensibility can be excluded by declaring the base class
 directly extend `Expr` must be in the same source file as
 `Expr`.
 
-### Traits
+## Traits
 
 ```ebnf
 TmplDef          ::=  `trait' TraitDef
@@ -990,7 +988,7 @@ it is not statically known at the time the trait is defined.
 If $D$ is not a trait, then its actual supertype is simply its
 least proper supertype (which is statically known).
 
-### Example
+###### Example
 The following trait defines the property
 of being comparable to objects of some type. It contains an abstract
 method `<` and default implementations of the other
diff --git a/spec/06-expressions.md b/spec/06-expressions.md
index 133ec3c..c24ca01 100644
--- a/spec/06-expressions.md
+++ b/spec/06-expressions.md
@@ -148,10 +148,6 @@ The selection $e.x$ is evaluated by first evaluating the qualifier
 expression $e$, which yields an object $r$, say. The selection's
 result is then the member of $r$ that is either defined by $m$ or defined
 by a definition overriding $m$.
-If that member has a type which
-conforms to `scala.NotNull`, the member's value must be initialized
-to a value different from `null`, otherwise a `scala.UnitializedError`
-is thrown.
 
 ## This and Super
 
@@ -205,7 +201,7 @@ to the type or method of $x$ in the parent trait of $C$ whose simple
 name is $T$. That member must be uniquely defined. If it is a method,
 it must be concrete.
 
-### Example
+###### Example
 Consider the following class definitions
 
 ```scala
@@ -516,7 +512,7 @@ In the latter case, the concrete self type of the expression is the
 compound type `$T$ with $x$.type`.
 
 The expression is evaluated by creating a fresh
-object of type $T$ which is is initialized by evaluating $c$. The
+object of type $T$ which is initialized by evaluating $c$. The
 type of the expression is $T$.
 
 A general instance creation expression is of the form
@@ -778,7 +774,7 @@ Expr1              ::=  PostfixExpr `:' Annotation {Annotation}
 ```
 
 An annotated expression `$e$: @$a_1$ $\ldots$ @$a_n$`
-attaches [annotations](11-user-defined-annotations.html#user-defined-annotations) $a_1 , \ldots , a_n$ to the
+attaches [annotations](11-annotations.html#user-defined-annotations) $a_1 , \ldots , a_n$ to the
 expression $e$.
 
 ## Assignments
@@ -815,7 +811,7 @@ Here are some assignment expressions and their equivalent expansions.
 |`x.f(i) = e`              | `x.f.update(i, e)`   |
 |`x.f(i, j) = e`           | `x.f.update(i, j, e)`|
 
-### Example Imperative Matrix Multiplication
+###### Example Imperative Matrix Multiplication
 
 Here is the usual imperative code for matrix multiplication.
 
@@ -1221,9 +1217,9 @@ In that case, a fresh name for the parameter is chosen arbitrarily.
 
 A named parameter of an anonymous function may be optionally preceded
 by an `implicit` modifier. In that case the parameter is
-labeled [`implicit`](07-implicit-parameters-and-views.html#implicit-parameters-and-views); however the
+labeled [`implicit`](07-implicits.html#implicit-parameters-and-views); however the
 parameter section itself does not count as an implicit parameter
-section in the sense defined [here](07-implicit-parameters-and-views.html#implicit-parameters). Hence, arguments to
+section in the sense defined [here](07-implicits.html#implicit-parameters). Hence, arguments to
 anonymous functions always have to be given explicitly.
 
 ###### Example
@@ -1341,11 +1337,11 @@ available implicit conversions are given in the next two sub-sections.
 
 We say, a type $T$ is _compatible_ to a type $U$ if $T$ weakly conforms
 to $U$ after applying [eta-expansion](#eta-expansion) and
-[view applications](07-implicit-parameters-and-views.html#views).
+[view applications](07-implicits.html#views).
 
 ### Value Conversions
 
-The following five implicit conversions can be applied to an
+The following seven implicit conversions can be applied to an
 expression $e$ which has some value type $T$ and which is type-checked with
 some expected type $\mathit{pt}$.
 
@@ -1389,7 +1385,7 @@ term `{ $e$; () }`.
 ###### View Application
 If none of the previous conversions applies, and $e$'s type
 does not conform to the expected type $\mathit{pt}$, it is attempted to convert
-$e$ to the expected type with a [view](07-implicit-parameters-and-views.html#views).
+$e$ to the expected type with a [view](07-implicits.html#views).
 
 ###### Dynamic Member Selection
 If none of the previous conversions applies, and $e$ is a prefix
@@ -1408,7 +1404,7 @@ type $T$ by evaluating the expression to which $m$ is bound.
 
 ###### Implicit Application
 If the method takes only implicit parameters, implicit
-arguments are passed following the rules [here](07-implicit-parameters-and-views.html#implicit-parameters).
+arguments are passed following the rules [here](07-implicits.html#implicit-parameters).
 
 ###### Eta Expansion
 Otherwise, if the method is not a constructor,
@@ -1740,7 +1736,7 @@ so `scala.Any` is the type inferred for `a`.
 _Eta-expansion_ converts an expression of method type to an
 equivalent expression of function type. It proceeds in two steps.
 
-First, one identifes the maximal sub-expressions of $e$; let's
+First, one identifies the maximal sub-expressions of $e$; let's
 say these are $e_1 , \ldots , e_m$. For each of these, one creates a
 fresh name $x_i$. Let $e'$ be the expression resulting from
 replacing every maximal subexpression $e_i$ in $e$ by the
diff --git a/spec/07-implicit-parameters-and-views.md b/spec/07-implicit-parameters-and-views.md
deleted file mode 100644
index 27a50cf..0000000
--- a/spec/07-implicit-parameters-and-views.md
+++ /dev/null
@@ -1,432 +0,0 @@
----
-title: Implicit Parameters and Views
-layout: default
-chapter: 7
----
-
-# Implicit Parameters and Views
-
-## The Implicit Modifier
-
-```ebnf
-LocalModifier  ::= ‘implicit’
-ParamClauses   ::= {ParamClause} [nl] ‘(’ ‘implicit’ Params ‘)’
-```
-
-Template members and parameters labeled with an `implicit`
-modifier can be passed to [implicit parameters](#implicit-parameters)
-and can be used as implicit conversions called [views](#views).
-The `implicit` modifier is illegal for all
-type members, as well as for [top-level objects](09-top-level-definitions.html#packagings).
-
-### Example Monoid
-The following code defines an abstract class of monoids and
-two concrete implementations, `StringMonoid` and
-`IntMonoid`. The two implementations are marked implicit.
-
-```scala
-abstract class Monoid[A] extends SemiGroup[A] {
-  def unit: A
-  def add(x: A, y: A): A
-}
-object Monoids {
-  implicit object stringMonoid extends Monoid[String] {
-    def add(x: String, y: String): String = x.concat(y)
-    def unit: String = ""
-  }
-  implicit object intMonoid extends Monoid[Int] {
-    def add(x: Int, y: Int): Int = x + y
-    def unit: Int = 0
-  }
-}
-```
-
-## Implicit Parameters
-
-An implicit parameter list
-`(implicit $p_1$,$\ldots$,$p_n$)` of a method marks the parameters $p_1 , \ldots , p_n$ as
-implicit. A method or constructor can have only one implicit parameter
-list, and it must be the last parameter list given.
-
-A method with implicit parameters can be applied to arguments just
-like a normal method. In this case the `implicit` label has no
-effect. However, if such a method misses arguments for its implicit
-parameters, such arguments will be automatically provided.
-
-The actual arguments that are eligible to be passed to an implicit
-parameter of type $T$ fall into two categories. First, eligible are
-all identifiers $x$ that can be accessed at the point of the method
-call without a prefix and that denote an
-[implicit definition](#the-implicit-modifier)
-or an implicit parameter.  An eligible
-identifier may thus be a local name, or a member of an enclosing
-template, or it may be have been made accessible without a prefix
-through an [import clause](04-basic-declarations-and-definitions.html#import-clauses). If there are no eligible
-identifiers under this rule, then, second, eligible are also all
-`implicit` members of some object that belongs to the implicit
-scope of the implicit parameter's type, $T$.
-
-The _implicit scope_ of a type $T$ consists of all [companion modules](05-classes-and-objects.html#object-definitions) of classes that are associated with the implicit parameter's type.
-Here, we say a class $C$ is _associated_ with a type $T$ if it is a [base class](05-classes-and-objects.html#class-linearization) of some part of $T$.
-
-The _parts_ of a type $T$ are:
-
-- if $T$ is a compound type `$T_1$ with $\ldots$ with $T_n$`,
-  the union of the parts of $T_1 , \ldots , T_n$, as well as $T$ itself;
-- if $T$ is a parameterized type `$S$[$T_1 , \ldots , T_n$]`,
-  the union of the parts of $S$ and $T_1 , \ldots , T_n$;
-- if $T$ is a singleton type `$p$.type`,
-  the parts of the type of $p$;
-- if $T$ is a type projection `$S$#$U$`,
-  the parts of $S$ as well as $T$ itself;
-- if $T$ is a type alias, the parts of its expansion;
-- if $T$ is an abstract type, the parts of its upper bound;
-- if $T$ denotes an implicit conversion to a type with a method with argument types $T_1 , \ldots , T_n$ and result type $U$,
-  the union of the parts of $T_1 , \ldots , T_n$ and $U$;
-- the parts of quantified (existential or univeral) and annotated types are defined as the parts of the underlying types (e.g., the parts of `T forSome { ... }` are the parts of `T`);
-- in all other cases, just $T$ itself.
-
-Note that packages are internally represented as classes with companion modules to hold the package members.
-Thus, implicits defined in a package object are part of the implicit scope of a type prefixed by that package.
-
-If there are several eligible arguments which match the implicit
-parameter's type, a most specific one will be chosen using the rules
-of static [overloading resolution](06-expressions.html#overloading-resolution).
-If the parameter has a default argument and no implicit argument can
-be found the default argument is used.
-
-###### Example
-Assuming the classes from the [`Monoid` example](#example-monoid), here is a
-method which computes the sum of a list of elements using the
-monoid's `add` and `unit` operations.
-
-```scala
-def sum[A](xs: List[A])(implicit m: Monoid[A]): A =
-  if (xs.isEmpty) m.unit
-  else m.add(xs.head, sum(xs.tail))
-```
-
-The monoid in question is marked as an implicit parameter, and can therefore
-be inferred based on the type of the list.
-Consider for instance the call `sum(List(1, 2, 3))`
-in a context where `stringMonoid` and `intMonoid`
-are visible.  We know that the formal type parameter `a` of
-`sum` needs to be instantiated to `Int`. The only
-eligible object which matches the implicit formal parameter type
-`Monoid[Int]` is `intMonoid` so this object will
-be passed as implicit parameter.
-
-This discussion also shows that implicit parameters are inferred after
-any type arguments are [inferred](06-expressions.html#local-type-inference).
-
-Implicit methods can themselves have implicit parameters. An example
-is the following method from module `scala.List`, which injects
-lists into the `scala.Ordered` class, provided the element
-type of the list is also convertible to this type.
-
-```scala
-implicit def list2ordered[A](x: List[A])
-  (implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] =
-  ...
-```
-
-Assume in addition a method
-
-```scala
-implicit def int2ordered(x: Int): Ordered[Int]
-```
-
-that injects integers into the `Ordered` class.  We can now
-define a `sort` method over ordered lists:
-
-```scala
-def sort[A](xs: List[A])(implicit a2ordered: A => Ordered[A]) = ...
-```
-
-We can apply `sort` to a list of lists of integers
-`yss: List[List[Int]]`
-as follows:
-
-```scala
-sort(yss)
-```
-
-The call above will be completed by passing two nested implicit arguments:
-
-```scala
-sort(yss)(xs: List[Int] => list2ordered[Int](xs)(int2ordered)) .
-```
-
-The possibility of passing implicit arguments to implicit arguments
-raises the possibility of an infinite recursion.  For instance, one
-might try to define the following method, which injects _every_ type into the
-`Ordered` class:
-
-```scala
-implicit def magic[A](x: A)(implicit a2ordered: A => Ordered[A]): Ordered[A] =
-  a2ordered(x)
-```
-
-Now, if one tried to apply
-`sort` to an argument `arg` of a type that did not have
-another injection into the `Ordered` class, one would obtain an infinite
-expansion:
-
-```scala
-sort(arg)(x => magic(x)(x => magic(x)(x => ... )))
-```
-
-To prevent such infinite expansions, the compiler keeps track of
-a stack of “open implicit types” for which implicit arguments are currently being
-searched. Whenever an implicit argument for type $T$ is searched, the
-“core type” of $T$ is added to the stack. Here, the _core type_
-of $T$ is $T$ with aliases expanded, top-level type [annotations](11-user-defined-annotations.html#user-defined-annotations) and
-[refinements](03-types.html#compound-types) removed, and occurrences
-of top-level existentially bound variables replaced by their upper
-bounds. The core type is removed from the stack once the search for
-the implicit argument either definitely fails or succeeds. Everytime a
-core type is added to the stack, it is checked that this type does not
-dominate any of the other types in the set.
-
-Here, a core type $T$ _dominates_ a type $U$ if $T$ is
-[equivalent](03-types.html#equivalence)
-to $U$, or if the top-level type constructors of $T$ and $U$ have a
-common element and $T$ is more complex than $U$.
-
-The set of _top-level type constructors_ $\mathit{ttcs}(T)$ of a type $T$ depends on the form of
-the type:
-
-- For a type designator,  $\mathit{ttcs}(p.c) ~=~ \{c\}$;
-- For a parameterized type,  $\mathit{ttcs}(p.c[\mathit{targs}]) ~=~ \{c\}$;
-- For a singleton type,  $\mathit{ttcs}(p.type) ~=~ \mathit{ttcs}(T)$, provided $p$ has type $T$;
-- For a compound type, `$\mathit{ttcs}(T_1$ with $\ldots$ with $T_n)$` $~=~ \mathit{ttcs}(T_1) \cup \ldots \cup \mathit{ttcs}(T_n)$.
-
-The _complexity_ $\operatorname{complexity}(T)$ of a core type is an integer which also depends on the form of
-the type:
-
-- For a type designator, $\operatorname{complexity}(p.c) ~=~ 1 + \operatorname{complexity}(p)$
-- For a parameterized type, $\operatorname{complexity}(p.c[\mathit{targs}]) ~=~ 1 + \Sigma \operatorname{complexity}(\mathit{targs})$
-- For a singleton type denoting a package $p$, $\operatorname{complexity}(p.type) ~=~ 0$
-- For any other singleton type, $\operatorname{complexity}(p.type) ~=~ 1 + \operatorname{complexity}(T)$, provided $p$ has type $T$;
-- For a compound type, `$\operatorname{complexity}(T_1$ with $\ldots$ with $T_n)$` $= \Sigma\operatorname{complexity}(T_i)$
-
-###### Example
-When typing `sort(xs)` for some list `xs` of type `List[List[List[Int]]]`,
-the sequence of types for
-which implicit arguments are searched is
-
-```scala
-List[List[Int]] => Ordered[List[List[Int]]],
-List[Int] => Ordered[List[Int]]
-Int => Ordered[Int]
-```
-
-All types share the common type constructor `scala.Function1`,
-but the complexity of the each new type is lower than the complexity of the previous types.
-Hence, the code typechecks.
-
-###### Example
-Let `ys` be a list of some type which cannot be converted
-to `Ordered`. For instance:
-
-```scala
-val ys = List(new IllegalArgumentException, new ClassCastException, new Error)
-```
-
-Assume that the definition of `magic` above is in scope. Then the sequence
-of types for which implicit arguments are searched is
-
-```scala
-Throwable => Ordered[Throwable],
-Throwable => Ordered[Throwable],
-...
-```
-
-Since the second type in the sequence is equal to the first, the compiler
-will issue an error signalling a divergent implicit expansion.
-
-## Views
-
-Implicit parameters and methods can also define implicit conversions
-called views. A _view_ from type $S$ to type $T$ is
-defined by an implicit value which has function type
-`$S$=>$T$` or `(=>$S$)=>$T$` or by a method convertible to a value of that
-type.
-
-Views are applied in three situations:
-
-1.  If an expression $e$ is of type $T$, and $T$ does not conform to the
-    expression's expected type $\mathit{pt}$. In this case an implicit $v$ is
-    searched which is applicable to $e$ and whose result type conforms to
-    $\mathit{pt}$.  The search proceeds as in the case of implicit parameters,
-    where the implicit scope is the one of `$T$ => $\mathit{pt}$`. If
-    such a view is found, the expression $e$ is converted to
-    `$v$($e$)`.
-1.  In a selection $e.m$ with $e$ of type $T$, if the selector $m$ does
-    not denote an accessible member of $T$.  In this case, a view $v$ is searched
-    which is applicable to $e$ and whose result contains a member named
-    $m$.  The search proceeds as in the case of implicit parameters, where
-    the implicit scope is the one of $T$.  If such a view is found, the
-    selection $e.m$ is converted to `$v$($e$).$m$`.
-1.  In a selection $e.m(\mathit{args})$ with $e$ of type $T$, if the selector
-    $m$ denotes some member(s) of $T$, but none of these members is applicable to the arguments
-    $\mathit{args}$. In this case a view $v$ is searched which is applicable to $e$
-    and whose result contains a method $m$ which is applicable to $\mathit{args}$.
-    The search proceeds as in the case of implicit parameters, where
-    the implicit scope is the one of $T$.  If such a view is found, the
-    selection $e.m$ is converted to `$v$($e$).$m(\mathit{args})$`.
-
-The implicit view, if it is found, can accept is argument $e$ as a
-call-by-value or as a call-by-name parameter. However, call-by-value
-implicits take precedence over call-by-name implicits.
-
-As for implicit parameters, overloading resolution is applied
-if there are several possible candidates (of either the call-by-value
-or the call-by-name category).
-
-### Example Ordered
-Class `scala.Ordered[A]` contains a method
-
-```scala
-  def <= [B >: A](that: B)(implicit b2ordered: B => Ordered[B]): Boolean .
-```
-
-Assume two lists `xs` and `ys` of type `List[Int]`
-and assume that the `list2ordered` and `int2ordered`
-methods defined [here](#implicit-parameters) are in scope.
-Then the operation
-
-```scala
-  xs <= ys
-```
-
-is legal, and is expanded to:
-
-```scala
-  list2ordered(xs)(int2ordered).<=
-    (ys)
-    (xs => list2ordered(xs)(int2ordered))
-```
-
-The first application of `list2ordered` converts the list
-`xs` to an instance of class `Ordered`, whereas the second
-occurrence is part of an implicit parameter passed to the `<=`
-method.
-
-## Context Bounds and View Bounds
-
-```ebnf
-  TypeParam ::= (id | ‘_’) [TypeParamClause] [‘>:’ Type] [‘<:’ Type]
-                {‘<%’ Type} {‘:’ Type}
-```
-
-A type parameter $A$ of a method or non-trait class may have one or more view
-bounds `$A$ <% $T$`. In this case the type parameter may be
-instantiated to any type $S$ which is convertible by application of a
-view to the bound $T$.
-
-A type parameter $A$ of a method or non-trait class may also have one
-or more context bounds `$A$ : $T$`. In this case the type parameter may be
-instantiated to any type $S$ for which _evidence_ exists at the
-instantiation point that $S$ satisfies the bound $T$. Such evidence
-consists of an implicit value with type $T[S]$.
-
-A method or class containing type parameters with view or context bounds is treated as being
-equivalent to a method with implicit parameters. Consider first the case of a
-single parameter with view and/or context bounds such as:
-
-```scala
-def $f$[$A$ <% $T_1$ ... <% $T_m$ : $U_1$ : $U_n$]($\mathit{ps}$): $R$ = ...
-```
-
-Then the method definition above is expanded to
-
-```scala
-def $f$[$A$]($\mathit{ps}$)(implicit $v_1$: $A$ => $T_1$, ..., $v_m$: $A$ => $T_m$,
-                       $w_1$: $U_1$[$A$], ..., $w_n$: $U_n$[$A$]): $R$ = ...
-```
-
-where the $v_i$ and $w_j$ are fresh names for the newly introduced implicit parameters. These
-parameters are called _evidence parameters_.
-
-If a class or method has several view- or context-bounded type parameters, each
-such type parameter is expanded into evidence parameters in the order
-they appear and all the resulting evidence parameters are concatenated
-in one implicit parameter section.  Since traits do not take
-constructor parameters, this translation does not work for them.
-Consequently, type-parameters in traits may not be view- or context-bounded.
-Also, a method or class with view- or context bounds may not define any
-additional implicit parameters.
-
-###### Example
-The `<=` method from the [`Ordered` example](#example-ordered) can be declared
-more concisely as follows:
-
-```scala
-def <= [B >: A <% Ordered[B]](that: B): Boolean
-```
-
-## Manifests
-
-Manifests are type descriptors that can be automatically generated by
-the Scala compiler as arguments to implicit parameters. The Scala
-standard library contains a hierarchy of four manifest classes,
-with `OptManifest`
-at the top. Their signatures follow the outline below.
-
-```scala
-trait OptManifest[+T]
-object NoManifest extends OptManifest[Nothing]
-trait ClassManifest[T] extends OptManifest[T]
-trait Manifest[T] extends ClassManifest[T]
-```
-
-If an implicit parameter of a method or constructor is of a subtype $M[T]$ of
-class `OptManifest[T]`, _a manifest is determined for $M[S]$_,
-according to the following rules.
-
-First if there is already an implicit argument that matches $M[T]$, this
-argument is selected.
-
-Otherwise, let $\mathit{Mobj}$ be the companion object `scala.reflect.Manifest`
-if $M$ is trait `Manifest`, or be
-the companion object `scala.reflect.ClassManifest` otherwise. Let $M'$ be the trait
-`Manifest` if $M$ is trait `Manifest`, or be the trait `OptManifest` otherwise.
-Then the following rules apply.
-
-1.  If $T$ is a value class or one of the classes `Any`, `AnyVal`, `Object`,
-    `Null`, or `Nothing`,
-    a manifest for it is generated by selecting
-    the corresponding manifest value `Manifest.$T$`, which exists in the
-    `Manifest` module.
-1.  If $T$ is an instance of `Array[$S$]`, a manifest is generated
-    with the invocation `$\mathit{Mobj}$.arrayType[S](m)`, where $m$ is the manifest
-    determined for $M[S]$.
-1.  If $T$ is some other class type $S$#$C[U_1, \ldots, U_n]$ where the prefix
-    type $S$ cannot be statically determined from the class $C$,
-    a manifest is generated with the invocation `$\mathit{Mobj}$.classType[T]($m_0$, classOf[T], $ms$)`
-    where $m_0$ is the manifest determined for $M'[S]$ and $ms$ are the
-    manifests determined for $M'[U_1], \ldots, M'[U_n]$.
-1.  If $T$ is some other class type with type arguments $U_1 , \ldots , U_n$,
-    a manifest is generated
-    with the invocation `$\mathit{Mobj}$.classType[T](classOf[T], $ms$)`
-    where $ms$ are the
-    manifests determined for $M'[U_1] , \ldots , M'[U_n]$.
-1.  If $T$ is a singleton type `$p$.type`, a manifest is generated with
-    the invocation `$\mathit{Mobj}$.singleType[T]($p$)`
-1.  If $T$ is a refined type $T' \{ R \}$, a manifest is generated for $T'$.
-    (That is, refinements are never reflected in manifests).
-1.  If $T$ is an intersection type
-    `$T_1$ with $, \ldots ,$ with $T_n$`
-    where $n > 1$, the result depends on whether a full manifest is
-    to be determined or not.
-    If $M$ is trait `Manifest`, then
-    a manifest is generated with the invocation
-    `Manifest.intersectionType[T]($ms$)` where $ms$ are the manifests
-    determined for $M[T_1] , \ldots , M[T_n]$.
-    Otherwise, if $M$ is trait `ClassManifest`,
-    then a manifest is generated for the [intersection dominator](03-types.html#type-erasure)
-    of the types $T_1 , \ldots , T_n$.
-1.  If $T$ is some other type, then if $M$ is trait `OptManifest`,
-    a manifest is generated from the designator `scala.reflect.NoManifest`.
-    If $M$ is a type different from `OptManifest`, a static error results.
diff --git a/spec/07-implicits.md b/spec/07-implicits.md
new file mode 100644
index 0000000..28f6dfe
--- /dev/null
+++ b/spec/07-implicits.md
@@ -0,0 +1,442 @@
+---
+title: Implicits
+layout: default
+chapter: 7
+---
+
+# Implicits
+
+## The Implicit Modifier
+
+```ebnf
+LocalModifier  ::= ‘implicit’
+ParamClauses   ::= {ParamClause} [nl] ‘(’ ‘implicit’ Params ‘)’
+```
+
+Template members and parameters labeled with an `implicit`
+modifier can be passed to [implicit parameters](#implicit-parameters)
+and can be used as implicit conversions called [views](#views).
+The `implicit` modifier is illegal for all
+type members, as well as for [top-level objects](09-top-level-definitions.html#packagings).
+
+###### Example Monoid
+
+The following code defines an abstract class of monoids and
+two concrete implementations, `StringMonoid` and
+`IntMonoid`. The two implementations are marked implicit.
+
+```scala
+abstract class Monoid[A] extends SemiGroup[A] {
+  def unit: A
+  def add(x: A, y: A): A
+}
+object Monoids {
+  implicit object stringMonoid extends Monoid[String] {
+    def add(x: String, y: String): String = x.concat(y)
+    def unit: String = ""
+  }
+  implicit object intMonoid extends Monoid[Int] {
+    def add(x: Int, y: Int): Int = x + y
+    def unit: Int = 0
+  }
+}
+```
+
+## Implicit Parameters
+
+An implicit parameter list
+`(implicit $p_1$,$\ldots$,$p_n$)` of a method marks the parameters $p_1 , \ldots , p_n$ as
+implicit. A method or constructor can have only one implicit parameter
+list, and it must be the last parameter list given.
+
+A method with implicit parameters can be applied to arguments just
+like a normal method. In this case the `implicit` label has no
+effect. However, if such a method misses arguments for its implicit
+parameters, such arguments will be automatically provided.
+
+The actual arguments that are eligible to be passed to an implicit
+parameter of type $T$ fall into two categories. First, eligible are
+all identifiers $x$ that can be accessed at the point of the method
+call without a prefix and that denote an
+[implicit definition](#the-implicit-modifier)
+or an implicit parameter.  An eligible
+identifier may thus be a local name, or a member of an enclosing
+template, or it may be have been made accessible without a prefix
+through an [import clause](04-basic-declarations-and-definitions.html#import-clauses). If there are no eligible
+identifiers under this rule, then, second, eligible are also all
+`implicit` members of some object that belongs to the implicit
+scope of the implicit parameter's type, $T$.
+
+The _implicit scope_ of a type $T$ consists of all [companion modules](05-classes-and-objects.html#object-definitions) of classes that are associated with the implicit parameter's type.
+Here, we say a class $C$ is _associated_ with a type $T$ if it is a [base class](05-classes-and-objects.html#class-linearization) of some part of $T$.
+
+The _parts_ of a type $T$ are:
+
+- if $T$ is a compound type `$T_1$ with $\ldots$ with $T_n$`,
+  the union of the parts of $T_1 , \ldots , T_n$, as well as $T$ itself;
+- if $T$ is a parameterized type `$S$[$T_1 , \ldots , T_n$]`,
+  the union of the parts of $S$ and $T_1 , \ldots , T_n$;
+- if $T$ is a singleton type `$p$.type`,
+  the parts of the type of $p$;
+- if $T$ is a type projection `$S$#$U$`,
+  the parts of $S$ as well as $T$ itself;
+- if $T$ is a type alias, the parts of its expansion;
+- if $T$ is an abstract type, the parts of its upper bound;
+- if $T$ denotes an implicit conversion to a type with a method with argument types $T_1 , \ldots , T_n$ and result type $U$,
+  the union of the parts of $T_1 , \ldots , T_n$ and $U$;
+- the parts of quantified (existential or universal) and annotated types are defined as the parts of the underlying types (e.g., the parts of `T forSome { ... }` are the parts of `T`);
+- in all other cases, just $T$ itself.
+
+Note that packages are internally represented as classes with companion modules to hold the package members.
+Thus, implicits defined in a package object are part of the implicit scope of a type prefixed by that package.
+
+If there are several eligible arguments which match the implicit
+parameter's type, a most specific one will be chosen using the rules
+of static [overloading resolution](06-expressions.html#overloading-resolution).
+If the parameter has a default argument and no implicit argument can
+be found the default argument is used.
+
+###### Example
+Assuming the classes from the [`Monoid` example](#example-monoid), here is a
+method which computes the sum of a list of elements using the
+monoid's `add` and `unit` operations.
+
+```scala
+def sum[A](xs: List[A])(implicit m: Monoid[A]): A =
+  if (xs.isEmpty) m.unit
+  else m.add(xs.head, sum(xs.tail))
+```
+
+The monoid in question is marked as an implicit parameter, and can therefore
+be inferred based on the type of the list.
+Consider for instance the call `sum(List(1, 2, 3))`
+in a context where `stringMonoid` and `intMonoid`
+are visible.  We know that the formal type parameter `a` of
+`sum` needs to be instantiated to `Int`. The only
+eligible object which matches the implicit formal parameter type
+`Monoid[Int]` is `intMonoid` so this object will
+be passed as implicit parameter.
+
+This discussion also shows that implicit parameters are inferred after
+any type arguments are [inferred](06-expressions.html#local-type-inference).
+
+Implicit methods can themselves have implicit parameters. An example
+is the following method from module `scala.List`, which injects
+lists into the `scala.Ordered` class, provided the element
+type of the list is also convertible to this type.
+
+```scala
+implicit def list2ordered[A](x: List[A])
+  (implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] =
+  ...
+```
+
+Assume in addition a method
+
+```scala
+implicit def int2ordered(x: Int): Ordered[Int]
+```
+
+that injects integers into the `Ordered` class.  We can now
+define a `sort` method over ordered lists:
+
+```scala
+def sort[A](xs: List[A])(implicit a2ordered: A => Ordered[A]) = ...
+```
+
+We can apply `sort` to a list of lists of integers
+`yss: List[List[Int]]`
+as follows:
+
+```scala
+sort(yss)
+```
+
+The call above will be completed by passing two nested implicit arguments:
+
+```scala
+sort(yss)(xs: List[Int] => list2ordered[Int](xs)(int2ordered)) .
+```
+
+The possibility of passing implicit arguments to implicit arguments
+raises the possibility of an infinite recursion.  For instance, one
+might try to define the following method, which injects _every_ type into the
+`Ordered` class:
+
+```scala
+implicit def magic[A](x: A)(implicit a2ordered: A => Ordered[A]): Ordered[A] =
+  a2ordered(x)
+```
+
+Now, if one tried to apply
+`sort` to an argument `arg` of a type that did not have
+another injection into the `Ordered` class, one would obtain an infinite
+expansion:
+
+```scala
+sort(arg)(x => magic(x)(x => magic(x)(x => ... )))
+```
+
+To prevent such infinite expansions, the compiler keeps track of
+a stack of “open implicit types” for which implicit arguments are currently being
+searched. Whenever an implicit argument for type $T$ is searched, the
+“core type” of $T$ is added to the stack. Here, the _core type_
+of $T$ is $T$ with aliases expanded, top-level type [annotations](11-annotations.html#user-defined-annotations) and
+[refinements](03-types.html#compound-types) removed, and occurrences
+of top-level existentially bound variables replaced by their upper
+bounds. The core type is removed from the stack once the search for
+the implicit argument either definitely fails or succeeds. Everytime a
+core type is added to the stack, it is checked that this type does not
+dominate any of the other types in the set.
+
+Here, a core type $T$ _dominates_ a type $U$ if $T$ is
+[equivalent](03-types.html#equivalence)
+to $U$, or if the top-level type constructors of $T$ and $U$ have a
+common element and $T$ is more complex than $U$.
+
+The set of _top-level type constructors_ $\mathit{ttcs}(T)$ of a type $T$ depends on the form of
+the type:
+
+- For a type designator,  $\mathit{ttcs}(p.c) ~=~ \{c\}$;
+- For a parameterized type,  $\mathit{ttcs}(p.c[\mathit{targs}]) ~=~ \{c\}$;
+- For a singleton type,  $\mathit{ttcs}(p.type) ~=~ \mathit{ttcs}(T)$, provided $p$ has type $T$;
+- For a compound type, `$\mathit{ttcs}(T_1$ with $\ldots$ with $T_n)$` $~=~ \mathit{ttcs}(T_1) \cup \ldots \cup \mathit{ttcs}(T_n)$.
+
+The _complexity_ $\operatorname{complexity}(T)$ of a core type is an integer which also depends on the form of
+the type:
+
+- For a type designator, $\operatorname{complexity}(p.c) ~=~ 1 + \operatorname{complexity}(p)$
+- For a parameterized type, $\operatorname{complexity}(p.c[\mathit{targs}]) ~=~ 1 + \Sigma \operatorname{complexity}(\mathit{targs})$
+- For a singleton type denoting a package $p$, $\operatorname{complexity}(p.type) ~=~ 0$
+- For any other singleton type, $\operatorname{complexity}(p.type) ~=~ 1 + \operatorname{complexity}(T)$, provided $p$ has type $T$;
+- For a compound type, `$\operatorname{complexity}(T_1$ with $\ldots$ with $T_n)$` $= \Sigma\operatorname{complexity}(T_i)$
+
+###### Example
+When typing `sort(xs)` for some list `xs` of type `List[List[List[Int]]]`,
+the sequence of types for
+which implicit arguments are searched is
+
+```scala
+List[List[Int]] => Ordered[List[List[Int]]],
+List[Int] => Ordered[List[Int]]
+Int => Ordered[Int]
+```
+
+All types share the common type constructor `scala.Function1`,
+but the complexity of the each new type is lower than the complexity of the previous types.
+Hence, the code typechecks.
+
+###### Example
+Let `ys` be a list of some type which cannot be converted
+to `Ordered`. For instance:
+
+```scala
+val ys = List(new IllegalArgumentException, new ClassCastException, new Error)
+```
+
+Assume that the definition of `magic` above is in scope. Then the sequence
+of types for which implicit arguments are searched is
+
+```scala
+Throwable => Ordered[Throwable],
+Throwable => Ordered[Throwable],
+...
+```
+
+Since the second type in the sequence is equal to the first, the compiler
+will issue an error signalling a divergent implicit expansion.
+
+## Views
+
+Implicit parameters and methods can also define implicit conversions
+called views. A _view_ from type $S$ to type $T$ is
+defined by an implicit value which has function type
+`$S$=>$T$` or `(=>$S$)=>$T$` or by a method convertible to a value of that
+type.
+
+Views are applied in three situations:
+
+1.  If an expression $e$ is of type $T$, and $T$ does not conform to the
+    expression's expected type $\mathit{pt}$. In this case an implicit $v$ is
+    searched which is applicable to $e$ and whose result type conforms to
+    $\mathit{pt}$.  The search proceeds as in the case of implicit parameters,
+    where the implicit scope is the one of `$T$ => $\mathit{pt}$`. If
+    such a view is found, the expression $e$ is converted to
+    `$v$($e$)`.
+1.  In a selection $e.m$ with $e$ of type $T$, if the selector $m$ does
+    not denote an accessible member of $T$.  In this case, a view $v$ is searched
+    which is applicable to $e$ and whose result contains a member named
+    $m$.  The search proceeds as in the case of implicit parameters, where
+    the implicit scope is the one of $T$.  If such a view is found, the
+    selection $e.m$ is converted to `$v$($e$).$m$`.
+1.  In a selection $e.m(\mathit{args})$ with $e$ of type $T$, if the selector
+    $m$ denotes some member(s) of $T$, but none of these members is applicable to the arguments
+    $\mathit{args}$. In this case a view $v$ is searched which is applicable to $e$
+    and whose result contains a method $m$ which is applicable to $\mathit{args}$.
+    The search proceeds as in the case of implicit parameters, where
+    the implicit scope is the one of $T$.  If such a view is found, the
+    selection $e.m$ is converted to `$v$($e$).$m(\mathit{args})$`.
+
+The implicit view, if it is found, can accept is argument $e$ as a
+call-by-value or as a call-by-name parameter. However, call-by-value
+implicits take precedence over call-by-name implicits.
+
+As for implicit parameters, overloading resolution is applied
+if there are several possible candidates (of either the call-by-value
+or the call-by-name category).
+
+###### Example Ordered
+
+Class `scala.Ordered[A]` contains a method
+
+```scala
+  def <= [B >: A](that: B)(implicit b2ordered: B => Ordered[B]): Boolean .
+```
+
+Assume two lists `xs` and `ys` of type `List[Int]`
+and assume that the `list2ordered` and `int2ordered`
+methods defined [here](#implicit-parameters) are in scope.
+Then the operation
+
+```scala
+  xs <= ys
+```
+
+is legal, and is expanded to:
+
+```scala
+  list2ordered(xs)(int2ordered).<=
+    (ys)
+    (xs => list2ordered(xs)(int2ordered))
+```
+
+The first application of `list2ordered` converts the list
+`xs` to an instance of class `Ordered`, whereas the second
+occurrence is part of an implicit parameter passed to the `<=`
+method.
+
+## Context Bounds and View Bounds
+
+```ebnf
+  TypeParam ::= (id | ‘_’) [TypeParamClause] [‘>:’ Type] [‘<:’ Type]
+                {‘<%’ Type} {‘:’ Type}
+```
+
+A type parameter $A$ of a method or non-trait class may have one or more view
+bounds `$A$ <% $T$`. In this case the type parameter may be
+instantiated to any type $S$ which is convertible by application of a
+view to the bound $T$.
+
+A type parameter $A$ of a method or non-trait class may also have one
+or more context bounds `$A$ : $T$`. In this case the type parameter may be
+instantiated to any type $S$ for which _evidence_ exists at the
+instantiation point that $S$ satisfies the bound $T$. Such evidence
+consists of an implicit value with type $T[S]$.
+
+A method or class containing type parameters with view or context bounds is treated as being
+equivalent to a method with implicit parameters. Consider first the case of a
+single parameter with view and/or context bounds such as:
+
+```scala
+def $f$[$A$ <% $T_1$ ... <% $T_m$ : $U_1$ : $U_n$]($\mathit{ps}$): $R$ = ...
+```
+
+Then the method definition above is expanded to
+
+```scala
+def $f$[$A$]($\mathit{ps}$)(implicit $v_1$: $A$ => $T_1$, ..., $v_m$: $A$ => $T_m$,
+                       $w_1$: $U_1$[$A$], ..., $w_n$: $U_n$[$A$]): $R$ = ...
+```
+
+where the $v_i$ and $w_j$ are fresh names for the newly introduced implicit parameters. These
+parameters are called _evidence parameters_.
+
+If a class or method has several view- or context-bounded type parameters, each
+such type parameter is expanded into evidence parameters in the order
+they appear and all the resulting evidence parameters are concatenated
+in one implicit parameter section.  Since traits do not take
+constructor parameters, this translation does not work for them.
+Consequently, type-parameters in traits may not be view- or context-bounded.
+
+Evidence parameters are prepended to the existing implicit parameter section, if one exists.
+
+For example:
+
+```scala
+def foo[A: M](implicit b: B): C
+// expands to:
+// def foo[A](implicit evidence$1: M[A], b: B): C
+```
+
+###### Example
+The `<=` method from the [`Ordered` example](#example-ordered) can be declared
+more concisely as follows:
+
+```scala
+def <= [B >: A <% Ordered[B]](that: B): Boolean
+```
+
+## Manifests
+
+Manifests are type descriptors that can be automatically generated by
+the Scala compiler as arguments to implicit parameters. The Scala
+standard library contains a hierarchy of four manifest classes,
+with `OptManifest`
+at the top. Their signatures follow the outline below.
+
+```scala
+trait OptManifest[+T]
+object NoManifest extends OptManifest[Nothing]
+trait ClassManifest[T] extends OptManifest[T]
+trait Manifest[T] extends ClassManifest[T]
+```
+
+If an implicit parameter of a method or constructor is of a subtype $M[T]$ of
+class `OptManifest[T]`, _a manifest is determined for $M[S]$_,
+according to the following rules.
+
+First if there is already an implicit argument that matches $M[T]$, this
+argument is selected.
+
+Otherwise, let $\mathit{Mobj}$ be the companion object `scala.reflect.Manifest`
+if $M$ is trait `Manifest`, or be
+the companion object `scala.reflect.ClassManifest` otherwise. Let $M'$ be the trait
+`Manifest` if $M$ is trait `Manifest`, or be the trait `OptManifest` otherwise.
+Then the following rules apply.
+
+1.  If $T$ is a value class or one of the classes `Any`, `AnyVal`, `Object`,
+    `Null`, or `Nothing`,
+    a manifest for it is generated by selecting
+    the corresponding manifest value `Manifest.$T$`, which exists in the
+    `Manifest` module.
+1.  If $T$ is an instance of `Array[$S$]`, a manifest is generated
+    with the invocation `$\mathit{Mobj}$.arrayType[S](m)`, where $m$ is the manifest
+    determined for $M[S]$.
+1.  If $T$ is some other class type $S$#$C[U_1, \ldots, U_n]$ where the prefix
+    type $S$ cannot be statically determined from the class $C$,
+    a manifest is generated with the invocation `$\mathit{Mobj}$.classType[T]($m_0$, classOf[T], $ms$)`
+    where $m_0$ is the manifest determined for $M'[S]$ and $ms$ are the
+    manifests determined for $M'[U_1], \ldots, M'[U_n]$.
+1.  If $T$ is some other class type with type arguments $U_1 , \ldots , U_n$,
+    a manifest is generated
+    with the invocation `$\mathit{Mobj}$.classType[T](classOf[T], $ms$)`
+    where $ms$ are the
+    manifests determined for $M'[U_1] , \ldots , M'[U_n]$.
+1.  If $T$ is a singleton type `$p$.type`, a manifest is generated with
+    the invocation `$\mathit{Mobj}$.singleType[T]($p$)`
+1.  If $T$ is a refined type $T' \{ R \}$, a manifest is generated for $T'$.
+    (That is, refinements are never reflected in manifests).
+1.  If $T$ is an intersection type
+    `$T_1$ with $, \ldots ,$ with $T_n$`
+    where $n > 1$, the result depends on whether a full manifest is
+    to be determined or not.
+    If $M$ is trait `Manifest`, then
+    a manifest is generated with the invocation
+    `Manifest.intersectionType[T]($ms$)` where $ms$ are the manifests
+    determined for $M[T_1] , \ldots , M[T_n]$.
+    Otherwise, if $M$ is trait `ClassManifest`,
+    then a manifest is generated for the [intersection dominator](03-types.html#type-erasure)
+    of the types $T_1 , \ldots , T_n$.
+1.  If $T$ is some other type, then if $M$ is trait `OptManifest`,
+    a manifest is generated from the designator `scala.reflect.NoManifest`.
+    If $M$ is a type different from `OptManifest`, a static error results.
diff --git a/spec/08-pattern-matching.md b/spec/08-pattern-matching.md
index e75bddc..d496388 100644
--- a/spec/08-pattern-matching.md
+++ b/spec/08-pattern-matching.md
@@ -371,7 +371,7 @@ bound type variables in a typed pattern or constructor
 pattern. Inference takes into account the expected type of the
 pattern.
 
-### Type parameter inference for typed patterns.
+### Type parameter inference for typed patterns
 
 Assume a typed pattern $p: T'$. Let $T$ result from $T'$ where all wildcards in
 $T'$ are renamed to fresh variable names. Let $a_1 , \ldots , a_n$ be
@@ -437,7 +437,7 @@ complexity of inferred bounds. Minimality and maximality of types have
 to be understood relative to the set of types of acceptable
 complexity.
 
-#### Type parameter inference for constructor patterns.
+### Type parameter inference for constructor patterns
 Assume a constructor pattern $C(p_1 , \ldots , p_n)$ where class $C$
 has type type parameters $a_1 , \ldots , a_n$.  These type parameters
 are inferred in the same way as for the typed pattern
@@ -507,7 +507,7 @@ def f[B](t: Term[B]): B = t match {
 The expected type of the pattern `y: Number` is
 `Term[B]`.  The type `Number` does not conform to
 `Term[B]`; hence Case 2 of the rules above
-applies. This means that `b` is treated as another type
+applies. This means that `B` is treated as another type
 variable for which subtype constraints are inferred. In our case the
 applicable constraint is `Number <: Term[B]`, which
 entails `B = Int`.  Hence, `B` is treated in
@@ -593,7 +593,7 @@ the compilation of pattern matching can emit warnings which diagnose
 that a given set of patterns is not exhaustive, i.e. that there is a
 possibility of a `MatchError` being raised at run-time.
 
-### Example
+###### Example
 
 Consider the following definitions of arithmetic terms:
 
diff --git a/spec/09-top-level-definitions.md b/spec/09-top-level-definitions.md
index e3185d8..b8a8dc7 100644
--- a/spec/09-top-level-definitions.md
+++ b/spec/09-top-level-definitions.md
@@ -151,7 +151,7 @@ contain a class `B`, a compiler-time error would result.
 
 A _program_ is a top-level object that has a member method
 _main_ of type `(Array[String])Unit`. Programs can be
-executed from a command shell. The program's command arguments are are
+executed from a command shell. The program's command arguments are
 passed to the `main` method as a parameter of type
 `Array[String]`.
 
diff --git a/spec/10-xml-expressions-and-patterns.md b/spec/10-xml-expressions-and-patterns.md
index 407b2b9..b70fb86 100644
--- a/spec/10-xml-expressions-and-patterns.md
+++ b/spec/10-xml-expressions-and-patterns.md
@@ -1,5 +1,5 @@
 ---
-title: XML Expressions and Patterns
+title: XML
 layout: default
 chapter: 10
 ---
diff --git a/spec/11-annotations.md b/spec/11-annotations.md
new file mode 100644
index 0000000..d66f24a
--- /dev/null
+++ b/spec/11-annotations.md
@@ -0,0 +1,174 @@
+---
+title: Annotations
+layout: default
+chapter: 11
+---
+
+# Annotations
+
+```ebnf
+  Annotation       ::=  ‘@’ SimpleType {ArgumentExprs}
+  ConstrAnnotation ::=  ‘@’ SimpleType ArgumentExprs
+```
+
+## Definition
+
+Annotations associate meta-information with definitions.
+A simple annotation has the form `@$c$` or `@$c(a_1 , \ldots , a_n)$`.
+Here, $c$ is a constructor of a class $C$, which must conform
+to the class `scala.Annotation`.
+
+Annotations may apply to definitions or declarations, types, or
+expressions.  An annotation of a definition or declaration appears in
+front of that definition.  An annotation of a type appears after
+that type. An annotation of an expression $e$ appears after the
+expression $e$, separated by a colon. More than one annotation clause
+may apply to an entity. The order in which these annotations are given
+does not matter.
+
+Examples:
+
+```scala
+ at deprecated("Use D", "1.0") class C { ... } // Class annotation
+ at transient @volatile var m: Int             // Variable annotation
+String @local                               // Type annotation
+(e: @unchecked) match { ... }               // Expression annotation
+```
+
+## Predefined Annotations
+
+### Java Platform Annotations
+
+The meaning of annotation clauses is implementation-dependent. On the
+Java platform, the following annotations have a standard meaning.
+
+  * `@transient` Marks a field to be non-persistent; this is
+    equivalent to the `transient`
+    modifier in Java.
+
+  * `@volatile` Marks a field which can change its value
+    outside the control of the program; this
+    is equivalent to the `volatile`
+    modifier in Java.
+
+  * `@SerialVersionUID(<longlit>)` Attaches a serial version identifier (a
+    `long` constant) to a class.
+    This is equivalent to a the following field
+    definition in Java:
+
+    ```
+    private final static SerialVersionUID = <longlit>
+    ```
+
+  * `@throws(<classlit>)` A Java compiler checks that a program contains handlers for checked exceptions
+    by analyzing which checked exceptions can result from execution of a method or
+    constructor. For each checked exception which is a possible result, the
+    `throws`
+    clause for the method or constructor must mention the class of that exception
+    or one of the superclasses of the class of that exception.
+
+### Java Beans Annotations
+
+  * `@scala.beans.BeanProperty` When prefixed to a definition of some variable `X`, this
+    annotation causes getter and setter methods `getX`, `setX`
+    in the Java bean style to be added in the class containing the
+    variable. The first letter of the variable appears capitalized after
+    the `get` or `set`. When the annotation is added to the
+    definition of an immutable value definition `X`, only a getter is
+    generated. The construction of these methods is part of
+    code-generation; therefore, these methods become visible only once a
+    classfile for the containing class is generated.
+
+  * `@scala.beans.BooleanBeanProperty` This annotation is equivalent to `scala.reflect.BeanProperty`, but
+    the generated getter method is named `isX` instead of `getX`.
+
+### Deprecation Annotations
+
+  * `@deprecated(message: <stringlit>, since: <stringlit>)`<br/>
+    Marks a definition as deprecated. Accesses to the
+    defined entity will then cause a deprecated warning mentioning the
+    _message_ `<stringlit>` to be issued from the compiler.
+    The argument _since_ documents since when the definition should be considered deprecated.<br/>
+    Deprecated warnings are suppressed in code that belongs itself to a definition
+    that is labeled deprecated.
+
+  * `@deprecatedName(name: <symbollit>)`<br/>
+    Marks a formal parameter name as deprecated. Invocations of this entity
+    using named parameter syntax refering to the deprecated parameter name cause a deprecation warning.
+
+### Scala Compiler Annotations
+
+  * `@unchecked` When applied to the selector of a `match` expression,
+    this attribute suppresses any warnings about non-exhaustive pattern
+    matches which would otherwise be emitted. For instance, no warnings
+    would be produced for the method definition below.
+
+    ```
+    def f(x: Option[Int]) = (x: @unchecked) match {
+    case Some(y) => y
+    }
+    ```
+
+    Without the `@unchecked` annotation, a Scala compiler could
+    infer that the pattern match is non-exhaustive, and could produce a
+    warning because `Option` is a `sealed` class.
+
+  * `@uncheckedStable` When applied a value declaration or definition, it allows the defined
+    value to appear in a path, even if its type is [volatile](03-types.html#volatile-types).
+    For instance, the following member definitions are legal:
+
+    ```
+    type A { type T }
+    type B
+    @uncheckedStable val x: A with B // volatile type
+    val y: x.T                       // OK since `x' is still a path
+    ```
+
+    Without the `@uncheckedStable` annotation, the designator `x`
+    would not be a path since its type `A with B` is volatile. Hence,
+    the reference `x.T` would be malformed.
+
+    When applied to value declarations or definitions that have non-volatile
+    types, the annotation has no effect.
+
+  * `@specialized` When applied to the definition of a type parameter, this annotation causes
+    the compiler
+    to generate specialized definitions for primitive types. An optional list of
+    primitive
+    types may be given, in which case specialization takes into account only
+    those types.
+    For instance, the following code would generate specialized traits for
+    `Unit`, `Int` and `Double`
+
+    ```
+    trait Function0[@specialized(Unit, Int, Double) T] {
+      def apply: T
+    }
+    ```
+
+    Whenever the static type of an expression matches a specialized variant of
+    a definition, the compiler will instead use the specialized version.
+    See the [specialization sid](http://docs.scala-lang.org/sips/completed/scala-specialization.html) for more details of the implementation.
+
+## User-defined Annotations
+
+Other annotations may be interpreted by platform- or
+application-dependent tools. Class `scala.Annotation` has two
+sub-traits which are used to indicate how these annotations are
+retained. Instances of an annotation class inheriting from trait
+`scala.ClassfileAnnotation` will be stored in the generated class
+files. Instances of an annotation class inheriting from trait
+`scala.StaticAnnotation` will be visible to the Scala type-checker
+in every compilation unit where the annotated symbol is accessed. An
+annotation class can inherit from both `scala.ClassfileAnnotation`
+and `scala.StaticAnnotation`. If an annotation class inherits from
+neither `scala.ClassfileAnnotation` nor
+`scala.StaticAnnotation`, its instances are visible only locally
+during the compilation run that analyzes them.
+
+Classes inheriting from `scala.ClassfileAnnotation` may be
+subject to further restrictions in order to assure that they can be
+mapped to the host environment. In particular, on both the Java and
+the .NET platforms, such classes must be toplevel; i.e. they may not
+be contained in another class or object.  Additionally, on both
+Java and .NET, all constructor arguments must be constant expressions.
diff --git a/spec/11-user-defined-annotations.md b/spec/11-user-defined-annotations.md
deleted file mode 100644
index 2c5830c..0000000
--- a/spec/11-user-defined-annotations.md
+++ /dev/null
@@ -1,163 +0,0 @@
----
-title: User-Defined Annotations
-layout: default
-chapter: 11
----
-
-# User-Defined Annotations
-
-```ebnf
-  Annotation       ::=  ‘@’ SimpleType {ArgumentExprs}
-  ConstrAnnotation ::=  ‘@’ SimpleType ArgumentExprs
-```
-
-User-defined annotations associate meta-information with definitions.
-A simple annotation has the form `@$c$` or `@$c(a_1 , \ldots , a_n)$`.
-Here, $c$ is a constructor of a class $C$, which must conform
-to the class `scala.Annotation`.
-
-Annotations may apply to definitions or declarations, types, or
-expressions.  An annotation of a definition or declaration appears in
-front of that definition.  An annotation of a type appears after
-that type. An annotation of an expression $e$ appears after the
-expression $e$, separated by a colon. More than one annotation clause
-may apply to an entity. The order in which these annotations are given
-does not matter.
-
-Examples:
-
-```scala
- at deprecated("Use D", "1.0") class C { ... } // Class annotation
- at transient @volatile var m: Int             // Variable annotation
-String @local                               // Type annotation
-(e: @unchecked) match { ... }               // Expression annotation
-```
-
-The meaning of annotation clauses is implementation-dependent. On the
-Java platform, the following annotations have a standard meaning.
-
-  * `@transient` Marks a field to be non-persistent; this is
-    equivalent to the `transient`
-    modifier in Java.
-
-  * `@volatile` Marks a field which can change its value
-    outside the control of the program; this
-    is equivalent to the `volatile`
-    modifier in Java.
-
-  * `@SerialVersionUID(<longlit>)` Attaches a serial version identifier (a
-    `long` constant) to a class.
-    This is equivalent to a the following field
-    definition in Java:
-
-    ```
-    private final static SerialVersionUID = <longlit>
-    ```
-
-  * `@throws(<classlit>)` A Java compiler checks that a program contains handlers for checked exceptions
-    by analyzing which checked exceptions can result from execution of a method or
-    constructor. For each checked exception which is a possible result, the
-    `throws`
-    clause for the method or constructor must mention the class of that exception
-    or one of the superclasses of the class of that exception.
-
-## Java Beans Annotations
-
-  * `@scala.beans.BeanProperty` When prefixed to a definition of some variable `X`, this
-    annotation causes getter and setter methods `getX`, `setX`
-    in the Java bean style to be added in the class containing the
-    variable. The first letter of the variable appears capitalized after
-    the `get` or `set`. When the annotation is added to the
-    definition of an immutable value definition `X`, only a getter is
-    generated. The construction of these methods is part of
-    code-generation; therefore, these methods become visible only once a
-    classfile for the containing class is generated.
-
-  * `@scala.beans.BooleanBeanProperty` This annotation is equivalent to `scala.reflect.BeanProperty`, but
-    the generated getter method is named `isX` instead of `getX`.
-
-## Deprecation Annotations
-
-  * `@deprecated(<stringlit>)` Marks a definition as deprecated. Accesses to the
-    defined entity will then cause a deprecated warning mentioning the
-    message `<stringlit>` to be issued from the compiler.  Deprecated
-    warnings are suppressed in code that belongs itself to a definition
-    that is labeled deprecated.
-
-  * `@deprecatedName(name: <symbollit>)` Marks a formal parameter name as deprecated. Invocations of this entity
-    using named parameter syntax refering to the deprecated parameter name cause a deprecation warning.
-
-## Scala Compiler Annotations
-
-  * `@unchecked` When applied to the selector of a `match` expression,
-    this attribute suppresses any warnings about non-exhaustive pattern
-    matches which would otherwise be emitted. For instance, no warnings
-    would be produced for the method definition below.
-
-    ```
-    def f(x: Option[Int]) = (x: @unchecked) match {
-    case Some(y) => y
-    }
-    ```
-
-    Without the `@unchecked` annotation, a Scala compiler could
-    infer that the pattern match is non-exhaustive, and could produce a
-    warning because `Option` is a `sealed` class.
-
-  * `@uncheckedStable` When applied a value declaration or definition, it allows the defined
-    value to appear in a path, even if its type is [volatile](03-types.html#volatile-types).
-    For instance, the following member definitions are legal:
-
-    ```
-    type A { type T }
-    type B
-    @uncheckedStable val x: A with B // volatile type
-    val y: x.T                       // OK since `x' is still a path
-    ```
-
-    Without the `@uncheckedStable` annotation, the designator `x`
-    would not be a path since its type `A with B` is volatile. Hence,
-    the reference `x.T` would be malformed.
-
-    When applied to value declarations or definitions that have non-volatile
-    types, the annotation has no effect.
-
-  * `@specialized` When applied to the definition of a type parameter, this annotation causes
-    the compiler
-    to generate specialized definitions for primitive types. An optional list of
-    primitive
-    types may be given, in which case specialization takes into account only
-    those types.
-    For instance, the following code would generate specialized traits for
-    `Unit`, `Int` and `Double`
-
-    ```
-    trait Function0[@specialized(Unit, Int, Double) T] {
-      def apply: T
-    }
-    ```
-
-    Whenever the static type of an expression matches a specialized variant of
-    a definition, the compiler will instead use the specialized version.
-    See the [specialization sid](http://docs.scala-lang.org/sips/completed/scala-specialization.html) for more details of the implementation.
-
-Other annotations may be interpreted by platform- or
-application-dependent tools. Class `scala.Annotation` has two
-sub-traits which are used to indicate how these annotations are
-retained. Instances of an annotation class inheriting from trait
-`scala.ClassfileAnnotation` will be stored in the generated class
-files. Instances of an annotation class inheriting from trait
-`scala.StaticAnnotation` will be visible to the Scala type-checker
-in every compilation unit where the annotated symbol is accessed. An
-annotation class can inherit from both `scala.ClassfileAnnotation`
-and `scala.StaticAnnotation`. If an annotation class inherits from
-neither `scala.ClassfileAnnotation` nor
-`scala.StaticAnnotation`, its instances are visible only locally
-during the compilation run that analyzes them.
-
-Classes inheriting from `scala.ClassfileAnnotation` may be
-subject to further restrictions in order to assure that they can be
-mapped to the host environment. In particular, on both the Java and
-the .NET platforms, such classes must be toplevel; i.e. they may not
-be contained in another class or object.  Additionally, on both
-Java and .NET, all constructor arguments must be constant expressions.
diff --git a/spec/12-the-scala-standard-library.md b/spec/12-the-scala-standard-library.md
index 988d980..8f65191 100644
--- a/spec/12-the-scala-standard-library.md
+++ b/spec/12-the-scala-standard-library.md
@@ -1,5 +1,5 @@
 ---
-title: The Scala Standard Library
+title: Standard Library
 layout: default
 chapter: 12
 ---
@@ -171,7 +171,7 @@ Any numeric value type $T$ supports the following methods.
     evaluated by converting the receiver and its argument to their
     operation type and performing the given arithmetic operation of that
     type.
-  * Parameterless arithmethic methods identity (`+`) and negation
+  * Parameterless arithmetic methods identity (`+`) and negation
     (`-`), with result type $T$.  The first of these returns the
     receiver unchanged, whereas the second returns its negation.
   * Conversion methods `toByte`, `toShort`, `toChar`,
@@ -194,7 +194,7 @@ Integer numeric value types support in addition the following operations:
     operation of that type.
 
   * A parameterless bit-negation method (`~`). Its result type is
-    the reciver type $T$ or `Int`, whichever is larger.
+    the receiver type $T$ or `Int`, whichever is larger.
     The operation is evaluated by converting the receiver to the result
     type and negating every bit in its value.
   * Bit-shift methods left-shift (`<<`), arithmetic right-shift
@@ -233,7 +233,7 @@ for type `Int` and for all subrange types.
 The `toString` method displays its receiver as an integer or
 floating point number.
 
-### Example
+###### Example
 
 This is the signature of the numeric value type `Int`:
 
@@ -332,7 +332,7 @@ The `toString` method returns `"()"`.
 ## Standard Reference Classes
 
 This section presents some standard Scala reference classes which are
-treated in a special way by the Scala compiler -- either Scala provides
+treated in a special way by the Scala compiler – either Scala provides
 syntactic sugar for them, or the Scala compiler generates special code
 for their operations. Other classes in the standard Scala library are
 documented in the Scala library documentation by HTML pages.
@@ -745,7 +745,7 @@ object Predef {
   def readf2(format: String) = Console.readf2(format)
   def readf3(format: String) = Console.readf3(format)
 
-  // Implict conversions ------------------------------------------------
+  // Implicit conversions ------------------------------------------------
 
   ...
 }
diff --git a/spec/13-syntax-summary.md b/spec/13-syntax-summary.md
index 2b9571c..7f73e10 100644
--- a/spec/13-syntax-summary.md
+++ b/spec/13-syntax-summary.md
@@ -15,6 +15,8 @@ UnicodeEscape ::= ‘\‘ ‘u‘ {‘u‘} hexDigit hexDigit hexDigit hexDigit
 hexDigit      ::= ‘0’ | … | ‘9’ | ‘A’ | … | ‘F’ | ‘a’ | … | ‘f’
 ```
 
+## Lexical Syntax
+
 The lexical syntax of Scala is given by the following grammar in EBNF form:
 
 ```ebnf
@@ -72,8 +74,10 @@ nl               ::=  $\mathit{“new line character”}$
 semi             ::=  ‘;’ |  nl {nl}
 ```
 
+## Context-free Syntax
+
 The context-free syntax of Scala is given by the following EBNF
-grammar.
+grammar:
 
 ```ebnf
   Literal           ::=  [‘-’] integerLiteral
diff --git a/spec/15-changelog.md b/spec/15-changelog.md
new file mode 100644
index 0000000..751a571
--- /dev/null
+++ b/spec/15-changelog.md
@@ -0,0 +1,847 @@
+---
+title: Changelog
+layout: default
+chapter: 15
+---
+
+# Changelog
+
+Changes in Version 2.8.0
+------------------------
+
+#### Trailing commas
+
+Trailing commas in expression, argument, type or pattern sequences are
+no longer supported.
+
+Changes in Version 2.8
+----------------------
+
+Changed visibility rules for nested packages (where done?)
+
+Changed [visibility rules](02-identifiers-names-and-scopes.html)
+so that packages are no longer treated specially.
+
+Added section on [weak conformance](03-types.html#weak-conformance).
+Relaxed type rules for conditionals,
+match expressions, try expressions to compute their result type using
+least upper bound wrt weak conformance. Relaxed type rule for local type
+inference so that argument types need only weekly conform to inferred
+formal parameter types. Added section on
+[numeric widening](06-expressions.html#numeric-widening) to support
+weak conformance.
+
+Tightened rules to avoid accidental [overrides](05-classes-and-objects.html#overriding).
+
+Removed class literals.
+
+Added section on [context bounds](07-implicits.html#context-bounds-and-view-bounds).
+
+Clarified differences between [`isInstanceOf` and pattern matches](12-the-scala-standard-library.html#root-classes).
+
+Allowed [`implicit` modifier on function literals](06-expressions.html#anonymous-functions) with a single parameter.
+
+Changes in Version 2.7.2
+------------------------
+
+_(10-Nov-2008)_
+
+#### Precedence of Assignment Operators
+
+The [precedence of assignment operators](06-expressions.html#prefix,-infix,-and-postfix-operations)
+has been brought in line with. From now on `+=`, has the same precedence as `=`.
+
+#### Wildcards as function parameters
+
+A formal parameter to an anonymous function may now be a
+[wildcard represented by an underscore](06-expressions.html#placeholder-syntax-for-anonymous-functions).
+
+>      _ => 7   // The function that ignores its argument
+>               // and always returns 7.
+
+#### Unicode alternative for left arrow
+
+The Unicode glyph ‘\\(\leftarrow\\)’ \\(`\u2190`\\) is now treated as a reserved
+identifier, equivalent to the ASCII symbol ‘`<-`’.
+
+Changes in Version 2.7.1
+------------------------
+
+_(09-April-2008)_
+
+#### Change in Scoping Rules for Wildcard Placeholders in Types
+
+A wildcard in a type now binds to the closest enclosing type
+application. For example `List[List[_]]` is now equivalent to this
+existential type:
+
+    List[List[t] forSome { type t }]
+
+In version 2.7.0, the type expanded instead to:
+
+    List[List[t]] forSome { type t }
+
+The new convention corresponds exactly to the way wildcards in Java are
+interpreted.
+
+#### No Contractiveness Requirement for Implicits
+
+The contractiveness requirement for
+[implicit method definitions](07-implicits.html#implicit-parameters)
+has been dropped. Instead it is checked for each implicit expansion individually
+that the expansion does not result in a cycle or a tree of infinitely
+growing types.
+
+Changes in Version 2.7.0
+------------------------
+
+_(07-Feb-2008)_
+
+#### Java Generics
+
+Scala now supports Java generic types by default:
+
+-   A generic type in Java such as `ArrayList<String>` is translated to
+    a generic type in Scala: `ArrayList[String]`.
+
+-   A wildcard type such as `ArrayList<? extends Number>` is translated
+    to `ArrayList[_ <: Number]`. This is itself a shorthand for the
+    existential type `ArrayList[T] forSome { type T <: Number }`.
+
+-   A raw type in Java such as `ArrayList` is translated to
+    `ArrayList[_]`, which is a shorthand for
+    `ArrayList[T] forSome { type T }`.
+
+This translation works if `-target:jvm-1.5` is specified, which is the
+new default. For any other target, Java generics are not recognized. To
+ensure upgradability of Scala codebases, extraneous type parameters for
+Java classes under `-target:jvm-1.4` are simply ignored. For instance,
+when compiling with `-target:jvm-1.4`, a Scala type such as
+`ArrayList[String]` is simply treated as the unparameterized type
+`ArrayList`.
+
+#### Changes to Case Classes
+
+The Scala compiler generates a [companion extractor object for every case class]
+(05-classes-and-objects.html#case-classes) now. For instance, given the case class:
+
+      case class X(elem: String)
+
+the following companion object is generated:
+
+      object X {
+        def unapply(x: X): Some[String] = Some(x.elem)
+        def apply(s: String): X = new X(s)
+      }
+
+If the object exists already, only the `apply` and `unapply` methods are
+added to it.
+
+Three restrictions on case classes have been removed.
+
+1.  Case classes can now inherit from other case classes.
+
+2.  Case classes may now be `abstract`.
+
+3.  Case classes may now come with companion objects.
+
+Changes in Version 2.6.1
+------------------------
+
+_(30-Nov-2007)_
+
+#### Mutable variables introduced by pattern binding
+
+[Mutable variables can now be introduced by a pattern matching definition]
+(04-basic-declarations-and-definitions.html#variable-declarations-and-definitions),
+just like values can. Examples:
+
+      var (x, y) = if (positive) (1, 2) else (-1, -3)
+      var hd :: tl = mylist
+
+#### Self-types
+
+Self types can now be introduced without defining an alias name for
+[`this`](05-classes-and-objects.html#templates). Example:
+
+      class C {
+        type T <: Trait
+        trait Trait { this: T => ... }
+      }
+
+Changes in Version 2.6
+----------------------
+
+_(27-July-2007)_
+
+#### Existential types
+
+It is now possible to define [existential types](03-types.html#existential-types).
+An existential type has the form `T forSome {Q}` where `Q` is a sequence of value and/or
+type declarations. Given the class definitions
+
+    class Ref[T]
+    abstract class Outer { type T }
+
+one may for example write the following existential types
+
+    Ref[T] forSome { type T <: java.lang.Number }
+    Ref[x.T] forSome { val x: Outer }
+
+#### Lazy values
+
+It is now possible to define lazy value declarations using the new modifier
+[`lazy`](04-basic-declarations-and-definitions.html#value-declarations-and-definitions).
+A `lazy` value definition evaluates its right hand
+side \\(e\\) the first time the value is accessed. Example:
+
+    import compat.Platform._
+    val t0 = currentTime
+    lazy val t1 = currentTime
+    val t2 = currentTime
+
+    println("t0 <= t2: " + (t0 <= t2))  //true
+    println("t1 <= t2: " + (t1 <= t2))  //false (lazy evaluation of t1)
+
+#### Structural types
+
+It is now possible to declare structural types using [type refinements]
+(03-types.html#compound-types). For example:
+
+    class File(name: String) {
+      def getName(): String = name
+      def open() { /*..*/ }
+      def close() { println("close file") }
+    }
+    def test(f: { def getName(): String }) { println(f.getName) }
+
+    test(new File("test.txt"))
+    test(new java.io.File("test.txt"))
+
+There’s also a shorthand form for creating values of structural types.
+For instance,
+
+    new { def getName() = "aaron" }
+
+is a shorthand for
+
+    new AnyRef{ def getName() = "aaron" }
+
+Changes in Version 2.5
+----------------------
+
+_(02-May-2007)_
+
+#### Type constructor polymorphism
+
+_Implemented by Adriaan Moors_
+
+[Type parameters](04-basic-declarations-and-definitions.html#type-parameters)
+and abstract
+[type members](04-basic-declarations-and-definitions.html#type-declarations-and-type-aliases) can now also abstract over [type constructors](03-types.html#type-constructors).
+
+This allows a more precise `Iterable` interface:
+
+    trait Iterable[+T] {
+      type MyType[+T] <: Iterable[T] // MyType is a type constructor
+
+      def filter(p: T => Boolean): MyType[T] = ...
+      def map[S](f: T => S): MyType[S] = ...
+    }
+
+    abstract class List[+T] extends Iterable[T] {
+      type MyType[+T] = List[T]
+    }
+
+This definition of `Iterable` makes explicit that mapping a function
+over a certain structure (e.g., a `List`) will yield the same structure
+(containing different elements).
+
+#### Early object initialization
+
+[Early object initialization](05-classes-and-objects.html#early-definitions)
+makes it possible to initialize some fields of an object before any
+parent constructors are called. This is particularly useful for
+traits, which do not have normal constructor parameters. Example:
+
+    trait Greeting {
+      val name: String
+      val msg = "How are you, "+name
+    }
+    class C extends {
+      val name = "Bob"
+    } with Greeting {
+      println(msg)
+    }
+
+In the code above, the field is initialized before the constructor of is
+called. Therefore, field `msg` in class is properly initialized to .
+
+#### For-comprehensions, revised
+
+The syntax of [for-comprehensions](06-expressions.html#for-comprehensions-and-for-loops)
+has changed.
+In the new syntax, generators do not start with a `val` anymore, but filters
+start with an `if` (and are called guards).
+A semicolon in front of a guard is optional. For example:
+
+    for (val x <- List(1, 2, 3); x % 2 == 0) println(x)
+
+is now written
+
+    for (x <- List(1, 2, 3) if x % 2 == 0) println(x)
+
+The old syntax is still available but will be deprecated in the future.
+
+#### Implicit anonymous functions
+
+It is now possible to define [anonymous functions using underscores]
+(06-expressions.html#placeholder-syntax-for-anonymous-functions) in
+parameter position. For instance, the expressions in the left column
+are each function values which expand to the anonymous functions on
+their right.
+
+    _ + 1                  x => x + 1
+    _ * _                  (x1, x2) => x1 * x2
+    (_: int) * 2           (x: int) => (x: int) * 2
+    if (_) x else y        z => if (z) x else y
+    _.map(f)               x => x.map(f)
+    _.map(_ + 1)           x => x.map(y => y + 1)
+
+As a special case, a [partially unapplied method](06-expressions.html#method-values)
+is now designated `m _`   instead of the previous notation  `&m`.
+
+The new notation will displace the special syntax forms `.m()` for
+abstracting over method receivers and `&m` for treating an unapplied
+method as a function value. For the time being, the old syntax forms are
+still available, but they will be deprecated in the future.
+
+#### Pattern matching anonymous functions, refined
+
+It is now possible to use [case clauses to define a function value]
+(08-pattern-matching.html#pattern-matching-anonymous-functions)
+directly for functions of arities greater than one. Previously, only
+unary functions could be defined that way. Example:
+
+    def scalarProduct(xs: Array[Double], ys: Array[Double]) =
+      (0.0 /: (xs zip ys)) {
+        case (a, (b, c)) => a + b * c
+      }
+
+Changes in Version 2.4
+----------------------
+
+_(09-Mar-2007)_
+
+#### Object-local private and protected
+
+The `private` and `protected` modifiers now accept a
+[`[this]` qualifier](05-classes-and-objects.html#modifiers).
+A definition \\(M\\) which is labelled `private[this]` is private,
+and in addition can be accessed only from within the current object.
+That is, the only legal prefixes for \\(M\\) are `this` or `$C$.this`.
+Analogously, a definition \\(M\\) which is labelled `protected[this]` is
+protected, and in addition can be accessed only from within the current
+object.
+
+#### Tuples, revised
+
+The syntax for [tuples](06-expressions.html#tuples) has been changed from \\(\\{…\\}\\) to
+\\((…)\\). For any sequence of types \\(T_1 , … , T_n\\),
+
+\\((T_1 , … , T_n)\\) is a shorthand for `Tuple$n$[$T_1 , … , T_n$]`.
+
+Analogously, for any sequence of expressions or patterns \\(x_1
+, … , x_n\\),
+
+\\((x_1 , … , x_n)\\) is a shorthand for `Tuple$n$($x_1 , … , x_n$)`.
+
+#### Access modifiers for primary constructors
+
+The primary constructor of a class can now be marked [`private` or `protected`]
+(05-classes-and-objects.html#class-definitions).
+If such an access modifier is given, it comes between the name of the class and its
+value parameters. Example:
+
+    class C[T] private (x: T) { ... }
+
+#### Annotations
+
+The support for attributes has been extended and its syntax changed.
+Attributes are now called [*annotations*](11-annotations.html). The syntax has
+been changed to follow Java’s conventions, e.g. `@attribute` instead of
+`[attribute]`. The old syntax is still available but will be deprecated
+in the future.
+
+Annotations are now serialized so that they can be read by compile-time
+or run-time tools. Class has two sub-traits which are used to indicate
+how annotations are retained. Instances of an annotation class
+inheriting from trait will be stored in the generated class files.
+Instances of an annotation class inheriting from trait will be visible
+to the Scala type-checker in every compilation unit where the annotated
+symbol is accessed.
+
+#### Decidable subtyping
+
+The implementation of subtyping has been changed to prevent infinite
+recursions.
+[Termination of subtyping](05-classes-and-objects.html#inheritance-closure)
+is now ensured by a new restriction of class graphs to be finitary.
+
+#### Case classes cannot be abstract
+
+It is now explicitly ruled out that case classes can be abstract. The
+specification was silent on this point before, but did not explain how
+abstract case classes were treated. The Scala compiler allowed the
+idiom.
+
+#### New syntax for self aliases and self types
+
+It is now possible to give an explicit alias name and/or type for the
+[self reference](05-classes-and-objects.html#templates) `this`. For instance, in
+
+    class C { self: D =>
+      ...
+    }
+
+the name `self` is introduced as an alias for `this` within `C` and the
+[self type](05-classes-and-objects.html#class-definitions) of `C` is
+assumed to be `D`. This construct is introduced now in order to replace
+eventually both the qualified this construct and the clause in Scala.
+
+#### Assignment Operators
+
+It is now possible to [combine operators with assignments]
+(06-expressions.html#assignment-operators). Example:
+
+    var x: int = 0
+    x += 1
+
+Changes in Version 2.3.2
+------------------------
+
+_(23-Jan-2007)_
+
+#### Extractors
+
+It is now possible to define patterns independently of case classes, using
+`unapply` methods in [extractor objects](08-pattern-matching.html#extractor-patterns).
+Here is an example:
+
+    object Twice {
+      def apply(x:Int): int = x*2
+      def unapply(z:Int): Option[int] = if (z%2==0) Some(z/2) else None
+    }
+    val x = Twice(21)
+    x match { case Twice(n) => Console.println(n) } // prints 21
+
+In the example, `Twice` is an extractor object with two methods:
+
+-   The `apply` method is used to build even numbers.
+
+-   The `unapply` method is used to decompose an even number; it is in a sense
+    the reverse of `apply`. `unapply` methods return option types:
+    `Some(...)` for a match that suceeds, `None` for a match that fails.
+    Pattern variables are returned as the elements of `Some`.
+    If there are several variables, they are grouped in a tuple.
+
+In the second-to-last line, `Twice`’s method is used to construct a number `x`.
+In the last line, `x` is tested against the pattern `Twice(n)`.
+This pattern succeeds for even numbers and assigns to the variable `n` one half
+of the number that was tested.
+The pattern match makes use of the `unapply` method of object `Twice`.
+More details on extractors can be found in the paper “Matching Objects with
+Patterns” by Emir, Odersky and Williams.
+
+#### Tuples
+
+A new [lightweight syntax for tuples](06-expressions.html#tuples) has been introduced.
+For any sequence of types \\(T_1 , … , T_n\\),
+
+\\(\{T_1 , … , T_n \}\\) is a shorthand for `Tuple$n$[$T_1 , … , T_n$]`.
+
+Analogously, for any sequence of expressions or patterns \\(x_1, … , x_n\\),
+
+\\(\{x_1 , … , x_n \}\\) is a shorthand for `Tuple$n$($x_1 , … , x_n$)`.
+
+#### Infix operators of greater arities
+
+It is now possible to use methods which have more than one parameter as
+[infix operators](06-expressions.html#infix-operations). In this case, all
+method arguments are written as a normal parameter list in parentheses. Example:
+
+    class C {
+      def +(x: int, y: String) = ...
+    }
+    val c = new C
+    c + (1, "abc")
+
+#### Deprecated attribute
+
+A new standard attribute [`deprecated`](11-annotations.html#deprecation-annotations)
+is available. If a member definition is marked with this attribute, any
+reference to the member will cause a “deprecated” warning message to be emitted.
+
+Changes in Version 2.3
+----------------------
+
+_(23-Nov-2006)_
+
+#### Procedures
+
+A simplified syntax for [methods returning `unit`]
+(04-basic-declarations-and-definitions.html#procedures) has been introduced.
+Scala now allows the following shorthands:
+
+`def f(params)` \\(\mbox{for}\\) `def f(params): unit`
+`def f(params) { ... }` \\(\mbox{for}\\) `def f(params): unit = { ... }`
+
+#### Type Patterns
+
+The [syntax of types in patterns](08-pattern-matching.html#type-patterns) has
+been refined.
+Scala now distinguishes between type variables (starting with a lower case
+letter) and types as type arguments in patterns.
+Type variables are bound in the pattern.
+Other type arguments are, as in previous versions, erased.
+The Scala compiler will now issue an “unchecked” warning at places where type
+erasure might compromise type-safety.
+
+#### Standard Types
+
+The recommended names for the two bottom classes in Scala’s type
+hierarchy have changed as follows:
+
+    All      ==>     Nothing
+    AllRef   ==>     Null
+
+The old names are still available as type aliases.
+
+Changes in Version 2.1.8
+------------------------
+
+_(23-Aug-2006)_
+
+#### Visibility Qualifier for protected
+
+Protected members can now have a visibility qualifier, e.g.
+[`protected[<qualifier>]`](05-classes-and-objects.html#protected).
+In particular, one can now simulate package protected access as in Java writing
+
+      protected[P] def X ...
+
+where would name the package containing `X`.
+
+#### Relaxation of Private Acess
+
+[Private members of a class](05-classes-and-objects.html#private) can now be
+referenced from the companion module of the class and vice versa.
+
+#### Implicit Lookup
+
+The lookup method for [implicit definitions](07-implicits.html#implicit-parameters)
+has been generalized.
+When searching for an implicit definition matching a type \\(T\\), now are considered
+
+1.  all identifiers accessible without prefix, and
+
+2.  all members of companion modules of classes associated with \\(T\\).
+
+(The second clause is more general than before). Here, a class is _associated_
+with a type \\(T\\) if it is referenced by some part of \\(T\\), or if it is a
+base class of some part of \\(T\\).
+For instance, to find implicit members corresponding to the type
+
+      HashSet[List[Int], String]
+
+one would now look in the companion modules (aka static parts) of `HashSet`,
+`List`, `Int`, and `String`. Before, it was just the static part of .
+
+#### Tightened Pattern Match
+
+A typed [pattern match with a singleton type `p.type`](08-pattern-matching.html#type-patterns)
+now tests whether the selector value is reference-equal to `p`. Example:
+
+      val p = List(1, 2, 3)
+      val q = List(1, 2)
+      val r = q
+      r match {
+        case _: p.type => Console.println("p")
+        case _: q.type => Console.println("q")
+      }
+
+This will match the second case and hence will print “q”. Before, the
+singleton types were erased to `List`, and therefore the first case would have
+matched, which is non-sensical.
+
+Changes in Version 2.1.7
+------------------------
+
+_(19-Jul-2006)_
+
+#### Multi-Line string literals
+
+It is now possible to write [multi-line string-literals]
+(01-lexical-syntax.html#string-literals) enclosed in triple quotes. Example:
+
+    """this is a
+       multi-line
+       string literal"""
+
+No escape substitutions except for unicode escapes are performed in such
+string literals.
+
+#### Closure Syntax
+
+The syntax of [closures](06-expressions.html#anonymous-functions)
+has been slightly restricted. The form
+
+      x: T => E
+
+is valid only when enclosed in braces, i.e.  `{ x: T => E }`. The
+following is illegal, because it might be read as the value x typed with
+the type `T => E`:
+
+      val f = x: T => E
+
+Legal alternatives are:
+
+      val f = { x: T => E }
+      val f = (x: T) => E
+
+Changes in Version 2.1.5
+------------------------
+
+_(24-May-2006)_
+
+#### Class Literals
+
+There is a new syntax for [class literals](06-expressions.html#literals):
+For any class type \\(C\\), `classOf[$C$]` designates the run-time
+representation of \\(C\\).
+
+Changes in Version 2.0
+----------------------
+
+_(12-Mar-2006)_
+
+Scala in its second version is different in some details from the first
+version of the language. There have been several additions and some old
+idioms are no longer supported. This appendix summarizes the main
+changes.
+
+#### New Keywords
+
+The following three words are now reserved; they cannot be used as
+[identifiers](01-lexical-syntax.html#identifiers):
+
+    implicit    match     requires
+
+#### Newlines as Statement Separators
+
+[Newlines](http://www.scala-lang.org/files/archive/spec/2.11/)
+can now be used as statement separators in place of semicolons.
+
+#### Syntax Restrictions
+
+There are some other situations where old constructs no longer work:
+
+##### *Pattern matching expressions*
+
+The `match` keyword now appears only as infix operator between a
+selector expression and a number of cases, as in:
+
+      expr match {
+        case Some(x) => ...
+        case None => ...
+      }
+
+Variants such as ` expr.match {...} ` or just ` match {...} ` are no
+longer supported.
+
+##### *“With” in extends clauses*
+
+The idiom
+
+    class C with M { ... }
+
+is no longer supported. A `with` connective is only allowed following an
+`extends` clause. For instance, the line above would have to be written
+
+    class C extends AnyRef with M { ... } .
+
+However, assuming `M` is a [trait](05-classes-and-objects.html#traits),
+it is also legal to write
+
+    class C extends M { ... }
+
+The latter expression is treated as equivalent to
+
+    class C extends S with M { ... }
+
+where `S` is the superclass of `M`.
+
+##### *Regular Expression Patterns*
+
+The only form of regular expression pattern that is currently supported
+is a sequence pattern, which might end in a sequence wildcard . Example:
+
+    case List(1, 2, _*) => ... // will match all lists starting with 1, 2, ...
+
+It is at current not clear whether this is a permanent restriction. We
+are evaluating the possibility of re-introducing full regular expression
+patterns in Scala.
+
+#### Selftype Annotations
+
+The recommended syntax of selftype annotations has changed.
+
+    class C: T extends B { ... }
+
+becomes
+
+    class C requires T extends B { ... }
+
+That is, selftypes are now indicated by the new `requires` keyword. The
+old syntax is still available but is considered deprecated.
+
+#### For-comprehensions
+
+[For-comprehensions](06-expressions.html#for-comprehensions-and-for-loops)
+now admit value and pattern definitions. Example:
+
+    for {
+      val x <- List.range(1, 100)
+      val y <- List.range(1, x)
+      val z = x + y
+      isPrime(z)
+    } yield Pair(x, y)
+
+Note the definition  `val z = x + y` as the third item in the
+for-comprehension.
+
+#### Conversions
+
+The rules for [implicit conversions of methods to functions]
+(06-expressions.html#method-conversions) have been tightened.
+Previously, a parameterized method used as a value was always
+implicitly converted to a function. This could lead to unexpected
+results when method arguments where forgotten. Consider for instance the
+statement below:
+
+    show(x.toString)
+
+where `show` is defined as follows:
+
+    def show(x: String) = Console.println(x) .
+
+Most likely, the programmer forgot to supply an empty argument list `()`
+to `toString`. The previous Scala version would treat this code as a
+partially applied method, and expand it to:
+
+    show(() => x.toString())
+
+As a result, the address of a closure would be printed instead of the
+value of `s`.
+
+Scala version 2.0 will apply a conversion from partially applied method
+to function value only if the expected type of the expression is indeed
+a function type. For instance, the conversion would not be applied in
+the code above because the expected type of `show`’s parameter is
+`String`, not a function type.
+
+The new convention disallows some previously legal code. Example:
+
+    def sum(f: int => double)(a: int, b: int): double =
+      if (a > b) 0 else f(a) + sum(f)(a + 1, b)
+
+    val sumInts  =  sum(x => x)  // error: missing arguments
+
+The partial application of `sum` in the last line of the code above will
+not be converted to a function type. Instead, the compiler will produce
+an error message which states that arguments for method `sum` are
+missing. The problem can be fixed by providing an expected type for the
+partial application, for instance by annotating the definition of
+`sumInts` with its type:
+
+    val sumInts: (int, int) => double  =  sum(x => x)  // OK
+
+On the other hand, Scala version 2.0 now automatically applies methods
+with empty parameter lists to `()` argument lists when necessary. For
+instance, the `show` expression above will now be expanded to
+
+    show(x.toString()) .
+
+Scala version 2.0 also relaxes the rules of overriding with respect to
+empty parameter lists. The revised definition of
+[_matching members_](05-classes-and-objects.html#class-members)
+makes it now possible to override a method with an
+explicit, but empty parameter list `()` with a parameterless method, and
+_vice versa_. For instance, the following class definition
+is now legal:
+
+    class C {
+      override def toString: String = ...
+    }
+
+Previously this definition would have been rejected, because the
+`toString` method as inherited from `java.lang.Object` takes an empty
+parameter list.
+
+#### Class Parameters
+
+A [class parameter](05-classes-and-objects.html#class-definitions)
+may now be prefixed by `val` or `var`.
+
+#### Private Qualifiers
+
+Previously, Scala had three levels of visibility:
+<span>*private*</span>, <span>*protected*</span> and
+<span>*public*</span>. There was no way to restrict accesses to members
+of the current package, as in Java.
+
+Scala 2 now defines [access qualifiers](05-classes-and-objects.html#modifiers)
+that let one express this level of visibility, among others. In the definition
+
+    private[C] def f(...)
+
+access to `f` is restricted to all code within the class or package `C`
+(which must contain the definition of `f`).
+
+#### Changes in the Mixin Model
+
+The model which details [mixin composition of classes]
+(05-classes-and-objects.html#templates) has changed significantly.
+The main differences are:
+
+1.  We now distinguish between <span>*traits*</span> that are used as
+    mixin classes and normal classes. The syntax of traits has been
+    generalized from version 1.0, in that traits are now allowed to have
+    mutable fields. However, as in version 1.0, traits still may not
+    have constructor parameters.
+
+2.  Member resolution and super accesses are now both defined in terms
+    of a <span>*class linearization*</span>.
+
+3.  Scala’s notion of method overloading has been generalized; in
+    particular, it is now possible to have overloaded variants of the
+    same method in a subclass and in a superclass, or in several
+    different mixins. This makes method overloading in Scala
+    conceptually the same as in Java.
+
+#### Implicit Parameters
+
+Views in Scala 1.0 have been replaced by the more general concept of
+[implicit parameters](07-implicits.html#implicit-parameters).
+
+#### Flexible Typing of Pattern Matching
+
+The new version of Scala implements more flexible typing rules when it
+comes to [pattern matching over heterogeneous class hierarchies]
+(08-pattern-matching.html#pattern-matching-expressions).
+A <span>*heterogeneous class hierarchy*</span> is one where subclasses
+inherit a common superclass with different parameter types. With the new
+rules in Scala version 2.0 one can perform pattern matches over such
+hierarchies with more precise typings that keep track of the information
+gained by comparing the types of a selector and a matching pattern.
+This gives Scala capabilities analogous to guarded algebraic data types.
diff --git a/spec/README.md b/spec/README.md
index 97c3fdf..1a201fc 100644
--- a/spec/README.md
+++ b/spec/README.md
@@ -8,7 +8,7 @@ Third, we'd like to support different output formats. An html page per chapter w
 
 ## Editing
 
-We use redcarpet 3.1 and jekyll 2 (currently in alpha) to generate the html. Essentially, this is what github pages use.
+We use Jekyll 2 and [Redcarpet](https://github.com/vmg/redcarpet) to generate the html. Essentially, this is what github pages use.
 
 ## Building
 
diff --git a/spec/_config.yml b/spec/_config.yml
index 1052dde..74ec602 100644
--- a/spec/_config.yml
+++ b/spec/_config.yml
@@ -6,5 +6,3 @@ markdown: redcarpet
 encoding: utf-8
 redcarpet:
   extensions: ["no_intra_emphasis", "fenced_code_blocks", "autolink", "tables", "with_toc_data", "strikethrough", "lax_spacing", "space_after_headers", "superscript", "footnotes"]
-# with_toc_data requires redcarpet 3.1 to get
-# pretty ID attributes for Hn headers (https://github.com/vmg/redcarpet/pull/186)
diff --git a/spec/_includes/numbering.css b/spec/_includes/numbering.css
index 8df0809..2a22ce2 100644
--- a/spec/_includes/numbering.css
+++ b/spec/_includes/numbering.css
@@ -1,4 +1,3 @@
-// based on http://philarcher.org/css/numberheadings.css, 
 h1 {
   /* must reset here */
   counter-reset: chapter {{ page.chapter }};
@@ -40,7 +39,6 @@ h3:before {
   display: inline;
   margin-right: 1em;
 }
-
 h3[id*='example'] {
   /* must increment here */
   counter-increment: example;
diff --git a/spec/_layouts/default.yml b/spec/_layouts/default.yml
index 64ba4a1..69791d2 100644
--- a/spec/_layouts/default.yml
+++ b/spec/_layouts/default.yml
@@ -16,75 +16,31 @@
   });
   </script>
   <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/2.3-latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
+  <script src="//code.jquery.com/jquery-2.1.3.min.js"></script>
   <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.2/styles/default.min.css">
-  <link rel="stylesheet" href="public/octicons/octicons.css">
-  <script src="public/highlight/highlight.pack.js"></script>
-  <script src="public/scripts/navigation.js"></script>
-
   <!-- need to use include to see value of page.chapter variable -->
   <style type="text/css">
     {% include numbering.css %}
-
-    /* proper rendering of MathJax into highlighted code blocks */
-    .fixws { white-space: pre; }
-    .fixws .math { white-space: nowrap; }
   </style>
-  <script type="text/javascript">
-    // clear content of H3 nodes that start with "Example:"
-    // the content is only there to determine ID of the H3 element (redcarpet doesn't let us set css id)
-    $( document ).ready(function(){ $("h3[id*='example']").text("") })
-
-    // no language auto-detect so that EBDF isn't detected as scala
-    hljs.configure({
-      languages: []
-    });
-
-    // syntax highlighting after mathjax is loaded so that mathjax can be used in code blocks
-    MathJax.Hub.Queue(function () {
-      hljs.initHighlighting();
-      $("pre nobr").addClass("fixws");
-    })
-
-    // and finally TOC generation
-    $(document).ready(function() {
-      $('.toc').navigation();
-    })
-  </script>
-
   <link rel="stylesheet" type="text/css" href="public/stylesheets/screen.css">
+  <link rel="stylesheet" type="text/css" media="(max-width: 1400px), (orientation: portrait)" href="public/stylesheets/screen-small.css">
   <link rel="stylesheet" type="text/css" media="print" href="public/stylesheets/print.css">
+  <link rel="stylesheet" type="text/css" href="public/stylesheets/fonts.css">
   <title>{{ page.title }}</title>
 </head>
 
 <body>
-<div id="header">
-<a alt="The Scala Language Specification" href="{{site.baseurl}}/"><img id="scala-logo" src="public/images/scala-logo-red-spiral-dark.png" />
-<h1 class="no-numbering">Language Specification</h1></a>
-</div>
-<div id="container">
-<div id="navigation">
-<ol>
-  {% assign sorted_pages = site.pages | sort:"name" %}
-  {% for post in sorted_pages %}
-    {% if post.chapter >= 0 %}
-      {% if page.url == post.url %}
-      <li class="active-page">
-        <a href="{{site.baseurl}}{{ post.url }}"> {{ post.title }}</a>
-        <div class="toc"></div>
-      </li>
-      {% else %}
-      <li>
-        <a href="{{site.baseurl}}{{ post.url }}"> {{ post.title }}</a>
-      </li>
-      {% endif %}
-    {% endif %}
-  {% endfor %}
-</ol>
-</div>
-<div id="content-container">
+  <header>
+    <nav id="chapters"><a id="github" href="https://github.com/scala/scala/tree/2.11.x/spec"><img src="public/images/github-logo at 2x.png" alt="Edit at Github"></a>{% assign sorted_pages = site.pages | sort:"name" %}{% for post in sorted_pages %}{% if post.chapter >= 0 %}<a href="{{site.baseurl}}{{ post.url }}">{{post.chapter}} {{ post.title }}</a>{% endif %}{% endfor %}</nav>
+  </header>
+  <aside class="left"><nav id="toc"></nav></aside>
+
+  <main id="content">
 {{ content }}
-</div>
-</div>
+  </main>
+
+  <script src="public/scripts/toc.js"></script>
+  <script src="public/scripts/highlight.pack.js"></script>
+  <script src="public/scripts/main.js"></script>
 </body>
 </html>
diff --git a/spec/_layouts/toc.yml b/spec/_layouts/toc.yml
index caf0be1..4da7d41 100644
--- a/spec/_layouts/toc.yml
+++ b/spec/_layouts/toc.yml
@@ -6,23 +6,25 @@
   <link rel="icon" type="image/png" href="public/favicon.ico">
   <link rel="shortcut icon" type="image/png" href="public/favicon.ico">
 
-  <link rel="stylesheet" type="text/css" href="public/stylesheets/screen.css">
-  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
+  <script src="//code.jquery.com/jquery-2.1.3.min.js"></script>
   <title>{{ page.title }}</title>
 
-  <script type="text/javascript">
-    $(document).ready(function() {
-      $('#the-scala-language-specification').css('display','none');
-    })
-  </script>
+  <link rel="stylesheet" type="text/css" href="public/stylesheets/screen.css">
+  <link rel="stylesheet" type="text/css" href="public/stylesheets/screen-toc.css">
+  <link rel="stylesheet" type="text/css" href="public/stylesheets/fonts.css">
 </head>
 
 <body>
-<div id="header">
-<a alt="The Scala Language Specification" href="{{site.baseurl}}/"><img id="scala-logo" src="public/images/scala-logo-red-spiral-dark.png" />
-<h1 class="no-numbering">Language Specification</h1></a>
-</div>
+<header>
+  <div id="header-main">
+  <img id="scala-logo" src="public/images/scala-spiral-white.png" />
+  <span id="title">Scala Language Specification</span>
+  <a id="github" href="https://github.com/scala/scala/tree/2.11.x/spec"><img src="public/images/github-logo at 2x.png" alt="Edit at Github"></a>
+  </div>
+  <div id="header-sub">Version 2.11</div>
+</header>
+<main>
 {{ content }}
-
+</main>
 </body>
 </html>
diff --git a/spec/index.md b/spec/index.md
index ee9c2a5..d7e79da 100644
--- a/spec/index.md
+++ b/spec/index.md
@@ -1,18 +1,9 @@
 ---
-title: Scala Language Reference
+title: Scala Language Specification
 layout: toc
 ---
 
-# The Scala Language Specification
-# Version 2.11
-
-### Maintained online at [https://github.com/scala/scala/tree/2.11.x/spec](https://github.com/scala/scala/tree/2.11.x/spec)
-
-### Martin Odersky, Philippe Altherr, Vincent Cremet, Gilles Dubochet, Burak Emir, Philipp Haller, Stéphane Micheloud, Nikolay Mihaylov, Adriaan Moors, Lukas Rytz, Michel Schinz, Erik Stenman, Matthias Zenger
-
-### Markdown Conversion by Iain McGinniss.
-
-## Table of Contents
+# Table of Contents
 
 <ol>
   {% assign sorted_pages = site.pages | sort:"name" %}
@@ -27,7 +18,13 @@ layout: toc
   {% endfor %}
 </ol>
 
-## Preface
+#### Authors and Contributors
+
+Martin Odersky, Philippe Altherr, Vincent Cremet, Gilles Dubochet, Burak Emir, Philipp Haller, Stéphane Micheloud, Nikolay Mihaylov, Adriaan Moors, Lukas Rytz, Michel Schinz, Erik Stenman, Matthias Zenger
+
+Markdown Conversion by Iain McGinniss.
+
+#### Preface
 
 Scala is a Java-like programming language which unifies
 object-oriented and functional programming.  It is a pure
diff --git a/spec/public/fonts/Heuristica-Bold.woff b/spec/public/fonts/Heuristica-Bold.woff
new file mode 100644
index 0000000..9045796
Binary files /dev/null and b/spec/public/fonts/Heuristica-Bold.woff differ
diff --git a/spec/public/fonts/Heuristica-BoldItalic.woff b/spec/public/fonts/Heuristica-BoldItalic.woff
new file mode 100644
index 0000000..a3c5234
Binary files /dev/null and b/spec/public/fonts/Heuristica-BoldItalic.woff differ
diff --git a/spec/public/fonts/Heuristica-Regular.woff b/spec/public/fonts/Heuristica-Regular.woff
new file mode 100644
index 0000000..f5c1f8b
Binary files /dev/null and b/spec/public/fonts/Heuristica-Regular.woff differ
diff --git a/spec/public/fonts/Heuristica-RegularItalic.woff b/spec/public/fonts/Heuristica-RegularItalic.woff
new file mode 100644
index 0000000..d2c8664
Binary files /dev/null and b/spec/public/fonts/Heuristica-RegularItalic.woff differ
diff --git a/spec/public/fonts/LuxiMono-Bold.woff b/spec/public/fonts/LuxiMono-Bold.woff
new file mode 100644
index 0000000..8581bb5
Binary files /dev/null and b/spec/public/fonts/LuxiMono-Bold.woff differ
diff --git a/spec/public/fonts/LuxiMono-BoldOblique.woff b/spec/public/fonts/LuxiMono-BoldOblique.woff
new file mode 100644
index 0000000..607ccf5
Binary files /dev/null and b/spec/public/fonts/LuxiMono-BoldOblique.woff differ
diff --git a/spec/public/fonts/LuxiMono-Regular.woff b/spec/public/fonts/LuxiMono-Regular.woff
new file mode 100644
index 0000000..a478ad9
Binary files /dev/null and b/spec/public/fonts/LuxiMono-Regular.woff differ
diff --git a/spec/public/fonts/LuxiMono-RegularOblique.woff b/spec/public/fonts/LuxiMono-RegularOblique.woff
new file mode 100644
index 0000000..26999f9
Binary files /dev/null and b/spec/public/fonts/LuxiMono-RegularOblique.woff differ
diff --git a/spec/public/fonts/LuxiSans-Bold.woff b/spec/public/fonts/LuxiSans-Bold.woff
new file mode 100644
index 0000000..1626215
Binary files /dev/null and b/spec/public/fonts/LuxiSans-Bold.woff differ
diff --git a/spec/public/fonts/LuxiSans-Regular.woff b/spec/public/fonts/LuxiSans-Regular.woff
new file mode 100644
index 0000000..89d9802
Binary files /dev/null and b/spec/public/fonts/LuxiSans-Regular.woff differ
diff --git a/spec/public/highlight/LICENSE b/spec/public/highlight/LICENSE
deleted file mode 100644
index 422deb7..0000000
--- a/spec/public/highlight/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-Copyright (c) 2006, Ivan Sagalaev
-All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of highlight.js nor the names of its contributors 
-      may be used to endorse or promote products derived from this software 
-      without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/spec/public/images/github-logo at 2x.png b/spec/public/images/github-logo at 2x.png
new file mode 100644
index 0000000..285b0fe
Binary files /dev/null and b/spec/public/images/github-logo at 2x.png differ
diff --git a/spec/public/images/scala-logo-red-spiral-dark.png b/spec/public/images/scala-logo-red-spiral-dark.png
deleted file mode 100644
index 09b66b5..0000000
Binary files a/spec/public/images/scala-logo-red-spiral-dark.png and /dev/null differ
diff --git a/spec/public/images/scala-spiral-white.png b/spec/public/images/scala-spiral-white.png
new file mode 100644
index 0000000..46aaf80
Binary files /dev/null and b/spec/public/images/scala-spiral-white.png differ
diff --git a/spec/public/scripts/LICENSE-highlight b/spec/public/scripts/LICENSE-highlight
new file mode 100644
index 0000000..fe2f67b
--- /dev/null
+++ b/spec/public/scripts/LICENSE-highlight
@@ -0,0 +1,24 @@
+Copyright (c) 2006, Ivan Sagalaev
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of highlight.js nor the names of its contributors
+      may be used to endorse or promote products derived from this software
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/spec/public/scripts/LICENSE-toc b/spec/public/scripts/LICENSE-toc
new file mode 100644
index 0000000..4e236e8
--- /dev/null
+++ b/spec/public/scripts/LICENSE-toc
@@ -0,0 +1,18 @@
+(The MIT License)
+Copyright (c) 2013 Greg Allen
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/spec/public/scripts/main.js b/spec/public/scripts/main.js
new file mode 100644
index 0000000..f0509ab
--- /dev/null
+++ b/spec/public/scripts/main.js
@@ -0,0 +1,57 @@
+function currentChapter() {
+  var path = document.location.pathname;
+  var idx  = path.lastIndexOf("/") + 1;
+  var chap = path.substring(idx, idx + 2);
+  return parseInt(chap, 10);
+}
+
+function heading(i, heading, $heading) {
+  var currentLevel = parseInt(heading.tagName.substring(1));
+  var result = "";
+  if (currentLevel === this.headerLevel) {
+    this.headerCounts[this.headerLevel] += 1;
+    return "" + this.headerCounts[this.headerLevel] + " " + $heading.text();
+  } else if (currentLevel < this.headerLevel) {
+    while(currentLevel < this.headerLevel) {
+      this.headerCounts[this.headerLevel] = 1;
+      this.headerLevel -= 1;
+    }
+    this.headerCounts[this.headerLevel] += 1;
+    return "" + this.headerCounts[this.headerLevel]+ " " + $heading.text();
+  } else {
+    while(currentLevel > this.headerLevel) {
+      this.headerLevel += 1;
+      this.headerCounts[this.headerLevel] = 1;
+    }
+    return "" + this.headerCounts[this.headerLevel]+ " " + $heading.text();
+  }
+}
+
+$('#toc').toc(
+  {
+    'selectors': 'h1,h2,h3',
+    'smoothScrolling': false,
+    'chapter': currentChapter(),
+    'headerLevel': 1,
+    'headerCounts': [-1, currentChapter() - 1, 1, 1],
+    'headerText': heading
+  }
+);
+
+// no language auto-detect so that EBNF isn't detected as scala
+hljs.configure({
+  languages: []
+});
+
+// syntax highlighting after mathjax is loaded so that mathjax can be used in code blocks
+MathJax.Hub.Queue(function () {
+  hljs.initHighlighting();
+  $("pre nobr").addClass("fixws");
+})
+
+$("#chapters a").each(function (index) {
+ if (document.location.pathname.endsWith($(this).attr("href")))
+   $(this).addClass("chapter-active");
+ else
+   $(this).removeClass("chapter-active");
+});
diff --git a/spec/public/scripts/navigation.js b/spec/public/scripts/navigation.js
deleted file mode 100644
index c046bf4..0000000
--- a/spec/public/scripts/navigation.js
+++ /dev/null
@@ -1,70 +0,0 @@
-(function($){ $.fn.navigation = function() {
-
-  // the TOC already contains H1 so we start at H2
-  var headers = $('h2, h3, h4, h5').filter(function() {
-    // exclude examples
-    if (this.id.substr(0, 7) == 'example') {
-      return false;
-    }
-
-    // get all headers with an id
-    return this.id;
-  });
-
-  var output = $(this);
-
-  var get_level = function(n) { return parseInt(n.nodeName.replace('H', ''), 10); }
-
-  var back_to_top = '<span title="Return to top" class="to_top octicon octicon-chevron-up"></span>';
-
-  if (headers.length && output.length) {
-    var level = get_level(headers[0]);
-    var current_level;
-    var html = '<ol>';
-
-    headers.each(function(_, header) {
-      current_level = get_level(header);
-
-      if (current_level === level) {
-        // same level as before
-        html += '<li><a href="#' + header.id + '">' + header.innerHTML + '</a>';
-      } else if (current_level <= level) {
-        // higher level, we go back up and chose intermediary lists
-        for(i = current_level; i < level; i++) {
-          html += '</li></ol>';
-        }
-        html += '<li><a href="#' + header.id + '">' + header.innerHTML + '</a>';
-      } else if (current_level > level) {
-        // lower level, we open new nested lists
-        for(i = current_level; i > level; i--) {
-          html += '<ol><li>';
-        }
-        html += '<a href="#' + header.id + '">' + header.innerHTML + '</a>';
-      }
-
-      var header_link = '<a class="anchor" href="#' + header.id + '"><span class="octicon octicon-link"></span></a>';
-      $(header).prepend(header_link);
-
-      if (!$(header).prev().is('h1')) {
-        $(header).after(back_to_top);
-      }
-
-      level = current_level;
-    });
-
-    html += '</ol>';
-
-    output.html(html);
-  }
-
-  // back to top links
-  $(document).on('click', '.to_top', function() {
-    $(window).scrollTop(0);
-    window.location.hash = '';
-  });
-
-  // we add one more at the end of the document
-  $('#content-container').append(back_to_top);
-
-};})(jQuery);
-
diff --git a/spec/public/scripts/toc.js b/spec/public/scripts/toc.js
new file mode 100644
index 0000000..070d7b7
--- /dev/null
+++ b/spec/public/scripts/toc.js
@@ -0,0 +1,128 @@
+/*!
+ * toc - jQuery Table of Contents Plugin
+ * v0.3.2
+ * http://projects.jga.me/toc/
+ * copyright Greg Allen 2014
+ * MIT License
+*/
+(function($) {
+var verboseIdCache = {};
+$.fn.toc = function(options) {
+  var self = this;
+  var opts = $.extend({}, jQuery.fn.toc.defaults, options);
+
+  var container = $(opts.container);
+  var headings = $(opts.selectors, container);
+  var headingOffsets = [];
+  var activeClassName = opts.activeClass;
+
+  var scrollTo = function(e, callback) {
+    $('li', self).removeClass(activeClassName);
+    $(e.target).parent().addClass(activeClassName);
+  };
+
+  //highlight on scroll
+  var timeout;
+  var highlightOnScroll = function(e) {
+    if (timeout) {
+      clearTimeout(timeout);
+    }
+    timeout = setTimeout(function() {
+      var top = $(window).scrollTop(),
+        highlighted, closest = Number.MAX_VALUE, index = 0;
+      
+      for (var i = 0, c = headingOffsets.length; i < c; i++) {
+        var currentClosest = Math.abs(headingOffsets[i] - top);
+        if (currentClosest < closest) {
+          index = i;
+          closest = currentClosest;
+        }
+      }
+      
+      $('li', self).removeClass(activeClassName);
+      highlighted = $('li:eq('+ index +')', self).addClass(activeClassName);
+      opts.onHighlight(highlighted);      
+    }, 50);
+  };
+  if (opts.highlightOnScroll) {
+    $(window).bind('scroll', highlightOnScroll);
+    highlightOnScroll();
+  }
+
+  return this.each(function() {
+    //build TOC
+    var el = $(this);
+    var ul = $(opts.listType);
+
+    headings.each(function(i, heading) {
+      var $h = $(heading);
+      headingOffsets.push($h.offset().top - opts.highlightOffset);
+
+      var anchorName = opts.anchorName(i, heading, opts.prefix);
+
+      //add anchor
+      if(heading.id !== anchorName) {
+        var anchor = $('<span/>').attr('id', anchorName).insertBefore($h);
+      }
+
+      //build TOC item
+      var a = $('<a/>')
+        .text(opts.headerText(i, heading, $h))
+        .attr('href', '#' + anchorName)
+        .bind('click', function(e) {
+          $(window).unbind('scroll', highlightOnScroll);
+          scrollTo(e, function() {
+            $(window).bind('scroll', highlightOnScroll);
+          });
+          el.trigger('selected', $(this).attr('href'));
+        });
+
+      var li = $('<li/>')
+        .addClass(opts.itemClass(i, heading, $h, opts.prefix))
+        .append(a);
+
+      ul.append(li);
+    });
+    el.html(ul);
+  });
+};
+
+
+jQuery.fn.toc.defaults = {
+  container: 'body',
+  listType: '<ul/>',
+  selectors: 'h1,h2,h3',
+  prefix: 'toc',
+  activeClass: 'toc-active',
+  onHighlight: function() {},
+  highlightOnScroll: true,
+  highlightOffset: 100,
+  anchorName: function(i, heading, prefix) {
+    if(heading.id.length) {
+      return heading.id;
+    }
+
+    var candidateId = $(heading).text().replace(/[^a-z0-9]/ig, ' ').replace(/\s+/g, '-').toLowerCase();
+    if (verboseIdCache[candidateId]) {
+      var j = 2;
+      
+      while(verboseIdCache[candidateId + j]) {
+        j++;
+      }
+      candidateId = candidateId + '-' + j;
+      
+    }
+    verboseIdCache[candidateId] = true;
+
+    return prefix + '-' + candidateId;
+  },
+  headerText: function(i, heading, $heading) {
+    return $heading.text();
+  },
+  itemClass: function(i, heading, $heading, prefix) {
+    return prefix + '-' + $heading[0].tagName.toLowerCase();
+  }
+
+};
+
+})(jQuery);
diff --git a/spec/public/stylesheets/fonts.css b/spec/public/stylesheets/fonts.css
new file mode 100644
index 0000000..36efb2b
--- /dev/null
+++ b/spec/public/stylesheets/fonts.css
@@ -0,0 +1,73 @@
+ at font-face {
+    font-family: 'Luxi Sans';
+    src: local('Luxi Sans Regular'),
+         url('../fonts/LuxiSans-Regular.woff') format('woff');
+    font-weight: normal;
+    font-style: normal;
+}
+
+ at font-face {
+    font-family: 'Luxi Sans';
+    src: local('Luxi Sans Bold'),
+         url('../fonts/LuxiSans-Bold.woff') format('woff');
+    font-weight: bold;
+    font-style: normal;
+}
+
+ at font-face {
+    font-family: 'Luxi Mono';
+    src: local('Luxi Mono Regular'),
+         url('../fonts/LuxiMono-Regular.woff') format('woff');
+    font-weight: normal;
+    font-style: normal;
+}
+ at font-face {
+    font-family: 'Luxi Mono';
+    src: local('Luxi Mono Oblique'),
+         url('../fonts/LuxiMono-BoldOblique.woff') format('woff');
+    font-weight: normal;
+    font-style: oblique;
+}
+ at font-face {
+    font-family: 'Luxi Mono';
+    src: local('Luxi Mono Bold'),
+         url('../fonts/LuxiMono-Bold.woff') format('woff');
+    font-weight: bold;
+    font-style: normal;
+}
+ at font-face {
+    font-family: 'Luxi Mono';
+    src: local('Luxi Mono Bold Oblique'),
+         url('../fonts/LuxiMono-BoldOblique.woff') format('woff');
+    font-weight: bold;
+    font-style: oblique;
+}
+
+ at font-face {
+    font-family: 'Heuristica';
+    src: local('Heuristica Regular'),
+         url('../fonts/Heuristica-Regular.woff') format('woff');
+    font-weight: normal;
+    font-style: normal;
+}
+ at font-face {
+    font-family: 'Heuristica';
+    src: local('Heuristica Italic'),
+         url('../fonts/Heuristica-RegularItalic.woff') format('woff');
+    font-weight: normal;
+    font-style: italic;
+}
+ at font-face {
+    font-family: 'Heuristica';
+    src: local('Heuristica Bold'),
+         url('../fonts/Heuristica-Bold.woff') format('woff');
+    font-weight: bold;
+    font-style: normal;
+}
+ at font-face {
+    font-family: 'Heuristica';
+    src: local('Heuristica Bold Italic'),
+         url('../fonts/Heuristica-BoldItalic.woff') format('woff');
+    font-weight: bold;
+    font-style: italic;
+}
diff --git a/spec/public/stylesheets/screen-small.css b/spec/public/stylesheets/screen-small.css
new file mode 100644
index 0000000..674db7c
--- /dev/null
+++ b/spec/public/stylesheets/screen-small.css
@@ -0,0 +1,57 @@
+body {
+  padding: 0px;
+  margin: 0px;
+}
+aside.left {
+  position: relative;
+  margin: 0px auto;
+  overflow: visible;
+  height: inherit;
+  margin-bottom: 40px;
+  background-color: #073642;
+}
+header {
+  position: relative;
+  height: inherit;
+  min-height: 32px;
+}
+main {
+    max-width: 1000px;
+    min-width: 600px;
+    margin: 0 auto;
+}
+
+#chapters a {
+  font-size: 14px;
+  max-height: 32px;
+  padding: 4px 8px;
+  white-space: nowrap;
+  display: inline-block;
+}
+#chapters > #github {
+  padding: 14px;
+}
+
+#toc {
+  overflow: visible;
+}
+#toc .toc-active {
+  background: inherit;
+}
+#toc .toc-h1 {
+  display: inherit;
+}
+#toc .toc-h1 a {
+  padding-left: 10px;
+  color: #FFFFFF;
+  background: #72D0EB;
+}
+#toc .toc-h2 a {
+  padding-left: 30px;
+}
+#toc .toc-h3 a {
+  padding-left: 50px;
+}
+#toc a {
+  font-size: 14px;
+}
diff --git a/spec/public/stylesheets/screen-toc.css b/spec/public/stylesheets/screen-toc.css
new file mode 100644
index 0000000..7a04bd0
--- /dev/null
+++ b/spec/public/stylesheets/screen-toc.css
@@ -0,0 +1,37 @@
+body {
+  padding: 0px;
+  margin: 0px;
+}
+header {
+  height: 96px;
+  padding: 0px;
+  width: 100%;
+  position: relative;
+  color: #FFFFFF;
+}
+#header-main {
+  height: 68px;
+  line-height: 1.2;
+  font-size: 32px;
+}
+#header-sub {
+  padding-left: 64px;
+  height: 28px;
+  background-color:#72D0EB;
+  vertical-align: middle;
+}
+#scala-logo {
+  padding: 10px;
+}
+#title {
+  vertical-align: middle;
+}
+#github {
+  height: 40px;
+  padding: 14px;
+  float: right;
+  font-size: 0px;
+}
+li {
+  margin: 5px;
+}
diff --git a/spec/public/stylesheets/screen.css b/spec/public/stylesheets/screen.css
index dbb3ebe..fdddba0 100644
--- a/spec/public/stylesheets/screen.css
+++ b/spec/public/stylesheets/screen.css
@@ -1,8 +1,8 @@
 /* from https://gist.github.com/andyferra/2554919 */
 
 body {
-  font-family: Helvetica, arial, sans-serif;
-  font-size: 14px;
+  font-family:Heuristica,Georgia,serif;
+  color: #222222;
   line-height: 1.6;
 
   padding-bottom: 10px;
@@ -18,7 +18,11 @@ body {
 }
 
 a {
-  color: #4183C4;
+  color: #08C;
+  text-decoration: none;
+}
+a:hover, a:focus {
+
 }
 a.absent {
   color: #cc0000;
@@ -41,13 +45,21 @@ a.anchor span {
 }
 
 h1, h2, h3, h4, h5, h6 {
-  margin: 20px 0 10px;
+  margin: 30px 0 0px;
+  padding: 0;
+  /* Fix anchor position due to header */
+  padding-top: 32px;
+  margin-top: -32px;
   font-weight: bold;
   -webkit-font-smoothing: antialiased;
   cursor: text;
   position: relative;
 }
 
+h1, h2 {
+  font-weight: normal;
+}
+
 h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
   text-decoration: none;
 }
@@ -95,7 +107,6 @@ h1 {
 
 h2 {
   font-size: 24px;
-  border-bottom: 1px solid #cccccc;
   color: black;
 }
 
@@ -117,7 +128,7 @@ h6 {
 }
 
 p, blockquote, ul, ol, dl, li, table, pre {
-  margin: 15px 0;
+  margin: 5px 0 15px;
   -moz-font-feature-settings: "onum";
   -ms-font-feature-settings: "onum";
   -webkit-font-feature-settings: "onum";
@@ -125,7 +136,7 @@ p, blockquote, ul, ol, dl, li, table, pre {
 }
 
 hr {
-  background: transparent url("../../images/modules/pulls/dirty-shade.png") repeat-x 0 0;
+  background: transparent repeat-x 0 0;
   border: 0 none;
   color: #cccccc;
   height: 4px;
@@ -207,7 +218,7 @@ dl dd > :last-child {
 blockquote {
   border-left: 4px solid #dddddd;
   padding: 0 15px;
-  color: #777777;
+  color: #222222;
 }
 blockquote > :first-child {
   margin-top: 0;
@@ -215,31 +226,34 @@ blockquote > :first-child {
 blockquote > :last-child {
   margin-bottom: 0;
 }
+blockquote:before {
+    content: "Example";
+    color: #777777;
+    font-size: 14px;
+    font-weight: bold;
+}
 
 table {
   padding: 0;
+  margin: 0;
+  border: none;
+  border-collapse: collapse;
 }
 table tr {
-  border-top: 1px solid #cccccc;
   background-color: white;
-  margin: 0;
-  padding: 0;
 }
 table tr:nth-child(2n) {
   background-color: #f8f8f8;
 }
 table tr th {
+  background-color: #EAEAEA;
   font-weight: bold;
-  border: 1px solid #cccccc;
   text-align: left;
-  margin: 0;
-  padding: 6px 13px;
+  padding: 5px 13px;
 }
 table tr td {
-  border: 1px solid #cccccc;
   text-align: left;
-  margin: 0;
-  padding: 6px 13px;
+  padding: 5px 13px;
 }
 table tr th :first-child, table tr td :first-child {
   margin-top: 0;
@@ -327,11 +341,14 @@ span.float-right > span {
   text-align: right;
 }
 
+pre, code, tt {
+  font:14px "Luxi Mono", 'andale mono', 'lucida console', monospace;
+  line-height:1.5;
+}
+
 .highlight pre {
-  border: 1px solid #eaeaea;
-  background-color: #f8f8f8;
+  background-color: #F8F8F8;
   border-radius: 3px;
-  line-height: 19px;
   overflow: auto;
   padding: 6px 10px;
   white-space: nowrap;
@@ -343,86 +360,144 @@ code {
   margin: 0;
   padding: 0;
   white-space: pre;
-  font-size: 16px;
 }
 
-#navigation {
-  margin-right: 10px;
-  float: right;
-  width: 26%;
-  display: inline;
-  color: #8B8B8B;
-  font-size: 15px;
-  font-weight: bold;
-  background-color: #F3F4F4;
+aside.left {
+    height: 100%;
+    position: fixed;
+    direction: rtl;
+    overflow: auto;
+    left: 0px;
+    width: 320px;
+    bottom: -32px;
+    font-family: "Luxi Sans", serif;
+    background-color: #073642;
 }
 
-#content-container {
-  float: left;
-  width: 70%;
-  display: inline;
+aside.left > nav {
+    direction: ltr;
+    top: 32px;
+    padding-bottom: 32px;
 }
 
-#container {
-  padding-top: 10px;
-  width: 100%;
+article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary {
+    display: block;
 }
 
-#navigation a {
-  text-decoration: none;
-  color: #8B8B8B;
+audio, canvas, img, svg, video {
+    vertical-align: middle;
 }
 
-#navigation a:hover {
-  text-decoration: underline;
+audio, canvas, progress, video {
+    display: inline-block;
+    vertical-align: baseline;
 }
 
-.active-page {
-  color: #171717;
+main {
+    position: relative;
+    top: 32px;
+    margin: 0 0 0 320px;
+    padding: 0px 32px;
+    max-width: 800px;
+    min-width: 800px;
+    min-height: 580px;
+    background-color: #FFF;
 }
 
-.active-page a {
-  color: #171717 !important;
+header {
+    position: fixed;
+    top: 0px;
+    left: 0px;
+    height: 32px;
+    width: 100%;
+    background-color: #002B36;
+    margin: 0px 0px;
+    padding: 0px 0px;
+    font-family: "Luxi Sans", serif;
+    font-weight: bold;
+    z-index: 10;
+    overflow: hidden;
+    text-shadow: 1px 1px 0px rgba(0, 43, 54, 0.15);
 }
 
-.to_top {
-  position: absolute;
-  margin-top: -35px;
-  right: 27%;
-  color: gray;
-  cursor: pointer;
-  width: 16px; height: 16px;
-  display: block;
+#chapters a {
+    color: #FFFFFF;
+    text-decoration: none;
+    font-size: 0.63vw;
+    padding: 100% 8px;
 }
 
-.to_top:hover {
-  color: black;
+#chapters a:hover, #chapters a:focus, #github:hover, #github:focus {
+  background: #DC322F;
+  -webkit-transition: background .2s ease-in;
+  -moz-transition: background .2s ease-in;
+  -ms-transition: background .2s ease-in;
+  -o-transition: background .2s ease-in;
+  transition: background .2s ease-in;
 }
 
-#scala-logo {
-  float: left;
-  width: 168px;
-  height: 48px;
-  margin-right: 25px;
+#chapters a.chapter-active {
+    background: #72D0EB;
 }
 
-#header {
-  padding-top: 16px;
-  padding-bottom: 10px;
-  margin-bottom: 10px;
-  height: 64px;
-  border-bottom: 1px solid #cccccc;
+
+#toc ul {
+    margin: 0;
+    padding: 0;
+    list-style: none;
 }
 
-#header a {
-  height: 100%;
-  display: block;
+#toc li {
+    margin: 0;
+    padding: 0;
+}
+
+#toc a {
+    color: #FFFFFF; /*#073642;*/
+    font-weight: bold;
+    font-size: 12px;
+    display: block;
+    text-shadow: 1px 1px 0px rgba(0, 43, 54, 0.15);
+}
+
+#toc a:hover, #toc a:focus {
+  background: #DC322F;
   text-decoration: none;
+  -webkit-transition: background .2s ease-in;
+  -moz-transition: background .2s ease-in;
+  -ms-transition: background .2s ease-in;
+  -o-transition: background .2s ease-in;
+  transition: background .2s ease-in;
 }
 
-#header h1 {
-  cursor: pointer;
-  padding-top: 6px;
-  margin-bottom: 0px;
-  font-size: 30px;
+#toc .toc-h1 {
+    display: none;
+}
+
+#toc .toc-h2 a {
+    padding-left: 10px;
+}
+
+#toc .toc-h3 a {
+    padding-left: 30px;
+}
+
+#toc .toc-active {
+    background: #72D0EB;
+}
+
+#toc .toc-active a {
+    color: #FFFFFF;
+}
+
+#chapters > #github {
+  padding: 0px;
+  float: right;
+}
+
+.hljs{
+        background: #f8f8f8;
 }
+/* proper rendering of MathJax into highlighted code blocks */
+.fixws { white-space: pre; }
+.fixws .math { white-space: nowrap; }
diff --git a/src/actors/scala/actors/Future.scala b/src/actors/scala/actors/Future.scala
index 4421c7a..11602f5 100644
--- a/src/actors/scala/actors/Future.scala
+++ b/src/actors/scala/actors/Future.scala
@@ -12,7 +12,7 @@ package scala.actors
 import scala.actors.scheduler.DaemonScheduler
 import scala.concurrent.SyncVar
 
-/** A function of arity 0, returing a value of type `T` that,
+/** A function of arity 0, returning a value of type `T` that,
  *  when applied, blocks the current actor (`Actor.self`)
  *  until the future's value is available.
  *
diff --git a/src/asm/README b/src/asm/README
deleted file mode 100644
index 3ceac88..0000000
--- a/src/asm/README
+++ /dev/null
@@ -1,30 +0,0 @@
-Version 5.0.2, SVN r1741, tags/ASM_5_0_2
-
-Git SVN repo: https://github.com/lrytz/asm
-  - git svn howto: https://github.com/lrytz/asm/issues/1
-
-Upgrading ASM
--------------
-
-Start by deleting all source files in src/asm/ and copy the ones from the latest ASM release.
-
-Excluded Files (don't copy):
-  - package.html files
-  - org/objectweb/asm/commons
-  - org/objectweb/asm/optimizer
-  - org/objectweb/asm/xml
-
-Re-packaging and cosmetic changes:
-  - convert line endings (there are some CRLF)
-    find src/asm/scala/tools/asm -name '*.java' | xargs dos2unix
-  - change package clauses
-    find src/asm/scala/tools/asm -name '*.java' | xargs sed -i '' -e 's/package org\.objectweb\.asm/package scala.tools.asm/'
-  - update imports
-    find src/asm/scala/tools/asm -name '*.java' | xargs sed -i '' -e 's/import org\.objectweb\.asm/import scala.tools.asm/'
-  - update @links, @associates
-    find src/asm/scala/tools/asm -name '*.java' | xargs sed -i '' -e 's/@link org\.objectweb\.asm/@link scala.tools.asm/'
-    find src/asm/scala/tools/asm -name '*.java' | xargs sed -i '' -e 's/@associates org\.objectweb\.asm/@associates scala.tools.asm/'
-  - remove trailing whitespace
-    find src/asm/scala/tools/asm -name '*.java' | xargs sed -i '' -e 's/[ ]*$//'
-
-Actual changes: check the git log for [asm-cherry-pick] after the previous upgrade.
diff --git a/src/asm/scala/tools/asm/AnnotationVisitor.java b/src/asm/scala/tools/asm/AnnotationVisitor.java
deleted file mode 100644
index abcaf1d..0000000
--- a/src/asm/scala/tools/asm/AnnotationVisitor.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A visitor to visit a Java annotation. The methods of this class must be
- * called in the following order: ( <tt>visit</tt> | <tt>visitEnum</tt> |
- * <tt>visitAnnotation</tt> | <tt>visitArray</tt> )* <tt>visitEnd</tt>.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public abstract class AnnotationVisitor {
-
-    /**
-     * The ASM API version implemented by this visitor. The value of this field
-     * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    protected final int api;
-
-    /**
-     * The annotation visitor to which this visitor must delegate method calls.
-     * May be null.
-     */
-    protected AnnotationVisitor av;
-
-    /**
-     * Constructs a new {@link AnnotationVisitor}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    public AnnotationVisitor(final int api) {
-        this(api, null);
-    }
-
-    /**
-     * Constructs a new {@link AnnotationVisitor}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param av
-     *            the annotation visitor to which this visitor must delegate
-     *            method calls. May be null.
-     */
-    public AnnotationVisitor(final int api, final AnnotationVisitor av) {
-        if (api != Opcodes.ASM4 && api != Opcodes.ASM5) {
-            throw new IllegalArgumentException();
-        }
-        this.api = api;
-        this.av = av;
-    }
-
-    /**
-     * Visits a primitive value of the annotation.
-     *
-     * @param name
-     *            the value name.
-     * @param value
-     *            the actual value, whose type must be {@link Byte},
-     *            {@link Boolean}, {@link Character}, {@link Short},
-     *            {@link Integer} , {@link Long}, {@link Float}, {@link Double},
-     *            {@link String} or {@link Type} or OBJECT or ARRAY sort. This
-     *            value can also be an array of byte, boolean, short, char, int,
-     *            long, float or double values (this is equivalent to using
-     *            {@link #visitArray visitArray} and visiting each array element
-     *            in turn, but is more convenient).
-     */
-    public void visit(String name, Object value) {
-        if (av != null) {
-            av.visit(name, value);
-        }
-    }
-
-    /**
-     * Visits an enumeration value of the annotation.
-     *
-     * @param name
-     *            the value name.
-     * @param desc
-     *            the class descriptor of the enumeration class.
-     * @param value
-     *            the actual enumeration value.
-     */
-    public void visitEnum(String name, String desc, String value) {
-        if (av != null) {
-            av.visitEnum(name, desc, value);
-        }
-    }
-
-    /**
-     * Visits a nested annotation value of the annotation.
-     *
-     * @param name
-     *            the value name.
-     * @param desc
-     *            the class descriptor of the nested annotation class.
-     * @return a visitor to visit the actual nested annotation value, or
-     *         <tt>null</tt> if this visitor is not interested in visiting this
-     *         nested annotation. <i>The nested annotation value must be fully
-     *         visited before calling other methods on this annotation
-     *         visitor</i>.
-     */
-    public AnnotationVisitor visitAnnotation(String name, String desc) {
-        if (av != null) {
-            return av.visitAnnotation(name, desc);
-        }
-        return null;
-    }
-
-    /**
-     * Visits an array value of the annotation. Note that arrays of primitive
-     * types (such as byte, boolean, short, char, int, long, float or double)
-     * can be passed as value to {@link #visit visit}. This is what
-     * {@link ClassReader} does.
-     *
-     * @param name
-     *            the value name.
-     * @return a visitor to visit the actual array value elements, or
-     *         <tt>null</tt> if this visitor is not interested in visiting these
-     *         values. The 'name' parameters passed to the methods of this
-     *         visitor are ignored. <i>All the array values must be visited
-     *         before calling other methods on this annotation visitor</i>.
-     */
-    public AnnotationVisitor visitArray(String name) {
-        if (av != null) {
-            return av.visitArray(name);
-        }
-        return null;
-    }
-
-    /**
-     * Visits the end of the annotation.
-     */
-    public void visitEnd() {
-        if (av != null) {
-            av.visitEnd();
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/AnnotationWriter.java b/src/asm/scala/tools/asm/AnnotationWriter.java
deleted file mode 100644
index 6de74ce..0000000
--- a/src/asm/scala/tools/asm/AnnotationWriter.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * An {@link AnnotationVisitor} that generates annotations in bytecode form.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-final class AnnotationWriter extends AnnotationVisitor {
-
-    /**
-     * The class writer to which this annotation must be added.
-     */
-    private final ClassWriter cw;
-
-    /**
-     * The number of values in this annotation.
-     */
-    private int size;
-
-    /**
-     * <tt>true<tt> if values are named, <tt>false</tt> otherwise. Annotation
-     * writers used for annotation default and annotation arrays use unnamed
-     * values.
-     */
-    private final boolean named;
-
-    /**
-     * The annotation values in bytecode form. This byte vector only contains
-     * the values themselves, i.e. the number of values must be stored as a
-     * unsigned short just before these bytes.
-     */
-    private final ByteVector bv;
-
-    /**
-     * The byte vector to be used to store the number of values of this
-     * annotation. See {@link #bv}.
-     */
-    private final ByteVector parent;
-
-    /**
-     * Where the number of values of this annotation must be stored in
-     * {@link #parent}.
-     */
-    private final int offset;
-
-    /**
-     * Next annotation writer. This field is used to store annotation lists.
-     */
-    AnnotationWriter next;
-
-    /**
-     * Previous annotation writer. This field is used to store annotation lists.
-     */
-    AnnotationWriter prev;
-
-    // ------------------------------------------------------------------------
-    // Constructor
-    // ------------------------------------------------------------------------
-
-    /**
-     * Constructs a new {@link AnnotationWriter}.
-     *
-     * @param cw
-     *            the class writer to which this annotation must be added.
-     * @param named
-     *            <tt>true<tt> if values are named, <tt>false</tt> otherwise.
-     * @param bv
-     *            where the annotation values must be stored.
-     * @param parent
-     *            where the number of annotation values must be stored.
-     * @param offset
-     *            where in <tt>parent</tt> the number of annotation values must
-     *            be stored.
-     */
-    AnnotationWriter(final ClassWriter cw, final boolean named,
-            final ByteVector bv, final ByteVector parent, final int offset) {
-        super(Opcodes.ASM5);
-        this.cw = cw;
-        this.named = named;
-        this.bv = bv;
-        this.parent = parent;
-        this.offset = offset;
-    }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the AnnotationVisitor abstract class
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visit(final String name, final Object value) {
-        ++size;
-        if (named) {
-            bv.putShort(cw.newUTF8(name));
-        }
-        if (value instanceof String) {
-            bv.put12('s', cw.newUTF8((String) value));
-        } else if (value instanceof Byte) {
-            bv.put12('B', cw.newInteger(((Byte) value).byteValue()).index);
-        } else if (value instanceof Boolean) {
-            int v = ((Boolean) value).booleanValue() ? 1 : 0;
-            bv.put12('Z', cw.newInteger(v).index);
-        } else if (value instanceof Character) {
-            bv.put12('C', cw.newInteger(((Character) value).charValue()).index);
-        } else if (value instanceof Short) {
-            bv.put12('S', cw.newInteger(((Short) value).shortValue()).index);
-        } else if (value instanceof Type) {
-            bv.put12('c', cw.newUTF8(((Type) value).getDescriptor()));
-        } else if (value instanceof byte[]) {
-            byte[] v = (byte[]) value;
-            bv.put12('[', v.length);
-            for (int i = 0; i < v.length; i++) {
-                bv.put12('B', cw.newInteger(v[i]).index);
-            }
-        } else if (value instanceof boolean[]) {
-            boolean[] v = (boolean[]) value;
-            bv.put12('[', v.length);
-            for (int i = 0; i < v.length; i++) {
-                bv.put12('Z', cw.newInteger(v[i] ? 1 : 0).index);
-            }
-        } else if (value instanceof short[]) {
-            short[] v = (short[]) value;
-            bv.put12('[', v.length);
-            for (int i = 0; i < v.length; i++) {
-                bv.put12('S', cw.newInteger(v[i]).index);
-            }
-        } else if (value instanceof char[]) {
-            char[] v = (char[]) value;
-            bv.put12('[', v.length);
-            for (int i = 0; i < v.length; i++) {
-                bv.put12('C', cw.newInteger(v[i]).index);
-            }
-        } else if (value instanceof int[]) {
-            int[] v = (int[]) value;
-            bv.put12('[', v.length);
-            for (int i = 0; i < v.length; i++) {
-                bv.put12('I', cw.newInteger(v[i]).index);
-            }
-        } else if (value instanceof long[]) {
-            long[] v = (long[]) value;
-            bv.put12('[', v.length);
-            for (int i = 0; i < v.length; i++) {
-                bv.put12('J', cw.newLong(v[i]).index);
-            }
-        } else if (value instanceof float[]) {
-            float[] v = (float[]) value;
-            bv.put12('[', v.length);
-            for (int i = 0; i < v.length; i++) {
-                bv.put12('F', cw.newFloat(v[i]).index);
-            }
-        } else if (value instanceof double[]) {
-            double[] v = (double[]) value;
-            bv.put12('[', v.length);
-            for (int i = 0; i < v.length; i++) {
-                bv.put12('D', cw.newDouble(v[i]).index);
-            }
-        } else {
-            Item i = cw.newConstItem(value);
-            bv.put12(".s.IFJDCS".charAt(i.type), i.index);
-        }
-    }
-
-    @Override
-    public void visitEnum(final String name, final String desc,
-            final String value) {
-        ++size;
-        if (named) {
-            bv.putShort(cw.newUTF8(name));
-        }
-        bv.put12('e', cw.newUTF8(desc)).putShort(cw.newUTF8(value));
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String name,
-            final String desc) {
-        ++size;
-        if (named) {
-            bv.putShort(cw.newUTF8(name));
-        }
-        // write tag and type, and reserve space for values count
-        bv.put12('@', cw.newUTF8(desc)).putShort(0);
-        return new AnnotationWriter(cw, true, bv, bv, bv.length - 2);
-    }
-
-    @Override
-    public AnnotationVisitor visitArray(final String name) {
-        ++size;
-        if (named) {
-            bv.putShort(cw.newUTF8(name));
-        }
-        // write tag, and reserve space for array size
-        bv.put12('[', 0);
-        return new AnnotationWriter(cw, false, bv, bv, bv.length - 2);
-    }
-
-    @Override
-    public void visitEnd() {
-        if (parent != null) {
-            byte[] data = parent.data;
-            data[offset] = (byte) (size >>> 8);
-            data[offset + 1] = (byte) size;
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns the size of this annotation writer list.
-     *
-     * @return the size of this annotation writer list.
-     */
-    int getSize() {
-        int size = 0;
-        AnnotationWriter aw = this;
-        while (aw != null) {
-            size += aw.bv.length;
-            aw = aw.next;
-        }
-        return size;
-    }
-
-    /**
-     * Puts the annotations of this annotation writer list into the given byte
-     * vector.
-     *
-     * @param out
-     *            where the annotations must be put.
-     */
-    void put(final ByteVector out) {
-        int n = 0;
-        int size = 2;
-        AnnotationWriter aw = this;
-        AnnotationWriter last = null;
-        while (aw != null) {
-            ++n;
-            size += aw.bv.length;
-            aw.visitEnd(); // in case user forgot to call visitEnd
-            aw.prev = last;
-            last = aw;
-            aw = aw.next;
-        }
-        out.putInt(size);
-        out.putShort(n);
-        aw = last;
-        while (aw != null) {
-            out.putByteArray(aw.bv.data, 0, aw.bv.length);
-            aw = aw.prev;
-        }
-    }
-
-    /**
-     * Puts the given annotation lists into the given byte vector.
-     *
-     * @param panns
-     *            an array of annotation writer lists.
-     * @param off
-     *            index of the first annotation to be written.
-     * @param out
-     *            where the annotations must be put.
-     */
-    static void put(final AnnotationWriter[] panns, final int off,
-            final ByteVector out) {
-        int size = 1 + 2 * (panns.length - off);
-        for (int i = off; i < panns.length; ++i) {
-            size += panns[i] == null ? 0 : panns[i].getSize();
-        }
-        out.putInt(size).putByte(panns.length - off);
-        for (int i = off; i < panns.length; ++i) {
-            AnnotationWriter aw = panns[i];
-            AnnotationWriter last = null;
-            int n = 0;
-            while (aw != null) {
-                ++n;
-                aw.visitEnd(); // in case user forgot to call visitEnd
-                aw.prev = last;
-                last = aw;
-                aw = aw.next;
-            }
-            out.putShort(n);
-            aw = last;
-            while (aw != null) {
-                out.putByteArray(aw.bv.data, 0, aw.bv.length);
-                aw = aw.prev;
-            }
-        }
-    }
-
-    /**
-     * Puts the given type reference and type path into the given bytevector.
-     * LOCAL_VARIABLE and RESOURCE_VARIABLE target types are not supported.
-     *
-     * @param typeRef
-     *            a reference to the annotated type. See {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param out
-     *            where the type reference and type path must be put.
-     */
-    static void putTarget(int typeRef, TypePath typePath, ByteVector out) {
-        switch (typeRef >>> 24) {
-        case 0x00: // CLASS_TYPE_PARAMETER
-        case 0x01: // METHOD_TYPE_PARAMETER
-        case 0x16: // METHOD_FORMAL_PARAMETER
-            out.putShort(typeRef >>> 16);
-            break;
-        case 0x13: // FIELD
-        case 0x14: // METHOD_RETURN
-        case 0x15: // METHOD_RECEIVER
-            out.putByte(typeRef >>> 24);
-            break;
-        case 0x47: // CAST
-        case 0x48: // CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
-        case 0x49: // METHOD_INVOCATION_TYPE_ARGUMENT
-        case 0x4A: // CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
-        case 0x4B: // METHOD_REFERENCE_TYPE_ARGUMENT
-            out.putInt(typeRef);
-            break;
-        // case 0x10: // CLASS_EXTENDS
-        // case 0x11: // CLASS_TYPE_PARAMETER_BOUND
-        // case 0x12: // METHOD_TYPE_PARAMETER_BOUND
-        // case 0x17: // THROWS
-        // case 0x42: // EXCEPTION_PARAMETER
-        // case 0x43: // INSTANCEOF
-        // case 0x44: // NEW
-        // case 0x45: // CONSTRUCTOR_REFERENCE
-        // case 0x46: // METHOD_REFERENCE
-        default:
-            out.put12(typeRef >>> 24, (typeRef & 0xFFFF00) >> 8);
-            break;
-        }
-        if (typePath == null) {
-            out.putByte(0);
-        } else {
-            int length = typePath.b[typePath.offset] * 2 + 1;
-            out.putByteArray(typePath.b, typePath.offset, length);
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/Attribute.java b/src/asm/scala/tools/asm/Attribute.java
deleted file mode 100644
index ac40a75..0000000
--- a/src/asm/scala/tools/asm/Attribute.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A non standard class, field, method or code attribute.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public class Attribute {
-
-    /**
-     * The type of this attribute.
-     */
-    public final String type;
-
-    /**
-     * The raw value of this attribute, used only for unknown attributes.
-     */
-    byte[] value;
-
-    /**
-     * The next attribute in this attribute list. May be <tt>null</tt>.
-     */
-    Attribute next;
-
-    /**
-     * Constructs a new empty attribute.
-     *
-     * @param type
-     *            the type of the attribute.
-     */
-    protected Attribute(final String type) {
-        this.type = type;
-    }
-
-    /**
-     * Returns <tt>true</tt> if this type of attribute is unknown. The default
-     * implementation of this method always returns <tt>true</tt>.
-     *
-     * @return <tt>true</tt> if this type of attribute is unknown.
-     */
-    public boolean isUnknown() {
-        return true;
-    }
-
-    /**
-     * Returns <tt>true</tt> if this type of attribute is a code attribute.
-     *
-     * @return <tt>true</tt> if this type of attribute is a code attribute.
-     */
-    public boolean isCodeAttribute() {
-        return false;
-    }
-
-    /**
-     * Returns the labels corresponding to this attribute.
-     *
-     * @return the labels corresponding to this attribute, or <tt>null</tt> if
-     *         this attribute is not a code attribute that contains labels.
-     */
-    protected Label[] getLabels() {
-        return null;
-    }
-
-    /**
-     * Reads a {@link #type type} attribute. This method must return a
-     * <i>new</i> {@link Attribute} object, of type {@link #type type},
-     * corresponding to the <tt>len</tt> bytes starting at the given offset, in
-     * the given class reader.
-     *
-     * @param cr
-     *            the class that contains the attribute to be read.
-     * @param off
-     *            index of the first byte of the attribute's content in
-     *            {@link ClassReader#b cr.b}. The 6 attribute header bytes,
-     *            containing the type and the length of the attribute, are not
-     *            taken into account here.
-     * @param len
-     *            the length of the attribute's content.
-     * @param buf
-     *            buffer to be used to call {@link ClassReader#readUTF8
-     *            readUTF8}, {@link ClassReader#readClass(int,char[]) readClass}
-     *            or {@link ClassReader#readConst readConst}.
-     * @param codeOff
-     *            index of the first byte of code's attribute content in
-     *            {@link ClassReader#b cr.b}, or -1 if the attribute to be read
-     *            is not a code attribute. The 6 attribute header bytes,
-     *            containing the type and the length of the attribute, are not
-     *            taken into account here.
-     * @param labels
-     *            the labels of the method's code, or <tt>null</tt> if the
-     *            attribute to be read is not a code attribute.
-     * @return a <i>new</i> {@link Attribute} object corresponding to the given
-     *         bytes.
-     */
-    protected Attribute read(final ClassReader cr, final int off,
-            final int len, final char[] buf, final int codeOff,
-            final Label[] labels) {
-        Attribute attr = new Attribute(type);
-        attr.value = new byte[len];
-        System.arraycopy(cr.b, off, attr.value, 0, len);
-        return attr;
-    }
-
-    /**
-     * Returns the byte array form of this attribute.
-     *
-     * @param cw
-     *            the class to which this attribute must be added. This
-     *            parameter can be used to add to the constant pool of this
-     *            class the items that corresponds to this attribute.
-     * @param code
-     *            the bytecode of the method corresponding to this code
-     *            attribute, or <tt>null</tt> if this attribute is not a code
-     *            attributes.
-     * @param len
-     *            the length of the bytecode of the method corresponding to this
-     *            code attribute, or <tt>null</tt> if this attribute is not a
-     *            code attribute.
-     * @param maxStack
-     *            the maximum stack size of the method corresponding to this
-     *            code attribute, or -1 if this attribute is not a code
-     *            attribute.
-     * @param maxLocals
-     *            the maximum number of local variables of the method
-     *            corresponding to this code attribute, or -1 if this attribute
-     *            is not a code attribute.
-     * @return the byte array form of this attribute.
-     */
-    protected ByteVector write(final ClassWriter cw, final byte[] code,
-            final int len, final int maxStack, final int maxLocals) {
-        ByteVector v = new ByteVector();
-        v.data = value;
-        v.length = value.length;
-        return v;
-    }
-
-    /**
-     * Returns the length of the attribute list that begins with this attribute.
-     *
-     * @return the length of the attribute list that begins with this attribute.
-     */
-    final int getCount() {
-        int count = 0;
-        Attribute attr = this;
-        while (attr != null) {
-            count += 1;
-            attr = attr.next;
-        }
-        return count;
-    }
-
-    /**
-     * Returns the size of all the attributes in this attribute list.
-     *
-     * @param cw
-     *            the class writer to be used to convert the attributes into
-     *            byte arrays, with the {@link #write write} method.
-     * @param code
-     *            the bytecode of the method corresponding to these code
-     *            attributes, or <tt>null</tt> if these attributes are not code
-     *            attributes.
-     * @param len
-     *            the length of the bytecode of the method corresponding to
-     *            these code attributes, or <tt>null</tt> if these attributes
-     *            are not code attributes.
-     * @param maxStack
-     *            the maximum stack size of the method corresponding to these
-     *            code attributes, or -1 if these attributes are not code
-     *            attributes.
-     * @param maxLocals
-     *            the maximum number of local variables of the method
-     *            corresponding to these code attributes, or -1 if these
-     *            attributes are not code attributes.
-     * @return the size of all the attributes in this attribute list. This size
-     *         includes the size of the attribute headers.
-     */
-    final int getSize(final ClassWriter cw, final byte[] code, final int len,
-            final int maxStack, final int maxLocals) {
-        Attribute attr = this;
-        int size = 0;
-        while (attr != null) {
-            cw.newUTF8(attr.type);
-            size += attr.write(cw, code, len, maxStack, maxLocals).length + 6;
-            attr = attr.next;
-        }
-        return size;
-    }
-
-    /**
-     * Writes all the attributes of this attribute list in the given byte
-     * vector.
-     *
-     * @param cw
-     *            the class writer to be used to convert the attributes into
-     *            byte arrays, with the {@link #write write} method.
-     * @param code
-     *            the bytecode of the method corresponding to these code
-     *            attributes, or <tt>null</tt> if these attributes are not code
-     *            attributes.
-     * @param len
-     *            the length of the bytecode of the method corresponding to
-     *            these code attributes, or <tt>null</tt> if these attributes
-     *            are not code attributes.
-     * @param maxStack
-     *            the maximum stack size of the method corresponding to these
-     *            code attributes, or -1 if these attributes are not code
-     *            attributes.
-     * @param maxLocals
-     *            the maximum number of local variables of the method
-     *            corresponding to these code attributes, or -1 if these
-     *            attributes are not code attributes.
-     * @param out
-     *            where the attributes must be written.
-     */
-    final void put(final ClassWriter cw, final byte[] code, final int len,
-            final int maxStack, final int maxLocals, final ByteVector out) {
-        Attribute attr = this;
-        while (attr != null) {
-            ByteVector b = attr.write(cw, code, len, maxStack, maxLocals);
-            out.putShort(cw.newUTF8(attr.type)).putInt(b.length);
-            out.putByteArray(b.data, 0, b.length);
-            attr = attr.next;
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/ByteVector.java b/src/asm/scala/tools/asm/ByteVector.java
deleted file mode 100644
index 3bca7af..0000000
--- a/src/asm/scala/tools/asm/ByteVector.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A dynamically extensible vector of bytes. This class is roughly equivalent to
- * a DataOutputStream on top of a ByteArrayOutputStream, but is more efficient.
- *
- * @author Eric Bruneton
- */
-public class ByteVector {
-
-    /**
-     * The content of this vector.
-     */
-    byte[] data;
-
-    /**
-     * Actual number of bytes in this vector.
-     */
-    int length;
-
-    /**
-     * Constructs a new {@link ByteVector ByteVector} with a default initial
-     * size.
-     */
-    public ByteVector() {
-        data = new byte[64];
-    }
-
-    /**
-     * Constructs a new {@link ByteVector ByteVector} with the given initial
-     * size.
-     *
-     * @param initialSize
-     *            the initial size of the byte vector to be constructed.
-     */
-    public ByteVector(final int initialSize) {
-        data = new byte[initialSize];
-    }
-
-    /**
-     * Puts a byte into this byte vector. The byte vector is automatically
-     * enlarged if necessary.
-     *
-     * @param b
-     *            a byte.
-     * @return this byte vector.
-     */
-    public ByteVector putByte(final int b) {
-        int length = this.length;
-        if (length + 1 > data.length) {
-            enlarge(1);
-        }
-        data[length++] = (byte) b;
-        this.length = length;
-        return this;
-    }
-
-    /**
-     * Puts two bytes into this byte vector. The byte vector is automatically
-     * enlarged if necessary.
-     *
-     * @param b1
-     *            a byte.
-     * @param b2
-     *            another byte.
-     * @return this byte vector.
-     */
-    ByteVector put11(final int b1, final int b2) {
-        int length = this.length;
-        if (length + 2 > data.length) {
-            enlarge(2);
-        }
-        byte[] data = this.data;
-        data[length++] = (byte) b1;
-        data[length++] = (byte) b2;
-        this.length = length;
-        return this;
-    }
-
-    /**
-     * Puts a short into this byte vector. The byte vector is automatically
-     * enlarged if necessary.
-     *
-     * @param s
-     *            a short.
-     * @return this byte vector.
-     */
-    public ByteVector putShort(final int s) {
-        int length = this.length;
-        if (length + 2 > data.length) {
-            enlarge(2);
-        }
-        byte[] data = this.data;
-        data[length++] = (byte) (s >>> 8);
-        data[length++] = (byte) s;
-        this.length = length;
-        return this;
-    }
-
-    /**
-     * Puts a byte and a short into this byte vector. The byte vector is
-     * automatically enlarged if necessary.
-     *
-     * @param b
-     *            a byte.
-     * @param s
-     *            a short.
-     * @return this byte vector.
-     */
-    ByteVector put12(final int b, final int s) {
-        int length = this.length;
-        if (length + 3 > data.length) {
-            enlarge(3);
-        }
-        byte[] data = this.data;
-        data[length++] = (byte) b;
-        data[length++] = (byte) (s >>> 8);
-        data[length++] = (byte) s;
-        this.length = length;
-        return this;
-    }
-
-    /**
-     * Puts an int into this byte vector. The byte vector is automatically
-     * enlarged if necessary.
-     *
-     * @param i
-     *            an int.
-     * @return this byte vector.
-     */
-    public ByteVector putInt(final int i) {
-        int length = this.length;
-        if (length + 4 > data.length) {
-            enlarge(4);
-        }
-        byte[] data = this.data;
-        data[length++] = (byte) (i >>> 24);
-        data[length++] = (byte) (i >>> 16);
-        data[length++] = (byte) (i >>> 8);
-        data[length++] = (byte) i;
-        this.length = length;
-        return this;
-    }
-
-    /**
-     * Puts a long into this byte vector. The byte vector is automatically
-     * enlarged if necessary.
-     *
-     * @param l
-     *            a long.
-     * @return this byte vector.
-     */
-    public ByteVector putLong(final long l) {
-        int length = this.length;
-        if (length + 8 > data.length) {
-            enlarge(8);
-        }
-        byte[] data = this.data;
-        int i = (int) (l >>> 32);
-        data[length++] = (byte) (i >>> 24);
-        data[length++] = (byte) (i >>> 16);
-        data[length++] = (byte) (i >>> 8);
-        data[length++] = (byte) i;
-        i = (int) l;
-        data[length++] = (byte) (i >>> 24);
-        data[length++] = (byte) (i >>> 16);
-        data[length++] = (byte) (i >>> 8);
-        data[length++] = (byte) i;
-        this.length = length;
-        return this;
-    }
-
-    /**
-     * Puts an UTF8 string into this byte vector. The byte vector is
-     * automatically enlarged if necessary.
-     *
-     * @param s
-     *            a String whose UTF8 encoded length must be less than 65536.
-     * @return this byte vector.
-     */
-    public ByteVector putUTF8(final String s) {
-        int charLength = s.length();
-        if (charLength > 65535) {
-            throw new IllegalArgumentException();
-        }
-        int len = length;
-        if (len + 2 + charLength > data.length) {
-            enlarge(2 + charLength);
-        }
-        byte[] data = this.data;
-        // optimistic algorithm: instead of computing the byte length and then
-        // serializing the string (which requires two loops), we assume the byte
-        // length is equal to char length (which is the most frequent case), and
-        // we start serializing the string right away. During the serialization,
-        // if we find that this assumption is wrong, we continue with the
-        // general method.
-        data[len++] = (byte) (charLength >>> 8);
-        data[len++] = (byte) charLength;
-        for (int i = 0; i < charLength; ++i) {
-            char c = s.charAt(i);
-            if (c >= '\001' && c <= '\177') {
-                data[len++] = (byte) c;
-            } else {
-                length = len;
-                return encodeUTF8(s, i, 65535);
-            }
-        }
-        length = len;
-        return this;
-    }
-
-    /**
-     * Puts an UTF8 string into this byte vector. The byte vector is
-     * automatically enlarged if necessary. The string length is encoded in two
-     * bytes before the encoded characters, if there is space for that (i.e. if
-     * this.length - i - 2 >= 0).
-     *
-     * @param s
-     *            the String to encode.
-     * @param i
-     *            the index of the first character to encode. The previous
-     *            characters are supposed to have already been encoded, using
-     *            only one byte per character.
-     * @param maxByteLength
-     *            the maximum byte length of the encoded string, including the
-     *            already encoded characters.
-     * @return this byte vector.
-     */
-    ByteVector encodeUTF8(final String s, int i, int maxByteLength) {
-        int charLength = s.length();
-        int byteLength = i;
-        char c;
-        for (int j = i; j < charLength; ++j) {
-            c = s.charAt(j);
-            if (c >= '\001' && c <= '\177') {
-                byteLength++;
-            } else if (c > '\u07FF') {
-                byteLength += 3;
-            } else {
-                byteLength += 2;
-            }
-        }
-        if (byteLength > maxByteLength) {
-            throw new IllegalArgumentException();
-        }
-        int start = length - i - 2;
-        if (start >= 0) {
-          data[start] = (byte) (byteLength >>> 8);
-          data[start + 1] = (byte) byteLength;
-        }
-        if (length + byteLength - i > data.length) {
-            enlarge(byteLength - i);
-        }
-        int len = length;
-        for (int j = i; j < charLength; ++j) {
-            c = s.charAt(j);
-            if (c >= '\001' && c <= '\177') {
-                data[len++] = (byte) c;
-            } else if (c > '\u07FF') {
-                data[len++] = (byte) (0xE0 | c >> 12 & 0xF);
-                data[len++] = (byte) (0x80 | c >> 6 & 0x3F);
-                data[len++] = (byte) (0x80 | c & 0x3F);
-            } else {
-                data[len++] = (byte) (0xC0 | c >> 6 & 0x1F);
-                data[len++] = (byte) (0x80 | c & 0x3F);
-            }
-        }
-        length = len;
-        return this;
-    }
-
-    /**
-     * Puts an array of bytes into this byte vector. The byte vector is
-     * automatically enlarged if necessary.
-     *
-     * @param b
-     *            an array of bytes. May be <tt>null</tt> to put <tt>len</tt>
-     *            null bytes into this byte vector.
-     * @param off
-     *            index of the fist byte of b that must be copied.
-     * @param len
-     *            number of bytes of b that must be copied.
-     * @return this byte vector.
-     */
-    public ByteVector putByteArray(final byte[] b, final int off, final int len) {
-        if (length + len > data.length) {
-            enlarge(len);
-        }
-        if (b != null) {
-            System.arraycopy(b, off, data, length, len);
-        }
-        length += len;
-        return this;
-    }
-
-    /**
-     * Enlarge this byte vector so that it can receive n more bytes.
-     *
-     * @param size
-     *            number of additional bytes that this byte vector should be
-     *            able to receive.
-     */
-    private void enlarge(final int size) {
-        int length1 = 2 * data.length;
-        int length2 = length + size;
-        byte[] newData = new byte[length1 > length2 ? length1 : length2];
-        System.arraycopy(data, 0, newData, 0, length);
-        data = newData;
-    }
-}
diff --git a/src/asm/scala/tools/asm/ClassReader.java b/src/asm/scala/tools/asm/ClassReader.java
deleted file mode 100644
index 8b0e12c..0000000
--- a/src/asm/scala/tools/asm/ClassReader.java
+++ /dev/null
@@ -1,2496 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A Java class parser to make a {@link ClassVisitor} visit an existing class.
- * This class parses a byte array conforming to the Java class file format and
- * calls the appropriate visit methods of a given class visitor for each field,
- * method and bytecode instruction encountered.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public class ClassReader {
-
-    /**
-     * True to enable signatures support.
-     */
-    static final boolean SIGNATURES = true;
-
-    /**
-     * True to enable annotations support.
-     */
-    static final boolean ANNOTATIONS = true;
-
-    /**
-     * True to enable stack map frames support.
-     */
-    static final boolean FRAMES = true;
-
-    /**
-     * True to enable bytecode writing support.
-     */
-    static final boolean WRITER = true;
-
-    /**
-     * True to enable JSR_W and GOTO_W support.
-     */
-    static final boolean RESIZE = true;
-
-    /**
-     * Flag to skip method code. If this class is set <code>CODE</code>
-     * attribute won't be visited. This can be used, for example, to retrieve
-     * annotations for methods and method parameters.
-     */
-    public static final int SKIP_CODE = 1;
-
-    /**
-     * Flag to skip the debug information in the class. If this flag is set the
-     * debug information of the class is not visited, i.e. the
-     * {@link MethodVisitor#visitLocalVariable visitLocalVariable} and
-     * {@link MethodVisitor#visitLineNumber visitLineNumber} methods will not be
-     * called.
-     */
-    public static final int SKIP_DEBUG = 2;
-
-    /**
-     * Flag to skip the stack map frames in the class. If this flag is set the
-     * stack map frames of the class is not visited, i.e. the
-     * {@link MethodVisitor#visitFrame visitFrame} method will not be called.
-     * This flag is useful when the {@link ClassWriter#COMPUTE_FRAMES} option is
-     * used: it avoids visiting frames that will be ignored and recomputed from
-     * scratch in the class writer.
-     */
-    public static final int SKIP_FRAMES = 4;
-
-    /**
-     * Flag to expand the stack map frames. By default stack map frames are
-     * visited in their original format (i.e. "expanded" for classes whose
-     * version is less than V1_6, and "compressed" for the other classes). If
-     * this flag is set, stack map frames are always visited in expanded format
-     * (this option adds a decompression/recompression step in ClassReader and
-     * ClassWriter which degrades performances quite a lot).
-     */
-    public static final int EXPAND_FRAMES = 8;
-
-    /**
-     * The class to be parsed. <i>The content of this array must not be
-     * modified. This field is intended for {@link Attribute} sub classes, and
-     * is normally not needed by class generators or adapters.</i>
-     */
-    public final byte[] b;
-
-    /**
-     * The start index of each constant pool item in {@link #b b}, plus one. The
-     * one byte offset skips the constant pool item tag that indicates its type.
-     */
-    private final int[] items;
-
-    /**
-     * The String objects corresponding to the CONSTANT_Utf8 items. This cache
-     * avoids multiple parsing of a given CONSTANT_Utf8 constant pool item,
-     * which GREATLY improves performances (by a factor 2 to 3). This caching
-     * strategy could be extended to all constant pool items, but its benefit
-     * would not be so great for these items (because they are much less
-     * expensive to parse than CONSTANT_Utf8 items).
-     */
-    private final String[] strings;
-
-    /**
-     * Maximum length of the strings contained in the constant pool of the
-     * class.
-     */
-    private final int maxStringLength;
-
-    /**
-     * Start index of the class header information (access, name...) in
-     * {@link #b b}.
-     */
-    public final int header;
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-
-    /**
-     * Constructs a new {@link ClassReader} object.
-     *
-     * @param b
-     *            the bytecode of the class to be read.
-     */
-    public ClassReader(final byte[] b) {
-        this(b, 0, b.length);
-    }
-
-    /**
-     * Constructs a new {@link ClassReader} object.
-     *
-     * @param b
-     *            the bytecode of the class to be read.
-     * @param off
-     *            the start offset of the class data.
-     * @param len
-     *            the length of the class data.
-     */
-    public ClassReader(final byte[] b, final int off, final int len) {
-        this.b = b;
-        // checks the class version
-        if (readShort(off + 6) > Opcodes.V1_8) {
-            throw new IllegalArgumentException();
-        }
-        // parses the constant pool
-        items = new int[readUnsignedShort(off + 8)];
-        int n = items.length;
-        strings = new String[n];
-        int max = 0;
-        int index = off + 10;
-        for (int i = 1; i < n; ++i) {
-            items[i] = index + 1;
-            int size;
-            switch (b[index]) {
-            case ClassWriter.FIELD:
-            case ClassWriter.METH:
-            case ClassWriter.IMETH:
-            case ClassWriter.INT:
-            case ClassWriter.FLOAT:
-            case ClassWriter.NAME_TYPE:
-            case ClassWriter.INDY:
-                size = 5;
-                break;
-            case ClassWriter.LONG:
-            case ClassWriter.DOUBLE:
-                size = 9;
-                ++i;
-                break;
-            case ClassWriter.UTF8:
-                size = 3 + readUnsignedShort(index + 1);
-                if (size > max) {
-                    max = size;
-                }
-                break;
-            case ClassWriter.HANDLE:
-                size = 4;
-                break;
-            // case ClassWriter.CLASS:
-            // case ClassWriter.STR:
-            // case ClassWriter.MTYPE
-            default:
-                size = 3;
-                break;
-            }
-            index += size;
-        }
-        maxStringLength = max;
-        // the class header information starts just after the constant pool
-        header = index;
-    }
-
-    /**
-     * Returns the class's access flags (see {@link Opcodes}). This value may
-     * not reflect Deprecated and Synthetic flags when bytecode is before 1.5
-     * and those flags are represented by attributes.
-     *
-     * @return the class access flags
-     *
-     * @see ClassVisitor#visit(int, int, String, String, String, String[])
-     */
-    public int getAccess() {
-        return readUnsignedShort(header);
-    }
-
-    /**
-     * Returns the internal name of the class (see
-     * {@link Type#getInternalName() getInternalName}).
-     *
-     * @return the internal class name
-     *
-     * @see ClassVisitor#visit(int, int, String, String, String, String[])
-     */
-    public String getClassName() {
-        return readClass(header + 2, new char[maxStringLength]);
-    }
-
-    /**
-     * Returns the internal of name of the super class (see
-     * {@link Type#getInternalName() getInternalName}). For interfaces, the
-     * super class is {@link Object}.
-     *
-     * @return the internal name of super class, or <tt>null</tt> for
-     *         {@link Object} class.
-     *
-     * @see ClassVisitor#visit(int, int, String, String, String, String[])
-     */
-    public String getSuperName() {
-        return readClass(header + 4, new char[maxStringLength]);
-    }
-
-    /**
-     * Returns the internal names of the class's interfaces (see
-     * {@link Type#getInternalName() getInternalName}).
-     *
-     * @return the array of internal names for all implemented interfaces or
-     *         <tt>null</tt>.
-     *
-     * @see ClassVisitor#visit(int, int, String, String, String, String[])
-     */
-    public String[] getInterfaces() {
-        int index = header + 6;
-        int n = readUnsignedShort(index);
-        String[] interfaces = new String[n];
-        if (n > 0) {
-            char[] buf = new char[maxStringLength];
-            for (int i = 0; i < n; ++i) {
-                index += 2;
-                interfaces[i] = readClass(index, buf);
-            }
-        }
-        return interfaces;
-    }
-
-    /**
-     * Copies the constant pool data into the given {@link ClassWriter}. Should
-     * be called before the {@link #accept(ClassVisitor,int)} method.
-     *
-     * @param classWriter
-     *            the {@link ClassWriter} to copy constant pool into.
-     */
-    void copyPool(final ClassWriter classWriter) {
-        char[] buf = new char[maxStringLength];
-        int ll = items.length;
-        Item[] items2 = new Item[ll];
-        for (int i = 1; i < ll; i++) {
-            int index = items[i];
-            int tag = b[index - 1];
-            Item item = new Item(i);
-            int nameType;
-            switch (tag) {
-            case ClassWriter.FIELD:
-            case ClassWriter.METH:
-            case ClassWriter.IMETH:
-                nameType = items[readUnsignedShort(index + 2)];
-                item.set(tag, readClass(index, buf), readUTF8(nameType, buf),
-                        readUTF8(nameType + 2, buf));
-                break;
-            case ClassWriter.INT:
-                item.set(readInt(index));
-                break;
-            case ClassWriter.FLOAT:
-                item.set(Float.intBitsToFloat(readInt(index)));
-                break;
-            case ClassWriter.NAME_TYPE:
-                item.set(tag, readUTF8(index, buf), readUTF8(index + 2, buf),
-                        null);
-                break;
-            case ClassWriter.LONG:
-                item.set(readLong(index));
-                ++i;
-                break;
-            case ClassWriter.DOUBLE:
-                item.set(Double.longBitsToDouble(readLong(index)));
-                ++i;
-                break;
-            case ClassWriter.UTF8: {
-                String s = strings[i];
-                if (s == null) {
-                    index = items[i];
-                    s = strings[i] = readUTF(index + 2,
-                            readUnsignedShort(index), buf);
-                }
-                item.set(tag, s, null, null);
-                break;
-            }
-            case ClassWriter.HANDLE: {
-                int fieldOrMethodRef = items[readUnsignedShort(index + 1)];
-                nameType = items[readUnsignedShort(fieldOrMethodRef + 2)];
-                item.set(ClassWriter.HANDLE_BASE + readByte(index),
-                        readClass(fieldOrMethodRef, buf),
-                        readUTF8(nameType, buf), readUTF8(nameType + 2, buf));
-                break;
-            }
-            case ClassWriter.INDY:
-                if (classWriter.bootstrapMethods == null) {
-                    copyBootstrapMethods(classWriter, items2, buf);
-                }
-                nameType = items[readUnsignedShort(index + 2)];
-                item.set(readUTF8(nameType, buf), readUTF8(nameType + 2, buf),
-                        readUnsignedShort(index));
-                break;
-            // case ClassWriter.STR:
-            // case ClassWriter.CLASS:
-            // case ClassWriter.MTYPE
-            default:
-                item.set(tag, readUTF8(index, buf), null, null);
-                break;
-            }
-
-            int index2 = item.hashCode % items2.length;
-            item.next = items2[index2];
-            items2[index2] = item;
-        }
-
-        int off = items[1] - 1;
-        classWriter.pool.putByteArray(b, off, header - off);
-        classWriter.items = items2;
-        classWriter.threshold = (int) (0.75d * ll);
-        classWriter.index = ll;
-    }
-
-    /**
-     * Copies the bootstrap method data into the given {@link ClassWriter}.
-     * Should be called before the {@link #accept(ClassVisitor,int)} method.
-     *
-     * @param classWriter
-     *            the {@link ClassWriter} to copy bootstrap methods into.
-     */
-    private void copyBootstrapMethods(final ClassWriter classWriter,
-            final Item[] items, final char[] c) {
-        // finds the "BootstrapMethods" attribute
-        int u = getAttributes();
-        boolean found = false;
-        for (int i = readUnsignedShort(u); i > 0; --i) {
-            String attrName = readUTF8(u + 2, c);
-            if ("BootstrapMethods".equals(attrName)) {
-                found = true;
-                break;
-            }
-            u += 6 + readInt(u + 4);
-        }
-        if (!found) {
-            return;
-        }
-        // copies the bootstrap methods in the class writer
-        int boostrapMethodCount = readUnsignedShort(u + 8);
-        for (int j = 0, v = u + 10; j < boostrapMethodCount; j++) {
-            int position = v - u - 10;
-            int hashCode = readConst(readUnsignedShort(v), c).hashCode();
-            for (int k = readUnsignedShort(v + 2); k > 0; --k) {
-                hashCode ^= readConst(readUnsignedShort(v + 4), c).hashCode();
-                v += 2;
-            }
-            v += 4;
-            Item item = new Item(j);
-            item.set(position, hashCode & 0x7FFFFFFF);
-            int index = item.hashCode % items.length;
-            item.next = items[index];
-            items[index] = item;
-        }
-        int attrSize = readInt(u + 4);
-        ByteVector bootstrapMethods = new ByteVector(attrSize + 62);
-        bootstrapMethods.putByteArray(b, u + 10, attrSize - 2);
-        classWriter.bootstrapMethodsCount = boostrapMethodCount;
-        classWriter.bootstrapMethods = bootstrapMethods;
-    }
-
-    /**
-     * Constructs a new {@link ClassReader} object.
-     *
-     * @param is
-     *            an input stream from which to read the class.
-     * @throws IOException
-     *             if a problem occurs during reading.
-     */
-    public ClassReader(final InputStream is) throws IOException {
-        this(readClass(is, false));
-    }
-
-    /**
-     * Constructs a new {@link ClassReader} object.
-     *
-     * @param name
-     *            the binary qualified name of the class to be read.
-     * @throws IOException
-     *             if an exception occurs during reading.
-     */
-    public ClassReader(final String name) throws IOException {
-        this(readClass(
-                ClassLoader.getSystemResourceAsStream(name.replace('.', '/')
-                        + ".class"), true));
-    }
-
-    /**
-     * Reads the bytecode of a class.
-     *
-     * @param is
-     *            an input stream from which to read the class.
-     * @param close
-     *            true to close the input stream after reading.
-     * @return the bytecode read from the given input stream.
-     * @throws IOException
-     *             if a problem occurs during reading.
-     */
-    private static byte[] readClass(final InputStream is, boolean close)
-            throws IOException {
-        if (is == null) {
-            throw new IOException("Class not found");
-        }
-        try {
-            byte[] b = new byte[is.available()];
-            int len = 0;
-            while (true) {
-                int n = is.read(b, len, b.length - len);
-                if (n == -1) {
-                    if (len < b.length) {
-                        byte[] c = new byte[len];
-                        System.arraycopy(b, 0, c, 0, len);
-                        b = c;
-                    }
-                    return b;
-                }
-                len += n;
-                if (len == b.length) {
-                    int last = is.read();
-                    if (last < 0) {
-                        return b;
-                    }
-                    byte[] c = new byte[b.length + 1000];
-                    System.arraycopy(b, 0, c, 0, len);
-                    c[len++] = (byte) last;
-                    b = c;
-                }
-            }
-        } finally {
-            if (close) {
-                is.close();
-            }
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Public methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Makes the given visitor visit the Java class of this {@link ClassReader}
-     * . This class is the one specified in the constructor (see
-     * {@link #ClassReader(byte[]) ClassReader}).
-     *
-     * @param classVisitor
-     *            the visitor that must visit this class.
-     * @param flags
-     *            option flags that can be used to modify the default behavior
-     *            of this class. See {@link #SKIP_DEBUG}, {@link #EXPAND_FRAMES}
-     *            , {@link #SKIP_FRAMES}, {@link #SKIP_CODE}.
-     */
-    public void accept(final ClassVisitor classVisitor, final int flags) {
-        accept(classVisitor, new Attribute[0], flags);
-    }
-
-    /**
-     * Makes the given visitor visit the Java class of this {@link ClassReader}.
-     * This class is the one specified in the constructor (see
-     * {@link #ClassReader(byte[]) ClassReader}).
-     *
-     * @param classVisitor
-     *            the visitor that must visit this class.
-     * @param attrs
-     *            prototypes of the attributes that must be parsed during the
-     *            visit of the class. Any attribute whose type is not equal to
-     *            the type of one the prototypes will not be parsed: its byte
-     *            array value will be passed unchanged to the ClassWriter.
-     *            <i>This may corrupt it if this value contains references to
-     *            the constant pool, or has syntactic or semantic links with a
-     *            class element that has been transformed by a class adapter
-     *            between the reader and the writer</i>.
-     * @param flags
-     *            option flags that can be used to modify the default behavior
-     *            of this class. See {@link #SKIP_DEBUG}, {@link #EXPAND_FRAMES}
-     *            , {@link #SKIP_FRAMES}, {@link #SKIP_CODE}.
-     */
-    public void accept(final ClassVisitor classVisitor,
-            final Attribute[] attrs, final int flags) {
-        int u = header; // current offset in the class file
-        char[] c = new char[maxStringLength]; // buffer used to read strings
-
-        Context context = new Context();
-        context.attrs = attrs;
-        context.flags = flags;
-        context.buffer = c;
-
-        // reads the class declaration
-        int access = readUnsignedShort(u);
-        String name = readClass(u + 2, c);
-        String superClass = readClass(u + 4, c);
-        String[] interfaces = new String[readUnsignedShort(u + 6)];
-        u += 8;
-        for (int i = 0; i < interfaces.length; ++i) {
-            interfaces[i] = readClass(u, c);
-            u += 2;
-        }
-
-        // reads the class attributes
-        String signature = null;
-        String sourceFile = null;
-        String sourceDebug = null;
-        String enclosingOwner = null;
-        String enclosingName = null;
-        String enclosingDesc = null;
-        int anns = 0;
-        int ianns = 0;
-        int tanns = 0;
-        int itanns = 0;
-        int innerClasses = 0;
-        Attribute attributes = null;
-
-        u = getAttributes();
-        for (int i = readUnsignedShort(u); i > 0; --i) {
-            String attrName = readUTF8(u + 2, c);
-            // tests are sorted in decreasing frequency order
-            // (based on frequencies observed on typical classes)
-            if ("SourceFile".equals(attrName)) {
-                sourceFile = readUTF8(u + 8, c);
-            } else if ("InnerClasses".equals(attrName)) {
-                innerClasses = u + 8;
-            } else if ("EnclosingMethod".equals(attrName)) {
-                enclosingOwner = readClass(u + 8, c);
-                int item = readUnsignedShort(u + 10);
-                if (item != 0) {
-                    enclosingName = readUTF8(items[item], c);
-                    enclosingDesc = readUTF8(items[item] + 2, c);
-                }
-            } else if (SIGNATURES && "Signature".equals(attrName)) {
-                signature = readUTF8(u + 8, c);
-            } else if (ANNOTATIONS
-                    && "RuntimeVisibleAnnotations".equals(attrName)) {
-                anns = u + 8;
-            } else if (ANNOTATIONS
-                    && "RuntimeVisibleTypeAnnotations".equals(attrName)) {
-                tanns = u + 8;
-            } else if ("Deprecated".equals(attrName)) {
-                access |= Opcodes.ACC_DEPRECATED;
-            } else if ("Synthetic".equals(attrName)) {
-                access |= Opcodes.ACC_SYNTHETIC
-                        | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
-            } else if ("SourceDebugExtension".equals(attrName)) {
-                int len = readInt(u + 4);
-                sourceDebug = readUTF(u + 8, len, new char[len]);
-            } else if (ANNOTATIONS
-                    && "RuntimeInvisibleAnnotations".equals(attrName)) {
-                ianns = u + 8;
-            } else if (ANNOTATIONS
-                    && "RuntimeInvisibleTypeAnnotations".equals(attrName)) {
-                itanns = u + 8;
-            } else if ("BootstrapMethods".equals(attrName)) {
-                int[] bootstrapMethods = new int[readUnsignedShort(u + 8)];
-                for (int j = 0, v = u + 10; j < bootstrapMethods.length; j++) {
-                    bootstrapMethods[j] = v;
-                    v += 2 + readUnsignedShort(v + 2) << 1;
-                }
-                context.bootstrapMethods = bootstrapMethods;
-            } else {
-                Attribute attr = readAttribute(attrs, attrName, u + 8,
-                        readInt(u + 4), c, -1, null);
-                if (attr != null) {
-                    attr.next = attributes;
-                    attributes = attr;
-                }
-            }
-            u += 6 + readInt(u + 4);
-        }
-
-        // visits the class declaration
-        classVisitor.visit(readInt(items[1] - 7), access, name, signature,
-                superClass, interfaces);
-
-        // visits the source and debug info
-        if ((flags & SKIP_DEBUG) == 0
-                && (sourceFile != null || sourceDebug != null)) {
-            classVisitor.visitSource(sourceFile, sourceDebug);
-        }
-
-        // visits the outer class
-        if (enclosingOwner != null) {
-            classVisitor.visitOuterClass(enclosingOwner, enclosingName,
-                    enclosingDesc);
-        }
-
-        // visits the class annotations and type annotations
-        if (ANNOTATIONS && anns != 0) {
-            for (int i = readUnsignedShort(anns), v = anns + 2; i > 0; --i) {
-                v = readAnnotationValues(v + 2, c, true,
-                        classVisitor.visitAnnotation(readUTF8(v, c), true));
-            }
-        }
-        if (ANNOTATIONS && ianns != 0) {
-            for (int i = readUnsignedShort(ianns), v = ianns + 2; i > 0; --i) {
-                v = readAnnotationValues(v + 2, c, true,
-                        classVisitor.visitAnnotation(readUTF8(v, c), false));
-            }
-        }
-        if (ANNOTATIONS && tanns != 0) {
-            for (int i = readUnsignedShort(tanns), v = tanns + 2; i > 0; --i) {
-                v = readAnnotationTarget(context, v);
-                v = readAnnotationValues(v + 2, c, true,
-                        classVisitor.visitTypeAnnotation(context.typeRef,
-                                context.typePath, readUTF8(v, c), true));
-            }
-        }
-        if (ANNOTATIONS && itanns != 0) {
-            for (int i = readUnsignedShort(itanns), v = itanns + 2; i > 0; --i) {
-                v = readAnnotationTarget(context, v);
-                v = readAnnotationValues(v + 2, c, true,
-                        classVisitor.visitTypeAnnotation(context.typeRef,
-                                context.typePath, readUTF8(v, c), false));
-            }
-        }
-
-        // visits the attributes
-        while (attributes != null) {
-            Attribute attr = attributes.next;
-            attributes.next = null;
-            classVisitor.visitAttribute(attributes);
-            attributes = attr;
-        }
-
-        // visits the inner classes
-        if (innerClasses != 0) {
-            int v = innerClasses + 2;
-            for (int i = readUnsignedShort(innerClasses); i > 0; --i) {
-                classVisitor.visitInnerClass(readClass(v, c),
-                        readClass(v + 2, c), readUTF8(v + 4, c),
-                        readUnsignedShort(v + 6));
-                v += 8;
-            }
-        }
-
-        // visits the fields and methods
-        u = header + 10 + 2 * interfaces.length;
-        for (int i = readUnsignedShort(u - 2); i > 0; --i) {
-            u = readField(classVisitor, context, u);
-        }
-        u += 2;
-        for (int i = readUnsignedShort(u - 2); i > 0; --i) {
-            u = readMethod(classVisitor, context, u);
-        }
-
-        // visits the end of the class
-        classVisitor.visitEnd();
-    }
-
-    /**
-     * Reads a field and makes the given visitor visit it.
-     *
-     * @param classVisitor
-     *            the visitor that must visit the field.
-     * @param context
-     *            information about the class being parsed.
-     * @param u
-     *            the start offset of the field in the class file.
-     * @return the offset of the first byte following the field in the class.
-     */
-    private int readField(final ClassVisitor classVisitor,
-            final Context context, int u) {
-        // reads the field declaration
-        char[] c = context.buffer;
-        int access = readUnsignedShort(u);
-        String name = readUTF8(u + 2, c);
-        String desc = readUTF8(u + 4, c);
-        u += 6;
-
-        // reads the field attributes
-        String signature = null;
-        int anns = 0;
-        int ianns = 0;
-        int tanns = 0;
-        int itanns = 0;
-        Object value = null;
-        Attribute attributes = null;
-
-        for (int i = readUnsignedShort(u); i > 0; --i) {
-            String attrName = readUTF8(u + 2, c);
-            // tests are sorted in decreasing frequency order
-            // (based on frequencies observed on typical classes)
-            if ("ConstantValue".equals(attrName)) {
-                int item = readUnsignedShort(u + 8);
-                value = item == 0 ? null : readConst(item, c);
-            } else if (SIGNATURES && "Signature".equals(attrName)) {
-                signature = readUTF8(u + 8, c);
-            } else if ("Deprecated".equals(attrName)) {
-                access |= Opcodes.ACC_DEPRECATED;
-            } else if ("Synthetic".equals(attrName)) {
-                access |= Opcodes.ACC_SYNTHETIC
-                        | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
-            } else if (ANNOTATIONS
-                    && "RuntimeVisibleAnnotations".equals(attrName)) {
-                anns = u + 8;
-            } else if (ANNOTATIONS
-                    && "RuntimeVisibleTypeAnnotations".equals(attrName)) {
-                tanns = u + 8;
-            } else if (ANNOTATIONS
-                    && "RuntimeInvisibleAnnotations".equals(attrName)) {
-                ianns = u + 8;
-            } else if (ANNOTATIONS
-                    && "RuntimeInvisibleTypeAnnotations".equals(attrName)) {
-                itanns = u + 8;
-            } else {
-                Attribute attr = readAttribute(context.attrs, attrName, u + 8,
-                        readInt(u + 4), c, -1, null);
-                if (attr != null) {
-                    attr.next = attributes;
-                    attributes = attr;
-                }
-            }
-            u += 6 + readInt(u + 4);
-        }
-        u += 2;
-
-        // visits the field declaration
-        FieldVisitor fv = classVisitor.visitField(access, name, desc,
-                signature, value);
-        if (fv == null) {
-            return u;
-        }
-
-        // visits the field annotations and type annotations
-        if (ANNOTATIONS && anns != 0) {
-            for (int i = readUnsignedShort(anns), v = anns + 2; i > 0; --i) {
-                v = readAnnotationValues(v + 2, c, true,
-                        fv.visitAnnotation(readUTF8(v, c), true));
-            }
-        }
-        if (ANNOTATIONS && ianns != 0) {
-            for (int i = readUnsignedShort(ianns), v = ianns + 2; i > 0; --i) {
-                v = readAnnotationValues(v + 2, c, true,
-                        fv.visitAnnotation(readUTF8(v, c), false));
-            }
-        }
-        if (ANNOTATIONS && tanns != 0) {
-            for (int i = readUnsignedShort(tanns), v = tanns + 2; i > 0; --i) {
-                v = readAnnotationTarget(context, v);
-                v = readAnnotationValues(v + 2, c, true,
-                        fv.visitTypeAnnotation(context.typeRef,
-                                context.typePath, readUTF8(v, c), true));
-            }
-        }
-        if (ANNOTATIONS && itanns != 0) {
-            for (int i = readUnsignedShort(itanns), v = itanns + 2; i > 0; --i) {
-                v = readAnnotationTarget(context, v);
-                v = readAnnotationValues(v + 2, c, true,
-                        fv.visitTypeAnnotation(context.typeRef,
-                                context.typePath, readUTF8(v, c), false));
-            }
-        }
-
-        // visits the field attributes
-        while (attributes != null) {
-            Attribute attr = attributes.next;
-            attributes.next = null;
-            fv.visitAttribute(attributes);
-            attributes = attr;
-        }
-
-        // visits the end of the field
-        fv.visitEnd();
-
-        return u;
-    }
-
-    /**
-     * Reads a method and makes the given visitor visit it.
-     *
-     * @param classVisitor
-     *            the visitor that must visit the method.
-     * @param context
-     *            information about the class being parsed.
-     * @param u
-     *            the start offset of the method in the class file.
-     * @return the offset of the first byte following the method in the class.
-     */
-    private int readMethod(final ClassVisitor classVisitor,
-            final Context context, int u) {
-        // reads the method declaration
-        char[] c = context.buffer;
-        context.access = readUnsignedShort(u);
-        context.name = readUTF8(u + 2, c);
-        context.desc = readUTF8(u + 4, c);
-        u += 6;
-
-        // reads the method attributes
-        int code = 0;
-        int exception = 0;
-        String[] exceptions = null;
-        String signature = null;
-        int methodParameters = 0;
-        int anns = 0;
-        int ianns = 0;
-        int tanns = 0;
-        int itanns = 0;
-        int dann = 0;
-        int mpanns = 0;
-        int impanns = 0;
-        int firstAttribute = u;
-        Attribute attributes = null;
-
-        for (int i = readUnsignedShort(u); i > 0; --i) {
-            String attrName = readUTF8(u + 2, c);
-            // tests are sorted in decreasing frequency order
-            // (based on frequencies observed on typical classes)
-            if ("Code".equals(attrName)) {
-                if ((context.flags & SKIP_CODE) == 0) {
-                    code = u + 8;
-                }
-            } else if ("Exceptions".equals(attrName)) {
-                exceptions = new String[readUnsignedShort(u + 8)];
-                exception = u + 10;
-                for (int j = 0; j < exceptions.length; ++j) {
-                    exceptions[j] = readClass(exception, c);
-                    exception += 2;
-                }
-            } else if (SIGNATURES && "Signature".equals(attrName)) {
-                signature = readUTF8(u + 8, c);
-            } else if ("Deprecated".equals(attrName)) {
-                context.access |= Opcodes.ACC_DEPRECATED;
-            } else if (ANNOTATIONS
-                    && "RuntimeVisibleAnnotations".equals(attrName)) {
-                anns = u + 8;
-            } else if (ANNOTATIONS
-                    && "RuntimeVisibleTypeAnnotations".equals(attrName)) {
-                tanns = u + 8;
-            } else if (ANNOTATIONS && "AnnotationDefault".equals(attrName)) {
-                dann = u + 8;
-            } else if ("Synthetic".equals(attrName)) {
-                context.access |= Opcodes.ACC_SYNTHETIC
-                        | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
-            } else if (ANNOTATIONS
-                    && "RuntimeInvisibleAnnotations".equals(attrName)) {
-                ianns = u + 8;
-            } else if (ANNOTATIONS
-                    && "RuntimeInvisibleTypeAnnotations".equals(attrName)) {
-                itanns = u + 8;
-            } else if (ANNOTATIONS
-                    && "RuntimeVisibleParameterAnnotations".equals(attrName)) {
-                mpanns = u + 8;
-            } else if (ANNOTATIONS
-                    && "RuntimeInvisibleParameterAnnotations".equals(attrName)) {
-                impanns = u + 8;
-            } else if ("MethodParameters".equals(attrName)) {
-                methodParameters = u + 8;
-            } else {
-                Attribute attr = readAttribute(context.attrs, attrName, u + 8,
-                        readInt(u + 4), c, -1, null);
-                if (attr != null) {
-                    attr.next = attributes;
-                    attributes = attr;
-                }
-            }
-            u += 6 + readInt(u + 4);
-        }
-        u += 2;
-
-        // visits the method declaration
-        MethodVisitor mv = classVisitor.visitMethod(context.access,
-                context.name, context.desc, signature, exceptions);
-        if (mv == null) {
-            return u;
-        }
-
-        /*
-         * if the returned MethodVisitor is in fact a MethodWriter, it means
-         * there is no method adapter between the reader and the writer. If, in
-         * addition, the writer's constant pool was copied from this reader
-         * (mw.cw.cr == this), and the signature and exceptions of the method
-         * have not been changed, then it is possible to skip all visit events
-         * and just copy the original code of the method to the writer (the
-         * access, name and descriptor can have been changed, this is not
-         * important since they are not copied as is from the reader).
-         */
-        if (WRITER && mv instanceof MethodWriter) {
-            MethodWriter mw = (MethodWriter) mv;
-            if (mw.cw.cr == this && signature == mw.signature) {
-                boolean sameExceptions = false;
-                if (exceptions == null) {
-                    sameExceptions = mw.exceptionCount == 0;
-                } else if (exceptions.length == mw.exceptionCount) {
-                    sameExceptions = true;
-                    for (int j = exceptions.length - 1; j >= 0; --j) {
-                        exception -= 2;
-                        if (mw.exceptions[j] != readUnsignedShort(exception)) {
-                            sameExceptions = false;
-                            break;
-                        }
-                    }
-                }
-                if (sameExceptions) {
-                    /*
-                     * we do not copy directly the code into MethodWriter to
-                     * save a byte array copy operation. The real copy will be
-                     * done in ClassWriter.toByteArray().
-                     */
-                    mw.classReaderOffset = firstAttribute;
-                    mw.classReaderLength = u - firstAttribute;
-                    return u;
-                }
-            }
-        }
-
-        // visit the method parameters
-        if (methodParameters != 0) {
-            for (int i = b[methodParameters] & 0xFF, v = methodParameters + 1; i > 0; --i, v = v + 4) {
-                mv.visitParameter(readUTF8(v, c), readUnsignedShort(v + 2));
-            }
-        }
-
-        // visits the method annotations
-        if (ANNOTATIONS && dann != 0) {
-            AnnotationVisitor dv = mv.visitAnnotationDefault();
-            readAnnotationValue(dann, c, null, dv);
-            if (dv != null) {
-                dv.visitEnd();
-            }
-        }
-        if (ANNOTATIONS && anns != 0) {
-            for (int i = readUnsignedShort(anns), v = anns + 2; i > 0; --i) {
-                v = readAnnotationValues(v + 2, c, true,
-                        mv.visitAnnotation(readUTF8(v, c), true));
-            }
-        }
-        if (ANNOTATIONS && ianns != 0) {
-            for (int i = readUnsignedShort(ianns), v = ianns + 2; i > 0; --i) {
-                v = readAnnotationValues(v + 2, c, true,
-                        mv.visitAnnotation(readUTF8(v, c), false));
-            }
-        }
-        if (ANNOTATIONS && tanns != 0) {
-            for (int i = readUnsignedShort(tanns), v = tanns + 2; i > 0; --i) {
-                v = readAnnotationTarget(context, v);
-                v = readAnnotationValues(v + 2, c, true,
-                        mv.visitTypeAnnotation(context.typeRef,
-                                context.typePath, readUTF8(v, c), true));
-            }
-        }
-        if (ANNOTATIONS && itanns != 0) {
-            for (int i = readUnsignedShort(itanns), v = itanns + 2; i > 0; --i) {
-                v = readAnnotationTarget(context, v);
-                v = readAnnotationValues(v + 2, c, true,
-                        mv.visitTypeAnnotation(context.typeRef,
-                                context.typePath, readUTF8(v, c), false));
-            }
-        }
-        if (ANNOTATIONS && mpanns != 0) {
-            readParameterAnnotations(mv, context, mpanns, true);
-        }
-        if (ANNOTATIONS && impanns != 0) {
-            readParameterAnnotations(mv, context, impanns, false);
-        }
-
-        // visits the method attributes
-        while (attributes != null) {
-            Attribute attr = attributes.next;
-            attributes.next = null;
-            mv.visitAttribute(attributes);
-            attributes = attr;
-        }
-
-        // visits the method code
-        if (code != 0) {
-            mv.visitCode();
-            readCode(mv, context, code);
-        }
-
-        // visits the end of the method
-        mv.visitEnd();
-
-        return u;
-    }
-
-    /**
-     * Reads the bytecode of a method and makes the given visitor visit it.
-     *
-     * @param mv
-     *            the visitor that must visit the method's code.
-     * @param context
-     *            information about the class being parsed.
-     * @param u
-     *            the start offset of the code attribute in the class file.
-     */
-    private void readCode(final MethodVisitor mv, final Context context, int u) {
-        // reads the header
-        byte[] b = this.b;
-        char[] c = context.buffer;
-        int maxStack = readUnsignedShort(u);
-        int maxLocals = readUnsignedShort(u + 2);
-        int codeLength = readInt(u + 4);
-        u += 8;
-
-        // reads the bytecode to find the labels
-        int codeStart = u;
-        int codeEnd = u + codeLength;
-        Label[] labels = context.labels = new Label[codeLength + 2];
-        readLabel(codeLength + 1, labels);
-        while (u < codeEnd) {
-            int offset = u - codeStart;
-            int opcode = b[u] & 0xFF;
-            switch (ClassWriter.TYPE[opcode]) {
-            case ClassWriter.NOARG_INSN:
-            case ClassWriter.IMPLVAR_INSN:
-                u += 1;
-                break;
-            case ClassWriter.LABEL_INSN:
-                readLabel(offset + readShort(u + 1), labels);
-                u += 3;
-                break;
-            case ClassWriter.LABELW_INSN:
-                readLabel(offset + readInt(u + 1), labels);
-                u += 5;
-                break;
-            case ClassWriter.WIDE_INSN:
-                opcode = b[u + 1] & 0xFF;
-                if (opcode == Opcodes.IINC) {
-                    u += 6;
-                } else {
-                    u += 4;
-                }
-                break;
-            case ClassWriter.TABL_INSN:
-                // skips 0 to 3 padding bytes
-                u = u + 4 - (offset & 3);
-                // reads instruction
-                readLabel(offset + readInt(u), labels);
-                for (int i = readInt(u + 8) - readInt(u + 4) + 1; i > 0; --i) {
-                    readLabel(offset + readInt(u + 12), labels);
-                    u += 4;
-                }
-                u += 12;
-                break;
-            case ClassWriter.LOOK_INSN:
-                // skips 0 to 3 padding bytes
-                u = u + 4 - (offset & 3);
-                // reads instruction
-                readLabel(offset + readInt(u), labels);
-                for (int i = readInt(u + 4); i > 0; --i) {
-                    readLabel(offset + readInt(u + 12), labels);
-                    u += 8;
-                }
-                u += 8;
-                break;
-            case ClassWriter.VAR_INSN:
-            case ClassWriter.SBYTE_INSN:
-            case ClassWriter.LDC_INSN:
-                u += 2;
-                break;
-            case ClassWriter.SHORT_INSN:
-            case ClassWriter.LDCW_INSN:
-            case ClassWriter.FIELDORMETH_INSN:
-            case ClassWriter.TYPE_INSN:
-            case ClassWriter.IINC_INSN:
-                u += 3;
-                break;
-            case ClassWriter.ITFMETH_INSN:
-            case ClassWriter.INDYMETH_INSN:
-                u += 5;
-                break;
-            // case MANA_INSN:
-            default:
-                u += 4;
-                break;
-            }
-        }
-
-        // reads the try catch entries to find the labels, and also visits them
-        for (int i = readUnsignedShort(u); i > 0; --i) {
-            Label start = readLabel(readUnsignedShort(u + 2), labels);
-            Label end = readLabel(readUnsignedShort(u + 4), labels);
-            Label handler = readLabel(readUnsignedShort(u + 6), labels);
-            String type = readUTF8(items[readUnsignedShort(u + 8)], c);
-            mv.visitTryCatchBlock(start, end, handler, type);
-            u += 8;
-        }
-        u += 2;
-
-        // reads the code attributes
-        int[] tanns = null; // start index of each visible type annotation
-        int[] itanns = null; // start index of each invisible type annotation
-        int tann = 0; // current index in tanns array
-        int itann = 0; // current index in itanns array
-        int ntoff = -1; // next visible type annotation code offset
-        int nitoff = -1; // next invisible type annotation code offset
-        int varTable = 0;
-        int varTypeTable = 0;
-        boolean zip = true;
-        boolean unzip = (context.flags & EXPAND_FRAMES) != 0;
-        int stackMap = 0;
-        int stackMapSize = 0;
-        int frameCount = 0;
-        Context frame = null;
-        Attribute attributes = null;
-
-        for (int i = readUnsignedShort(u); i > 0; --i) {
-            String attrName = readUTF8(u + 2, c);
-            if ("LocalVariableTable".equals(attrName)) {
-                if ((context.flags & SKIP_DEBUG) == 0) {
-                    varTable = u + 8;
-                    for (int j = readUnsignedShort(u + 8), v = u; j > 0; --j) {
-                        int label = readUnsignedShort(v + 10);
-                        if (labels[label] == null) {
-                            readLabel(label, labels).status |= Label.DEBUG;
-                        }
-                        label += readUnsignedShort(v + 12);
-                        if (labels[label] == null) {
-                            readLabel(label, labels).status |= Label.DEBUG;
-                        }
-                        v += 10;
-                    }
-                }
-            } else if ("LocalVariableTypeTable".equals(attrName)) {
-                varTypeTable = u + 8;
-            } else if ("LineNumberTable".equals(attrName)) {
-                if ((context.flags & SKIP_DEBUG) == 0) {
-                    for (int j = readUnsignedShort(u + 8), v = u; j > 0; --j) {
-                        int label = readUnsignedShort(v + 10);
-                        if (labels[label] == null) {
-                            readLabel(label, labels).status |= Label.DEBUG;
-                        }
-                        labels[label].line = readUnsignedShort(v + 12);
-                        v += 4;
-                    }
-                }
-            } else if (ANNOTATIONS
-                    && "RuntimeVisibleTypeAnnotations".equals(attrName)) {
-                tanns = readTypeAnnotations(mv, context, u + 8, true);
-                ntoff = tanns.length == 0 || readByte(tanns[0]) < 0x43 ? -1
-                        : readUnsignedShort(tanns[0] + 1);
-            } else if (ANNOTATIONS
-                    && "RuntimeInvisibleTypeAnnotations".equals(attrName)) {
-                itanns = readTypeAnnotations(mv, context, u + 8, false);
-                nitoff = itanns.length == 0 || readByte(itanns[0]) < 0x43 ? -1
-                        : readUnsignedShort(itanns[0] + 1);
-            } else if (FRAMES && "StackMapTable".equals(attrName)) {
-                if ((context.flags & SKIP_FRAMES) == 0) {
-                    stackMap = u + 10;
-                    stackMapSize = readInt(u + 4);
-                    frameCount = readUnsignedShort(u + 8);
-                }
-                /*
-                 * here we do not extract the labels corresponding to the
-                 * attribute content. This would require a full parsing of the
-                 * attribute, which would need to be repeated in the second
-                 * phase (see below). Instead the content of the attribute is
-                 * read one frame at a time (i.e. after a frame has been
-                 * visited, the next frame is read), and the labels it contains
-                 * are also extracted one frame at a time. Thanks to the
-                 * ordering of frames, having only a "one frame lookahead" is
-                 * not a problem, i.e. it is not possible to see an offset
-                 * smaller than the offset of the current insn and for which no
-                 * Label exist.
-                 */
-                /*
-                 * This is not true for UNINITIALIZED type offsets. We solve
-                 * this by parsing the stack map table without a full decoding
-                 * (see below).
-                 */
-            } else if (FRAMES && "StackMap".equals(attrName)) {
-                if ((context.flags & SKIP_FRAMES) == 0) {
-                    zip = false;
-                    stackMap = u + 10;
-                    stackMapSize = readInt(u + 4);
-                    frameCount = readUnsignedShort(u + 8);
-                }
-                /*
-                 * IMPORTANT! here we assume that the frames are ordered, as in
-                 * the StackMapTable attribute, although this is not guaranteed
-                 * by the attribute format.
-                 */
-            } else {
-                for (int j = 0; j < context.attrs.length; ++j) {
-                    if (context.attrs[j].type.equals(attrName)) {
-                        Attribute attr = context.attrs[j].read(this, u + 8,
-                                readInt(u + 4), c, codeStart - 8, labels);
-                        if (attr != null) {
-                            attr.next = attributes;
-                            attributes = attr;
-                        }
-                    }
-                }
-            }
-            u += 6 + readInt(u + 4);
-        }
-        u += 2;
-
-        // generates the first (implicit) stack map frame
-        if (FRAMES && stackMap != 0) {
-            /*
-             * for the first explicit frame the offset is not offset_delta + 1
-             * but only offset_delta; setting the implicit frame offset to -1
-             * allow the use of the "offset_delta + 1" rule in all cases
-             */
-            frame = context;
-            frame.offset = -1;
-            frame.mode = 0;
-            frame.localCount = 0;
-            frame.localDiff = 0;
-            frame.stackCount = 0;
-            frame.local = new Object[maxLocals];
-            frame.stack = new Object[maxStack];
-            if (unzip) {
-                getImplicitFrame(context);
-            }
-            /*
-             * Finds labels for UNINITIALIZED frame types. Instead of decoding
-             * each element of the stack map table, we look for 3 consecutive
-             * bytes that "look like" an UNINITIALIZED type (tag 8, offset
-             * within code bounds, NEW instruction at this offset). We may find
-             * false positives (i.e. not real UNINITIALIZED types), but this
-             * should be rare, and the only consequence will be the creation of
-             * an unneeded label. This is better than creating a label for each
-             * NEW instruction, and faster than fully decoding the whole stack
-             * map table.
-             */
-            for (int i = stackMap; i < stackMap + stackMapSize - 2; ++i) {
-                if (b[i] == 8) { // UNINITIALIZED FRAME TYPE
-                    int v = readUnsignedShort(i + 1);
-                    if (v >= 0 && v < codeLength) {
-                        if ((b[codeStart + v] & 0xFF) == Opcodes.NEW) {
-                            readLabel(v, labels);
-                        }
-                    }
-                }
-            }
-        }
-
-        // visits the instructions
-        u = codeStart;
-        while (u < codeEnd) {
-            int offset = u - codeStart;
-
-            // visits the label and line number for this offset, if any
-            Label l = labels[offset];
-            if (l != null) {
-                mv.visitLabel(l);
-                if ((context.flags & SKIP_DEBUG) == 0 && l.line > 0) {
-                    mv.visitLineNumber(l.line, l);
-                }
-            }
-
-            // visits the frame for this offset, if any
-            while (FRAMES && frame != null
-                    && (frame.offset == offset || frame.offset == -1)) {
-                // if there is a frame for this offset, makes the visitor visit
-                // it, and reads the next frame if there is one.
-                if (frame.offset != -1) {
-                    if (!zip || unzip) {
-                        mv.visitFrame(Opcodes.F_NEW, frame.localCount,
-                                frame.local, frame.stackCount, frame.stack);
-                    } else {
-                        mv.visitFrame(frame.mode, frame.localDiff, frame.local,
-                                frame.stackCount, frame.stack);
-                    }
-                }
-                if (frameCount > 0) {
-                    stackMap = readFrame(stackMap, zip, unzip, frame);
-                    --frameCount;
-                } else {
-                    frame = null;
-                }
-            }
-
-            // visits the instruction at this offset
-            int opcode = b[u] & 0xFF;
-            switch (ClassWriter.TYPE[opcode]) {
-            case ClassWriter.NOARG_INSN:
-                mv.visitInsn(opcode);
-                u += 1;
-                break;
-            case ClassWriter.IMPLVAR_INSN:
-                if (opcode > Opcodes.ISTORE) {
-                    opcode -= 59; // ISTORE_0
-                    mv.visitVarInsn(Opcodes.ISTORE + (opcode >> 2),
-                            opcode & 0x3);
-                } else {
-                    opcode -= 26; // ILOAD_0
-                    mv.visitVarInsn(Opcodes.ILOAD + (opcode >> 2), opcode & 0x3);
-                }
-                u += 1;
-                break;
-            case ClassWriter.LABEL_INSN:
-                mv.visitJumpInsn(opcode, labels[offset + readShort(u + 1)]);
-                u += 3;
-                break;
-            case ClassWriter.LABELW_INSN:
-                mv.visitJumpInsn(opcode - 33, labels[offset + readInt(u + 1)]);
-                u += 5;
-                break;
-            case ClassWriter.WIDE_INSN:
-                opcode = b[u + 1] & 0xFF;
-                if (opcode == Opcodes.IINC) {
-                    mv.visitIincInsn(readUnsignedShort(u + 2), readShort(u + 4));
-                    u += 6;
-                } else {
-                    mv.visitVarInsn(opcode, readUnsignedShort(u + 2));
-                    u += 4;
-                }
-                break;
-            case ClassWriter.TABL_INSN: {
-                // skips 0 to 3 padding bytes
-                u = u + 4 - (offset & 3);
-                // reads instruction
-                int label = offset + readInt(u);
-                int min = readInt(u + 4);
-                int max = readInt(u + 8);
-                Label[] table = new Label[max - min + 1];
-                u += 12;
-                for (int i = 0; i < table.length; ++i) {
-                    table[i] = labels[offset + readInt(u)];
-                    u += 4;
-                }
-                mv.visitTableSwitchInsn(min, max, labels[label], table);
-                break;
-            }
-            case ClassWriter.LOOK_INSN: {
-                // skips 0 to 3 padding bytes
-                u = u + 4 - (offset & 3);
-                // reads instruction
-                int label = offset + readInt(u);
-                int len = readInt(u + 4);
-                int[] keys = new int[len];
-                Label[] values = new Label[len];
-                u += 8;
-                for (int i = 0; i < len; ++i) {
-                    keys[i] = readInt(u);
-                    values[i] = labels[offset + readInt(u + 4)];
-                    u += 8;
-                }
-                mv.visitLookupSwitchInsn(labels[label], keys, values);
-                break;
-            }
-            case ClassWriter.VAR_INSN:
-                mv.visitVarInsn(opcode, b[u + 1] & 0xFF);
-                u += 2;
-                break;
-            case ClassWriter.SBYTE_INSN:
-                mv.visitIntInsn(opcode, b[u + 1]);
-                u += 2;
-                break;
-            case ClassWriter.SHORT_INSN:
-                mv.visitIntInsn(opcode, readShort(u + 1));
-                u += 3;
-                break;
-            case ClassWriter.LDC_INSN:
-                mv.visitLdcInsn(readConst(b[u + 1] & 0xFF, c));
-                u += 2;
-                break;
-            case ClassWriter.LDCW_INSN:
-                mv.visitLdcInsn(readConst(readUnsignedShort(u + 1), c));
-                u += 3;
-                break;
-            case ClassWriter.FIELDORMETH_INSN:
-            case ClassWriter.ITFMETH_INSN: {
-                int cpIndex = items[readUnsignedShort(u + 1)];
-                boolean itf = b[cpIndex - 1] == ClassWriter.IMETH;
-                String iowner = readClass(cpIndex, c);
-                cpIndex = items[readUnsignedShort(cpIndex + 2)];
-                String iname = readUTF8(cpIndex, c);
-                String idesc = readUTF8(cpIndex + 2, c);
-                if (opcode < Opcodes.INVOKEVIRTUAL) {
-                    mv.visitFieldInsn(opcode, iowner, iname, idesc);
-                } else {
-                    mv.visitMethodInsn(opcode, iowner, iname, idesc, itf);
-                }
-                if (opcode == Opcodes.INVOKEINTERFACE) {
-                    u += 5;
-                } else {
-                    u += 3;
-                }
-                break;
-            }
-            case ClassWriter.INDYMETH_INSN: {
-                int cpIndex = items[readUnsignedShort(u + 1)];
-                int bsmIndex = context.bootstrapMethods[readUnsignedShort(cpIndex)];
-                Handle bsm = (Handle) readConst(readUnsignedShort(bsmIndex), c);
-                int bsmArgCount = readUnsignedShort(bsmIndex + 2);
-                Object[] bsmArgs = new Object[bsmArgCount];
-                bsmIndex += 4;
-                for (int i = 0; i < bsmArgCount; i++) {
-                    bsmArgs[i] = readConst(readUnsignedShort(bsmIndex), c);
-                    bsmIndex += 2;
-                }
-                cpIndex = items[readUnsignedShort(cpIndex + 2)];
-                String iname = readUTF8(cpIndex, c);
-                String idesc = readUTF8(cpIndex + 2, c);
-                mv.visitInvokeDynamicInsn(iname, idesc, bsm, bsmArgs);
-                u += 5;
-                break;
-            }
-            case ClassWriter.TYPE_INSN:
-                mv.visitTypeInsn(opcode, readClass(u + 1, c));
-                u += 3;
-                break;
-            case ClassWriter.IINC_INSN:
-                mv.visitIincInsn(b[u + 1] & 0xFF, b[u + 2]);
-                u += 3;
-                break;
-            // case MANA_INSN:
-            default:
-                mv.visitMultiANewArrayInsn(readClass(u + 1, c), b[u + 3] & 0xFF);
-                u += 4;
-                break;
-            }
-
-            // visit the instruction annotations, if any
-            while (tanns != null && tann < tanns.length && ntoff <= offset) {
-                if (ntoff == offset) {
-                    int v = readAnnotationTarget(context, tanns[tann]);
-                    readAnnotationValues(v + 2, c, true,
-                            mv.visitInsnAnnotation(context.typeRef,
-                                    context.typePath, readUTF8(v, c), true));
-                }
-                ntoff = ++tann >= tanns.length || readByte(tanns[tann]) < 0x43 ? -1
-                        : readUnsignedShort(tanns[tann] + 1);
-            }
-            while (itanns != null && itann < itanns.length && nitoff <= offset) {
-                if (nitoff == offset) {
-                    int v = readAnnotationTarget(context, itanns[itann]);
-                    readAnnotationValues(v + 2, c, true,
-                            mv.visitInsnAnnotation(context.typeRef,
-                                    context.typePath, readUTF8(v, c), false));
-                }
-                nitoff = ++itann >= itanns.length
-                        || readByte(itanns[itann]) < 0x43 ? -1
-                        : readUnsignedShort(itanns[itann] + 1);
-            }
-        }
-        if (labels[codeLength] != null) {
-            mv.visitLabel(labels[codeLength]);
-        }
-
-        // visits the local variable tables
-        if ((context.flags & SKIP_DEBUG) == 0 && varTable != 0) {
-            int[] typeTable = null;
-            if (varTypeTable != 0) {
-                u = varTypeTable + 2;
-                typeTable = new int[readUnsignedShort(varTypeTable) * 3];
-                for (int i = typeTable.length; i > 0;) {
-                    typeTable[--i] = u + 6; // signature
-                    typeTable[--i] = readUnsignedShort(u + 8); // index
-                    typeTable[--i] = readUnsignedShort(u); // start
-                    u += 10;
-                }
-            }
-            u = varTable + 2;
-            for (int i = readUnsignedShort(varTable); i > 0; --i) {
-                int start = readUnsignedShort(u);
-                int length = readUnsignedShort(u + 2);
-                int index = readUnsignedShort(u + 8);
-                String vsignature = null;
-                if (typeTable != null) {
-                    for (int j = 0; j < typeTable.length; j += 3) {
-                        if (typeTable[j] == start && typeTable[j + 1] == index) {
-                            vsignature = readUTF8(typeTable[j + 2], c);
-                            break;
-                        }
-                    }
-                }
-                mv.visitLocalVariable(readUTF8(u + 4, c), readUTF8(u + 6, c),
-                        vsignature, labels[start], labels[start + length],
-                        index);
-                u += 10;
-            }
-        }
-
-        // visits the local variables type annotations
-        if (tanns != null) {
-            for (int i = 0; i < tanns.length; ++i) {
-                if ((readByte(tanns[i]) >> 1) == (0x40 >> 1)) {
-                    int v = readAnnotationTarget(context, tanns[i]);
-                    v = readAnnotationValues(v + 2, c, true,
-                            mv.visitLocalVariableAnnotation(context.typeRef,
-                                    context.typePath, context.start,
-                                    context.end, context.index, readUTF8(v, c),
-                                    true));
-                }
-            }
-        }
-        if (itanns != null) {
-            for (int i = 0; i < itanns.length; ++i) {
-                if ((readByte(itanns[i]) >> 1) == (0x40 >> 1)) {
-                    int v = readAnnotationTarget(context, itanns[i]);
-                    v = readAnnotationValues(v + 2, c, true,
-                            mv.visitLocalVariableAnnotation(context.typeRef,
-                                    context.typePath, context.start,
-                                    context.end, context.index, readUTF8(v, c),
-                                    false));
-                }
-            }
-        }
-
-        // visits the code attributes
-        while (attributes != null) {
-            Attribute attr = attributes.next;
-            attributes.next = null;
-            mv.visitAttribute(attributes);
-            attributes = attr;
-        }
-
-        // visits the max stack and max locals values
-        mv.visitMaxs(maxStack, maxLocals);
-    }
-
-    /**
-     * Parses a type annotation table to find the labels, and to visit the try
-     * catch block annotations.
-     *
-     * @param u
-     *            the start offset of a type annotation table.
-     * @param mv
-     *            the method visitor to be used to visit the try catch block
-     *            annotations.
-     * @param context
-     *            information about the class being parsed.
-     * @param visible
-     *            if the type annotation table to parse contains runtime visible
-     *            annotations.
-     * @return the start offset of each type annotation in the parsed table.
-     */
-    private int[] readTypeAnnotations(final MethodVisitor mv,
-            final Context context, int u, boolean visible) {
-        char[] c = context.buffer;
-        int[] offsets = new int[readUnsignedShort(u)];
-        u += 2;
-        for (int i = 0; i < offsets.length; ++i) {
-            offsets[i] = u;
-            int target = readInt(u);
-            switch (target >>> 24) {
-            case 0x00: // CLASS_TYPE_PARAMETER
-            case 0x01: // METHOD_TYPE_PARAMETER
-            case 0x16: // METHOD_FORMAL_PARAMETER
-                u += 2;
-                break;
-            case 0x13: // FIELD
-            case 0x14: // METHOD_RETURN
-            case 0x15: // METHOD_RECEIVER
-                u += 1;
-                break;
-            case 0x40: // LOCAL_VARIABLE
-            case 0x41: // RESOURCE_VARIABLE
-                for (int j = readUnsignedShort(u + 1); j > 0; --j) {
-                    int start = readUnsignedShort(u + 3);
-                    int length = readUnsignedShort(u + 5);
-                    readLabel(start, context.labels);
-                    readLabel(start + length, context.labels);
-                    u += 6;
-                }
-                u += 3;
-                break;
-            case 0x47: // CAST
-            case 0x48: // CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
-            case 0x49: // METHOD_INVOCATION_TYPE_ARGUMENT
-            case 0x4A: // CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
-            case 0x4B: // METHOD_REFERENCE_TYPE_ARGUMENT
-                u += 4;
-                break;
-            // case 0x10: // CLASS_EXTENDS
-            // case 0x11: // CLASS_TYPE_PARAMETER_BOUND
-            // case 0x12: // METHOD_TYPE_PARAMETER_BOUND
-            // case 0x17: // THROWS
-            // case 0x42: // EXCEPTION_PARAMETER
-            // case 0x43: // INSTANCEOF
-            // case 0x44: // NEW
-            // case 0x45: // CONSTRUCTOR_REFERENCE
-            // case 0x46: // METHOD_REFERENCE
-            default:
-                u += 3;
-                break;
-            }
-            int pathLength = readByte(u);
-            if ((target >>> 24) == 0x42) {
-                TypePath path = pathLength == 0 ? null : new TypePath(b, u);
-                u += 1 + 2 * pathLength;
-                u = readAnnotationValues(u + 2, c, true,
-                        mv.visitTryCatchAnnotation(target, path,
-                                readUTF8(u, c), visible));
-            } else {
-                u = readAnnotationValues(u + 3 + 2 * pathLength, c, true, null);
-            }
-        }
-        return offsets;
-    }
-
-    /**
-     * Parses the header of a type annotation to extract its target_type and
-     * target_path (the result is stored in the given context), and returns the
-     * start offset of the rest of the type_annotation structure (i.e. the
-     * offset to the type_index field, which is followed by
-     * num_element_value_pairs and then the name,value pairs).
-     *
-     * @param context
-     *            information about the class being parsed. This is where the
-     *            extracted target_type and target_path must be stored.
-     * @param u
-     *            the start offset of a type_annotation structure.
-     * @return the start offset of the rest of the type_annotation structure.
-     */
-    private int readAnnotationTarget(final Context context, int u) {
-        int target = readInt(u);
-        switch (target >>> 24) {
-        case 0x00: // CLASS_TYPE_PARAMETER
-        case 0x01: // METHOD_TYPE_PARAMETER
-        case 0x16: // METHOD_FORMAL_PARAMETER
-            target &= 0xFFFF0000;
-            u += 2;
-            break;
-        case 0x13: // FIELD
-        case 0x14: // METHOD_RETURN
-        case 0x15: // METHOD_RECEIVER
-            target &= 0xFF000000;
-            u += 1;
-            break;
-        case 0x40: // LOCAL_VARIABLE
-        case 0x41: { // RESOURCE_VARIABLE
-            target &= 0xFF000000;
-            int n = readUnsignedShort(u + 1);
-            context.start = new Label[n];
-            context.end = new Label[n];
-            context.index = new int[n];
-            u += 3;
-            for (int i = 0; i < n; ++i) {
-                int start = readUnsignedShort(u);
-                int length = readUnsignedShort(u + 2);
-                context.start[i] = readLabel(start, context.labels);
-                context.end[i] = readLabel(start + length, context.labels);
-                context.index[i] = readUnsignedShort(u + 4);
-                u += 6;
-            }
-            break;
-        }
-        case 0x47: // CAST
-        case 0x48: // CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
-        case 0x49: // METHOD_INVOCATION_TYPE_ARGUMENT
-        case 0x4A: // CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
-        case 0x4B: // METHOD_REFERENCE_TYPE_ARGUMENT
-            target &= 0xFF0000FF;
-            u += 4;
-            break;
-        // case 0x10: // CLASS_EXTENDS
-        // case 0x11: // CLASS_TYPE_PARAMETER_BOUND
-        // case 0x12: // METHOD_TYPE_PARAMETER_BOUND
-        // case 0x17: // THROWS
-        // case 0x42: // EXCEPTION_PARAMETER
-        // case 0x43: // INSTANCEOF
-        // case 0x44: // NEW
-        // case 0x45: // CONSTRUCTOR_REFERENCE
-        // case 0x46: // METHOD_REFERENCE
-        default:
-            target &= (target >>> 24) < 0x43 ? 0xFFFFFF00 : 0xFF000000;
-            u += 3;
-            break;
-        }
-        int pathLength = readByte(u);
-        context.typeRef = target;
-        context.typePath = pathLength == 0 ? null : new TypePath(b, u);
-        return u + 1 + 2 * pathLength;
-    }
-
-    /**
-     * Reads parameter annotations and makes the given visitor visit them.
-     *
-     * @param mv
-     *            the visitor that must visit the annotations.
-     * @param context
-     *            information about the class being parsed.
-     * @param v
-     *            start offset in {@link #b b} of the annotations to be read.
-     * @param visible
-     *            <tt>true</tt> if the annotations to be read are visible at
-     *            runtime.
-     */
-    private void readParameterAnnotations(final MethodVisitor mv,
-            final Context context, int v, final boolean visible) {
-        int i;
-        int n = b[v++] & 0xFF;
-        // workaround for a bug in javac (javac compiler generates a parameter
-        // annotation array whose size is equal to the number of parameters in
-        // the Java source file, while it should generate an array whose size is
-        // equal to the number of parameters in the method descriptor - which
-        // includes the synthetic parameters added by the compiler). This work-
-        // around supposes that the synthetic parameters are the first ones.
-        int synthetics = Type.getArgumentTypes(context.desc).length - n;
-        AnnotationVisitor av;
-        for (i = 0; i < synthetics; ++i) {
-            // virtual annotation to detect synthetic parameters in MethodWriter
-            av = mv.visitParameterAnnotation(i, "Ljava/lang/Synthetic;", false);
-            if (av != null) {
-                av.visitEnd();
-            }
-        }
-        char[] c = context.buffer;
-        for (; i < n + synthetics; ++i) {
-            int j = readUnsignedShort(v);
-            v += 2;
-            for (; j > 0; --j) {
-                av = mv.visitParameterAnnotation(i, readUTF8(v, c), visible);
-                v = readAnnotationValues(v + 2, c, true, av);
-            }
-        }
-    }
-
-    /**
-     * Reads the values of an annotation and makes the given visitor visit them.
-     *
-     * @param v
-     *            the start offset in {@link #b b} of the values to be read
-     *            (including the unsigned short that gives the number of
-     *            values).
-     * @param buf
-     *            buffer to be used to call {@link #readUTF8 readUTF8},
-     *            {@link #readClass(int,char[]) readClass} or {@link #readConst
-     *            readConst}.
-     * @param named
-     *            if the annotation values are named or not.
-     * @param av
-     *            the visitor that must visit the values.
-     * @return the end offset of the annotation values.
-     */
-    private int readAnnotationValues(int v, final char[] buf,
-            final boolean named, final AnnotationVisitor av) {
-        int i = readUnsignedShort(v);
-        v += 2;
-        if (named) {
-            for (; i > 0; --i) {
-                v = readAnnotationValue(v + 2, buf, readUTF8(v, buf), av);
-            }
-        } else {
-            for (; i > 0; --i) {
-                v = readAnnotationValue(v, buf, null, av);
-            }
-        }
-        if (av != null) {
-            av.visitEnd();
-        }
-        return v;
-    }
-
-    /**
-     * Reads a value of an annotation and makes the given visitor visit it.
-     *
-     * @param v
-     *            the start offset in {@link #b b} of the value to be read
-     *            (<i>not including the value name constant pool index</i>).
-     * @param buf
-     *            buffer to be used to call {@link #readUTF8 readUTF8},
-     *            {@link #readClass(int,char[]) readClass} or {@link #readConst
-     *            readConst}.
-     * @param name
-     *            the name of the value to be read.
-     * @param av
-     *            the visitor that must visit the value.
-     * @return the end offset of the annotation value.
-     */
-    private int readAnnotationValue(int v, final char[] buf, final String name,
-            final AnnotationVisitor av) {
-        int i;
-        if (av == null) {
-            switch (b[v] & 0xFF) {
-            case 'e': // enum_const_value
-                return v + 5;
-            case '@': // annotation_value
-                return readAnnotationValues(v + 3, buf, true, null);
-            case '[': // array_value
-                return readAnnotationValues(v + 1, buf, false, null);
-            default:
-                return v + 3;
-            }
-        }
-        switch (b[v++] & 0xFF) {
-        case 'I': // pointer to CONSTANT_Integer
-        case 'J': // pointer to CONSTANT_Long
-        case 'F': // pointer to CONSTANT_Float
-        case 'D': // pointer to CONSTANT_Double
-            av.visit(name, readConst(readUnsignedShort(v), buf));
-            v += 2;
-            break;
-        case 'B': // pointer to CONSTANT_Byte
-            av.visit(name,
-                    new Byte((byte) readInt(items[readUnsignedShort(v)])));
-            v += 2;
-            break;
-        case 'Z': // pointer to CONSTANT_Boolean
-            av.visit(name,
-                    readInt(items[readUnsignedShort(v)]) == 0 ? Boolean.FALSE
-                            : Boolean.TRUE);
-            v += 2;
-            break;
-        case 'S': // pointer to CONSTANT_Short
-            av.visit(name, new Short(
-                    (short) readInt(items[readUnsignedShort(v)])));
-            v += 2;
-            break;
-        case 'C': // pointer to CONSTANT_Char
-            av.visit(name, new Character(
-                    (char) readInt(items[readUnsignedShort(v)])));
-            v += 2;
-            break;
-        case 's': // pointer to CONSTANT_Utf8
-            av.visit(name, readUTF8(v, buf));
-            v += 2;
-            break;
-        case 'e': // enum_const_value
-            av.visitEnum(name, readUTF8(v, buf), readUTF8(v + 2, buf));
-            v += 4;
-            break;
-        case 'c': // class_info
-            av.visit(name, Type.getType(readUTF8(v, buf)));
-            v += 2;
-            break;
-        case '@': // annotation_value
-            v = readAnnotationValues(v + 2, buf, true,
-                    av.visitAnnotation(name, readUTF8(v, buf)));
-            break;
-        case '[': // array_value
-            int size = readUnsignedShort(v);
-            v += 2;
-            if (size == 0) {
-                return readAnnotationValues(v - 2, buf, false,
-                        av.visitArray(name));
-            }
-            switch (this.b[v++] & 0xFF) {
-            case 'B':
-                byte[] bv = new byte[size];
-                for (i = 0; i < size; i++) {
-                    bv[i] = (byte) readInt(items[readUnsignedShort(v)]);
-                    v += 3;
-                }
-                av.visit(name, bv);
-                --v;
-                break;
-            case 'Z':
-                boolean[] zv = new boolean[size];
-                for (i = 0; i < size; i++) {
-                    zv[i] = readInt(items[readUnsignedShort(v)]) != 0;
-                    v += 3;
-                }
-                av.visit(name, zv);
-                --v;
-                break;
-            case 'S':
-                short[] sv = new short[size];
-                for (i = 0; i < size; i++) {
-                    sv[i] = (short) readInt(items[readUnsignedShort(v)]);
-                    v += 3;
-                }
-                av.visit(name, sv);
-                --v;
-                break;
-            case 'C':
-                char[] cv = new char[size];
-                for (i = 0; i < size; i++) {
-                    cv[i] = (char) readInt(items[readUnsignedShort(v)]);
-                    v += 3;
-                }
-                av.visit(name, cv);
-                --v;
-                break;
-            case 'I':
-                int[] iv = new int[size];
-                for (i = 0; i < size; i++) {
-                    iv[i] = readInt(items[readUnsignedShort(v)]);
-                    v += 3;
-                }
-                av.visit(name, iv);
-                --v;
-                break;
-            case 'J':
-                long[] lv = new long[size];
-                for (i = 0; i < size; i++) {
-                    lv[i] = readLong(items[readUnsignedShort(v)]);
-                    v += 3;
-                }
-                av.visit(name, lv);
-                --v;
-                break;
-            case 'F':
-                float[] fv = new float[size];
-                for (i = 0; i < size; i++) {
-                    fv[i] = Float
-                            .intBitsToFloat(readInt(items[readUnsignedShort(v)]));
-                    v += 3;
-                }
-                av.visit(name, fv);
-                --v;
-                break;
-            case 'D':
-                double[] dv = new double[size];
-                for (i = 0; i < size; i++) {
-                    dv[i] = Double
-                            .longBitsToDouble(readLong(items[readUnsignedShort(v)]));
-                    v += 3;
-                }
-                av.visit(name, dv);
-                --v;
-                break;
-            default:
-                v = readAnnotationValues(v - 3, buf, false, av.visitArray(name));
-            }
-        }
-        return v;
-    }
-
-    /**
-     * Computes the implicit frame of the method currently being parsed (as
-     * defined in the given {@link Context}) and stores it in the given context.
-     *
-     * @param frame
-     *            information about the class being parsed.
-     */
-    private void getImplicitFrame(final Context frame) {
-        String desc = frame.desc;
-        Object[] locals = frame.local;
-        int local = 0;
-        if ((frame.access & Opcodes.ACC_STATIC) == 0) {
-            if ("<init>".equals(frame.name)) {
-                locals[local++] = Opcodes.UNINITIALIZED_THIS;
-            } else {
-                locals[local++] = readClass(header + 2, frame.buffer);
-            }
-        }
-        int i = 1;
-        loop: while (true) {
-            int j = i;
-            switch (desc.charAt(i++)) {
-            case 'Z':
-            case 'C':
-            case 'B':
-            case 'S':
-            case 'I':
-                locals[local++] = Opcodes.INTEGER;
-                break;
-            case 'F':
-                locals[local++] = Opcodes.FLOAT;
-                break;
-            case 'J':
-                locals[local++] = Opcodes.LONG;
-                break;
-            case 'D':
-                locals[local++] = Opcodes.DOUBLE;
-                break;
-            case '[':
-                while (desc.charAt(i) == '[') {
-                    ++i;
-                }
-                if (desc.charAt(i) == 'L') {
-                    ++i;
-                    while (desc.charAt(i) != ';') {
-                        ++i;
-                    }
-                }
-                locals[local++] = desc.substring(j, ++i);
-                break;
-            case 'L':
-                while (desc.charAt(i) != ';') {
-                    ++i;
-                }
-                locals[local++] = desc.substring(j + 1, i++);
-                break;
-            default:
-                break loop;
-            }
-        }
-        frame.localCount = local;
-    }
-
-    /**
-     * Reads a stack map frame and stores the result in the given
-     * {@link Context} object.
-     *
-     * @param stackMap
-     *            the start offset of a stack map frame in the class file.
-     * @param zip
-     *            if the stack map frame at stackMap is compressed or not.
-     * @param unzip
-     *            if the stack map frame must be uncompressed.
-     * @param frame
-     *            where the parsed stack map frame must be stored.
-     * @return the offset of the first byte following the parsed frame.
-     */
-    private int readFrame(int stackMap, boolean zip, boolean unzip,
-            Context frame) {
-        char[] c = frame.buffer;
-        Label[] labels = frame.labels;
-        int tag;
-        int delta;
-        if (zip) {
-            tag = b[stackMap++] & 0xFF;
-        } else {
-            tag = MethodWriter.FULL_FRAME;
-            frame.offset = -1;
-        }
-        frame.localDiff = 0;
-        if (tag < MethodWriter.SAME_LOCALS_1_STACK_ITEM_FRAME) {
-            delta = tag;
-            frame.mode = Opcodes.F_SAME;
-            frame.stackCount = 0;
-        } else if (tag < MethodWriter.RESERVED) {
-            delta = tag - MethodWriter.SAME_LOCALS_1_STACK_ITEM_FRAME;
-            stackMap = readFrameType(frame.stack, 0, stackMap, c, labels);
-            frame.mode = Opcodes.F_SAME1;
-            frame.stackCount = 1;
-        } else {
-            delta = readUnsignedShort(stackMap);
-            stackMap += 2;
-            if (tag == MethodWriter.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) {
-                stackMap = readFrameType(frame.stack, 0, stackMap, c, labels);
-                frame.mode = Opcodes.F_SAME1;
-                frame.stackCount = 1;
-            } else if (tag >= MethodWriter.CHOP_FRAME
-                    && tag < MethodWriter.SAME_FRAME_EXTENDED) {
-                frame.mode = Opcodes.F_CHOP;
-                frame.localDiff = MethodWriter.SAME_FRAME_EXTENDED - tag;
-                frame.localCount -= frame.localDiff;
-                frame.stackCount = 0;
-            } else if (tag == MethodWriter.SAME_FRAME_EXTENDED) {
-                frame.mode = Opcodes.F_SAME;
-                frame.stackCount = 0;
-            } else if (tag < MethodWriter.FULL_FRAME) {
-                int local = unzip ? frame.localCount : 0;
-                for (int i = tag - MethodWriter.SAME_FRAME_EXTENDED; i > 0; i--) {
-                    stackMap = readFrameType(frame.local, local++, stackMap, c,
-                            labels);
-                }
-                frame.mode = Opcodes.F_APPEND;
-                frame.localDiff = tag - MethodWriter.SAME_FRAME_EXTENDED;
-                frame.localCount += frame.localDiff;
-                frame.stackCount = 0;
-            } else { // if (tag == FULL_FRAME) {
-                frame.mode = Opcodes.F_FULL;
-                int n = readUnsignedShort(stackMap);
-                stackMap += 2;
-                frame.localDiff = n;
-                frame.localCount = n;
-                for (int local = 0; n > 0; n--) {
-                    stackMap = readFrameType(frame.local, local++, stackMap, c,
-                            labels);
-                }
-                n = readUnsignedShort(stackMap);
-                stackMap += 2;
-                frame.stackCount = n;
-                for (int stack = 0; n > 0; n--) {
-                    stackMap = readFrameType(frame.stack, stack++, stackMap, c,
-                            labels);
-                }
-            }
-        }
-        frame.offset += delta + 1;
-        readLabel(frame.offset, labels);
-        return stackMap;
-    }
-
-    /**
-     * Reads a stack map frame type and stores it at the given index in the
-     * given array.
-     *
-     * @param frame
-     *            the array where the parsed type must be stored.
-     * @param index
-     *            the index in 'frame' where the parsed type must be stored.
-     * @param v
-     *            the start offset of the stack map frame type to read.
-     * @param buf
-     *            a buffer to read strings.
-     * @param labels
-     *            the labels of the method currently being parsed, indexed by
-     *            their offset. If the parsed type is an Uninitialized type, a
-     *            new label for the corresponding NEW instruction is stored in
-     *            this array if it does not already exist.
-     * @return the offset of the first byte after the parsed type.
-     */
-    private int readFrameType(final Object[] frame, final int index, int v,
-            final char[] buf, final Label[] labels) {
-        int type = b[v++] & 0xFF;
-        switch (type) {
-        case 0:
-            frame[index] = Opcodes.TOP;
-            break;
-        case 1:
-            frame[index] = Opcodes.INTEGER;
-            break;
-        case 2:
-            frame[index] = Opcodes.FLOAT;
-            break;
-        case 3:
-            frame[index] = Opcodes.DOUBLE;
-            break;
-        case 4:
-            frame[index] = Opcodes.LONG;
-            break;
-        case 5:
-            frame[index] = Opcodes.NULL;
-            break;
-        case 6:
-            frame[index] = Opcodes.UNINITIALIZED_THIS;
-            break;
-        case 7: // Object
-            frame[index] = readClass(v, buf);
-            v += 2;
-            break;
-        default: // Uninitialized
-            frame[index] = readLabel(readUnsignedShort(v), labels);
-            v += 2;
-        }
-        return v;
-    }
-
-    /**
-     * Returns the label corresponding to the given offset. The default
-     * implementation of this method creates a label for the given offset if it
-     * has not been already created.
-     *
-     * @param offset
-     *            a bytecode offset in a method.
-     * @param labels
-     *            the already created labels, indexed by their offset. If a
-     *            label already exists for offset this method must not create a
-     *            new one. Otherwise it must store the new label in this array.
-     * @return a non null Label, which must be equal to labels[offset].
-     */
-    protected Label readLabel(int offset, Label[] labels) {
-        if (labels[offset] == null) {
-            labels[offset] = new Label();
-        }
-        return labels[offset];
-    }
-
-    /**
-     * Returns the start index of the attribute_info structure of this class.
-     *
-     * @return the start index of the attribute_info structure of this class.
-     */
-    private int getAttributes() {
-        // skips the header
-        int u = header + 8 + readUnsignedShort(header + 6) * 2;
-        // skips fields and methods
-        for (int i = readUnsignedShort(u); i > 0; --i) {
-            for (int j = readUnsignedShort(u + 8); j > 0; --j) {
-                u += 6 + readInt(u + 12);
-            }
-            u += 8;
-        }
-        u += 2;
-        for (int i = readUnsignedShort(u); i > 0; --i) {
-            for (int j = readUnsignedShort(u + 8); j > 0; --j) {
-                u += 6 + readInt(u + 12);
-            }
-            u += 8;
-        }
-        // the attribute_info structure starts just after the methods
-        return u + 2;
-    }
-
-    /**
-     * Reads an attribute in {@link #b b}.
-     *
-     * @param attrs
-     *            prototypes of the attributes that must be parsed during the
-     *            visit of the class. Any attribute whose type is not equal to
-     *            the type of one the prototypes is ignored (i.e. an empty
-     *            {@link Attribute} instance is returned).
-     * @param type
-     *            the type of the attribute.
-     * @param off
-     *            index of the first byte of the attribute's content in
-     *            {@link #b b}. The 6 attribute header bytes, containing the
-     *            type and the length of the attribute, are not taken into
-     *            account here (they have already been read).
-     * @param len
-     *            the length of the attribute's content.
-     * @param buf
-     *            buffer to be used to call {@link #readUTF8 readUTF8},
-     *            {@link #readClass(int,char[]) readClass} or {@link #readConst
-     *            readConst}.
-     * @param codeOff
-     *            index of the first byte of code's attribute content in
-     *            {@link #b b}, or -1 if the attribute to be read is not a code
-     *            attribute. The 6 attribute header bytes, containing the type
-     *            and the length of the attribute, are not taken into account
-     *            here.
-     * @param labels
-     *            the labels of the method's code, or <tt>null</tt> if the
-     *            attribute to be read is not a code attribute.
-     * @return the attribute that has been read, or <tt>null</tt> to skip this
-     *         attribute.
-     */
-    private Attribute readAttribute(final Attribute[] attrs, final String type,
-            final int off, final int len, final char[] buf, final int codeOff,
-            final Label[] labels) {
-        for (int i = 0; i < attrs.length; ++i) {
-            if (attrs[i].type.equals(type)) {
-                return attrs[i].read(this, off, len, buf, codeOff, labels);
-            }
-        }
-        return new Attribute(type).read(this, off, len, null, -1, null);
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods: low level parsing
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns the number of constant pool items in {@link #b b}.
-     *
-     * @return the number of constant pool items in {@link #b b}.
-     */
-    public int getItemCount() {
-        return items.length;
-    }
-
-    /**
-     * Returns the start index of the constant pool item in {@link #b b}, plus
-     * one. <i>This method is intended for {@link Attribute} sub classes, and is
-     * normally not needed by class generators or adapters.</i>
-     *
-     * @param item
-     *            the index a constant pool item.
-     * @return the start index of the constant pool item in {@link #b b}, plus
-     *         one.
-     */
-    public int getItem(final int item) {
-        return items[item];
-    }
-
-    /**
-     * Returns the maximum length of the strings contained in the constant pool
-     * of the class.
-     *
-     * @return the maximum length of the strings contained in the constant pool
-     *         of the class.
-     */
-    public int getMaxStringLength() {
-        return maxStringLength;
-    }
-
-    /**
-     * Reads a byte value in {@link #b b}. <i>This method is intended for
-     * {@link Attribute} sub classes, and is normally not needed by class
-     * generators or adapters.</i>
-     *
-     * @param index
-     *            the start index of the value to be read in {@link #b b}.
-     * @return the read value.
-     */
-    public int readByte(final int index) {
-        return b[index] & 0xFF;
-    }
-
-    /**
-     * Reads an unsigned short value in {@link #b b}. <i>This method is intended
-     * for {@link Attribute} sub classes, and is normally not needed by class
-     * generators or adapters.</i>
-     *
-     * @param index
-     *            the start index of the value to be read in {@link #b b}.
-     * @return the read value.
-     */
-    public int readUnsignedShort(final int index) {
-        byte[] b = this.b;
-        return ((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF);
-    }
-
-    /**
-     * Reads a signed short value in {@link #b b}. <i>This method is intended
-     * for {@link Attribute} sub classes, and is normally not needed by class
-     * generators or adapters.</i>
-     *
-     * @param index
-     *            the start index of the value to be read in {@link #b b}.
-     * @return the read value.
-     */
-    public short readShort(final int index) {
-        byte[] b = this.b;
-        return (short) (((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF));
-    }
-
-    /**
-     * Reads a signed int value in {@link #b b}. <i>This method is intended for
-     * {@link Attribute} sub classes, and is normally not needed by class
-     * generators or adapters.</i>
-     *
-     * @param index
-     *            the start index of the value to be read in {@link #b b}.
-     * @return the read value.
-     */
-    public int readInt(final int index) {
-        byte[] b = this.b;
-        return ((b[index] & 0xFF) << 24) | ((b[index + 1] & 0xFF) << 16)
-                | ((b[index + 2] & 0xFF) << 8) | (b[index + 3] & 0xFF);
-    }
-
-    /**
-     * Reads a signed long value in {@link #b b}. <i>This method is intended for
-     * {@link Attribute} sub classes, and is normally not needed by class
-     * generators or adapters.</i>
-     *
-     * @param index
-     *            the start index of the value to be read in {@link #b b}.
-     * @return the read value.
-     */
-    public long readLong(final int index) {
-        long l1 = readInt(index);
-        long l0 = readInt(index + 4) & 0xFFFFFFFFL;
-        return (l1 << 32) | l0;
-    }
-
-    /**
-     * Reads an UTF8 string constant pool item in {@link #b b}. <i>This method
-     * is intended for {@link Attribute} sub classes, and is normally not needed
-     * by class generators or adapters.</i>
-     *
-     * @param index
-     *            the start index of an unsigned short value in {@link #b b},
-     *            whose value is the index of an UTF8 constant pool item.
-     * @param buf
-     *            buffer to be used to read the item. This buffer must be
-     *            sufficiently large. It is not automatically resized.
-     * @return the String corresponding to the specified UTF8 item.
-     */
-    public String readUTF8(int index, final char[] buf) {
-        int item = readUnsignedShort(index);
-        if (index == 0 || item == 0) {
-            return null;
-        }
-        String s = strings[item];
-        if (s != null) {
-            return s;
-        }
-        index = items[item];
-        return strings[item] = readUTF(index + 2, readUnsignedShort(index), buf);
-    }
-
-    /**
-     * Reads UTF8 string in {@link #b b}.
-     *
-     * @param index
-     *            start offset of the UTF8 string to be read.
-     * @param utfLen
-     *            length of the UTF8 string to be read.
-     * @param buf
-     *            buffer to be used to read the string. This buffer must be
-     *            sufficiently large. It is not automatically resized.
-     * @return the String corresponding to the specified UTF8 string.
-     */
-    private String readUTF(int index, final int utfLen, final char[] buf) {
-        int endIndex = index + utfLen;
-        byte[] b = this.b;
-        int strLen = 0;
-        int c;
-        int st = 0;
-        char cc = 0;
-        while (index < endIndex) {
-            c = b[index++];
-            switch (st) {
-            case 0:
-                c = c & 0xFF;
-                if (c < 0x80) { // 0xxxxxxx
-                    buf[strLen++] = (char) c;
-                } else if (c < 0xE0 && c > 0xBF) { // 110x xxxx 10xx xxxx
-                    cc = (char) (c & 0x1F);
-                    st = 1;
-                } else { // 1110 xxxx 10xx xxxx 10xx xxxx
-                    cc = (char) (c & 0x0F);
-                    st = 2;
-                }
-                break;
-
-            case 1: // byte 2 of 2-byte char or byte 3 of 3-byte char
-                buf[strLen++] = (char) ((cc << 6) | (c & 0x3F));
-                st = 0;
-                break;
-
-            case 2: // byte 2 of 3-byte char
-                cc = (char) ((cc << 6) | (c & 0x3F));
-                st = 1;
-                break;
-            }
-        }
-        return new String(buf, 0, strLen);
-    }
-
-    /**
-     * Reads a class constant pool item in {@link #b b}. <i>This method is
-     * intended for {@link Attribute} sub classes, and is normally not needed by
-     * class generators or adapters.</i>
-     *
-     * @param index
-     *            the start index of an unsigned short value in {@link #b b},
-     *            whose value is the index of a class constant pool item.
-     * @param buf
-     *            buffer to be used to read the item. This buffer must be
-     *            sufficiently large. It is not automatically resized.
-     * @return the String corresponding to the specified class item.
-     */
-    public String readClass(final int index, final char[] buf) {
-        // computes the start index of the CONSTANT_Class item in b
-        // and reads the CONSTANT_Utf8 item designated by
-        // the first two bytes of this CONSTANT_Class item
-        return readUTF8(items[readUnsignedShort(index)], buf);
-    }
-
-    /**
-     * Reads a numeric or string constant pool item in {@link #b b}. <i>This
-     * method is intended for {@link Attribute} sub classes, and is normally not
-     * needed by class generators or adapters.</i>
-     *
-     * @param item
-     *            the index of a constant pool item.
-     * @param buf
-     *            buffer to be used to read the item. This buffer must be
-     *            sufficiently large. It is not automatically resized.
-     * @return the {@link Integer}, {@link Float}, {@link Long}, {@link Double},
-     *         {@link String}, {@link Type} or {@link Handle} corresponding to
-     *         the given constant pool item.
-     */
-    public Object readConst(final int item, final char[] buf) {
-        int index = items[item];
-        switch (b[index - 1]) {
-        case ClassWriter.INT:
-            return new Integer(readInt(index));
-        case ClassWriter.FLOAT:
-            return new Float(Float.intBitsToFloat(readInt(index)));
-        case ClassWriter.LONG:
-            return new Long(readLong(index));
-        case ClassWriter.DOUBLE:
-            return new Double(Double.longBitsToDouble(readLong(index)));
-        case ClassWriter.CLASS:
-            return Type.getObjectType(readUTF8(index, buf));
-        case ClassWriter.STR:
-            return readUTF8(index, buf);
-        case ClassWriter.MTYPE:
-            return Type.getMethodType(readUTF8(index, buf));
-        default: // case ClassWriter.HANDLE_BASE + [1..9]:
-            int tag = readByte(index);
-            int[] items = this.items;
-            int cpIndex = items[readUnsignedShort(index + 1)];
-            String owner = readClass(cpIndex, buf);
-            cpIndex = items[readUnsignedShort(cpIndex + 2)];
-            String name = readUTF8(cpIndex, buf);
-            String desc = readUTF8(cpIndex + 2, buf);
-            return new Handle(tag, owner, name, desc);
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/ClassVisitor.java b/src/asm/scala/tools/asm/ClassVisitor.java
deleted file mode 100644
index 48dc2ca..0000000
--- a/src/asm/scala/tools/asm/ClassVisitor.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A visitor to visit a Java class. The methods of this class must be called in
- * the following order: <tt>visit</tt> [ <tt>visitSource</tt> ] [
- * <tt>visitOuterClass</tt> ] ( <tt>visitAnnotation</tt> |
- * <tt>visitTypeAnnotation</tt> | <tt>visitAttribute</tt> )* (
- * <tt>visitInnerClass</tt> | <tt>visitField</tt> | <tt>visitMethod</tt> )*
- * <tt>visitEnd</tt>.
- *
- * @author Eric Bruneton
- */
-public abstract class ClassVisitor {
-
-    /**
-     * The ASM API version implemented by this visitor. The value of this field
-     * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    protected final int api;
-
-    /**
-     * The class visitor to which this visitor must delegate method calls. May
-     * be null.
-     */
-    protected ClassVisitor cv;
-
-    /**
-     * Constructs a new {@link ClassVisitor}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    public ClassVisitor(final int api) {
-        this(api, null);
-    }
-
-    /**
-     * Constructs a new {@link ClassVisitor}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param cv
-     *            the class visitor to which this visitor must delegate method
-     *            calls. May be null.
-     */
-    public ClassVisitor(final int api, final ClassVisitor cv) {
-        if (api != Opcodes.ASM4 && api != Opcodes.ASM5) {
-            throw new IllegalArgumentException();
-        }
-        this.api = api;
-        this.cv = cv;
-    }
-
-    /**
-     * Visits the header of the class.
-     *
-     * @param version
-     *            the class version.
-     * @param access
-     *            the class's access flags (see {@link Opcodes}). This parameter
-     *            also indicates if the class is deprecated.
-     * @param name
-     *            the internal name of the class (see
-     *            {@link Type#getInternalName() getInternalName}).
-     * @param signature
-     *            the signature of this class. May be <tt>null</tt> if the class
-     *            is not a generic one, and does not extend or implement generic
-     *            classes or interfaces.
-     * @param superName
-     *            the internal of name of the super class (see
-     *            {@link Type#getInternalName() getInternalName}). For
-     *            interfaces, the super class is {@link Object}. May be
-     *            <tt>null</tt>, but only for the {@link Object} class.
-     * @param interfaces
-     *            the internal names of the class's interfaces (see
-     *            {@link Type#getInternalName() getInternalName}). May be
-     *            <tt>null</tt>.
-     */
-    public void visit(int version, int access, String name, String signature,
-            String superName, String[] interfaces) {
-        if (cv != null) {
-            cv.visit(version, access, name, signature, superName, interfaces);
-        }
-    }
-
-    /**
-     * Visits the source of the class.
-     *
-     * @param source
-     *            the name of the source file from which the class was compiled.
-     *            May be <tt>null</tt>.
-     * @param debug
-     *            additional debug information to compute the correspondance
-     *            between source and compiled elements of the class. May be
-     *            <tt>null</tt>.
-     */
-    public void visitSource(String source, String debug) {
-        if (cv != null) {
-            cv.visitSource(source, debug);
-        }
-    }
-
-    /**
-     * Visits the enclosing class of the class. This method must be called only
-     * if the class has an enclosing class.
-     *
-     * @param owner
-     *            internal name of the enclosing class of the class.
-     * @param name
-     *            the name of the method that contains the class, or
-     *            <tt>null</tt> if the class is not enclosed in a method of its
-     *            enclosing class.
-     * @param desc
-     *            the descriptor of the method that contains the class, or
-     *            <tt>null</tt> if the class is not enclosed in a method of its
-     *            enclosing class.
-     */
-    public void visitOuterClass(String owner, String name, String desc) {
-        if (cv != null) {
-            cv.visitOuterClass(owner, name, desc);
-        }
-    }
-
-    /**
-     * Visits an annotation of the class.
-     *
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
-        if (cv != null) {
-            return cv.visitAnnotation(desc, visible);
-        }
-        return null;
-    }
-
-    /**
-     * Visits an annotation on a type in the class signature.
-     *
-     * @param typeRef
-     *            a reference to the annotated type. The sort of this type
-     *            reference must be {@link TypeReference#CLASS_TYPE_PARAMETER
-     *            CLASS_TYPE_PARAMETER},
-     *            {@link TypeReference#CLASS_TYPE_PARAMETER_BOUND
-     *            CLASS_TYPE_PARAMETER_BOUND} or
-     *            {@link TypeReference#CLASS_EXTENDS CLASS_EXTENDS}. See
-     *            {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        if (api < Opcodes.ASM5) {
-            throw new RuntimeException();
-        }
-        if (cv != null) {
-            return cv.visitTypeAnnotation(typeRef, typePath, desc, visible);
-        }
-        return null;
-    }
-
-    /**
-     * Visits a non standard attribute of the class.
-     *
-     * @param attr
-     *            an attribute.
-     */
-    public void visitAttribute(Attribute attr) {
-        if (cv != null) {
-            cv.visitAttribute(attr);
-        }
-    }
-
-    /**
-     * Visits information about an inner class. This inner class is not
-     * necessarily a member of the class being visited.
-     *
-     * @param name
-     *            the internal name of an inner class (see
-     *            {@link Type#getInternalName() getInternalName}).
-     * @param outerName
-     *            the internal name of the class to which the inner class
-     *            belongs (see {@link Type#getInternalName() getInternalName}).
-     *            May be <tt>null</tt> for not member classes.
-     * @param innerName
-     *            the (simple) name of the inner class inside its enclosing
-     *            class. May be <tt>null</tt> for anonymous inner classes.
-     * @param access
-     *            the access flags of the inner class as originally declared in
-     *            the enclosing class.
-     */
-    public void visitInnerClass(String name, String outerName,
-            String innerName, int access) {
-        if (cv != null) {
-            cv.visitInnerClass(name, outerName, innerName, access);
-        }
-    }
-
-    /**
-     * Visits a field of the class.
-     *
-     * @param access
-     *            the field's access flags (see {@link Opcodes}). This parameter
-     *            also indicates if the field is synthetic and/or deprecated.
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor (see {@link Type Type}).
-     * @param signature
-     *            the field's signature. May be <tt>null</tt> if the field's
-     *            type does not use generic types.
-     * @param value
-     *            the field's initial value. This parameter, which may be
-     *            <tt>null</tt> if the field does not have an initial value,
-     *            must be an {@link Integer}, a {@link Float}, a {@link Long}, a
-     *            {@link Double} or a {@link String} (for <tt>int</tt>,
-     *            <tt>float</tt>, <tt>long</tt> or <tt>String</tt> fields
-     *            respectively). <i>This parameter is only used for static
-     *            fields</i>. Its value is ignored for non static fields, which
-     *            must be initialized through bytecode instructions in
-     *            constructors or methods.
-     * @return a visitor to visit field annotations and attributes, or
-     *         <tt>null</tt> if this class visitor is not interested in visiting
-     *         these annotations and attributes.
-     */
-    public FieldVisitor visitField(int access, String name, String desc,
-            String signature, Object value) {
-        if (cv != null) {
-            return cv.visitField(access, name, desc, signature, value);
-        }
-        return null;
-    }
-
-    /**
-     * Visits a method of the class. This method <i>must</i> return a new
-     * {@link MethodVisitor} instance (or <tt>null</tt>) each time it is called,
-     * i.e., it should not return a previously returned visitor.
-     *
-     * @param access
-     *            the method's access flags (see {@link Opcodes}). This
-     *            parameter also indicates if the method is synthetic and/or
-     *            deprecated.
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor (see {@link Type Type}).
-     * @param signature
-     *            the method's signature. May be <tt>null</tt> if the method
-     *            parameters, return type and exceptions do not use generic
-     *            types.
-     * @param exceptions
-     *            the internal names of the method's exception classes (see
-     *            {@link Type#getInternalName() getInternalName}). May be
-     *            <tt>null</tt>.
-     * @return an object to visit the byte code of the method, or <tt>null</tt>
-     *         if this class visitor is not interested in visiting the code of
-     *         this method.
-     */
-    public MethodVisitor visitMethod(int access, String name, String desc,
-            String signature, String[] exceptions) {
-        if (cv != null) {
-            return cv.visitMethod(access, name, desc, signature, exceptions);
-        }
-        return null;
-    }
-
-    /**
-     * Visits the end of the class. This method, which is the last one to be
-     * called, is used to inform the visitor that all the fields and methods of
-     * the class have been visited.
-     */
-    public void visitEnd() {
-        if (cv != null) {
-            cv.visitEnd();
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/ClassWriter.java b/src/asm/scala/tools/asm/ClassWriter.java
deleted file mode 100644
index 5c2de3f..0000000
--- a/src/asm/scala/tools/asm/ClassWriter.java
+++ /dev/null
@@ -1,1785 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A {@link ClassVisitor} that generates classes in bytecode form. More
- * precisely this visitor generates a byte array conforming to the Java class
- * file format. It can be used alone, to generate a Java class "from scratch",
- * or with one or more {@link ClassReader ClassReader} and adapter class visitor
- * to generate a modified class from one or more existing Java classes.
- *
- * @author Eric Bruneton
- */
-public class ClassWriter extends ClassVisitor {
-
-    /**
-     * Flag to automatically compute the maximum stack size and the maximum
-     * number of local variables of methods. If this flag is set, then the
-     * arguments of the {@link MethodVisitor#visitMaxs visitMaxs} method of the
-     * {@link MethodVisitor} returned by the {@link #visitMethod visitMethod}
-     * method will be ignored, and computed automatically from the signature and
-     * the bytecode of each method.
-     *
-     * @see #ClassWriter(int)
-     */
-    public static final int COMPUTE_MAXS = 1;
-
-    /**
-     * Flag to automatically compute the stack map frames of methods from
-     * scratch. If this flag is set, then the calls to the
-     * {@link MethodVisitor#visitFrame} method are ignored, and the stack map
-     * frames are recomputed from the methods bytecode. The arguments of the
-     * {@link MethodVisitor#visitMaxs visitMaxs} method are also ignored and
-     * recomputed from the bytecode. In other words, computeFrames implies
-     * computeMaxs.
-     *
-     * @see #ClassWriter(int)
-     */
-    public static final int COMPUTE_FRAMES = 2;
-
-    /**
-     * Pseudo access flag to distinguish between the synthetic attribute and the
-     * synthetic access flag.
-     */
-    static final int ACC_SYNTHETIC_ATTRIBUTE = 0x40000;
-
-    /**
-     * Factor to convert from ACC_SYNTHETIC_ATTRIBUTE to Opcode.ACC_SYNTHETIC.
-     */
-    static final int TO_ACC_SYNTHETIC = ACC_SYNTHETIC_ATTRIBUTE
-            / Opcodes.ACC_SYNTHETIC;
-
-    /**
-     * The type of instructions without any argument.
-     */
-    static final int NOARG_INSN = 0;
-
-    /**
-     * The type of instructions with an signed byte argument.
-     */
-    static final int SBYTE_INSN = 1;
-
-    /**
-     * The type of instructions with an signed short argument.
-     */
-    static final int SHORT_INSN = 2;
-
-    /**
-     * The type of instructions with a local variable index argument.
-     */
-    static final int VAR_INSN = 3;
-
-    /**
-     * The type of instructions with an implicit local variable index argument.
-     */
-    static final int IMPLVAR_INSN = 4;
-
-    /**
-     * The type of instructions with a type descriptor argument.
-     */
-    static final int TYPE_INSN = 5;
-
-    /**
-     * The type of field and method invocations instructions.
-     */
-    static final int FIELDORMETH_INSN = 6;
-
-    /**
-     * The type of the INVOKEINTERFACE/INVOKEDYNAMIC instruction.
-     */
-    static final int ITFMETH_INSN = 7;
-
-    /**
-     * The type of the INVOKEDYNAMIC instruction.
-     */
-    static final int INDYMETH_INSN = 8;
-
-    /**
-     * The type of instructions with a 2 bytes bytecode offset label.
-     */
-    static final int LABEL_INSN = 9;
-
-    /**
-     * The type of instructions with a 4 bytes bytecode offset label.
-     */
-    static final int LABELW_INSN = 10;
-
-    /**
-     * The type of the LDC instruction.
-     */
-    static final int LDC_INSN = 11;
-
-    /**
-     * The type of the LDC_W and LDC2_W instructions.
-     */
-    static final int LDCW_INSN = 12;
-
-    /**
-     * The type of the IINC instruction.
-     */
-    static final int IINC_INSN = 13;
-
-    /**
-     * The type of the TABLESWITCH instruction.
-     */
-    static final int TABL_INSN = 14;
-
-    /**
-     * The type of the LOOKUPSWITCH instruction.
-     */
-    static final int LOOK_INSN = 15;
-
-    /**
-     * The type of the MULTIANEWARRAY instruction.
-     */
-    static final int MANA_INSN = 16;
-
-    /**
-     * The type of the WIDE instruction.
-     */
-    static final int WIDE_INSN = 17;
-
-    /**
-     * The instruction types of all JVM opcodes.
-     */
-    static final byte[] TYPE;
-
-    /**
-     * The type of CONSTANT_Class constant pool items.
-     */
-    static final int CLASS = 7;
-
-    /**
-     * The type of CONSTANT_Fieldref constant pool items.
-     */
-    static final int FIELD = 9;
-
-    /**
-     * The type of CONSTANT_Methodref constant pool items.
-     */
-    static final int METH = 10;
-
-    /**
-     * The type of CONSTANT_InterfaceMethodref constant pool items.
-     */
-    static final int IMETH = 11;
-
-    /**
-     * The type of CONSTANT_String constant pool items.
-     */
-    static final int STR = 8;
-
-    /**
-     * The type of CONSTANT_Integer constant pool items.
-     */
-    static final int INT = 3;
-
-    /**
-     * The type of CONSTANT_Float constant pool items.
-     */
-    static final int FLOAT = 4;
-
-    /**
-     * The type of CONSTANT_Long constant pool items.
-     */
-    static final int LONG = 5;
-
-    /**
-     * The type of CONSTANT_Double constant pool items.
-     */
-    static final int DOUBLE = 6;
-
-    /**
-     * The type of CONSTANT_NameAndType constant pool items.
-     */
-    static final int NAME_TYPE = 12;
-
-    /**
-     * The type of CONSTANT_Utf8 constant pool items.
-     */
-    static final int UTF8 = 1;
-
-    /**
-     * The type of CONSTANT_MethodType constant pool items.
-     */
-    static final int MTYPE = 16;
-
-    /**
-     * The type of CONSTANT_MethodHandle constant pool items.
-     */
-    static final int HANDLE = 15;
-
-    /**
-     * The type of CONSTANT_InvokeDynamic constant pool items.
-     */
-    static final int INDY = 18;
-
-    /**
-     * The base value for all CONSTANT_MethodHandle constant pool items.
-     * Internally, ASM store the 9 variations of CONSTANT_MethodHandle into 9
-     * different items.
-     */
-    static final int HANDLE_BASE = 20;
-
-    /**
-     * Normal type Item stored in the ClassWriter {@link ClassWriter#typeTable},
-     * instead of the constant pool, in order to avoid clashes with normal
-     * constant pool items in the ClassWriter constant pool's hash table.
-     */
-    static final int TYPE_NORMAL = 30;
-
-    /**
-     * Uninitialized type Item stored in the ClassWriter
-     * {@link ClassWriter#typeTable}, instead of the constant pool, in order to
-     * avoid clashes with normal constant pool items in the ClassWriter constant
-     * pool's hash table.
-     */
-    static final int TYPE_UNINIT = 31;
-
-    /**
-     * Merged type Item stored in the ClassWriter {@link ClassWriter#typeTable},
-     * instead of the constant pool, in order to avoid clashes with normal
-     * constant pool items in the ClassWriter constant pool's hash table.
-     */
-    static final int TYPE_MERGED = 32;
-
-    /**
-     * The type of BootstrapMethods items. These items are stored in a special
-     * class attribute named BootstrapMethods and not in the constant pool.
-     */
-    static final int BSM = 33;
-
-    /**
-     * The class reader from which this class writer was constructed, if any.
-     */
-    ClassReader cr;
-
-    /**
-     * Minor and major version numbers of the class to be generated.
-     */
-    int version;
-
-    /**
-     * Index of the next item to be added in the constant pool.
-     */
-    int index;
-
-    /**
-     * The constant pool of this class.
-     */
-    final ByteVector pool;
-
-    /**
-     * The constant pool's hash table data.
-     */
-    Item[] items;
-
-    /**
-     * The threshold of the constant pool's hash table.
-     */
-    int threshold;
-
-    /**
-     * A reusable key used to look for items in the {@link #items} hash table.
-     */
-    final Item key;
-
-    /**
-     * A reusable key used to look for items in the {@link #items} hash table.
-     */
-    final Item key2;
-
-    /**
-     * A reusable key used to look for items in the {@link #items} hash table.
-     */
-    final Item key3;
-
-    /**
-     * A reusable key used to look for items in the {@link #items} hash table.
-     */
-    final Item key4;
-
-    /**
-     * A type table used to temporarily store internal names that will not
-     * necessarily be stored in the constant pool. This type table is used by
-     * the control flow and data flow analysis algorithm used to compute stack
-     * map frames from scratch. This array associates to each index <tt>i</tt>
-     * the Item whose index is <tt>i</tt>. All Item objects stored in this array
-     * are also stored in the {@link #items} hash table. These two arrays allow
-     * to retrieve an Item from its index or, conversely, to get the index of an
-     * Item from its value. Each Item stores an internal name in its
-     * {@link Item#strVal1} field.
-     */
-    Item[] typeTable;
-
-    /**
-     * Number of elements in the {@link #typeTable} array.
-     */
-    private short typeCount;
-
-    /**
-     * The access flags of this class.
-     */
-    private int access;
-
-    /**
-     * The constant pool item that contains the internal name of this class.
-     */
-    private int name;
-
-    /**
-     * The internal name of this class.
-     */
-    String thisName;
-
-    /**
-     * The constant pool item that contains the signature of this class.
-     */
-    private int signature;
-
-    /**
-     * The constant pool item that contains the internal name of the super class
-     * of this class.
-     */
-    private int superName;
-
-    /**
-     * Number of interfaces implemented or extended by this class or interface.
-     */
-    private int interfaceCount;
-
-    /**
-     * The interfaces implemented or extended by this class or interface. More
-     * precisely, this array contains the indexes of the constant pool items
-     * that contain the internal names of these interfaces.
-     */
-    private int[] interfaces;
-
-    /**
-     * The index of the constant pool item that contains the name of the source
-     * file from which this class was compiled.
-     */
-    private int sourceFile;
-
-    /**
-     * The SourceDebug attribute of this class.
-     */
-    private ByteVector sourceDebug;
-
-    /**
-     * The constant pool item that contains the name of the enclosing class of
-     * this class.
-     */
-    private int enclosingMethodOwner;
-
-    /**
-     * The constant pool item that contains the name and descriptor of the
-     * enclosing method of this class.
-     */
-    private int enclosingMethod;
-
-    /**
-     * The runtime visible annotations of this class.
-     */
-    private AnnotationWriter anns;
-
-    /**
-     * The runtime invisible annotations of this class.
-     */
-    private AnnotationWriter ianns;
-
-    /**
-     * The runtime visible type annotations of this class.
-     */
-    private AnnotationWriter tanns;
-
-    /**
-     * The runtime invisible type annotations of this class.
-     */
-    private AnnotationWriter itanns;
-
-    /**
-     * The non standard attributes of this class.
-     */
-    private Attribute attrs;
-
-    /**
-     * The number of entries in the InnerClasses attribute.
-     */
-    private int innerClassesCount;
-
-    /**
-     * The InnerClasses attribute.
-     */
-    private ByteVector innerClasses;
-
-    /**
-     * The number of entries in the BootstrapMethods attribute.
-     */
-    int bootstrapMethodsCount;
-
-    /**
-     * The BootstrapMethods attribute.
-     */
-    ByteVector bootstrapMethods;
-
-    /**
-     * The fields of this class. These fields are stored in a linked list of
-     * {@link FieldWriter} objects, linked to each other by their
-     * {@link FieldWriter#fv} field. This field stores the first element of this
-     * list.
-     */
-    FieldWriter firstField;
-
-    /**
-     * The fields of this class. These fields are stored in a linked list of
-     * {@link FieldWriter} objects, linked to each other by their
-     * {@link FieldWriter#fv} field. This field stores the last element of this
-     * list.
-     */
-    FieldWriter lastField;
-
-    /**
-     * The methods of this class. These methods are stored in a linked list of
-     * {@link MethodWriter} objects, linked to each other by their
-     * {@link MethodWriter#mv} field. This field stores the first element of
-     * this list.
-     */
-    MethodWriter firstMethod;
-
-    /**
-     * The methods of this class. These methods are stored in a linked list of
-     * {@link MethodWriter} objects, linked to each other by their
-     * {@link MethodWriter#mv} field. This field stores the last element of this
-     * list.
-     */
-    MethodWriter lastMethod;
-
-    /**
-     * <tt>true</tt> if the maximum stack size and number of local variables
-     * must be automatically computed.
-     */
-    private boolean computeMaxs;
-
-    /**
-     * <tt>true</tt> if the stack map frames must be recomputed from scratch.
-     */
-    private boolean computeFrames;
-
-    /**
-     * <tt>true</tt> if the stack map tables of this class are invalid. The
-     * {@link MethodWriter#resizeInstructions} method cannot transform existing
-     * stack map tables, and so produces potentially invalid classes when it is
-     * executed. In this case the class is reread and rewritten with the
-     * {@link #COMPUTE_FRAMES} option (the resizeInstructions method can resize
-     * stack map tables when this option is used).
-     */
-    boolean invalidFrames;
-
-    // ------------------------------------------------------------------------
-    // Static initializer
-    // ------------------------------------------------------------------------
-
-    /**
-     * Computes the instruction types of JVM opcodes.
-     */
-    static {
-        int i;
-        byte[] b = new byte[220];
-        String s = "AAAAAAAAAAAAAAAABCLMMDDDDDEEEEEEEEEEEEEEEEEEEEAAAAAAAADD"
-                + "DDDEEEEEEEEEEEEEEEEEEEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
-                + "AAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAJJJJJJJJJJJJJJJJDOPAA"
-                + "AAAAGGGGGGGHIFBFAAFFAARQJJKKJJJJJJJJJJJJJJJJJJ";
-        for (i = 0; i < b.length; ++i) {
-            b[i] = (byte) (s.charAt(i) - 'A');
-        }
-        TYPE = b;
-
-        // code to generate the above string
-        //
-        // // SBYTE_INSN instructions
-        // b[Constants.NEWARRAY] = SBYTE_INSN;
-        // b[Constants.BIPUSH] = SBYTE_INSN;
-        //
-        // // SHORT_INSN instructions
-        // b[Constants.SIPUSH] = SHORT_INSN;
-        //
-        // // (IMPL)VAR_INSN instructions
-        // b[Constants.RET] = VAR_INSN;
-        // for (i = Constants.ILOAD; i <= Constants.ALOAD; ++i) {
-        // b[i] = VAR_INSN;
-        // }
-        // for (i = Constants.ISTORE; i <= Constants.ASTORE; ++i) {
-        // b[i] = VAR_INSN;
-        // }
-        // for (i = 26; i <= 45; ++i) { // ILOAD_0 to ALOAD_3
-        // b[i] = IMPLVAR_INSN;
-        // }
-        // for (i = 59; i <= 78; ++i) { // ISTORE_0 to ASTORE_3
-        // b[i] = IMPLVAR_INSN;
-        // }
-        //
-        // // TYPE_INSN instructions
-        // b[Constants.NEW] = TYPE_INSN;
-        // b[Constants.ANEWARRAY] = TYPE_INSN;
-        // b[Constants.CHECKCAST] = TYPE_INSN;
-        // b[Constants.INSTANCEOF] = TYPE_INSN;
-        //
-        // // (Set)FIELDORMETH_INSN instructions
-        // for (i = Constants.GETSTATIC; i <= Constants.INVOKESTATIC; ++i) {
-        // b[i] = FIELDORMETH_INSN;
-        // }
-        // b[Constants.INVOKEINTERFACE] = ITFMETH_INSN;
-        // b[Constants.INVOKEDYNAMIC] = INDYMETH_INSN;
-        //
-        // // LABEL(W)_INSN instructions
-        // for (i = Constants.IFEQ; i <= Constants.JSR; ++i) {
-        // b[i] = LABEL_INSN;
-        // }
-        // b[Constants.IFNULL] = LABEL_INSN;
-        // b[Constants.IFNONNULL] = LABEL_INSN;
-        // b[200] = LABELW_INSN; // GOTO_W
-        // b[201] = LABELW_INSN; // JSR_W
-        // // temporary opcodes used internally by ASM - see Label and
-        // MethodWriter
-        // for (i = 202; i < 220; ++i) {
-        // b[i] = LABEL_INSN;
-        // }
-        //
-        // // LDC(_W) instructions
-        // b[Constants.LDC] = LDC_INSN;
-        // b[19] = LDCW_INSN; // LDC_W
-        // b[20] = LDCW_INSN; // LDC2_W
-        //
-        // // special instructions
-        // b[Constants.IINC] = IINC_INSN;
-        // b[Constants.TABLESWITCH] = TABL_INSN;
-        // b[Constants.LOOKUPSWITCH] = LOOK_INSN;
-        // b[Constants.MULTIANEWARRAY] = MANA_INSN;
-        // b[196] = WIDE_INSN; // WIDE
-        //
-        // for (i = 0; i < b.length; ++i) {
-        // System.err.print((char)('A' + b[i]));
-        // }
-        // System.err.println();
-    }
-
-    // ------------------------------------------------------------------------
-    // Constructor
-    // ------------------------------------------------------------------------
-
-    /**
-     * Constructs a new {@link ClassWriter} object.
-     *
-     * @param flags
-     *            option flags that can be used to modify the default behavior
-     *            of this class. See {@link #COMPUTE_MAXS},
-     *            {@link #COMPUTE_FRAMES}.
-     */
-    public ClassWriter(final int flags) {
-        super(Opcodes.ASM5);
-        index = 1;
-        pool = new ByteVector();
-        items = new Item[256];
-        threshold = (int) (0.75d * items.length);
-        key = new Item();
-        key2 = new Item();
-        key3 = new Item();
-        key4 = new Item();
-        this.computeMaxs = (flags & COMPUTE_MAXS) != 0;
-        this.computeFrames = (flags & COMPUTE_FRAMES) != 0;
-    }
-
-    /**
-     * Constructs a new {@link ClassWriter} object and enables optimizations for
-     * "mostly add" bytecode transformations. These optimizations are the
-     * following:
-     *
-     * <ul>
-     * <li>The constant pool from the original class is copied as is in the new
-     * class, which saves time. New constant pool entries will be added at the
-     * end if necessary, but unused constant pool entries <i>won't be
-     * removed</i>.</li>
-     * <li>Methods that are not transformed are copied as is in the new class,
-     * directly from the original class bytecode (i.e. without emitting visit
-     * events for all the method instructions), which saves a <i>lot</i> of
-     * time. Untransformed methods are detected by the fact that the
-     * {@link ClassReader} receives {@link MethodVisitor} objects that come from
-     * a {@link ClassWriter} (and not from any other {@link ClassVisitor}
-     * instance).</li>
-     * </ul>
-     *
-     * @param classReader
-     *            the {@link ClassReader} used to read the original class. It
-     *            will be used to copy the entire constant pool from the
-     *            original class and also to copy other fragments of original
-     *            bytecode where applicable.
-     * @param flags
-     *            option flags that can be used to modify the default behavior
-     *            of this class. <i>These option flags do not affect methods
-     *            that are copied as is in the new class. This means that the
-     *            maximum stack size nor the stack frames will be computed for
-     *            these methods</i>. See {@link #COMPUTE_MAXS},
-     *            {@link #COMPUTE_FRAMES}.
-     */
-    public ClassWriter(final ClassReader classReader, final int flags) {
-        this(flags);
-        classReader.copyPool(this);
-        this.cr = classReader;
-    }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the ClassVisitor abstract class
-    // ------------------------------------------------------------------------
-
-    @Override
-    public final void visit(final int version, final int access,
-            final String name, final String signature, final String superName,
-            final String[] interfaces) {
-        this.version = version;
-        this.access = access;
-        this.name = newClass(name);
-        thisName = name;
-        if (ClassReader.SIGNATURES && signature != null) {
-            this.signature = newUTF8(signature);
-        }
-        this.superName = superName == null ? 0 : newClass(superName);
-        if (interfaces != null && interfaces.length > 0) {
-            interfaceCount = interfaces.length;
-            this.interfaces = new int[interfaceCount];
-            for (int i = 0; i < interfaceCount; ++i) {
-                this.interfaces[i] = newClass(interfaces[i]);
-            }
-        }
-    }
-
-    @Override
-    public final void visitSource(final String file, final String debug) {
-        if (file != null) {
-            sourceFile = newUTF8(file);
-        }
-        if (debug != null) {
-            sourceDebug = new ByteVector().encodeUTF8(debug, 0,
-                    Integer.MAX_VALUE);
-        }
-    }
-
-    @Override
-    public final void visitOuterClass(final String owner, final String name,
-            final String desc) {
-        enclosingMethodOwner = newClass(owner);
-        if (name != null && desc != null) {
-            enclosingMethod = newNameType(name, desc);
-        }
-    }
-
-    @Override
-    public final AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        ByteVector bv = new ByteVector();
-        // write type, and reserve space for values count
-        bv.putShort(newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(this, true, bv, bv, 2);
-        if (visible) {
-            aw.next = anns;
-            anns = aw;
-        } else {
-            aw.next = ianns;
-            ianns = aw;
-        }
-        return aw;
-    }
-
-    @Override
-    public final AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, final String desc, final boolean visible) {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        ByteVector bv = new ByteVector();
-        // write target_type and target_info
-        AnnotationWriter.putTarget(typeRef, typePath, bv);
-        // write type, and reserve space for values count
-        bv.putShort(newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(this, true, bv, bv,
-                bv.length - 2);
-        if (visible) {
-            aw.next = tanns;
-            tanns = aw;
-        } else {
-            aw.next = itanns;
-            itanns = aw;
-        }
-        return aw;
-    }
-
-    @Override
-    public final void visitAttribute(final Attribute attr) {
-        attr.next = attrs;
-        attrs = attr;
-    }
-
-    @Override
-    public final void visitInnerClass(final String name,
-            final String outerName, final String innerName, final int access) {
-        if (innerClasses == null) {
-            innerClasses = new ByteVector();
-        }
-        // Sec. 4.7.6 of the JVMS states "Every CONSTANT_Class_info entry in the
-        // constant_pool table which represents a class or interface C that is
-        // not a package member must have exactly one corresponding entry in the
-        // classes array". To avoid duplicates we keep track in the intVal field
-        // of the Item of each CONSTANT_Class_info entry C whether an inner
-        // class entry has already been added for C (this field is unused for
-        // class entries, and changing its value does not change the hashcode
-        // and equality tests). If so we store the index of this inner class
-        // entry (plus one) in intVal. This hack allows duplicate detection in
-        // O(1) time.
-        Item nameItem = newClassItem(name);
-        if (nameItem.intVal == 0) {
-            ++innerClassesCount;
-            innerClasses.putShort(nameItem.index);
-            innerClasses.putShort(outerName == null ? 0 : newClass(outerName));
-            innerClasses.putShort(innerName == null ? 0 : newUTF8(innerName));
-            innerClasses.putShort(access);
-            nameItem.intVal = innerClassesCount;
-        } else {
-            // Compare the inner classes entry nameItem.intVal - 1 with the
-            // arguments of this method and throw an exception if there is a
-            // difference?
-        }
-    }
-
-    @Override
-    public final FieldVisitor visitField(final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        return new FieldWriter(this, access, name, desc, signature, value);
-    }
-
-    @Override
-    public final MethodVisitor visitMethod(final int access, final String name,
-            final String desc, final String signature, final String[] exceptions) {
-        return new MethodWriter(this, access, name, desc, signature,
-                exceptions, computeMaxs, computeFrames);
-    }
-
-    @Override
-    public final void visitEnd() {
-    }
-
-    // ------------------------------------------------------------------------
-    // Other public methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns the bytecode of the class that was build with this class writer.
-     *
-     * @return the bytecode of the class that was build with this class writer.
-     */
-    public byte[] toByteArray() {
-        if (index > 0xFFFF) {
-            throw new RuntimeException("Class file too large!");
-        }
-        // computes the real size of the bytecode of this class
-        int size = 24 + 2 * interfaceCount;
-        int nbFields = 0;
-        FieldWriter fb = firstField;
-        while (fb != null) {
-            ++nbFields;
-            size += fb.getSize();
-            fb = (FieldWriter) fb.fv;
-        }
-        int nbMethods = 0;
-        MethodWriter mb = firstMethod;
-        while (mb != null) {
-            ++nbMethods;
-            size += mb.getSize();
-            mb = (MethodWriter) mb.mv;
-        }
-        int attributeCount = 0;
-        if (bootstrapMethods != null) {
-            // we put it as first attribute in order to improve a bit
-            // ClassReader.copyBootstrapMethods
-            ++attributeCount;
-            size += 8 + bootstrapMethods.length;
-            newUTF8("BootstrapMethods");
-        }
-        if (ClassReader.SIGNATURES && signature != 0) {
-            ++attributeCount;
-            size += 8;
-            newUTF8("Signature");
-        }
-        if (sourceFile != 0) {
-            ++attributeCount;
-            size += 8;
-            newUTF8("SourceFile");
-        }
-        if (sourceDebug != null) {
-            ++attributeCount;
-            size += sourceDebug.length + 6;
-            newUTF8("SourceDebugExtension");
-        }
-        if (enclosingMethodOwner != 0) {
-            ++attributeCount;
-            size += 10;
-            newUTF8("EnclosingMethod");
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            ++attributeCount;
-            size += 6;
-            newUTF8("Deprecated");
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                ++attributeCount;
-                size += 6;
-                newUTF8("Synthetic");
-            }
-        }
-        if (innerClasses != null) {
-            ++attributeCount;
-            size += 8 + innerClasses.length;
-            newUTF8("InnerClasses");
-        }
-        if (ClassReader.ANNOTATIONS && anns != null) {
-            ++attributeCount;
-            size += 8 + anns.getSize();
-            newUTF8("RuntimeVisibleAnnotations");
-        }
-        if (ClassReader.ANNOTATIONS && ianns != null) {
-            ++attributeCount;
-            size += 8 + ianns.getSize();
-            newUTF8("RuntimeInvisibleAnnotations");
-        }
-        if (ClassReader.ANNOTATIONS && tanns != null) {
-            ++attributeCount;
-            size += 8 + tanns.getSize();
-            newUTF8("RuntimeVisibleTypeAnnotations");
-        }
-        if (ClassReader.ANNOTATIONS && itanns != null) {
-            ++attributeCount;
-            size += 8 + itanns.getSize();
-            newUTF8("RuntimeInvisibleTypeAnnotations");
-        }
-        if (attrs != null) {
-            attributeCount += attrs.getCount();
-            size += attrs.getSize(this, null, 0, -1, -1);
-        }
-        size += pool.length;
-        // allocates a byte vector of this size, in order to avoid unnecessary
-        // arraycopy operations in the ByteVector.enlarge() method
-        ByteVector out = new ByteVector(size);
-        out.putInt(0xCAFEBABE).putInt(version);
-        out.putShort(index).putByteArray(pool.data, 0, pool.length);
-        int mask = Opcodes.ACC_DEPRECATED | ACC_SYNTHETIC_ATTRIBUTE
-                | ((access & ACC_SYNTHETIC_ATTRIBUTE) / TO_ACC_SYNTHETIC);
-        out.putShort(access & ~mask).putShort(name).putShort(superName);
-        out.putShort(interfaceCount);
-        for (int i = 0; i < interfaceCount; ++i) {
-            out.putShort(interfaces[i]);
-        }
-        out.putShort(nbFields);
-        fb = firstField;
-        while (fb != null) {
-            fb.put(out);
-            fb = (FieldWriter) fb.fv;
-        }
-        out.putShort(nbMethods);
-        mb = firstMethod;
-        while (mb != null) {
-            mb.put(out);
-            mb = (MethodWriter) mb.mv;
-        }
-        out.putShort(attributeCount);
-        if (bootstrapMethods != null) {
-            out.putShort(newUTF8("BootstrapMethods"));
-            out.putInt(bootstrapMethods.length + 2).putShort(
-                    bootstrapMethodsCount);
-            out.putByteArray(bootstrapMethods.data, 0, bootstrapMethods.length);
-        }
-        if (ClassReader.SIGNATURES && signature != 0) {
-            out.putShort(newUTF8("Signature")).putInt(2).putShort(signature);
-        }
-        if (sourceFile != 0) {
-            out.putShort(newUTF8("SourceFile")).putInt(2).putShort(sourceFile);
-        }
-        if (sourceDebug != null) {
-            int len = sourceDebug.length;
-            out.putShort(newUTF8("SourceDebugExtension")).putInt(len);
-            out.putByteArray(sourceDebug.data, 0, len);
-        }
-        if (enclosingMethodOwner != 0) {
-            out.putShort(newUTF8("EnclosingMethod")).putInt(4);
-            out.putShort(enclosingMethodOwner).putShort(enclosingMethod);
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            out.putShort(newUTF8("Deprecated")).putInt(0);
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                out.putShort(newUTF8("Synthetic")).putInt(0);
-            }
-        }
-        if (innerClasses != null) {
-            out.putShort(newUTF8("InnerClasses"));
-            out.putInt(innerClasses.length + 2).putShort(innerClassesCount);
-            out.putByteArray(innerClasses.data, 0, innerClasses.length);
-        }
-        if (ClassReader.ANNOTATIONS && anns != null) {
-            out.putShort(newUTF8("RuntimeVisibleAnnotations"));
-            anns.put(out);
-        }
-        if (ClassReader.ANNOTATIONS && ianns != null) {
-            out.putShort(newUTF8("RuntimeInvisibleAnnotations"));
-            ianns.put(out);
-        }
-        if (ClassReader.ANNOTATIONS && tanns != null) {
-            out.putShort(newUTF8("RuntimeVisibleTypeAnnotations"));
-            tanns.put(out);
-        }
-        if (ClassReader.ANNOTATIONS && itanns != null) {
-            out.putShort(newUTF8("RuntimeInvisibleTypeAnnotations"));
-            itanns.put(out);
-        }
-        if (attrs != null) {
-            attrs.put(this, null, 0, -1, -1, out);
-        }
-        if (invalidFrames) {
-            anns = null;
-            ianns = null;
-            attrs = null;
-            innerClassesCount = 0;
-            innerClasses = null;
-            bootstrapMethodsCount = 0;
-            bootstrapMethods = null;
-            firstField = null;
-            lastField = null;
-            firstMethod = null;
-            lastMethod = null;
-            computeMaxs = false;
-            computeFrames = true;
-            invalidFrames = false;
-            new ClassReader(out.data).accept(this, ClassReader.SKIP_FRAMES);
-            return toByteArray();
-        }
-        return out.data;
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods: constant pool management
-    // ------------------------------------------------------------------------
-
-    /**
-     * Adds a number or string constant to the constant pool of the class being
-     * build. Does nothing if the constant pool already contains a similar item.
-     *
-     * @param cst
-     *            the value of the constant to be added to the constant pool.
-     *            This parameter must be an {@link Integer}, a {@link Float}, a
-     *            {@link Long}, a {@link Double}, a {@link String} or a
-     *            {@link Type}.
-     * @return a new or already existing constant item with the given value.
-     */
-    Item newConstItem(final Object cst) {
-        if (cst instanceof Integer) {
-            int val = ((Integer) cst).intValue();
-            return newInteger(val);
-        } else if (cst instanceof Byte) {
-            int val = ((Byte) cst).intValue();
-            return newInteger(val);
-        } else if (cst instanceof Character) {
-            int val = ((Character) cst).charValue();
-            return newInteger(val);
-        } else if (cst instanceof Short) {
-            int val = ((Short) cst).intValue();
-            return newInteger(val);
-        } else if (cst instanceof Boolean) {
-            int val = ((Boolean) cst).booleanValue() ? 1 : 0;
-            return newInteger(val);
-        } else if (cst instanceof Float) {
-            float val = ((Float) cst).floatValue();
-            return newFloat(val);
-        } else if (cst instanceof Long) {
-            long val = ((Long) cst).longValue();
-            return newLong(val);
-        } else if (cst instanceof Double) {
-            double val = ((Double) cst).doubleValue();
-            return newDouble(val);
-        } else if (cst instanceof String) {
-            return newString((String) cst);
-        } else if (cst instanceof Type) {
-            Type t = (Type) cst;
-            int s = t.getSort();
-            if (s == Type.OBJECT) {
-                return newClassItem(t.getInternalName());
-            } else if (s == Type.METHOD) {
-                return newMethodTypeItem(t.getDescriptor());
-            } else { // s == primitive type or array
-                return newClassItem(t.getDescriptor());
-            }
-        } else if (cst instanceof Handle) {
-            Handle h = (Handle) cst;
-            return newHandleItem(h.tag, h.owner, h.name, h.desc);
-        } else {
-            throw new IllegalArgumentException("value " + cst);
-        }
-    }
-
-    /**
-     * Adds a number or string constant to the constant pool of the class being
-     * build. Does nothing if the constant pool already contains a similar item.
-     * <i>This method is intended for {@link Attribute} sub classes, and is
-     * normally not needed by class generators or adapters.</i>
-     *
-     * @param cst
-     *            the value of the constant to be added to the constant pool.
-     *            This parameter must be an {@link Integer}, a {@link Float}, a
-     *            {@link Long}, a {@link Double} or a {@link String}.
-     * @return the index of a new or already existing constant item with the
-     *         given value.
-     */
-    public int newConst(final Object cst) {
-        return newConstItem(cst).index;
-    }
-
-    /**
-     * Adds an UTF8 string to the constant pool of the class being build. Does
-     * nothing if the constant pool already contains a similar item. <i>This
-     * method is intended for {@link Attribute} sub classes, and is normally not
-     * needed by class generators or adapters.</i>
-     *
-     * @param value
-     *            the String value.
-     * @return the index of a new or already existing UTF8 item.
-     */
-    public int newUTF8(final String value) {
-        key.set(UTF8, value, null, null);
-        Item result = get(key);
-        if (result == null) {
-            pool.putByte(UTF8).putUTF8(value);
-            result = new Item(index++, key);
-            put(result);
-        }
-        return result.index;
-    }
-
-    /**
-     * Adds a class reference to the constant pool of the class being build.
-     * Does nothing if the constant pool already contains a similar item.
-     * <i>This method is intended for {@link Attribute} sub classes, and is
-     * normally not needed by class generators or adapters.</i>
-     *
-     * @param value
-     *            the internal name of the class.
-     * @return a new or already existing class reference item.
-     */
-    Item newClassItem(final String value) {
-        key2.set(CLASS, value, null, null);
-        Item result = get(key2);
-        if (result == null) {
-            pool.put12(CLASS, newUTF8(value));
-            result = new Item(index++, key2);
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds a class reference to the constant pool of the class being build.
-     * Does nothing if the constant pool already contains a similar item.
-     * <i>This method is intended for {@link Attribute} sub classes, and is
-     * normally not needed by class generators or adapters.</i>
-     *
-     * @param value
-     *            the internal name of the class.
-     * @return the index of a new or already existing class reference item.
-     */
-    public int newClass(final String value) {
-        return newClassItem(value).index;
-    }
-
-    /**
-     * Adds a method type reference to the constant pool of the class being
-     * build. Does nothing if the constant pool already contains a similar item.
-     * <i>This method is intended for {@link Attribute} sub classes, and is
-     * normally not needed by class generators or adapters.</i>
-     *
-     * @param methodDesc
-     *            method descriptor of the method type.
-     * @return a new or already existing method type reference item.
-     */
-    Item newMethodTypeItem(final String methodDesc) {
-        key2.set(MTYPE, methodDesc, null, null);
-        Item result = get(key2);
-        if (result == null) {
-            pool.put12(MTYPE, newUTF8(methodDesc));
-            result = new Item(index++, key2);
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds a method type reference to the constant pool of the class being
-     * build. Does nothing if the constant pool already contains a similar item.
-     * <i>This method is intended for {@link Attribute} sub classes, and is
-     * normally not needed by class generators or adapters.</i>
-     *
-     * @param methodDesc
-     *            method descriptor of the method type.
-     * @return the index of a new or already existing method type reference
-     *         item.
-     */
-    public int newMethodType(final String methodDesc) {
-        return newMethodTypeItem(methodDesc).index;
-    }
-
-    /**
-     * Adds a handle to the constant pool of the class being build. Does nothing
-     * if the constant pool already contains a similar item. <i>This method is
-     * intended for {@link Attribute} sub classes, and is normally not needed by
-     * class generators or adapters.</i>
-     *
-     * @param tag
-     *            the kind of this handle. Must be {@link Opcodes#H_GETFIELD},
-     *            {@link Opcodes#H_GETSTATIC}, {@link Opcodes#H_PUTFIELD},
-     *            {@link Opcodes#H_PUTSTATIC}, {@link Opcodes#H_INVOKEVIRTUAL},
-     *            {@link Opcodes#H_INVOKESTATIC},
-     *            {@link Opcodes#H_INVOKESPECIAL},
-     *            {@link Opcodes#H_NEWINVOKESPECIAL} or
-     *            {@link Opcodes#H_INVOKEINTERFACE}.
-     * @param owner
-     *            the internal name of the field or method owner class.
-     * @param name
-     *            the name of the field or method.
-     * @param desc
-     *            the descriptor of the field or method.
-     * @return a new or an already existing method type reference item.
-     */
-    Item newHandleItem(final int tag, final String owner, final String name,
-            final String desc) {
-        key4.set(HANDLE_BASE + tag, owner, name, desc);
-        Item result = get(key4);
-        if (result == null) {
-            if (tag <= Opcodes.H_PUTSTATIC) {
-                put112(HANDLE, tag, newField(owner, name, desc));
-            } else {
-                put112(HANDLE,
-                        tag,
-                        newMethod(owner, name, desc,
-                                tag == Opcodes.H_INVOKEINTERFACE));
-            }
-            result = new Item(index++, key4);
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds a handle to the constant pool of the class being build. Does nothing
-     * if the constant pool already contains a similar item. <i>This method is
-     * intended for {@link Attribute} sub classes, and is normally not needed by
-     * class generators or adapters.</i>
-     *
-     * @param tag
-     *            the kind of this handle. Must be {@link Opcodes#H_GETFIELD},
-     *            {@link Opcodes#H_GETSTATIC}, {@link Opcodes#H_PUTFIELD},
-     *            {@link Opcodes#H_PUTSTATIC}, {@link Opcodes#H_INVOKEVIRTUAL},
-     *            {@link Opcodes#H_INVOKESTATIC},
-     *            {@link Opcodes#H_INVOKESPECIAL},
-     *            {@link Opcodes#H_NEWINVOKESPECIAL} or
-     *            {@link Opcodes#H_INVOKEINTERFACE}.
-     * @param owner
-     *            the internal name of the field or method owner class.
-     * @param name
-     *            the name of the field or method.
-     * @param desc
-     *            the descriptor of the field or method.
-     * @return the index of a new or already existing method type reference
-     *         item.
-     */
-    public int newHandle(final int tag, final String owner, final String name,
-            final String desc) {
-        return newHandleItem(tag, owner, name, desc).index;
-    }
-
-    /**
-     * Adds an invokedynamic reference to the constant pool of the class being
-     * build. Does nothing if the constant pool already contains a similar item.
-     * <i>This method is intended for {@link Attribute} sub classes, and is
-     * normally not needed by class generators or adapters.</i>
-     *
-     * @param name
-     *            name of the invoked method.
-     * @param desc
-     *            descriptor of the invoke method.
-     * @param bsm
-     *            the bootstrap method.
-     * @param bsmArgs
-     *            the bootstrap method constant arguments.
-     *
-     * @return a new or an already existing invokedynamic type reference item.
-     */
-    Item newInvokeDynamicItem(final String name, final String desc,
-            final Handle bsm, final Object... bsmArgs) {
-        // cache for performance
-        ByteVector bootstrapMethods = this.bootstrapMethods;
-        if (bootstrapMethods == null) {
-            bootstrapMethods = this.bootstrapMethods = new ByteVector();
-        }
-
-        int position = bootstrapMethods.length; // record current position
-
-        int hashCode = bsm.hashCode();
-        bootstrapMethods.putShort(newHandle(bsm.tag, bsm.owner, bsm.name,
-                bsm.desc));
-
-        int argsLength = bsmArgs.length;
-        bootstrapMethods.putShort(argsLength);
-
-        for (int i = 0; i < argsLength; i++) {
-            Object bsmArg = bsmArgs[i];
-            hashCode ^= bsmArg.hashCode();
-            bootstrapMethods.putShort(newConst(bsmArg));
-        }
-
-        byte[] data = bootstrapMethods.data;
-        int length = (1 + 1 + argsLength) << 1; // (bsm + argCount + arguments)
-        hashCode &= 0x7FFFFFFF;
-        Item result = items[hashCode % items.length];
-        loop: while (result != null) {
-            if (result.type != BSM || result.hashCode != hashCode) {
-                result = result.next;
-                continue;
-            }
-
-            // because the data encode the size of the argument
-            // we don't need to test if these size are equals
-            int resultPosition = result.intVal;
-            for (int p = 0; p < length; p++) {
-                if (data[position + p] != data[resultPosition + p]) {
-                    result = result.next;
-                    continue loop;
-                }
-            }
-            break;
-        }
-
-        int bootstrapMethodIndex;
-        if (result != null) {
-            bootstrapMethodIndex = result.index;
-            bootstrapMethods.length = position; // revert to old position
-        } else {
-            bootstrapMethodIndex = bootstrapMethodsCount++;
-            result = new Item(bootstrapMethodIndex);
-            result.set(position, hashCode);
-            put(result);
-        }
-
-        // now, create the InvokeDynamic constant
-        key3.set(name, desc, bootstrapMethodIndex);
-        result = get(key3);
-        if (result == null) {
-            put122(INDY, bootstrapMethodIndex, newNameType(name, desc));
-            result = new Item(index++, key3);
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds an invokedynamic reference to the constant pool of the class being
-     * build. Does nothing if the constant pool already contains a similar item.
-     * <i>This method is intended for {@link Attribute} sub classes, and is
-     * normally not needed by class generators or adapters.</i>
-     *
-     * @param name
-     *            name of the invoked method.
-     * @param desc
-     *            descriptor of the invoke method.
-     * @param bsm
-     *            the bootstrap method.
-     * @param bsmArgs
-     *            the bootstrap method constant arguments.
-     *
-     * @return the index of a new or already existing invokedynamic reference
-     *         item.
-     */
-    public int newInvokeDynamic(final String name, final String desc,
-            final Handle bsm, final Object... bsmArgs) {
-        return newInvokeDynamicItem(name, desc, bsm, bsmArgs).index;
-    }
-
-    /**
-     * Adds a field reference to the constant pool of the class being build.
-     * Does nothing if the constant pool already contains a similar item.
-     *
-     * @param owner
-     *            the internal name of the field's owner class.
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor.
-     * @return a new or already existing field reference item.
-     */
-    Item newFieldItem(final String owner, final String name, final String desc) {
-        key3.set(FIELD, owner, name, desc);
-        Item result = get(key3);
-        if (result == null) {
-            put122(FIELD, newClass(owner), newNameType(name, desc));
-            result = new Item(index++, key3);
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds a field reference to the constant pool of the class being build.
-     * Does nothing if the constant pool already contains a similar item.
-     * <i>This method is intended for {@link Attribute} sub classes, and is
-     * normally not needed by class generators or adapters.</i>
-     *
-     * @param owner
-     *            the internal name of the field's owner class.
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor.
-     * @return the index of a new or already existing field reference item.
-     */
-    public int newField(final String owner, final String name, final String desc) {
-        return newFieldItem(owner, name, desc).index;
-    }
-
-    /**
-     * Adds a method reference to the constant pool of the class being build.
-     * Does nothing if the constant pool already contains a similar item.
-     *
-     * @param owner
-     *            the internal name of the method's owner class.
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor.
-     * @param itf
-     *            <tt>true</tt> if <tt>owner</tt> is an interface.
-     * @return a new or already existing method reference item.
-     */
-    Item newMethodItem(final String owner, final String name,
-            final String desc, final boolean itf) {
-        int type = itf ? IMETH : METH;
-        key3.set(type, owner, name, desc);
-        Item result = get(key3);
-        if (result == null) {
-            put122(type, newClass(owner), newNameType(name, desc));
-            result = new Item(index++, key3);
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds a method reference to the constant pool of the class being build.
-     * Does nothing if the constant pool already contains a similar item.
-     * <i>This method is intended for {@link Attribute} sub classes, and is
-     * normally not needed by class generators or adapters.</i>
-     *
-     * @param owner
-     *            the internal name of the method's owner class.
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor.
-     * @param itf
-     *            <tt>true</tt> if <tt>owner</tt> is an interface.
-     * @return the index of a new or already existing method reference item.
-     */
-    public int newMethod(final String owner, final String name,
-            final String desc, final boolean itf) {
-        return newMethodItem(owner, name, desc, itf).index;
-    }
-
-    /**
-     * Adds an integer to the constant pool of the class being build. Does
-     * nothing if the constant pool already contains a similar item.
-     *
-     * @param value
-     *            the int value.
-     * @return a new or already existing int item.
-     */
-    Item newInteger(final int value) {
-        key.set(value);
-        Item result = get(key);
-        if (result == null) {
-            pool.putByte(INT).putInt(value);
-            result = new Item(index++, key);
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds a float to the constant pool of the class being build. Does nothing
-     * if the constant pool already contains a similar item.
-     *
-     * @param value
-     *            the float value.
-     * @return a new or already existing float item.
-     */
-    Item newFloat(final float value) {
-        key.set(value);
-        Item result = get(key);
-        if (result == null) {
-            pool.putByte(FLOAT).putInt(key.intVal);
-            result = new Item(index++, key);
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds a long to the constant pool of the class being build. Does nothing
-     * if the constant pool already contains a similar item.
-     *
-     * @param value
-     *            the long value.
-     * @return a new or already existing long item.
-     */
-    Item newLong(final long value) {
-        key.set(value);
-        Item result = get(key);
-        if (result == null) {
-            pool.putByte(LONG).putLong(value);
-            result = new Item(index, key);
-            index += 2;
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds a double to the constant pool of the class being build. Does nothing
-     * if the constant pool already contains a similar item.
-     *
-     * @param value
-     *            the double value.
-     * @return a new or already existing double item.
-     */
-    Item newDouble(final double value) {
-        key.set(value);
-        Item result = get(key);
-        if (result == null) {
-            pool.putByte(DOUBLE).putLong(key.longVal);
-            result = new Item(index, key);
-            index += 2;
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds a string to the constant pool of the class being build. Does nothing
-     * if the constant pool already contains a similar item.
-     *
-     * @param value
-     *            the String value.
-     * @return a new or already existing string item.
-     */
-    private Item newString(final String value) {
-        key2.set(STR, value, null, null);
-        Item result = get(key2);
-        if (result == null) {
-            pool.put12(STR, newUTF8(value));
-            result = new Item(index++, key2);
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds a name and type to the constant pool of the class being build. Does
-     * nothing if the constant pool already contains a similar item. <i>This
-     * method is intended for {@link Attribute} sub classes, and is normally not
-     * needed by class generators or adapters.</i>
-     *
-     * @param name
-     *            a name.
-     * @param desc
-     *            a type descriptor.
-     * @return the index of a new or already existing name and type item.
-     */
-    public int newNameType(final String name, final String desc) {
-        return newNameTypeItem(name, desc).index;
-    }
-
-    /**
-     * Adds a name and type to the constant pool of the class being build. Does
-     * nothing if the constant pool already contains a similar item.
-     *
-     * @param name
-     *            a name.
-     * @param desc
-     *            a type descriptor.
-     * @return a new or already existing name and type item.
-     */
-    Item newNameTypeItem(final String name, final String desc) {
-        key2.set(NAME_TYPE, name, desc, null);
-        Item result = get(key2);
-        if (result == null) {
-            put122(NAME_TYPE, newUTF8(name), newUTF8(desc));
-            result = new Item(index++, key2);
-            put(result);
-        }
-        return result;
-    }
-
-    /**
-     * Adds the given internal name to {@link #typeTable} and returns its index.
-     * Does nothing if the type table already contains this internal name.
-     *
-     * @param type
-     *            the internal name to be added to the type table.
-     * @return the index of this internal name in the type table.
-     */
-    int addType(final String type) {
-        key.set(TYPE_NORMAL, type, null, null);
-        Item result = get(key);
-        if (result == null) {
-            result = addType(key);
-        }
-        return result.index;
-    }
-
-    /**
-     * Adds the given "uninitialized" type to {@link #typeTable} and returns its
-     * index. This method is used for UNINITIALIZED types, made of an internal
-     * name and a bytecode offset.
-     *
-     * @param type
-     *            the internal name to be added to the type table.
-     * @param offset
-     *            the bytecode offset of the NEW instruction that created this
-     *            UNINITIALIZED type value.
-     * @return the index of this internal name in the type table.
-     */
-    int addUninitializedType(final String type, final int offset) {
-        key.type = TYPE_UNINIT;
-        key.intVal = offset;
-        key.strVal1 = type;
-        key.hashCode = 0x7FFFFFFF & (TYPE_UNINIT + type.hashCode() + offset);
-        Item result = get(key);
-        if (result == null) {
-            result = addType(key);
-        }
-        return result.index;
-    }
-
-    /**
-     * Adds the given Item to {@link #typeTable}.
-     *
-     * @param item
-     *            the value to be added to the type table.
-     * @return the added Item, which a new Item instance with the same value as
-     *         the given Item.
-     */
-    private Item addType(final Item item) {
-        ++typeCount;
-        Item result = new Item(typeCount, key);
-        put(result);
-        if (typeTable == null) {
-            typeTable = new Item[16];
-        }
-        if (typeCount == typeTable.length) {
-            Item[] newTable = new Item[2 * typeTable.length];
-            System.arraycopy(typeTable, 0, newTable, 0, typeTable.length);
-            typeTable = newTable;
-        }
-        typeTable[typeCount] = result;
-        return result;
-    }
-
-    /**
-     * Returns the index of the common super type of the two given types. This
-     * method calls {@link #getCommonSuperClass} and caches the result in the
-     * {@link #items} hash table to speedup future calls with the same
-     * parameters.
-     *
-     * @param type1
-     *            index of an internal name in {@link #typeTable}.
-     * @param type2
-     *            index of an internal name in {@link #typeTable}.
-     * @return the index of the common super type of the two given types.
-     */
-    int getMergedType(final int type1, final int type2) {
-        key2.type = TYPE_MERGED;
-        key2.longVal = type1 | (((long) type2) << 32);
-        key2.hashCode = 0x7FFFFFFF & (TYPE_MERGED + type1 + type2);
-        Item result = get(key2);
-        if (result == null) {
-            String t = typeTable[type1].strVal1;
-            String u = typeTable[type2].strVal1;
-            key2.intVal = addType(getCommonSuperClass(t, u));
-            result = new Item((short) 0, key2);
-            put(result);
-        }
-        return result.intVal;
-    }
-
-    /**
-     * Returns the common super type of the two given types. The default
-     * implementation of this method <i>loads</i> the two given classes and uses
-     * the java.lang.Class methods to find the common super class. It can be
-     * overridden to compute this common super type in other ways, in particular
-     * without actually loading any class, or to take into account the class
-     * that is currently being generated by this ClassWriter, which can of
-     * course not be loaded since it is under construction.
-     *
-     * @param type1
-     *            the internal name of a class.
-     * @param type2
-     *            the internal name of another class.
-     * @return the internal name of the common super class of the two given
-     *         classes.
-     */
-    protected String getCommonSuperClass(final String type1, final String type2) {
-        Class<?> c, d;
-        ClassLoader classLoader = getClass().getClassLoader();
-        try {
-            c = Class.forName(type1.replace('/', '.'), false, classLoader);
-            d = Class.forName(type2.replace('/', '.'), false, classLoader);
-        } catch (Exception e) {
-            throw new RuntimeException(e.toString());
-        }
-        if (c.isAssignableFrom(d)) {
-            return type1;
-        }
-        if (d.isAssignableFrom(c)) {
-            return type2;
-        }
-        if (c.isInterface() || d.isInterface()) {
-            return "java/lang/Object";
-        } else {
-            do {
-                c = c.getSuperclass();
-            } while (!c.isAssignableFrom(d));
-            return c.getName().replace('.', '/');
-        }
-    }
-
-    /**
-     * Returns the constant pool's hash table item which is equal to the given
-     * item.
-     *
-     * @param key
-     *            a constant pool item.
-     * @return the constant pool's hash table item which is equal to the given
-     *         item, or <tt>null</tt> if there is no such item.
-     */
-    private Item get(final Item key) {
-        Item i = items[key.hashCode % items.length];
-        while (i != null && (i.type != key.type || !key.isEqualTo(i))) {
-            i = i.next;
-        }
-        return i;
-    }
-
-    /**
-     * Puts the given item in the constant pool's hash table. The hash table
-     * <i>must</i> not already contains this item.
-     *
-     * @param i
-     *            the item to be added to the constant pool's hash table.
-     */
-    private void put(final Item i) {
-        if (index + typeCount > threshold) {
-            int ll = items.length;
-            int nl = ll * 2 + 1;
-            Item[] newItems = new Item[nl];
-            for (int l = ll - 1; l >= 0; --l) {
-                Item j = items[l];
-                while (j != null) {
-                    int index = j.hashCode % newItems.length;
-                    Item k = j.next;
-                    j.next = newItems[index];
-                    newItems[index] = j;
-                    j = k;
-                }
-            }
-            items = newItems;
-            threshold = (int) (nl * 0.75);
-        }
-        int index = i.hashCode % items.length;
-        i.next = items[index];
-        items[index] = i;
-    }
-
-    /**
-     * Find item that whose index is `index`.
-     */
-    public Item findItemByIndex(int index) {
-        int i = 0;
-        while (i < items.length && (items[i] == null || items[i].index != index)) i++;
-        return items[i];
-    }
-
-    /**
-     * Puts one byte and two shorts into the constant pool.
-     *
-     * @param b
-     *            a byte.
-     * @param s1
-     *            a short.
-     * @param s2
-     *            another short.
-     */
-    private void put122(final int b, final int s1, final int s2) {
-        pool.put12(b, s1).putShort(s2);
-    }
-
-    /**
-     * Puts two bytes and one short into the constant pool.
-     *
-     * @param b1
-     *            a byte.
-     * @param b2
-     *            another byte.
-     * @param s
-     *            a short.
-     */
-    private void put112(final int b1, final int b2, final int s) {
-        pool.put11(b1, b2).putShort(s);
-    }
-}
diff --git a/src/asm/scala/tools/asm/Context.java b/src/asm/scala/tools/asm/Context.java
deleted file mode 100644
index 2454696..0000000
--- a/src/asm/scala/tools/asm/Context.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package scala.tools.asm;
-
-/**
- * Information about a class being parsed in a {@link ClassReader}.
- *
- * @author Eric Bruneton
- */
-class Context {
-
-    /**
-     * Prototypes of the attributes that must be parsed for this class.
-     */
-    Attribute[] attrs;
-
-    /**
-     * The {@link ClassReader} option flags for the parsing of this class.
-     */
-    int flags;
-
-    /**
-     * The buffer used to read strings.
-     */
-    char[] buffer;
-
-    /**
-     * The start index of each bootstrap method.
-     */
-    int[] bootstrapMethods;
-
-    /**
-     * The access flags of the method currently being parsed.
-     */
-    int access;
-
-    /**
-     * The name of the method currently being parsed.
-     */
-    String name;
-
-    /**
-     * The descriptor of the method currently being parsed.
-     */
-    String desc;
-
-    /**
-     * The label objects, indexed by bytecode offset, of the method currently
-     * being parsed (only bytecode offsets for which a label is needed have a
-     * non null associated Label object).
-     */
-    Label[] labels;
-
-    /**
-     * The target of the type annotation currently being parsed.
-     */
-    int typeRef;
-
-    /**
-     * The path of the type annotation currently being parsed.
-     */
-    TypePath typePath;
-
-    /**
-     * The offset of the latest stack map frame that has been parsed.
-     */
-    int offset;
-
-    /**
-     * The labels corresponding to the start of the local variable ranges in the
-     * local variable type annotation currently being parsed.
-     */
-    Label[] start;
-
-    /**
-     * The labels corresponding to the end of the local variable ranges in the
-     * local variable type annotation currently being parsed.
-     */
-    Label[] end;
-
-    /**
-     * The local variable indices for each local variable range in the local
-     * variable type annotation currently being parsed.
-     */
-    int[] index;
-
-    /**
-     * The encoding of the latest stack map frame that has been parsed.
-     */
-    int mode;
-
-    /**
-     * The number of locals in the latest stack map frame that has been parsed.
-     */
-    int localCount;
-
-    /**
-     * The number locals in the latest stack map frame that has been parsed,
-     * minus the number of locals in the previous frame.
-     */
-    int localDiff;
-
-    /**
-     * The local values of the latest stack map frame that has been parsed.
-     */
-    Object[] local;
-
-    /**
-     * The stack size of the latest stack map frame that has been parsed.
-     */
-    int stackCount;
-
-    /**
-     * The stack values of the latest stack map frame that has been parsed.
-     */
-    Object[] stack;
-}
diff --git a/src/asm/scala/tools/asm/CustomAttr.java b/src/asm/scala/tools/asm/CustomAttr.java
deleted file mode 100644
index 5ecfd28..0000000
--- a/src/asm/scala/tools/asm/CustomAttr.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2012 LAMP/EPFL
- */
-
-package scala.tools.asm;
-
-import scala.tools.asm.Attribute;
-
-/**
- * A subclass of ASM's Attribute for the sole purpose of accessing a protected field there.
- *
- */
-public class CustomAttr extends Attribute {
-
-    public CustomAttr(final String type, final byte[] value) {
-        super(type);
-        super.value = value;
-    }
-
-}
diff --git a/src/asm/scala/tools/asm/Edge.java b/src/asm/scala/tools/asm/Edge.java
deleted file mode 100644
index daac1f7..0000000
--- a/src/asm/scala/tools/asm/Edge.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * An edge in the control flow graph of a method body. See {@link Label Label}.
- *
- * @author Eric Bruneton
- */
-class Edge {
-
-    /**
-     * Denotes a normal control flow graph edge.
-     */
-    static final int NORMAL = 0;
-
-    /**
-     * Denotes a control flow graph edge corresponding to an exception handler.
-     * More precisely any {@link Edge} whose {@link #info} is strictly positive
-     * corresponds to an exception handler. The actual value of {@link #info} is
-     * the index, in the {@link ClassWriter} type table, of the exception that
-     * is catched.
-     */
-    static final int EXCEPTION = 0x7FFFFFFF;
-
-    /**
-     * Information about this control flow graph edge. If
-     * {@link ClassWriter#COMPUTE_MAXS} is used this field is the (relative)
-     * stack size in the basic block from which this edge originates. This size
-     * is equal to the stack size at the "jump" instruction to which this edge
-     * corresponds, relatively to the stack size at the beginning of the
-     * originating basic block. If {@link ClassWriter#COMPUTE_FRAMES} is used,
-     * this field is the kind of this control flow graph edge (i.e. NORMAL or
-     * EXCEPTION).
-     */
-    int info;
-
-    /**
-     * The successor block of the basic block from which this edge originates.
-     */
-    Label successor;
-
-    /**
-     * The next edge in the list of successors of the originating basic block.
-     * See {@link Label#successors successors}.
-     */
-    Edge next;
-}
diff --git a/src/asm/scala/tools/asm/FieldVisitor.java b/src/asm/scala/tools/asm/FieldVisitor.java
deleted file mode 100644
index 708c1d3..0000000
--- a/src/asm/scala/tools/asm/FieldVisitor.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A visitor to visit a Java field. The methods of this class must be called in
- * the following order: ( <tt>visitAnnotation</tt> |
- * <tt>visitTypeAnnotation</tt> | <tt>visitAttribute</tt> )* <tt>visitEnd</tt>.
- *
- * @author Eric Bruneton
- */
-public abstract class FieldVisitor {
-
-    /**
-     * The ASM API version implemented by this visitor. The value of this field
-     * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    protected final int api;
-
-    /**
-     * The field visitor to which this visitor must delegate method calls. May
-     * be null.
-     */
-    protected FieldVisitor fv;
-
-    /**
-     * Constructs a new {@link FieldVisitor}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    public FieldVisitor(final int api) {
-        this(api, null);
-    }
-
-    /**
-     * Constructs a new {@link FieldVisitor}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param fv
-     *            the field visitor to which this visitor must delegate method
-     *            calls. May be null.
-     */
-    public FieldVisitor(final int api, final FieldVisitor fv) {
-        if (api != Opcodes.ASM4 && api != Opcodes.ASM5) {
-            throw new IllegalArgumentException();
-        }
-        this.api = api;
-        this.fv = fv;
-    }
-
-    /**
-     * Visits an annotation of the field.
-     *
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
-        if (fv != null) {
-            return fv.visitAnnotation(desc, visible);
-        }
-        return null;
-    }
-
-    /**
-     * Visits an annotation on the type of the field.
-     *
-     * @param typeRef
-     *            a reference to the annotated type. The sort of this type
-     *            reference must be {@link TypeReference#FIELD FIELD}. See
-     *            {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        if (api < Opcodes.ASM5) {
-            throw new RuntimeException();
-        }
-        if (fv != null) {
-            return fv.visitTypeAnnotation(typeRef, typePath, desc, visible);
-        }
-        return null;
-    }
-
-    /**
-     * Visits a non standard attribute of the field.
-     *
-     * @param attr
-     *            an attribute.
-     */
-    public void visitAttribute(Attribute attr) {
-        if (fv != null) {
-            fv.visitAttribute(attr);
-        }
-    }
-
-    /**
-     * Visits the end of the field. This method, which is the last one to be
-     * called, is used to inform the visitor that all the annotations and
-     * attributes of the field have been visited.
-     */
-    public void visitEnd() {
-        if (fv != null) {
-            fv.visitEnd();
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/FieldWriter.java b/src/asm/scala/tools/asm/FieldWriter.java
deleted file mode 100644
index e640a8d..0000000
--- a/src/asm/scala/tools/asm/FieldWriter.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * An {@link FieldVisitor} that generates Java fields in bytecode form.
- *
- * @author Eric Bruneton
- */
-final class FieldWriter extends FieldVisitor {
-
-    /**
-     * The class writer to which this field must be added.
-     */
-    private final ClassWriter cw;
-
-    /**
-     * Access flags of this field.
-     */
-    private final int access;
-
-    /**
-     * The index of the constant pool item that contains the name of this
-     * method.
-     */
-    private final int name;
-
-    /**
-     * The index of the constant pool item that contains the descriptor of this
-     * field.
-     */
-    private final int desc;
-
-    /**
-     * The index of the constant pool item that contains the signature of this
-     * field.
-     */
-    private int signature;
-
-    /**
-     * The index of the constant pool item that contains the constant value of
-     * this field.
-     */
-    private int value;
-
-    /**
-     * The runtime visible annotations of this field. May be <tt>null</tt>.
-     */
-    private AnnotationWriter anns;
-
-    /**
-     * The runtime invisible annotations of this field. May be <tt>null</tt>.
-     */
-    private AnnotationWriter ianns;
-
-    /**
-     * The runtime visible type annotations of this field. May be <tt>null</tt>.
-     */
-    private AnnotationWriter tanns;
-
-    /**
-     * The runtime invisible type annotations of this field. May be
-     * <tt>null</tt>.
-     */
-    private AnnotationWriter itanns;
-
-    /**
-     * The non standard attributes of this field. May be <tt>null</tt>.
-     */
-    private Attribute attrs;
-
-    // ------------------------------------------------------------------------
-    // Constructor
-    // ------------------------------------------------------------------------
-
-    /**
-     * Constructs a new {@link FieldWriter}.
-     *
-     * @param cw
-     *            the class writer to which this field must be added.
-     * @param access
-     *            the field's access flags (see {@link Opcodes}).
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor (see {@link Type}).
-     * @param signature
-     *            the field's signature. May be <tt>null</tt>.
-     * @param value
-     *            the field's constant value. May be <tt>null</tt>.
-     */
-    FieldWriter(final ClassWriter cw, final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        super(Opcodes.ASM5);
-        if (cw.firstField == null) {
-            cw.firstField = this;
-        } else {
-            cw.lastField.fv = this;
-        }
-        cw.lastField = this;
-        this.cw = cw;
-        this.access = access;
-        this.name = cw.newUTF8(name);
-        this.desc = cw.newUTF8(desc);
-        if (ClassReader.SIGNATURES && signature != null) {
-            this.signature = cw.newUTF8(signature);
-        }
-        if (value != null) {
-            this.value = cw.newConstItem(value).index;
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the FieldVisitor abstract class
-    // ------------------------------------------------------------------------
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        ByteVector bv = new ByteVector();
-        // write type, and reserve space for values count
-        bv.putShort(cw.newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv, 2);
-        if (visible) {
-            aw.next = anns;
-            anns = aw;
-        } else {
-            aw.next = ianns;
-            ianns = aw;
-        }
-        return aw;
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        ByteVector bv = new ByteVector();
-        // write target_type and target_info
-        AnnotationWriter.putTarget(typeRef, typePath, bv);
-        // write type, and reserve space for values count
-        bv.putShort(cw.newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
-                bv.length - 2);
-        if (visible) {
-            aw.next = tanns;
-            tanns = aw;
-        } else {
-            aw.next = itanns;
-            itanns = aw;
-        }
-        return aw;
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        attr.next = attrs;
-        attrs = attr;
-    }
-
-    @Override
-    public void visitEnd() {
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns the size of this field.
-     *
-     * @return the size of this field.
-     */
-    int getSize() {
-        int size = 8;
-        if (value != 0) {
-            cw.newUTF8("ConstantValue");
-            size += 8;
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((cw.version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                cw.newUTF8("Synthetic");
-                size += 6;
-            }
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            cw.newUTF8("Deprecated");
-            size += 6;
-        }
-        if (ClassReader.SIGNATURES && signature != 0) {
-            cw.newUTF8("Signature");
-            size += 8;
-        }
-        if (ClassReader.ANNOTATIONS && anns != null) {
-            cw.newUTF8("RuntimeVisibleAnnotations");
-            size += 8 + anns.getSize();
-        }
-        if (ClassReader.ANNOTATIONS && ianns != null) {
-            cw.newUTF8("RuntimeInvisibleAnnotations");
-            size += 8 + ianns.getSize();
-        }
-        if (ClassReader.ANNOTATIONS && tanns != null) {
-            cw.newUTF8("RuntimeVisibleTypeAnnotations");
-            size += 8 + tanns.getSize();
-        }
-        if (ClassReader.ANNOTATIONS && itanns != null) {
-            cw.newUTF8("RuntimeInvisibleTypeAnnotations");
-            size += 8 + itanns.getSize();
-        }
-        if (attrs != null) {
-            size += attrs.getSize(cw, null, 0, -1, -1);
-        }
-        return size;
-    }
-
-    /**
-     * Puts the content of this field into the given byte vector.
-     *
-     * @param out
-     *            where the content of this field must be put.
-     */
-    void put(final ByteVector out) {
-        final int FACTOR = ClassWriter.TO_ACC_SYNTHETIC;
-        int mask = Opcodes.ACC_DEPRECATED | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
-                | ((access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) / FACTOR);
-        out.putShort(access & ~mask).putShort(name).putShort(desc);
-        int attributeCount = 0;
-        if (value != 0) {
-            ++attributeCount;
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((cw.version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                ++attributeCount;
-            }
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            ++attributeCount;
-        }
-        if (ClassReader.SIGNATURES && signature != 0) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && anns != null) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && ianns != null) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && tanns != null) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && itanns != null) {
-            ++attributeCount;
-        }
-        if (attrs != null) {
-            attributeCount += attrs.getCount();
-        }
-        out.putShort(attributeCount);
-        if (value != 0) {
-            out.putShort(cw.newUTF8("ConstantValue"));
-            out.putInt(2).putShort(value);
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((cw.version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                out.putShort(cw.newUTF8("Synthetic")).putInt(0);
-            }
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            out.putShort(cw.newUTF8("Deprecated")).putInt(0);
-        }
-        if (ClassReader.SIGNATURES && signature != 0) {
-            out.putShort(cw.newUTF8("Signature"));
-            out.putInt(2).putShort(signature);
-        }
-        if (ClassReader.ANNOTATIONS && anns != null) {
-            out.putShort(cw.newUTF8("RuntimeVisibleAnnotations"));
-            anns.put(out);
-        }
-        if (ClassReader.ANNOTATIONS && ianns != null) {
-            out.putShort(cw.newUTF8("RuntimeInvisibleAnnotations"));
-            ianns.put(out);
-        }
-        if (ClassReader.ANNOTATIONS && tanns != null) {
-            out.putShort(cw.newUTF8("RuntimeVisibleTypeAnnotations"));
-            tanns.put(out);
-        }
-        if (ClassReader.ANNOTATIONS && itanns != null) {
-            out.putShort(cw.newUTF8("RuntimeInvisibleTypeAnnotations"));
-            itanns.put(out);
-        }
-        if (attrs != null) {
-            attrs.put(cw, null, 0, -1, -1, out);
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/Frame.java b/src/asm/scala/tools/asm/Frame.java
deleted file mode 100644
index 85ad326..0000000
--- a/src/asm/scala/tools/asm/Frame.java
+++ /dev/null
@@ -1,1462 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * Information about the input and output stack map frames of a basic block.
- *
- * @author Eric Bruneton
- */
-final class Frame {
-
-    /*
-     * Frames are computed in a two steps process: during the visit of each
-     * instruction, the state of the frame at the end of current basic block is
-     * updated by simulating the action of the instruction on the previous state
-     * of this so called "output frame". In visitMaxs, a fix point algorithm is
-     * used to compute the "input frame" of each basic block, i.e. the stack map
-     * frame at the beginning of the basic block, starting from the input frame
-     * of the first basic block (which is computed from the method descriptor),
-     * and by using the previously computed output frames to compute the input
-     * state of the other blocks.
-     *
-     * All output and input frames are stored as arrays of integers. Reference
-     * and array types are represented by an index into a type table (which is
-     * not the same as the constant pool of the class, in order to avoid adding
-     * unnecessary constants in the pool - not all computed frames will end up
-     * being stored in the stack map table). This allows very fast type
-     * comparisons.
-     *
-     * Output stack map frames are computed relatively to the input frame of the
-     * basic block, which is not yet known when output frames are computed. It
-     * is therefore necessary to be able to represent abstract types such as
-     * "the type at position x in the input frame locals" or "the type at
-     * position x from the top of the input frame stack" or even "the type at
-     * position x in the input frame, with y more (or less) array dimensions".
-     * This explains the rather complicated type format used in output frames.
-     *
-     * This format is the following: DIM KIND VALUE (4, 4 and 24 bits). DIM is a
-     * signed number of array dimensions (from -8 to 7). KIND is either BASE,
-     * LOCAL or STACK. BASE is used for types that are not relative to the input
-     * frame. LOCAL is used for types that are relative to the input local
-     * variable types. STACK is used for types that are relative to the input
-     * stack types. VALUE depends on KIND. For LOCAL types, it is an index in
-     * the input local variable types. For STACK types, it is a position
-     * relatively to the top of input frame stack. For BASE types, it is either
-     * one of the constants defined below, or for OBJECT and UNINITIALIZED
-     * types, a tag and an index in the type table.
-     *
-     * Output frames can contain types of any kind and with a positive or
-     * negative dimension (and even unassigned types, represented by 0 - which
-     * does not correspond to any valid type value). Input frames can only
-     * contain BASE types of positive or null dimension. In all cases the type
-     * table contains only internal type names (array type descriptors are
-     * forbidden - dimensions must be represented through the DIM field).
-     *
-     * The LONG and DOUBLE types are always represented by using two slots (LONG
-     * + TOP or DOUBLE + TOP), for local variable types as well as in the
-     * operand stack. This is necessary to be able to simulate DUPx_y
-     * instructions, whose effect would be dependent on the actual type values
-     * if types were always represented by a single slot in the stack (and this
-     * is not possible, since actual type values are not always known - cf LOCAL
-     * and STACK type kinds).
-     */
-
-    /**
-     * Mask to get the dimension of a frame type. This dimension is a signed
-     * integer between -8 and 7.
-     */
-    static final int DIM = 0xF0000000;
-
-    /**
-     * Constant to be added to a type to get a type with one more dimension.
-     */
-    static final int ARRAY_OF = 0x10000000;
-
-    /**
-     * Constant to be added to a type to get a type with one less dimension.
-     */
-    static final int ELEMENT_OF = 0xF0000000;
-
-    /**
-     * Mask to get the kind of a frame type.
-     *
-     * @see #BASE
-     * @see #LOCAL
-     * @see #STACK
-     */
-    static final int KIND = 0xF000000;
-
-    /**
-     * Flag used for LOCAL and STACK types. Indicates that if this type happens
-     * to be a long or double type (during the computations of input frames),
-     * then it must be set to TOP because the second word of this value has been
-     * reused to store other data in the basic block. Hence the first word no
-     * longer stores a valid long or double value.
-     */
-    static final int TOP_IF_LONG_OR_DOUBLE = 0x800000;
-
-    /**
-     * Mask to get the value of a frame type.
-     */
-    static final int VALUE = 0x7FFFFF;
-
-    /**
-     * Mask to get the kind of base types.
-     */
-    static final int BASE_KIND = 0xFF00000;
-
-    /**
-     * Mask to get the value of base types.
-     */
-    static final int BASE_VALUE = 0xFFFFF;
-
-    /**
-     * Kind of the types that are not relative to an input stack map frame.
-     */
-    static final int BASE = 0x1000000;
-
-    /**
-     * Base kind of the base reference types. The BASE_VALUE of such types is an
-     * index into the type table.
-     */
-    static final int OBJECT = BASE | 0x700000;
-
-    /**
-     * Base kind of the uninitialized base types. The BASE_VALUE of such types
-     * in an index into the type table (the Item at that index contains both an
-     * instruction offset and an internal class name).
-     */
-    static final int UNINITIALIZED = BASE | 0x800000;
-
-    /**
-     * Kind of the types that are relative to the local variable types of an
-     * input stack map frame. The value of such types is a local variable index.
-     */
-    private static final int LOCAL = 0x2000000;
-
-    /**
-     * Kind of the the types that are relative to the stack of an input stack
-     * map frame. The value of such types is a position relatively to the top of
-     * this stack.
-     */
-    private static final int STACK = 0x3000000;
-
-    /**
-     * The TOP type. This is a BASE type.
-     */
-    static final int TOP = BASE | 0;
-
-    /**
-     * The BOOLEAN type. This is a BASE type mainly used for array types.
-     */
-    static final int BOOLEAN = BASE | 9;
-
-    /**
-     * The BYTE type. This is a BASE type mainly used for array types.
-     */
-    static final int BYTE = BASE | 10;
-
-    /**
-     * The CHAR type. This is a BASE type mainly used for array types.
-     */
-    static final int CHAR = BASE | 11;
-
-    /**
-     * The SHORT type. This is a BASE type mainly used for array types.
-     */
-    static final int SHORT = BASE | 12;
-
-    /**
-     * The INTEGER type. This is a BASE type.
-     */
-    static final int INTEGER = BASE | 1;
-
-    /**
-     * The FLOAT type. This is a BASE type.
-     */
-    static final int FLOAT = BASE | 2;
-
-    /**
-     * The DOUBLE type. This is a BASE type.
-     */
-    static final int DOUBLE = BASE | 3;
-
-    /**
-     * The LONG type. This is a BASE type.
-     */
-    static final int LONG = BASE | 4;
-
-    /**
-     * The NULL type. This is a BASE type.
-     */
-    static final int NULL = BASE | 5;
-
-    /**
-     * The UNINITIALIZED_THIS type. This is a BASE type.
-     */
-    static final int UNINITIALIZED_THIS = BASE | 6;
-
-    /**
-     * The stack size variation corresponding to each JVM instruction. This
-     * stack variation is equal to the size of the values produced by an
-     * instruction, minus the size of the values consumed by this instruction.
-     */
-    static final int[] SIZE;
-
-    /**
-     * Computes the stack size variation corresponding to each JVM instruction.
-     */
-    static {
-        int i;
-        int[] b = new int[202];
-        String s = "EFFFFFFFFGGFFFGGFFFEEFGFGFEEEEEEEEEEEEEEEEEEEEDEDEDDDDD"
-                + "CDCDEEEEEEEEEEEEEEEEEEEEBABABBBBDCFFFGGGEDCDCDCDCDCDCDCDCD"
-                + "CDCEEEEDDDDDDDCDCDCEFEFDDEEFFDEDEEEBDDBBDDDDDDCCCCCCCCEFED"
-                + "DDCDCDEEEEEEEEEEFEEEEEEDDEEDDEE";
-        for (i = 0; i < b.length; ++i) {
-            b[i] = s.charAt(i) - 'E';
-        }
-        SIZE = b;
-
-        // code to generate the above string
-        //
-        // int NA = 0; // not applicable (unused opcode or variable size opcode)
-        //
-        // b = new int[] {
-        // 0, //NOP, // visitInsn
-        // 1, //ACONST_NULL, // -
-        // 1, //ICONST_M1, // -
-        // 1, //ICONST_0, // -
-        // 1, //ICONST_1, // -
-        // 1, //ICONST_2, // -
-        // 1, //ICONST_3, // -
-        // 1, //ICONST_4, // -
-        // 1, //ICONST_5, // -
-        // 2, //LCONST_0, // -
-        // 2, //LCONST_1, // -
-        // 1, //FCONST_0, // -
-        // 1, //FCONST_1, // -
-        // 1, //FCONST_2, // -
-        // 2, //DCONST_0, // -
-        // 2, //DCONST_1, // -
-        // 1, //BIPUSH, // visitIntInsn
-        // 1, //SIPUSH, // -
-        // 1, //LDC, // visitLdcInsn
-        // NA, //LDC_W, // -
-        // NA, //LDC2_W, // -
-        // 1, //ILOAD, // visitVarInsn
-        // 2, //LLOAD, // -
-        // 1, //FLOAD, // -
-        // 2, //DLOAD, // -
-        // 1, //ALOAD, // -
-        // NA, //ILOAD_0, // -
-        // NA, //ILOAD_1, // -
-        // NA, //ILOAD_2, // -
-        // NA, //ILOAD_3, // -
-        // NA, //LLOAD_0, // -
-        // NA, //LLOAD_1, // -
-        // NA, //LLOAD_2, // -
-        // NA, //LLOAD_3, // -
-        // NA, //FLOAD_0, // -
-        // NA, //FLOAD_1, // -
-        // NA, //FLOAD_2, // -
-        // NA, //FLOAD_3, // -
-        // NA, //DLOAD_0, // -
-        // NA, //DLOAD_1, // -
-        // NA, //DLOAD_2, // -
-        // NA, //DLOAD_3, // -
-        // NA, //ALOAD_0, // -
-        // NA, //ALOAD_1, // -
-        // NA, //ALOAD_2, // -
-        // NA, //ALOAD_3, // -
-        // -1, //IALOAD, // visitInsn
-        // 0, //LALOAD, // -
-        // -1, //FALOAD, // -
-        // 0, //DALOAD, // -
-        // -1, //AALOAD, // -
-        // -1, //BALOAD, // -
-        // -1, //CALOAD, // -
-        // -1, //SALOAD, // -
-        // -1, //ISTORE, // visitVarInsn
-        // -2, //LSTORE, // -
-        // -1, //FSTORE, // -
-        // -2, //DSTORE, // -
-        // -1, //ASTORE, // -
-        // NA, //ISTORE_0, // -
-        // NA, //ISTORE_1, // -
-        // NA, //ISTORE_2, // -
-        // NA, //ISTORE_3, // -
-        // NA, //LSTORE_0, // -
-        // NA, //LSTORE_1, // -
-        // NA, //LSTORE_2, // -
-        // NA, //LSTORE_3, // -
-        // NA, //FSTORE_0, // -
-        // NA, //FSTORE_1, // -
-        // NA, //FSTORE_2, // -
-        // NA, //FSTORE_3, // -
-        // NA, //DSTORE_0, // -
-        // NA, //DSTORE_1, // -
-        // NA, //DSTORE_2, // -
-        // NA, //DSTORE_3, // -
-        // NA, //ASTORE_0, // -
-        // NA, //ASTORE_1, // -
-        // NA, //ASTORE_2, // -
-        // NA, //ASTORE_3, // -
-        // -3, //IASTORE, // visitInsn
-        // -4, //LASTORE, // -
-        // -3, //FASTORE, // -
-        // -4, //DASTORE, // -
-        // -3, //AASTORE, // -
-        // -3, //BASTORE, // -
-        // -3, //CASTORE, // -
-        // -3, //SASTORE, // -
-        // -1, //POP, // -
-        // -2, //POP2, // -
-        // 1, //DUP, // -
-        // 1, //DUP_X1, // -
-        // 1, //DUP_X2, // -
-        // 2, //DUP2, // -
-        // 2, //DUP2_X1, // -
-        // 2, //DUP2_X2, // -
-        // 0, //SWAP, // -
-        // -1, //IADD, // -
-        // -2, //LADD, // -
-        // -1, //FADD, // -
-        // -2, //DADD, // -
-        // -1, //ISUB, // -
-        // -2, //LSUB, // -
-        // -1, //FSUB, // -
-        // -2, //DSUB, // -
-        // -1, //IMUL, // -
-        // -2, //LMUL, // -
-        // -1, //FMUL, // -
-        // -2, //DMUL, // -
-        // -1, //IDIV, // -
-        // -2, //LDIV, // -
-        // -1, //FDIV, // -
-        // -2, //DDIV, // -
-        // -1, //IREM, // -
-        // -2, //LREM, // -
-        // -1, //FREM, // -
-        // -2, //DREM, // -
-        // 0, //INEG, // -
-        // 0, //LNEG, // -
-        // 0, //FNEG, // -
-        // 0, //DNEG, // -
-        // -1, //ISHL, // -
-        // -1, //LSHL, // -
-        // -1, //ISHR, // -
-        // -1, //LSHR, // -
-        // -1, //IUSHR, // -
-        // -1, //LUSHR, // -
-        // -1, //IAND, // -
-        // -2, //LAND, // -
-        // -1, //IOR, // -
-        // -2, //LOR, // -
-        // -1, //IXOR, // -
-        // -2, //LXOR, // -
-        // 0, //IINC, // visitIincInsn
-        // 1, //I2L, // visitInsn
-        // 0, //I2F, // -
-        // 1, //I2D, // -
-        // -1, //L2I, // -
-        // -1, //L2F, // -
-        // 0, //L2D, // -
-        // 0, //F2I, // -
-        // 1, //F2L, // -
-        // 1, //F2D, // -
-        // -1, //D2I, // -
-        // 0, //D2L, // -
-        // -1, //D2F, // -
-        // 0, //I2B, // -
-        // 0, //I2C, // -
-        // 0, //I2S, // -
-        // -3, //LCMP, // -
-        // -1, //FCMPL, // -
-        // -1, //FCMPG, // -
-        // -3, //DCMPL, // -
-        // -3, //DCMPG, // -
-        // -1, //IFEQ, // visitJumpInsn
-        // -1, //IFNE, // -
-        // -1, //IFLT, // -
-        // -1, //IFGE, // -
-        // -1, //IFGT, // -
-        // -1, //IFLE, // -
-        // -2, //IF_ICMPEQ, // -
-        // -2, //IF_ICMPNE, // -
-        // -2, //IF_ICMPLT, // -
-        // -2, //IF_ICMPGE, // -
-        // -2, //IF_ICMPGT, // -
-        // -2, //IF_ICMPLE, // -
-        // -2, //IF_ACMPEQ, // -
-        // -2, //IF_ACMPNE, // -
-        // 0, //GOTO, // -
-        // 1, //JSR, // -
-        // 0, //RET, // visitVarInsn
-        // -1, //TABLESWITCH, // visiTableSwitchInsn
-        // -1, //LOOKUPSWITCH, // visitLookupSwitch
-        // -1, //IRETURN, // visitInsn
-        // -2, //LRETURN, // -
-        // -1, //FRETURN, // -
-        // -2, //DRETURN, // -
-        // -1, //ARETURN, // -
-        // 0, //RETURN, // -
-        // NA, //GETSTATIC, // visitFieldInsn
-        // NA, //PUTSTATIC, // -
-        // NA, //GETFIELD, // -
-        // NA, //PUTFIELD, // -
-        // NA, //INVOKEVIRTUAL, // visitMethodInsn
-        // NA, //INVOKESPECIAL, // -
-        // NA, //INVOKESTATIC, // -
-        // NA, //INVOKEINTERFACE, // -
-        // NA, //INVOKEDYNAMIC, // visitInvokeDynamicInsn
-        // 1, //NEW, // visitTypeInsn
-        // 0, //NEWARRAY, // visitIntInsn
-        // 0, //ANEWARRAY, // visitTypeInsn
-        // 0, //ARRAYLENGTH, // visitInsn
-        // NA, //ATHROW, // -
-        // 0, //CHECKCAST, // visitTypeInsn
-        // 0, //INSTANCEOF, // -
-        // -1, //MONITORENTER, // visitInsn
-        // -1, //MONITOREXIT, // -
-        // NA, //WIDE, // NOT VISITED
-        // NA, //MULTIANEWARRAY, // visitMultiANewArrayInsn
-        // -1, //IFNULL, // visitJumpInsn
-        // -1, //IFNONNULL, // -
-        // NA, //GOTO_W, // -
-        // NA, //JSR_W, // -
-        // };
-        // for (i = 0; i < b.length; ++i) {
-        // System.err.print((char)('E' + b[i]));
-        // }
-        // System.err.println();
-    }
-
-    /**
-     * The label (i.e. basic block) to which these input and output stack map
-     * frames correspond.
-     */
-    Label owner;
-
-    /**
-     * The input stack map frame locals.
-     */
-    int[] inputLocals;
-
-    /**
-     * The input stack map frame stack.
-     */
-    int[] inputStack;
-
-    /**
-     * The output stack map frame locals.
-     */
-    private int[] outputLocals;
-
-    /**
-     * The output stack map frame stack.
-     */
-    private int[] outputStack;
-
-    /**
-     * Relative size of the output stack. The exact semantics of this field
-     * depends on the algorithm that is used.
-     *
-     * When only the maximum stack size is computed, this field is the size of
-     * the output stack relatively to the top of the input stack.
-     *
-     * When the stack map frames are completely computed, this field is the
-     * actual number of types in {@link #outputStack}.
-     */
-    private int outputStackTop;
-
-    /**
-     * Number of types that are initialized in the basic block.
-     *
-     * @see #initializations
-     */
-    private int initializationCount;
-
-    /**
-     * The types that are initialized in the basic block. A constructor
-     * invocation on an UNINITIALIZED or UNINITIALIZED_THIS type must replace
-     * <i>every occurence</i> of this type in the local variables and in the
-     * operand stack. This cannot be done during the first phase of the
-     * algorithm since, during this phase, the local variables and the operand
-     * stack are not completely computed. It is therefore necessary to store the
-     * types on which constructors are invoked in the basic block, in order to
-     * do this replacement during the second phase of the algorithm, where the
-     * frames are fully computed. Note that this array can contain types that
-     * are relative to input locals or to the input stack (see below for the
-     * description of the algorithm).
-     */
-    private int[] initializations;
-
-    /**
-     * Returns the output frame local variable type at the given index.
-     *
-     * @param local
-     *            the index of the local that must be returned.
-     * @return the output frame local variable type at the given index.
-     */
-    private int get(final int local) {
-        if (outputLocals == null || local >= outputLocals.length) {
-            // this local has never been assigned in this basic block,
-            // so it is still equal to its value in the input frame
-            return LOCAL | local;
-        } else {
-            int type = outputLocals[local];
-            if (type == 0) {
-                // this local has never been assigned in this basic block,
-                // so it is still equal to its value in the input frame
-                type = outputLocals[local] = LOCAL | local;
-            }
-            return type;
-        }
-    }
-
-    /**
-     * Sets the output frame local variable type at the given index.
-     *
-     * @param local
-     *            the index of the local that must be set.
-     * @param type
-     *            the value of the local that must be set.
-     */
-    private void set(final int local, final int type) {
-        // creates and/or resizes the output local variables array if necessary
-        if (outputLocals == null) {
-            outputLocals = new int[10];
-        }
-        int n = outputLocals.length;
-        if (local >= n) {
-            int[] t = new int[Math.max(local + 1, 2 * n)];
-            System.arraycopy(outputLocals, 0, t, 0, n);
-            outputLocals = t;
-        }
-        // sets the local variable
-        outputLocals[local] = type;
-    }
-
-    /**
-     * Pushes a new type onto the output frame stack.
-     *
-     * @param type
-     *            the type that must be pushed.
-     */
-    private void push(final int type) {
-        // creates and/or resizes the output stack array if necessary
-        if (outputStack == null) {
-            outputStack = new int[10];
-        }
-        int n = outputStack.length;
-        if (outputStackTop >= n) {
-            int[] t = new int[Math.max(outputStackTop + 1, 2 * n)];
-            System.arraycopy(outputStack, 0, t, 0, n);
-            outputStack = t;
-        }
-        // pushes the type on the output stack
-        outputStack[outputStackTop++] = type;
-        // updates the maximun height reached by the output stack, if needed
-        int top = owner.inputStackTop + outputStackTop;
-        if (top > owner.outputStackMax) {
-            owner.outputStackMax = top;
-        }
-    }
-
-    /**
-     * Pushes a new type onto the output frame stack.
-     *
-     * @param cw
-     *            the ClassWriter to which this label belongs.
-     * @param desc
-     *            the descriptor of the type to be pushed. Can also be a method
-     *            descriptor (in this case this method pushes its return type
-     *            onto the output frame stack).
-     */
-    private void push(final ClassWriter cw, final String desc) {
-        int type = type(cw, desc);
-        if (type != 0) {
-            push(type);
-            if (type == LONG || type == DOUBLE) {
-                push(TOP);
-            }
-        }
-    }
-
-    /**
-     * Returns the int encoding of the given type.
-     *
-     * @param cw
-     *            the ClassWriter to which this label belongs.
-     * @param desc
-     *            a type descriptor.
-     * @return the int encoding of the given type.
-     */
-    private static int type(final ClassWriter cw, final String desc) {
-        String t;
-        int index = desc.charAt(0) == '(' ? desc.indexOf(')') + 1 : 0;
-        switch (desc.charAt(index)) {
-        case 'V':
-            return 0;
-        case 'Z':
-        case 'C':
-        case 'B':
-        case 'S':
-        case 'I':
-            return INTEGER;
-        case 'F':
-            return FLOAT;
-        case 'J':
-            return LONG;
-        case 'D':
-            return DOUBLE;
-        case 'L':
-            // stores the internal name, not the descriptor!
-            t = desc.substring(index + 1, desc.length() - 1);
-            return OBJECT | cw.addType(t);
-            // case '[':
-        default:
-            // extracts the dimensions and the element type
-            int data;
-            int dims = index + 1;
-            while (desc.charAt(dims) == '[') {
-                ++dims;
-            }
-            switch (desc.charAt(dims)) {
-            case 'Z':
-                data = BOOLEAN;
-                break;
-            case 'C':
-                data = CHAR;
-                break;
-            case 'B':
-                data = BYTE;
-                break;
-            case 'S':
-                data = SHORT;
-                break;
-            case 'I':
-                data = INTEGER;
-                break;
-            case 'F':
-                data = FLOAT;
-                break;
-            case 'J':
-                data = LONG;
-                break;
-            case 'D':
-                data = DOUBLE;
-                break;
-            // case 'L':
-            default:
-                // stores the internal name, not the descriptor
-                t = desc.substring(dims + 1, desc.length() - 1);
-                data = OBJECT | cw.addType(t);
-            }
-            return (dims - index) << 28 | data;
-        }
-    }
-
-    /**
-     * Pops a type from the output frame stack and returns its value.
-     *
-     * @return the type that has been popped from the output frame stack.
-     */
-    private int pop() {
-        if (outputStackTop > 0) {
-            return outputStack[--outputStackTop];
-        } else {
-            // if the output frame stack is empty, pops from the input stack
-            return STACK | -(--owner.inputStackTop);
-        }
-    }
-
-    /**
-     * Pops the given number of types from the output frame stack.
-     *
-     * @param elements
-     *            the number of types that must be popped.
-     */
-    private void pop(final int elements) {
-        if (outputStackTop >= elements) {
-            outputStackTop -= elements;
-        } else {
-            // if the number of elements to be popped is greater than the number
-            // of elements in the output stack, clear it, and pops the remaining
-            // elements from the input stack.
-            owner.inputStackTop -= elements - outputStackTop;
-            outputStackTop = 0;
-        }
-    }
-
-    /**
-     * Pops a type from the output frame stack.
-     *
-     * @param desc
-     *            the descriptor of the type to be popped. Can also be a method
-     *            descriptor (in this case this method pops the types
-     *            corresponding to the method arguments).
-     */
-    private void pop(final String desc) {
-        char c = desc.charAt(0);
-        if (c == '(') {
-            pop((Type.getArgumentsAndReturnSizes(desc) >> 2) - 1);
-        } else if (c == 'J' || c == 'D') {
-            pop(2);
-        } else {
-            pop(1);
-        }
-    }
-
-    /**
-     * Adds a new type to the list of types on which a constructor is invoked in
-     * the basic block.
-     *
-     * @param var
-     *            a type on a which a constructor is invoked.
-     */
-    private void init(final int var) {
-        // creates and/or resizes the initializations array if necessary
-        if (initializations == null) {
-            initializations = new int[2];
-        }
-        int n = initializations.length;
-        if (initializationCount >= n) {
-            int[] t = new int[Math.max(initializationCount + 1, 2 * n)];
-            System.arraycopy(initializations, 0, t, 0, n);
-            initializations = t;
-        }
-        // stores the type to be initialized
-        initializations[initializationCount++] = var;
-    }
-
-    /**
-     * Replaces the given type with the appropriate type if it is one of the
-     * types on which a constructor is invoked in the basic block.
-     *
-     * @param cw
-     *            the ClassWriter to which this label belongs.
-     * @param t
-     *            a type
-     * @return t or, if t is one of the types on which a constructor is invoked
-     *         in the basic block, the type corresponding to this constructor.
-     */
-    private int init(final ClassWriter cw, final int t) {
-        int s;
-        if (t == UNINITIALIZED_THIS) {
-            s = OBJECT | cw.addType(cw.thisName);
-        } else if ((t & (DIM | BASE_KIND)) == UNINITIALIZED) {
-            String type = cw.typeTable[t & BASE_VALUE].strVal1;
-            s = OBJECT | cw.addType(type);
-        } else {
-            return t;
-        }
-        for (int j = 0; j < initializationCount; ++j) {
-            int u = initializations[j];
-            int dim = u & DIM;
-            int kind = u & KIND;
-            if (kind == LOCAL) {
-                u = dim + inputLocals[u & VALUE];
-            } else if (kind == STACK) {
-                u = dim + inputStack[inputStack.length - (u & VALUE)];
-            }
-            if (t == u) {
-                return s;
-            }
-        }
-        return t;
-    }
-
-    /**
-     * Initializes the input frame of the first basic block from the method
-     * descriptor.
-     *
-     * @param cw
-     *            the ClassWriter to which this label belongs.
-     * @param access
-     *            the access flags of the method to which this label belongs.
-     * @param args
-     *            the formal parameter types of this method.
-     * @param maxLocals
-     *            the maximum number of local variables of this method.
-     */
-    void initInputFrame(final ClassWriter cw, final int access,
-            final Type[] args, final int maxLocals) {
-        inputLocals = new int[maxLocals];
-        inputStack = new int[0];
-        int i = 0;
-        if ((access & Opcodes.ACC_STATIC) == 0) {
-            if ((access & MethodWriter.ACC_CONSTRUCTOR) == 0) {
-                inputLocals[i++] = OBJECT | cw.addType(cw.thisName);
-            } else {
-                inputLocals[i++] = UNINITIALIZED_THIS;
-            }
-        }
-        for (int j = 0; j < args.length; ++j) {
-            int t = type(cw, args[j].getDescriptor());
-            inputLocals[i++] = t;
-            if (t == LONG || t == DOUBLE) {
-                inputLocals[i++] = TOP;
-            }
-        }
-        while (i < maxLocals) {
-            inputLocals[i++] = TOP;
-        }
-    }
-
-    /**
-     * Simulates the action of the given instruction on the output stack frame.
-     *
-     * @param opcode
-     *            the opcode of the instruction.
-     * @param arg
-     *            the operand of the instruction, if any.
-     * @param cw
-     *            the class writer to which this label belongs.
-     * @param item
-     *            the operand of the instructions, if any.
-     */
-    void execute(final int opcode, final int arg, final ClassWriter cw,
-            final Item item) {
-        int t1, t2, t3, t4;
-        switch (opcode) {
-        case Opcodes.NOP:
-        case Opcodes.INEG:
-        case Opcodes.LNEG:
-        case Opcodes.FNEG:
-        case Opcodes.DNEG:
-        case Opcodes.I2B:
-        case Opcodes.I2C:
-        case Opcodes.I2S:
-        case Opcodes.GOTO:
-        case Opcodes.RETURN:
-            break;
-        case Opcodes.ACONST_NULL:
-            push(NULL);
-            break;
-        case Opcodes.ICONST_M1:
-        case Opcodes.ICONST_0:
-        case Opcodes.ICONST_1:
-        case Opcodes.ICONST_2:
-        case Opcodes.ICONST_3:
-        case Opcodes.ICONST_4:
-        case Opcodes.ICONST_5:
-        case Opcodes.BIPUSH:
-        case Opcodes.SIPUSH:
-        case Opcodes.ILOAD:
-            push(INTEGER);
-            break;
-        case Opcodes.LCONST_0:
-        case Opcodes.LCONST_1:
-        case Opcodes.LLOAD:
-            push(LONG);
-            push(TOP);
-            break;
-        case Opcodes.FCONST_0:
-        case Opcodes.FCONST_1:
-        case Opcodes.FCONST_2:
-        case Opcodes.FLOAD:
-            push(FLOAT);
-            break;
-        case Opcodes.DCONST_0:
-        case Opcodes.DCONST_1:
-        case Opcodes.DLOAD:
-            push(DOUBLE);
-            push(TOP);
-            break;
-        case Opcodes.LDC:
-            switch (item.type) {
-            case ClassWriter.INT:
-                push(INTEGER);
-                break;
-            case ClassWriter.LONG:
-                push(LONG);
-                push(TOP);
-                break;
-            case ClassWriter.FLOAT:
-                push(FLOAT);
-                break;
-            case ClassWriter.DOUBLE:
-                push(DOUBLE);
-                push(TOP);
-                break;
-            case ClassWriter.CLASS:
-                push(OBJECT | cw.addType("java/lang/Class"));
-                break;
-            case ClassWriter.STR:
-                push(OBJECT | cw.addType("java/lang/String"));
-                break;
-            case ClassWriter.MTYPE:
-                push(OBJECT | cw.addType("java/lang/invoke/MethodType"));
-                break;
-            // case ClassWriter.HANDLE_BASE + [1..9]:
-            default:
-                push(OBJECT | cw.addType("java/lang/invoke/MethodHandle"));
-            }
-            break;
-        case Opcodes.ALOAD:
-            push(get(arg));
-            break;
-        case Opcodes.IALOAD:
-        case Opcodes.BALOAD:
-        case Opcodes.CALOAD:
-        case Opcodes.SALOAD:
-            pop(2);
-            push(INTEGER);
-            break;
-        case Opcodes.LALOAD:
-        case Opcodes.D2L:
-            pop(2);
-            push(LONG);
-            push(TOP);
-            break;
-        case Opcodes.FALOAD:
-            pop(2);
-            push(FLOAT);
-            break;
-        case Opcodes.DALOAD:
-        case Opcodes.L2D:
-            pop(2);
-            push(DOUBLE);
-            push(TOP);
-            break;
-        case Opcodes.AALOAD:
-            pop(1);
-            t1 = pop();
-            push(ELEMENT_OF + t1);
-            break;
-        case Opcodes.ISTORE:
-        case Opcodes.FSTORE:
-        case Opcodes.ASTORE:
-            t1 = pop();
-            set(arg, t1);
-            if (arg > 0) {
-                t2 = get(arg - 1);
-                // if t2 is of kind STACK or LOCAL we cannot know its size!
-                if (t2 == LONG || t2 == DOUBLE) {
-                    set(arg - 1, TOP);
-                } else if ((t2 & KIND) != BASE) {
-                    set(arg - 1, t2 | TOP_IF_LONG_OR_DOUBLE);
-                }
-            }
-            break;
-        case Opcodes.LSTORE:
-        case Opcodes.DSTORE:
-            pop(1);
-            t1 = pop();
-            set(arg, t1);
-            set(arg + 1, TOP);
-            if (arg > 0) {
-                t2 = get(arg - 1);
-                // if t2 is of kind STACK or LOCAL we cannot know its size!
-                if (t2 == LONG || t2 == DOUBLE) {
-                    set(arg - 1, TOP);
-                } else if ((t2 & KIND) != BASE) {
-                    set(arg - 1, t2 | TOP_IF_LONG_OR_DOUBLE);
-                }
-            }
-            break;
-        case Opcodes.IASTORE:
-        case Opcodes.BASTORE:
-        case Opcodes.CASTORE:
-        case Opcodes.SASTORE:
-        case Opcodes.FASTORE:
-        case Opcodes.AASTORE:
-            pop(3);
-            break;
-        case Opcodes.LASTORE:
-        case Opcodes.DASTORE:
-            pop(4);
-            break;
-        case Opcodes.POP:
-        case Opcodes.IFEQ:
-        case Opcodes.IFNE:
-        case Opcodes.IFLT:
-        case Opcodes.IFGE:
-        case Opcodes.IFGT:
-        case Opcodes.IFLE:
-        case Opcodes.IRETURN:
-        case Opcodes.FRETURN:
-        case Opcodes.ARETURN:
-        case Opcodes.TABLESWITCH:
-        case Opcodes.LOOKUPSWITCH:
-        case Opcodes.ATHROW:
-        case Opcodes.MONITORENTER:
-        case Opcodes.MONITOREXIT:
-        case Opcodes.IFNULL:
-        case Opcodes.IFNONNULL:
-            pop(1);
-            break;
-        case Opcodes.POP2:
-        case Opcodes.IF_ICMPEQ:
-        case Opcodes.IF_ICMPNE:
-        case Opcodes.IF_ICMPLT:
-        case Opcodes.IF_ICMPGE:
-        case Opcodes.IF_ICMPGT:
-        case Opcodes.IF_ICMPLE:
-        case Opcodes.IF_ACMPEQ:
-        case Opcodes.IF_ACMPNE:
-        case Opcodes.LRETURN:
-        case Opcodes.DRETURN:
-            pop(2);
-            break;
-        case Opcodes.DUP:
-            t1 = pop();
-            push(t1);
-            push(t1);
-            break;
-        case Opcodes.DUP_X1:
-            t1 = pop();
-            t2 = pop();
-            push(t1);
-            push(t2);
-            push(t1);
-            break;
-        case Opcodes.DUP_X2:
-            t1 = pop();
-            t2 = pop();
-            t3 = pop();
-            push(t1);
-            push(t3);
-            push(t2);
-            push(t1);
-            break;
-        case Opcodes.DUP2:
-            t1 = pop();
-            t2 = pop();
-            push(t2);
-            push(t1);
-            push(t2);
-            push(t1);
-            break;
-        case Opcodes.DUP2_X1:
-            t1 = pop();
-            t2 = pop();
-            t3 = pop();
-            push(t2);
-            push(t1);
-            push(t3);
-            push(t2);
-            push(t1);
-            break;
-        case Opcodes.DUP2_X2:
-            t1 = pop();
-            t2 = pop();
-            t3 = pop();
-            t4 = pop();
-            push(t2);
-            push(t1);
-            push(t4);
-            push(t3);
-            push(t2);
-            push(t1);
-            break;
-        case Opcodes.SWAP:
-            t1 = pop();
-            t2 = pop();
-            push(t1);
-            push(t2);
-            break;
-        case Opcodes.IADD:
-        case Opcodes.ISUB:
-        case Opcodes.IMUL:
-        case Opcodes.IDIV:
-        case Opcodes.IREM:
-        case Opcodes.IAND:
-        case Opcodes.IOR:
-        case Opcodes.IXOR:
-        case Opcodes.ISHL:
-        case Opcodes.ISHR:
-        case Opcodes.IUSHR:
-        case Opcodes.L2I:
-        case Opcodes.D2I:
-        case Opcodes.FCMPL:
-        case Opcodes.FCMPG:
-            pop(2);
-            push(INTEGER);
-            break;
-        case Opcodes.LADD:
-        case Opcodes.LSUB:
-        case Opcodes.LMUL:
-        case Opcodes.LDIV:
-        case Opcodes.LREM:
-        case Opcodes.LAND:
-        case Opcodes.LOR:
-        case Opcodes.LXOR:
-            pop(4);
-            push(LONG);
-            push(TOP);
-            break;
-        case Opcodes.FADD:
-        case Opcodes.FSUB:
-        case Opcodes.FMUL:
-        case Opcodes.FDIV:
-        case Opcodes.FREM:
-        case Opcodes.L2F:
-        case Opcodes.D2F:
-            pop(2);
-            push(FLOAT);
-            break;
-        case Opcodes.DADD:
-        case Opcodes.DSUB:
-        case Opcodes.DMUL:
-        case Opcodes.DDIV:
-        case Opcodes.DREM:
-            pop(4);
-            push(DOUBLE);
-            push(TOP);
-            break;
-        case Opcodes.LSHL:
-        case Opcodes.LSHR:
-        case Opcodes.LUSHR:
-            pop(3);
-            push(LONG);
-            push(TOP);
-            break;
-        case Opcodes.IINC:
-            set(arg, INTEGER);
-            break;
-        case Opcodes.I2L:
-        case Opcodes.F2L:
-            pop(1);
-            push(LONG);
-            push(TOP);
-            break;
-        case Opcodes.I2F:
-            pop(1);
-            push(FLOAT);
-            break;
-        case Opcodes.I2D:
-        case Opcodes.F2D:
-            pop(1);
-            push(DOUBLE);
-            push(TOP);
-            break;
-        case Opcodes.F2I:
-        case Opcodes.ARRAYLENGTH:
-        case Opcodes.INSTANCEOF:
-            pop(1);
-            push(INTEGER);
-            break;
-        case Opcodes.LCMP:
-        case Opcodes.DCMPL:
-        case Opcodes.DCMPG:
-            pop(4);
-            push(INTEGER);
-            break;
-        case Opcodes.JSR:
-        case Opcodes.RET:
-            throw new RuntimeException(
-                    "JSR/RET are not supported with computeFrames option");
-        case Opcodes.GETSTATIC:
-            push(cw, item.strVal3);
-            break;
-        case Opcodes.PUTSTATIC:
-            pop(item.strVal3);
-            break;
-        case Opcodes.GETFIELD:
-            pop(1);
-            push(cw, item.strVal3);
-            break;
-        case Opcodes.PUTFIELD:
-            pop(item.strVal3);
-            pop();
-            break;
-        case Opcodes.INVOKEVIRTUAL:
-        case Opcodes.INVOKESPECIAL:
-        case Opcodes.INVOKESTATIC:
-        case Opcodes.INVOKEINTERFACE:
-            pop(item.strVal3);
-            if (opcode != Opcodes.INVOKESTATIC) {
-                t1 = pop();
-                if (opcode == Opcodes.INVOKESPECIAL
-                        && item.strVal2.charAt(0) == '<') {
-                    init(t1);
-                }
-            }
-            push(cw, item.strVal3);
-            break;
-        case Opcodes.INVOKEDYNAMIC:
-            pop(item.strVal2);
-            push(cw, item.strVal2);
-            break;
-        case Opcodes.NEW:
-            push(UNINITIALIZED | cw.addUninitializedType(item.strVal1, arg));
-            break;
-        case Opcodes.NEWARRAY:
-            pop();
-            switch (arg) {
-            case Opcodes.T_BOOLEAN:
-                push(ARRAY_OF | BOOLEAN);
-                break;
-            case Opcodes.T_CHAR:
-                push(ARRAY_OF | CHAR);
-                break;
-            case Opcodes.T_BYTE:
-                push(ARRAY_OF | BYTE);
-                break;
-            case Opcodes.T_SHORT:
-                push(ARRAY_OF | SHORT);
-                break;
-            case Opcodes.T_INT:
-                push(ARRAY_OF | INTEGER);
-                break;
-            case Opcodes.T_FLOAT:
-                push(ARRAY_OF | FLOAT);
-                break;
-            case Opcodes.T_DOUBLE:
-                push(ARRAY_OF | DOUBLE);
-                break;
-            // case Opcodes.T_LONG:
-            default:
-                push(ARRAY_OF | LONG);
-                break;
-            }
-            break;
-        case Opcodes.ANEWARRAY:
-            String s = item.strVal1;
-            pop();
-            if (s.charAt(0) == '[') {
-                push(cw, '[' + s);
-            } else {
-                push(ARRAY_OF | OBJECT | cw.addType(s));
-            }
-            break;
-        case Opcodes.CHECKCAST:
-            s = item.strVal1;
-            pop();
-            if (s.charAt(0) == '[') {
-                push(cw, s);
-            } else {
-                push(OBJECT | cw.addType(s));
-            }
-            break;
-        // case Opcodes.MULTIANEWARRAY:
-        default:
-            pop(arg);
-            push(cw, item.strVal1);
-            break;
-        }
-    }
-
-    /**
-     * Merges the input frame of the given basic block with the input and output
-     * frames of this basic block. Returns <tt>true</tt> if the input frame of
-     * the given label has been changed by this operation.
-     *
-     * @param cw
-     *            the ClassWriter to which this label belongs.
-     * @param frame
-     *            the basic block whose input frame must be updated.
-     * @param edge
-     *            the kind of the {@link Edge} between this label and 'label'.
-     *            See {@link Edge#info}.
-     * @return <tt>true</tt> if the input frame of the given label has been
-     *         changed by this operation.
-     */
-    boolean merge(final ClassWriter cw, final Frame frame, final int edge) {
-        boolean changed = false;
-        int i, s, dim, kind, t;
-
-        int nLocal = inputLocals.length;
-        int nStack = inputStack.length;
-        if (frame.inputLocals == null) {
-            frame.inputLocals = new int[nLocal];
-            changed = true;
-        }
-
-        for (i = 0; i < nLocal; ++i) {
-            if (outputLocals != null && i < outputLocals.length) {
-                s = outputLocals[i];
-                if (s == 0) {
-                    t = inputLocals[i];
-                } else {
-                    dim = s & DIM;
-                    kind = s & KIND;
-                    if (kind == BASE) {
-                        t = s;
-                    } else {
-                        if (kind == LOCAL) {
-                            t = dim + inputLocals[s & VALUE];
-                        } else {
-                            t = dim + inputStack[nStack - (s & VALUE)];
-                        }
-                        if ((s & TOP_IF_LONG_OR_DOUBLE) != 0
-                                && (t == LONG || t == DOUBLE)) {
-                            t = TOP;
-                        }
-                    }
-                }
-            } else {
-                t = inputLocals[i];
-            }
-            if (initializations != null) {
-                t = init(cw, t);
-            }
-            changed |= merge(cw, t, frame.inputLocals, i);
-        }
-
-        if (edge > 0) {
-            for (i = 0; i < nLocal; ++i) {
-                t = inputLocals[i];
-                changed |= merge(cw, t, frame.inputLocals, i);
-            }
-            if (frame.inputStack == null) {
-                frame.inputStack = new int[1];
-                changed = true;
-            }
-            changed |= merge(cw, edge, frame.inputStack, 0);
-            return changed;
-        }
-
-        int nInputStack = inputStack.length + owner.inputStackTop;
-        if (frame.inputStack == null) {
-            frame.inputStack = new int[nInputStack + outputStackTop];
-            changed = true;
-        }
-
-        for (i = 0; i < nInputStack; ++i) {
-            t = inputStack[i];
-            if (initializations != null) {
-                t = init(cw, t);
-            }
-            changed |= merge(cw, t, frame.inputStack, i);
-        }
-        for (i = 0; i < outputStackTop; ++i) {
-            s = outputStack[i];
-            dim = s & DIM;
-            kind = s & KIND;
-            if (kind == BASE) {
-                t = s;
-            } else {
-                if (kind == LOCAL) {
-                    t = dim + inputLocals[s & VALUE];
-                } else {
-                    t = dim + inputStack[nStack - (s & VALUE)];
-                }
-                if ((s & TOP_IF_LONG_OR_DOUBLE) != 0
-                        && (t == LONG || t == DOUBLE)) {
-                    t = TOP;
-                }
-            }
-            if (initializations != null) {
-                t = init(cw, t);
-            }
-            changed |= merge(cw, t, frame.inputStack, nInputStack + i);
-        }
-        return changed;
-    }
-
-    /**
-     * Merges the type at the given index in the given type array with the given
-     * type. Returns <tt>true</tt> if the type array has been modified by this
-     * operation.
-     *
-     * @param cw
-     *            the ClassWriter to which this label belongs.
-     * @param t
-     *            the type with which the type array element must be merged.
-     * @param types
-     *            an array of types.
-     * @param index
-     *            the index of the type that must be merged in 'types'.
-     * @return <tt>true</tt> if the type array has been modified by this
-     *         operation.
-     */
-    private static boolean merge(final ClassWriter cw, int t,
-            final int[] types, final int index) {
-        int u = types[index];
-        if (u == t) {
-            // if the types are equal, merge(u,t)=u, so there is no change
-            return false;
-        }
-        if ((t & ~DIM) == NULL) {
-            if (u == NULL) {
-                return false;
-            }
-            t = NULL;
-        }
-        if (u == 0) {
-            // if types[index] has never been assigned, merge(u,t)=t
-            types[index] = t;
-            return true;
-        }
-        int v;
-        if ((u & BASE_KIND) == OBJECT || (u & DIM) != 0) {
-            // if u is a reference type of any dimension
-            if (t == NULL) {
-                // if t is the NULL type, merge(u,t)=u, so there is no change
-                return false;
-            } else if ((t & (DIM | BASE_KIND)) == (u & (DIM | BASE_KIND))) {
-                // if t and u have the same dimension and same base kind
-                if ((u & BASE_KIND) == OBJECT) {
-                    // if t is also a reference type, and if u and t have the
-                    // same dimension merge(u,t) = dim(t) | common parent of the
-                    // element types of u and t
-                    v = (t & DIM) | OBJECT
-                            | cw.getMergedType(t & BASE_VALUE, u & BASE_VALUE);
-                } else {
-                    // if u and t are array types, but not with the same element
-                    // type, merge(u,t) = dim(u) - 1 | java/lang/Object
-                    int vdim = ELEMENT_OF + (u & DIM);
-                    v = vdim | OBJECT | cw.addType("java/lang/Object");
-                }
-            } else if ((t & BASE_KIND) == OBJECT || (t & DIM) != 0) {
-                // if t is any other reference or array type, the merged type
-                // is min(udim, tdim) | java/lang/Object, where udim is the
-                // array dimension of u, minus 1 if u is an array type with a
-                // primitive element type (and similarly for tdim).
-                int tdim = (((t & DIM) == 0 || (t & BASE_KIND) == OBJECT) ? 0
-                        : ELEMENT_OF) + (t & DIM);
-                int udim = (((u & DIM) == 0 || (u & BASE_KIND) == OBJECT) ? 0
-                        : ELEMENT_OF) + (u & DIM);
-                v = Math.min(tdim, udim) | OBJECT
-                        | cw.addType("java/lang/Object");
-            } else {
-                // if t is any other type, merge(u,t)=TOP
-                v = TOP;
-            }
-        } else if (u == NULL) {
-            // if u is the NULL type, merge(u,t)=t,
-            // or TOP if t is not a reference type
-            v = (t & BASE_KIND) == OBJECT || (t & DIM) != 0 ? t : TOP;
-        } else {
-            // if u is any other type, merge(u,t)=TOP whatever t
-            v = TOP;
-        }
-        if (u != v) {
-            types[index] = v;
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/src/asm/scala/tools/asm/Handle.java b/src/asm/scala/tools/asm/Handle.java
deleted file mode 100644
index cf12bb7..0000000
--- a/src/asm/scala/tools/asm/Handle.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package scala.tools.asm;
-
-/**
- * A reference to a field or a method.
- *
- * @author Remi Forax
- * @author Eric Bruneton
- */
-public final class Handle {
-
-    /**
-     * The kind of field or method designated by this Handle. Should be
-     * {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
-     * {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
-     * {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC},
-     * {@link Opcodes#H_INVOKESPECIAL}, {@link Opcodes#H_NEWINVOKESPECIAL} or
-     * {@link Opcodes#H_INVOKEINTERFACE}.
-     */
-    final int tag;
-
-    /**
-     * The internal name of the class that owns the field or method designated
-     * by this handle.
-     */
-    final String owner;
-
-    /**
-     * The name of the field or method designated by this handle.
-     */
-    final String name;
-
-    /**
-     * The descriptor of the field or method designated by this handle.
-     */
-    final String desc;
-
-    /**
-     * Constructs a new field or method handle.
-     *
-     * @param tag
-     *            the kind of field or method designated by this Handle. Must be
-     *            {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
-     *            {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
-     *            {@link Opcodes#H_INVOKEVIRTUAL},
-     *            {@link Opcodes#H_INVOKESTATIC},
-     *            {@link Opcodes#H_INVOKESPECIAL},
-     *            {@link Opcodes#H_NEWINVOKESPECIAL} or
-     *            {@link Opcodes#H_INVOKEINTERFACE}.
-     * @param owner
-     *            the internal name of the class that owns the field or method
-     *            designated by this handle.
-     * @param name
-     *            the name of the field or method designated by this handle.
-     * @param desc
-     *            the descriptor of the field or method designated by this
-     *            handle.
-     */
-    public Handle(int tag, String owner, String name, String desc) {
-        this.tag = tag;
-        this.owner = owner;
-        this.name = name;
-        this.desc = desc;
-    }
-
-    /**
-     * Returns the kind of field or method designated by this handle.
-     *
-     * @return {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
-     *         {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
-     *         {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC},
-     *         {@link Opcodes#H_INVOKESPECIAL},
-     *         {@link Opcodes#H_NEWINVOKESPECIAL} or
-     *         {@link Opcodes#H_INVOKEINTERFACE}.
-     */
-    public int getTag() {
-        return tag;
-    }
-
-    /**
-     * Returns the internal name of the class that owns the field or method
-     * designated by this handle.
-     *
-     * @return the internal name of the class that owns the field or method
-     *         designated by this handle.
-     */
-    public String getOwner() {
-        return owner;
-    }
-
-    /**
-     * Returns the name of the field or method designated by this handle.
-     *
-     * @return the name of the field or method designated by this handle.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Returns the descriptor of the field or method designated by this handle.
-     *
-     * @return the descriptor of the field or method designated by this handle.
-     */
-    public String getDesc() {
-        return desc;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (!(obj instanceof Handle)) {
-            return false;
-        }
-        Handle h = (Handle) obj;
-        return tag == h.tag && owner.equals(h.owner) && name.equals(h.name)
-                && desc.equals(h.desc);
-    }
-
-    @Override
-    public int hashCode() {
-        return tag + owner.hashCode() * name.hashCode() * desc.hashCode();
-    }
-
-    /**
-     * Returns the textual representation of this handle. The textual
-     * representation is:
-     *
-     * <pre>
-     * owner '.' name desc ' ' '(' tag ')'
-     * </pre>
-     *
-     * . As this format is unambiguous, it can be parsed if necessary.
-     */
-    @Override
-    public String toString() {
-        return owner + '.' + name + desc + " (" + tag + ')';
-    }
-}
diff --git a/src/asm/scala/tools/asm/Handler.java b/src/asm/scala/tools/asm/Handler.java
deleted file mode 100644
index a06cb81..0000000
--- a/src/asm/scala/tools/asm/Handler.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * Information about an exception handler block.
- *
- * @author Eric Bruneton
- */
-class Handler {
-
-    /**
-     * Beginning of the exception handler's scope (inclusive).
-     */
-    Label start;
-
-    /**
-     * End of the exception handler's scope (exclusive).
-     */
-    Label end;
-
-    /**
-     * Beginning of the exception handler's code.
-     */
-    Label handler;
-
-    /**
-     * Internal name of the type of exceptions handled by this handler, or
-     * <tt>null</tt> to catch any exceptions.
-     */
-    String desc;
-
-    /**
-     * Constant pool index of the internal name of the type of exceptions
-     * handled by this handler, or 0 to catch any exceptions.
-     */
-    int type;
-
-    /**
-     * Next exception handler block info.
-     */
-    Handler next;
-
-    /**
-     * Removes the range between start and end from the given exception
-     * handlers.
-     *
-     * @param h
-     *            an exception handler list.
-     * @param start
-     *            the start of the range to be removed.
-     * @param end
-     *            the end of the range to be removed. Maybe null.
-     * @return the exception handler list with the start-end range removed.
-     */
-    static Handler remove(Handler h, Label start, Label end) {
-        if (h == null) {
-            return null;
-        } else {
-            h.next = remove(h.next, start, end);
-        }
-        int hstart = h.start.position;
-        int hend = h.end.position;
-        int s = start.position;
-        int e = end == null ? Integer.MAX_VALUE : end.position;
-        // if [hstart,hend[ and [s,e[ intervals intersect...
-        if (s < hend && e > hstart) {
-            if (s <= hstart) {
-                if (e >= hend) {
-                    // [hstart,hend[ fully included in [s,e[, h removed
-                    h = h.next;
-                } else {
-                    // [hstart,hend[ minus [s,e[ = [e,hend[
-                    h.start = end;
-                }
-            } else if (e >= hend) {
-                // [hstart,hend[ minus [s,e[ = [hstart,s[
-                h.end = start;
-            } else {
-                // [hstart,hend[ minus [s,e[ = [hstart,s[ + [e,hend[
-                Handler g = new Handler();
-                g.start = end;
-                g.end = h.end;
-                g.handler = h.handler;
-                g.desc = h.desc;
-                g.type = h.type;
-                g.next = h.next;
-                h.end = start;
-                h.next = g;
-            }
-        }
-        return h;
-    }
-}
diff --git a/src/asm/scala/tools/asm/Item.java b/src/asm/scala/tools/asm/Item.java
deleted file mode 100644
index 4693f5a..0000000
--- a/src/asm/scala/tools/asm/Item.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A constant pool item. Constant pool items can be created with the 'newXXX'
- * methods in the {@link ClassWriter} class.
- *
- * @author Eric Bruneton
- */
-final class Item {
-
-    /**
-     * Index of this item in the constant pool.
-     */
-    int index;
-
-    /**
-     * Type of this constant pool item. A single class is used to represent all
-     * constant pool item types, in order to minimize the bytecode size of this
-     * package. The value of this field is one of {@link ClassWriter#INT},
-     * {@link ClassWriter#LONG}, {@link ClassWriter#FLOAT},
-     * {@link ClassWriter#DOUBLE}, {@link ClassWriter#UTF8},
-     * {@link ClassWriter#STR}, {@link ClassWriter#CLASS},
-     * {@link ClassWriter#NAME_TYPE}, {@link ClassWriter#FIELD},
-     * {@link ClassWriter#METH}, {@link ClassWriter#IMETH},
-     * {@link ClassWriter#MTYPE}, {@link ClassWriter#INDY}.
-     *
-     * MethodHandle constant 9 variations are stored using a range of 9 values
-     * from {@link ClassWriter#HANDLE_BASE} + 1 to
-     * {@link ClassWriter#HANDLE_BASE} + 9.
-     *
-     * Special Item types are used for Items that are stored in the ClassWriter
-     * {@link ClassWriter#typeTable}, instead of the constant pool, in order to
-     * avoid clashes with normal constant pool items in the ClassWriter constant
-     * pool's hash table. These special item types are
-     * {@link ClassWriter#TYPE_NORMAL}, {@link ClassWriter#TYPE_UNINIT} and
-     * {@link ClassWriter#TYPE_MERGED}.
-     */
-    int type;
-
-    /**
-     * Value of this item, for an integer item.
-     */
-    int intVal;
-
-    /**
-     * Value of this item, for a long item.
-     */
-    long longVal;
-
-    /**
-     * First part of the value of this item, for items that do not hold a
-     * primitive value.
-     */
-    String strVal1;
-
-    /**
-     * Second part of the value of this item, for items that do not hold a
-     * primitive value.
-     */
-    String strVal2;
-
-    /**
-     * Third part of the value of this item, for items that do not hold a
-     * primitive value.
-     */
-    String strVal3;
-
-    /**
-     * The hash code value of this constant pool item.
-     */
-    int hashCode;
-
-    /**
-     * Link to another constant pool item, used for collision lists in the
-     * constant pool's hash table.
-     */
-    Item next;
-
-    /**
-     * Constructs an uninitialized {@link Item}.
-     */
-    Item() {
-    }
-
-    /**
-     * Constructs an uninitialized {@link Item} for constant pool element at
-     * given position.
-     *
-     * @param index
-     *            index of the item to be constructed.
-     */
-    Item(final int index) {
-        this.index = index;
-    }
-
-    /**
-     * Constructs a copy of the given item.
-     *
-     * @param index
-     *            index of the item to be constructed.
-     * @param i
-     *            the item that must be copied into the item to be constructed.
-     */
-    Item(final int index, final Item i) {
-        this.index = index;
-        type = i.type;
-        intVal = i.intVal;
-        longVal = i.longVal;
-        strVal1 = i.strVal1;
-        strVal2 = i.strVal2;
-        strVal3 = i.strVal3;
-        hashCode = i.hashCode;
-    }
-
-    /**
-     * Sets this item to an integer item.
-     *
-     * @param intVal
-     *            the value of this item.
-     */
-    void set(final int intVal) {
-        this.type = ClassWriter.INT;
-        this.intVal = intVal;
-        this.hashCode = 0x7FFFFFFF & (type + intVal);
-    }
-
-    /**
-     * Sets this item to a long item.
-     *
-     * @param longVal
-     *            the value of this item.
-     */
-    void set(final long longVal) {
-        this.type = ClassWriter.LONG;
-        this.longVal = longVal;
-        this.hashCode = 0x7FFFFFFF & (type + (int) longVal);
-    }
-
-    /**
-     * Sets this item to a float item.
-     *
-     * @param floatVal
-     *            the value of this item.
-     */
-    void set(final float floatVal) {
-        this.type = ClassWriter.FLOAT;
-        this.intVal = Float.floatToRawIntBits(floatVal);
-        this.hashCode = 0x7FFFFFFF & (type + (int) floatVal);
-    }
-
-    /**
-     * Sets this item to a double item.
-     *
-     * @param doubleVal
-     *            the value of this item.
-     */
-    void set(final double doubleVal) {
-        this.type = ClassWriter.DOUBLE;
-        this.longVal = Double.doubleToRawLongBits(doubleVal);
-        this.hashCode = 0x7FFFFFFF & (type + (int) doubleVal);
-    }
-
-    /**
-     * Sets this item to an item that do not hold a primitive value.
-     *
-     * @param type
-     *            the type of this item.
-     * @param strVal1
-     *            first part of the value of this item.
-     * @param strVal2
-     *            second part of the value of this item.
-     * @param strVal3
-     *            third part of the value of this item.
-     */
-    void set(final int type, final String strVal1, final String strVal2,
-            final String strVal3) {
-        this.type = type;
-        this.strVal1 = strVal1;
-        this.strVal2 = strVal2;
-        this.strVal3 = strVal3;
-        switch (type) {
-        case ClassWriter.CLASS:
-            this.intVal = 0;     // intVal of a class must be zero, see visitInnerClass
-        case ClassWriter.UTF8:
-        case ClassWriter.STR:
-        case ClassWriter.MTYPE:
-        case ClassWriter.TYPE_NORMAL:
-            hashCode = 0x7FFFFFFF & (type + strVal1.hashCode());
-            return;
-        case ClassWriter.NAME_TYPE: {
-            hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()
-                    * strVal2.hashCode());
-            return;
-        }
-        // ClassWriter.FIELD:
-        // ClassWriter.METH:
-        // ClassWriter.IMETH:
-        // ClassWriter.HANDLE_BASE + 1..9
-        default:
-            hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()
-                    * strVal2.hashCode() * strVal3.hashCode());
-        }
-    }
-
-    /**
-     * Sets the item to an InvokeDynamic item.
-     *
-     * @param name
-     *            invokedynamic's name.
-     * @param desc
-     *            invokedynamic's desc.
-     * @param bsmIndex
-     *            zero based index into the class attribute BootrapMethods.
-     */
-    void set(String name, String desc, int bsmIndex) {
-        this.type = ClassWriter.INDY;
-        this.longVal = bsmIndex;
-        this.strVal1 = name;
-        this.strVal2 = desc;
-        this.hashCode = 0x7FFFFFFF & (ClassWriter.INDY + bsmIndex
-                * strVal1.hashCode() * strVal2.hashCode());
-    }
-
-    /**
-     * Sets the item to a BootstrapMethod item.
-     *
-     * @param position
-     *            position in byte in the class attribute BootrapMethods.
-     * @param hashCode
-     *            hashcode of the item. This hashcode is processed from the
-     *            hashcode of the bootstrap method and the hashcode of all
-     *            bootstrap arguments.
-     */
-    void set(int position, int hashCode) {
-        this.type = ClassWriter.BSM;
-        this.intVal = position;
-        this.hashCode = hashCode;
-    }
-
-    /**
-     * Indicates if the given item is equal to this one. <i>This method assumes
-     * that the two items have the same {@link #type}</i>.
-     *
-     * @param i
-     *            the item to be compared to this one. Both items must have the
-     *            same {@link #type}.
-     * @return <tt>true</tt> if the given item if equal to this one,
-     *         <tt>false</tt> otherwise.
-     */
-    boolean isEqualTo(final Item i) {
-        switch (type) {
-        case ClassWriter.UTF8:
-        case ClassWriter.STR:
-        case ClassWriter.CLASS:
-        case ClassWriter.MTYPE:
-        case ClassWriter.TYPE_NORMAL:
-            return i.strVal1.equals(strVal1);
-        case ClassWriter.TYPE_MERGED:
-        case ClassWriter.LONG:
-        case ClassWriter.DOUBLE:
-            return i.longVal == longVal;
-        case ClassWriter.INT:
-        case ClassWriter.FLOAT:
-            return i.intVal == intVal;
-        case ClassWriter.TYPE_UNINIT:
-            return i.intVal == intVal && i.strVal1.equals(strVal1);
-        case ClassWriter.NAME_TYPE:
-            return i.strVal1.equals(strVal1) && i.strVal2.equals(strVal2);
-        case ClassWriter.INDY: {
-            return i.longVal == longVal && i.strVal1.equals(strVal1)
-                    && i.strVal2.equals(strVal2);
-        }
-        // case ClassWriter.FIELD:
-        // case ClassWriter.METH:
-        // case ClassWriter.IMETH:
-        // case ClassWriter.HANDLE_BASE + 1..9
-        default:
-            return i.strVal1.equals(strVal1) && i.strVal2.equals(strVal2)
-                    && i.strVal3.equals(strVal3);
-        }
-    }
-
-}
diff --git a/src/asm/scala/tools/asm/Label.java b/src/asm/scala/tools/asm/Label.java
deleted file mode 100644
index c094eba..0000000
--- a/src/asm/scala/tools/asm/Label.java
+++ /dev/null
@@ -1,560 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A label represents a position in the bytecode of a method. Labels are used
- * for jump, goto, and switch instructions, and for try catch blocks. A label
- * designates the <i>instruction</i> that is just after. Note however that there
- * can be other elements between a label and the instruction it designates (such
- * as other labels, stack map frames, line numbers, etc.).
- *
- * @author Eric Bruneton
- */
-public class Label {
-
-    /**
-     * Indicates if this label is only used for debug attributes. Such a label
-     * is not the start of a basic block, the target of a jump instruction, or
-     * an exception handler. It can be safely ignored in control flow graph
-     * analysis algorithms (for optimization purposes).
-     */
-    static final int DEBUG = 1;
-
-    /**
-     * Indicates if the position of this label is known.
-     */
-    static final int RESOLVED = 2;
-
-    /**
-     * Indicates if this label has been updated, after instruction resizing.
-     */
-    static final int RESIZED = 4;
-
-    /**
-     * Indicates if this basic block has been pushed in the basic block stack.
-     * See {@link MethodWriter#visitMaxs visitMaxs}.
-     */
-    static final int PUSHED = 8;
-
-    /**
-     * Indicates if this label is the target of a jump instruction, or the start
-     * of an exception handler.
-     */
-    static final int TARGET = 16;
-
-    /**
-     * Indicates if a stack map frame must be stored for this label.
-     */
-    static final int STORE = 32;
-
-    /**
-     * Indicates if this label corresponds to a reachable basic block.
-     */
-    static final int REACHABLE = 64;
-
-    /**
-     * Indicates if this basic block ends with a JSR instruction.
-     */
-    static final int JSR = 128;
-
-    /**
-     * Indicates if this basic block ends with a RET instruction.
-     */
-    static final int RET = 256;
-
-    /**
-     * Indicates if this basic block is the start of a subroutine.
-     */
-    static final int SUBROUTINE = 512;
-
-    /**
-     * Indicates if this subroutine basic block has been visited by a
-     * visitSubroutine(null, ...) call.
-     */
-    static final int VISITED = 1024;
-
-    /**
-     * Indicates if this subroutine basic block has been visited by a
-     * visitSubroutine(!null, ...) call.
-     */
-    static final int VISITED2 = 2048;
-
-    /**
-     * Field used to associate user information to a label. Warning: this field
-     * is used by the ASM tree package. In order to use it with the ASM tree
-     * package you must override the
-     * {@link scala.tools.asm.tree.MethodNode#getLabelNode} method.
-     */
-    public Object info;
-
-    /**
-     * Flags that indicate the status of this label.
-     *
-     * @see #DEBUG
-     * @see #RESOLVED
-     * @see #RESIZED
-     * @see #PUSHED
-     * @see #TARGET
-     * @see #STORE
-     * @see #REACHABLE
-     * @see #JSR
-     * @see #RET
-     */
-    int status;
-
-    /**
-     * The line number corresponding to this label, if known.
-     */
-    int line;
-
-    /**
-     * The position of this label in the code, if known.
-     */
-    int position;
-
-    /**
-     * Number of forward references to this label, times two.
-     */
-    private int referenceCount;
-
-    /**
-     * Informations about forward references. Each forward reference is
-     * described by two consecutive integers in this array: the first one is the
-     * position of the first byte of the bytecode instruction that contains the
-     * forward reference, while the second is the position of the first byte of
-     * the forward reference itself. In fact the sign of the first integer
-     * indicates if this reference uses 2 or 4 bytes, and its absolute value
-     * gives the position of the bytecode instruction. This array is also used
-     * as a bitset to store the subroutines to which a basic block belongs. This
-     * information is needed in {@linked MethodWriter#visitMaxs}, after all
-     * forward references have been resolved. Hence the same array can be used
-     * for both purposes without problems.
-     */
-    private int[] srcAndRefPositions;
-
-    // ------------------------------------------------------------------------
-
-    /*
-     * Fields for the control flow and data flow graph analysis algorithms (used
-     * to compute the maximum stack size or the stack map frames). A control
-     * flow graph contains one node per "basic block", and one edge per "jump"
-     * from one basic block to another. Each node (i.e., each basic block) is
-     * represented by the Label object that corresponds to the first instruction
-     * of this basic block. Each node also stores the list of its successors in
-     * the graph, as a linked list of Edge objects.
-     *
-     * The control flow analysis algorithms used to compute the maximum stack
-     * size or the stack map frames are similar and use two steps. The first
-     * step, during the visit of each instruction, builds information about the
-     * state of the local variables and the operand stack at the end of each
-     * basic block, called the "output frame", <i>relatively</i> to the frame
-     * state at the beginning of the basic block, which is called the "input
-     * frame", and which is <i>unknown</i> during this step. The second step, in
-     * {@link MethodWriter#visitMaxs}, is a fix point algorithm that computes
-     * information about the input frame of each basic block, from the input
-     * state of the first basic block (known from the method signature), and by
-     * the using the previously computed relative output frames.
-     *
-     * The algorithm used to compute the maximum stack size only computes the
-     * relative output and absolute input stack heights, while the algorithm
-     * used to compute stack map frames computes relative output frames and
-     * absolute input frames.
-     */
-
-    /**
-     * Start of the output stack relatively to the input stack. The exact
-     * semantics of this field depends on the algorithm that is used.
-     *
-     * When only the maximum stack size is computed, this field is the number of
-     * elements in the input stack.
-     *
-     * When the stack map frames are completely computed, this field is the
-     * offset of the first output stack element relatively to the top of the
-     * input stack. This offset is always negative or null. A null offset means
-     * that the output stack must be appended to the input stack. A -n offset
-     * means that the first n output stack elements must replace the top n input
-     * stack elements, and that the other elements must be appended to the input
-     * stack.
-     */
-    int inputStackTop;
-
-    /**
-     * Maximum height reached by the output stack, relatively to the top of the
-     * input stack. This maximum is always positive or null.
-     */
-    int outputStackMax;
-
-    /**
-     * Information about the input and output stack map frames of this basic
-     * block. This field is only used when {@link ClassWriter#COMPUTE_FRAMES}
-     * option is used.
-     */
-    Frame frame;
-
-    /**
-     * The successor of this label, in the order they are visited. This linked
-     * list does not include labels used for debug info only. If
-     * {@link ClassWriter#COMPUTE_FRAMES} option is used then, in addition, it
-     * does not contain successive labels that denote the same bytecode position
-     * (in this case only the first label appears in this list).
-     */
-    Label successor;
-
-    /**
-     * The successors of this node in the control flow graph. These successors
-     * are stored in a linked list of {@link Edge Edge} objects, linked to each
-     * other by their {@link Edge#next} field.
-     */
-    Edge successors;
-
-    /**
-     * The next basic block in the basic block stack. This stack is used in the
-     * main loop of the fix point algorithm used in the second step of the
-     * control flow analysis algorithms. It is also used in
-     * {@link #visitSubroutine} to avoid using a recursive method.
-     *
-     * @see MethodWriter#visitMaxs
-     */
-    Label next;
-
-    // ------------------------------------------------------------------------
-    // Constructor
-    // ------------------------------------------------------------------------
-
-    /**
-     * Constructs a new label.
-     */
-    public Label() {
-    }
-
-    // ------------------------------------------------------------------------
-    // Methods to compute offsets and to manage forward references
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns the offset corresponding to this label. This offset is computed
-     * from the start of the method's bytecode. <i>This method is intended for
-     * {@link Attribute} sub classes, and is normally not needed by class
-     * generators or adapters.</i>
-     *
-     * @return the offset corresponding to this label.
-     * @throws IllegalStateException
-     *             if this label is not resolved yet.
-     */
-    public int getOffset() {
-        if ((status & RESOLVED) == 0) {
-            throw new IllegalStateException(
-                    "Label offset position has not been resolved yet");
-        }
-        return position;
-    }
-
-    /**
-     * Puts a reference to this label in the bytecode of a method. If the
-     * position of the label is known, the offset is computed and written
-     * directly. Otherwise, a null offset is written and a new forward reference
-     * is declared for this label.
-     *
-     * @param owner
-     *            the code writer that calls this method.
-     * @param out
-     *            the bytecode of the method.
-     * @param source
-     *            the position of first byte of the bytecode instruction that
-     *            contains this label.
-     * @param wideOffset
-     *            <tt>true</tt> if the reference must be stored in 4 bytes, or
-     *            <tt>false</tt> if it must be stored with 2 bytes.
-     * @throws IllegalArgumentException
-     *             if this label has not been created by the given code writer.
-     */
-    void put(final MethodWriter owner, final ByteVector out, final int source,
-            final boolean wideOffset) {
-        if ((status & RESOLVED) == 0) {
-            if (wideOffset) {
-                addReference(-1 - source, out.length);
-                out.putInt(-1);
-            } else {
-                addReference(source, out.length);
-                out.putShort(-1);
-            }
-        } else {
-            if (wideOffset) {
-                out.putInt(position - source);
-            } else {
-                out.putShort(position - source);
-            }
-        }
-    }
-
-    /**
-     * Adds a forward reference to this label. This method must be called only
-     * for a true forward reference, i.e. only if this label is not resolved
-     * yet. For backward references, the offset of the reference can be, and
-     * must be, computed and stored directly.
-     *
-     * @param sourcePosition
-     *            the position of the referencing instruction. This position
-     *            will be used to compute the offset of this forward reference.
-     * @param referencePosition
-     *            the position where the offset for this forward reference must
-     *            be stored.
-     */
-    private void addReference(final int sourcePosition,
-            final int referencePosition) {
-        if (srcAndRefPositions == null) {
-            srcAndRefPositions = new int[6];
-        }
-        if (referenceCount >= srcAndRefPositions.length) {
-            int[] a = new int[srcAndRefPositions.length + 6];
-            System.arraycopy(srcAndRefPositions, 0, a, 0,
-                    srcAndRefPositions.length);
-            srcAndRefPositions = a;
-        }
-        srcAndRefPositions[referenceCount++] = sourcePosition;
-        srcAndRefPositions[referenceCount++] = referencePosition;
-    }
-
-    /**
-     * Resolves all forward references to this label. This method must be called
-     * when this label is added to the bytecode of the method, i.e. when its
-     * position becomes known. This method fills in the blanks that where left
-     * in the bytecode by each forward reference previously added to this label.
-     *
-     * @param owner
-     *            the code writer that calls this method.
-     * @param position
-     *            the position of this label in the bytecode.
-     * @param data
-     *            the bytecode of the method.
-     * @return <tt>true</tt> if a blank that was left for this label was to
-     *         small to store the offset. In such a case the corresponding jump
-     *         instruction is replaced with a pseudo instruction (using unused
-     *         opcodes) using an unsigned two bytes offset. These pseudo
-     *         instructions will need to be replaced with true instructions with
-     *         wider offsets (4 bytes instead of 2). This is done in
-     *         {@link MethodWriter#resizeInstructions}.
-     * @throws IllegalArgumentException
-     *             if this label has already been resolved, or if it has not
-     *             been created by the given code writer.
-     */
-    boolean resolve(final MethodWriter owner, final int position,
-            final byte[] data) {
-        boolean needUpdate = false;
-        this.status |= RESOLVED;
-        this.position = position;
-        int i = 0;
-        while (i < referenceCount) {
-            int source = srcAndRefPositions[i++];
-            int reference = srcAndRefPositions[i++];
-            int offset;
-            if (source >= 0) {
-                offset = position - source;
-                if (offset < Short.MIN_VALUE || offset > Short.MAX_VALUE) {
-                    /*
-                     * changes the opcode of the jump instruction, in order to
-                     * be able to find it later (see resizeInstructions in
-                     * MethodWriter). These temporary opcodes are similar to
-                     * jump instruction opcodes, except that the 2 bytes offset
-                     * is unsigned (and can therefore represent values from 0 to
-                     * 65535, which is sufficient since the size of a method is
-                     * limited to 65535 bytes).
-                     */
-                    int opcode = data[reference - 1] & 0xFF;
-                    if (opcode <= Opcodes.JSR) {
-                        // changes IFEQ ... JSR to opcodes 202 to 217
-                        data[reference - 1] = (byte) (opcode + 49);
-                    } else {
-                        // changes IFNULL and IFNONNULL to opcodes 218 and 219
-                        data[reference - 1] = (byte) (opcode + 20);
-                    }
-                    needUpdate = true;
-                }
-                data[reference++] = (byte) (offset >>> 8);
-                data[reference] = (byte) offset;
-            } else {
-                offset = position + source + 1;
-                data[reference++] = (byte) (offset >>> 24);
-                data[reference++] = (byte) (offset >>> 16);
-                data[reference++] = (byte) (offset >>> 8);
-                data[reference] = (byte) offset;
-            }
-        }
-        return needUpdate;
-    }
-
-    /**
-     * Returns the first label of the series to which this label belongs. For an
-     * isolated label or for the first label in a series of successive labels,
-     * this method returns the label itself. For other labels it returns the
-     * first label of the series.
-     *
-     * @return the first label of the series to which this label belongs.
-     */
-    Label getFirst() {
-        return !ClassReader.FRAMES || frame == null ? this : frame.owner;
-    }
-
-    // ------------------------------------------------------------------------
-    // Methods related to subroutines
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns true is this basic block belongs to the given subroutine.
-     *
-     * @param id
-     *            a subroutine id.
-     * @return true is this basic block belongs to the given subroutine.
-     */
-    boolean inSubroutine(final long id) {
-        if ((status & Label.VISITED) != 0) {
-            return (srcAndRefPositions[(int) (id >>> 32)] & (int) id) != 0;
-        }
-        return false;
-    }
-
-    /**
-     * Returns true if this basic block and the given one belong to a common
-     * subroutine.
-     *
-     * @param block
-     *            another basic block.
-     * @return true if this basic block and the given one belong to a common
-     *         subroutine.
-     */
-    boolean inSameSubroutine(final Label block) {
-        if ((status & VISITED) == 0 || (block.status & VISITED) == 0) {
-            return false;
-        }
-        for (int i = 0; i < srcAndRefPositions.length; ++i) {
-            if ((srcAndRefPositions[i] & block.srcAndRefPositions[i]) != 0) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Marks this basic block as belonging to the given subroutine.
-     *
-     * @param id
-     *            a subroutine id.
-     * @param nbSubroutines
-     *            the total number of subroutines in the method.
-     */
-    void addToSubroutine(final long id, final int nbSubroutines) {
-        if ((status & VISITED) == 0) {
-            status |= VISITED;
-            srcAndRefPositions = new int[(nbSubroutines - 1) / 32 + 1];
-        }
-        srcAndRefPositions[(int) (id >>> 32)] |= (int) id;
-    }
-
-    /**
-     * Finds the basic blocks that belong to a given subroutine, and marks these
-     * blocks as belonging to this subroutine. This method follows the control
-     * flow graph to find all the blocks that are reachable from the current
-     * block WITHOUT following any JSR target.
-     *
-     * @param JSR
-     *            a JSR block that jumps to this subroutine. If this JSR is not
-     *            null it is added to the successor of the RET blocks found in
-     *            the subroutine.
-     * @param id
-     *            the id of this subroutine.
-     * @param nbSubroutines
-     *            the total number of subroutines in the method.
-     */
-    void visitSubroutine(final Label JSR, final long id, final int nbSubroutines) {
-        // user managed stack of labels, to avoid using a recursive method
-        // (recursivity can lead to stack overflow with very large methods)
-        Label stack = this;
-        while (stack != null) {
-            // removes a label l from the stack
-            Label l = stack;
-            stack = l.next;
-            l.next = null;
-
-            if (JSR != null) {
-                if ((l.status & VISITED2) != 0) {
-                    continue;
-                }
-                l.status |= VISITED2;
-                // adds JSR to the successors of l, if it is a RET block
-                if ((l.status & RET) != 0) {
-                    if (!l.inSameSubroutine(JSR)) {
-                        Edge e = new Edge();
-                        e.info = l.inputStackTop;
-                        e.successor = JSR.successors.successor;
-                        e.next = l.successors;
-                        l.successors = e;
-                    }
-                }
-            } else {
-                // if the l block already belongs to subroutine 'id', continue
-                if (l.inSubroutine(id)) {
-                    continue;
-                }
-                // marks the l block as belonging to subroutine 'id'
-                l.addToSubroutine(id, nbSubroutines);
-            }
-            // pushes each successor of l on the stack, except JSR targets
-            Edge e = l.successors;
-            while (e != null) {
-                // if the l block is a JSR block, then 'l.successors.next' leads
-                // to the JSR target (see {@link #visitJumpInsn}) and must
-                // therefore not be followed
-                if ((l.status & Label.JSR) == 0 || e != l.successors.next) {
-                    // pushes e.successor on the stack if it not already added
-                    if (e.successor.next == null) {
-                        e.successor.next = stack;
-                        stack = e.successor;
-                    }
-                }
-                e = e.next;
-            }
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Overridden Object methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns a string representation of this label.
-     *
-     * @return a string representation of this label.
-     */
-    @Override
-    public String toString() {
-        return "L" + System.identityHashCode(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/MethodVisitor.java b/src/asm/scala/tools/asm/MethodVisitor.java
deleted file mode 100644
index bddc325..0000000
--- a/src/asm/scala/tools/asm/MethodVisitor.java
+++ /dev/null
@@ -1,880 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A visitor to visit a Java method. The methods of this class must be called in
- * the following order: ( <tt>visitParameter</tt> )* [
- * <tt>visitAnnotationDefault</tt> ] ( <tt>visitAnnotation</tt> |
- * <tt>visitTypeAnnotation</tt> | <tt>visitAttribute</tt> )* [
- * <tt>visitCode</tt> ( <tt>visitFrame</tt> | <tt>visit<i>X</i>Insn</tt> |
- * <tt>visitLabel</tt> | <tt>visitInsnAnnotation</tt> |
- * <tt>visitTryCatchBlock</tt> | <tt>visitTryCatchBlockAnnotation</tt> |
- * <tt>visitLocalVariable</tt> | <tt>visitLocalVariableAnnotation</tt> |
- * <tt>visitLineNumber</tt> )* <tt>visitMaxs</tt> ] <tt>visitEnd</tt>. In
- * addition, the <tt>visit<i>X</i>Insn</tt> and <tt>visitLabel</tt> methods must
- * be called in the sequential order of the bytecode instructions of the visited
- * code, <tt>visitInsnAnnotation</tt> must be called <i>after</i> the annotated
- * instruction, <tt>visitTryCatchBlock</tt> must be called <i>before</i> the
- * labels passed as arguments have been visited,
- * <tt>visitTryCatchBlockAnnotation</tt> must be called <i>after</i> the
- * corresponding try catch block has been visited, and the
- * <tt>visitLocalVariable</tt>, <tt>visitLocalVariableAnnotation</tt> and
- * <tt>visitLineNumber</tt> methods must be called <i>after</i> the labels
- * passed as arguments have been visited.
- *
- * @author Eric Bruneton
- */
-public abstract class MethodVisitor {
-
-    /**
-     * The ASM API version implemented by this visitor. The value of this field
-     * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    protected final int api;
-
-    /**
-     * The method visitor to which this visitor must delegate method calls. May
-     * be null.
-     */
-    protected MethodVisitor mv;
-
-    /**
-     * Constructs a new {@link MethodVisitor}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    public MethodVisitor(final int api) {
-        this(api, null);
-    }
-
-    /**
-     * Constructs a new {@link MethodVisitor}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param mv
-     *            the method visitor to which this visitor must delegate method
-     *            calls. May be null.
-     */
-    public MethodVisitor(final int api, final MethodVisitor mv) {
-        if (api != Opcodes.ASM4 && api != Opcodes.ASM5) {
-            throw new IllegalArgumentException();
-        }
-        this.api = api;
-        this.mv = mv;
-    }
-
-    // -------------------------------------------------------------------------
-    // Parameters, annotations and non standard attributes
-    // -------------------------------------------------------------------------
-
-    /**
-     * Visits a parameter of this method.
-     *
-     * @param name
-     *            parameter name or null if none is provided.
-     * @param access
-     *            the parameter's access flags, only <tt>ACC_FINAL</tt>,
-     *            <tt>ACC_SYNTHETIC</tt> or/and <tt>ACC_MANDATED</tt> are
-     *            allowed (see {@link Opcodes}).
-     */
-    public void visitParameter(String name, int access) {
-        if (api < Opcodes.ASM5) {
-            throw new RuntimeException();
-        }
-        if (mv != null) {
-            mv.visitParameter(name, access);
-        }
-    }
-
-    /**
-     * Visits the default value of this annotation interface method.
-     *
-     * @return a visitor to the visit the actual default value of this
-     *         annotation interface method, or <tt>null</tt> if this visitor is
-     *         not interested in visiting this default value. The 'name'
-     *         parameters passed to the methods of this annotation visitor are
-     *         ignored. Moreover, exacly one visit method must be called on this
-     *         annotation visitor, followed by visitEnd.
-     */
-    public AnnotationVisitor visitAnnotationDefault() {
-        if (mv != null) {
-            return mv.visitAnnotationDefault();
-        }
-        return null;
-    }
-
-    /**
-     * Visits an annotation of this method.
-     *
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
-        if (mv != null) {
-            return mv.visitAnnotation(desc, visible);
-        }
-        return null;
-    }
-
-    /**
-     * Visits an annotation on a type in the method signature.
-     *
-     * @param typeRef
-     *            a reference to the annotated type. The sort of this type
-     *            reference must be {@link TypeReference#METHOD_TYPE_PARAMETER
-     *            METHOD_TYPE_PARAMETER},
-     *            {@link TypeReference#METHOD_TYPE_PARAMETER_BOUND
-     *            METHOD_TYPE_PARAMETER_BOUND},
-     *            {@link TypeReference#METHOD_RETURN METHOD_RETURN},
-     *            {@link TypeReference#METHOD_RECEIVER METHOD_RECEIVER},
-     *            {@link TypeReference#METHOD_FORMAL_PARAMETER
-     *            METHOD_FORMAL_PARAMETER} or {@link TypeReference#THROWS
-     *            THROWS}. See {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        if (api < Opcodes.ASM5) {
-            throw new RuntimeException();
-        }
-        if (mv != null) {
-            return mv.visitTypeAnnotation(typeRef, typePath, desc, visible);
-        }
-        return null;
-    }
-
-    /**
-     * Visits an annotation of a parameter this method.
-     *
-     * @param parameter
-     *            the parameter index.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitParameterAnnotation(int parameter,
-            String desc, boolean visible) {
-        if (mv != null) {
-            return mv.visitParameterAnnotation(parameter, desc, visible);
-        }
-        return null;
-    }
-
-    /**
-     * Visits a non standard attribute of this method.
-     *
-     * @param attr
-     *            an attribute.
-     */
-    public void visitAttribute(Attribute attr) {
-        if (mv != null) {
-            mv.visitAttribute(attr);
-        }
-    }
-
-    /**
-     * Starts the visit of the method's code, if any (i.e. non abstract method).
-     */
-    public void visitCode() {
-        if (mv != null) {
-            mv.visitCode();
-        }
-    }
-
-    /**
-     * Visits the current state of the local variables and operand stack
-     * elements. This method must(*) be called <i>just before</i> any
-     * instruction <b>i</b> that follows an unconditional branch instruction
-     * such as GOTO or THROW, that is the target of a jump instruction, or that
-     * starts an exception handler block. The visited types must describe the
-     * values of the local variables and of the operand stack elements <i>just
-     * before</i> <b>i</b> is executed.<br>
-     * <br>
-     * (*) this is mandatory only for classes whose version is greater than or
-     * equal to {@link Opcodes#V1_6 V1_6}. <br>
-     * <br>
-     * The frames of a method must be given either in expanded form, or in
-     * compressed form (all frames must use the same format, i.e. you must not
-     * mix expanded and compressed frames within a single method):
-     * <ul>
-     * <li>In expanded form, all frames must have the F_NEW type.</li>
-     * <li>In compressed form, frames are basically "deltas" from the state of
-     * the previous frame:
-     * <ul>
-     * <li>{@link Opcodes#F_SAME} representing frame with exactly the same
-     * locals as the previous frame and with the empty stack.</li>
-     * <li>{@link Opcodes#F_SAME1} representing frame with exactly the same
-     * locals as the previous frame and with single value on the stack (
-     * <code>nStack</code> is 1 and <code>stack[0]</code> contains value for the
-     * type of the stack item).</li>
-     * <li>{@link Opcodes#F_APPEND} representing frame with current locals are
-     * the same as the locals in the previous frame, except that additional
-     * locals are defined (<code>nLocal</code> is 1, 2 or 3 and
-     * <code>local</code> elements contains values representing added types).</li>
-     * <li>{@link Opcodes#F_CHOP} representing frame with current locals are the
-     * same as the locals in the previous frame, except that the last 1-3 locals
-     * are absent and with the empty stack (<code>nLocals</code> is 1, 2 or 3).</li>
-     * <li>{@link Opcodes#F_FULL} representing complete frame data.</li>
-     * </ul>
-     * </li>
-     * </ul>
-     * <br>
-     * In both cases the first frame, corresponding to the method's parameters
-     * and access flags, is implicit and must not be visited. Also, it is
-     * illegal to visit two or more frames for the same code location (i.e., at
-     * least one instruction must be visited between two calls to visitFrame).
-     *
-     * @param type
-     *            the type of this stack map frame. Must be
-     *            {@link Opcodes#F_NEW} for expanded frames, or
-     *            {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND},
-     *            {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME} or
-     *            {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for
-     *            compressed frames.
-     * @param nLocal
-     *            the number of local variables in the visited frame.
-     * @param local
-     *            the local variable types in this frame. This array must not be
-     *            modified. Primitive types are represented by
-     *            {@link Opcodes#TOP}, {@link Opcodes#INTEGER},
-     *            {@link Opcodes#FLOAT}, {@link Opcodes#LONG},
-     *            {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or
-     *            {@link Opcodes#UNINITIALIZED_THIS} (long and double are
-     *            represented by a single element). Reference types are
-     *            represented by String objects (representing internal names),
-     *            and uninitialized types by Label objects (this label
-     *            designates the NEW instruction that created this uninitialized
-     *            value).
-     * @param nStack
-     *            the number of operand stack elements in the visited frame.
-     * @param stack
-     *            the operand stack types in this frame. This array must not be
-     *            modified. Its content has the same format as the "local"
-     *            array.
-     * @throws IllegalStateException
-     *             if a frame is visited just after another one, without any
-     *             instruction between the two (unless this frame is a
-     *             Opcodes#F_SAME frame, in which case it is silently ignored).
-     */
-    public void visitFrame(int type, int nLocal, Object[] local, int nStack,
-            Object[] stack) {
-        if (mv != null) {
-            mv.visitFrame(type, nLocal, local, nStack, stack);
-        }
-    }
-
-    // -------------------------------------------------------------------------
-    // Normal instructions
-    // -------------------------------------------------------------------------
-
-    /**
-     * Visits a zero operand instruction.
-     *
-     * @param opcode
-     *            the opcode of the instruction to be visited. This opcode is
-     *            either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1,
-     *            ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1,
-     *            FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD,
-     *            LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD,
-     *            IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE,
-     *            SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
-     *            DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB,
-     *            IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM,
-     *            FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR,
-     *            IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
-     *            L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
-     *            LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
-     *            DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER,
-     *            or MONITOREXIT.
-     */
-    public void visitInsn(int opcode) {
-        if (mv != null) {
-            mv.visitInsn(opcode);
-        }
-    }
-
-    /**
-     * Visits an instruction with a single int operand.
-     *
-     * @param opcode
-     *            the opcode of the instruction to be visited. This opcode is
-     *            either BIPUSH, SIPUSH or NEWARRAY.
-     * @param operand
-     *            the operand of the instruction to be visited.<br>
-     *            When opcode is BIPUSH, operand value should be between
-     *            Byte.MIN_VALUE and Byte.MAX_VALUE.<br>
-     *            When opcode is SIPUSH, operand value should be between
-     *            Short.MIN_VALUE and Short.MAX_VALUE.<br>
-     *            When opcode is NEWARRAY, operand value should be one of
-     *            {@link Opcodes#T_BOOLEAN}, {@link Opcodes#T_CHAR},
-     *            {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
-     *            {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT},
-     *            {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
-     */
-    public void visitIntInsn(int opcode, int operand) {
-        if (mv != null) {
-            mv.visitIntInsn(opcode, operand);
-        }
-    }
-
-    /**
-     * Visits a local variable instruction. A local variable instruction is an
-     * instruction that loads or stores the value of a local variable.
-     *
-     * @param opcode
-     *            the opcode of the local variable instruction to be visited.
-     *            This opcode is either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD,
-     *            ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
-     * @param var
-     *            the operand of the instruction to be visited. This operand is
-     *            the index of a local variable.
-     */
-    public void visitVarInsn(int opcode, int var) {
-        if (mv != null) {
-            mv.visitVarInsn(opcode, var);
-        }
-    }
-
-    /**
-     * Visits a type instruction. A type instruction is an instruction that
-     * takes the internal name of a class as parameter.
-     *
-     * @param opcode
-     *            the opcode of the type instruction to be visited. This opcode
-     *            is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
-     * @param type
-     *            the operand of the instruction to be visited. This operand
-     *            must be the internal name of an object or array class (see
-     *            {@link Type#getInternalName() getInternalName}).
-     */
-    public void visitTypeInsn(int opcode, String type) {
-        if (mv != null) {
-            mv.visitTypeInsn(opcode, type);
-        }
-    }
-
-    /**
-     * Visits a field instruction. A field instruction is an instruction that
-     * loads or stores the value of a field of an object.
-     *
-     * @param opcode
-     *            the opcode of the type instruction to be visited. This opcode
-     *            is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
-     * @param owner
-     *            the internal name of the field's owner class (see
-     *            {@link Type#getInternalName() getInternalName}).
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor (see {@link Type Type}).
-     */
-    public void visitFieldInsn(int opcode, String owner, String name,
-            String desc) {
-        if (mv != null) {
-            mv.visitFieldInsn(opcode, owner, name, desc);
-        }
-    }
-
-    /**
-     * Visits a method instruction. A method instruction is an instruction that
-     * invokes a method.
-     *
-     * @param opcode
-     *            the opcode of the type instruction to be visited. This opcode
-     *            is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
-     *            INVOKEINTERFACE.
-     * @param owner
-     *            the internal name of the method's owner class (see
-     *            {@link Type#getInternalName() getInternalName}).
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor (see {@link Type Type}).
-     */
-    @Deprecated
-    public void visitMethodInsn(int opcode, String owner, String name,
-            String desc) {
-        if (api >= Opcodes.ASM5) {
-            boolean itf = opcode == Opcodes.INVOKEINTERFACE;
-            visitMethodInsn(opcode, owner, name, desc, itf);
-            return;
-        }
-        if (mv != null) {
-            mv.visitMethodInsn(opcode, owner, name, desc);
-        }
-    }
-
-    /**
-     * Visits a method instruction. A method instruction is an instruction that
-     * invokes a method.
-     *
-     * @param opcode
-     *            the opcode of the type instruction to be visited. This opcode
-     *            is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
-     *            INVOKEINTERFACE.
-     * @param owner
-     *            the internal name of the method's owner class (see
-     *            {@link Type#getInternalName() getInternalName}).
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor (see {@link Type Type}).
-     * @param itf
-     *            if the method's owner class is an interface.
-     */
-    public void visitMethodInsn(int opcode, String owner, String name,
-            String desc, boolean itf) {
-        if (api < Opcodes.ASM5) {
-            if (itf != (opcode == Opcodes.INVOKEINTERFACE)) {
-                throw new IllegalArgumentException(
-                        "INVOKESPECIAL/STATIC on interfaces require ASM 5");
-            }
-            visitMethodInsn(opcode, owner, name, desc);
-            return;
-        }
-        if (mv != null) {
-            mv.visitMethodInsn(opcode, owner, name, desc, itf);
-        }
-    }
-
-    /**
-     * Visits an invokedynamic instruction.
-     *
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor (see {@link Type Type}).
-     * @param bsm
-     *            the bootstrap method.
-     * @param bsmArgs
-     *            the bootstrap method constant arguments. Each argument must be
-     *            an {@link Integer}, {@link Float}, {@link Long},
-     *            {@link Double}, {@link String}, {@link Type} or {@link Handle}
-     *            value. This method is allowed to modify the content of the
-     *            array so a caller should expect that this array may change.
-     */
-    public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
-            Object... bsmArgs) {
-        if (mv != null) {
-            mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
-        }
-    }
-
-    /**
-     * Visits a jump instruction. A jump instruction is an instruction that may
-     * jump to another instruction.
-     *
-     * @param opcode
-     *            the opcode of the type instruction to be visited. This opcode
-     *            is either IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ,
-     *            IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
-     *            IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
-     * @param label
-     *            the operand of the instruction to be visited. This operand is
-     *            a label that designates the instruction to which the jump
-     *            instruction may jump.
-     */
-    public void visitJumpInsn(int opcode, Label label) {
-        if (mv != null) {
-            mv.visitJumpInsn(opcode, label);
-        }
-    }
-
-    /**
-     * Visits a label. A label designates the instruction that will be visited
-     * just after it.
-     *
-     * @param label
-     *            a {@link Label Label} object.
-     */
-    public void visitLabel(Label label) {
-        if (mv != null) {
-            mv.visitLabel(label);
-        }
-    }
-
-    // -------------------------------------------------------------------------
-    // Special instructions
-    // -------------------------------------------------------------------------
-
-    /**
-     * Visits a LDC instruction. Note that new constant types may be added in
-     * future versions of the Java Virtual Machine. To easily detect new
-     * constant types, implementations of this method should check for
-     * unexpected constant types, like this:
-     *
-     * <pre>
-     * if (cst instanceof Integer) {
-     *     // ...
-     * } else if (cst instanceof Float) {
-     *     // ...
-     * } else if (cst instanceof Long) {
-     *     // ...
-     * } else if (cst instanceof Double) {
-     *     // ...
-     * } else if (cst instanceof String) {
-     *     // ...
-     * } else if (cst instanceof Type) {
-     *     int sort = ((Type) cst).getSort();
-     *     if (sort == Type.OBJECT) {
-     *         // ...
-     *     } else if (sort == Type.ARRAY) {
-     *         // ...
-     *     } else if (sort == Type.METHOD) {
-     *         // ...
-     *     } else {
-     *         // throw an exception
-     *     }
-     * } else if (cst instanceof Handle) {
-     *     // ...
-     * } else {
-     *     // throw an exception
-     * }
-     * </pre>
-     *
-     * @param cst
-     *            the constant to be loaded on the stack. This parameter must be
-     *            a non null {@link Integer}, a {@link Float}, a {@link Long}, a
-     *            {@link Double}, a {@link String}, a {@link Type} of OBJECT or
-     *            ARRAY sort for <tt>.class</tt> constants, for classes whose
-     *            version is 49.0, a {@link Type} of METHOD sort or a
-     *            {@link Handle} for MethodType and MethodHandle constants, for
-     *            classes whose version is 51.0.
-     */
-    public void visitLdcInsn(Object cst) {
-        if (mv != null) {
-            mv.visitLdcInsn(cst);
-        }
-    }
-
-    /**
-     * Visits an IINC instruction.
-     *
-     * @param var
-     *            index of the local variable to be incremented.
-     * @param increment
-     *            amount to increment the local variable by.
-     */
-    public void visitIincInsn(int var, int increment) {
-        if (mv != null) {
-            mv.visitIincInsn(var, increment);
-        }
-    }
-
-    /**
-     * Visits a TABLESWITCH instruction.
-     *
-     * @param min
-     *            the minimum key value.
-     * @param max
-     *            the maximum key value.
-     * @param dflt
-     *            beginning of the default handler block.
-     * @param labels
-     *            beginnings of the handler blocks. <tt>labels[i]</tt> is the
-     *            beginning of the handler block for the <tt>min + i</tt> key.
-     */
-    public void visitTableSwitchInsn(int min, int max, Label dflt,
-            Label... labels) {
-        if (mv != null) {
-            mv.visitTableSwitchInsn(min, max, dflt, labels);
-        }
-    }
-
-    /**
-     * Visits a LOOKUPSWITCH instruction.
-     *
-     * @param dflt
-     *            beginning of the default handler block.
-     * @param keys
-     *            the values of the keys.
-     * @param labels
-     *            beginnings of the handler blocks. <tt>labels[i]</tt> is the
-     *            beginning of the handler block for the <tt>keys[i]</tt> key.
-     */
-    public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
-        if (mv != null) {
-            mv.visitLookupSwitchInsn(dflt, keys, labels);
-        }
-    }
-
-    /**
-     * Visits a MULTIANEWARRAY instruction.
-     *
-     * @param desc
-     *            an array type descriptor (see {@link Type Type}).
-     * @param dims
-     *            number of dimensions of the array to allocate.
-     */
-    public void visitMultiANewArrayInsn(String desc, int dims) {
-        if (mv != null) {
-            mv.visitMultiANewArrayInsn(desc, dims);
-        }
-    }
-
-    /**
-     * Visits an annotation on an instruction. This method must be called just
-     * <i>after</i> the annotated instruction. It can be called several times
-     * for the same instruction.
-     *
-     * @param typeRef
-     *            a reference to the annotated type. The sort of this type
-     *            reference must be {@link TypeReference#INSTANCEOF INSTANCEOF},
-     *            {@link TypeReference#NEW NEW},
-     *            {@link TypeReference#CONSTRUCTOR_REFERENCE
-     *            CONSTRUCTOR_REFERENCE}, {@link TypeReference#METHOD_REFERENCE
-     *            METHOD_REFERENCE}, {@link TypeReference#CAST CAST},
-     *            {@link TypeReference#CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
-     *            CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
-     *            {@link TypeReference#METHOD_INVOCATION_TYPE_ARGUMENT
-     *            METHOD_INVOCATION_TYPE_ARGUMENT},
-     *            {@link TypeReference#CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
-     *            CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
-     *            {@link TypeReference#METHOD_REFERENCE_TYPE_ARGUMENT
-     *            METHOD_REFERENCE_TYPE_ARGUMENT}. See {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitInsnAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        if (api < Opcodes.ASM5) {
-            throw new RuntimeException();
-        }
-        if (mv != null) {
-            return mv.visitInsnAnnotation(typeRef, typePath, desc, visible);
-        }
-        return null;
-    }
-
-    // -------------------------------------------------------------------------
-    // Exceptions table entries, debug information, max stack and max locals
-    // -------------------------------------------------------------------------
-
-    /**
-     * Visits a try catch block.
-     *
-     * @param start
-     *            beginning of the exception handler's scope (inclusive).
-     * @param end
-     *            end of the exception handler's scope (exclusive).
-     * @param handler
-     *            beginning of the exception handler's code.
-     * @param type
-     *            internal name of the type of exceptions handled by the
-     *            handler, or <tt>null</tt> to catch any exceptions (for
-     *            "finally" blocks).
-     * @throws IllegalArgumentException
-     *             if one of the labels has already been visited by this visitor
-     *             (by the {@link #visitLabel visitLabel} method).
-     */
-    public void visitTryCatchBlock(Label start, Label end, Label handler,
-            String type) {
-        if (mv != null) {
-            mv.visitTryCatchBlock(start, end, handler, type);
-        }
-    }
-
-    /**
-     * Visits an annotation on an exception handler type. This method must be
-     * called <i>after</i> the {@link #visitTryCatchBlock} for the annotated
-     * exception handler. It can be called several times for the same exception
-     * handler.
-     *
-     * @param typeRef
-     *            a reference to the annotated type. The sort of this type
-     *            reference must be {@link TypeReference#EXCEPTION_PARAMETER
-     *            EXCEPTION_PARAMETER}. See {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitTryCatchAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        if (api < Opcodes.ASM5) {
-            throw new RuntimeException();
-        }
-        if (mv != null) {
-            return mv.visitTryCatchAnnotation(typeRef, typePath, desc, visible);
-        }
-        return null;
-    }
-
-    /**
-     * Visits a local variable declaration.
-     *
-     * @param name
-     *            the name of a local variable.
-     * @param desc
-     *            the type descriptor of this local variable.
-     * @param signature
-     *            the type signature of this local variable. May be
-     *            <tt>null</tt> if the local variable type does not use generic
-     *            types.
-     * @param start
-     *            the first instruction corresponding to the scope of this local
-     *            variable (inclusive).
-     * @param end
-     *            the last instruction corresponding to the scope of this local
-     *            variable (exclusive).
-     * @param index
-     *            the local variable's index.
-     * @throws IllegalArgumentException
-     *             if one of the labels has not already been visited by this
-     *             visitor (by the {@link #visitLabel visitLabel} method).
-     */
-    public void visitLocalVariable(String name, String desc, String signature,
-            Label start, Label end, int index) {
-        if (mv != null) {
-            mv.visitLocalVariable(name, desc, signature, start, end, index);
-        }
-    }
-
-    /**
-     * Visits an annotation on a local variable type.
-     *
-     * @param typeRef
-     *            a reference to the annotated type. The sort of this type
-     *            reference must be {@link TypeReference#LOCAL_VARIABLE
-     *            LOCAL_VARIABLE} or {@link TypeReference#RESOURCE_VARIABLE
-     *            RESOURCE_VARIABLE}. See {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param start
-     *            the fist instructions corresponding to the continuous ranges
-     *            that make the scope of this local variable (inclusive).
-     * @param end
-     *            the last instructions corresponding to the continuous ranges
-     *            that make the scope of this local variable (exclusive). This
-     *            array must have the same size as the 'start' array.
-     * @param index
-     *            the local variable's index in each range. This array must have
-     *            the same size as the 'start' array.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
-            TypePath typePath, Label[] start, Label[] end, int[] index,
-            String desc, boolean visible) {
-        if (api < Opcodes.ASM5) {
-            throw new RuntimeException();
-        }
-        if (mv != null) {
-            return mv.visitLocalVariableAnnotation(typeRef, typePath, start,
-                    end, index, desc, visible);
-        }
-        return null;
-    }
-
-    /**
-     * Visits a line number declaration.
-     *
-     * @param line
-     *            a line number. This number refers to the source file from
-     *            which the class was compiled.
-     * @param start
-     *            the first instruction corresponding to this line number.
-     * @throws IllegalArgumentException
-     *             if <tt>start</tt> has not already been visited by this
-     *             visitor (by the {@link #visitLabel visitLabel} method).
-     */
-    public void visitLineNumber(int line, Label start) {
-        if (mv != null) {
-            mv.visitLineNumber(line, start);
-        }
-    }
-
-    /**
-     * Visits the maximum stack size and the maximum number of local variables
-     * of the method.
-     *
-     * @param maxStack
-     *            maximum stack size of the method.
-     * @param maxLocals
-     *            maximum number of local variables for the method.
-     */
-    public void visitMaxs(int maxStack, int maxLocals) {
-        if (mv != null) {
-            mv.visitMaxs(maxStack, maxLocals);
-        }
-    }
-
-    /**
-     * Visits the end of the method. This method, which is the last one to be
-     * called, is used to inform the visitor that all the annotations and
-     * attributes of the method have been visited.
-     */
-    public void visitEnd() {
-        if (mv != null) {
-            mv.visitEnd();
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/MethodWriter.java b/src/asm/scala/tools/asm/MethodWriter.java
deleted file mode 100644
index d30e04c..0000000
--- a/src/asm/scala/tools/asm/MethodWriter.java
+++ /dev/null
@@ -1,2924 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A {@link MethodVisitor} that generates methods in bytecode form. Each visit
- * method of this class appends the bytecode corresponding to the visited
- * instruction to a byte vector, in the order these methods are called.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public class MethodWriter extends MethodVisitor {
-
-    /**
-     * Pseudo access flag used to denote constructors.
-     */
-    static final int ACC_CONSTRUCTOR = 0x80000;
-
-    /**
-     * Frame has exactly the same locals as the previous stack map frame and
-     * number of stack items is zero.
-     */
-    static final int SAME_FRAME = 0; // to 63 (0-3f)
-
-    /**
-     * Frame has exactly the same locals as the previous stack map frame and
-     * number of stack items is 1
-     */
-    static final int SAME_LOCALS_1_STACK_ITEM_FRAME = 64; // to 127 (40-7f)
-
-    /**
-     * Reserved for future use
-     */
-    static final int RESERVED = 128;
-
-    /**
-     * Frame has exactly the same locals as the previous stack map frame and
-     * number of stack items is 1. Offset is bigger then 63;
-     */
-    static final int SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED = 247; // f7
-
-    /**
-     * Frame where current locals are the same as the locals in the previous
-     * frame, except that the k last locals are absent. The value of k is given
-     * by the formula 251-frame_type.
-     */
-    static final int CHOP_FRAME = 248; // to 250 (f8-fA)
-
-    /**
-     * Frame has exactly the same locals as the previous stack map frame and
-     * number of stack items is zero. Offset is bigger then 63;
-     */
-    static final int SAME_FRAME_EXTENDED = 251; // fb
-
-    /**
-     * Frame where current locals are the same as the locals in the previous
-     * frame, except that k additional locals are defined. The value of k is
-     * given by the formula frame_type-251.
-     */
-    static final int APPEND_FRAME = 252; // to 254 // fc-fe
-
-    /**
-     * Full frame
-     */
-    static final int FULL_FRAME = 255; // ff
-
-    /**
-     * Indicates that the stack map frames must be recomputed from scratch. In
-     * this case the maximum stack size and number of local variables is also
-     * recomputed from scratch.
-     *
-     * @see #compute
-     */
-    private static final int FRAMES = 0;
-
-    /**
-     * Indicates that the maximum stack size and number of local variables must
-     * be automatically computed.
-     *
-     * @see #compute
-     */
-    private static final int MAXS = 1;
-
-    /**
-     * Indicates that nothing must be automatically computed.
-     *
-     * @see #compute
-     */
-    private static final int NOTHING = 2;
-
-    /**
-     * The class writer to which this method must be added.
-     */
-    final ClassWriter cw;
-
-    /**
-     * Access flags of this method.
-     */
-    private int access;
-
-    /**
-     * The index of the constant pool item that contains the name of this
-     * method.
-     */
-    private final int name;
-
-    /**
-     * The index of the constant pool item that contains the descriptor of this
-     * method.
-     */
-    private final int desc;
-
-    /**
-     * The descriptor of this method.
-     */
-    private final String descriptor;
-
-    /**
-     * The signature of this method.
-     */
-    String signature;
-
-    /**
-     * If not zero, indicates that the code of this method must be copied from
-     * the ClassReader associated to this writer in <code>cw.cr</code>. More
-     * precisely, this field gives the index of the first byte to copied from
-     * <code>cw.cr.b</code>.
-     */
-    int classReaderOffset;
-
-    /**
-     * If not zero, indicates that the code of this method must be copied from
-     * the ClassReader associated to this writer in <code>cw.cr</code>. More
-     * precisely, this field gives the number of bytes to copied from
-     * <code>cw.cr.b</code>.
-     */
-    int classReaderLength;
-
-    /**
-     * Number of exceptions that can be thrown by this method.
-     */
-    int exceptionCount;
-
-    /**
-     * The exceptions that can be thrown by this method. More precisely, this
-     * array contains the indexes of the constant pool items that contain the
-     * internal names of these exception classes.
-     */
-    int[] exceptions;
-
-    /**
-     * The annotation default attribute of this method. May be <tt>null</tt>.
-     */
-    private ByteVector annd;
-
-    /**
-     * The runtime visible annotations of this method. May be <tt>null</tt>.
-     */
-    private AnnotationWriter anns;
-
-    /**
-     * The runtime invisible annotations of this method. May be <tt>null</tt>.
-     */
-    private AnnotationWriter ianns;
-
-    /**
-     * The runtime visible type annotations of this method. May be <tt>null</tt>
-     * .
-     */
-    private AnnotationWriter tanns;
-
-    /**
-     * The runtime invisible type annotations of this method. May be
-     * <tt>null</tt>.
-     */
-    private AnnotationWriter itanns;
-
-    /**
-     * The runtime visible parameter annotations of this method. May be
-     * <tt>null</tt>.
-     */
-    private AnnotationWriter[] panns;
-
-    /**
-     * The runtime invisible parameter annotations of this method. May be
-     * <tt>null</tt>.
-     */
-    private AnnotationWriter[] ipanns;
-
-    /**
-     * The number of synthetic parameters of this method.
-     */
-    private int synthetics;
-
-    /**
-     * The non standard attributes of the method.
-     */
-    private Attribute attrs;
-
-    /**
-     * The bytecode of this method.
-     */
-    private ByteVector code = new ByteVector();
-
-    /**
-     * Maximum stack size of this method.
-     */
-    private int maxStack;
-
-    public int getMaxStack() {
-        return maxStack;
-    }
-
-    /**
-     * Maximum number of local variables for this method.
-     */
-    private int maxLocals;
-
-    public int getMaxLocals() {
-        return maxLocals;
-    }
-
-    /**
-     * Number of local variables in the current stack map frame.
-     */
-    private int currentLocals;
-
-    /**
-     * Number of stack map frames in the StackMapTable attribute.
-     */
-    private int frameCount;
-
-    /**
-     * The StackMapTable attribute.
-     */
-    private ByteVector stackMap;
-
-    /**
-     * The offset of the last frame that was written in the StackMapTable
-     * attribute.
-     */
-    private int previousFrameOffset;
-
-    /**
-     * The last frame that was written in the StackMapTable attribute.
-     *
-     * @see #frame
-     */
-    private int[] previousFrame;
-
-    /**
-     * The current stack map frame. The first element contains the offset of the
-     * instruction to which the frame corresponds, the second element is the
-     * number of locals and the third one is the number of stack elements. The
-     * local variables start at index 3 and are followed by the operand stack
-     * values. In summary frame[0] = offset, frame[1] = nLocal, frame[2] =
-     * nStack, frame[3] = nLocal. All types are encoded as integers, with the
-     * same format as the one used in {@link Label}, but limited to BASE types.
-     */
-    private int[] frame;
-
-    /**
-     * Number of elements in the exception handler list.
-     */
-    private int handlerCount;
-
-    /**
-     * The first element in the exception handler list.
-     */
-    private Handler firstHandler;
-
-    /**
-     * The last element in the exception handler list.
-     */
-    private Handler lastHandler;
-
-    /**
-     * Number of entries in the MethodParameters attribute.
-     */
-    private int methodParametersCount;
-
-    /**
-     * The MethodParameters attribute.
-     */
-    private ByteVector methodParameters;
-
-    /**
-     * Number of entries in the LocalVariableTable attribute.
-     */
-    private int localVarCount;
-
-    /**
-     * The LocalVariableTable attribute.
-     */
-    private ByteVector localVar;
-
-    /**
-     * Number of entries in the LocalVariableTypeTable attribute.
-     */
-    private int localVarTypeCount;
-
-    /**
-     * The LocalVariableTypeTable attribute.
-     */
-    private ByteVector localVarType;
-
-    /**
-     * Number of entries in the LineNumberTable attribute.
-     */
-    private int lineNumberCount;
-
-    /**
-     * The LineNumberTable attribute.
-     */
-    private ByteVector lineNumber;
-
-    /**
-     * The start offset of the last visited instruction.
-     */
-    private int lastCodeOffset;
-
-    /**
-     * The runtime visible type annotations of the code. May be <tt>null</tt>.
-     */
-    private AnnotationWriter ctanns;
-
-    /**
-     * The runtime invisible type annotations of the code. May be <tt>null</tt>.
-     */
-    private AnnotationWriter ictanns;
-
-    /**
-     * The non standard attributes of the method's code.
-     */
-    private Attribute cattrs;
-
-    /**
-     * Indicates if some jump instructions are too small and need to be resized.
-     */
-    private boolean resize;
-
-    /**
-     * The number of subroutines in this method.
-     */
-    private int subroutines;
-
-    // ------------------------------------------------------------------------
-
-    /*
-     * Fields for the control flow graph analysis algorithm (used to compute the
-     * maximum stack size). A control flow graph contains one node per "basic
-     * block", and one edge per "jump" from one basic block to another. Each
-     * node (i.e., each basic block) is represented by the Label object that
-     * corresponds to the first instruction of this basic block. Each node also
-     * stores the list of its successors in the graph, as a linked list of Edge
-     * objects.
-     */
-
-    /**
-     * Indicates what must be automatically computed.
-     *
-     * @see #FRAMES
-     * @see #MAXS
-     * @see #NOTHING
-     */
-    private final int compute;
-
-    /**
-     * A list of labels. This list is the list of basic blocks in the method,
-     * i.e. a list of Label objects linked to each other by their
-     * {@link Label#successor} field, in the order they are visited by
-     * {@link MethodVisitor#visitLabel}, and starting with the first basic
-     * block.
-     */
-    private Label labels;
-
-    /**
-     * The previous basic block.
-     */
-    private Label previousBlock;
-
-    /**
-     * The current basic block.
-     */
-    private Label currentBlock;
-
-    /**
-     * The (relative) stack size after the last visited instruction. This size
-     * is relative to the beginning of the current basic block, i.e., the true
-     * stack size after the last visited instruction is equal to the
-     * {@link Label#inputStackTop beginStackSize} of the current basic block
-     * plus <tt>stackSize</tt>.
-     */
-    private int stackSize;
-
-    /**
-     * The (relative) maximum stack size after the last visited instruction.
-     * This size is relative to the beginning of the current basic block, i.e.,
-     * the true maximum stack size after the last visited instruction is equal
-     * to the {@link Label#inputStackTop beginStackSize} of the current basic
-     * block plus <tt>stackSize</tt>.
-     */
-    private int maxStackSize;
-
-    // ------------------------------------------------------------------------
-    // Constructor
-    // ------------------------------------------------------------------------
-
-    /**
-     * Constructs a new {@link MethodWriter}.
-     *
-     * @param cw
-     *            the class writer in which the method must be added.
-     * @param access
-     *            the method's access flags (see {@link Opcodes}).
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor (see {@link Type}).
-     * @param signature
-     *            the method's signature. May be <tt>null</tt>.
-     * @param exceptions
-     *            the internal names of the method's exceptions. May be
-     *            <tt>null</tt>.
-     * @param computeMaxs
-     *            <tt>true</tt> if the maximum stack size and number of local
-     *            variables must be automatically computed.
-     * @param computeFrames
-     *            <tt>true</tt> if the stack map tables must be recomputed from
-     *            scratch.
-     */
-    MethodWriter(final ClassWriter cw, final int access, final String name,
-            final String desc, final String signature,
-            final String[] exceptions, final boolean computeMaxs,
-            final boolean computeFrames) {
-        super(Opcodes.ASM5);
-        if (cw.firstMethod == null) {
-            cw.firstMethod = this;
-        } else {
-            cw.lastMethod.mv = this;
-        }
-        cw.lastMethod = this;
-        this.cw = cw;
-        this.access = access;
-        if ("<init>".equals(name)) {
-            this.access |= ACC_CONSTRUCTOR;
-        }
-        this.name = cw.newUTF8(name);
-        this.desc = cw.newUTF8(desc);
-        this.descriptor = desc;
-        if (ClassReader.SIGNATURES) {
-            this.signature = signature;
-        }
-        if (exceptions != null && exceptions.length > 0) {
-            exceptionCount = exceptions.length;
-            this.exceptions = new int[exceptionCount];
-            for (int i = 0; i < exceptionCount; ++i) {
-                this.exceptions[i] = cw.newClass(exceptions[i]);
-            }
-        }
-        this.compute = computeFrames ? FRAMES : (computeMaxs ? MAXS : NOTHING);
-        if (computeMaxs || computeFrames) {
-            // updates maxLocals
-            int size = Type.getArgumentsAndReturnSizes(descriptor) >> 2;
-            if ((access & Opcodes.ACC_STATIC) != 0) {
-                --size;
-            }
-            maxLocals = size;
-            currentLocals = size;
-            // creates and visits the label for the first basic block
-            labels = new Label();
-            labels.status |= Label.PUSHED;
-            visitLabel(labels);
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the MethodVisitor abstract class
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visitParameter(String name, int access) {
-        if (methodParameters == null) {
-            methodParameters = new ByteVector();
-        }
-        ++methodParametersCount;
-        methodParameters.putShort((name == null) ? 0 : cw.newUTF8(name))
-                .putShort(access);
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotationDefault() {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        annd = new ByteVector();
-        return new AnnotationWriter(cw, false, annd, null, 0);
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        ByteVector bv = new ByteVector();
-        // write type, and reserve space for values count
-        bv.putShort(cw.newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv, 2);
-        if (visible) {
-            aw.next = anns;
-            anns = aw;
-        } else {
-            aw.next = ianns;
-            ianns = aw;
-        }
-        return aw;
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        ByteVector bv = new ByteVector();
-        // write target_type and target_info
-        AnnotationWriter.putTarget(typeRef, typePath, bv);
-        // write type, and reserve space for values count
-        bv.putShort(cw.newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
-                bv.length - 2);
-        if (visible) {
-            aw.next = tanns;
-            tanns = aw;
-        } else {
-            aw.next = itanns;
-            itanns = aw;
-        }
-        return aw;
-    }
-
-    @Override
-    public AnnotationVisitor visitParameterAnnotation(final int parameter,
-            final String desc, final boolean visible) {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        ByteVector bv = new ByteVector();
-        if ("Ljava/lang/Synthetic;".equals(desc)) {
-            // workaround for a bug in javac with synthetic parameters
-            // see ClassReader.readParameterAnnotations
-            synthetics = Math.max(synthetics, parameter + 1);
-            return new AnnotationWriter(cw, false, bv, null, 0);
-        }
-        // write type, and reserve space for values count
-        bv.putShort(cw.newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv, 2);
-        if (visible) {
-            if (panns == null) {
-                panns = new AnnotationWriter[Type.getArgumentTypes(descriptor).length];
-            }
-            aw.next = panns[parameter];
-            panns[parameter] = aw;
-        } else {
-            if (ipanns == null) {
-                ipanns = new AnnotationWriter[Type.getArgumentTypes(descriptor).length];
-            }
-            aw.next = ipanns[parameter];
-            ipanns[parameter] = aw;
-        }
-        return aw;
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        if (attr.isCodeAttribute()) {
-            attr.next = cattrs;
-            cattrs = attr;
-        } else {
-            attr.next = attrs;
-            attrs = attr;
-        }
-    }
-
-    @Override
-    public void visitCode() {
-    }
-
-    @Override
-    public void visitFrame(final int type, final int nLocal,
-            final Object[] local, final int nStack, final Object[] stack) {
-        if (!ClassReader.FRAMES || compute == FRAMES) {
-            return;
-        }
-
-        if (type == Opcodes.F_NEW) {
-            if (previousFrame == null) {
-                visitImplicitFirstFrame();
-            }
-            currentLocals = nLocal;
-            int frameIndex = startFrame(code.length, nLocal, nStack);
-            for (int i = 0; i < nLocal; ++i) {
-                if (local[i] instanceof String) {
-                    frame[frameIndex++] = Frame.OBJECT
-                            | cw.addType((String) local[i]);
-                } else if (local[i] instanceof Integer) {
-                    frame[frameIndex++] = ((Integer) local[i]).intValue();
-                } else {
-                    frame[frameIndex++] = Frame.UNINITIALIZED
-                            | cw.addUninitializedType("",
-                                    ((Label) local[i]).position);
-                }
-            }
-            for (int i = 0; i < nStack; ++i) {
-                if (stack[i] instanceof String) {
-                    frame[frameIndex++] = Frame.OBJECT
-                            | cw.addType((String) stack[i]);
-                } else if (stack[i] instanceof Integer) {
-                    frame[frameIndex++] = ((Integer) stack[i]).intValue();
-                } else {
-                    frame[frameIndex++] = Frame.UNINITIALIZED
-                            | cw.addUninitializedType("",
-                                    ((Label) stack[i]).position);
-                }
-            }
-            endFrame();
-        } else {
-            int delta;
-            if (stackMap == null) {
-                stackMap = new ByteVector();
-                delta = code.length;
-            } else {
-                delta = code.length - previousFrameOffset - 1;
-                if (delta < 0) {
-                    if (type == Opcodes.F_SAME) {
-                        return;
-                    } else {
-                        throw new IllegalStateException();
-                    }
-                }
-            }
-
-            switch (type) {
-            case Opcodes.F_FULL:
-                currentLocals = nLocal;
-                stackMap.putByte(FULL_FRAME).putShort(delta).putShort(nLocal);
-                for (int i = 0; i < nLocal; ++i) {
-                    writeFrameType(local[i]);
-                }
-                stackMap.putShort(nStack);
-                for (int i = 0; i < nStack; ++i) {
-                    writeFrameType(stack[i]);
-                }
-                break;
-            case Opcodes.F_APPEND:
-                currentLocals += nLocal;
-                stackMap.putByte(SAME_FRAME_EXTENDED + nLocal).putShort(delta);
-                for (int i = 0; i < nLocal; ++i) {
-                    writeFrameType(local[i]);
-                }
-                break;
-            case Opcodes.F_CHOP:
-                currentLocals -= nLocal;
-                stackMap.putByte(SAME_FRAME_EXTENDED - nLocal).putShort(delta);
-                break;
-            case Opcodes.F_SAME:
-                if (delta < 64) {
-                    stackMap.putByte(delta);
-                } else {
-                    stackMap.putByte(SAME_FRAME_EXTENDED).putShort(delta);
-                }
-                break;
-            case Opcodes.F_SAME1:
-                if (delta < 64) {
-                    stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME + delta);
-                } else {
-                    stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED)
-                            .putShort(delta);
-                }
-                writeFrameType(stack[0]);
-                break;
-            }
-
-            previousFrameOffset = code.length;
-            ++frameCount;
-        }
-
-        maxStack = Math.max(maxStack, nStack);
-        maxLocals = Math.max(maxLocals, currentLocals);
-    }
-
-    @Override
-    public void visitInsn(final int opcode) {
-        lastCodeOffset = code.length;
-        // adds the instruction to the bytecode of the method
-        code.putByte(opcode);
-        // update currentBlock
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(opcode, 0, null, null);
-            } else {
-                // updates current and max stack sizes
-                int size = stackSize + Frame.SIZE[opcode];
-                if (size > maxStackSize) {
-                    maxStackSize = size;
-                }
-                stackSize = size;
-            }
-            // if opcode == ATHROW or xRETURN, ends current block (no successor)
-            if ((opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN)
-                    || opcode == Opcodes.ATHROW) {
-                noSuccessor();
-            }
-        }
-    }
-
-    @Override
-    public void visitIntInsn(final int opcode, final int operand) {
-        lastCodeOffset = code.length;
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(opcode, operand, null, null);
-            } else if (opcode != Opcodes.NEWARRAY) {
-                // updates current and max stack sizes only for NEWARRAY
-                // (stack size variation = 0 for BIPUSH or SIPUSH)
-                int size = stackSize + 1;
-                if (size > maxStackSize) {
-                    maxStackSize = size;
-                }
-                stackSize = size;
-            }
-        }
-        // adds the instruction to the bytecode of the method
-        if (opcode == Opcodes.SIPUSH) {
-            code.put12(opcode, operand);
-        } else { // BIPUSH or NEWARRAY
-            code.put11(opcode, operand);
-        }
-    }
-
-    @Override
-    public void visitVarInsn(final int opcode, final int var) {
-        lastCodeOffset = code.length;
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(opcode, var, null, null);
-            } else {
-                // updates current and max stack sizes
-                if (opcode == Opcodes.RET) {
-                    // no stack change, but end of current block (no successor)
-                    currentBlock.status |= Label.RET;
-                    // save 'stackSize' here for future use
-                    // (see {@link #findSubroutineSuccessors})
-                    currentBlock.inputStackTop = stackSize;
-                    noSuccessor();
-                } else { // xLOAD or xSTORE
-                    int size = stackSize + Frame.SIZE[opcode];
-                    if (size > maxStackSize) {
-                        maxStackSize = size;
-                    }
-                    stackSize = size;
-                }
-            }
-        }
-        if (compute != NOTHING) {
-            // updates max locals
-            int n;
-            if (opcode == Opcodes.LLOAD || opcode == Opcodes.DLOAD
-                    || opcode == Opcodes.LSTORE || opcode == Opcodes.DSTORE) {
-                n = var + 2;
-            } else {
-                n = var + 1;
-            }
-            if (n > maxLocals) {
-                maxLocals = n;
-            }
-        }
-        // adds the instruction to the bytecode of the method
-        if (var < 4 && opcode != Opcodes.RET) {
-            int opt;
-            if (opcode < Opcodes.ISTORE) {
-                /* ILOAD_0 */
-                opt = 26 + ((opcode - Opcodes.ILOAD) << 2) + var;
-            } else {
-                /* ISTORE_0 */
-                opt = 59 + ((opcode - Opcodes.ISTORE) << 2) + var;
-            }
-            code.putByte(opt);
-        } else if (var >= 256) {
-            code.putByte(196 /* WIDE */).put12(opcode, var);
-        } else {
-            code.put11(opcode, var);
-        }
-        if (opcode >= Opcodes.ISTORE && compute == FRAMES && handlerCount > 0) {
-            visitLabel(new Label());
-        }
-    }
-
-    @Override
-    public void visitTypeInsn(final int opcode, final String type) {
-        lastCodeOffset = code.length;
-        Item i = cw.newClassItem(type);
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(opcode, code.length, cw, i);
-            } else if (opcode == Opcodes.NEW) {
-                // updates current and max stack sizes only if opcode == NEW
-                // (no stack change for ANEWARRAY, CHECKCAST, INSTANCEOF)
-                int size = stackSize + 1;
-                if (size > maxStackSize) {
-                    maxStackSize = size;
-                }
-                stackSize = size;
-            }
-        }
-        // adds the instruction to the bytecode of the method
-        code.put12(opcode, i.index);
-    }
-
-    @Override
-    public void visitFieldInsn(final int opcode, final String owner,
-            final String name, final String desc) {
-        lastCodeOffset = code.length;
-        Item i = cw.newFieldItem(owner, name, desc);
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(opcode, 0, cw, i);
-            } else {
-                int size;
-                // computes the stack size variation
-                char c = desc.charAt(0);
-                switch (opcode) {
-                case Opcodes.GETSTATIC:
-                    size = stackSize + (c == 'D' || c == 'J' ? 2 : 1);
-                    break;
-                case Opcodes.PUTSTATIC:
-                    size = stackSize + (c == 'D' || c == 'J' ? -2 : -1);
-                    break;
-                case Opcodes.GETFIELD:
-                    size = stackSize + (c == 'D' || c == 'J' ? 1 : 0);
-                    break;
-                // case Constants.PUTFIELD:
-                default:
-                    size = stackSize + (c == 'D' || c == 'J' ? -3 : -2);
-                    break;
-                }
-                // updates current and max stack sizes
-                if (size > maxStackSize) {
-                    maxStackSize = size;
-                }
-                stackSize = size;
-            }
-        }
-        // adds the instruction to the bytecode of the method
-        code.put12(opcode, i.index);
-    }
-
-    @Override
-    public void visitMethodInsn(final int opcode, final String owner,
-            final String name, final String desc, final boolean itf) {
-        lastCodeOffset = code.length;
-        Item i = cw.newMethodItem(owner, name, desc, itf);
-        int argSize = i.intVal;
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(opcode, 0, cw, i);
-            } else {
-                /*
-                 * computes the stack size variation. In order not to recompute
-                 * several times this variation for the same Item, we use the
-                 * intVal field of this item to store this variation, once it
-                 * has been computed. More precisely this intVal field stores
-                 * the sizes of the arguments and of the return value
-                 * corresponding to desc.
-                 */
-                if (argSize == 0) {
-                    // the above sizes have not been computed yet,
-                    // so we compute them...
-                    argSize = Type.getArgumentsAndReturnSizes(desc);
-                    // ... and we save them in order
-                    // not to recompute them in the future
-                    i.intVal = argSize;
-                }
-                int size;
-                if (opcode == Opcodes.INVOKESTATIC) {
-                    size = stackSize - (argSize >> 2) + (argSize & 0x03) + 1;
-                } else {
-                    size = stackSize - (argSize >> 2) + (argSize & 0x03);
-                }
-                // updates current and max stack sizes
-                if (size > maxStackSize) {
-                    maxStackSize = size;
-                }
-                stackSize = size;
-            }
-        }
-        // adds the instruction to the bytecode of the method
-        if (opcode == Opcodes.INVOKEINTERFACE) {
-            if (argSize == 0) {
-                argSize = Type.getArgumentsAndReturnSizes(desc);
-                i.intVal = argSize;
-            }
-            code.put12(Opcodes.INVOKEINTERFACE, i.index).put11(argSize >> 2, 0);
-        } else {
-            code.put12(opcode, i.index);
-        }
-    }
-
-    @Override
-    public void visitInvokeDynamicInsn(final String name, final String desc,
-            final Handle bsm, final Object... bsmArgs) {
-        lastCodeOffset = code.length;
-        Item i = cw.newInvokeDynamicItem(name, desc, bsm, bsmArgs);
-        int argSize = i.intVal;
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(Opcodes.INVOKEDYNAMIC, 0, cw, i);
-            } else {
-                /*
-                 * computes the stack size variation. In order not to recompute
-                 * several times this variation for the same Item, we use the
-                 * intVal field of this item to store this variation, once it
-                 * has been computed. More precisely this intVal field stores
-                 * the sizes of the arguments and of the return value
-                 * corresponding to desc.
-                 */
-                if (argSize == 0) {
-                    // the above sizes have not been computed yet,
-                    // so we compute them...
-                    argSize = Type.getArgumentsAndReturnSizes(desc);
-                    // ... and we save them in order
-                    // not to recompute them in the future
-                    i.intVal = argSize;
-                }
-                int size = stackSize - (argSize >> 2) + (argSize & 0x03) + 1;
-
-                // updates current and max stack sizes
-                if (size > maxStackSize) {
-                    maxStackSize = size;
-                }
-                stackSize = size;
-            }
-        }
-        // adds the instruction to the bytecode of the method
-        code.put12(Opcodes.INVOKEDYNAMIC, i.index);
-        code.putShort(0);
-    }
-
-    @Override
-    public void visitJumpInsn(final int opcode, final Label label) {
-        lastCodeOffset = code.length;
-        Label nextInsn = null;
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(opcode, 0, null, null);
-                // 'label' is the target of a jump instruction
-                label.getFirst().status |= Label.TARGET;
-                // adds 'label' as a successor of this basic block
-                addSuccessor(Edge.NORMAL, label);
-                if (opcode != Opcodes.GOTO) {
-                    // creates a Label for the next basic block
-                    nextInsn = new Label();
-                }
-            } else {
-                if (opcode == Opcodes.JSR) {
-                    if ((label.status & Label.SUBROUTINE) == 0) {
-                        label.status |= Label.SUBROUTINE;
-                        ++subroutines;
-                    }
-                    currentBlock.status |= Label.JSR;
-                    addSuccessor(stackSize + 1, label);
-                    // creates a Label for the next basic block
-                    nextInsn = new Label();
-                    /*
-                     * note that, by construction in this method, a JSR block
-                     * has at least two successors in the control flow graph:
-                     * the first one leads the next instruction after the JSR,
-                     * while the second one leads to the JSR target.
-                     */
-                } else {
-                    // updates current stack size (max stack size unchanged
-                    // because stack size variation always negative in this
-                    // case)
-                    stackSize += Frame.SIZE[opcode];
-                    addSuccessor(stackSize, label);
-                }
-            }
-        }
-        // adds the instruction to the bytecode of the method
-        if ((label.status & Label.RESOLVED) != 0
-                && label.position - code.length < Short.MIN_VALUE) {
-            /*
-             * case of a backward jump with an offset < -32768. In this case we
-             * automatically replace GOTO with GOTO_W, JSR with JSR_W and IFxxx
-             * <l> with IFNOTxxx <l'> GOTO_W <l>, where IFNOTxxx is the
-             * "opposite" opcode of IFxxx (i.e., IFNE for IFEQ) and where <l'>
-             * designates the instruction just after the GOTO_W.
-             */
-            if (opcode == Opcodes.GOTO) {
-                code.putByte(200); // GOTO_W
-            } else if (opcode == Opcodes.JSR) {
-                code.putByte(201); // JSR_W
-            } else {
-                // if the IF instruction is transformed into IFNOT GOTO_W the
-                // next instruction becomes the target of the IFNOT instruction
-                if (nextInsn != null) {
-                    nextInsn.status |= Label.TARGET;
-                }
-                code.putByte(opcode <= 166 ? ((opcode + 1) ^ 1) - 1
-                        : opcode ^ 1);
-                code.putShort(8); // jump offset
-                code.putByte(200); // GOTO_W
-            }
-            label.put(this, code, code.length - 1, true);
-        } else {
-            /*
-             * case of a backward jump with an offset >= -32768, or of a forward
-             * jump with, of course, an unknown offset. In these cases we store
-             * the offset in 2 bytes (which will be increased in
-             * resizeInstructions, if needed).
-             */
-            code.putByte(opcode);
-            label.put(this, code, code.length - 1, false);
-        }
-        if (currentBlock != null) {
-            if (nextInsn != null) {
-                // if the jump instruction is not a GOTO, the next instruction
-                // is also a successor of this instruction. Calling visitLabel
-                // adds the label of this next instruction as a successor of the
-                // current block, and starts a new basic block
-                visitLabel(nextInsn);
-            }
-            if (opcode == Opcodes.GOTO) {
-                noSuccessor();
-            }
-        }
-    }
-
-    @Override
-    public void visitLabel(final Label label) {
-        // resolves previous forward references to label, if any
-        resize |= label.resolve(this, code.length, code.data);
-        // updates currentBlock
-        if ((label.status & Label.DEBUG) != 0) {
-            return;
-        }
-        if (compute == FRAMES) {
-            if (currentBlock != null) {
-                if (label.position == currentBlock.position) {
-                    // successive labels, do not start a new basic block
-                    currentBlock.status |= (label.status & Label.TARGET);
-                    label.frame = currentBlock.frame;
-                    return;
-                }
-                // ends current block (with one new successor)
-                addSuccessor(Edge.NORMAL, label);
-            }
-            // begins a new current block
-            currentBlock = label;
-            if (label.frame == null) {
-                label.frame = new Frame();
-                label.frame.owner = label;
-            }
-            // updates the basic block list
-            if (previousBlock != null) {
-                if (label.position == previousBlock.position) {
-                    previousBlock.status |= (label.status & Label.TARGET);
-                    label.frame = previousBlock.frame;
-                    currentBlock = previousBlock;
-                    return;
-                }
-                previousBlock.successor = label;
-            }
-            previousBlock = label;
-        } else if (compute == MAXS) {
-            if (currentBlock != null) {
-                // ends current block (with one new successor)
-                currentBlock.outputStackMax = maxStackSize;
-                addSuccessor(stackSize, label);
-            }
-            // begins a new current block
-            currentBlock = label;
-            // resets the relative current and max stack sizes
-            stackSize = 0;
-            maxStackSize = 0;
-            // updates the basic block list
-            if (previousBlock != null) {
-                previousBlock.successor = label;
-            }
-            previousBlock = label;
-        }
-    }
-
-    @Override
-    public void visitLdcInsn(final Object cst) {
-        lastCodeOffset = code.length;
-        Item i = cw.newConstItem(cst);
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(Opcodes.LDC, 0, cw, i);
-            } else {
-                int size;
-                // computes the stack size variation
-                if (i.type == ClassWriter.LONG || i.type == ClassWriter.DOUBLE) {
-                    size = stackSize + 2;
-                } else {
-                    size = stackSize + 1;
-                }
-                // updates current and max stack sizes
-                if (size > maxStackSize) {
-                    maxStackSize = size;
-                }
-                stackSize = size;
-            }
-        }
-        // adds the instruction to the bytecode of the method
-        int index = i.index;
-        if (i.type == ClassWriter.LONG || i.type == ClassWriter.DOUBLE) {
-            code.put12(20 /* LDC2_W */, index);
-        } else if (index >= 256) {
-            code.put12(19 /* LDC_W */, index);
-        } else {
-            code.put11(Opcodes.LDC, index);
-        }
-    }
-
-    @Override
-    public void visitIincInsn(final int var, final int increment) {
-        lastCodeOffset = code.length;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(Opcodes.IINC, var, null, null);
-            }
-        }
-        if (compute != NOTHING) {
-            // updates max locals
-            int n = var + 1;
-            if (n > maxLocals) {
-                maxLocals = n;
-            }
-        }
-        // adds the instruction to the bytecode of the method
-        if ((var > 255) || (increment > 127) || (increment < -128)) {
-            code.putByte(196 /* WIDE */).put12(Opcodes.IINC, var)
-                    .putShort(increment);
-        } else {
-            code.putByte(Opcodes.IINC).put11(var, increment);
-        }
-    }
-
-    @Override
-    public void visitTableSwitchInsn(final int min, final int max,
-            final Label dflt, final Label... labels) {
-        lastCodeOffset = code.length;
-        // adds the instruction to the bytecode of the method
-        int source = code.length;
-        code.putByte(Opcodes.TABLESWITCH);
-        code.putByteArray(null, 0, (4 - code.length % 4) % 4);
-        dflt.put(this, code, source, true);
-        code.putInt(min).putInt(max);
-        for (int i = 0; i < labels.length; ++i) {
-            labels[i].put(this, code, source, true);
-        }
-        // updates currentBlock
-        visitSwitchInsn(dflt, labels);
-    }
-
-    @Override
-    public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
-            final Label[] labels) {
-        lastCodeOffset = code.length;
-        // adds the instruction to the bytecode of the method
-        int source = code.length;
-        code.putByte(Opcodes.LOOKUPSWITCH);
-        code.putByteArray(null, 0, (4 - code.length % 4) % 4);
-        dflt.put(this, code, source, true);
-        code.putInt(labels.length);
-        for (int i = 0; i < labels.length; ++i) {
-            code.putInt(keys[i]);
-            labels[i].put(this, code, source, true);
-        }
-        // updates currentBlock
-        visitSwitchInsn(dflt, labels);
-    }
-
-    private void visitSwitchInsn(final Label dflt, final Label[] labels) {
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(Opcodes.LOOKUPSWITCH, 0, null, null);
-                // adds current block successors
-                addSuccessor(Edge.NORMAL, dflt);
-                dflt.getFirst().status |= Label.TARGET;
-                for (int i = 0; i < labels.length; ++i) {
-                    addSuccessor(Edge.NORMAL, labels[i]);
-                    labels[i].getFirst().status |= Label.TARGET;
-                }
-            } else {
-                // updates current stack size (max stack size unchanged)
-                --stackSize;
-                // adds current block successors
-                addSuccessor(stackSize, dflt);
-                for (int i = 0; i < labels.length; ++i) {
-                    addSuccessor(stackSize, labels[i]);
-                }
-            }
-            // ends current block
-            noSuccessor();
-        }
-    }
-
-    @Override
-    public void visitMultiANewArrayInsn(final String desc, final int dims) {
-        lastCodeOffset = code.length;
-        Item i = cw.newClassItem(desc);
-        // Label currentBlock = this.currentBlock;
-        if (currentBlock != null) {
-            if (compute == FRAMES) {
-                currentBlock.frame.execute(Opcodes.MULTIANEWARRAY, dims, cw, i);
-            } else {
-                // updates current stack size (max stack size unchanged because
-                // stack size variation always negative or null)
-                stackSize += 1 - dims;
-            }
-        }
-        // adds the instruction to the bytecode of the method
-        code.put12(Opcodes.MULTIANEWARRAY, i.index).putByte(dims);
-    }
-
-    @Override
-    public AnnotationVisitor visitInsnAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        ByteVector bv = new ByteVector();
-        // write target_type and target_info
-        typeRef = (typeRef & 0xFF0000FF) | (lastCodeOffset << 8);
-        AnnotationWriter.putTarget(typeRef, typePath, bv);
-        // write type, and reserve space for values count
-        bv.putShort(cw.newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
-                bv.length - 2);
-        if (visible) {
-            aw.next = ctanns;
-            ctanns = aw;
-        } else {
-            aw.next = ictanns;
-            ictanns = aw;
-        }
-        return aw;
-    }
-
-    @Override
-    public void visitTryCatchBlock(final Label start, final Label end,
-            final Label handler, final String type) {
-        ++handlerCount;
-        Handler h = new Handler();
-        h.start = start;
-        h.end = end;
-        h.handler = handler;
-        h.desc = type;
-        h.type = type != null ? cw.newClass(type) : 0;
-        if (lastHandler == null) {
-            firstHandler = h;
-        } else {
-            lastHandler.next = h;
-        }
-        lastHandler = h;
-    }
-
-    @Override
-    public AnnotationVisitor visitTryCatchAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        ByteVector bv = new ByteVector();
-        // write target_type and target_info
-        AnnotationWriter.putTarget(typeRef, typePath, bv);
-        // write type, and reserve space for values count
-        bv.putShort(cw.newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
-                bv.length - 2);
-        if (visible) {
-            aw.next = ctanns;
-            ctanns = aw;
-        } else {
-            aw.next = ictanns;
-            ictanns = aw;
-        }
-        return aw;
-    }
-
-    @Override
-    public void visitLocalVariable(final String name, final String desc,
-            final String signature, final Label start, final Label end,
-            final int index) {
-        if (signature != null) {
-            if (localVarType == null) {
-                localVarType = new ByteVector();
-            }
-            ++localVarTypeCount;
-            localVarType.putShort(start.position)
-                    .putShort(end.position - start.position)
-                    .putShort(cw.newUTF8(name)).putShort(cw.newUTF8(signature))
-                    .putShort(index);
-        }
-        if (localVar == null) {
-            localVar = new ByteVector();
-        }
-        ++localVarCount;
-        localVar.putShort(start.position)
-                .putShort(end.position - start.position)
-                .putShort(cw.newUTF8(name)).putShort(cw.newUTF8(desc))
-                .putShort(index);
-        if (compute != NOTHING) {
-            // updates max locals
-            char c = desc.charAt(0);
-            int n = index + (c == 'J' || c == 'D' ? 2 : 1);
-            if (n > maxLocals) {
-                maxLocals = n;
-            }
-        }
-    }
-
-    @Override
-    public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
-            TypePath typePath, Label[] start, Label[] end, int[] index,
-            String desc, boolean visible) {
-        if (!ClassReader.ANNOTATIONS) {
-            return null;
-        }
-        ByteVector bv = new ByteVector();
-        // write target_type and target_info
-        bv.putByte(typeRef >>> 24).putShort(start.length);
-        for (int i = 0; i < start.length; ++i) {
-            bv.putShort(start[i].position)
-                    .putShort(end[i].position - start[i].position)
-                    .putShort(index[i]);
-        }
-        if (typePath == null) {
-            bv.putByte(0);
-        } else {
-            int length = typePath.b[typePath.offset] * 2 + 1;
-            bv.putByteArray(typePath.b, typePath.offset, length);
-        }
-        // write type, and reserve space for values count
-        bv.putShort(cw.newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
-                bv.length - 2);
-        if (visible) {
-            aw.next = ctanns;
-            ctanns = aw;
-        } else {
-            aw.next = ictanns;
-            ictanns = aw;
-        }
-        return aw;
-    }
-
-    @Override
-    public void visitLineNumber(final int line, final Label start) {
-        if (lineNumber == null) {
-            lineNumber = new ByteVector();
-        }
-        ++lineNumberCount;
-        lineNumber.putShort(start.position);
-        lineNumber.putShort(line);
-    }
-
-    @Override
-    public void visitMaxs(final int maxStack, final int maxLocals) {
-        if (resize) {
-            // replaces the temporary jump opcodes introduced by Label.resolve.
-            if (ClassReader.RESIZE) {
-                resizeInstructions();
-            } else {
-                throw new RuntimeException("Method code too large!");
-            }
-        }
-        if (ClassReader.FRAMES && compute == FRAMES) {
-            // completes the control flow graph with exception handler blocks
-            Handler handler = firstHandler;
-            while (handler != null) {
-                Label l = handler.start.getFirst();
-                Label h = handler.handler.getFirst();
-                Label e = handler.end.getFirst();
-                // computes the kind of the edges to 'h'
-                String t = handler.desc == null ? "java/lang/Throwable"
-                        : handler.desc;
-                int kind = Frame.OBJECT | cw.addType(t);
-                // h is an exception handler
-                h.status |= Label.TARGET;
-                // adds 'h' as a successor of labels between 'start' and 'end'
-                while (l != e) {
-                    // creates an edge to 'h'
-                    Edge b = new Edge();
-                    b.info = kind;
-                    b.successor = h;
-                    // adds it to the successors of 'l'
-                    b.next = l.successors;
-                    l.successors = b;
-                    // goes to the next label
-                    l = l.successor;
-                }
-                handler = handler.next;
-            }
-
-            // creates and visits the first (implicit) frame
-            Frame f = labels.frame;
-            Type[] args = Type.getArgumentTypes(descriptor);
-            f.initInputFrame(cw, access, args, this.maxLocals);
-            visitFrame(f);
-
-            /*
-             * fix point algorithm: mark the first basic block as 'changed'
-             * (i.e. put it in the 'changed' list) and, while there are changed
-             * basic blocks, choose one, mark it as unchanged, and update its
-             * successors (which can be changed in the process).
-             */
-            int max = 0;
-            Label changed = labels;
-            while (changed != null) {
-                // removes a basic block from the list of changed basic blocks
-                Label l = changed;
-                changed = changed.next;
-                l.next = null;
-                f = l.frame;
-                // a reachable jump target must be stored in the stack map
-                if ((l.status & Label.TARGET) != 0) {
-                    l.status |= Label.STORE;
-                }
-                // all visited labels are reachable, by definition
-                l.status |= Label.REACHABLE;
-                // updates the (absolute) maximum stack size
-                int blockMax = f.inputStack.length + l.outputStackMax;
-                if (blockMax > max) {
-                    max = blockMax;
-                }
-                // updates the successors of the current basic block
-                Edge e = l.successors;
-                while (e != null) {
-                    Label n = e.successor.getFirst();
-                    boolean change = f.merge(cw, n.frame, e.info);
-                    if (change && n.next == null) {
-                        // if n has changed and is not already in the 'changed'
-                        // list, adds it to this list
-                        n.next = changed;
-                        changed = n;
-                    }
-                    e = e.next;
-                }
-            }
-
-            // visits all the frames that must be stored in the stack map
-            Label l = labels;
-            while (l != null) {
-                f = l.frame;
-                if ((l.status & Label.STORE) != 0) {
-                    visitFrame(f);
-                }
-                if ((l.status & Label.REACHABLE) == 0) {
-                    // finds start and end of dead basic block
-                    Label k = l.successor;
-                    int start = l.position;
-                    int end = (k == null ? code.length : k.position) - 1;
-                    // if non empty basic block
-                    if (end >= start) {
-                        max = Math.max(max, 1);
-                        // replaces instructions with NOP ... NOP ATHROW
-                        for (int i = start; i < end; ++i) {
-                            code.data[i] = Opcodes.NOP;
-                        }
-                        code.data[end] = (byte) Opcodes.ATHROW;
-                        // emits a frame for this unreachable block
-                        int frameIndex = startFrame(start, 0, 1);
-                        frame[frameIndex] = Frame.OBJECT
-                                | cw.addType("java/lang/Throwable");
-                        endFrame();
-                        // removes the start-end range from the exception
-                        // handlers
-                        firstHandler = Handler.remove(firstHandler, l, k);
-                    }
-                }
-                l = l.successor;
-            }
-
-            handler = firstHandler;
-            handlerCount = 0;
-            while (handler != null) {
-                handlerCount += 1;
-                handler = handler.next;
-            }
-
-            this.maxStack = max;
-        } else if (compute == MAXS) {
-            // completes the control flow graph with exception handler blocks
-            Handler handler = firstHandler;
-            while (handler != null) {
-                Label l = handler.start;
-                Label h = handler.handler;
-                Label e = handler.end;
-                // adds 'h' as a successor of labels between 'start' and 'end'
-                while (l != e) {
-                    // creates an edge to 'h'
-                    Edge b = new Edge();
-                    b.info = Edge.EXCEPTION;
-                    b.successor = h;
-                    // adds it to the successors of 'l'
-                    if ((l.status & Label.JSR) == 0) {
-                        b.next = l.successors;
-                        l.successors = b;
-                    } else {
-                        // if l is a JSR block, adds b after the first two edges
-                        // to preserve the hypothesis about JSR block successors
-                        // order (see {@link #visitJumpInsn})
-                        b.next = l.successors.next.next;
-                        l.successors.next.next = b;
-                    }
-                    // goes to the next label
-                    l = l.successor;
-                }
-                handler = handler.next;
-            }
-
-            if (subroutines > 0) {
-                // completes the control flow graph with the RET successors
-                /*
-                 * first step: finds the subroutines. This step determines, for
-                 * each basic block, to which subroutine(s) it belongs.
-                 */
-                // finds the basic blocks that belong to the "main" subroutine
-                int id = 0;
-                labels.visitSubroutine(null, 1, subroutines);
-                // finds the basic blocks that belong to the real subroutines
-                Label l = labels;
-                while (l != null) {
-                    if ((l.status & Label.JSR) != 0) {
-                        // the subroutine is defined by l's TARGET, not by l
-                        Label subroutine = l.successors.next.successor;
-                        // if this subroutine has not been visited yet...
-                        if ((subroutine.status & Label.VISITED) == 0) {
-                            // ...assigns it a new id and finds its basic blocks
-                            id += 1;
-                            subroutine.visitSubroutine(null, (id / 32L) << 32
-                                    | (1L << (id % 32)), subroutines);
-                        }
-                    }
-                    l = l.successor;
-                }
-                // second step: finds the successors of RET blocks
-                l = labels;
-                while (l != null) {
-                    if ((l.status & Label.JSR) != 0) {
-                        Label L = labels;
-                        while (L != null) {
-                            L.status &= ~Label.VISITED2;
-                            L = L.successor;
-                        }
-                        // the subroutine is defined by l's TARGET, not by l
-                        Label subroutine = l.successors.next.successor;
-                        subroutine.visitSubroutine(l, 0, subroutines);
-                    }
-                    l = l.successor;
-                }
-            }
-
-            /*
-             * control flow analysis algorithm: while the block stack is not
-             * empty, pop a block from this stack, update the max stack size,
-             * compute the true (non relative) begin stack size of the
-             * successors of this block, and push these successors onto the
-             * stack (unless they have already been pushed onto the stack).
-             * Note: by hypothesis, the {@link Label#inputStackTop} of the
-             * blocks in the block stack are the true (non relative) beginning
-             * stack sizes of these blocks.
-             */
-            int max = 0;
-            Label stack = labels;
-            while (stack != null) {
-                // pops a block from the stack
-                Label l = stack;
-                stack = stack.next;
-                // computes the true (non relative) max stack size of this block
-                int start = l.inputStackTop;
-                int blockMax = start + l.outputStackMax;
-                // updates the global max stack size
-                if (blockMax > max) {
-                    max = blockMax;
-                }
-                // analyzes the successors of the block
-                Edge b = l.successors;
-                if ((l.status & Label.JSR) != 0) {
-                    // ignores the first edge of JSR blocks (virtual successor)
-                    b = b.next;
-                }
-                while (b != null) {
-                    l = b.successor;
-                    // if this successor has not already been pushed...
-                    if ((l.status & Label.PUSHED) == 0) {
-                        // computes its true beginning stack size...
-                        l.inputStackTop = b.info == Edge.EXCEPTION ? 1 : start
-                                + b.info;
-                        // ...and pushes it onto the stack
-                        l.status |= Label.PUSHED;
-                        l.next = stack;
-                        stack = l;
-                    }
-                    b = b.next;
-                }
-            }
-            this.maxStack = Math.max(maxStack, max);
-        } else {
-            this.maxStack = maxStack;
-            this.maxLocals = maxLocals;
-        }
-    }
-
-    @Override
-    public void visitEnd() {
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods: control flow analysis algorithm
-    // ------------------------------------------------------------------------
-
-    /**
-     * Adds a successor to the {@link #currentBlock currentBlock} block.
-     *
-     * @param info
-     *            information about the control flow edge to be added.
-     * @param successor
-     *            the successor block to be added to the current block.
-     */
-    private void addSuccessor(final int info, final Label successor) {
-        // creates and initializes an Edge object...
-        Edge b = new Edge();
-        b.info = info;
-        b.successor = successor;
-        // ...and adds it to the successor list of the currentBlock block
-        b.next = currentBlock.successors;
-        currentBlock.successors = b;
-    }
-
-    /**
-     * Ends the current basic block. This method must be used in the case where
-     * the current basic block does not have any successor.
-     */
-    private void noSuccessor() {
-        if (compute == FRAMES) {
-            Label l = new Label();
-            l.frame = new Frame();
-            l.frame.owner = l;
-            l.resolve(this, code.length, code.data);
-            previousBlock.successor = l;
-            previousBlock = l;
-        } else {
-            currentBlock.outputStackMax = maxStackSize;
-        }
-        currentBlock = null;
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods: stack map frames
-    // ------------------------------------------------------------------------
-
-    /**
-     * Visits a frame that has been computed from scratch.
-     *
-     * @param f
-     *            the frame that must be visited.
-     */
-    private void visitFrame(final Frame f) {
-        int i, t;
-        int nTop = 0;
-        int nLocal = 0;
-        int nStack = 0;
-        int[] locals = f.inputLocals;
-        int[] stacks = f.inputStack;
-        // computes the number of locals (ignores TOP types that are just after
-        // a LONG or a DOUBLE, and all trailing TOP types)
-        for (i = 0; i < locals.length; ++i) {
-            t = locals[i];
-            if (t == Frame.TOP) {
-                ++nTop;
-            } else {
-                nLocal += nTop + 1;
-                nTop = 0;
-            }
-            if (t == Frame.LONG || t == Frame.DOUBLE) {
-                ++i;
-            }
-        }
-        // computes the stack size (ignores TOP types that are just after
-        // a LONG or a DOUBLE)
-        for (i = 0; i < stacks.length; ++i) {
-            t = stacks[i];
-            ++nStack;
-            if (t == Frame.LONG || t == Frame.DOUBLE) {
-                ++i;
-            }
-        }
-        // visits the frame and its content
-        int frameIndex = startFrame(f.owner.position, nLocal, nStack);
-        for (i = 0; nLocal > 0; ++i, --nLocal) {
-            t = locals[i];
-            frame[frameIndex++] = t;
-            if (t == Frame.LONG || t == Frame.DOUBLE) {
-                ++i;
-            }
-        }
-        for (i = 0; i < stacks.length; ++i) {
-            t = stacks[i];
-            frame[frameIndex++] = t;
-            if (t == Frame.LONG || t == Frame.DOUBLE) {
-                ++i;
-            }
-        }
-        endFrame();
-    }
-
-    /**
-     * Visit the implicit first frame of this method.
-     */
-    private void visitImplicitFirstFrame() {
-        // There can be at most descriptor.length() + 1 locals
-        int frameIndex = startFrame(0, descriptor.length() + 1, 0);
-        if ((access & Opcodes.ACC_STATIC) == 0) {
-            if ((access & ACC_CONSTRUCTOR) == 0) {
-                frame[frameIndex++] = Frame.OBJECT | cw.addType(cw.thisName);
-            } else {
-                frame[frameIndex++] = 6; // Opcodes.UNINITIALIZED_THIS;
-            }
-        }
-        int i = 1;
-        loop: while (true) {
-            int j = i;
-            switch (descriptor.charAt(i++)) {
-            case 'Z':
-            case 'C':
-            case 'B':
-            case 'S':
-            case 'I':
-                frame[frameIndex++] = 1; // Opcodes.INTEGER;
-                break;
-            case 'F':
-                frame[frameIndex++] = 2; // Opcodes.FLOAT;
-                break;
-            case 'J':
-                frame[frameIndex++] = 4; // Opcodes.LONG;
-                break;
-            case 'D':
-                frame[frameIndex++] = 3; // Opcodes.DOUBLE;
-                break;
-            case '[':
-                while (descriptor.charAt(i) == '[') {
-                    ++i;
-                }
-                if (descriptor.charAt(i) == 'L') {
-                    ++i;
-                    while (descriptor.charAt(i) != ';') {
-                        ++i;
-                    }
-                }
-                frame[frameIndex++] = Frame.OBJECT
-                        | cw.addType(descriptor.substring(j, ++i));
-                break;
-            case 'L':
-                while (descriptor.charAt(i) != ';') {
-                    ++i;
-                }
-                frame[frameIndex++] = Frame.OBJECT
-                        | cw.addType(descriptor.substring(j + 1, i++));
-                break;
-            default:
-                break loop;
-            }
-        }
-        frame[1] = frameIndex - 3;
-        endFrame();
-    }
-
-    /**
-     * Starts the visit of a stack map frame.
-     *
-     * @param offset
-     *            the offset of the instruction to which the frame corresponds.
-     * @param nLocal
-     *            the number of local variables in the frame.
-     * @param nStack
-     *            the number of stack elements in the frame.
-     * @return the index of the next element to be written in this frame.
-     */
-    private int startFrame(final int offset, final int nLocal, final int nStack) {
-        int n = 3 + nLocal + nStack;
-        if (frame == null || frame.length < n) {
-            frame = new int[n];
-        }
-        frame[0] = offset;
-        frame[1] = nLocal;
-        frame[2] = nStack;
-        return 3;
-    }
-
-    /**
-     * Checks if the visit of the current frame {@link #frame} is finished, and
-     * if yes, write it in the StackMapTable attribute.
-     */
-    private void endFrame() {
-        if (previousFrame != null) { // do not write the first frame
-            if (stackMap == null) {
-                stackMap = new ByteVector();
-            }
-            writeFrame();
-            ++frameCount;
-        }
-        previousFrame = frame;
-        frame = null;
-    }
-
-    /**
-     * Compress and writes the current frame {@link #frame} in the StackMapTable
-     * attribute.
-     */
-    private void writeFrame() {
-        int clocalsSize = frame[1];
-        int cstackSize = frame[2];
-        if ((cw.version & 0xFFFF) < Opcodes.V1_6) {
-            stackMap.putShort(frame[0]).putShort(clocalsSize);
-            writeFrameTypes(3, 3 + clocalsSize);
-            stackMap.putShort(cstackSize);
-            writeFrameTypes(3 + clocalsSize, 3 + clocalsSize + cstackSize);
-            return;
-        }
-        int localsSize = previousFrame[1];
-        int type = FULL_FRAME;
-        int k = 0;
-        int delta;
-        if (frameCount == 0) {
-            delta = frame[0];
-        } else {
-            delta = frame[0] - previousFrame[0] - 1;
-        }
-        if (cstackSize == 0) {
-            k = clocalsSize - localsSize;
-            switch (k) {
-            case -3:
-            case -2:
-            case -1:
-                type = CHOP_FRAME;
-                localsSize = clocalsSize;
-                break;
-            case 0:
-                type = delta < 64 ? SAME_FRAME : SAME_FRAME_EXTENDED;
-                break;
-            case 1:
-            case 2:
-            case 3:
-                type = APPEND_FRAME;
-                break;
-            }
-        } else if (clocalsSize == localsSize && cstackSize == 1) {
-            type = delta < 63 ? SAME_LOCALS_1_STACK_ITEM_FRAME
-                    : SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED;
-        }
-        if (type != FULL_FRAME) {
-            // verify if locals are the same
-            int l = 3;
-            for (int j = 0; j < localsSize; j++) {
-                if (frame[l] != previousFrame[l]) {
-                    type = FULL_FRAME;
-                    break;
-                }
-                l++;
-            }
-        }
-        switch (type) {
-        case SAME_FRAME:
-            stackMap.putByte(delta);
-            break;
-        case SAME_LOCALS_1_STACK_ITEM_FRAME:
-            stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME + delta);
-            writeFrameTypes(3 + clocalsSize, 4 + clocalsSize);
-            break;
-        case SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED:
-            stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED).putShort(
-                    delta);
-            writeFrameTypes(3 + clocalsSize, 4 + clocalsSize);
-            break;
-        case SAME_FRAME_EXTENDED:
-            stackMap.putByte(SAME_FRAME_EXTENDED).putShort(delta);
-            break;
-        case CHOP_FRAME:
-            stackMap.putByte(SAME_FRAME_EXTENDED + k).putShort(delta);
-            break;
-        case APPEND_FRAME:
-            stackMap.putByte(SAME_FRAME_EXTENDED + k).putShort(delta);
-            writeFrameTypes(3 + localsSize, 3 + clocalsSize);
-            break;
-        // case FULL_FRAME:
-        default:
-            stackMap.putByte(FULL_FRAME).putShort(delta).putShort(clocalsSize);
-            writeFrameTypes(3, 3 + clocalsSize);
-            stackMap.putShort(cstackSize);
-            writeFrameTypes(3 + clocalsSize, 3 + clocalsSize + cstackSize);
-        }
-    }
-
-    /**
-     * Writes some types of the current frame {@link #frame} into the
-     * StackMapTableAttribute. This method converts types from the format used
-     * in {@link Label} to the format used in StackMapTable attributes. In
-     * particular, it converts type table indexes to constant pool indexes.
-     *
-     * @param start
-     *            index of the first type in {@link #frame} to write.
-     * @param end
-     *            index of last type in {@link #frame} to write (exclusive).
-     */
-    private void writeFrameTypes(final int start, final int end) {
-        for (int i = start; i < end; ++i) {
-            int t = frame[i];
-            int d = t & Frame.DIM;
-            if (d == 0) {
-                int v = t & Frame.BASE_VALUE;
-                switch (t & Frame.BASE_KIND) {
-                case Frame.OBJECT:
-                    stackMap.putByte(7).putShort(
-                            cw.newClass(cw.typeTable[v].strVal1));
-                    break;
-                case Frame.UNINITIALIZED:
-                    stackMap.putByte(8).putShort(cw.typeTable[v].intVal);
-                    break;
-                default:
-                    stackMap.putByte(v);
-                }
-            } else {
-                StringBuffer buf = new StringBuffer();
-                d >>= 28;
-                while (d-- > 0) {
-                    buf.append('[');
-                }
-                if ((t & Frame.BASE_KIND) == Frame.OBJECT) {
-                    buf.append('L');
-                    buf.append(cw.typeTable[t & Frame.BASE_VALUE].strVal1);
-                    buf.append(';');
-                } else {
-                    switch (t & 0xF) {
-                    case 1:
-                        buf.append('I');
-                        break;
-                    case 2:
-                        buf.append('F');
-                        break;
-                    case 3:
-                        buf.append('D');
-                        break;
-                    case 9:
-                        buf.append('Z');
-                        break;
-                    case 10:
-                        buf.append('B');
-                        break;
-                    case 11:
-                        buf.append('C');
-                        break;
-                    case 12:
-                        buf.append('S');
-                        break;
-                    default:
-                        buf.append('J');
-                    }
-                }
-                stackMap.putByte(7).putShort(cw.newClass(buf.toString()));
-            }
-        }
-    }
-
-    private void writeFrameType(final Object type) {
-        if (type instanceof String) {
-            stackMap.putByte(7).putShort(cw.newClass((String) type));
-        } else if (type instanceof Integer) {
-            stackMap.putByte(((Integer) type).intValue());
-        } else {
-            stackMap.putByte(8).putShort(((Label) type).position);
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods: dump bytecode array
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns the size of the bytecode of this method.
-     *
-     * @return the size of the bytecode of this method.
-     */
-    final int getSize() {
-        if (classReaderOffset != 0) {
-            return 6 + classReaderLength;
-        }
-        int size = 8;
-        if (code.length > 0) {
-            if (code.length > 65536) {
-                String nameString = "";
-                Item nameItem = cw.findItemByIndex(name);
-                if (nameItem != null) nameString = nameItem.strVal1 +"'s ";
-                throw new RuntimeException("Method "+ nameString +"code too large!");
-            }
-            cw.newUTF8("Code");
-            size += 18 + code.length + 8 * handlerCount;
-            if (localVar != null) {
-                cw.newUTF8("LocalVariableTable");
-                size += 8 + localVar.length;
-            }
-            if (localVarType != null) {
-                cw.newUTF8("LocalVariableTypeTable");
-                size += 8 + localVarType.length;
-            }
-            if (lineNumber != null) {
-                cw.newUTF8("LineNumberTable");
-                size += 8 + lineNumber.length;
-            }
-            if (stackMap != null) {
-                boolean zip = (cw.version & 0xFFFF) >= Opcodes.V1_6;
-                cw.newUTF8(zip ? "StackMapTable" : "StackMap");
-                size += 8 + stackMap.length;
-            }
-            if (ClassReader.ANNOTATIONS && ctanns != null) {
-                cw.newUTF8("RuntimeVisibleTypeAnnotations");
-                size += 8 + ctanns.getSize();
-            }
-            if (ClassReader.ANNOTATIONS && ictanns != null) {
-                cw.newUTF8("RuntimeInvisibleTypeAnnotations");
-                size += 8 + ictanns.getSize();
-            }
-            if (cattrs != null) {
-                size += cattrs.getSize(cw, code.data, code.length, maxStack,
-                        maxLocals);
-            }
-        }
-        if (exceptionCount > 0) {
-            cw.newUTF8("Exceptions");
-            size += 8 + 2 * exceptionCount;
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((cw.version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                cw.newUTF8("Synthetic");
-                size += 6;
-            }
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            cw.newUTF8("Deprecated");
-            size += 6;
-        }
-        if (ClassReader.SIGNATURES && signature != null) {
-            cw.newUTF8("Signature");
-            cw.newUTF8(signature);
-            size += 8;
-        }
-        if (methodParameters != null) {
-            cw.newUTF8("MethodParameters");
-            size += 7 + methodParameters.length;
-        }
-        if (ClassReader.ANNOTATIONS && annd != null) {
-            cw.newUTF8("AnnotationDefault");
-            size += 6 + annd.length;
-        }
-        if (ClassReader.ANNOTATIONS && anns != null) {
-            cw.newUTF8("RuntimeVisibleAnnotations");
-            size += 8 + anns.getSize();
-        }
-        if (ClassReader.ANNOTATIONS && ianns != null) {
-            cw.newUTF8("RuntimeInvisibleAnnotations");
-            size += 8 + ianns.getSize();
-        }
-        if (ClassReader.ANNOTATIONS && tanns != null) {
-            cw.newUTF8("RuntimeVisibleTypeAnnotations");
-            size += 8 + tanns.getSize();
-        }
-        if (ClassReader.ANNOTATIONS && itanns != null) {
-            cw.newUTF8("RuntimeInvisibleTypeAnnotations");
-            size += 8 + itanns.getSize();
-        }
-        if (ClassReader.ANNOTATIONS && panns != null) {
-            cw.newUTF8("RuntimeVisibleParameterAnnotations");
-            size += 7 + 2 * (panns.length - synthetics);
-            for (int i = panns.length - 1; i >= synthetics; --i) {
-                size += panns[i] == null ? 0 : panns[i].getSize();
-            }
-        }
-        if (ClassReader.ANNOTATIONS && ipanns != null) {
-            cw.newUTF8("RuntimeInvisibleParameterAnnotations");
-            size += 7 + 2 * (ipanns.length - synthetics);
-            for (int i = ipanns.length - 1; i >= synthetics; --i) {
-                size += ipanns[i] == null ? 0 : ipanns[i].getSize();
-            }
-        }
-        if (attrs != null) {
-            size += attrs.getSize(cw, null, 0, -1, -1);
-        }
-        return size;
-    }
-
-    /**
-     * Puts the bytecode of this method in the given byte vector.
-     *
-     * @param out
-     *            the byte vector into which the bytecode of this method must be
-     *            copied.
-     */
-    final void put(final ByteVector out) {
-        final int FACTOR = ClassWriter.TO_ACC_SYNTHETIC;
-        int mask = ACC_CONSTRUCTOR | Opcodes.ACC_DEPRECATED
-                | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
-                | ((access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) / FACTOR);
-        out.putShort(access & ~mask).putShort(name).putShort(desc);
-        if (classReaderOffset != 0) {
-            out.putByteArray(cw.cr.b, classReaderOffset, classReaderLength);
-            return;
-        }
-        int attributeCount = 0;
-        if (code.length > 0) {
-            ++attributeCount;
-        }
-        if (exceptionCount > 0) {
-            ++attributeCount;
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((cw.version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                ++attributeCount;
-            }
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            ++attributeCount;
-        }
-        if (ClassReader.SIGNATURES && signature != null) {
-            ++attributeCount;
-        }
-        if (methodParameters != null) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && annd != null) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && anns != null) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && ianns != null) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && tanns != null) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && itanns != null) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && panns != null) {
-            ++attributeCount;
-        }
-        if (ClassReader.ANNOTATIONS && ipanns != null) {
-            ++attributeCount;
-        }
-        if (attrs != null) {
-            attributeCount += attrs.getCount();
-        }
-        out.putShort(attributeCount);
-        if (code.length > 0) {
-            int size = 12 + code.length + 8 * handlerCount;
-            if (localVar != null) {
-                size += 8 + localVar.length;
-            }
-            if (localVarType != null) {
-                size += 8 + localVarType.length;
-            }
-            if (lineNumber != null) {
-                size += 8 + lineNumber.length;
-            }
-            if (stackMap != null) {
-                size += 8 + stackMap.length;
-            }
-            if (ClassReader.ANNOTATIONS && ctanns != null) {
-                size += 8 + ctanns.getSize();
-            }
-            if (ClassReader.ANNOTATIONS && ictanns != null) {
-                size += 8 + ictanns.getSize();
-            }
-            if (cattrs != null) {
-                size += cattrs.getSize(cw, code.data, code.length, maxStack,
-                        maxLocals);
-            }
-            out.putShort(cw.newUTF8("Code")).putInt(size);
-            out.putShort(maxStack).putShort(maxLocals);
-            out.putInt(code.length).putByteArray(code.data, 0, code.length);
-            out.putShort(handlerCount);
-            if (handlerCount > 0) {
-                Handler h = firstHandler;
-                while (h != null) {
-                    out.putShort(h.start.position).putShort(h.end.position)
-                            .putShort(h.handler.position).putShort(h.type);
-                    h = h.next;
-                }
-            }
-            attributeCount = 0;
-            if (localVar != null) {
-                ++attributeCount;
-            }
-            if (localVarType != null) {
-                ++attributeCount;
-            }
-            if (lineNumber != null) {
-                ++attributeCount;
-            }
-            if (stackMap != null) {
-                ++attributeCount;
-            }
-            if (ClassReader.ANNOTATIONS && ctanns != null) {
-                ++attributeCount;
-            }
-            if (ClassReader.ANNOTATIONS && ictanns != null) {
-                ++attributeCount;
-            }
-            if (cattrs != null) {
-                attributeCount += cattrs.getCount();
-            }
-            out.putShort(attributeCount);
-            if (localVar != null) {
-                out.putShort(cw.newUTF8("LocalVariableTable"));
-                out.putInt(localVar.length + 2).putShort(localVarCount);
-                out.putByteArray(localVar.data, 0, localVar.length);
-            }
-            if (localVarType != null) {
-                out.putShort(cw.newUTF8("LocalVariableTypeTable"));
-                out.putInt(localVarType.length + 2).putShort(localVarTypeCount);
-                out.putByteArray(localVarType.data, 0, localVarType.length);
-            }
-            if (lineNumber != null) {
-                out.putShort(cw.newUTF8("LineNumberTable"));
-                out.putInt(lineNumber.length + 2).putShort(lineNumberCount);
-                out.putByteArray(lineNumber.data, 0, lineNumber.length);
-            }
-            if (stackMap != null) {
-                boolean zip = (cw.version & 0xFFFF) >= Opcodes.V1_6;
-                out.putShort(cw.newUTF8(zip ? "StackMapTable" : "StackMap"));
-                out.putInt(stackMap.length + 2).putShort(frameCount);
-                out.putByteArray(stackMap.data, 0, stackMap.length);
-            }
-            if (ClassReader.ANNOTATIONS && ctanns != null) {
-                out.putShort(cw.newUTF8("RuntimeVisibleTypeAnnotations"));
-                ctanns.put(out);
-            }
-            if (ClassReader.ANNOTATIONS && ictanns != null) {
-                out.putShort(cw.newUTF8("RuntimeInvisibleTypeAnnotations"));
-                ictanns.put(out);
-            }
-            if (cattrs != null) {
-                cattrs.put(cw, code.data, code.length, maxLocals, maxStack, out);
-            }
-        }
-        if (exceptionCount > 0) {
-            out.putShort(cw.newUTF8("Exceptions")).putInt(
-                    2 * exceptionCount + 2);
-            out.putShort(exceptionCount);
-            for (int i = 0; i < exceptionCount; ++i) {
-                out.putShort(exceptions[i]);
-            }
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((cw.version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                out.putShort(cw.newUTF8("Synthetic")).putInt(0);
-            }
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            out.putShort(cw.newUTF8("Deprecated")).putInt(0);
-        }
-        if (ClassReader.SIGNATURES && signature != null) {
-            out.putShort(cw.newUTF8("Signature")).putInt(2)
-                    .putShort(cw.newUTF8(signature));
-        }
-        if (methodParameters != null) {
-            out.putShort(cw.newUTF8("MethodParameters"));
-            out.putInt(methodParameters.length + 1).putByte(
-                    methodParametersCount);
-            out.putByteArray(methodParameters.data, 0, methodParameters.length);
-        }
-        if (ClassReader.ANNOTATIONS && annd != null) {
-            out.putShort(cw.newUTF8("AnnotationDefault"));
-            out.putInt(annd.length);
-            out.putByteArray(annd.data, 0, annd.length);
-        }
-        if (ClassReader.ANNOTATIONS && anns != null) {
-            out.putShort(cw.newUTF8("RuntimeVisibleAnnotations"));
-            anns.put(out);
-        }
-        if (ClassReader.ANNOTATIONS && ianns != null) {
-            out.putShort(cw.newUTF8("RuntimeInvisibleAnnotations"));
-            ianns.put(out);
-        }
-        if (ClassReader.ANNOTATIONS && tanns != null) {
-            out.putShort(cw.newUTF8("RuntimeVisibleTypeAnnotations"));
-            tanns.put(out);
-        }
-        if (ClassReader.ANNOTATIONS && itanns != null) {
-            out.putShort(cw.newUTF8("RuntimeInvisibleTypeAnnotations"));
-            itanns.put(out);
-        }
-        if (ClassReader.ANNOTATIONS && panns != null) {
-            out.putShort(cw.newUTF8("RuntimeVisibleParameterAnnotations"));
-            AnnotationWriter.put(panns, synthetics, out);
-        }
-        if (ClassReader.ANNOTATIONS && ipanns != null) {
-            out.putShort(cw.newUTF8("RuntimeInvisibleParameterAnnotations"));
-            AnnotationWriter.put(ipanns, synthetics, out);
-        }
-        if (attrs != null) {
-            attrs.put(cw, null, 0, -1, -1, out);
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods: instruction resizing (used to handle GOTO_W and JSR_W)
-    // ------------------------------------------------------------------------
-
-    /**
-     * Resizes and replaces the temporary instructions inserted by
-     * {@link Label#resolve} for wide forward jumps, while keeping jump offsets
-     * and instruction addresses consistent. This may require to resize other
-     * existing instructions, or even to introduce new instructions: for
-     * example, increasing the size of an instruction by 2 at the middle of a
-     * method can increases the offset of an IFEQ instruction from 32766 to
-     * 32768, in which case IFEQ 32766 must be replaced with IFNEQ 8 GOTO_W
-     * 32765. This, in turn, may require to increase the size of another jump
-     * instruction, and so on... All these operations are handled automatically
-     * by this method.
-     * <p>
-     * <i>This method must be called after all the method that is being built
-     * has been visited</i>. In particular, the {@link Label Label} objects used
-     * to construct the method are no longer valid after this method has been
-     * called.
-     */
-    private void resizeInstructions() {
-        byte[] b = code.data; // bytecode of the method
-        int u, v, label; // indexes in b
-        int i, j; // loop indexes
-        /*
-         * 1st step: As explained above, resizing an instruction may require to
-         * resize another one, which may require to resize yet another one, and
-         * so on. The first step of the algorithm consists in finding all the
-         * instructions that need to be resized, without modifying the code.
-         * This is done by the following "fix point" algorithm:
-         *
-         * Parse the code to find the jump instructions whose offset will need
-         * more than 2 bytes to be stored (the future offset is computed from
-         * the current offset and from the number of bytes that will be inserted
-         * or removed between the source and target instructions). For each such
-         * instruction, adds an entry in (a copy of) the indexes and sizes
-         * arrays (if this has not already been done in a previous iteration!).
-         *
-         * If at least one entry has been added during the previous step, go
-         * back to the beginning, otherwise stop.
-         *
-         * In fact the real algorithm is complicated by the fact that the size
-         * of TABLESWITCH and LOOKUPSWITCH instructions depends on their
-         * position in the bytecode (because of padding). In order to ensure the
-         * convergence of the algorithm, the number of bytes to be added or
-         * removed from these instructions is over estimated during the previous
-         * loop, and computed exactly only after the loop is finished (this
-         * requires another pass to parse the bytecode of the method).
-         */
-        int[] allIndexes = new int[0]; // copy of indexes
-        int[] allSizes = new int[0]; // copy of sizes
-        boolean[] resize; // instructions to be resized
-        int newOffset; // future offset of a jump instruction
-
-        resize = new boolean[code.length];
-
-        // 3 = loop again, 2 = loop ended, 1 = last pass, 0 = done
-        int state = 3;
-        do {
-            if (state == 3) {
-                state = 2;
-            }
-            u = 0;
-            while (u < b.length) {
-                int opcode = b[u] & 0xFF; // opcode of current instruction
-                int insert = 0; // bytes to be added after this instruction
-
-                switch (ClassWriter.TYPE[opcode]) {
-                case ClassWriter.NOARG_INSN:
-                case ClassWriter.IMPLVAR_INSN:
-                    u += 1;
-                    break;
-                case ClassWriter.LABEL_INSN:
-                    if (opcode > 201) {
-                        // converts temporary opcodes 202 to 217, 218 and
-                        // 219 to IFEQ ... JSR (inclusive), IFNULL and
-                        // IFNONNULL
-                        opcode = opcode < 218 ? opcode - 49 : opcode - 20;
-                        label = u + readUnsignedShort(b, u + 1);
-                    } else {
-                        label = u + readShort(b, u + 1);
-                    }
-                    newOffset = getNewOffset(allIndexes, allSizes, u, label);
-                    if (newOffset < Short.MIN_VALUE
-                            || newOffset > Short.MAX_VALUE) {
-                        if (!resize[u]) {
-                            if (opcode == Opcodes.GOTO || opcode == Opcodes.JSR) {
-                                // two additional bytes will be required to
-                                // replace this GOTO or JSR instruction with
-                                // a GOTO_W or a JSR_W
-                                insert = 2;
-                            } else {
-                                // five additional bytes will be required to
-                                // replace this IFxxx <l> instruction with
-                                // IFNOTxxx <l'> GOTO_W <l>, where IFNOTxxx
-                                // is the "opposite" opcode of IFxxx (i.e.,
-                                // IFNE for IFEQ) and where <l'> designates
-                                // the instruction just after the GOTO_W.
-                                insert = 5;
-                            }
-                            resize[u] = true;
-                        }
-                    }
-                    u += 3;
-                    break;
-                case ClassWriter.LABELW_INSN:
-                    u += 5;
-                    break;
-                case ClassWriter.TABL_INSN:
-                    if (state == 1) {
-                        // true number of bytes to be added (or removed)
-                        // from this instruction = (future number of padding
-                        // bytes - current number of padding byte) -
-                        // previously over estimated variation =
-                        // = ((3 - newOffset%4) - (3 - u%4)) - u%4
-                        // = (-newOffset%4 + u%4) - u%4
-                        // = -(newOffset & 3)
-                        newOffset = getNewOffset(allIndexes, allSizes, 0, u);
-                        insert = -(newOffset & 3);
-                    } else if (!resize[u]) {
-                        // over estimation of the number of bytes to be
-                        // added to this instruction = 3 - current number
-                        // of padding bytes = 3 - (3 - u%4) = u%4 = u & 3
-                        insert = u & 3;
-                        resize[u] = true;
-                    }
-                    // skips instruction
-                    u = u + 4 - (u & 3);
-                    u += 4 * (readInt(b, u + 8) - readInt(b, u + 4) + 1) + 12;
-                    break;
-                case ClassWriter.LOOK_INSN:
-                    if (state == 1) {
-                        // like TABL_INSN
-                        newOffset = getNewOffset(allIndexes, allSizes, 0, u);
-                        insert = -(newOffset & 3);
-                    } else if (!resize[u]) {
-                        // like TABL_INSN
-                        insert = u & 3;
-                        resize[u] = true;
-                    }
-                    // skips instruction
-                    u = u + 4 - (u & 3);
-                    u += 8 * readInt(b, u + 4) + 8;
-                    break;
-                case ClassWriter.WIDE_INSN:
-                    opcode = b[u + 1] & 0xFF;
-                    if (opcode == Opcodes.IINC) {
-                        u += 6;
-                    } else {
-                        u += 4;
-                    }
-                    break;
-                case ClassWriter.VAR_INSN:
-                case ClassWriter.SBYTE_INSN:
-                case ClassWriter.LDC_INSN:
-                    u += 2;
-                    break;
-                case ClassWriter.SHORT_INSN:
-                case ClassWriter.LDCW_INSN:
-                case ClassWriter.FIELDORMETH_INSN:
-                case ClassWriter.TYPE_INSN:
-                case ClassWriter.IINC_INSN:
-                    u += 3;
-                    break;
-                case ClassWriter.ITFMETH_INSN:
-                case ClassWriter.INDYMETH_INSN:
-                    u += 5;
-                    break;
-                // case ClassWriter.MANA_INSN:
-                default:
-                    u += 4;
-                    break;
-                }
-                if (insert != 0) {
-                    // adds a new (u, insert) entry in the allIndexes and
-                    // allSizes arrays
-                    int[] newIndexes = new int[allIndexes.length + 1];
-                    int[] newSizes = new int[allSizes.length + 1];
-                    System.arraycopy(allIndexes, 0, newIndexes, 0,
-                            allIndexes.length);
-                    System.arraycopy(allSizes, 0, newSizes, 0, allSizes.length);
-                    newIndexes[allIndexes.length] = u;
-                    newSizes[allSizes.length] = insert;
-                    allIndexes = newIndexes;
-                    allSizes = newSizes;
-                    if (insert > 0) {
-                        state = 3;
-                    }
-                }
-            }
-            if (state < 3) {
-                --state;
-            }
-        } while (state != 0);
-
-        // 2nd step:
-        // copies the bytecode of the method into a new bytevector, updates the
-        // offsets, and inserts (or removes) bytes as requested.
-
-        ByteVector newCode = new ByteVector(code.length);
-
-        u = 0;
-        while (u < code.length) {
-            int opcode = b[u] & 0xFF;
-            switch (ClassWriter.TYPE[opcode]) {
-            case ClassWriter.NOARG_INSN:
-            case ClassWriter.IMPLVAR_INSN:
-                newCode.putByte(opcode);
-                u += 1;
-                break;
-            case ClassWriter.LABEL_INSN:
-                if (opcode > 201) {
-                    // changes temporary opcodes 202 to 217 (inclusive), 218
-                    // and 219 to IFEQ ... JSR (inclusive), IFNULL and
-                    // IFNONNULL
-                    opcode = opcode < 218 ? opcode - 49 : opcode - 20;
-                    label = u + readUnsignedShort(b, u + 1);
-                } else {
-                    label = u + readShort(b, u + 1);
-                }
-                newOffset = getNewOffset(allIndexes, allSizes, u, label);
-                if (resize[u]) {
-                    // replaces GOTO with GOTO_W, JSR with JSR_W and IFxxx
-                    // <l> with IFNOTxxx <l'> GOTO_W <l>, where IFNOTxxx is
-                    // the "opposite" opcode of IFxxx (i.e., IFNE for IFEQ)
-                    // and where <l'> designates the instruction just after
-                    // the GOTO_W.
-                    if (opcode == Opcodes.GOTO) {
-                        newCode.putByte(200); // GOTO_W
-                    } else if (opcode == Opcodes.JSR) {
-                        newCode.putByte(201); // JSR_W
-                    } else {
-                        newCode.putByte(opcode <= 166 ? ((opcode + 1) ^ 1) - 1
-                                : opcode ^ 1);
-                        newCode.putShort(8); // jump offset
-                        newCode.putByte(200); // GOTO_W
-                        // newOffset now computed from start of GOTO_W
-                        newOffset -= 3;
-                    }
-                    newCode.putInt(newOffset);
-                } else {
-                    newCode.putByte(opcode);
-                    newCode.putShort(newOffset);
-                }
-                u += 3;
-                break;
-            case ClassWriter.LABELW_INSN:
-                label = u + readInt(b, u + 1);
-                newOffset = getNewOffset(allIndexes, allSizes, u, label);
-                newCode.putByte(opcode);
-                newCode.putInt(newOffset);
-                u += 5;
-                break;
-            case ClassWriter.TABL_INSN:
-                // skips 0 to 3 padding bytes
-                v = u;
-                u = u + 4 - (v & 3);
-                // reads and copies instruction
-                newCode.putByte(Opcodes.TABLESWITCH);
-                newCode.putByteArray(null, 0, (4 - newCode.length % 4) % 4);
-                label = v + readInt(b, u);
-                u += 4;
-                newOffset = getNewOffset(allIndexes, allSizes, v, label);
-                newCode.putInt(newOffset);
-                j = readInt(b, u);
-                u += 4;
-                newCode.putInt(j);
-                j = readInt(b, u) - j + 1;
-                u += 4;
-                newCode.putInt(readInt(b, u - 4));
-                for (; j > 0; --j) {
-                    label = v + readInt(b, u);
-                    u += 4;
-                    newOffset = getNewOffset(allIndexes, allSizes, v, label);
-                    newCode.putInt(newOffset);
-                }
-                break;
-            case ClassWriter.LOOK_INSN:
-                // skips 0 to 3 padding bytes
-                v = u;
-                u = u + 4 - (v & 3);
-                // reads and copies instruction
-                newCode.putByte(Opcodes.LOOKUPSWITCH);
-                newCode.putByteArray(null, 0, (4 - newCode.length % 4) % 4);
-                label = v + readInt(b, u);
-                u += 4;
-                newOffset = getNewOffset(allIndexes, allSizes, v, label);
-                newCode.putInt(newOffset);
-                j = readInt(b, u);
-                u += 4;
-                newCode.putInt(j);
-                for (; j > 0; --j) {
-                    newCode.putInt(readInt(b, u));
-                    u += 4;
-                    label = v + readInt(b, u);
-                    u += 4;
-                    newOffset = getNewOffset(allIndexes, allSizes, v, label);
-                    newCode.putInt(newOffset);
-                }
-                break;
-            case ClassWriter.WIDE_INSN:
-                opcode = b[u + 1] & 0xFF;
-                if (opcode == Opcodes.IINC) {
-                    newCode.putByteArray(b, u, 6);
-                    u += 6;
-                } else {
-                    newCode.putByteArray(b, u, 4);
-                    u += 4;
-                }
-                break;
-            case ClassWriter.VAR_INSN:
-            case ClassWriter.SBYTE_INSN:
-            case ClassWriter.LDC_INSN:
-                newCode.putByteArray(b, u, 2);
-                u += 2;
-                break;
-            case ClassWriter.SHORT_INSN:
-            case ClassWriter.LDCW_INSN:
-            case ClassWriter.FIELDORMETH_INSN:
-            case ClassWriter.TYPE_INSN:
-            case ClassWriter.IINC_INSN:
-                newCode.putByteArray(b, u, 3);
-                u += 3;
-                break;
-            case ClassWriter.ITFMETH_INSN:
-            case ClassWriter.INDYMETH_INSN:
-                newCode.putByteArray(b, u, 5);
-                u += 5;
-                break;
-            // case MANA_INSN:
-            default:
-                newCode.putByteArray(b, u, 4);
-                u += 4;
-                break;
-            }
-        }
-
-        // updates the stack map frame labels
-        if (compute == FRAMES) {
-            Label l = labels;
-            while (l != null) {
-                /*
-                 * Detects the labels that are just after an IF instruction that
-                 * has been resized with the IFNOT GOTO_W pattern. These labels
-                 * are now the target of a jump instruction (the IFNOT
-                 * instruction). Note that we need the original label position
-                 * here. getNewOffset must therefore never have been called for
-                 * this label.
-                 */
-                u = l.position - 3;
-                if (u >= 0 && resize[u]) {
-                    l.status |= Label.TARGET;
-                }
-                getNewOffset(allIndexes, allSizes, l);
-                l = l.successor;
-            }
-            // Update the offsets in the uninitialized types
-            for (i = 0; i < cw.typeTable.length; ++i) {
-                Item item = cw.typeTable[i];
-                if (item != null && item.type == ClassWriter.TYPE_UNINIT) {
-                    item.intVal = getNewOffset(allIndexes, allSizes, 0,
-                            item.intVal);
-                }
-            }
-            // The stack map frames are not serialized yet, so we don't need
-            // to update them. They will be serialized in visitMaxs.
-        } else if (frameCount > 0) {
-            /*
-             * Resizing an existing stack map frame table is really hard. Not
-             * only the table must be parsed to update the offets, but new
-             * frames may be needed for jump instructions that were inserted by
-             * this method. And updating the offsets or inserting frames can
-             * change the format of the following frames, in case of packed
-             * frames. In practice the whole table must be recomputed. For this
-             * the frames are marked as potentially invalid. This will cause the
-             * whole class to be reread and rewritten with the COMPUTE_FRAMES
-             * option (see the ClassWriter.toByteArray method). This is not very
-             * efficient but is much easier and requires much less code than any
-             * other method I can think of.
-             */
-            cw.invalidFrames = true;
-        }
-        // updates the exception handler block labels
-        Handler h = firstHandler;
-        while (h != null) {
-            getNewOffset(allIndexes, allSizes, h.start);
-            getNewOffset(allIndexes, allSizes, h.end);
-            getNewOffset(allIndexes, allSizes, h.handler);
-            h = h.next;
-        }
-        // updates the instructions addresses in the
-        // local var and line number tables
-        for (i = 0; i < 2; ++i) {
-            ByteVector bv = i == 0 ? localVar : localVarType;
-            if (bv != null) {
-                b = bv.data;
-                u = 0;
-                while (u < bv.length) {
-                    label = readUnsignedShort(b, u);
-                    newOffset = getNewOffset(allIndexes, allSizes, 0, label);
-                    writeShort(b, u, newOffset);
-                    label += readUnsignedShort(b, u + 2);
-                    newOffset = getNewOffset(allIndexes, allSizes, 0, label)
-                            - newOffset;
-                    writeShort(b, u + 2, newOffset);
-                    u += 10;
-                }
-            }
-        }
-        if (lineNumber != null) {
-            b = lineNumber.data;
-            u = 0;
-            while (u < lineNumber.length) {
-                writeShort(
-                        b,
-                        u,
-                        getNewOffset(allIndexes, allSizes, 0,
-                                readUnsignedShort(b, u)));
-                u += 4;
-            }
-        }
-        // updates the labels of the other attributes
-        Attribute attr = cattrs;
-        while (attr != null) {
-            Label[] labels = attr.getLabels();
-            if (labels != null) {
-                for (i = labels.length - 1; i >= 0; --i) {
-                    getNewOffset(allIndexes, allSizes, labels[i]);
-                }
-            }
-            attr = attr.next;
-        }
-
-        // replaces old bytecodes with new ones
-        code = newCode;
-    }
-
-    /**
-     * Reads an unsigned short value in the given byte array.
-     *
-     * @param b
-     *            a byte array.
-     * @param index
-     *            the start index of the value to be read.
-     * @return the read value.
-     */
-    static int readUnsignedShort(final byte[] b, final int index) {
-        return ((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF);
-    }
-
-    /**
-     * Reads a signed short value in the given byte array.
-     *
-     * @param b
-     *            a byte array.
-     * @param index
-     *            the start index of the value to be read.
-     * @return the read value.
-     */
-    static short readShort(final byte[] b, final int index) {
-        return (short) (((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF));
-    }
-
-    /**
-     * Reads a signed int value in the given byte array.
-     *
-     * @param b
-     *            a byte array.
-     * @param index
-     *            the start index of the value to be read.
-     * @return the read value.
-     */
-    static int readInt(final byte[] b, final int index) {
-        return ((b[index] & 0xFF) << 24) | ((b[index + 1] & 0xFF) << 16)
-                | ((b[index + 2] & 0xFF) << 8) | (b[index + 3] & 0xFF);
-    }
-
-    /**
-     * Writes a short value in the given byte array.
-     *
-     * @param b
-     *            a byte array.
-     * @param index
-     *            where the first byte of the short value must be written.
-     * @param s
-     *            the value to be written in the given byte array.
-     */
-    static void writeShort(final byte[] b, final int index, final int s) {
-        b[index] = (byte) (s >>> 8);
-        b[index + 1] = (byte) s;
-    }
-
-    /**
-     * Computes the future value of a bytecode offset.
-     * <p>
-     * Note: it is possible to have several entries for the same instruction in
-     * the <tt>indexes</tt> and <tt>sizes</tt>: two entries (index=a,size=b) and
-     * (index=a,size=b') are equivalent to a single entry (index=a,size=b+b').
-     *
-     * @param indexes
-     *            current positions of the instructions to be resized. Each
-     *            instruction must be designated by the index of its <i>last</i>
-     *            byte, plus one (or, in other words, by the index of the
-     *            <i>first</i> byte of the <i>next</i> instruction).
-     * @param sizes
-     *            the number of bytes to be <i>added</i> to the above
-     *            instructions. More precisely, for each i < <tt>len</tt>,
-     *            <tt>sizes</tt>[i] bytes will be added at the end of the
-     *            instruction designated by <tt>indexes</tt>[i] or, if
-     *            <tt>sizes</tt>[i] is negative, the <i>last</i> |
-     *            <tt>sizes[i]</tt>| bytes of the instruction will be removed
-     *            (the instruction size <i>must not</i> become negative or
-     *            null).
-     * @param begin
-     *            index of the first byte of the source instruction.
-     * @param end
-     *            index of the first byte of the target instruction.
-     * @return the future value of the given bytecode offset.
-     */
-    static int getNewOffset(final int[] indexes, final int[] sizes,
-            final int begin, final int end) {
-        int offset = end - begin;
-        for (int i = 0; i < indexes.length; ++i) {
-            if (begin < indexes[i] && indexes[i] <= end) {
-                // forward jump
-                offset += sizes[i];
-            } else if (end < indexes[i] && indexes[i] <= begin) {
-                // backward jump
-                offset -= sizes[i];
-            }
-        }
-        return offset;
-    }
-
-    /**
-     * Updates the offset of the given label.
-     *
-     * @param indexes
-     *            current positions of the instructions to be resized. Each
-     *            instruction must be designated by the index of its <i>last</i>
-     *            byte, plus one (or, in other words, by the index of the
-     *            <i>first</i> byte of the <i>next</i> instruction).
-     * @param sizes
-     *            the number of bytes to be <i>added</i> to the above
-     *            instructions. More precisely, for each i < <tt>len</tt>,
-     *            <tt>sizes</tt>[i] bytes will be added at the end of the
-     *            instruction designated by <tt>indexes</tt>[i] or, if
-     *            <tt>sizes</tt>[i] is negative, the <i>last</i> |
-     *            <tt>sizes[i]</tt>| bytes of the instruction will be removed
-     *            (the instruction size <i>must not</i> become negative or
-     *            null).
-     * @param label
-     *            the label whose offset must be updated.
-     */
-    static void getNewOffset(final int[] indexes, final int[] sizes,
-            final Label label) {
-        if ((label.status & Label.RESIZED) == 0) {
-            label.position = getNewOffset(indexes, sizes, 0, label.position);
-            label.status |= Label.RESIZED;
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/Opcodes.java b/src/asm/scala/tools/asm/Opcodes.java
deleted file mode 100644
index 24eaffa..0000000
--- a/src/asm/scala/tools/asm/Opcodes.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * Defines the JVM opcodes, access flags and array type codes. This interface
- * does not define all the JVM opcodes because some opcodes are automatically
- * handled. For example, the xLOAD and xSTORE opcodes are automatically replaced
- * by xLOAD_n and xSTORE_n opcodes when possible. The xLOAD_n and xSTORE_n
- * opcodes are therefore not defined in this interface. Likewise for LDC,
- * automatically replaced by LDC_W or LDC2_W when necessary, WIDE, GOTO_W and
- * JSR_W.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public interface Opcodes {
-
-    // ASM API versions
-
-    int ASM4 = 4 << 16 | 0 << 8 | 0;
-    int ASM5 = 5 << 16 | 0 << 8 | 0;
-
-    // versions
-
-    int V1_1 = 3 << 16 | 45;
-    int V1_2 = 0 << 16 | 46;
-    int V1_3 = 0 << 16 | 47;
-    int V1_4 = 0 << 16 | 48;
-    int V1_5 = 0 << 16 | 49;
-    int V1_6 = 0 << 16 | 50;
-    int V1_7 = 0 << 16 | 51;
-    int V1_8 = 0 << 16 | 52;
-
-    // access flags
-
-    int ACC_PUBLIC = 0x0001; // class, field, method
-    int ACC_PRIVATE = 0x0002; // class, field, method
-    int ACC_PROTECTED = 0x0004; // class, field, method
-    int ACC_STATIC = 0x0008; // field, method
-    int ACC_FINAL = 0x0010; // class, field, method, parameter
-    int ACC_SUPER = 0x0020; // class
-    int ACC_SYNCHRONIZED = 0x0020; // method
-    int ACC_VOLATILE = 0x0040; // field
-    int ACC_BRIDGE = 0x0040; // method
-    int ACC_VARARGS = 0x0080; // method
-    int ACC_TRANSIENT = 0x0080; // field
-    int ACC_NATIVE = 0x0100; // method
-    int ACC_INTERFACE = 0x0200; // class
-    int ACC_ABSTRACT = 0x0400; // class, method
-    int ACC_STRICT = 0x0800; // method
-    int ACC_SYNTHETIC = 0x1000; // class, field, method, parameter
-    int ACC_ANNOTATION = 0x2000; // class
-    int ACC_ENUM = 0x4000; // class(?) field inner
-    int ACC_MANDATED = 0x8000; // parameter
-
-    // ASM specific pseudo access flags
-
-    int ACC_DEPRECATED = 0x20000; // class, field, method
-
-    // types for NEWARRAY
-
-    int T_BOOLEAN = 4;
-    int T_CHAR = 5;
-    int T_FLOAT = 6;
-    int T_DOUBLE = 7;
-    int T_BYTE = 8;
-    int T_SHORT = 9;
-    int T_INT = 10;
-    int T_LONG = 11;
-
-    // tags for Handle
-
-    int H_GETFIELD = 1;
-    int H_GETSTATIC = 2;
-    int H_PUTFIELD = 3;
-    int H_PUTSTATIC = 4;
-    int H_INVOKEVIRTUAL = 5;
-    int H_INVOKESTATIC = 6;
-    int H_INVOKESPECIAL = 7;
-    int H_NEWINVOKESPECIAL = 8;
-    int H_INVOKEINTERFACE = 9;
-
-    // stack map frame types
-
-    /**
-     * Represents an expanded frame. See {@link ClassReader#EXPAND_FRAMES}.
-     */
-    int F_NEW = -1;
-
-    /**
-     * Represents a compressed frame with complete frame data.
-     */
-    int F_FULL = 0;
-
-    /**
-     * Represents a compressed frame where locals are the same as the locals in
-     * the previous frame, except that additional 1-3 locals are defined, and
-     * with an empty stack.
-     */
-    int F_APPEND = 1;
-
-    /**
-     * Represents a compressed frame where locals are the same as the locals in
-     * the previous frame, except that the last 1-3 locals are absent and with
-     * an empty stack.
-     */
-    int F_CHOP = 2;
-
-    /**
-     * Represents a compressed frame with exactly the same locals as the
-     * previous frame and with an empty stack.
-     */
-    int F_SAME = 3;
-
-    /**
-     * Represents a compressed frame with exactly the same locals as the
-     * previous frame and with a single value on the stack.
-     */
-    int F_SAME1 = 4;
-
-    Integer TOP = new Integer(0);
-    Integer INTEGER = new Integer(1);
-    Integer FLOAT = new Integer(2);
-    Integer DOUBLE = new Integer(3);
-    Integer LONG = new Integer(4);
-    Integer NULL = new Integer(5);
-    Integer UNINITIALIZED_THIS = new Integer(6);
-
-    // opcodes // visit method (- = idem)
-
-    int NOP = 0; // visitInsn
-    int ACONST_NULL = 1; // -
-    int ICONST_M1 = 2; // -
-    int ICONST_0 = 3; // -
-    int ICONST_1 = 4; // -
-    int ICONST_2 = 5; // -
-    int ICONST_3 = 6; // -
-    int ICONST_4 = 7; // -
-    int ICONST_5 = 8; // -
-    int LCONST_0 = 9; // -
-    int LCONST_1 = 10; // -
-    int FCONST_0 = 11; // -
-    int FCONST_1 = 12; // -
-    int FCONST_2 = 13; // -
-    int DCONST_0 = 14; // -
-    int DCONST_1 = 15; // -
-    int BIPUSH = 16; // visitIntInsn
-    int SIPUSH = 17; // -
-    int LDC = 18; // visitLdcInsn
-    // int LDC_W = 19; // -
-    // int LDC2_W = 20; // -
-    int ILOAD = 21; // visitVarInsn
-    int LLOAD = 22; // -
-    int FLOAD = 23; // -
-    int DLOAD = 24; // -
-    int ALOAD = 25; // -
-    // int ILOAD_0 = 26; // -
-    // int ILOAD_1 = 27; // -
-    // int ILOAD_2 = 28; // -
-    // int ILOAD_3 = 29; // -
-    // int LLOAD_0 = 30; // -
-    // int LLOAD_1 = 31; // -
-    // int LLOAD_2 = 32; // -
-    // int LLOAD_3 = 33; // -
-    // int FLOAD_0 = 34; // -
-    // int FLOAD_1 = 35; // -
-    // int FLOAD_2 = 36; // -
-    // int FLOAD_3 = 37; // -
-    // int DLOAD_0 = 38; // -
-    // int DLOAD_1 = 39; // -
-    // int DLOAD_2 = 40; // -
-    // int DLOAD_3 = 41; // -
-    // int ALOAD_0 = 42; // -
-    // int ALOAD_1 = 43; // -
-    // int ALOAD_2 = 44; // -
-    // int ALOAD_3 = 45; // -
-    int IALOAD = 46; // visitInsn
-    int LALOAD = 47; // -
-    int FALOAD = 48; // -
-    int DALOAD = 49; // -
-    int AALOAD = 50; // -
-    int BALOAD = 51; // -
-    int CALOAD = 52; // -
-    int SALOAD = 53; // -
-    int ISTORE = 54; // visitVarInsn
-    int LSTORE = 55; // -
-    int FSTORE = 56; // -
-    int DSTORE = 57; // -
-    int ASTORE = 58; // -
-    // int ISTORE_0 = 59; // -
-    // int ISTORE_1 = 60; // -
-    // int ISTORE_2 = 61; // -
-    // int ISTORE_3 = 62; // -
-    // int LSTORE_0 = 63; // -
-    // int LSTORE_1 = 64; // -
-    // int LSTORE_2 = 65; // -
-    // int LSTORE_3 = 66; // -
-    // int FSTORE_0 = 67; // -
-    // int FSTORE_1 = 68; // -
-    // int FSTORE_2 = 69; // -
-    // int FSTORE_3 = 70; // -
-    // int DSTORE_0 = 71; // -
-    // int DSTORE_1 = 72; // -
-    // int DSTORE_2 = 73; // -
-    // int DSTORE_3 = 74; // -
-    // int ASTORE_0 = 75; // -
-    // int ASTORE_1 = 76; // -
-    // int ASTORE_2 = 77; // -
-    // int ASTORE_3 = 78; // -
-    int IASTORE = 79; // visitInsn
-    int LASTORE = 80; // -
-    int FASTORE = 81; // -
-    int DASTORE = 82; // -
-    int AASTORE = 83; // -
-    int BASTORE = 84; // -
-    int CASTORE = 85; // -
-    int SASTORE = 86; // -
-    int POP = 87; // -
-    int POP2 = 88; // -
-    int DUP = 89; // -
-    int DUP_X1 = 90; // -
-    int DUP_X2 = 91; // -
-    int DUP2 = 92; // -
-    int DUP2_X1 = 93; // -
-    int DUP2_X2 = 94; // -
-    int SWAP = 95; // -
-    int IADD = 96; // -
-    int LADD = 97; // -
-    int FADD = 98; // -
-    int DADD = 99; // -
-    int ISUB = 100; // -
-    int LSUB = 101; // -
-    int FSUB = 102; // -
-    int DSUB = 103; // -
-    int IMUL = 104; // -
-    int LMUL = 105; // -
-    int FMUL = 106; // -
-    int DMUL = 107; // -
-    int IDIV = 108; // -
-    int LDIV = 109; // -
-    int FDIV = 110; // -
-    int DDIV = 111; // -
-    int IREM = 112; // -
-    int LREM = 113; // -
-    int FREM = 114; // -
-    int DREM = 115; // -
-    int INEG = 116; // -
-    int LNEG = 117; // -
-    int FNEG = 118; // -
-    int DNEG = 119; // -
-    int ISHL = 120; // -
-    int LSHL = 121; // -
-    int ISHR = 122; // -
-    int LSHR = 123; // -
-    int IUSHR = 124; // -
-    int LUSHR = 125; // -
-    int IAND = 126; // -
-    int LAND = 127; // -
-    int IOR = 128; // -
-    int LOR = 129; // -
-    int IXOR = 130; // -
-    int LXOR = 131; // -
-    int IINC = 132; // visitIincInsn
-    int I2L = 133; // visitInsn
-    int I2F = 134; // -
-    int I2D = 135; // -
-    int L2I = 136; // -
-    int L2F = 137; // -
-    int L2D = 138; // -
-    int F2I = 139; // -
-    int F2L = 140; // -
-    int F2D = 141; // -
-    int D2I = 142; // -
-    int D2L = 143; // -
-    int D2F = 144; // -
-    int I2B = 145; // -
-    int I2C = 146; // -
-    int I2S = 147; // -
-    int LCMP = 148; // -
-    int FCMPL = 149; // -
-    int FCMPG = 150; // -
-    int DCMPL = 151; // -
-    int DCMPG = 152; // -
-    int IFEQ = 153; // visitJumpInsn
-    int IFNE = 154; // -
-    int IFLT = 155; // -
-    int IFGE = 156; // -
-    int IFGT = 157; // -
-    int IFLE = 158; // -
-    int IF_ICMPEQ = 159; // -
-    int IF_ICMPNE = 160; // -
-    int IF_ICMPLT = 161; // -
-    int IF_ICMPGE = 162; // -
-    int IF_ICMPGT = 163; // -
-    int IF_ICMPLE = 164; // -
-    int IF_ACMPEQ = 165; // -
-    int IF_ACMPNE = 166; // -
-    int GOTO = 167; // -
-    int JSR = 168; // -
-    int RET = 169; // visitVarInsn
-    int TABLESWITCH = 170; // visiTableSwitchInsn
-    int LOOKUPSWITCH = 171; // visitLookupSwitch
-    int IRETURN = 172; // visitInsn
-    int LRETURN = 173; // -
-    int FRETURN = 174; // -
-    int DRETURN = 175; // -
-    int ARETURN = 176; // -
-    int RETURN = 177; // -
-    int GETSTATIC = 178; // visitFieldInsn
-    int PUTSTATIC = 179; // -
-    int GETFIELD = 180; // -
-    int PUTFIELD = 181; // -
-    int INVOKEVIRTUAL = 182; // visitMethodInsn
-    int INVOKESPECIAL = 183; // -
-    int INVOKESTATIC = 184; // -
-    int INVOKEINTERFACE = 185; // -
-    int INVOKEDYNAMIC = 186; // visitInvokeDynamicInsn
-    int NEW = 187; // visitTypeInsn
-    int NEWARRAY = 188; // visitIntInsn
-    int ANEWARRAY = 189; // visitTypeInsn
-    int ARRAYLENGTH = 190; // visitInsn
-    int ATHROW = 191; // -
-    int CHECKCAST = 192; // visitTypeInsn
-    int INSTANCEOF = 193; // -
-    int MONITORENTER = 194; // visitInsn
-    int MONITOREXIT = 195; // -
-    // int WIDE = 196; // NOT VISITED
-    int MULTIANEWARRAY = 197; // visitMultiANewArrayInsn
-    int IFNULL = 198; // visitJumpInsn
-    int IFNONNULL = 199; // -
-    // int GOTO_W = 200; // -
-    // int JSR_W = 201; // -
-}
diff --git a/src/asm/scala/tools/asm/Type.java b/src/asm/scala/tools/asm/Type.java
deleted file mode 100644
index 7887080..0000000
--- a/src/asm/scala/tools/asm/Type.java
+++ /dev/null
@@ -1,896 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-
-/**
- * A Java field or method type. This class can be used to make it easier to
- * manipulate type and method descriptors.
- *
- * @author Eric Bruneton
- * @author Chris Nokleberg
- */
-public class Type {
-
-    /**
-     * The sort of the <tt>void</tt> type. See {@link #getSort getSort}.
-     */
-    public static final int VOID = 0;
-
-    /**
-     * The sort of the <tt>boolean</tt> type. See {@link #getSort getSort}.
-     */
-    public static final int BOOLEAN = 1;
-
-    /**
-     * The sort of the <tt>char</tt> type. See {@link #getSort getSort}.
-     */
-    public static final int CHAR = 2;
-
-    /**
-     * The sort of the <tt>byte</tt> type. See {@link #getSort getSort}.
-     */
-    public static final int BYTE = 3;
-
-    /**
-     * The sort of the <tt>short</tt> type. See {@link #getSort getSort}.
-     */
-    public static final int SHORT = 4;
-
-    /**
-     * The sort of the <tt>int</tt> type. See {@link #getSort getSort}.
-     */
-    public static final int INT = 5;
-
-    /**
-     * The sort of the <tt>float</tt> type. See {@link #getSort getSort}.
-     */
-    public static final int FLOAT = 6;
-
-    /**
-     * The sort of the <tt>long</tt> type. See {@link #getSort getSort}.
-     */
-    public static final int LONG = 7;
-
-    /**
-     * The sort of the <tt>double</tt> type. See {@link #getSort getSort}.
-     */
-    public static final int DOUBLE = 8;
-
-    /**
-     * The sort of array reference types. See {@link #getSort getSort}.
-     */
-    public static final int ARRAY = 9;
-
-    /**
-     * The sort of object reference types. See {@link #getSort getSort}.
-     */
-    public static final int OBJECT = 10;
-
-    /**
-     * The sort of method types. See {@link #getSort getSort}.
-     */
-    public static final int METHOD = 11;
-
-    /**
-     * The <tt>void</tt> type.
-     */
-    public static final Type VOID_TYPE = new Type(VOID, null, ('V' << 24)
-            | (5 << 16) | (0 << 8) | 0, 1);
-
-    /**
-     * The <tt>boolean</tt> type.
-     */
-    public static final Type BOOLEAN_TYPE = new Type(BOOLEAN, null, ('Z' << 24)
-            | (0 << 16) | (5 << 8) | 1, 1);
-
-    /**
-     * The <tt>char</tt> type.
-     */
-    public static final Type CHAR_TYPE = new Type(CHAR, null, ('C' << 24)
-            | (0 << 16) | (6 << 8) | 1, 1);
-
-    /**
-     * The <tt>byte</tt> type.
-     */
-    public static final Type BYTE_TYPE = new Type(BYTE, null, ('B' << 24)
-            | (0 << 16) | (5 << 8) | 1, 1);
-
-    /**
-     * The <tt>short</tt> type.
-     */
-    public static final Type SHORT_TYPE = new Type(SHORT, null, ('S' << 24)
-            | (0 << 16) | (7 << 8) | 1, 1);
-
-    /**
-     * The <tt>int</tt> type.
-     */
-    public static final Type INT_TYPE = new Type(INT, null, ('I' << 24)
-            | (0 << 16) | (0 << 8) | 1, 1);
-
-    /**
-     * The <tt>float</tt> type.
-     */
-    public static final Type FLOAT_TYPE = new Type(FLOAT, null, ('F' << 24)
-            | (2 << 16) | (2 << 8) | 1, 1);
-
-    /**
-     * The <tt>long</tt> type.
-     */
-    public static final Type LONG_TYPE = new Type(LONG, null, ('J' << 24)
-            | (1 << 16) | (1 << 8) | 2, 1);
-
-    /**
-     * The <tt>double</tt> type.
-     */
-    public static final Type DOUBLE_TYPE = new Type(DOUBLE, null, ('D' << 24)
-            | (3 << 16) | (3 << 8) | 2, 1);
-
-    // ------------------------------------------------------------------------
-    // Fields
-    // ------------------------------------------------------------------------
-
-    /**
-     * The sort of this Java type.
-     */
-    private final int sort;
-
-    /**
-     * A buffer containing the internal name of this Java type. This field is
-     * only used for reference types.
-     */
-    private final char[] buf;
-
-    /**
-     * The offset of the internal name of this Java type in {@link #buf buf} or,
-     * for primitive types, the size, descriptor and getOpcode offsets for this
-     * type (byte 0 contains the size, byte 1 the descriptor, byte 2 the offset
-     * for IALOAD or IASTORE, byte 3 the offset for all other instructions).
-     */
-    private final int off;
-
-    /**
-     * The length of the internal name of this Java type.
-     */
-    private final int len;
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-
-    /**
-     * Constructs a reference type.
-     *
-     * @param sort
-     *            the sort of the reference type to be constructed.
-     * @param buf
-     *            a buffer containing the descriptor of the previous type.
-     * @param off
-     *            the offset of this descriptor in the previous buffer.
-     * @param len
-     *            the length of this descriptor.
-     */
-    private Type(final int sort, final char[] buf, final int off, final int len) {
-        this.sort = sort;
-        this.buf = buf;
-        this.off = off;
-        this.len = len;
-    }
-
-    /**
-     * Returns the Java type corresponding to the given type descriptor.
-     *
-     * @param typeDescriptor
-     *            a field or method type descriptor.
-     * @return the Java type corresponding to the given type descriptor.
-     */
-    public static Type getType(final String typeDescriptor) {
-        return getType(typeDescriptor.toCharArray(), 0);
-    }
-
-    /**
-     * Returns the Java type corresponding to the given internal name.
-     *
-     * @param internalName
-     *            an internal name.
-     * @return the Java type corresponding to the given internal name.
-     */
-    public static Type getObjectType(final String internalName) {
-        char[] buf = internalName.toCharArray();
-        return new Type(buf[0] == '[' ? ARRAY : OBJECT, buf, 0, buf.length);
-    }
-
-    /**
-     * Returns the Java type corresponding to the given method descriptor.
-     * Equivalent to <code>Type.getType(methodDescriptor)</code>.
-     *
-     * @param methodDescriptor
-     *            a method descriptor.
-     * @return the Java type corresponding to the given method descriptor.
-     */
-    public static Type getMethodType(final String methodDescriptor) {
-        return getType(methodDescriptor.toCharArray(), 0);
-    }
-
-    /**
-     * Returns the Java method type corresponding to the given argument and
-     * return types.
-     *
-     * @param returnType
-     *            the return type of the method.
-     * @param argumentTypes
-     *            the argument types of the method.
-     * @return the Java type corresponding to the given argument and return
-     *         types.
-     */
-    public static Type getMethodType(final Type returnType,
-            final Type... argumentTypes) {
-        return getType(getMethodDescriptor(returnType, argumentTypes));
-    }
-
-    /**
-     * Returns the Java type corresponding to the given class.
-     *
-     * @param c
-     *            a class.
-     * @return the Java type corresponding to the given class.
-     */
-    public static Type getType(final Class<?> c) {
-        if (c.isPrimitive()) {
-            if (c == Integer.TYPE) {
-                return INT_TYPE;
-            } else if (c == Void.TYPE) {
-                return VOID_TYPE;
-            } else if (c == Boolean.TYPE) {
-                return BOOLEAN_TYPE;
-            } else if (c == Byte.TYPE) {
-                return BYTE_TYPE;
-            } else if (c == Character.TYPE) {
-                return CHAR_TYPE;
-            } else if (c == Short.TYPE) {
-                return SHORT_TYPE;
-            } else if (c == Double.TYPE) {
-                return DOUBLE_TYPE;
-            } else if (c == Float.TYPE) {
-                return FLOAT_TYPE;
-            } else /* if (c == Long.TYPE) */{
-                return LONG_TYPE;
-            }
-        } else {
-            return getType(getDescriptor(c));
-        }
-    }
-
-    /**
-     * Returns the Java method type corresponding to the given constructor.
-     *
-     * @param c
-     *            a {@link Constructor Constructor} object.
-     * @return the Java method type corresponding to the given constructor.
-     */
-    public static Type getType(final Constructor<?> c) {
-        return getType(getConstructorDescriptor(c));
-    }
-
-    /**
-     * Returns the Java method type corresponding to the given method.
-     *
-     * @param m
-     *            a {@link Method Method} object.
-     * @return the Java method type corresponding to the given method.
-     */
-    public static Type getType(final Method m) {
-        return getType(getMethodDescriptor(m));
-    }
-
-    /**
-     * Returns the Java types corresponding to the argument types of the given
-     * method descriptor.
-     *
-     * @param methodDescriptor
-     *            a method descriptor.
-     * @return the Java types corresponding to the argument types of the given
-     *         method descriptor.
-     */
-    public static Type[] getArgumentTypes(final String methodDescriptor) {
-        char[] buf = methodDescriptor.toCharArray();
-        int off = 1;
-        int size = 0;
-        while (true) {
-            char car = buf[off++];
-            if (car == ')') {
-                break;
-            } else if (car == 'L') {
-                while (buf[off++] != ';') {
-                }
-                ++size;
-            } else if (car != '[') {
-                ++size;
-            }
-        }
-        Type[] args = new Type[size];
-        off = 1;
-        size = 0;
-        while (buf[off] != ')') {
-            args[size] = getType(buf, off);
-            off += args[size].len + (args[size].sort == OBJECT ? 2 : 0);
-            size += 1;
-        }
-        return args;
-    }
-
-    /**
-     * Returns the Java types corresponding to the argument types of the given
-     * method.
-     *
-     * @param method
-     *            a method.
-     * @return the Java types corresponding to the argument types of the given
-     *         method.
-     */
-    public static Type[] getArgumentTypes(final Method method) {
-        Class<?>[] classes = method.getParameterTypes();
-        Type[] types = new Type[classes.length];
-        for (int i = classes.length - 1; i >= 0; --i) {
-            types[i] = getType(classes[i]);
-        }
-        return types;
-    }
-
-    /**
-     * Returns the Java type corresponding to the return type of the given
-     * method descriptor.
-     *
-     * @param methodDescriptor
-     *            a method descriptor.
-     * @return the Java type corresponding to the return type of the given
-     *         method descriptor.
-     */
-    public static Type getReturnType(final String methodDescriptor) {
-        char[] buf = methodDescriptor.toCharArray();
-        return getType(buf, methodDescriptor.indexOf(')') + 1);
-    }
-
-    /**
-     * Returns the Java type corresponding to the return type of the given
-     * method.
-     *
-     * @param method
-     *            a method.
-     * @return the Java type corresponding to the return type of the given
-     *         method.
-     */
-    public static Type getReturnType(final Method method) {
-        return getType(method.getReturnType());
-    }
-
-    /**
-     * Computes the size of the arguments and of the return value of a method.
-     *
-     * @param desc
-     *            the descriptor of a method.
-     * @return the size of the arguments of the method (plus one for the
-     *         implicit this argument), argSize, and the size of its return
-     *         value, retSize, packed into a single int i =
-     *         <tt>(argSize << 2) | retSize</tt> (argSize is therefore equal to
-     *         <tt>i >> 2</tt>, and retSize to <tt>i & 0x03</tt>).
-     */
-    public static int getArgumentsAndReturnSizes(final String desc) {
-        int n = 1;
-        int c = 1;
-        while (true) {
-            char car = desc.charAt(c++);
-            if (car == ')') {
-                car = desc.charAt(c);
-                return n << 2
-                        | (car == 'V' ? 0 : (car == 'D' || car == 'J' ? 2 : 1));
-            } else if (car == 'L') {
-                while (desc.charAt(c++) != ';') {
-                }
-                n += 1;
-            } else if (car == '[') {
-                while ((car = desc.charAt(c)) == '[') {
-                    ++c;
-                }
-                if (car == 'D' || car == 'J') {
-                    n -= 1;
-                }
-            } else if (car == 'D' || car == 'J') {
-                n += 2;
-            } else {
-                n += 1;
-            }
-        }
-    }
-
-    /**
-     * Returns the Java type corresponding to the given type descriptor. For
-     * method descriptors, buf is supposed to contain nothing more than the
-     * descriptor itself.
-     *
-     * @param buf
-     *            a buffer containing a type descriptor.
-     * @param off
-     *            the offset of this descriptor in the previous buffer.
-     * @return the Java type corresponding to the given type descriptor.
-     */
-    private static Type getType(final char[] buf, final int off) {
-        int len;
-        switch (buf[off]) {
-        case 'V':
-            return VOID_TYPE;
-        case 'Z':
-            return BOOLEAN_TYPE;
-        case 'C':
-            return CHAR_TYPE;
-        case 'B':
-            return BYTE_TYPE;
-        case 'S':
-            return SHORT_TYPE;
-        case 'I':
-            return INT_TYPE;
-        case 'F':
-            return FLOAT_TYPE;
-        case 'J':
-            return LONG_TYPE;
-        case 'D':
-            return DOUBLE_TYPE;
-        case '[':
-            len = 1;
-            while (buf[off + len] == '[') {
-                ++len;
-            }
-            if (buf[off + len] == 'L') {
-                ++len;
-                while (buf[off + len] != ';') {
-                    ++len;
-                }
-            }
-            return new Type(ARRAY, buf, off, len + 1);
-        case 'L':
-            len = 1;
-            while (buf[off + len] != ';') {
-                ++len;
-            }
-            return new Type(OBJECT, buf, off + 1, len - 1);
-            // case '(':
-        default:
-            return new Type(METHOD, buf, off, buf.length - off);
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Accessors
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns the sort of this Java type.
-     *
-     * @return {@link #VOID VOID}, {@link #BOOLEAN BOOLEAN}, {@link #CHAR CHAR},
-     *         {@link #BYTE BYTE}, {@link #SHORT SHORT}, {@link #INT INT},
-     *         {@link #FLOAT FLOAT}, {@link #LONG LONG}, {@link #DOUBLE DOUBLE},
-     *         {@link #ARRAY ARRAY}, {@link #OBJECT OBJECT} or {@link #METHOD
-     *         METHOD}.
-     */
-    public int getSort() {
-        return sort;
-    }
-
-    /**
-     * Returns the number of dimensions of this array type. This method should
-     * only be used for an array type.
-     *
-     * @return the number of dimensions of this array type.
-     */
-    public int getDimensions() {
-        int i = 1;
-        while (buf[off + i] == '[') {
-            ++i;
-        }
-        return i;
-    }
-
-    /**
-     * Returns the type of the elements of this array type. This method should
-     * only be used for an array type.
-     *
-     * @return Returns the type of the elements of this array type.
-     */
-    public Type getElementType() {
-        return getType(buf, off + getDimensions());
-    }
-
-    /**
-     * Returns the binary name of the class corresponding to this type. This
-     * method must not be used on method types.
-     *
-     * @return the binary name of the class corresponding to this type.
-     */
-    public String getClassName() {
-        switch (sort) {
-        case VOID:
-            return "void";
-        case BOOLEAN:
-            return "boolean";
-        case CHAR:
-            return "char";
-        case BYTE:
-            return "byte";
-        case SHORT:
-            return "short";
-        case INT:
-            return "int";
-        case FLOAT:
-            return "float";
-        case LONG:
-            return "long";
-        case DOUBLE:
-            return "double";
-        case ARRAY:
-            StringBuffer b = new StringBuffer(getElementType().getClassName());
-            for (int i = getDimensions(); i > 0; --i) {
-                b.append("[]");
-            }
-            return b.toString();
-        case OBJECT:
-            return new String(buf, off, len).replace('/', '.');
-        default:
-            return null;
-        }
-    }
-
-    /**
-     * Returns the internal name of the class corresponding to this object or
-     * array type. The internal name of a class is its fully qualified name (as
-     * returned by Class.getName(), where '.' are replaced by '/'. This method
-     * should only be used for an object or array type.
-     *
-     * @return the internal name of the class corresponding to this object type.
-     */
-    public String getInternalName() {
-        return new String(buf, off, len);
-    }
-
-    /**
-     * Returns the argument types of methods of this type. This method should
-     * only be used for method types.
-     *
-     * @return the argument types of methods of this type.
-     */
-    public Type[] getArgumentTypes() {
-        return getArgumentTypes(getDescriptor());
-    }
-
-    /**
-     * Returns the return type of methods of this type. This method should only
-     * be used for method types.
-     *
-     * @return the return type of methods of this type.
-     */
-    public Type getReturnType() {
-        return getReturnType(getDescriptor());
-    }
-
-    /**
-     * Returns the size of the arguments and of the return value of methods of
-     * this type. This method should only be used for method types.
-     *
-     * @return the size of the arguments (plus one for the implicit this
-     *         argument), argSize, and the size of the return value, retSize,
-     *         packed into a single
-     *         int i = <tt>(argSize << 2) | retSize</tt>
-     *         (argSize is therefore equal to <tt>i >> 2</tt>,
-     *         and retSize to <tt>i & 0x03</tt>).
-     */
-    public int getArgumentsAndReturnSizes() {
-        return getArgumentsAndReturnSizes(getDescriptor());
-    }
-
-    // ------------------------------------------------------------------------
-    // Conversion to type descriptors
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns the descriptor corresponding to this Java type.
-     *
-     * @return the descriptor corresponding to this Java type.
-     */
-    public String getDescriptor() {
-        StringBuffer buf = new StringBuffer();
-        getDescriptor(buf);
-        return buf.toString();
-    }
-
-    /**
-     * Returns the descriptor corresponding to the given argument and return
-     * types.
-     *
-     * @param returnType
-     *            the return type of the method.
-     * @param argumentTypes
-     *            the argument types of the method.
-     * @return the descriptor corresponding to the given argument and return
-     *         types.
-     */
-    public static String getMethodDescriptor(final Type returnType,
-            final Type... argumentTypes) {
-        StringBuffer buf = new StringBuffer();
-        buf.append('(');
-        for (int i = 0; i < argumentTypes.length; ++i) {
-            argumentTypes[i].getDescriptor(buf);
-        }
-        buf.append(')');
-        returnType.getDescriptor(buf);
-        return buf.toString();
-    }
-
-    /**
-     * Appends the descriptor corresponding to this Java type to the given
-     * string buffer.
-     *
-     * @param buf
-     *            the string buffer to which the descriptor must be appended.
-     */
-    private void getDescriptor(final StringBuffer buf) {
-        if (this.buf == null) {
-            // descriptor is in byte 3 of 'off' for primitive types (buf ==
-            // null)
-            buf.append((char) ((off & 0xFF000000) >>> 24));
-        } else if (sort == OBJECT) {
-            buf.append('L');
-            buf.append(this.buf, off, len);
-            buf.append(';');
-        } else { // sort == ARRAY || sort == METHOD
-            buf.append(this.buf, off, len);
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Direct conversion from classes to type descriptors,
-    // without intermediate Type objects
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns the internal name of the given class. The internal name of a
-     * class is its fully qualified name, as returned by Class.getName(), where
-     * '.' are replaced by '/'.
-     *
-     * @param c
-     *            an object or array class.
-     * @return the internal name of the given class.
-     */
-    public static String getInternalName(final Class<?> c) {
-        return c.getName().replace('.', '/');
-    }
-
-    /**
-     * Returns the descriptor corresponding to the given Java type.
-     *
-     * @param c
-     *            an object class, a primitive class or an array class.
-     * @return the descriptor corresponding to the given class.
-     */
-    public static String getDescriptor(final Class<?> c) {
-        StringBuffer buf = new StringBuffer();
-        getDescriptor(buf, c);
-        return buf.toString();
-    }
-
-    /**
-     * Returns the descriptor corresponding to the given constructor.
-     *
-     * @param c
-     *            a {@link Constructor Constructor} object.
-     * @return the descriptor of the given constructor.
-     */
-    public static String getConstructorDescriptor(final Constructor<?> c) {
-        Class<?>[] parameters = c.getParameterTypes();
-        StringBuffer buf = new StringBuffer();
-        buf.append('(');
-        for (int i = 0; i < parameters.length; ++i) {
-            getDescriptor(buf, parameters[i]);
-        }
-        return buf.append(")V").toString();
-    }
-
-    /**
-     * Returns the descriptor corresponding to the given method.
-     *
-     * @param m
-     *            a {@link Method Method} object.
-     * @return the descriptor of the given method.
-     */
-    public static String getMethodDescriptor(final Method m) {
-        Class<?>[] parameters = m.getParameterTypes();
-        StringBuffer buf = new StringBuffer();
-        buf.append('(');
-        for (int i = 0; i < parameters.length; ++i) {
-            getDescriptor(buf, parameters[i]);
-        }
-        buf.append(')');
-        getDescriptor(buf, m.getReturnType());
-        return buf.toString();
-    }
-
-    /**
-     * Appends the descriptor of the given class to the given string buffer.
-     *
-     * @param buf
-     *            the string buffer to which the descriptor must be appended.
-     * @param c
-     *            the class whose descriptor must be computed.
-     */
-    private static void getDescriptor(final StringBuffer buf, final Class<?> c) {
-        Class<?> d = c;
-        while (true) {
-            if (d.isPrimitive()) {
-                char car;
-                if (d == Integer.TYPE) {
-                    car = 'I';
-                } else if (d == Void.TYPE) {
-                    car = 'V';
-                } else if (d == Boolean.TYPE) {
-                    car = 'Z';
-                } else if (d == Byte.TYPE) {
-                    car = 'B';
-                } else if (d == Character.TYPE) {
-                    car = 'C';
-                } else if (d == Short.TYPE) {
-                    car = 'S';
-                } else if (d == Double.TYPE) {
-                    car = 'D';
-                } else if (d == Float.TYPE) {
-                    car = 'F';
-                } else /* if (d == Long.TYPE) */{
-                    car = 'J';
-                }
-                buf.append(car);
-                return;
-            } else if (d.isArray()) {
-                buf.append('[');
-                d = d.getComponentType();
-            } else {
-                buf.append('L');
-                String name = d.getName();
-                int len = name.length();
-                for (int i = 0; i < len; ++i) {
-                    char car = name.charAt(i);
-                    buf.append(car == '.' ? '/' : car);
-                }
-                buf.append(';');
-                return;
-            }
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Corresponding size and opcodes
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns the size of values of this type. This method must not be used for
-     * method types.
-     *
-     * @return the size of values of this type, i.e., 2 for <tt>long</tt> and
-     *         <tt>double</tt>, 0 for <tt>void</tt> and 1 otherwise.
-     */
-    public int getSize() {
-        // the size is in byte 0 of 'off' for primitive types (buf == null)
-        return buf == null ? (off & 0xFF) : 1;
-    }
-
-    /**
-     * Returns a JVM instruction opcode adapted to this Java type. This method
-     * must not be used for method types.
-     *
-     * @param opcode
-     *            a JVM instruction opcode. This opcode must be one of ILOAD,
-     *            ISTORE, IALOAD, IASTORE, IADD, ISUB, IMUL, IDIV, IREM, INEG,
-     *            ISHL, ISHR, IUSHR, IAND, IOR, IXOR and IRETURN.
-     * @return an opcode that is similar to the given opcode, but adapted to
-     *         this Java type. For example, if this type is <tt>float</tt> and
-     *         <tt>opcode</tt> is IRETURN, this method returns FRETURN.
-     */
-    public int getOpcode(final int opcode) {
-        if (opcode == Opcodes.IALOAD || opcode == Opcodes.IASTORE) {
-            // the offset for IALOAD or IASTORE is in byte 1 of 'off' for
-            // primitive types (buf == null)
-            return opcode + (buf == null ? (off & 0xFF00) >> 8 : 4);
-        } else {
-            // the offset for other instructions is in byte 2 of 'off' for
-            // primitive types (buf == null)
-            return opcode + (buf == null ? (off & 0xFF0000) >> 16 : 4);
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Equals, hashCode and toString
-    // ------------------------------------------------------------------------
-
-    /**
-     * Tests if the given object is equal to this type.
-     *
-     * @param o
-     *            the object to be compared to this type.
-     * @return <tt>true</tt> if the given object is equal to this type.
-     */
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof Type)) {
-            return false;
-        }
-        Type t = (Type) o;
-        if (sort != t.sort) {
-            return false;
-        }
-        if (sort >= ARRAY) {
-            if (len != t.len) {
-                return false;
-            }
-            for (int i = off, j = t.off, end = i + len; i < end; i++, j++) {
-                if (buf[i] != t.buf[j]) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Returns a hash code value for this type.
-     *
-     * @return a hash code value for this type.
-     */
-    @Override
-    public int hashCode() {
-        int hc = 13 * sort;
-        if (sort >= ARRAY) {
-            for (int i = off, end = i + len; i < end; i++) {
-                hc = 17 * (hc + buf[i]);
-            }
-        }
-        return hc;
-    }
-
-    /**
-     * Returns a string representation of this type.
-     *
-     * @return the descriptor of this type.
-     */
-    @Override
-    public String toString() {
-        return getDescriptor();
-    }
-}
diff --git a/src/asm/scala/tools/asm/TypePath.java b/src/asm/scala/tools/asm/TypePath.java
deleted file mode 100644
index d4c6f0d..0000000
--- a/src/asm/scala/tools/asm/TypePath.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2013 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package scala.tools.asm;
-
-/**
- * The path to a type argument, wildcard bound, array element type, or static
- * inner type within an enclosing type.
- *
- * @author Eric Bruneton
- */
-public class TypePath {
-
-    /**
-     * A type path step that steps into the element type of an array type. See
-     * {@link #getStep getStep}.
-     */
-    public final static int ARRAY_ELEMENT = 0;
-
-    /**
-     * A type path step that steps into the nested type of a class type. See
-     * {@link #getStep getStep}.
-     */
-    public final static int INNER_TYPE = 1;
-
-    /**
-     * A type path step that steps into the bound of a wildcard type. See
-     * {@link #getStep getStep}.
-     */
-    public final static int WILDCARD_BOUND = 2;
-
-    /**
-     * A type path step that steps into a type argument of a generic type. See
-     * {@link #getStep getStep}.
-     */
-    public final static int TYPE_ARGUMENT = 3;
-
-    /**
-     * The byte array where the path is stored, in Java class file format.
-     */
-    byte[] b;
-
-    /**
-     * The offset of the first byte of the type path in 'b'.
-     */
-    int offset;
-
-    /**
-     * Creates a new type path.
-     *
-     * @param b
-     *            the byte array containing the type path in Java class file
-     *            format.
-     * @param offset
-     *            the offset of the first byte of the type path in 'b'.
-     */
-    TypePath(byte[] b, int offset) {
-        this.b = b;
-        this.offset = offset;
-    }
-
-    /**
-     * Returns the length of this path.
-     *
-     * @return the length of this path.
-     */
-    public int getLength() {
-        return b[offset];
-    }
-
-    /**
-     * Returns the value of the given step of this path.
-     *
-     * @param index
-     *            an index between 0 and {@link #getLength()}, exclusive.
-     * @return {@link #ARRAY_ELEMENT ARRAY_ELEMENT}, {@link #INNER_TYPE
-     *         INNER_TYPE}, {@link #WILDCARD_BOUND WILDCARD_BOUND}, or
-     *         {@link #TYPE_ARGUMENT TYPE_ARGUMENT}.
-     */
-    public int getStep(int index) {
-        return b[offset + 2 * index + 1];
-    }
-
-    /**
-     * Returns the index of the type argument that the given step is stepping
-     * into. This method should only be used for steps whose value is
-     * {@link #TYPE_ARGUMENT TYPE_ARGUMENT}.
-     *
-     * @param index
-     *            an index between 0 and {@link #getLength()}, exclusive.
-     * @return the index of the type argument that the given step is stepping
-     *         into.
-     */
-    public int getStepArgument(int index) {
-        return b[offset + 2 * index + 2];
-    }
-
-    /**
-     * Converts a type path in string form, in the format used by
-     * {@link #toString()}, into a TypePath object.
-     *
-     * @param typePath
-     *            a type path in string form, in the format used by
-     *            {@link #toString()}. May be null or empty.
-     * @return the corresponding TypePath object, or null if the path is empty.
-     */
-    public static TypePath fromString(final String typePath) {
-        if (typePath == null || typePath.length() == 0) {
-            return null;
-        }
-        int n = typePath.length();
-        ByteVector out = new ByteVector(n);
-        out.putByte(0);
-        for (int i = 0; i < n;) {
-            char c = typePath.charAt(i++);
-            if (c == '[') {
-                out.put11(ARRAY_ELEMENT, 0);
-            } else if (c == '.') {
-                out.put11(INNER_TYPE, 0);
-            } else if (c == '*') {
-                out.put11(WILDCARD_BOUND, 0);
-            } else if (c >= '0' && c <= '9') {
-                int typeArg = c - '0';
-                while (i < n && (c = typePath.charAt(i)) >= '0' && c <= '9') {
-                    typeArg = typeArg * 10 + c - '0';
-                    i += 1;
-                }
-                out.put11(TYPE_ARGUMENT, typeArg);
-            }
-        }
-        out.data[0] = (byte) (out.length / 2);
-        return new TypePath(out.data, 0);
-    }
-
-    /**
-     * Returns a string representation of this type path. {@link #ARRAY_ELEMENT
-     * ARRAY_ELEMENT} steps are represented with '[', {@link #INNER_TYPE
-     * INNER_TYPE} steps with '.', {@link #WILDCARD_BOUND WILDCARD_BOUND} steps
-     * with '*' and {@link #TYPE_ARGUMENT TYPE_ARGUMENT} steps with their type
-     * argument index in decimal form.
-     */
-    @Override
-    public String toString() {
-        int length = getLength();
-        StringBuilder result = new StringBuilder(length * 2);
-        for (int i = 0; i < length; ++i) {
-            switch (getStep(i)) {
-            case ARRAY_ELEMENT:
-                result.append('[');
-                break;
-            case INNER_TYPE:
-                result.append('.');
-                break;
-            case WILDCARD_BOUND:
-                result.append('*');
-                break;
-            case TYPE_ARGUMENT:
-                result.append(getStepArgument(i));
-                break;
-            default:
-                result.append('_');
-            }
-        }
-        return result.toString();
-    }
-}
diff --git a/src/asm/scala/tools/asm/TypeReference.java b/src/asm/scala/tools/asm/TypeReference.java
deleted file mode 100644
index 118b0f6..0000000
--- a/src/asm/scala/tools/asm/TypeReference.java
+++ /dev/null
@@ -1,452 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2013 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package scala.tools.asm;
-
-/**
- * A reference to a type appearing in a class, field or method declaration, or
- * on an instruction. Such a reference designates the part of the class where
- * the referenced type is appearing (e.g. an 'extends', 'implements' or 'throws'
- * clause, a 'new' instruction, a 'catch' clause, a type cast, a local variable
- * declaration, etc).
- *
- * @author Eric Bruneton
- */
-public class TypeReference {
-
-    /**
-     * The sort of type references that target a type parameter of a generic
-     * class. See {@link #getSort getSort}.
-     */
-    public final static int CLASS_TYPE_PARAMETER = 0x00;
-
-    /**
-     * The sort of type references that target a type parameter of a generic
-     * method. See {@link #getSort getSort}.
-     */
-    public final static int METHOD_TYPE_PARAMETER = 0x01;
-
-    /**
-     * The sort of type references that target the super class of a class or one
-     * of the interfaces it implements. See {@link #getSort getSort}.
-     */
-    public final static int CLASS_EXTENDS = 0x10;
-
-    /**
-     * The sort of type references that target a bound of a type parameter of a
-     * generic class. See {@link #getSort getSort}.
-     */
-    public final static int CLASS_TYPE_PARAMETER_BOUND = 0x11;
-
-    /**
-     * The sort of type references that target a bound of a type parameter of a
-     * generic method. See {@link #getSort getSort}.
-     */
-    public final static int METHOD_TYPE_PARAMETER_BOUND = 0x12;
-
-    /**
-     * The sort of type references that target the type of a field. See
-     * {@link #getSort getSort}.
-     */
-    public final static int FIELD = 0x13;
-
-    /**
-     * The sort of type references that target the return type of a method. See
-     * {@link #getSort getSort}.
-     */
-    public final static int METHOD_RETURN = 0x14;
-
-    /**
-     * The sort of type references that target the receiver type of a method.
-     * See {@link #getSort getSort}.
-     */
-    public final static int METHOD_RECEIVER = 0x15;
-
-    /**
-     * The sort of type references that target the type of a formal parameter of
-     * a method. See {@link #getSort getSort}.
-     */
-    public final static int METHOD_FORMAL_PARAMETER = 0x16;
-
-    /**
-     * The sort of type references that target the type of an exception declared
-     * in the throws clause of a method. See {@link #getSort getSort}.
-     */
-    public final static int THROWS = 0x17;
-
-    /**
-     * The sort of type references that target the type of a local variable in a
-     * method. See {@link #getSort getSort}.
-     */
-    public final static int LOCAL_VARIABLE = 0x40;
-
-    /**
-     * The sort of type references that target the type of a resource variable
-     * in a method. See {@link #getSort getSort}.
-     */
-    public final static int RESOURCE_VARIABLE = 0x41;
-
-    /**
-     * The sort of type references that target the type of the exception of a
-     * 'catch' clause in a method. See {@link #getSort getSort}.
-     */
-    public final static int EXCEPTION_PARAMETER = 0x42;
-
-    /**
-     * The sort of type references that target the type declared in an
-     * 'instanceof' instruction. See {@link #getSort getSort}.
-     */
-    public final static int INSTANCEOF = 0x43;
-
-    /**
-     * The sort of type references that target the type of the object created by
-     * a 'new' instruction. See {@link #getSort getSort}.
-     */
-    public final static int NEW = 0x44;
-
-    /**
-     * The sort of type references that target the receiver type of a
-     * constructor reference. See {@link #getSort getSort}.
-     */
-    public final static int CONSTRUCTOR_REFERENCE = 0x45;
-
-    /**
-     * The sort of type references that target the receiver type of a method
-     * reference. See {@link #getSort getSort}.
-     */
-    public final static int METHOD_REFERENCE = 0x46;
-
-    /**
-     * The sort of type references that target the type declared in an explicit
-     * or implicit cast instruction. See {@link #getSort getSort}.
-     */
-    public final static int CAST = 0x47;
-
-    /**
-     * The sort of type references that target a type parameter of a generic
-     * constructor in a constructor call. See {@link #getSort getSort}.
-     */
-    public final static int CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT = 0x48;
-
-    /**
-     * The sort of type references that target a type parameter of a generic
-     * method in a method call. See {@link #getSort getSort}.
-     */
-    public final static int METHOD_INVOCATION_TYPE_ARGUMENT = 0x49;
-
-    /**
-     * The sort of type references that target a type parameter of a generic
-     * constructor in a constructor reference. See {@link #getSort getSort}.
-     */
-    public final static int CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT = 0x4A;
-
-    /**
-     * The sort of type references that target a type parameter of a generic
-     * method in a method reference. See {@link #getSort getSort}.
-     */
-    public final static int METHOD_REFERENCE_TYPE_ARGUMENT = 0x4B;
-
-    /**
-     * The type reference value in Java class file format.
-     */
-    private int value;
-
-    /**
-     * Creates a new TypeReference.
-     *
-     * @param typeRef
-     *            the int encoded value of the type reference, as received in a
-     *            visit method related to type annotations, like
-     *            visitTypeAnnotation.
-     */
-    public TypeReference(int typeRef) {
-        this.value = typeRef;
-    }
-
-    /**
-     * Returns a type reference of the given sort.
-     *
-     * @param sort
-     *            {@link #FIELD FIELD}, {@link #METHOD_RETURN METHOD_RETURN},
-     *            {@link #METHOD_RECEIVER METHOD_RECEIVER},
-     *            {@link #LOCAL_VARIABLE LOCAL_VARIABLE},
-     *            {@link #RESOURCE_VARIABLE RESOURCE_VARIABLE},
-     *            {@link #INSTANCEOF INSTANCEOF}, {@link #NEW NEW},
-     *            {@link #CONSTRUCTOR_REFERENCE CONSTRUCTOR_REFERENCE}, or
-     *            {@link #METHOD_REFERENCE METHOD_REFERENCE}.
-     * @return a type reference of the given sort.
-     */
-    public static TypeReference newTypeReference(int sort) {
-        return new TypeReference(sort << 24);
-    }
-
-    /**
-     * Returns a reference to a type parameter of a generic class or method.
-     *
-     * @param sort
-     *            {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER} or
-     *            {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER}.
-     * @param paramIndex
-     *            the type parameter index.
-     * @return a reference to the given generic class or method type parameter.
-     */
-    public static TypeReference newTypeParameterReference(int sort,
-            int paramIndex) {
-        return new TypeReference((sort << 24) | (paramIndex << 16));
-    }
-
-    /**
-     * Returns a reference to a type parameter bound of a generic class or
-     * method.
-     *
-     * @param sort
-     *            {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER} or
-     *            {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER}.
-     * @param paramIndex
-     *            the type parameter index.
-     * @param boundIndex
-     *            the type bound index within the above type parameters.
-     * @return a reference to the given generic class or method type parameter
-     *         bound.
-     */
-    public static TypeReference newTypeParameterBoundReference(int sort,
-            int paramIndex, int boundIndex) {
-        return new TypeReference((sort << 24) | (paramIndex << 16)
-                | (boundIndex << 8));
-    }
-
-    /**
-     * Returns a reference to the super class or to an interface of the
-     * 'implements' clause of a class.
-     *
-     * @param itfIndex
-     *            the index of an interface in the 'implements' clause of a
-     *            class, or -1 to reference the super class of the class.
-     * @return a reference to the given super type of a class.
-     */
-    public static TypeReference newSuperTypeReference(int itfIndex) {
-        itfIndex &= 0xFFFF;
-        return new TypeReference((CLASS_EXTENDS << 24) | (itfIndex << 8));
-    }
-
-    /**
-     * Returns a reference to the type of a formal parameter of a method.
-     *
-     * @param paramIndex
-     *            the formal parameter index.
-     *
-     * @return a reference to the type of the given method formal parameter.
-     */
-    public static TypeReference newFormalParameterReference(int paramIndex) {
-        return new TypeReference((METHOD_FORMAL_PARAMETER << 24)
-                | (paramIndex << 16));
-    }
-
-    /**
-     * Returns a reference to the type of an exception, in a 'throws' clause of
-     * a method.
-     *
-     * @param exceptionIndex
-     *            the index of an exception in a 'throws' clause of a method.
-     *
-     * @return a reference to the type of the given exception.
-     */
-    public static TypeReference newExceptionReference(int exceptionIndex) {
-        return new TypeReference((THROWS << 24) | (exceptionIndex << 8));
-    }
-
-    /**
-     * Returns a reference to the type of the exception declared in a 'catch'
-     * clause of a method.
-     *
-     * @param tryCatchBlockIndex
-     *            the index of a try catch block (using the order in which they
-     *            are visited with visitTryCatchBlock).
-     *
-     * @return a reference to the type of the given exception.
-     */
-    public static TypeReference newTryCatchReference(int tryCatchBlockIndex) {
-        return new TypeReference((EXCEPTION_PARAMETER << 24)
-                | (tryCatchBlockIndex << 8));
-    }
-
-    /**
-     * Returns a reference to the type of a type argument in a constructor or
-     * method call or reference.
-     *
-     * @param sort
-     *            {@link #CAST CAST},
-     *            {@link #CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
-     *            CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
-     *            {@link #METHOD_INVOCATION_TYPE_ARGUMENT
-     *            METHOD_INVOCATION_TYPE_ARGUMENT},
-     *            {@link #CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
-     *            CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
-     *            {@link #METHOD_REFERENCE_TYPE_ARGUMENT
-     *            METHOD_REFERENCE_TYPE_ARGUMENT}.
-     * @param argIndex
-     *            the type argument index.
-     *
-     * @return a reference to the type of the given type argument.
-     */
-    public static TypeReference newTypeArgumentReference(int sort, int argIndex) {
-        return new TypeReference((sort << 24) | argIndex);
-    }
-
-    /**
-     * Returns the sort of this type reference.
-     *
-     * @return {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER},
-     *         {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER},
-     *         {@link #CLASS_EXTENDS CLASS_EXTENDS},
-     *         {@link #CLASS_TYPE_PARAMETER_BOUND CLASS_TYPE_PARAMETER_BOUND},
-     *         {@link #METHOD_TYPE_PARAMETER_BOUND METHOD_TYPE_PARAMETER_BOUND},
-     *         {@link #FIELD FIELD}, {@link #METHOD_RETURN METHOD_RETURN},
-     *         {@link #METHOD_RECEIVER METHOD_RECEIVER},
-     *         {@link #METHOD_FORMAL_PARAMETER METHOD_FORMAL_PARAMETER},
-     *         {@link #THROWS THROWS}, {@link #LOCAL_VARIABLE LOCAL_VARIABLE},
-     *         {@link #RESOURCE_VARIABLE RESOURCE_VARIABLE},
-     *         {@link #EXCEPTION_PARAMETER EXCEPTION_PARAMETER},
-     *         {@link #INSTANCEOF INSTANCEOF}, {@link #NEW NEW},
-     *         {@link #CONSTRUCTOR_REFERENCE CONSTRUCTOR_REFERENCE},
-     *         {@link #METHOD_REFERENCE METHOD_REFERENCE}, {@link #CAST CAST},
-     *         {@link #CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
-     *         CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
-     *         {@link #METHOD_INVOCATION_TYPE_ARGUMENT
-     *         METHOD_INVOCATION_TYPE_ARGUMENT},
-     *         {@link #CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
-     *         CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
-     *         {@link #METHOD_REFERENCE_TYPE_ARGUMENT
-     *         METHOD_REFERENCE_TYPE_ARGUMENT}.
-     */
-    public int getSort() {
-        return value >>> 24;
-    }
-
-    /**
-     * Returns the index of the type parameter referenced by this type
-     * reference. This method must only be used for type references whose sort
-     * is {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER},
-     * {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER},
-     * {@link #CLASS_TYPE_PARAMETER_BOUND CLASS_TYPE_PARAMETER_BOUND} or
-     * {@link #METHOD_TYPE_PARAMETER_BOUND METHOD_TYPE_PARAMETER_BOUND}.
-     *
-     * @return a type parameter index.
-     */
-    public int getTypeParameterIndex() {
-        return (value & 0x00FF0000) >> 16;
-    }
-
-    /**
-     * Returns the index of the type parameter bound, within the type parameter
-     * {@link #getTypeParameterIndex}, referenced by this type reference. This
-     * method must only be used for type references whose sort is
-     * {@link #CLASS_TYPE_PARAMETER_BOUND CLASS_TYPE_PARAMETER_BOUND} or
-     * {@link #METHOD_TYPE_PARAMETER_BOUND METHOD_TYPE_PARAMETER_BOUND}.
-     *
-     * @return a type parameter bound index.
-     */
-    public int getTypeParameterBoundIndex() {
-        return (value & 0x0000FF00) >> 8;
-    }
-
-    /**
-     * Returns the index of the "super type" of a class that is referenced by
-     * this type reference. This method must only be used for type references
-     * whose sort is {@link #CLASS_EXTENDS CLASS_EXTENDS}.
-     *
-     * @return the index of an interface in the 'implements' clause of a class,
-     *         or -1 if this type reference references the type of the super
-     *         class.
-     */
-    public int getSuperTypeIndex() {
-        return (short) ((value & 0x00FFFF00) >> 8);
-    }
-
-    /**
-     * Returns the index of the formal parameter whose type is referenced by
-     * this type reference. This method must only be used for type references
-     * whose sort is {@link #METHOD_FORMAL_PARAMETER METHOD_FORMAL_PARAMETER}.
-     *
-     * @return a formal parameter index.
-     */
-    public int getFormalParameterIndex() {
-        return (value & 0x00FF0000) >> 16;
-    }
-
-    /**
-     * Returns the index of the exception, in a 'throws' clause of a method,
-     * whose type is referenced by this type reference. This method must only be
-     * used for type references whose sort is {@link #THROWS THROWS}.
-     *
-     * @return the index of an exception in the 'throws' clause of a method.
-     */
-    public int getExceptionIndex() {
-        return (value & 0x00FFFF00) >> 8;
-    }
-
-    /**
-     * Returns the index of the try catch block (using the order in which they
-     * are visited with visitTryCatchBlock), whose 'catch' type is referenced by
-     * this type reference. This method must only be used for type references
-     * whose sort is {@link #EXCEPTION_PARAMETER EXCEPTION_PARAMETER} .
-     *
-     * @return the index of an exception in the 'throws' clause of a method.
-     */
-    public int getTryCatchBlockIndex() {
-        return (value & 0x00FFFF00) >> 8;
-    }
-
-    /**
-     * Returns the index of the type argument referenced by this type reference.
-     * This method must only be used for type references whose sort is
-     * {@link #CAST CAST}, {@link #CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
-     * CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
-     * {@link #METHOD_INVOCATION_TYPE_ARGUMENT METHOD_INVOCATION_TYPE_ARGUMENT},
-     * {@link #CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
-     * CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
-     * {@link #METHOD_REFERENCE_TYPE_ARGUMENT METHOD_REFERENCE_TYPE_ARGUMENT}.
-     *
-     * @return a type parameter index.
-     */
-    public int getTypeArgumentIndex() {
-        return value & 0xFF;
-    }
-
-    /**
-     * Returns the int encoded value of this type reference, suitable for use in
-     * visit methods related to type annotations, like visitTypeAnnotation.
-     *
-     * @return the int encoded value of this type reference.
-     */
-    public int getValue() {
-        return value;
-    }
-}
diff --git a/src/asm/scala/tools/asm/signature/SignatureReader.java b/src/asm/scala/tools/asm/signature/SignatureReader.java
deleted file mode 100644
index 9c7c388..0000000
--- a/src/asm/scala/tools/asm/signature/SignatureReader.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.signature;
-
-/**
- * A type signature parser to make a signature visitor visit an existing
- * signature.
- *
- * @author Thomas Hallgren
- * @author Eric Bruneton
- */
-public class SignatureReader {
-
-    /**
-     * The signature to be read.
-     */
-    private final String signature;
-
-    /**
-     * Constructs a {@link SignatureReader} for the given signature.
-     *
-     * @param signature
-     *            A <i>ClassSignature</i>, <i>MethodTypeSignature</i>, or
-     *            <i>FieldTypeSignature</i>.
-     */
-    public SignatureReader(final String signature) {
-        this.signature = signature;
-    }
-
-    /**
-     * Makes the given visitor visit the signature of this
-     * {@link SignatureReader}. This signature is the one specified in the
-     * constructor (see {@link #SignatureReader(String) SignatureReader}). This
-     * method is intended to be called on a {@link SignatureReader} that was
-     * created using a <i>ClassSignature</i> (such as the <code>signature</code>
-     * parameter of the {@link scala.tools.asm.ClassVisitor#visit
-     * ClassVisitor.visit} method) or a <i>MethodTypeSignature</i> (such as the
-     * <code>signature</code> parameter of the
-     * {@link scala.tools.asm.ClassVisitor#visitMethod
-     * ClassVisitor.visitMethod} method).
-     *
-     * @param v
-     *            the visitor that must visit this signature.
-     */
-    public void accept(final SignatureVisitor v) {
-        String signature = this.signature;
-        int len = signature.length();
-        int pos;
-        char c;
-
-        if (signature.charAt(0) == '<') {
-            pos = 2;
-            do {
-                int end = signature.indexOf(':', pos);
-                v.visitFormalTypeParameter(signature.substring(pos - 1, end));
-                pos = end + 1;
-
-                c = signature.charAt(pos);
-                if (c == 'L' || c == '[' || c == 'T') {
-                    pos = parseType(signature, pos, v.visitClassBound());
-                }
-
-                while ((c = signature.charAt(pos++)) == ':') {
-                    pos = parseType(signature, pos, v.visitInterfaceBound());
-                }
-            } while (c != '>');
-        } else {
-            pos = 0;
-        }
-
-        if (signature.charAt(pos) == '(') {
-            pos++;
-            while (signature.charAt(pos) != ')') {
-                pos = parseType(signature, pos, v.visitParameterType());
-            }
-            pos = parseType(signature, pos + 1, v.visitReturnType());
-            while (pos < len) {
-                pos = parseType(signature, pos + 1, v.visitExceptionType());
-            }
-        } else {
-            pos = parseType(signature, pos, v.visitSuperclass());
-            while (pos < len) {
-                pos = parseType(signature, pos, v.visitInterface());
-            }
-        }
-    }
-
-    /**
-     * Makes the given visitor visit the signature of this
-     * {@link SignatureReader}. This signature is the one specified in the
-     * constructor (see {@link #SignatureReader(String) SignatureReader}). This
-     * method is intended to be called on a {@link SignatureReader} that was
-     * created using a <i>FieldTypeSignature</i>, such as the
-     * <code>signature</code> parameter of the
-     * {@link scala.tools.asm.ClassVisitor#visitField ClassVisitor.visitField}
-     * or {@link scala.tools.asm.MethodVisitor#visitLocalVariable
-     * MethodVisitor.visitLocalVariable} methods.
-     *
-     * @param v
-     *            the visitor that must visit this signature.
-     */
-    public void acceptType(final SignatureVisitor v) {
-        parseType(this.signature, 0, v);
-    }
-
-    /**
-     * Parses a field type signature and makes the given visitor visit it.
-     *
-     * @param signature
-     *            a string containing the signature that must be parsed.
-     * @param pos
-     *            index of the first character of the signature to parsed.
-     * @param v
-     *            the visitor that must visit this signature.
-     * @return the index of the first character after the parsed signature.
-     */
-    private static int parseType(final String signature, int pos,
-            final SignatureVisitor v) {
-        char c;
-        int start, end;
-        boolean visited, inner;
-        String name;
-
-        switch (c = signature.charAt(pos++)) {
-        case 'Z':
-        case 'C':
-        case 'B':
-        case 'S':
-        case 'I':
-        case 'F':
-        case 'J':
-        case 'D':
-        case 'V':
-            v.visitBaseType(c);
-            return pos;
-
-        case '[':
-            return parseType(signature, pos, v.visitArrayType());
-
-        case 'T':
-            end = signature.indexOf(';', pos);
-            v.visitTypeVariable(signature.substring(pos, end));
-            return end + 1;
-
-        default: // case 'L':
-            start = pos;
-            visited = false;
-            inner = false;
-            for (;;) {
-                switch (c = signature.charAt(pos++)) {
-                case '.':
-                case ';':
-                    if (!visited) {
-                        name = signature.substring(start, pos - 1);
-                        if (inner) {
-                            v.visitInnerClassType(name);
-                        } else {
-                            v.visitClassType(name);
-                        }
-                    }
-                    if (c == ';') {
-                        v.visitEnd();
-                        return pos;
-                    }
-                    start = pos;
-                    visited = false;
-                    inner = true;
-                    break;
-
-                case '<':
-                    name = signature.substring(start, pos - 1);
-                    if (inner) {
-                        v.visitInnerClassType(name);
-                    } else {
-                        v.visitClassType(name);
-                    }
-                    visited = true;
-                    top: for (;;) {
-                        switch (c = signature.charAt(pos)) {
-                        case '>':
-                            break top;
-                        case '*':
-                            ++pos;
-                            v.visitTypeArgument();
-                            break;
-                        case '+':
-                        case '-':
-                            pos = parseType(signature, pos + 1,
-                                    v.visitTypeArgument(c));
-                            break;
-                        default:
-                            pos = parseType(signature, pos,
-                                    v.visitTypeArgument('='));
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/signature/SignatureVisitor.java b/src/asm/scala/tools/asm/signature/SignatureVisitor.java
deleted file mode 100644
index 1e16bd3..0000000
--- a/src/asm/scala/tools/asm/signature/SignatureVisitor.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.signature;
-
-import scala.tools.asm.Opcodes;
-
-/**
- * A visitor to visit a generic signature. The methods of this interface must be
- * called in one of the three following orders (the last one is the only valid
- * order for a {@link SignatureVisitor} that is returned by a method of this
- * interface):
- * <ul>
- * <li><i>ClassSignature</i> = ( <tt>visitFormalTypeParameter</tt>
- * <tt>visitClassBound</tt>? <tt>visitInterfaceBound</tt>* )* (
- * <tt>visitSuperClass</tt> <tt>visitInterface</tt>* )</li>
- * <li><i>MethodSignature</i> = ( <tt>visitFormalTypeParameter</tt>
- * <tt>visitClassBound</tt>? <tt>visitInterfaceBound</tt>* )* (
- * <tt>visitParameterType</tt>* <tt>visitReturnType</tt>
- * <tt>visitExceptionType</tt>* )</li>
- * <li><i>TypeSignature</i> = <tt>visitBaseType</tt> |
- * <tt>visitTypeVariable</tt> | <tt>visitArrayType</tt> | (
- * <tt>visitClassType</tt> <tt>visitTypeArgument</tt>* (
- * <tt>visitInnerClassType</tt> <tt>visitTypeArgument</tt>* )* <tt>visitEnd</tt>
- * ) )</li>
- * </ul>
- *
- * @author Thomas Hallgren
- * @author Eric Bruneton
- */
-public abstract class SignatureVisitor {
-
-    /**
-     * Wildcard for an "extends" type argument.
-     */
-    public final static char EXTENDS = '+';
-
-    /**
-     * Wildcard for a "super" type argument.
-     */
-    public final static char SUPER = '-';
-
-    /**
-     * Wildcard for a normal type argument.
-     */
-    public final static char INSTANCEOF = '=';
-
-    /**
-     * The ASM API version implemented by this visitor. The value of this field
-     * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    protected final int api;
-
-    /**
-     * Constructs a new {@link SignatureVisitor}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    public SignatureVisitor(final int api) {
-        if (api != Opcodes.ASM4 && api != Opcodes.ASM5) {
-            throw new IllegalArgumentException();
-        }
-        this.api = api;
-    }
-
-    /**
-     * Visits a formal type parameter.
-     *
-     * @param name
-     *            the name of the formal parameter.
-     */
-    public void visitFormalTypeParameter(String name) {
-    }
-
-    /**
-     * Visits the class bound of the last visited formal type parameter.
-     *
-     * @return a non null visitor to visit the signature of the class bound.
-     */
-    public SignatureVisitor visitClassBound() {
-        return this;
-    }
-
-    /**
-     * Visits an interface bound of the last visited formal type parameter.
-     *
-     * @return a non null visitor to visit the signature of the interface bound.
-     */
-    public SignatureVisitor visitInterfaceBound() {
-        return this;
-    }
-
-    /**
-     * Visits the type of the super class.
-     *
-     * @return a non null visitor to visit the signature of the super class
-     *         type.
-     */
-    public SignatureVisitor visitSuperclass() {
-        return this;
-    }
-
-    /**
-     * Visits the type of an interface implemented by the class.
-     *
-     * @return a non null visitor to visit the signature of the interface type.
-     */
-    public SignatureVisitor visitInterface() {
-        return this;
-    }
-
-    /**
-     * Visits the type of a method parameter.
-     *
-     * @return a non null visitor to visit the signature of the parameter type.
-     */
-    public SignatureVisitor visitParameterType() {
-        return this;
-    }
-
-    /**
-     * Visits the return type of the method.
-     *
-     * @return a non null visitor to visit the signature of the return type.
-     */
-    public SignatureVisitor visitReturnType() {
-        return this;
-    }
-
-    /**
-     * Visits the type of a method exception.
-     *
-     * @return a non null visitor to visit the signature of the exception type.
-     */
-    public SignatureVisitor visitExceptionType() {
-        return this;
-    }
-
-    /**
-     * Visits a signature corresponding to a primitive type.
-     *
-     * @param descriptor
-     *            the descriptor of the primitive type, or 'V' for <tt>void</tt>
-     *            .
-     */
-    public void visitBaseType(char descriptor) {
-    }
-
-    /**
-     * Visits a signature corresponding to a type variable.
-     *
-     * @param name
-     *            the name of the type variable.
-     */
-    public void visitTypeVariable(String name) {
-    }
-
-    /**
-     * Visits a signature corresponding to an array type.
-     *
-     * @return a non null visitor to visit the signature of the array element
-     *         type.
-     */
-    public SignatureVisitor visitArrayType() {
-        return this;
-    }
-
-    /**
-     * Starts the visit of a signature corresponding to a class or interface
-     * type.
-     *
-     * @param name
-     *            the internal name of the class or interface.
-     */
-    public void visitClassType(String name) {
-    }
-
-    /**
-     * Visits an inner class.
-     *
-     * @param name
-     *            the local name of the inner class in its enclosing class.
-     */
-    public void visitInnerClassType(String name) {
-    }
-
-    /**
-     * Visits an unbounded type argument of the last visited class or inner
-     * class type.
-     */
-    public void visitTypeArgument() {
-    }
-
-    /**
-     * Visits a type argument of the last visited class or inner class type.
-     *
-     * @param wildcard
-     *            '+', '-' or '='.
-     * @return a non null visitor to visit the signature of the type argument.
-     */
-    public SignatureVisitor visitTypeArgument(char wildcard) {
-        return this;
-    }
-
-    /**
-     * Ends the visit of a signature corresponding to a class or interface type.
-     */
-    public void visitEnd() {
-    }
-}
diff --git a/src/asm/scala/tools/asm/signature/SignatureWriter.java b/src/asm/scala/tools/asm/signature/SignatureWriter.java
deleted file mode 100644
index 65756ee..0000000
--- a/src/asm/scala/tools/asm/signature/SignatureWriter.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.signature;
-
-import scala.tools.asm.Opcodes;
-
-/**
- * A signature visitor that generates signatures in string format.
- *
- * @author Thomas Hallgren
- * @author Eric Bruneton
- */
-public class SignatureWriter extends SignatureVisitor {
-
-    /**
-     * Buffer used to construct the signature.
-     */
-    private final StringBuffer buf = new StringBuffer();
-
-    /**
-     * Indicates if the signature contains formal type parameters.
-     */
-    private boolean hasFormals;
-
-    /**
-     * Indicates if the signature contains method parameter types.
-     */
-    private boolean hasParameters;
-
-    /**
-     * Stack used to keep track of class types that have arguments. Each element
-     * of this stack is a boolean encoded in one bit. The top of the stack is
-     * the lowest order bit. Pushing false = *2, pushing true = *2+1, popping =
-     * /2.
-     */
-    private int argumentStack;
-
-    /**
-     * Constructs a new {@link SignatureWriter} object.
-     */
-    public SignatureWriter() {
-        super(Opcodes.ASM5);
-    }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the SignatureVisitor interface
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visitFormalTypeParameter(final String name) {
-        if (!hasFormals) {
-            hasFormals = true;
-            buf.append('<');
-        }
-        buf.append(name);
-        buf.append(':');
-    }
-
-    @Override
-    public SignatureVisitor visitClassBound() {
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitInterfaceBound() {
-        buf.append(':');
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitSuperclass() {
-        endFormals();
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitInterface() {
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitParameterType() {
-        endFormals();
-        if (!hasParameters) {
-            hasParameters = true;
-            buf.append('(');
-        }
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitReturnType() {
-        endFormals();
-        if (!hasParameters) {
-            buf.append('(');
-        }
-        buf.append(')');
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitExceptionType() {
-        buf.append('^');
-        return this;
-    }
-
-    @Override
-    public void visitBaseType(final char descriptor) {
-        buf.append(descriptor);
-    }
-
-    @Override
-    public void visitTypeVariable(final String name) {
-        buf.append('T');
-        buf.append(name);
-        buf.append(';');
-    }
-
-    @Override
-    public SignatureVisitor visitArrayType() {
-        buf.append('[');
-        return this;
-    }
-
-    @Override
-    public void visitClassType(final String name) {
-        buf.append('L');
-        buf.append(name);
-        argumentStack *= 2;
-    }
-
-    @Override
-    public void visitInnerClassType(final String name) {
-        endArguments();
-        buf.append('.');
-        buf.append(name);
-        argumentStack *= 2;
-    }
-
-    @Override
-    public void visitTypeArgument() {
-        if (argumentStack % 2 == 0) {
-            ++argumentStack;
-            buf.append('<');
-        }
-        buf.append('*');
-    }
-
-    @Override
-    public SignatureVisitor visitTypeArgument(final char wildcard) {
-        if (argumentStack % 2 == 0) {
-            ++argumentStack;
-            buf.append('<');
-        }
-        if (wildcard != '=') {
-            buf.append(wildcard);
-        }
-        return this;
-    }
-
-    @Override
-    public void visitEnd() {
-        endArguments();
-        buf.append(';');
-    }
-
-    /**
-     * Returns the signature that was built by this signature writer.
-     *
-     * @return the signature that was built by this signature writer.
-     */
-    @Override
-    public String toString() {
-        return buf.toString();
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Ends the formal type parameters section of the signature.
-     */
-    private void endFormals() {
-        if (hasFormals) {
-            hasFormals = false;
-            buf.append('>');
-        }
-    }
-
-    /**
-     * Ends the type arguments of a class or inner class type.
-     */
-    private void endArguments() {
-        if (argumentStack % 2 != 0) {
-            buf.append('>');
-        }
-        argumentStack /= 2;
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/AbstractInsnNode.java b/src/asm/scala/tools/asm/tree/AbstractInsnNode.java
deleted file mode 100644
index 2ce0c8b..0000000
--- a/src/asm/scala/tools/asm/tree/AbstractInsnNode.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a bytecode instruction. <i>An instruction can appear
- * at most once in at most one {@link InsnList} at a time</i>.
- *
- * @author Eric Bruneton
- */
-public abstract class AbstractInsnNode {
-
-    /**
-     * The type of {@link InsnNode} instructions.
-     */
-    public static final int INSN = 0;
-
-    /**
-     * The type of {@link IntInsnNode} instructions.
-     */
-    public static final int INT_INSN = 1;
-
-    /**
-     * The type of {@link VarInsnNode} instructions.
-     */
-    public static final int VAR_INSN = 2;
-
-    /**
-     * The type of {@link TypeInsnNode} instructions.
-     */
-    public static final int TYPE_INSN = 3;
-
-    /**
-     * The type of {@link FieldInsnNode} instructions.
-     */
-    public static final int FIELD_INSN = 4;
-
-    /**
-     * The type of {@link MethodInsnNode} instructions.
-     */
-    public static final int METHOD_INSN = 5;
-
-    /**
-     * The type of {@link InvokeDynamicInsnNode} instructions.
-     */
-    public static final int INVOKE_DYNAMIC_INSN = 6;
-
-    /**
-     * The type of {@link JumpInsnNode} instructions.
-     */
-    public static final int JUMP_INSN = 7;
-
-    /**
-     * The type of {@link LabelNode} "instructions".
-     */
-    public static final int LABEL = 8;
-
-    /**
-     * The type of {@link LdcInsnNode} instructions.
-     */
-    public static final int LDC_INSN = 9;
-
-    /**
-     * The type of {@link IincInsnNode} instructions.
-     */
-    public static final int IINC_INSN = 10;
-
-    /**
-     * The type of {@link TableSwitchInsnNode} instructions.
-     */
-    public static final int TABLESWITCH_INSN = 11;
-
-    /**
-     * The type of {@link LookupSwitchInsnNode} instructions.
-     */
-    public static final int LOOKUPSWITCH_INSN = 12;
-
-    /**
-     * The type of {@link MultiANewArrayInsnNode} instructions.
-     */
-    public static final int MULTIANEWARRAY_INSN = 13;
-
-    /**
-     * The type of {@link FrameNode} "instructions".
-     */
-    public static final int FRAME = 14;
-
-    /**
-     * The type of {@link LineNumberNode} "instructions".
-     */
-    public static final int LINE = 15;
-
-    /**
-     * The opcode of this instruction.
-     */
-    protected int opcode;
-
-    /**
-     * The runtime visible type annotations of this instruction. This field is
-     * only used for real instructions (i.e. not for labels, frames, or line
-     * number nodes). This list is a list of {@link TypeAnnotationNode} objects.
-     * May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.TypeAnnotationNode
-     * @label visible
-     */
-    public List<TypeAnnotationNode> visibleTypeAnnotations;
-
-    /**
-     * The runtime invisible type annotations of this instruction. This field is
-     * only used for real instructions (i.e. not for labels, frames, or line
-     * number nodes). This list is a list of {@link TypeAnnotationNode} objects.
-     * May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.TypeAnnotationNode
-     * @label invisible
-     */
-    public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
-    /**
-     * Previous instruction in the list to which this instruction belongs.
-     */
-    AbstractInsnNode prev;
-
-    /**
-     * Next instruction in the list to which this instruction belongs.
-     */
-    AbstractInsnNode next;
-
-    /**
-     * Index of this instruction in the list to which it belongs. The value of
-     * this field is correct only when {@link InsnList#cache} is not null. A
-     * value of -1 indicates that this instruction does not belong to any
-     * {@link InsnList}.
-     */
-    int index;
-
-    /**
-     * Constructs a new {@link AbstractInsnNode}.
-     *
-     * @param opcode
-     *            the opcode of the instruction to be constructed.
-     */
-    protected AbstractInsnNode(final int opcode) {
-        this.opcode = opcode;
-        this.index = -1;
-    }
-
-    /**
-     * Returns the opcode of this instruction.
-     *
-     * @return the opcode of this instruction.
-     */
-    public int getOpcode() {
-        return opcode;
-    }
-
-    /**
-     * Returns the type of this instruction.
-     *
-     * @return the type of this instruction, i.e. one the constants defined in
-     *         this class.
-     */
-    public abstract int getType();
-
-    /**
-     * Returns the previous instruction in the list to which this instruction
-     * belongs, if any.
-     *
-     * @return the previous instruction in the list to which this instruction
-     *         belongs, if any. May be <tt>null</tt>.
-     */
-    public AbstractInsnNode getPrevious() {
-        return prev;
-    }
-
-    /**
-     * Returns the next instruction in the list to which this instruction
-     * belongs, if any.
-     *
-     * @return the next instruction in the list to which this instruction
-     *         belongs, if any. May be <tt>null</tt>.
-     */
-    public AbstractInsnNode getNext() {
-        return next;
-    }
-
-    /**
-     * Makes the given code visitor visit this instruction.
-     *
-     * @param cv
-     *            a code visitor.
-     */
-    public abstract void accept(final MethodVisitor cv);
-
-    /**
-     * Makes the given visitor visit the annotations of this instruction.
-     *
-     * @param mv
-     *            a method visitor.
-     */
-    protected final void acceptAnnotations(final MethodVisitor mv) {
-        int n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations
-                .size();
-        for (int i = 0; i < n; ++i) {
-            TypeAnnotationNode an = visibleTypeAnnotations.get(i);
-            an.accept(mv.visitInsnAnnotation(an.typeRef, an.typePath, an.desc,
-                    true));
-        }
-        n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
-                .size();
-        for (int i = 0; i < n; ++i) {
-            TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
-            an.accept(mv.visitInsnAnnotation(an.typeRef, an.typePath, an.desc,
-                    false));
-        }
-    }
-
-    /**
-     * Returns a copy of this instruction.
-     *
-     * @param labels
-     *            a map from LabelNodes to cloned LabelNodes.
-     * @return a copy of this instruction. The returned instruction does not
-     *         belong to any {@link InsnList}.
-     */
-    public abstract AbstractInsnNode clone(
-            final Map<LabelNode, LabelNode> labels);
-
-    /**
-     * Returns the clone of the given label.
-     *
-     * @param label
-     *            a label.
-     * @param map
-     *            a map from LabelNodes to cloned LabelNodes.
-     * @return the clone of the given label.
-     */
-    static LabelNode clone(final LabelNode label,
-            final Map<LabelNode, LabelNode> map) {
-        return map.get(label);
-    }
-
-    /**
-     * Returns the clones of the given labels.
-     *
-     * @param labels
-     *            a list of labels.
-     * @param map
-     *            a map from LabelNodes to cloned LabelNodes.
-     * @return the clones of the given labels.
-     */
-    static LabelNode[] clone(final List<LabelNode> labels,
-            final Map<LabelNode, LabelNode> map) {
-        LabelNode[] clones = new LabelNode[labels.size()];
-        for (int i = 0; i < clones.length; ++i) {
-            clones[i] = map.get(labels.get(i));
-        }
-        return clones;
-    }
-
-    /**
-     * Clones the annotations of the given instruction into this instruction.
-     *
-     * @param insn
-     *            the source instruction.
-     * @return this instruction.
-     */
-    protected final AbstractInsnNode cloneAnnotations(
-            final AbstractInsnNode insn) {
-        if (insn.visibleTypeAnnotations != null) {
-            this.visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>();
-            for (int i = 0; i < insn.visibleTypeAnnotations.size(); ++i) {
-                TypeAnnotationNode src = insn.visibleTypeAnnotations.get(i);
-                TypeAnnotationNode ann = new TypeAnnotationNode(src.typeRef,
-                        src.typePath, src.desc);
-                src.accept(ann);
-                this.visibleTypeAnnotations.add(ann);
-            }
-        }
-        if (insn.invisibleTypeAnnotations != null) {
-            this.invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>();
-            for (int i = 0; i < insn.invisibleTypeAnnotations.size(); ++i) {
-                TypeAnnotationNode src = insn.invisibleTypeAnnotations.get(i);
-                TypeAnnotationNode ann = new TypeAnnotationNode(src.typeRef,
-                        src.typePath, src.desc);
-                src.accept(ann);
-                this.invisibleTypeAnnotations.add(ann);
-            }
-        }
-        return this;
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/AnnotationNode.java b/src/asm/scala/tools/asm/tree/AnnotationNode.java
deleted file mode 100644
index b8d5988..0000000
--- a/src/asm/scala/tools/asm/tree/AnnotationNode.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents an annotationn.
- *
- * @author Eric Bruneton
- */
-public class AnnotationNode extends AnnotationVisitor {
-
-    /**
-     * The class descriptor of the annotation class.
-     */
-    public String desc;
-
-    /**
-     * The name value pairs of this annotation. Each name value pair is stored
-     * as two consecutive elements in the list. The name is a {@link String},
-     * and the value may be a {@link Byte}, {@link Boolean}, {@link Character},
-     * {@link Short}, {@link Integer}, {@link Long}, {@link Float},
-     * {@link Double}, {@link String} or {@link scala.tools.asm.Type}, or an
-     * two elements String array (for enumeration values), a
-     * {@link AnnotationNode}, or a {@link List} of values of one of the
-     * preceding types. The list may be <tt>null</tt> if there is no name value
-     * pair.
-     */
-    public List<Object> values;
-
-    /**
-     * Constructs a new {@link AnnotationNode}. <i>Subclasses must not use this
-     * constructor</i>. Instead, they must use the
-     * {@link #AnnotationNode(int, String)} version.
-     *
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public AnnotationNode(final String desc) {
-        this(Opcodes.ASM5, desc);
-        if (getClass() != AnnotationNode.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs a new {@link AnnotationNode}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     */
-    public AnnotationNode(final int api, final String desc) {
-        super(api);
-        this.desc = desc;
-    }
-
-    /**
-     * Constructs a new {@link AnnotationNode} to visit an array value.
-     *
-     * @param values
-     *            where the visited values must be stored.
-     */
-    AnnotationNode(final List<Object> values) {
-        super(Opcodes.ASM5);
-        this.values = values;
-    }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the AnnotationVisitor abstract class
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visit(final String name, final Object value) {
-        if (values == null) {
-            values = new ArrayList<Object>(this.desc != null ? 2 : 1);
-        }
-        if (this.desc != null) {
-            values.add(name);
-        }
-        values.add(value);
-    }
-
-    @Override
-    public void visitEnum(final String name, final String desc,
-            final String value) {
-        if (values == null) {
-            values = new ArrayList<Object>(this.desc != null ? 2 : 1);
-        }
-        if (this.desc != null) {
-            values.add(name);
-        }
-        values.add(new String[] { desc, value });
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String name,
-            final String desc) {
-        if (values == null) {
-            values = new ArrayList<Object>(this.desc != null ? 2 : 1);
-        }
-        if (this.desc != null) {
-            values.add(name);
-        }
-        AnnotationNode annotation = new AnnotationNode(desc);
-        values.add(annotation);
-        return annotation;
-    }
-
-    @Override
-    public AnnotationVisitor visitArray(final String name) {
-        if (values == null) {
-            values = new ArrayList<Object>(this.desc != null ? 2 : 1);
-        }
-        if (this.desc != null) {
-            values.add(name);
-        }
-        List<Object> array = new ArrayList<Object>();
-        values.add(array);
-        return new AnnotationNode(array);
-    }
-
-    @Override
-    public void visitEnd() {
-    }
-
-    // ------------------------------------------------------------------------
-    // Accept methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Checks that this annotation node is compatible with the given ASM API
-     * version. This methods checks that this node, and all its nodes
-     * recursively, do not contain elements that were introduced in more recent
-     * versions of the ASM API than the given version.
-     *
-     * @param api
-     *            an ASM API version. Must be one of {@link Opcodes#ASM4} or
-     *            {@link Opcodes#ASM5}.
-     */
-    public void check(final int api) {
-        // nothing to do
-    }
-
-    /**
-     * Makes the given visitor visit this annotation.
-     *
-     * @param av
-     *            an annotation visitor. Maybe <tt>null</tt>.
-     */
-    public void accept(final AnnotationVisitor av) {
-        if (av != null) {
-            if (values != null) {
-                for (int i = 0; i < values.size(); i += 2) {
-                    String name = (String) values.get(i);
-                    Object value = values.get(i + 1);
-                    accept(av, name, value);
-                }
-            }
-            av.visitEnd();
-        }
-    }
-
-    /**
-     * Makes the given visitor visit a given annotation value.
-     *
-     * @param av
-     *            an annotation visitor. Maybe <tt>null</tt>.
-     * @param name
-     *            the value name.
-     * @param value
-     *            the actual value.
-     */
-    static void accept(final AnnotationVisitor av, final String name,
-            final Object value) {
-        if (av != null) {
-            if (value instanceof String[]) {
-                String[] typeconst = (String[]) value;
-                av.visitEnum(name, typeconst[0], typeconst[1]);
-            } else if (value instanceof AnnotationNode) {
-                AnnotationNode an = (AnnotationNode) value;
-                an.accept(av.visitAnnotation(name, an.desc));
-            } else if (value instanceof List) {
-                AnnotationVisitor v = av.visitArray(name);
-                List<?> array = (List<?>) value;
-                for (int j = 0; j < array.size(); ++j) {
-                    accept(v, null, array.get(j));
-                }
-                v.visitEnd();
-            } else {
-                av.visit(name, value);
-            }
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/ClassNode.java b/src/asm/scala/tools/asm/tree/ClassNode.java
deleted file mode 100644
index 304b4ec..0000000
--- a/src/asm/scala/tools/asm/tree/ClassNode.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassVisitor;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * A node that represents a class.
- *
- * @author Eric Bruneton
- */
-public class ClassNode extends ClassVisitor {
-
-    /**
-     * The class version.
-     */
-    public int version;
-
-    /**
-     * The class's access flags (see {@link scala.tools.asm.Opcodes}). This
-     * field also indicates if the class is deprecated.
-     */
-    public int access;
-
-    /**
-     * The internal name of the class (see
-     * {@link scala.tools.asm.Type#getInternalName() getInternalName}).
-     */
-    public String name;
-
-    /**
-     * The signature of the class. May be <tt>null</tt>.
-     */
-    public String signature;
-
-    /**
-     * The internal of name of the super class (see
-     * {@link scala.tools.asm.Type#getInternalName() getInternalName}). For
-     * interfaces, the super class is {@link Object}. May be <tt>null</tt>, but
-     * only for the {@link Object} class.
-     */
-    public String superName;
-
-    /**
-     * The internal names of the class's interfaces (see
-     * {@link scala.tools.asm.Type#getInternalName() getInternalName}). This
-     * list is a list of {@link String} objects.
-     */
-    public List<String> interfaces;
-
-    /**
-     * The name of the source file from which this class was compiled. May be
-     * <tt>null</tt>.
-     */
-    public String sourceFile;
-
-    /**
-     * Debug information to compute the correspondence between source and
-     * compiled elements of the class. May be <tt>null</tt>.
-     */
-    public String sourceDebug;
-
-    /**
-     * The internal name of the enclosing class of the class. May be
-     * <tt>null</tt>.
-     */
-    public String outerClass;
-
-    /**
-     * The name of the method that contains the class, or <tt>null</tt> if the
-     * class is not enclosed in a method.
-     */
-    public String outerMethod;
-
-    /**
-     * The descriptor of the method that contains the class, or <tt>null</tt> if
-     * the class is not enclosed in a method.
-     */
-    public String outerMethodDesc;
-
-    /**
-     * The runtime visible annotations of this class. This list is a list of
-     * {@link AnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.AnnotationNode
-     * @label visible
-     */
-    public List<AnnotationNode> visibleAnnotations;
-
-    /**
-     * The runtime invisible annotations of this class. This list is a list of
-     * {@link AnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.AnnotationNode
-     * @label invisible
-     */
-    public List<AnnotationNode> invisibleAnnotations;
-
-    /**
-     * The runtime visible type annotations of this class. This list is a list
-     * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.TypeAnnotationNode
-     * @label visible
-     */
-    public List<TypeAnnotationNode> visibleTypeAnnotations;
-
-    /**
-     * The runtime invisible type annotations of this class. This list is a list
-     * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.TypeAnnotationNode
-     * @label invisible
-     */
-    public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
-    /**
-     * The non standard attributes of this class. This list is a list of
-     * {@link Attribute} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.Attribute
-     */
-    public List<Attribute> attrs;
-
-    /**
-     * Informations about the inner classes of this class. This list is a list
-     * of {@link InnerClassNode} objects.
-     *
-     * @associates scala.tools.asm.tree.InnerClassNode
-     */
-    public List<InnerClassNode> innerClasses;
-
-    /**
-     * The fields of this class. This list is a list of {@link FieldNode}
-     * objects.
-     *
-     * @associates scala.tools.asm.tree.FieldNode
-     */
-    public List<FieldNode> fields;
-
-    /**
-     * The methods of this class. This list is a list of {@link MethodNode}
-     * objects.
-     *
-     * @associates scala.tools.asm.tree.MethodNode
-     */
-    public List<MethodNode> methods;
-
-    /**
-     * Constructs a new {@link ClassNode}. <i>Subclasses must not use this
-     * constructor</i>. Instead, they must use the {@link #ClassNode(int)}
-     * version.
-     *
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public ClassNode() {
-        this(Opcodes.ASM5);
-        if (getClass() != ClassNode.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs a new {@link ClassNode}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    public ClassNode(final int api) {
-        super(api);
-        this.interfaces = new ArrayList<String>();
-        this.innerClasses = new ArrayList<InnerClassNode>();
-        this.fields = new ArrayList<FieldNode>();
-        this.methods = new ArrayList<MethodNode>();
-    }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the ClassVisitor abstract class
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visit(final int version, final int access, final String name,
-            final String signature, final String superName,
-            final String[] interfaces) {
-        this.version = version;
-        this.access = access;
-        this.name = name;
-        this.signature = signature;
-        this.superName = superName;
-        if (interfaces != null) {
-            this.interfaces.addAll(Arrays.asList(interfaces));
-        }
-    }
-
-    @Override
-    public void visitSource(final String file, final String debug) {
-        sourceFile = file;
-        sourceDebug = debug;
-    }
-
-    @Override
-    public void visitOuterClass(final String owner, final String name,
-            final String desc) {
-        outerClass = owner;
-        outerMethod = name;
-        outerMethodDesc = desc;
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        AnnotationNode an = new AnnotationNode(desc);
-        if (visible) {
-            if (visibleAnnotations == null) {
-                visibleAnnotations = new ArrayList<AnnotationNode>(1);
-            }
-            visibleAnnotations.add(an);
-        } else {
-            if (invisibleAnnotations == null) {
-                invisibleAnnotations = new ArrayList<AnnotationNode>(1);
-            }
-            invisibleAnnotations.add(an);
-        }
-        return an;
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
-        if (visible) {
-            if (visibleTypeAnnotations == null) {
-                visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
-            }
-            visibleTypeAnnotations.add(an);
-        } else {
-            if (invisibleTypeAnnotations == null) {
-                invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
-            }
-            invisibleTypeAnnotations.add(an);
-        }
-        return an;
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        if (attrs == null) {
-            attrs = new ArrayList<Attribute>(1);
-        }
-        attrs.add(attr);
-    }
-
-    @Override
-    public void visitInnerClass(final String name, final String outerName,
-            final String innerName, final int access) {
-        InnerClassNode icn = new InnerClassNode(name, outerName, innerName,
-                access);
-        innerClasses.add(icn);
-    }
-
-    @Override
-    public FieldVisitor visitField(final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        FieldNode fn = new FieldNode(access, name, desc, signature, value);
-        fields.add(fn);
-        return fn;
-    }
-
-    @Override
-    public MethodVisitor visitMethod(final int access, final String name,
-            final String desc, final String signature, final String[] exceptions) {
-        MethodNode mn = new MethodNode(access, name, desc, signature,
-                exceptions);
-        methods.add(mn);
-        return mn;
-    }
-
-    @Override
-    public void visitEnd() {
-    }
-
-    // ------------------------------------------------------------------------
-    // Accept method
-    // ------------------------------------------------------------------------
-
-    /**
-     * Checks that this class node is compatible with the given ASM API version.
-     * This methods checks that this node, and all its nodes recursively, do not
-     * contain elements that were introduced in more recent versions of the ASM
-     * API than the given version.
-     *
-     * @param api
-     *            an ASM API version. Must be one of {@link Opcodes#ASM4} or
-     *            {@link Opcodes#ASM5}.
-     */
-    public void check(final int api) {
-        if (api == Opcodes.ASM4) {
-            if (visibleTypeAnnotations != null
-                    && visibleTypeAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-            if (invisibleTypeAnnotations != null
-                    && invisibleTypeAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-            for (FieldNode f : fields) {
-                f.check(api);
-            }
-            for (MethodNode m : methods) {
-                m.check(api);
-            }
-        }
-    }
-
-    /**
-     * Makes the given class visitor visit this class.
-     *
-     * @param cv
-     *            a class visitor.
-     */
-    public void accept(final ClassVisitor cv) {
-        // visits header
-        String[] interfaces = new String[this.interfaces.size()];
-        this.interfaces.toArray(interfaces);
-        cv.visit(version, access, name, signature, superName, interfaces);
-        // visits source
-        if (sourceFile != null || sourceDebug != null) {
-            cv.visitSource(sourceFile, sourceDebug);
-        }
-        // visits outer class
-        if (outerClass != null) {
-            cv.visitOuterClass(outerClass, outerMethod, outerMethodDesc);
-        }
-        // visits attributes
-        int i, n;
-        n = visibleAnnotations == null ? 0 : visibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            AnnotationNode an = visibleAnnotations.get(i);
-            an.accept(cv.visitAnnotation(an.desc, true));
-        }
-        n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            AnnotationNode an = invisibleAnnotations.get(i);
-            an.accept(cv.visitAnnotation(an.desc, false));
-        }
-        n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            TypeAnnotationNode an = visibleTypeAnnotations.get(i);
-            an.accept(cv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
-                    true));
-        }
-        n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
-                .size();
-        for (i = 0; i < n; ++i) {
-            TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
-            an.accept(cv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
-                    false));
-        }
-        n = attrs == null ? 0 : attrs.size();
-        for (i = 0; i < n; ++i) {
-            cv.visitAttribute(attrs.get(i));
-        }
-        // visits inner classes
-        for (i = 0; i < innerClasses.size(); ++i) {
-            innerClasses.get(i).accept(cv);
-        }
-        // visits fields
-        for (i = 0; i < fields.size(); ++i) {
-            fields.get(i).accept(cv);
-        }
-        // visits methods
-        for (i = 0; i < methods.size(); ++i) {
-            methods.get(i).accept(cv);
-        }
-        // visits end
-        cv.visitEnd();
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/FieldInsnNode.java b/src/asm/scala/tools/asm/tree/FieldInsnNode.java
deleted file mode 100644
index c027de1..0000000
--- a/src/asm/scala/tools/asm/tree/FieldInsnNode.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a field instruction. A field instruction is an
- * instruction that loads or stores the value of a field of an object.
- *
- * @author Eric Bruneton
- */
-public class FieldInsnNode extends AbstractInsnNode {
-
-    /**
-     * The internal name of the field's owner class (see
-     * {@link scala.tools.asm.Type#getInternalName() getInternalName}).
-     */
-    public String owner;
-
-    /**
-     * The field's name.
-     */
-    public String name;
-
-    /**
-     * The field's descriptor (see {@link scala.tools.asm.Type}).
-     */
-    public String desc;
-
-    /**
-     * Constructs a new {@link FieldInsnNode}.
-     *
-     * @param opcode
-     *            the opcode of the type instruction to be constructed. This
-     *            opcode must be GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
-     * @param owner
-     *            the internal name of the field's owner class (see
-     *            {@link scala.tools.asm.Type#getInternalName()
-     *            getInternalName}).
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor (see {@link scala.tools.asm.Type}).
-     */
-    public FieldInsnNode(final int opcode, final String owner,
-            final String name, final String desc) {
-        super(opcode);
-        this.owner = owner;
-        this.name = name;
-        this.desc = desc;
-    }
-
-    /**
-     * Sets the opcode of this instruction.
-     *
-     * @param opcode
-     *            the new instruction opcode. This opcode must be GETSTATIC,
-     *            PUTSTATIC, GETFIELD or PUTFIELD.
-     */
-    public void setOpcode(final int opcode) {
-        this.opcode = opcode;
-    }
-
-    @Override
-    public int getType() {
-        return FIELD_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitFieldInsn(opcode, owner, name, desc);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new FieldInsnNode(opcode, owner, name, desc)
-                .cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/FieldNode.java b/src/asm/scala/tools/asm/tree/FieldNode.java
deleted file mode 100644
index 3fb14da..0000000
--- a/src/asm/scala/tools/asm/tree/FieldNode.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassVisitor;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * A node that represents a field.
- *
- * @author Eric Bruneton
- */
-public class FieldNode extends FieldVisitor {
-
-    /**
-     * The field's access flags (see {@link scala.tools.asm.Opcodes}). This
-     * field also indicates if the field is synthetic and/or deprecated.
-     */
-    public int access;
-
-    /**
-     * The field's name.
-     */
-    public String name;
-
-    /**
-     * The field's descriptor (see {@link scala.tools.asm.Type}).
-     */
-    public String desc;
-
-    /**
-     * The field's signature. May be <tt>null</tt>.
-     */
-    public String signature;
-
-    /**
-     * The field's initial value. This field, which may be <tt>null</tt> if the
-     * field does not have an initial value, must be an {@link Integer}, a
-     * {@link Float}, a {@link Long}, a {@link Double} or a {@link String}.
-     */
-    public Object value;
-
-    /**
-     * The runtime visible annotations of this field. This list is a list of
-     * {@link AnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.AnnotationNode
-     * @label visible
-     */
-    public List<AnnotationNode> visibleAnnotations;
-
-    /**
-     * The runtime invisible annotations of this field. This list is a list of
-     * {@link AnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.AnnotationNode
-     * @label invisible
-     */
-    public List<AnnotationNode> invisibleAnnotations;
-
-    /**
-     * The runtime visible type annotations of this field. This list is a list
-     * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.TypeAnnotationNode
-     * @label visible
-     */
-    public List<TypeAnnotationNode> visibleTypeAnnotations;
-
-    /**
-     * The runtime invisible type annotations of this field. This list is a list
-     * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.TypeAnnotationNode
-     * @label invisible
-     */
-    public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
-    /**
-     * The non standard attributes of this field. This list is a list of
-     * {@link Attribute} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.Attribute
-     */
-    public List<Attribute> attrs;
-
-    /**
-     * Constructs a new {@link FieldNode}. <i>Subclasses must not use this
-     * constructor</i>. Instead, they must use the
-     * {@link #FieldNode(int, int, String, String, String, Object)} version.
-     *
-     * @param access
-     *            the field's access flags (see
-     *            {@link scala.tools.asm.Opcodes}). This parameter also
-     *            indicates if the field is synthetic and/or deprecated.
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor (see {@link scala.tools.asm.Type
-     *            Type}).
-     * @param signature
-     *            the field's signature.
-     * @param value
-     *            the field's initial value. This parameter, which may be
-     *            <tt>null</tt> if the field does not have an initial value,
-     *            must be an {@link Integer}, a {@link Float}, a {@link Long}, a
-     *            {@link Double} or a {@link String}.
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public FieldNode(final int access, final String name, final String desc,
-            final String signature, final Object value) {
-        this(Opcodes.ASM5, access, name, desc, signature, value);
-        if (getClass() != FieldNode.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs a new {@link FieldNode}. <i>Subclasses must not use this
-     * constructor</i>.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param access
-     *            the field's access flags (see
-     *            {@link scala.tools.asm.Opcodes}). This parameter also
-     *            indicates if the field is synthetic and/or deprecated.
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor (see {@link scala.tools.asm.Type
-     *            Type}).
-     * @param signature
-     *            the field's signature.
-     * @param value
-     *            the field's initial value. This parameter, which may be
-     *            <tt>null</tt> if the field does not have an initial value,
-     *            must be an {@link Integer}, a {@link Float}, a {@link Long}, a
-     *            {@link Double} or a {@link String}.
-     */
-    public FieldNode(final int api, final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        super(api);
-        this.access = access;
-        this.name = name;
-        this.desc = desc;
-        this.signature = signature;
-        this.value = value;
-    }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the FieldVisitor abstract class
-    // ------------------------------------------------------------------------
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        AnnotationNode an = new AnnotationNode(desc);
-        if (visible) {
-            if (visibleAnnotations == null) {
-                visibleAnnotations = new ArrayList<AnnotationNode>(1);
-            }
-            visibleAnnotations.add(an);
-        } else {
-            if (invisibleAnnotations == null) {
-                invisibleAnnotations = new ArrayList<AnnotationNode>(1);
-            }
-            invisibleAnnotations.add(an);
-        }
-        return an;
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
-        if (visible) {
-            if (visibleTypeAnnotations == null) {
-                visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
-            }
-            visibleTypeAnnotations.add(an);
-        } else {
-            if (invisibleTypeAnnotations == null) {
-                invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
-            }
-            invisibleTypeAnnotations.add(an);
-        }
-        return an;
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        if (attrs == null) {
-            attrs = new ArrayList<Attribute>(1);
-        }
-        attrs.add(attr);
-    }
-
-    @Override
-    public void visitEnd() {
-    }
-
-    // ------------------------------------------------------------------------
-    // Accept methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Checks that this field node is compatible with the given ASM API version.
-     * This methods checks that this node, and all its nodes recursively, do not
-     * contain elements that were introduced in more recent versions of the ASM
-     * API than the given version.
-     *
-     * @param api
-     *            an ASM API version. Must be one of {@link Opcodes#ASM4} or
-     *            {@link Opcodes#ASM5}.
-     */
-    public void check(final int api) {
-        if (api == Opcodes.ASM4) {
-            if (visibleTypeAnnotations != null
-                    && visibleTypeAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-            if (invisibleTypeAnnotations != null
-                    && invisibleTypeAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-        }
-    }
-
-    /**
-     * Makes the given class visitor visit this field.
-     *
-     * @param cv
-     *            a class visitor.
-     */
-    public void accept(final ClassVisitor cv) {
-        FieldVisitor fv = cv.visitField(access, name, desc, signature, value);
-        if (fv == null) {
-            return;
-        }
-        int i, n;
-        n = visibleAnnotations == null ? 0 : visibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            AnnotationNode an = visibleAnnotations.get(i);
-            an.accept(fv.visitAnnotation(an.desc, true));
-        }
-        n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            AnnotationNode an = invisibleAnnotations.get(i);
-            an.accept(fv.visitAnnotation(an.desc, false));
-        }
-        n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            TypeAnnotationNode an = visibleTypeAnnotations.get(i);
-            an.accept(fv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
-                    true));
-        }
-        n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
-                .size();
-        for (i = 0; i < n; ++i) {
-            TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
-            an.accept(fv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
-                    false));
-        }
-        n = attrs == null ? 0 : attrs.size();
-        for (i = 0; i < n; ++i) {
-            fv.visitAttribute(attrs.get(i));
-        }
-        fv.visitEnd();
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/FrameNode.java b/src/asm/scala/tools/asm/tree/FrameNode.java
deleted file mode 100644
index f13fc66..0000000
--- a/src/asm/scala/tools/asm/tree/FrameNode.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents a stack map frame. These nodes are pseudo instruction
- * nodes in order to be inserted in an instruction list. In fact these nodes
- * must(*) be inserted <i>just before</i> any instruction node <b>i</b> that
- * follows an unconditionnal branch instruction such as GOTO or THROW, that is
- * the target of a jump instruction, or that starts an exception handler block.
- * The stack map frame types must describe the values of the local variables and
- * of the operand stack elements <i>just before</i> <b>i</b> is executed. <br>
- * <br>
- * (*) this is mandatory only for classes whose version is greater than or equal
- * to {@link Opcodes#V1_6 V1_6}.
- *
- * @author Eric Bruneton
- */
-public class FrameNode extends AbstractInsnNode {
-
-    /**
-     * The type of this frame. Must be {@link Opcodes#F_NEW} for expanded
-     * frames, or {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND},
-     * {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME} or
-     * {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for compressed frames.
-     */
-    public int type;
-
-    /**
-     * The types of the local variables of this stack map frame. Elements of
-     * this list can be Integer, String or LabelNode objects (for primitive,
-     * reference and uninitialized types respectively - see
-     * {@link MethodVisitor}).
-     */
-    public List<Object> local;
-
-    /**
-     * The types of the operand stack elements of this stack map frame. Elements
-     * of this list can be Integer, String or LabelNode objects (for primitive,
-     * reference and uninitialized types respectively - see
-     * {@link MethodVisitor}).
-     */
-    public List<Object> stack;
-
-    private FrameNode() {
-        super(-1);
-    }
-
-    /**
-     * Constructs a new {@link FrameNode}.
-     *
-     * @param type
-     *            the type of this frame. Must be {@link Opcodes#F_NEW} for
-     *            expanded frames, or {@link Opcodes#F_FULL},
-     *            {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP},
-     *            {@link Opcodes#F_SAME} or {@link Opcodes#F_APPEND},
-     *            {@link Opcodes#F_SAME1} for compressed frames.
-     * @param nLocal
-     *            number of local variables of this stack map frame.
-     * @param local
-     *            the types of the local variables of this stack map frame.
-     *            Elements of this list can be Integer, String or LabelNode
-     *            objects (for primitive, reference and uninitialized types
-     *            respectively - see {@link MethodVisitor}).
-     * @param nStack
-     *            number of operand stack elements of this stack map frame.
-     * @param stack
-     *            the types of the operand stack elements of this stack map
-     *            frame. Elements of this list can be Integer, String or
-     *            LabelNode objects (for primitive, reference and uninitialized
-     *            types respectively - see {@link MethodVisitor}).
-     */
-    public FrameNode(final int type, final int nLocal, final Object[] local,
-            final int nStack, final Object[] stack) {
-        super(-1);
-        this.type = type;
-        switch (type) {
-        case Opcodes.F_NEW:
-        case Opcodes.F_FULL:
-            this.local = asList(nLocal, local);
-            this.stack = asList(nStack, stack);
-            break;
-        case Opcodes.F_APPEND:
-            this.local = asList(nLocal, local);
-            break;
-        case Opcodes.F_CHOP:
-            this.local = Arrays.asList(new Object[nLocal]);
-            break;
-        case Opcodes.F_SAME:
-            break;
-        case Opcodes.F_SAME1:
-            this.stack = asList(1, stack);
-            break;
-        }
-    }
-
-    @Override
-    public int getType() {
-        return FRAME;
-    }
-
-    /**
-     * Makes the given visitor visit this stack map frame.
-     *
-     * @param mv
-     *            a method visitor.
-     */
-    @Override
-    public void accept(final MethodVisitor mv) {
-        switch (type) {
-        case Opcodes.F_NEW:
-        case Opcodes.F_FULL:
-            mv.visitFrame(type, local.size(), asArray(local), stack.size(),
-                    asArray(stack));
-            break;
-        case Opcodes.F_APPEND:
-            mv.visitFrame(type, local.size(), asArray(local), 0, null);
-            break;
-        case Opcodes.F_CHOP:
-            mv.visitFrame(type, local.size(), null, 0, null);
-            break;
-        case Opcodes.F_SAME:
-            mv.visitFrame(type, 0, null, 0, null);
-            break;
-        case Opcodes.F_SAME1:
-            mv.visitFrame(type, 0, null, 1, asArray(stack));
-            break;
-        }
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        FrameNode clone = new FrameNode();
-        clone.type = type;
-        if (local != null) {
-            clone.local = new ArrayList<Object>();
-            for (int i = 0; i < local.size(); ++i) {
-                Object l = local.get(i);
-                if (l instanceof LabelNode) {
-                    l = labels.get(l);
-                }
-                clone.local.add(l);
-            }
-        }
-        if (stack != null) {
-            clone.stack = new ArrayList<Object>();
-            for (int i = 0; i < stack.size(); ++i) {
-                Object s = stack.get(i);
-                if (s instanceof LabelNode) {
-                    s = labels.get(s);
-                }
-                clone.stack.add(s);
-            }
-        }
-        return clone;
-    }
-
-    // ------------------------------------------------------------------------
-
-    private static List<Object> asList(final int n, final Object[] o) {
-        return Arrays.asList(o).subList(0, n);
-    }
-
-    private static Object[] asArray(final List<Object> l) {
-        Object[] objs = new Object[l.size()];
-        for (int i = 0; i < objs.length; ++i) {
-            Object o = l.get(i);
-            if (o instanceof LabelNode) {
-                o = ((LabelNode) o).getLabel();
-            }
-            objs[i] = o;
-        }
-        return objs;
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/IincInsnNode.java b/src/asm/scala/tools/asm/tree/IincInsnNode.java
deleted file mode 100644
index c37ac91..0000000
--- a/src/asm/scala/tools/asm/tree/IincInsnNode.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents an IINC instruction.
- *
- * @author Eric Bruneton
- */
-public class IincInsnNode extends AbstractInsnNode {
-
-    /**
-     * Index of the local variable to be incremented.
-     */
-    public int var;
-
-    /**
-     * Amount to increment the local variable by.
-     */
-    public int incr;
-
-    /**
-     * Constructs a new {@link IincInsnNode}.
-     *
-     * @param var
-     *            index of the local variable to be incremented.
-     * @param incr
-     *            increment amount to increment the local variable by.
-     */
-    public IincInsnNode(final int var, final int incr) {
-        super(Opcodes.IINC);
-        this.var = var;
-        this.incr = incr;
-    }
-
-    @Override
-    public int getType() {
-        return IINC_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitIincInsn(var, incr);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new IincInsnNode(var, incr).cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/InnerClassNode.java b/src/asm/scala/tools/asm/tree/InnerClassNode.java
deleted file mode 100644
index aa3810c..0000000
--- a/src/asm/scala/tools/asm/tree/InnerClassNode.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import scala.tools.asm.ClassVisitor;
-
-/**
- * A node that represents an inner class.
- *
- * @author Eric Bruneton
- */
-public class InnerClassNode {
-
-    /**
-     * The internal name of an inner class (see
-     * {@link scala.tools.asm.Type#getInternalName() getInternalName}).
-     */
-    public String name;
-
-    /**
-     * The internal name of the class to which the inner class belongs (see
-     * {@link scala.tools.asm.Type#getInternalName() getInternalName}). May be
-     * <tt>null</tt>.
-     */
-    public String outerName;
-
-    /**
-     * The (simple) name of the inner class inside its enclosing class. May be
-     * <tt>null</tt> for anonymous inner classes.
-     */
-    public String innerName;
-
-    /**
-     * The access flags of the inner class as originally declared in the
-     * enclosing class.
-     */
-    public int access;
-
-    /**
-     * Constructs a new {@link InnerClassNode}.
-     *
-     * @param name
-     *            the internal name of an inner class (see
-     *            {@link scala.tools.asm.Type#getInternalName()
-     *            getInternalName}).
-     * @param outerName
-     *            the internal name of the class to which the inner class
-     *            belongs (see {@link scala.tools.asm.Type#getInternalName()
-     *            getInternalName}). May be <tt>null</tt>.
-     * @param innerName
-     *            the (simple) name of the inner class inside its enclosing
-     *            class. May be <tt>null</tt> for anonymous inner classes.
-     * @param access
-     *            the access flags of the inner class as originally declared in
-     *            the enclosing class.
-     */
-    public InnerClassNode(final String name, final String outerName,
-            final String innerName, final int access) {
-        this.name = name;
-        this.outerName = outerName;
-        this.innerName = innerName;
-        this.access = access;
-    }
-
-    /**
-     * Makes the given class visitor visit this inner class.
-     *
-     * @param cv
-     *            a class visitor.
-     */
-    public void accept(final ClassVisitor cv) {
-        cv.visitInnerClass(name, outerName, innerName, access);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/InsnList.java b/src/asm/scala/tools/asm/tree/InsnList.java
deleted file mode 100644
index e808712..0000000
--- a/src/asm/scala/tools/asm/tree/InsnList.java
+++ /dev/null
@@ -1,622 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ListIterator;
-import java.util.NoSuchElementException;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A doubly linked list of {@link AbstractInsnNode} objects. <i>This
- * implementation is not thread safe</i>.
- */
-public class InsnList {
-
-    /**
-     * The number of instructions in this list.
-     */
-    private int size;
-
-    /**
-     * The first instruction in this list. May be <tt>null</tt>.
-     */
-    private AbstractInsnNode first;
-
-    /**
-     * The last instruction in this list. May be <tt>null</tt>.
-     */
-    private AbstractInsnNode last;
-
-    /**
-     * A cache of the instructions of this list. This cache is used to improve
-     * the performance of the {@link #get} method.
-     */
-    AbstractInsnNode[] cache;
-
-    /**
-     * Returns the number of instructions in this list.
-     *
-     * @return the number of instructions in this list.
-     */
-    public int size() {
-        return size;
-    }
-
-    /**
-     * Returns the first instruction in this list.
-     *
-     * @return the first instruction in this list, or <tt>null</tt> if the list
-     *         is empty.
-     */
-    public AbstractInsnNode getFirst() {
-        return first;
-    }
-
-    /**
-     * Returns the last instruction in this list.
-     *
-     * @return the last instruction in this list, or <tt>null</tt> if the list
-     *         is empty.
-     */
-    public AbstractInsnNode getLast() {
-        return last;
-    }
-
-    /**
-     * Returns the instruction whose index is given. This method builds a cache
-     * of the instructions in this list to avoid scanning the whole list each
-     * time it is called. Once the cache is built, this method run in constant
-     * time. This cache is invalidated by all the methods that modify the list.
-     *
-     * @param index
-     *            the index of the instruction that must be returned.
-     * @return the instruction whose index is given.
-     * @throws IndexOutOfBoundsException
-     *             if (index < 0 || index >= size()).
-     */
-    public AbstractInsnNode get(final int index) {
-        if (index < 0 || index >= size) {
-            throw new IndexOutOfBoundsException();
-        }
-        if (cache == null) {
-            cache = toArray();
-        }
-        return cache[index];
-    }
-
-    /**
-     * Returns <tt>true</tt> if the given instruction belongs to this list. This
-     * method always scans the instructions of this list until it finds the
-     * given instruction or reaches the end of the list.
-     *
-     * @param insn
-     *            an instruction.
-     * @return <tt>true</tt> if the given instruction belongs to this list.
-     */
-    public boolean contains(final AbstractInsnNode insn) {
-        AbstractInsnNode i = first;
-        while (i != null && i != insn) {
-            i = i.next;
-        }
-        return i != null;
-    }
-
-    /**
-     * Returns the index of the given instruction in this list. This method
-     * builds a cache of the instruction indexes to avoid scanning the whole
-     * list each time it is called. Once the cache is built, this method run in
-     * constant time. The cache is invalidated by all the methods that modify
-     * the list.
-     *
-     * @param insn
-     *            an instruction <i>of this list</i>.
-     * @return the index of the given instruction in this list. <i>The result of
-     *         this method is undefined if the given instruction does not belong
-     *         to this list</i>. Use {@link #contains contains} to test if an
-     *         instruction belongs to an instruction list or not.
-     */
-    public int indexOf(final AbstractInsnNode insn) {
-        if (cache == null) {
-            cache = toArray();
-        }
-        return insn.index;
-    }
-
-    /**
-     * Makes the given visitor visit all of the instructions in this list.
-     *
-     * @param mv
-     *            the method visitor that must visit the instructions.
-     */
-    public void accept(final MethodVisitor mv) {
-        AbstractInsnNode insn = first;
-        while (insn != null) {
-            insn.accept(mv);
-            insn = insn.next;
-        }
-    }
-
-    /**
-     * Returns an iterator over the instructions in this list.
-     *
-     * @return an iterator over the instructions in this list.
-     */
-    public ListIterator<AbstractInsnNode> iterator() {
-        return iterator(0);
-    }
-
-    /**
-     * Returns an iterator over the instructions in this list.
-     *
-     * @return an iterator over the instructions in this list.
-     */
-    @SuppressWarnings("unchecked")
-    public ListIterator<AbstractInsnNode> iterator(int index) {
-        return new InsnListIterator(index);
-    }
-
-    /**
-     * Returns an array containing all of the instructions in this list.
-     *
-     * @return an array containing all of the instructions in this list.
-     */
-    public AbstractInsnNode[] toArray() {
-        int i = 0;
-        AbstractInsnNode elem = first;
-        AbstractInsnNode[] insns = new AbstractInsnNode[size];
-        while (elem != null) {
-            insns[i] = elem;
-            elem.index = i++;
-            elem = elem.next;
-        }
-        return insns;
-    }
-
-    /**
-     * Replaces an instruction of this list with another instruction.
-     *
-     * @param location
-     *            an instruction <i>of this list</i>.
-     * @param insn
-     *            another instruction, <i>which must not belong to any
-     *            {@link InsnList}</i>.
-     */
-    public void set(final AbstractInsnNode location, final AbstractInsnNode insn) {
-        AbstractInsnNode next = location.next;
-        insn.next = next;
-        if (next != null) {
-            next.prev = insn;
-        } else {
-            last = insn;
-        }
-        AbstractInsnNode prev = location.prev;
-        insn.prev = prev;
-        if (prev != null) {
-            prev.next = insn;
-        } else {
-            first = insn;
-        }
-        if (cache != null) {
-            int index = location.index;
-            cache[index] = insn;
-            insn.index = index;
-        } else {
-            insn.index = 0; // insn now belongs to an InsnList
-        }
-        location.index = -1; // i no longer belongs to an InsnList
-        location.prev = null;
-        location.next = null;
-    }
-
-    /**
-     * Adds the given instruction to the end of this list.
-     *
-     * @param insn
-     *            an instruction, <i>which must not belong to any
-     *            {@link InsnList}</i>.
-     */
-    public void add(final AbstractInsnNode insn) {
-        if(insn.prev != null || insn.next != null) {
-            // Adding an instruction that still refers to others (in the same or another InsnList) leads to hard to debug bugs.
-            // Initially everything may look ok (e.g. iteration follows `next` thus a stale `prev` isn't noticed).
-            // However, a stale link brings the doubly-linked into disarray e.g. upon removing an element,
-            // which results in the `next` of a stale `prev` being updated, among other failure scenarios.
-            // Better fail early.
-            throw new RuntimeException("Instruction " + insn + " already belongs to some InsnList.");
-        }
-        ++size;
-        if (last == null) {
-            first = insn;
-            last = insn;
-        } else {
-            last.next = insn;
-            insn.prev = last;
-        }
-        last = insn;
-        cache = null;
-        insn.index = 0; // insn now belongs to an InsnList
-    }
-
-    /**
-     * Adds the given instructions to the end of this list.
-     *
-     * @param insns
-     *            an instruction list, which is cleared during the process. This
-     *            list must be different from 'this'.
-     */
-    public void add(final InsnList insns) {
-        if (insns.size == 0) {
-            return;
-        }
-        size += insns.size;
-        if (last == null) {
-            first = insns.first;
-            last = insns.last;
-        } else {
-            AbstractInsnNode elem = insns.first;
-            last.next = elem;
-            elem.prev = last;
-            last = insns.last;
-        }
-        cache = null;
-        insns.removeAll(false);
-    }
-
-    /**
-     * Inserts the given instruction at the begining of this list.
-     *
-     * @param insn
-     *            an instruction, <i>which must not belong to any
-     *            {@link InsnList}</i>.
-     */
-    public void insert(final AbstractInsnNode insn) {
-        ++size;
-        if (first == null) {
-            first = insn;
-            last = insn;
-        } else {
-            first.prev = insn;
-            insn.next = first;
-        }
-        first = insn;
-        cache = null;
-        insn.index = 0; // insn now belongs to an InsnList
-    }
-
-    /**
-     * Inserts the given instructions at the begining of this list.
-     *
-     * @param insns
-     *            an instruction list, which is cleared during the process. This
-     *            list must be different from 'this'.
-     */
-    public void insert(final InsnList insns) {
-        if (insns.size == 0) {
-            return;
-        }
-        size += insns.size;
-        if (first == null) {
-            first = insns.first;
-            last = insns.last;
-        } else {
-            AbstractInsnNode elem = insns.last;
-            first.prev = elem;
-            elem.next = first;
-            first = insns.first;
-        }
-        cache = null;
-        insns.removeAll(false);
-    }
-
-    /**
-     * Inserts the given instruction after the specified instruction.
-     *
-     * @param location
-     *            an instruction <i>of this list</i> after which insn must be
-     *            inserted.
-     * @param insn
-     *            the instruction to be inserted, <i>which must not belong to
-     *            any {@link InsnList}</i>.
-     */
-    public void insert(final AbstractInsnNode location,
-            final AbstractInsnNode insn) {
-        ++size;
-        AbstractInsnNode next = location.next;
-        if (next == null) {
-            last = insn;
-        } else {
-            next.prev = insn;
-        }
-        location.next = insn;
-        insn.next = next;
-        insn.prev = location;
-        cache = null;
-        insn.index = 0; // insn now belongs to an InsnList
-    }
-
-    /**
-     * Inserts the given instructions after the specified instruction.
-     *
-     * @param location
-     *            an instruction <i>of this list</i> after which the
-     *            instructions must be inserted.
-     * @param insns
-     *            the instruction list to be inserted, which is cleared during
-     *            the process. This list must be different from 'this'.
-     */
-    public void insert(final AbstractInsnNode location, final InsnList insns) {
-        if (insns.size == 0) {
-            return;
-        }
-        size += insns.size;
-        AbstractInsnNode ifirst = insns.first;
-        AbstractInsnNode ilast = insns.last;
-        AbstractInsnNode next = location.next;
-        if (next == null) {
-            last = ilast;
-        } else {
-            next.prev = ilast;
-        }
-        location.next = ifirst;
-        ilast.next = next;
-        ifirst.prev = location;
-        cache = null;
-        insns.removeAll(false);
-    }
-
-    /**
-     * Inserts the given instruction before the specified instruction.
-     *
-     * @param location
-     *            an instruction <i>of this list</i> before which insn must be
-     *            inserted.
-     * @param insn
-     *            the instruction to be inserted, <i>which must not belong to
-     *            any {@link InsnList}</i>.
-     */
-    public void insertBefore(final AbstractInsnNode location,
-            final AbstractInsnNode insn) {
-        ++size;
-        AbstractInsnNode prev = location.prev;
-        if (prev == null) {
-            first = insn;
-        } else {
-            prev.next = insn;
-        }
-        location.prev = insn;
-        insn.next = location;
-        insn.prev = prev;
-        cache = null;
-        insn.index = 0; // insn now belongs to an InsnList
-    }
-
-    /**
-     * Inserts the given instructions before the specified instruction.
-     *
-     * @param location
-     *            an instruction <i>of this list</i> before which the
-     *            instructions must be inserted.
-     * @param insns
-     *            the instruction list to be inserted, which is cleared during
-     *            the process. This list must be different from 'this'.
-     */
-    public void insertBefore(final AbstractInsnNode location,
-            final InsnList insns) {
-        if (insns.size == 0) {
-            return;
-        }
-        size += insns.size;
-        AbstractInsnNode ifirst = insns.first;
-        AbstractInsnNode ilast = insns.last;
-        AbstractInsnNode prev = location.prev;
-        if (prev == null) {
-            first = ifirst;
-        } else {
-            prev.next = ifirst;
-        }
-        location.prev = ilast;
-        ilast.next = location;
-        ifirst.prev = prev;
-        cache = null;
-        insns.removeAll(false);
-    }
-
-    /**
-     * Removes the given instruction from this list.
-     *
-     * @param insn
-     *            the instruction <i>of this list</i> that must be removed.
-     */
-    public void remove(final AbstractInsnNode insn) {
-        --size;
-        AbstractInsnNode next = insn.next;
-        AbstractInsnNode prev = insn.prev;
-        if (next == null) {
-            if (prev == null) {
-                first = null;
-                last = null;
-            } else {
-                prev.next = null;
-                last = prev;
-            }
-        } else {
-            if (prev == null) {
-                first = next;
-                next.prev = null;
-            } else {
-                prev.next = next;
-                next.prev = prev;
-            }
-        }
-        cache = null;
-        insn.index = -1; // insn no longer belongs to an InsnList
-        insn.prev = null;
-        insn.next = null;
-    }
-
-    /**
-     * Removes all of the instructions of this list.
-     *
-     * @param mark
-     *            if the instructions must be marked as no longer belonging to
-     *            any {@link InsnList}.
-     */
-    void removeAll(final boolean mark) {
-        if (mark) {
-            AbstractInsnNode insn = first;
-            while (insn != null) {
-                AbstractInsnNode next = insn.next;
-                insn.index = -1; // insn no longer belongs to an InsnList
-                insn.prev = null;
-                insn.next = null;
-                insn = next;
-            }
-        }
-        size = 0;
-        first = null;
-        last = null;
-        cache = null;
-    }
-
-    /**
-     * Removes all of the instructions of this list.
-     */
-    public void clear() {
-        removeAll(false);
-    }
-
-    /**
-     * Reset all labels in the instruction list. This method should be called
-     * before reusing same instructions list between several
-     * <code>ClassWriter</code>s.
-     */
-    public void resetLabels() {
-        AbstractInsnNode insn = first;
-        while (insn != null) {
-            if (insn instanceof LabelNode) {
-                ((LabelNode) insn).resetLabel();
-            }
-            insn = insn.next;
-        }
-    }
-
-    // this class is not generified because it will create bridges
-    private final class InsnListIterator implements ListIterator {
-
-        AbstractInsnNode next;
-
-        AbstractInsnNode prev;
-
-        AbstractInsnNode remove;
-
-        InsnListIterator(int index) {
-            if (index == size()) {
-                next = null;
-                prev = getLast();
-            } else {
-                next = get(index);
-                prev = next.prev;
-            }
-        }
-
-        public boolean hasNext() {
-            return next != null;
-        }
-
-        public Object next() {
-            if (next == null) {
-                throw new NoSuchElementException();
-            }
-            AbstractInsnNode result = next;
-            prev = result;
-            next = result.next;
-            remove = result;
-            return result;
-        }
-
-        public void remove() {
-            if (remove != null) {
-                if (remove == next) {
-                    next = next.next;
-                } else {
-                    prev = prev.prev;
-                }
-                InsnList.this.remove(remove);
-                remove = null;
-            } else {
-                throw new IllegalStateException();
-            }
-        }
-
-        public boolean hasPrevious() {
-            return prev != null;
-        }
-
-        public Object previous() {
-            AbstractInsnNode result = prev;
-            next = result;
-            prev = result.prev;
-            remove = result;
-            return result;
-        }
-
-        public int nextIndex() {
-            if (next == null) {
-                return size();
-            }
-            if (cache == null) {
-                cache = toArray();
-            }
-            return next.index;
-        }
-
-        public int previousIndex() {
-            if (prev == null) {
-                return -1;
-            }
-            if (cache == null) {
-                cache = toArray();
-            }
-            return prev.index;
-        }
-
-        public void add(Object o) {
-            InsnList.this.insertBefore(next, (AbstractInsnNode) o);
-            prev = (AbstractInsnNode) o;
-            remove = null;
-        }
-
-        public void set(Object o) {
-            InsnList.this.set(next.prev, (AbstractInsnNode) o);
-            prev = (AbstractInsnNode) o;
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/InsnNode.java b/src/asm/scala/tools/asm/tree/InsnNode.java
deleted file mode 100644
index f531392..0000000
--- a/src/asm/scala/tools/asm/tree/InsnNode.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a zero operand instruction.
- *
- * @author Eric Bruneton
- */
-public class InsnNode extends AbstractInsnNode {
-
-    /**
-     * Constructs a new {@link InsnNode}.
-     *
-     * @param opcode
-     *            the opcode of the instruction to be constructed. This opcode
-     *            must be NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1,
-     *            ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1,
-     *            FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD,
-     *            LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD,
-     *            IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE,
-     *            SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
-     *            DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB,
-     *            IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM,
-     *            FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR,
-     *            IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
-     *            L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
-     *            LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
-     *            DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER,
-     *            or MONITOREXIT.
-     */
-    public InsnNode(final int opcode) {
-        super(opcode);
-    }
-
-    @Override
-    public int getType() {
-        return INSN;
-    }
-
-    /**
-     * Makes the given visitor visit this instruction.
-     *
-     * @param mv
-     *            a method visitor.
-     */
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitInsn(opcode);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new InsnNode(opcode).cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/IntInsnNode.java b/src/asm/scala/tools/asm/tree/IntInsnNode.java
deleted file mode 100644
index 6bbe8d8..0000000
--- a/src/asm/scala/tools/asm/tree/IntInsnNode.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents an instruction with a single int operand.
- *
- * @author Eric Bruneton
- */
-public class IntInsnNode extends AbstractInsnNode {
-
-    /**
-     * The operand of this instruction.
-     */
-    public int operand;
-
-    /**
-     * Constructs a new {@link IntInsnNode}.
-     *
-     * @param opcode
-     *            the opcode of the instruction to be constructed. This opcode
-     *            must be BIPUSH, SIPUSH or NEWARRAY.
-     * @param operand
-     *            the operand of the instruction to be constructed.
-     */
-    public IntInsnNode(final int opcode, final int operand) {
-        super(opcode);
-        this.operand = operand;
-    }
-
-    /**
-     * Sets the opcode of this instruction.
-     *
-     * @param opcode
-     *            the new instruction opcode. This opcode must be BIPUSH, SIPUSH
-     *            or NEWARRAY.
-     */
-    public void setOpcode(final int opcode) {
-        this.opcode = opcode;
-    }
-
-    @Override
-    public int getType() {
-        return INT_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitIntInsn(opcode, operand);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new IntInsnNode(opcode, operand).cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/InvokeDynamicInsnNode.java b/src/asm/scala/tools/asm/tree/InvokeDynamicInsnNode.java
deleted file mode 100644
index 0f85e60..0000000
--- a/src/asm/scala/tools/asm/tree/InvokeDynamicInsnNode.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.Handle;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents an invokedynamic instruction.
- *
- * @author Remi Forax
- */
-public class InvokeDynamicInsnNode extends AbstractInsnNode {
-
-    /**
-     * Invokedynamic name.
-     */
-    public String name;
-
-    /**
-     * Invokedynamic descriptor.
-     */
-    public String desc;
-
-    /**
-     * Bootstrap method
-     */
-    public Handle bsm;
-
-    /**
-     * Bootstrap constant arguments
-     */
-    public Object[] bsmArgs;
-
-    /**
-     * Constructs a new {@link InvokeDynamicInsnNode}.
-     *
-     * @param name
-     *            invokedynamic name.
-     * @param desc
-     *            invokedynamic descriptor (see {@link scala.tools.asm.Type}).
-     * @param bsm
-     *            the bootstrap method.
-     * @param bsmArgs
-     *            the boostrap constant arguments.
-     */
-    public InvokeDynamicInsnNode(final String name, final String desc,
-            final Handle bsm, final Object... bsmArgs) {
-        super(Opcodes.INVOKEDYNAMIC);
-        this.name = name;
-        this.desc = desc;
-        this.bsm = bsm;
-        this.bsmArgs = bsmArgs;
-    }
-
-    @Override
-    public int getType() {
-        return INVOKE_DYNAMIC_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs)
-                .cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/JumpInsnNode.java b/src/asm/scala/tools/asm/tree/JumpInsnNode.java
deleted file mode 100644
index 8b8a769..0000000
--- a/src/asm/scala/tools/asm/tree/JumpInsnNode.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a jump instruction. A jump instruction is an
- * instruction that may jump to another instruction.
- *
- * @author Eric Bruneton
- */
-public class JumpInsnNode extends AbstractInsnNode {
-
-    /**
-     * The operand of this instruction. This operand is a label that designates
-     * the instruction to which this instruction may jump.
-     */
-    public LabelNode label;
-
-    /**
-     * Constructs a new {@link JumpInsnNode}.
-     *
-     * @param opcode
-     *            the opcode of the type instruction to be constructed. This
-     *            opcode must be IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ,
-     *            IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
-     *            IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
-     * @param label
-     *            the operand of the instruction to be constructed. This operand
-     *            is a label that designates the instruction to which the jump
-     *            instruction may jump.
-     */
-    public JumpInsnNode(final int opcode, final LabelNode label) {
-        super(opcode);
-        this.label = label;
-    }
-
-    /**
-     * Sets the opcode of this instruction.
-     *
-     * @param opcode
-     *            the new instruction opcode. This opcode must be IFEQ, IFNE,
-     *            IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT,
-     *            IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO,
-     *            JSR, IFNULL or IFNONNULL.
-     */
-    public void setOpcode(final int opcode) {
-        this.opcode = opcode;
-    }
-
-    @Override
-    public int getType() {
-        return JUMP_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitJumpInsn(opcode, label.getLabel());
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new JumpInsnNode(opcode, clone(label, labels))
-                .cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/LabelNode.java b/src/asm/scala/tools/asm/tree/LabelNode.java
deleted file mode 100644
index 44c48c1..0000000
--- a/src/asm/scala/tools/asm/tree/LabelNode.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-
-/**
- * An {@link AbstractInsnNode} that encapsulates a {@link Label}.
- */
-public class LabelNode extends AbstractInsnNode {
-
-    private Label label;
-
-    public LabelNode() {
-        super(-1);
-    }
-
-    public LabelNode(final Label label) {
-        super(-1);
-        this.label = label;
-    }
-
-    @Override
-    public int getType() {
-        return LABEL;
-    }
-
-    public Label getLabel() {
-        if (label == null) {
-            label = new Label();
-        }
-        return label;
-    }
-
-    @Override
-    public void accept(final MethodVisitor cv) {
-        cv.visitLabel(getLabel());
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return labels.get(this);
-    }
-
-    public void resetLabel() {
-        label = null;
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/LdcInsnNode.java b/src/asm/scala/tools/asm/tree/LdcInsnNode.java
deleted file mode 100644
index 1cc850b..0000000
--- a/src/asm/scala/tools/asm/tree/LdcInsnNode.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents an LDC instruction.
- *
- * @author Eric Bruneton
- */
-public class LdcInsnNode extends AbstractInsnNode {
-
-    /**
-     * The constant to be loaded on the stack. This parameter must be a non null
-     * {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a
-     * {@link String} or a {@link scala.tools.asm.Type}.
-     */
-    public Object cst;
-
-    /**
-     * Constructs a new {@link LdcInsnNode}.
-     *
-     * @param cst
-     *            the constant to be loaded on the stack. This parameter must be
-     *            a non null {@link Integer}, a {@link Float}, a {@link Long}, a
-     *            {@link Double} or a {@link String}.
-     */
-    public LdcInsnNode(final Object cst) {
-        super(Opcodes.LDC);
-        this.cst = cst;
-    }
-
-    @Override
-    public int getType() {
-        return LDC_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitLdcInsn(cst);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new LdcInsnNode(cst).cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/LineNumberNode.java b/src/asm/scala/tools/asm/tree/LineNumberNode.java
deleted file mode 100644
index 9947aa7..0000000
--- a/src/asm/scala/tools/asm/tree/LineNumberNode.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a line number declaration. These nodes are pseudo
- * instruction nodes in order to be inserted in an instruction list.
- *
- * @author Eric Bruneton
- */
-public class LineNumberNode extends AbstractInsnNode {
-
-    /**
-     * A line number. This number refers to the source file from which the class
-     * was compiled.
-     */
-    public int line;
-
-    /**
-     * The first instruction corresponding to this line number.
-     */
-    public LabelNode start;
-
-    /**
-     * Constructs a new {@link LineNumberNode}.
-     *
-     * @param line
-     *            a line number. This number refers to the source file from
-     *            which the class was compiled.
-     * @param start
-     *            the first instruction corresponding to this line number.
-     */
-    public LineNumberNode(final int line, final LabelNode start) {
-        super(-1);
-        this.line = line;
-        this.start = start;
-    }
-
-    @Override
-    public int getType() {
-        return LINE;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitLineNumber(line, start.getLabel());
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new LineNumberNode(line, clone(start, labels));
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/LocalVariableAnnotationNode.java b/src/asm/scala/tools/asm/tree/LocalVariableAnnotationNode.java
deleted file mode 100644
index d05b808..0000000
--- a/src/asm/scala/tools/asm/tree/LocalVariableAnnotationNode.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-
-/**
- * A node that represents a type annotation on a local or resource variable.
- *
- * @author Eric Bruneton
- */
-public class LocalVariableAnnotationNode extends TypeAnnotationNode {
-
-    /**
-     * The fist instructions corresponding to the continuous ranges that make
-     * the scope of this local variable (inclusive). Must not be <tt>null</tt>.
-     */
-    public List<LabelNode> start;
-
-    /**
-     * The last instructions corresponding to the continuous ranges that make
-     * the scope of this local variable (exclusive). This list must have the
-     * same size as the 'start' list. Must not be <tt>null</tt>.
-     */
-    public List<LabelNode> end;
-
-    /**
-     * The local variable's index in each range. This list must have the same
-     * size as the 'start' list. Must not be <tt>null</tt>.
-     */
-    public List<Integer> index;
-
-    /**
-     * Constructs a new {@link LocalVariableAnnotationNode}. <i>Subclasses must
-     * not use this constructor</i>. Instead, they must use the
-     * {@link #LocalVariableAnnotationNode(int, TypePath, LabelNode[], LabelNode[], int[], String)}
-     * version.
-     *
-     * @param typeRef
-     *            a reference to the annotated type. See {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param start
-     *            the fist instructions corresponding to the continuous ranges
-     *            that make the scope of this local variable (inclusive).
-     * @param end
-     *            the last instructions corresponding to the continuous ranges
-     *            that make the scope of this local variable (exclusive). This
-     *            array must have the same size as the 'start' array.
-     * @param index
-     *            the local variable's index in each range. This array must have
-     *            the same size as the 'start' array.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     */
-    public LocalVariableAnnotationNode(int typeRef, TypePath typePath,
-            LabelNode[] start, LabelNode[] end, int[] index, String desc) {
-        this(Opcodes.ASM5, typeRef, typePath, start, end, index, desc);
-    }
-
-    /**
-     * Constructs a new {@link LocalVariableAnnotationNode}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param typeRef
-     *            a reference to the annotated type. See {@link TypeReference}.
-     * @param start
-     *            the fist instructions corresponding to the continuous ranges
-     *            that make the scope of this local variable (inclusive).
-     * @param end
-     *            the last instructions corresponding to the continuous ranges
-     *            that make the scope of this local variable (exclusive). This
-     *            array must have the same size as the 'start' array.
-     * @param index
-     *            the local variable's index in each range. This array must have
-     *            the same size as the 'start' array.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     */
-    public LocalVariableAnnotationNode(int api, int typeRef, TypePath typePath,
-            LabelNode[] start, LabelNode[] end, int[] index, String desc) {
-        super(api, typeRef, typePath, desc);
-        this.start = new ArrayList<LabelNode>(start.length);
-        this.start.addAll(Arrays.asList(start));
-        this.end = new ArrayList<LabelNode>(end.length);
-        this.end.addAll(Arrays.asList(end));
-        this.index = new ArrayList<Integer>(index.length);
-        for (int i : index) {
-            this.index.add(i);
-        }
-    }
-
-    /**
-     * Makes the given visitor visit this type annotation.
-     *
-     * @param mv
-     *            the visitor that must visit this annotation.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     */
-    public void accept(final MethodVisitor mv, boolean visible) {
-        Label[] start = new Label[this.start.size()];
-        Label[] end = new Label[this.end.size()];
-        int[] index = new int[this.index.size()];
-        for (int i = 0; i < start.length; ++i) {
-            start[i] = this.start.get(i).getLabel();
-            end[i] = this.end.get(i).getLabel();
-            index[i] = this.index.get(i);
-        }
-        accept(mv.visitLocalVariableAnnotation(typeRef, typePath, start, end,
-                index, desc, true));
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/LocalVariableNode.java b/src/asm/scala/tools/asm/tree/LocalVariableNode.java
deleted file mode 100644
index 0d8e273..0000000
--- a/src/asm/scala/tools/asm/tree/LocalVariableNode.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a local variable declaration.
- *
- * @author Eric Bruneton
- */
-public class LocalVariableNode {
-
-    /**
-     * The name of a local variable.
-     */
-    public String name;
-
-    /**
-     * The type descriptor of this local variable.
-     */
-    public String desc;
-
-    /**
-     * The signature of this local variable. May be <tt>null</tt>.
-     */
-    public String signature;
-
-    /**
-     * The first instruction corresponding to the scope of this local variable
-     * (inclusive).
-     */
-    public LabelNode start;
-
-    /**
-     * The last instruction corresponding to the scope of this local variable
-     * (exclusive).
-     */
-    public LabelNode end;
-
-    /**
-     * The local variable's index.
-     */
-    public int index;
-
-    /**
-     * Constructs a new {@link LocalVariableNode}.
-     *
-     * @param name
-     *            the name of a local variable.
-     * @param desc
-     *            the type descriptor of this local variable.
-     * @param signature
-     *            the signature of this local variable. May be <tt>null</tt>.
-     * @param start
-     *            the first instruction corresponding to the scope of this local
-     *            variable (inclusive).
-     * @param end
-     *            the last instruction corresponding to the scope of this local
-     *            variable (exclusive).
-     * @param index
-     *            the local variable's index.
-     */
-    public LocalVariableNode(final String name, final String desc,
-            final String signature, final LabelNode start, final LabelNode end,
-            final int index) {
-        this.name = name;
-        this.desc = desc;
-        this.signature = signature;
-        this.start = start;
-        this.end = end;
-        this.index = index;
-    }
-
-    /**
-     * Makes the given visitor visit this local variable declaration.
-     *
-     * @param mv
-     *            a method visitor.
-     */
-    public void accept(final MethodVisitor mv) {
-        mv.visitLocalVariable(name, desc, signature, start.getLabel(),
-                end.getLabel(), index);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/LookupSwitchInsnNode.java b/src/asm/scala/tools/asm/tree/LookupSwitchInsnNode.java
deleted file mode 100644
index 7db2f53..0000000
--- a/src/asm/scala/tools/asm/tree/LookupSwitchInsnNode.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents a LOOKUPSWITCH instruction.
- *
- * @author Eric Bruneton
- */
-public class LookupSwitchInsnNode extends AbstractInsnNode {
-
-    /**
-     * Beginning of the default handler block.
-     */
-    public LabelNode dflt;
-
-    /**
-     * The values of the keys. This list is a list of {@link Integer} objects.
-     */
-    public List<Integer> keys;
-
-    /**
-     * Beginnings of the handler blocks. This list is a list of
-     * {@link LabelNode} objects.
-     */
-    public List<LabelNode> labels;
-
-    /**
-     * Constructs a new {@link LookupSwitchInsnNode}.
-     *
-     * @param dflt
-     *            beginning of the default handler block.
-     * @param keys
-     *            the values of the keys.
-     * @param labels
-     *            beginnings of the handler blocks. <tt>labels[i]</tt> is the
-     *            beginning of the handler block for the <tt>keys[i]</tt> key.
-     */
-    public LookupSwitchInsnNode(final LabelNode dflt, final int[] keys,
-            final LabelNode[] labels) {
-        super(Opcodes.LOOKUPSWITCH);
-        this.dflt = dflt;
-        this.keys = new ArrayList<Integer>(keys == null ? 0 : keys.length);
-        this.labels = new ArrayList<LabelNode>(labels == null ? 0
-                : labels.length);
-        if (keys != null) {
-            for (int i = 0; i < keys.length; ++i) {
-                this.keys.add(new Integer(keys[i]));
-            }
-        }
-        if (labels != null) {
-            this.labels.addAll(Arrays.asList(labels));
-        }
-    }
-
-    @Override
-    public int getType() {
-        return LOOKUPSWITCH_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        int[] keys = new int[this.keys.size()];
-        for (int i = 0; i < keys.length; ++i) {
-            keys[i] = this.keys.get(i).intValue();
-        }
-        Label[] labels = new Label[this.labels.size()];
-        for (int i = 0; i < labels.length; ++i) {
-            labels[i] = this.labels.get(i).getLabel();
-        }
-        mv.visitLookupSwitchInsn(dflt.getLabel(), keys, labels);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        LookupSwitchInsnNode clone = new LookupSwitchInsnNode(clone(dflt,
-                labels), null, clone(this.labels, labels));
-        clone.keys.addAll(keys);
-        return clone.cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/MethodInsnNode.java b/src/asm/scala/tools/asm/tree/MethodInsnNode.java
deleted file mode 100644
index 1ec46d4..0000000
--- a/src/asm/scala/tools/asm/tree/MethodInsnNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents a method instruction. A method instruction is an
- * instruction that invokes a method.
- *
- * @author Eric Bruneton
- */
-public class MethodInsnNode extends AbstractInsnNode {
-
-    /**
-     * The internal name of the method's owner class (see
-     * {@link scala.tools.asm.Type#getInternalName() getInternalName}).
-     */
-    public String owner;
-
-    /**
-     * The method's name.
-     */
-    public String name;
-
-    /**
-     * The method's descriptor (see {@link scala.tools.asm.Type}).
-     */
-    public String desc;
-
-    /**
-     * If the method's owner class if an interface.
-     */
-    public boolean itf;
-
-    /**
-     * Constructs a new {@link MethodInsnNode}.
-     *
-     * @param opcode
-     *            the opcode of the type instruction to be constructed. This
-     *            opcode must be INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
-     *            INVOKEINTERFACE.
-     * @param owner
-     *            the internal name of the method's owner class (see
-     *            {@link scala.tools.asm.Type#getInternalName()
-     *            getInternalName}).
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor (see {@link scala.tools.asm.Type}).
-     */
-    @Deprecated
-    public MethodInsnNode(final int opcode, final String owner,
-            final String name, final String desc) {
-        this(opcode, owner, name, desc, opcode == Opcodes.INVOKEINTERFACE);
-    }
-
-    /**
-     * Constructs a new {@link MethodInsnNode}.
-     *
-     * @param opcode
-     *            the opcode of the type instruction to be constructed. This
-     *            opcode must be INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
-     *            INVOKEINTERFACE.
-     * @param owner
-     *            the internal name of the method's owner class (see
-     *            {@link scala.tools.asm.Type#getInternalName()
-     *            getInternalName}).
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor (see {@link scala.tools.asm.Type}).
-     * @param itf
-     *            if the method's owner class is an interface.
-     */
-    public MethodInsnNode(final int opcode, final String owner,
-            final String name, final String desc, final boolean itf) {
-        super(opcode);
-        this.owner = owner;
-        this.name = name;
-        this.desc = desc;
-        this.itf = itf;
-    }
-
-    /**
-     * Sets the opcode of this instruction.
-     *
-     * @param opcode
-     *            the new instruction opcode. This opcode must be INVOKEVIRTUAL,
-     *            INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
-     */
-    public void setOpcode(final int opcode) {
-        this.opcode = opcode;
-    }
-
-    @Override
-    public int getType() {
-        return METHOD_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitMethodInsn(opcode, owner, name, desc, itf);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new MethodInsnNode(opcode, owner, name, desc, itf);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/MethodNode.java b/src/asm/scala/tools/asm/tree/MethodNode.java
deleted file mode 100644
index 3dec50e..0000000
--- a/src/asm/scala/tools/asm/tree/MethodNode.java
+++ /dev/null
@@ -1,839 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassVisitor;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.TypePath;
-
-/**
- * A node that represents a method.
- *
- * @author Eric Bruneton
- */
-public class MethodNode extends MethodVisitor {
-
-    /**
-     * The method's access flags (see {@link Opcodes}). This field also
-     * indicates if the method is synthetic and/or deprecated.
-     */
-    public int access;
-
-    /**
-     * The method's name.
-     */
-    public String name;
-
-    /**
-     * The method's descriptor (see {@link Type}).
-     */
-    public String desc;
-
-    /**
-     * The method's signature. May be <tt>null</tt>.
-     */
-    public String signature;
-
-    /**
-     * The internal names of the method's exception classes (see
-     * {@link Type#getInternalName() getInternalName}). This list is a list of
-     * {@link String} objects.
-     */
-    public List<String> exceptions;
-
-    /**
-     * The method parameter info (access flags and name)
-     */
-    public List<ParameterNode> parameters;
-
-    /**
-     * The runtime visible annotations of this method. This list is a list of
-     * {@link AnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.AnnotationNode
-     * @label visible
-     */
-    public List<AnnotationNode> visibleAnnotations;
-
-    /**
-     * The runtime invisible annotations of this method. This list is a list of
-     * {@link AnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.AnnotationNode
-     * @label invisible
-     */
-    public List<AnnotationNode> invisibleAnnotations;
-
-    /**
-     * The runtime visible type annotations of this method. This list is a list
-     * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.TypeAnnotationNode
-     * @label visible
-     */
-    public List<TypeAnnotationNode> visibleTypeAnnotations;
-
-    /**
-     * The runtime invisible type annotations of this method. This list is a
-     * list of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.TypeAnnotationNode
-     * @label invisible
-     */
-    public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
-    /**
-     * The non standard attributes of this method. This list is a list of
-     * {@link Attribute} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.Attribute
-     */
-    public List<Attribute> attrs;
-
-    /**
-     * The default value of this annotation interface method. This field must be
-     * a {@link Byte}, {@link Boolean}, {@link Character}, {@link Short},
-     * {@link Integer}, {@link Long}, {@link Float}, {@link Double},
-     * {@link String} or {@link Type}, or an two elements String array (for
-     * enumeration values), a {@link AnnotationNode}, or a {@link List} of
-     * values of one of the preceding types. May be <tt>null</tt>.
-     */
-    public Object annotationDefault;
-
-    /**
-     * The runtime visible parameter annotations of this method. These lists are
-     * lists of {@link AnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.AnnotationNode
-     * @label invisible parameters
-     */
-    public List<AnnotationNode>[] visibleParameterAnnotations;
-
-    /**
-     * The runtime invisible parameter annotations of this method. These lists
-     * are lists of {@link AnnotationNode} objects. May be <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.AnnotationNode
-     * @label visible parameters
-     */
-    public List<AnnotationNode>[] invisibleParameterAnnotations;
-
-    /**
-     * The instructions of this method. This list is a list of
-     * {@link AbstractInsnNode} objects.
-     *
-     * @associates scala.tools.asm.tree.AbstractInsnNode
-     * @label instructions
-     */
-    public InsnList instructions;
-
-    /**
-     * The try catch blocks of this method. This list is a list of
-     * {@link TryCatchBlockNode} objects.
-     *
-     * @associates scala.tools.asm.tree.TryCatchBlockNode
-     */
-    public List<TryCatchBlockNode> tryCatchBlocks;
-
-    /**
-     * The maximum stack size of this method.
-     */
-    public int maxStack;
-
-    /**
-     * The maximum number of local variables of this method.
-     */
-    public int maxLocals;
-
-    /**
-     * The local variables of this method. This list is a list of
-     * {@link LocalVariableNode} objects. May be <tt>null</tt>
-     *
-     * @associates scala.tools.asm.tree.LocalVariableNode
-     */
-    public List<LocalVariableNode> localVariables;
-
-    /**
-     * The visible local variable annotations of this method. This list is a
-     * list of {@link LocalVariableAnnotationNode} objects. May be <tt>null</tt>
-     *
-     * @associates scala.tools.asm.tree.LocalVariableAnnotationNode
-     */
-    public List<LocalVariableAnnotationNode> visibleLocalVariableAnnotations;
-
-    /**
-     * The invisible local variable annotations of this method. This list is a
-     * list of {@link LocalVariableAnnotationNode} objects. May be <tt>null</tt>
-     *
-     * @associates scala.tools.asm.tree.LocalVariableAnnotationNode
-     */
-    public List<LocalVariableAnnotationNode> invisibleLocalVariableAnnotations;
-
-    /**
-     * If the accept method has been called on this object.
-     */
-    private boolean visited;
-
-    /**
-     * Constructs an uninitialized {@link MethodNode}. <i>Subclasses must not
-     * use this constructor</i>. Instead, they must use the
-     * {@link #MethodNode(int)} version.
-     *
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public MethodNode() {
-        this(Opcodes.ASM5);
-        if (getClass() != MethodNode.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs an uninitialized {@link MethodNode}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    public MethodNode(final int api) {
-        super(api);
-        this.instructions = new InsnList();
-    }
-
-    /**
-     * Constructs a new {@link MethodNode}. <i>Subclasses must not use this
-     * constructor</i>. Instead, they must use the
-     * {@link #MethodNode(int, int, String, String, String, String[])} version.
-     *
-     * @param access
-     *            the method's access flags (see {@link Opcodes}). This
-     *            parameter also indicates if the method is synthetic and/or
-     *            deprecated.
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor (see {@link Type}).
-     * @param signature
-     *            the method's signature. May be <tt>null</tt>.
-     * @param exceptions
-     *            the internal names of the method's exception classes (see
-     *            {@link Type#getInternalName() getInternalName}). May be
-     *            <tt>null</tt>.
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public MethodNode(final int access, final String name, final String desc,
-            final String signature, final String[] exceptions) {
-        this(Opcodes.ASM5, access, name, desc, signature, exceptions);
-        if (getClass() != MethodNode.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs a new {@link MethodNode}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param access
-     *            the method's access flags (see {@link Opcodes}). This
-     *            parameter also indicates if the method is synthetic and/or
-     *            deprecated.
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor (see {@link Type}).
-     * @param signature
-     *            the method's signature. May be <tt>null</tt>.
-     * @param exceptions
-     *            the internal names of the method's exception classes (see
-     *            {@link Type#getInternalName() getInternalName}). May be
-     *            <tt>null</tt>.
-     */
-    public MethodNode(final int api, final int access, final String name,
-            final String desc, final String signature, final String[] exceptions) {
-        super(api);
-        this.access = access;
-        this.name = name;
-        this.desc = desc;
-        this.signature = signature;
-        this.exceptions = new ArrayList<String>(exceptions == null ? 0
-                : exceptions.length);
-        boolean isAbstract = (access & Opcodes.ACC_ABSTRACT) != 0;
-        if (!isAbstract) {
-            this.localVariables = new ArrayList<LocalVariableNode>(5);
-        }
-        this.tryCatchBlocks = new ArrayList<TryCatchBlockNode>();
-        if (exceptions != null) {
-            this.exceptions.addAll(Arrays.asList(exceptions));
-        }
-        this.instructions = new InsnList();
-    }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the MethodVisitor abstract class
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visitParameter(String name, int access) {
-        if (parameters == null) {
-            parameters = new ArrayList<ParameterNode>(5);
-        }
-        parameters.add(new ParameterNode(name, access));
-    }
-
-    @Override
-    @SuppressWarnings("serial")
-    public AnnotationVisitor visitAnnotationDefault() {
-        return new AnnotationNode(new ArrayList<Object>(0) {
-            @Override
-            public boolean add(final Object o) {
-                annotationDefault = o;
-                return super.add(o);
-            }
-        });
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        AnnotationNode an = new AnnotationNode(desc);
-        if (visible) {
-            if (visibleAnnotations == null) {
-                visibleAnnotations = new ArrayList<AnnotationNode>(1);
-            }
-            visibleAnnotations.add(an);
-        } else {
-            if (invisibleAnnotations == null) {
-                invisibleAnnotations = new ArrayList<AnnotationNode>(1);
-            }
-            invisibleAnnotations.add(an);
-        }
-        return an;
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
-        if (visible) {
-            if (visibleTypeAnnotations == null) {
-                visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
-            }
-            visibleTypeAnnotations.add(an);
-        } else {
-            if (invisibleTypeAnnotations == null) {
-                invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
-            }
-            invisibleTypeAnnotations.add(an);
-        }
-        return an;
-    }
-
-    @Override
-    public AnnotationVisitor visitParameterAnnotation(final int parameter,
-            final String desc, final boolean visible) {
-        AnnotationNode an = new AnnotationNode(desc);
-        if (visible) {
-            if (visibleParameterAnnotations == null) {
-                int params = Type.getArgumentTypes(this.desc).length;
-                visibleParameterAnnotations = (List<AnnotationNode>[]) new List<?>[params];
-            }
-            if (visibleParameterAnnotations[parameter] == null) {
-                visibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>(
-                        1);
-            }
-            visibleParameterAnnotations[parameter].add(an);
-        } else {
-            if (invisibleParameterAnnotations == null) {
-                int params = Type.getArgumentTypes(this.desc).length;
-                invisibleParameterAnnotations = (List<AnnotationNode>[]) new List<?>[params];
-            }
-            if (invisibleParameterAnnotations[parameter] == null) {
-                invisibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>(
-                        1);
-            }
-            invisibleParameterAnnotations[parameter].add(an);
-        }
-        return an;
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        if (attrs == null) {
-            attrs = new ArrayList<Attribute>(1);
-        }
-        attrs.add(attr);
-    }
-
-    @Override
-    public void visitCode() {
-    }
-
-    @Override
-    public void visitFrame(final int type, final int nLocal,
-            final Object[] local, final int nStack, final Object[] stack) {
-        instructions.add(new FrameNode(type, nLocal, local == null ? null
-                : getLabelNodes(local), nStack, stack == null ? null
-                : getLabelNodes(stack)));
-    }
-
-    @Override
-    public void visitInsn(final int opcode) {
-        instructions.add(new InsnNode(opcode));
-    }
-
-    @Override
-    public void visitIntInsn(final int opcode, final int operand) {
-        instructions.add(new IntInsnNode(opcode, operand));
-    }
-
-    @Override
-    public void visitVarInsn(final int opcode, final int var) {
-        instructions.add(new VarInsnNode(opcode, var));
-    }
-
-    @Override
-    public void visitTypeInsn(final int opcode, final String type) {
-        instructions.add(new TypeInsnNode(opcode, type));
-    }
-
-    @Override
-    public void visitFieldInsn(final int opcode, final String owner,
-            final String name, final String desc) {
-        instructions.add(new FieldInsnNode(opcode, owner, name, desc));
-    }
-
-    @Deprecated
-    @Override
-    public void visitMethodInsn(int opcode, String owner, String name,
-            String desc) {
-        if (api >= Opcodes.ASM5) {
-            super.visitMethodInsn(opcode, owner, name, desc);
-            return;
-        }
-        instructions.add(new MethodInsnNode(opcode, owner, name, desc));
-    }
-
-    @Override
-    public void visitMethodInsn(int opcode, String owner, String name,
-            String desc, boolean itf) {
-        if (api < Opcodes.ASM5) {
-            super.visitMethodInsn(opcode, owner, name, desc, itf);
-            return;
-        }
-        instructions.add(new MethodInsnNode(opcode, owner, name, desc, itf));
-    }
-
-    @Override
-    public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
-            Object... bsmArgs) {
-        instructions.add(new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs));
-    }
-
-    @Override
-    public void visitJumpInsn(final int opcode, final Label label) {
-        instructions.add(new JumpInsnNode(opcode, getLabelNode(label)));
-    }
-
-    @Override
-    public void visitLabel(final Label label) {
-        instructions.add(getLabelNode(label));
-    }
-
-    @Override
-    public void visitLdcInsn(final Object cst) {
-        instructions.add(new LdcInsnNode(cst));
-    }
-
-    @Override
-    public void visitIincInsn(final int var, final int increment) {
-        instructions.add(new IincInsnNode(var, increment));
-    }
-
-    @Override
-    public void visitTableSwitchInsn(final int min, final int max,
-            final Label dflt, final Label... labels) {
-        instructions.add(new TableSwitchInsnNode(min, max, getLabelNode(dflt),
-                getLabelNodes(labels)));
-    }
-
-    @Override
-    public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
-            final Label[] labels) {
-        instructions.add(new LookupSwitchInsnNode(getLabelNode(dflt), keys,
-                getLabelNodes(labels)));
-    }
-
-    @Override
-    public void visitMultiANewArrayInsn(final String desc, final int dims) {
-        instructions.add(new MultiANewArrayInsnNode(desc, dims));
-    }
-
-    @Override
-    public AnnotationVisitor visitInsnAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        // Finds the last real instruction, i.e. the instruction targeted by
-        // this annotation.
-        AbstractInsnNode insn = instructions.getLast();
-        while (insn.getOpcode() == -1) {
-            insn = insn.getPrevious();
-        }
-        // Adds the annotation to this instruction.
-        TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
-        if (visible) {
-            if (insn.visibleTypeAnnotations == null) {
-                insn.visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(
-                        1);
-            }
-            insn.visibleTypeAnnotations.add(an);
-        } else {
-            if (insn.invisibleTypeAnnotations == null) {
-                insn.invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(
-                        1);
-            }
-            insn.invisibleTypeAnnotations.add(an);
-        }
-        return an;
-    }
-
-    @Override
-    public void visitTryCatchBlock(final Label start, final Label end,
-            final Label handler, final String type) {
-        tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(start),
-                getLabelNode(end), getLabelNode(handler), type));
-    }
-
-    @Override
-    public AnnotationVisitor visitTryCatchAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        TryCatchBlockNode tcb = tryCatchBlocks.get((typeRef & 0x00FFFF00) >> 8);
-        TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
-        if (visible) {
-            if (tcb.visibleTypeAnnotations == null) {
-                tcb.visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(
-                        1);
-            }
-            tcb.visibleTypeAnnotations.add(an);
-        } else {
-            if (tcb.invisibleTypeAnnotations == null) {
-                tcb.invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(
-                        1);
-            }
-            tcb.invisibleTypeAnnotations.add(an);
-        }
-        return an;
-    }
-
-    @Override
-    public void visitLocalVariable(final String name, final String desc,
-            final String signature, final Label start, final Label end,
-            final int index) {
-        localVariables.add(new LocalVariableNode(name, desc, signature,
-                getLabelNode(start), getLabelNode(end), index));
-    }
-
-    @Override
-    public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
-            TypePath typePath, Label[] start, Label[] end, int[] index,
-            String desc, boolean visible) {
-        LocalVariableAnnotationNode an = new LocalVariableAnnotationNode(
-                typeRef, typePath, getLabelNodes(start), getLabelNodes(end),
-                index, desc);
-        if (visible) {
-            if (visibleLocalVariableAnnotations == null) {
-                visibleLocalVariableAnnotations = new ArrayList<LocalVariableAnnotationNode>(
-                        1);
-            }
-            visibleLocalVariableAnnotations.add(an);
-        } else {
-            if (invisibleLocalVariableAnnotations == null) {
-                invisibleLocalVariableAnnotations = new ArrayList<LocalVariableAnnotationNode>(
-                        1);
-            }
-            invisibleLocalVariableAnnotations.add(an);
-        }
-        return an;
-    }
-
-    @Override
-    public void visitLineNumber(final int line, final Label start) {
-        instructions.add(new LineNumberNode(line, getLabelNode(start)));
-    }
-
-    @Override
-    public void visitMaxs(final int maxStack, final int maxLocals) {
-        this.maxStack = maxStack;
-        this.maxLocals = maxLocals;
-    }
-
-    @Override
-    public void visitEnd() {
-    }
-
-    /**
-     * Returns the LabelNode corresponding to the given Label. Creates a new
-     * LabelNode if necessary. The default implementation of this method uses
-     * the {@link Label#info} field to store associations between labels and
-     * label nodes.
-     *
-     * @param l
-     *            a Label.
-     * @return the LabelNode corresponding to l.
-     */
-    protected LabelNode getLabelNode(final Label l) {
-        if (!(l.info instanceof LabelNode)) {
-            l.info = new LabelNode(l);
-        }
-        return (LabelNode) l.info;
-    }
-
-    private LabelNode[] getLabelNodes(final Label[] l) {
-        LabelNode[] nodes = new LabelNode[l.length];
-        for (int i = 0; i < l.length; ++i) {
-            nodes[i] = getLabelNode(l[i]);
-        }
-        return nodes;
-    }
-
-    private Object[] getLabelNodes(final Object[] objs) {
-        Object[] nodes = new Object[objs.length];
-        for (int i = 0; i < objs.length; ++i) {
-            Object o = objs[i];
-            if (o instanceof Label) {
-                o = getLabelNode((Label) o);
-            }
-            nodes[i] = o;
-        }
-        return nodes;
-    }
-
-    // ------------------------------------------------------------------------
-    // Accept method
-    // ------------------------------------------------------------------------
-
-    /**
-     * Checks that this method node is compatible with the given ASM API
-     * version. This methods checks that this node, and all its nodes
-     * recursively, do not contain elements that were introduced in more recent
-     * versions of the ASM API than the given version.
-     *
-     * @param api
-     *            an ASM API version. Must be one of {@link Opcodes#ASM4} or
-     *            {@link Opcodes#ASM5}.
-     */
-    public void check(final int api) {
-        if (api == Opcodes.ASM4) {
-            if (visibleTypeAnnotations != null
-                    && visibleTypeAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-            if (invisibleTypeAnnotations != null
-                    && invisibleTypeAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-            int n = tryCatchBlocks == null ? 0 : tryCatchBlocks.size();
-            for (int i = 0; i < n; ++i) {
-                TryCatchBlockNode tcb = tryCatchBlocks.get(i);
-                if (tcb.visibleTypeAnnotations != null
-                        && tcb.visibleTypeAnnotations.size() > 0) {
-                    throw new RuntimeException();
-                }
-                if (tcb.invisibleTypeAnnotations != null
-                        && tcb.invisibleTypeAnnotations.size() > 0) {
-                    throw new RuntimeException();
-                }
-            }
-            for (int i = 0; i < instructions.size(); ++i) {
-                AbstractInsnNode insn = instructions.get(i);
-                if (insn.visibleTypeAnnotations != null
-                        && insn.visibleTypeAnnotations.size() > 0) {
-                    throw new RuntimeException();
-                }
-                if (insn.invisibleTypeAnnotations != null
-                        && insn.invisibleTypeAnnotations.size() > 0) {
-                    throw new RuntimeException();
-                }
-                if (insn instanceof MethodInsnNode) {
-                    boolean itf = ((MethodInsnNode) insn).itf;
-                    if (itf != (insn.opcode == Opcodes.INVOKEINTERFACE)) {
-                        throw new RuntimeException();
-                    }
-                }
-            }
-            if (visibleLocalVariableAnnotations != null
-                    && visibleLocalVariableAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-            if (invisibleLocalVariableAnnotations != null
-                    && invisibleLocalVariableAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-        }
-    }
-
-    /**
-     * Makes the given class visitor visit this method.
-     *
-     * @param cv
-     *            a class visitor.
-     */
-    public void accept(final ClassVisitor cv) {
-        String[] exceptions = new String[this.exceptions.size()];
-        this.exceptions.toArray(exceptions);
-        MethodVisitor mv = cv.visitMethod(access, name, desc, signature,
-                exceptions);
-        if (mv != null) {
-            accept(mv);
-        }
-    }
-
-    /**
-     * Makes the given method visitor visit this method.
-     *
-     * @param mv
-     *            a method visitor.
-     */
-    public void accept(final MethodVisitor mv) {
-        // visits the method parameters
-        int i, j, n;
-        n = parameters == null ? 0 : parameters.size();
-        for (i = 0; i < n; i++) {
-            ParameterNode parameter = parameters.get(i);
-            mv.visitParameter(parameter.name, parameter.access);
-        }
-        // visits the method attributes
-        if (annotationDefault != null) {
-            AnnotationVisitor av = mv.visitAnnotationDefault();
-            AnnotationNode.accept(av, null, annotationDefault);
-            if (av != null) {
-                av.visitEnd();
-            }
-        }
-        n = visibleAnnotations == null ? 0 : visibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            AnnotationNode an = visibleAnnotations.get(i);
-            an.accept(mv.visitAnnotation(an.desc, true));
-        }
-        n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            AnnotationNode an = invisibleAnnotations.get(i);
-            an.accept(mv.visitAnnotation(an.desc, false));
-        }
-        n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            TypeAnnotationNode an = visibleTypeAnnotations.get(i);
-            an.accept(mv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
-                    true));
-        }
-        n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
-                .size();
-        for (i = 0; i < n; ++i) {
-            TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
-            an.accept(mv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
-                    false));
-        }
-        n = visibleParameterAnnotations == null ? 0
-                : visibleParameterAnnotations.length;
-        for (i = 0; i < n; ++i) {
-            List<?> l = visibleParameterAnnotations[i];
-            if (l == null) {
-                continue;
-            }
-            for (j = 0; j < l.size(); ++j) {
-                AnnotationNode an = (AnnotationNode) l.get(j);
-                an.accept(mv.visitParameterAnnotation(i, an.desc, true));
-            }
-        }
-        n = invisibleParameterAnnotations == null ? 0
-                : invisibleParameterAnnotations.length;
-        for (i = 0; i < n; ++i) {
-            List<?> l = invisibleParameterAnnotations[i];
-            if (l == null) {
-                continue;
-            }
-            for (j = 0; j < l.size(); ++j) {
-                AnnotationNode an = (AnnotationNode) l.get(j);
-                an.accept(mv.visitParameterAnnotation(i, an.desc, false));
-            }
-        }
-        if (visited) {
-            instructions.resetLabels();
-        }
-        n = attrs == null ? 0 : attrs.size();
-        for (i = 0; i < n; ++i) {
-            mv.visitAttribute(attrs.get(i));
-        }
-        // visits the method's code
-        if (instructions.size() > 0) {
-            mv.visitCode();
-            // visits try catch blocks
-            n = tryCatchBlocks == null ? 0 : tryCatchBlocks.size();
-            for (i = 0; i < n; ++i) {
-                tryCatchBlocks.get(i).updateIndex(i);
-                tryCatchBlocks.get(i).accept(mv);
-            }
-            // visits instructions
-            instructions.accept(mv);
-            // visits local variables
-            n = localVariables == null ? 0 : localVariables.size();
-            for (i = 0; i < n; ++i) {
-                localVariables.get(i).accept(mv);
-            }
-            // visits local variable annotations
-            n = visibleLocalVariableAnnotations == null ? 0
-                    : visibleLocalVariableAnnotations.size();
-            for (i = 0; i < n; ++i) {
-                visibleLocalVariableAnnotations.get(i).accept(mv, true);
-            }
-            n = invisibleLocalVariableAnnotations == null ? 0
-                    : invisibleLocalVariableAnnotations.size();
-            for (i = 0; i < n; ++i) {
-                invisibleLocalVariableAnnotations.get(i).accept(mv, false);
-            }
-            // visits maxs
-            mv.visitMaxs(maxStack, maxLocals);
-            visited = true;
-        }
-        mv.visitEnd();
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/MultiANewArrayInsnNode.java b/src/asm/scala/tools/asm/tree/MultiANewArrayInsnNode.java
deleted file mode 100644
index a8339a2..0000000
--- a/src/asm/scala/tools/asm/tree/MultiANewArrayInsnNode.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents a MULTIANEWARRAY instruction.
- *
- * @author Eric Bruneton
- */
-public class MultiANewArrayInsnNode extends AbstractInsnNode {
-
-    /**
-     * An array type descriptor (see {@link scala.tools.asm.Type}).
-     */
-    public String desc;
-
-    /**
-     * Number of dimensions of the array to allocate.
-     */
-    public int dims;
-
-    /**
-     * Constructs a new {@link MultiANewArrayInsnNode}.
-     *
-     * @param desc
-     *            an array type descriptor (see {@link scala.tools.asm.Type}).
-     * @param dims
-     *            number of dimensions of the array to allocate.
-     */
-    public MultiANewArrayInsnNode(final String desc, final int dims) {
-        super(Opcodes.MULTIANEWARRAY);
-        this.desc = desc;
-        this.dims = dims;
-    }
-
-    @Override
-    public int getType() {
-        return MULTIANEWARRAY_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitMultiANewArrayInsn(desc, dims);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new MultiANewArrayInsnNode(desc, dims).cloneAnnotations(this);
-    }
-
-}
diff --git a/src/asm/scala/tools/asm/tree/ParameterNode.java b/src/asm/scala/tools/asm/tree/ParameterNode.java
deleted file mode 100644
index a3e55d5..0000000
--- a/src/asm/scala/tools/asm/tree/ParameterNode.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a parameter access and name.
- *
- * @author Remi Forax
- */
-public class ParameterNode {
-    /**
-     * The parameter's name.
-     */
-    public String name;
-
-    /**
-     * The parameter's access flags (see {@link scala.tools.asm.Opcodes}).
-     * Valid values are <tt>ACC_FINAL</tt>, <tt>ACC_SYNTHETIC</tt> and
-     * <tt>ACC_MANDATED</tt>.
-     */
-    public int access;
-
-    /**
-     * Constructs a new {@link ParameterNode}.
-     *
-     * @param access
-     *            The parameter's access flags. Valid values are
-     *            <tt>ACC_FINAL</tt>, <tt>ACC_SYNTHETIC</tt> or/and
-     *            <tt>ACC_MANDATED</tt> (see {@link scala.tools.asm.Opcodes}).
-     * @param name
-     *            the parameter's name.
-     */
-    public ParameterNode(final String name, final int access) {
-        this.name = name;
-        this.access = access;
-    }
-
-    /**
-     * Makes the given visitor visit this parameter declaration.
-     *
-     * @param mv
-     *            a method visitor.
-     */
-    public void accept(final MethodVisitor mv) {
-        mv.visitParameter(name, access);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/TableSwitchInsnNode.java b/src/asm/scala/tools/asm/tree/TableSwitchInsnNode.java
deleted file mode 100644
index fb17b9e..0000000
--- a/src/asm/scala/tools/asm/tree/TableSwitchInsnNode.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents a TABLESWITCH instruction.
- *
- * @author Eric Bruneton
- */
-public class TableSwitchInsnNode extends AbstractInsnNode {
-
-    /**
-     * The minimum key value.
-     */
-    public int min;
-
-    /**
-     * The maximum key value.
-     */
-    public int max;
-
-    /**
-     * Beginning of the default handler block.
-     */
-    public LabelNode dflt;
-
-    /**
-     * Beginnings of the handler blocks. This list is a list of
-     * {@link LabelNode} objects.
-     */
-    public List<LabelNode> labels;
-
-    /**
-     * Constructs a new {@link TableSwitchInsnNode}.
-     *
-     * @param min
-     *            the minimum key value.
-     * @param max
-     *            the maximum key value.
-     * @param dflt
-     *            beginning of the default handler block.
-     * @param labels
-     *            beginnings of the handler blocks. <tt>labels[i]</tt> is the
-     *            beginning of the handler block for the <tt>min + i</tt> key.
-     */
-    public TableSwitchInsnNode(final int min, final int max,
-            final LabelNode dflt, final LabelNode... labels) {
-        super(Opcodes.TABLESWITCH);
-        this.min = min;
-        this.max = max;
-        this.dflt = dflt;
-        this.labels = new ArrayList<LabelNode>();
-        if (labels != null) {
-            this.labels.addAll(Arrays.asList(labels));
-        }
-    }
-
-    @Override
-    public int getType() {
-        return TABLESWITCH_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        Label[] labels = new Label[this.labels.size()];
-        for (int i = 0; i < labels.length; ++i) {
-            labels[i] = this.labels.get(i).getLabel();
-        }
-        mv.visitTableSwitchInsn(min, max, dflt.getLabel(), labels);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new TableSwitchInsnNode(min, max, clone(dflt, labels), clone(
-                this.labels, labels)).cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/TryCatchBlockNode.java b/src/asm/scala/tools/asm/tree/TryCatchBlockNode.java
deleted file mode 100644
index c639b9a..0000000
--- a/src/asm/scala/tools/asm/tree/TryCatchBlockNode.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.List;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a try catch block.
- *
- * @author Eric Bruneton
- */
-public class TryCatchBlockNode {
-
-    /**
-     * Beginning of the exception handler's scope (inclusive).
-     */
-    public LabelNode start;
-
-    /**
-     * End of the exception handler's scope (exclusive).
-     */
-    public LabelNode end;
-
-    /**
-     * Beginning of the exception handler's code.
-     */
-    public LabelNode handler;
-
-    /**
-     * Internal name of the type of exceptions handled by the handler. May be
-     * <tt>null</tt> to catch any exceptions (for "finally" blocks).
-     */
-    public String type;
-
-    /**
-     * The runtime visible type annotations on the exception handler type. This
-     * list is a list of {@link TypeAnnotationNode} objects. May be
-     * <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.TypeAnnotationNode
-     * @label visible
-     */
-    public List<TypeAnnotationNode> visibleTypeAnnotations;
-
-    /**
-     * The runtime invisible type annotations on the exception handler type.
-     * This list is a list of {@link TypeAnnotationNode} objects. May be
-     * <tt>null</tt>.
-     *
-     * @associates scala.tools.asm.tree.TypeAnnotationNode
-     * @label invisible
-     */
-    public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
-    /**
-     * Constructs a new {@link TryCatchBlockNode}.
-     *
-     * @param start
-     *            beginning of the exception handler's scope (inclusive).
-     * @param end
-     *            end of the exception handler's scope (exclusive).
-     * @param handler
-     *            beginning of the exception handler's code.
-     * @param type
-     *            internal name of the type of exceptions handled by the
-     *            handler, or <tt>null</tt> to catch any exceptions (for
-     *            "finally" blocks).
-     */
-    public TryCatchBlockNode(final LabelNode start, final LabelNode end,
-            final LabelNode handler, final String type) {
-        this.start = start;
-        this.end = end;
-        this.handler = handler;
-        this.type = type;
-    }
-
-    /**
-     * Updates the index of this try catch block in the method's list of try
-     * catch block nodes. This index maybe stored in the 'target' field of the
-     * type annotations of this block.
-     *
-     * @param index
-     *            the new index of this try catch block in the method's list of
-     *            try catch block nodes.
-     */
-    public void updateIndex(final int index) {
-        int newTypeRef = 0x42000000 | (index << 8);
-        if (visibleTypeAnnotations != null) {
-            for (TypeAnnotationNode tan : visibleTypeAnnotations) {
-                tan.typeRef = newTypeRef;
-            }
-        }
-        if (invisibleTypeAnnotations != null) {
-            for (TypeAnnotationNode tan : invisibleTypeAnnotations) {
-                tan.typeRef = newTypeRef;
-            }
-        }
-    }
-
-    /**
-     * Makes the given visitor visit this try catch block.
-     *
-     * @param mv
-     *            a method visitor.
-     */
-    public void accept(final MethodVisitor mv) {
-        mv.visitTryCatchBlock(start.getLabel(), end.getLabel(),
-                handler == null ? null : handler.getLabel(), type);
-        int n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations
-                .size();
-        for (int i = 0; i < n; ++i) {
-            TypeAnnotationNode an = visibleTypeAnnotations.get(i);
-            an.accept(mv.visitTryCatchAnnotation(an.typeRef, an.typePath,
-                    an.desc, true));
-        }
-        n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
-                .size();
-        for (int i = 0; i < n; ++i) {
-            TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
-            an.accept(mv.visitTryCatchAnnotation(an.typeRef, an.typePath,
-                    an.desc, false));
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/TypeAnnotationNode.java b/src/asm/scala/tools/asm/tree/TypeAnnotationNode.java
deleted file mode 100644
index 73b2962..0000000
--- a/src/asm/scala/tools/asm/tree/TypeAnnotationNode.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-
-/**
- * A node that represents a type annotationn.
- *
- * @author Eric Bruneton
- */
-public class TypeAnnotationNode extends AnnotationNode {
-
-    /**
-     * A reference to the annotated type. See {@link TypeReference}.
-     */
-    public int typeRef;
-
-    /**
-     * The path to the annotated type argument, wildcard bound, array element
-     * type, or static outer type within the referenced type. May be
-     * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     */
-    public TypePath typePath;
-
-    /**
-     * Constructs a new {@link AnnotationNode}. <i>Subclasses must not use this
-     * constructor</i>. Instead, they must use the
-     * {@link #TypeAnnotationNode(int, int, TypePath, String)} version.
-     *
-     * @param typeRef
-     *            a reference to the annotated type. See {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public TypeAnnotationNode(final int typeRef, final TypePath typePath,
-            final String desc) {
-        this(Opcodes.ASM5, typeRef, typePath, desc);
-        if (getClass() != TypeAnnotationNode.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs a new {@link AnnotationNode}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param typeRef
-     *            a reference to the annotated type. See {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     */
-    public TypeAnnotationNode(final int api, final int typeRef,
-            final TypePath typePath, final String desc) {
-        super(api, desc);
-        this.typeRef = typeRef;
-        this.typePath = typePath;
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/TypeInsnNode.java b/src/asm/scala/tools/asm/tree/TypeInsnNode.java
deleted file mode 100644
index 401400c..0000000
--- a/src/asm/scala/tools/asm/tree/TypeInsnNode.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a type instruction. A type instruction is an
- * instruction that takes a type descriptor as parameter.
- *
- * @author Eric Bruneton
- */
-public class TypeInsnNode extends AbstractInsnNode {
-
-    /**
-     * The operand of this instruction. This operand is an internal name (see
-     * {@link scala.tools.asm.Type}).
-     */
-    public String desc;
-
-    /**
-     * Constructs a new {@link TypeInsnNode}.
-     *
-     * @param opcode
-     *            the opcode of the type instruction to be constructed. This
-     *            opcode must be NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
-     * @param desc
-     *            the operand of the instruction to be constructed. This operand
-     *            is an internal name (see {@link scala.tools.asm.Type}).
-     */
-    public TypeInsnNode(final int opcode, final String desc) {
-        super(opcode);
-        this.desc = desc;
-    }
-
-    /**
-     * Sets the opcode of this instruction.
-     *
-     * @param opcode
-     *            the new instruction opcode. This opcode must be NEW,
-     *            ANEWARRAY, CHECKCAST or INSTANCEOF.
-     */
-    public void setOpcode(final int opcode) {
-        this.opcode = opcode;
-    }
-
-    @Override
-    public int getType() {
-        return TYPE_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitTypeInsn(opcode, desc);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new TypeInsnNode(opcode, desc).cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/VarInsnNode.java b/src/asm/scala/tools/asm/tree/VarInsnNode.java
deleted file mode 100644
index 685e4fc..0000000
--- a/src/asm/scala/tools/asm/tree/VarInsnNode.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a local variable instruction. A local variable
- * instruction is an instruction that loads or stores the value of a local
- * variable.
- *
- * @author Eric Bruneton
- */
-public class VarInsnNode extends AbstractInsnNode {
-
-    /**
-     * The operand of this instruction. This operand is the index of a local
-     * variable.
-     */
-    public int var;
-
-    /**
-     * Constructs a new {@link VarInsnNode}.
-     *
-     * @param opcode
-     *            the opcode of the local variable instruction to be
-     *            constructed. This opcode must be ILOAD, LLOAD, FLOAD, DLOAD,
-     *            ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
-     * @param var
-     *            the operand of the instruction to be constructed. This operand
-     *            is the index of a local variable.
-     */
-    public VarInsnNode(final int opcode, final int var) {
-        super(opcode);
-        this.var = var;
-    }
-
-    /**
-     * Sets the opcode of this instruction.
-     *
-     * @param opcode
-     *            the new instruction opcode. This opcode must be ILOAD, LLOAD,
-     *            FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or
-     *            RET.
-     */
-    public void setOpcode(final int opcode) {
-        this.opcode = opcode;
-    }
-
-    @Override
-    public int getType() {
-        return VAR_INSN;
-    }
-
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitVarInsn(opcode, var);
-        acceptAnnotations(mv);
-    }
-
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new VarInsnNode(opcode, var).cloneAnnotations(this);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/Analyzer.java b/src/asm/scala/tools/asm/tree/analysis/Analyzer.java
deleted file mode 100644
index ff840aa..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/Analyzer.java
+++ /dev/null
@@ -1,549 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-import scala.tools.asm.tree.IincInsnNode;
-import scala.tools.asm.tree.InsnList;
-import scala.tools.asm.tree.JumpInsnNode;
-import scala.tools.asm.tree.LabelNode;
-import scala.tools.asm.tree.LookupSwitchInsnNode;
-import scala.tools.asm.tree.MethodNode;
-import scala.tools.asm.tree.TableSwitchInsnNode;
-import scala.tools.asm.tree.TryCatchBlockNode;
-import scala.tools.asm.tree.VarInsnNode;
-
-/**
- * A semantic bytecode analyzer. <i>This class does not fully check that JSR and
- * RET instructions are valid.</i>
- *
- * @param <V>
- *            type of the Value used for the analysis.
- *
- * @author Eric Bruneton
- */
-public class Analyzer<V extends Value> implements Opcodes {
-
-    private final Interpreter<V> interpreter;
-
-    private int n;
-
-    private InsnList insns;
-
-    private List<TryCatchBlockNode>[] handlers;
-
-    private Frame<V>[] frames;
-
-    private Subroutine[] subroutines;
-
-    private boolean[] queued;
-
-    private int[] queue;
-
-    private int top;
-
-    /**
-     * Constructs a new {@link Analyzer}.
-     *
-     * @param interpreter
-     *            the interpreter to be used to symbolically interpret the
-     *            bytecode instructions.
-     */
-    public Analyzer(final Interpreter<V> interpreter) {
-        this.interpreter = interpreter;
-    }
-
-    /**
-     * Analyzes the given method.
-     *
-     * @param owner
-     *            the internal name of the class to which the method belongs.
-     * @param m
-     *            the method to be analyzed.
-     * @return the symbolic state of the execution stack frame at each bytecode
-     *         instruction of the method. The size of the returned array is
-     *         equal to the number of instructions (and labels) of the method. A
-     *         given frame is <tt>null</tt> if and only if the corresponding
-     *         instruction cannot be reached (dead code).
-     * @throws AnalyzerException
-     *             if a problem occurs during the analysis.
-     */
-    public Frame<V>[] analyze(final String owner, final MethodNode m)
-            throws AnalyzerException {
-        if ((m.access & (ACC_ABSTRACT | ACC_NATIVE)) != 0) {
-            frames = (Frame<V>[]) new Frame<?>[0];
-            return frames;
-        }
-        n = m.instructions.size();
-        insns = m.instructions;
-        handlers = (List<TryCatchBlockNode>[]) new List<?>[n];
-        frames = (Frame<V>[]) new Frame<?>[n];
-        subroutines = new Subroutine[n];
-        queued = new boolean[n];
-        queue = new int[n];
-        top = 0;
-
-        // computes exception handlers for each instruction
-        for (int i = 0; i < m.tryCatchBlocks.size(); ++i) {
-            TryCatchBlockNode tcb = m.tryCatchBlocks.get(i);
-            int begin = insns.indexOf(tcb.start);
-            int end = insns.indexOf(tcb.end);
-            for (int j = begin; j < end; ++j) {
-                List<TryCatchBlockNode> insnHandlers = handlers[j];
-                if (insnHandlers == null) {
-                    insnHandlers = new ArrayList<TryCatchBlockNode>();
-                    handlers[j] = insnHandlers;
-                }
-                insnHandlers.add(tcb);
-            }
-        }
-
-        // computes the subroutine for each instruction:
-        Subroutine main = new Subroutine(null, m.maxLocals, null);
-        List<AbstractInsnNode> subroutineCalls = new ArrayList<AbstractInsnNode>();
-        Map<LabelNode, Subroutine> subroutineHeads = new HashMap<LabelNode, Subroutine>();
-        findSubroutine(0, main, subroutineCalls);
-        while (!subroutineCalls.isEmpty()) {
-            JumpInsnNode jsr = (JumpInsnNode) subroutineCalls.remove(0);
-            Subroutine sub = subroutineHeads.get(jsr.label);
-            if (sub == null) {
-                sub = new Subroutine(jsr.label, m.maxLocals, jsr);
-                subroutineHeads.put(jsr.label, sub);
-                findSubroutine(insns.indexOf(jsr.label), sub, subroutineCalls);
-            } else {
-                sub.callers.add(jsr);
-            }
-        }
-        for (int i = 0; i < n; ++i) {
-            if (subroutines[i] != null && subroutines[i].start == null) {
-                subroutines[i] = null;
-            }
-        }
-
-        // initializes the data structures for the control flow analysis
-        Frame<V> current = newFrame(m.maxLocals, m.maxStack);
-        Frame<V> handler = newFrame(m.maxLocals, m.maxStack);
-        current.setReturn(interpreter.newValue(Type.getReturnType(m.desc)));
-        Type[] args = Type.getArgumentTypes(m.desc);
-        int local = 0;
-        if ((m.access & ACC_STATIC) == 0) {
-            Type ctype = Type.getObjectType(owner);
-            current.setLocal(local++, interpreter.newValue(ctype));
-        }
-        for (int i = 0; i < args.length; ++i) {
-            current.setLocal(local++, interpreter.newValue(args[i]));
-            if (args[i].getSize() == 2) {
-                current.setLocal(local++, interpreter.newValue(null));
-            }
-        }
-        while (local < m.maxLocals) {
-            current.setLocal(local++, interpreter.newValue(null));
-        }
-        merge(0, current, null);
-
-        init(owner, m);
-
-        // control flow analysis
-        while (top > 0) {
-            int insn = queue[--top];
-            Frame<V> f = frames[insn];
-            Subroutine subroutine = subroutines[insn];
-            queued[insn] = false;
-
-            AbstractInsnNode insnNode = null;
-            try {
-                insnNode = m.instructions.get(insn);
-                int insnOpcode = insnNode.getOpcode();
-                int insnType = insnNode.getType();
-
-                if (insnType == AbstractInsnNode.LABEL
-                        || insnType == AbstractInsnNode.LINE
-                        || insnType == AbstractInsnNode.FRAME) {
-                    merge(insn + 1, f, subroutine);
-                    newControlFlowEdge(insn, insn + 1);
-                } else {
-                    current.init(f).execute(insnNode, interpreter);
-                    subroutine = subroutine == null ? null : subroutine.copy();
-
-                    if (insnNode instanceof JumpInsnNode) {
-                        JumpInsnNode j = (JumpInsnNode) insnNode;
-                        if (insnOpcode != GOTO && insnOpcode != JSR) {
-                            merge(insn + 1, current, subroutine);
-                            newControlFlowEdge(insn, insn + 1);
-                        }
-                        int jump = insns.indexOf(j.label);
-                        if (insnOpcode == JSR) {
-                            merge(jump, current, new Subroutine(j.label,
-                                    m.maxLocals, j));
-                        } else {
-                            merge(jump, current, subroutine);
-                        }
-                        newControlFlowEdge(insn, jump);
-                    } else if (insnNode instanceof LookupSwitchInsnNode) {
-                        LookupSwitchInsnNode lsi = (LookupSwitchInsnNode) insnNode;
-                        int jump = insns.indexOf(lsi.dflt);
-                        merge(jump, current, subroutine);
-                        newControlFlowEdge(insn, jump);
-                        for (int j = 0; j < lsi.labels.size(); ++j) {
-                            LabelNode label = lsi.labels.get(j);
-                            jump = insns.indexOf(label);
-                            merge(jump, current, subroutine);
-                            newControlFlowEdge(insn, jump);
-                        }
-                    } else if (insnNode instanceof TableSwitchInsnNode) {
-                        TableSwitchInsnNode tsi = (TableSwitchInsnNode) insnNode;
-                        int jump = insns.indexOf(tsi.dflt);
-                        merge(jump, current, subroutine);
-                        newControlFlowEdge(insn, jump);
-                        for (int j = 0; j < tsi.labels.size(); ++j) {
-                            LabelNode label = tsi.labels.get(j);
-                            jump = insns.indexOf(label);
-                            merge(jump, current, subroutine);
-                            newControlFlowEdge(insn, jump);
-                        }
-                    } else if (insnOpcode == RET) {
-                        if (subroutine == null) {
-                            throw new AnalyzerException(insnNode,
-                                    "RET instruction outside of a sub routine");
-                        }
-                        for (int i = 0; i < subroutine.callers.size(); ++i) {
-                            JumpInsnNode caller = subroutine.callers.get(i);
-                            int call = insns.indexOf(caller);
-                            if (frames[call] != null) {
-                                merge(call + 1, frames[call], current,
-                                        subroutines[call], subroutine.access);
-                                newControlFlowEdge(insn, call + 1);
-                            }
-                        }
-                    } else if (insnOpcode != ATHROW
-                            && (insnOpcode < IRETURN || insnOpcode > RETURN)) {
-                        if (subroutine != null) {
-                            if (insnNode instanceof VarInsnNode) {
-                                int var = ((VarInsnNode) insnNode).var;
-                                subroutine.access[var] = true;
-                                if (insnOpcode == LLOAD || insnOpcode == DLOAD
-                                        || insnOpcode == LSTORE
-                                        || insnOpcode == DSTORE) {
-                                    subroutine.access[var + 1] = true;
-                                }
-                            } else if (insnNode instanceof IincInsnNode) {
-                                int var = ((IincInsnNode) insnNode).var;
-                                subroutine.access[var] = true;
-                            }
-                        }
-                        merge(insn + 1, current, subroutine);
-                        newControlFlowEdge(insn, insn + 1);
-                    }
-                }
-
-                List<TryCatchBlockNode> insnHandlers = handlers[insn];
-                if (insnHandlers != null) {
-                    for (int i = 0; i < insnHandlers.size(); ++i) {
-                        TryCatchBlockNode tcb = insnHandlers.get(i);
-                        Type type;
-                        if (tcb.type == null) {
-                            type = Type.getObjectType("java/lang/Throwable");
-                        } else {
-                            type = Type.getObjectType(tcb.type);
-                        }
-                        int jump = insns.indexOf(tcb.handler);
-                        if (newControlFlowExceptionEdge(insn, tcb)) {
-                            handler.init(f);
-                            handler.clearStack();
-                            handler.push(interpreter.newValue(type));
-                            merge(jump, handler, subroutine);
-                        }
-                    }
-                }
-            } catch (AnalyzerException e) {
-                throw new AnalyzerException(e.node, "Error at instruction "
-                        + insn + ": " + e.getMessage(), e);
-            } catch (Exception e) {
-                throw new AnalyzerException(insnNode, "Error at instruction "
-                        + insn + ": " + e.getMessage(), e);
-            }
-        }
-
-        return frames;
-    }
-
-    private void findSubroutine(int insn, final Subroutine sub,
-            final List<AbstractInsnNode> calls) throws AnalyzerException {
-        while (true) {
-            if (insn < 0 || insn >= n) {
-                throw new AnalyzerException(null,
-                        "Execution can fall off end of the code");
-            }
-            if (subroutines[insn] != null) {
-                return;
-            }
-            subroutines[insn] = sub.copy();
-            AbstractInsnNode node = insns.get(insn);
-
-            // calls findSubroutine recursively on normal successors
-            if (node instanceof JumpInsnNode) {
-                if (node.getOpcode() == JSR) {
-                    // do not follow a JSR, it leads to another subroutine!
-                    calls.add(node);
-                } else {
-                    JumpInsnNode jnode = (JumpInsnNode) node;
-                    findSubroutine(insns.indexOf(jnode.label), sub, calls);
-                }
-            } else if (node instanceof TableSwitchInsnNode) {
-                TableSwitchInsnNode tsnode = (TableSwitchInsnNode) node;
-                findSubroutine(insns.indexOf(tsnode.dflt), sub, calls);
-                for (int i = tsnode.labels.size() - 1; i >= 0; --i) {
-                    LabelNode l = tsnode.labels.get(i);
-                    findSubroutine(insns.indexOf(l), sub, calls);
-                }
-            } else if (node instanceof LookupSwitchInsnNode) {
-                LookupSwitchInsnNode lsnode = (LookupSwitchInsnNode) node;
-                findSubroutine(insns.indexOf(lsnode.dflt), sub, calls);
-                for (int i = lsnode.labels.size() - 1; i >= 0; --i) {
-                    LabelNode l = lsnode.labels.get(i);
-                    findSubroutine(insns.indexOf(l), sub, calls);
-                }
-            }
-
-            // calls findSubroutine recursively on exception handler successors
-            List<TryCatchBlockNode> insnHandlers = handlers[insn];
-            if (insnHandlers != null) {
-                for (int i = 0; i < insnHandlers.size(); ++i) {
-                    TryCatchBlockNode tcb = insnHandlers.get(i);
-                    findSubroutine(insns.indexOf(tcb.handler), sub, calls);
-                }
-            }
-
-            // if insn does not falls through to the next instruction, return.
-            switch (node.getOpcode()) {
-            case GOTO:
-            case RET:
-            case TABLESWITCH:
-            case LOOKUPSWITCH:
-            case IRETURN:
-            case LRETURN:
-            case FRETURN:
-            case DRETURN:
-            case ARETURN:
-            case RETURN:
-            case ATHROW:
-                return;
-            }
-            insn++;
-        }
-    }
-
-    /**
-     * Returns the symbolic stack frame for each instruction of the last
-     * recently analyzed method.
-     *
-     * @return the symbolic state of the execution stack frame at each bytecode
-     *         instruction of the method. The size of the returned array is
-     *         equal to the number of instructions (and labels) of the method. A
-     *         given frame is <tt>null</tt> if the corresponding instruction
-     *         cannot be reached, or if an error occurred during the analysis of
-     *         the method.
-     */
-    public Frame<V>[] getFrames() {
-        return frames;
-    }
-
-    /**
-     * Returns the exception handlers for the given instruction.
-     *
-     * @param insn
-     *            the index of an instruction of the last recently analyzed
-     *            method.
-     * @return a list of {@link TryCatchBlockNode} objects.
-     */
-    public List<TryCatchBlockNode> getHandlers(final int insn) {
-        return handlers[insn];
-    }
-
-    /**
-     * Initializes this analyzer. This method is called just before the
-     * execution of control flow analysis loop in #analyze. The default
-     * implementation of this method does nothing.
-     *
-     * @param owner
-     *            the internal name of the class to which the method belongs.
-     * @param m
-     *            the method to be analyzed.
-     * @throws AnalyzerException
-     *             if a problem occurs.
-     */
-    protected void init(String owner, MethodNode m) throws AnalyzerException {
-    }
-
-    /**
-     * Constructs a new frame with the given size.
-     *
-     * @param nLocals
-     *            the maximum number of local variables of the frame.
-     * @param nStack
-     *            the maximum stack size of the frame.
-     * @return the created frame.
-     */
-    protected Frame<V> newFrame(final int nLocals, final int nStack) {
-        return new Frame<V>(nLocals, nStack);
-    }
-
-    /**
-     * Constructs a new frame that is identical to the given frame.
-     *
-     * @param src
-     *            a frame.
-     * @return the created frame.
-     */
-    protected Frame<V> newFrame(final Frame<? extends V> src) {
-        return new Frame<V>(src);
-    }
-
-    /**
-     * Creates a control flow graph edge. The default implementation of this
-     * method does nothing. It can be overridden in order to construct the
-     * control flow graph of a method (this method is called by the
-     * {@link #analyze analyze} method during its visit of the method's code).
-     *
-     * @param insn
-     *            an instruction index.
-     * @param successor
-     *            index of a successor instruction.
-     */
-    protected void newControlFlowEdge(final int insn, final int successor) {
-    }
-
-    /**
-     * Creates a control flow graph edge corresponding to an exception handler.
-     * The default implementation of this method does nothing. It can be
-     * overridden in order to construct the control flow graph of a method (this
-     * method is called by the {@link #analyze analyze} method during its visit
-     * of the method's code).
-     *
-     * @param insn
-     *            an instruction index.
-     * @param successor
-     *            index of a successor instruction.
-     * @return true if this edge must be considered in the data flow analysis
-     *         performed by this analyzer, or false otherwise. The default
-     *         implementation of this method always returns true.
-     */
-    protected boolean newControlFlowExceptionEdge(final int insn,
-            final int successor) {
-        return true;
-    }
-
-    /**
-     * Creates a control flow graph edge corresponding to an exception handler.
-     * The default implementation of this method delegates to
-     * {@link #newControlFlowExceptionEdge(int, int)
-     * newControlFlowExceptionEdge(int, int)}. It can be overridden in order to
-     * construct the control flow graph of a method (this method is called by
-     * the {@link #analyze analyze} method during its visit of the method's
-     * code).
-     *
-     * @param insn
-     *            an instruction index.
-     * @param tcb
-     *            TryCatchBlockNode corresponding to this edge.
-     * @return true if this edge must be considered in the data flow analysis
-     *         performed by this analyzer, or false otherwise. The default
-     *         implementation of this method delegates to
-     *         {@link #newControlFlowExceptionEdge(int, int)
-     *         newControlFlowExceptionEdge(int, int)}.
-     */
-    protected boolean newControlFlowExceptionEdge(final int insn,
-            final TryCatchBlockNode tcb) {
-        return newControlFlowExceptionEdge(insn, insns.indexOf(tcb.handler));
-    }
-
-    // -------------------------------------------------------------------------
-
-    private void merge(final int insn, final Frame<V> frame,
-            final Subroutine subroutine) throws AnalyzerException {
-        Frame<V> oldFrame = frames[insn];
-        Subroutine oldSubroutine = subroutines[insn];
-        boolean changes;
-
-        if (oldFrame == null) {
-            frames[insn] = newFrame(frame);
-            changes = true;
-        } else {
-            changes = oldFrame.merge(frame, interpreter);
-        }
-
-        if (oldSubroutine == null) {
-            if (subroutine != null) {
-                subroutines[insn] = subroutine.copy();
-                changes = true;
-            }
-        } else {
-            if (subroutine != null) {
-                changes |= oldSubroutine.merge(subroutine);
-            }
-        }
-        if (changes && !queued[insn]) {
-            queued[insn] = true;
-            queue[top++] = insn;
-        }
-    }
-
-    private void merge(final int insn, final Frame<V> beforeJSR,
-            final Frame<V> afterRET, final Subroutine subroutineBeforeJSR,
-            final boolean[] access) throws AnalyzerException {
-        Frame<V> oldFrame = frames[insn];
-        Subroutine oldSubroutine = subroutines[insn];
-        boolean changes;
-
-        afterRET.merge(beforeJSR, access);
-
-        if (oldFrame == null) {
-            frames[insn] = newFrame(afterRET);
-            changes = true;
-        } else {
-            changes = oldFrame.merge(afterRET, interpreter);
-        }
-
-        if (oldSubroutine != null && subroutineBeforeJSR != null) {
-            changes |= oldSubroutine.merge(subroutineBeforeJSR);
-        }
-        if (changes && !queued[insn]) {
-            queued[insn] = true;
-            queue[top++] = insn;
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/AnalyzerException.java b/src/asm/scala/tools/asm/tree/analysis/AnalyzerException.java
deleted file mode 100644
index 52b2a11..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/AnalyzerException.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import scala.tools.asm.tree.AbstractInsnNode;
-
-/**
- * Thrown if a problem occurs during the analysis of a method.
- *
- * @author Bing Ran
- * @author Eric Bruneton
- */
- at SuppressWarnings("serial")
-public class AnalyzerException extends Exception {
-
-    public final AbstractInsnNode node;
-
-    public AnalyzerException(final AbstractInsnNode node, final String msg) {
-        super(msg);
-        this.node = node;
-    }
-
-    public AnalyzerException(final AbstractInsnNode node, final String msg,
-            final Throwable exception) {
-        super(msg, exception);
-        this.node = node;
-    }
-
-    public AnalyzerException(final AbstractInsnNode node, final String msg,
-            final Object expected, final Value encountered) {
-        super((msg == null ? "Expected " : msg + ": expected ") + expected
-                + ", but found " + encountered);
-        this.node = node;
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/BasicInterpreter.java b/src/asm/scala/tools/asm/tree/analysis/BasicInterpreter.java
deleted file mode 100644
index 7d0b7b0..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/BasicInterpreter.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.List;
-
-import scala.tools.asm.Handle;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-import scala.tools.asm.tree.FieldInsnNode;
-import scala.tools.asm.tree.IntInsnNode;
-import scala.tools.asm.tree.InvokeDynamicInsnNode;
-import scala.tools.asm.tree.LdcInsnNode;
-import scala.tools.asm.tree.MethodInsnNode;
-import scala.tools.asm.tree.MultiANewArrayInsnNode;
-import scala.tools.asm.tree.TypeInsnNode;
-
-/**
- * An {@link Interpreter} for {@link BasicValue} values.
- *
- * @author Eric Bruneton
- * @author Bing Ran
- */
-public class BasicInterpreter extends Interpreter<BasicValue> implements
-        Opcodes {
-
-    public BasicInterpreter() {
-        super(ASM5);
-    }
-
-    protected BasicInterpreter(final int api) {
-        super(api);
-    }
-
-    @Override
-    public BasicValue newValue(final Type type) {
-        if (type == null) {
-            return BasicValue.UNINITIALIZED_VALUE;
-        }
-        switch (type.getSort()) {
-        case Type.VOID:
-            return null;
-        case Type.BOOLEAN:
-        case Type.CHAR:
-        case Type.BYTE:
-        case Type.SHORT:
-        case Type.INT:
-            return BasicValue.INT_VALUE;
-        case Type.FLOAT:
-            return BasicValue.FLOAT_VALUE;
-        case Type.LONG:
-            return BasicValue.LONG_VALUE;
-        case Type.DOUBLE:
-            return BasicValue.DOUBLE_VALUE;
-        case Type.ARRAY:
-        case Type.OBJECT:
-            return BasicValue.REFERENCE_VALUE;
-        default:
-            throw new Error("Internal error");
-        }
-    }
-
-    @Override
-    public BasicValue newOperation(final AbstractInsnNode insn)
-            throws AnalyzerException {
-        switch (insn.getOpcode()) {
-        case ACONST_NULL:
-            return newValue(Type.getObjectType("null"));
-        case ICONST_M1:
-        case ICONST_0:
-        case ICONST_1:
-        case ICONST_2:
-        case ICONST_3:
-        case ICONST_4:
-        case ICONST_5:
-            return BasicValue.INT_VALUE;
-        case LCONST_0:
-        case LCONST_1:
-            return BasicValue.LONG_VALUE;
-        case FCONST_0:
-        case FCONST_1:
-        case FCONST_2:
-            return BasicValue.FLOAT_VALUE;
-        case DCONST_0:
-        case DCONST_1:
-            return BasicValue.DOUBLE_VALUE;
-        case BIPUSH:
-        case SIPUSH:
-            return BasicValue.INT_VALUE;
-        case LDC:
-            Object cst = ((LdcInsnNode) insn).cst;
-            if (cst instanceof Integer) {
-                return BasicValue.INT_VALUE;
-            } else if (cst instanceof Float) {
-                return BasicValue.FLOAT_VALUE;
-            } else if (cst instanceof Long) {
-                return BasicValue.LONG_VALUE;
-            } else if (cst instanceof Double) {
-                return BasicValue.DOUBLE_VALUE;
-            } else if (cst instanceof String) {
-                return newValue(Type.getObjectType("java/lang/String"));
-            } else if (cst instanceof Type) {
-                int sort = ((Type) cst).getSort();
-                if (sort == Type.OBJECT || sort == Type.ARRAY) {
-                    return newValue(Type.getObjectType("java/lang/Class"));
-                } else if (sort == Type.METHOD) {
-                    return newValue(Type
-                            .getObjectType("java/lang/invoke/MethodType"));
-                } else {
-                    throw new IllegalArgumentException("Illegal LDC constant "
-                            + cst);
-                }
-            } else if (cst instanceof Handle) {
-                return newValue(Type
-                        .getObjectType("java/lang/invoke/MethodHandle"));
-            } else {
-                throw new IllegalArgumentException("Illegal LDC constant "
-                        + cst);
-            }
-        case JSR:
-            return BasicValue.RETURNADDRESS_VALUE;
-        case GETSTATIC:
-            return newValue(Type.getType(((FieldInsnNode) insn).desc));
-        case NEW:
-            return newValue(Type.getObjectType(((TypeInsnNode) insn).desc));
-        default:
-            throw new Error("Internal error.");
-        }
-    }
-
-    @Override
-    public BasicValue copyOperation(final AbstractInsnNode insn,
-            final BasicValue value) throws AnalyzerException {
-        return value;
-    }
-
-    @Override
-    public BasicValue unaryOperation(final AbstractInsnNode insn,
-            final BasicValue value) throws AnalyzerException {
-        switch (insn.getOpcode()) {
-        case INEG:
-        case IINC:
-        case L2I:
-        case F2I:
-        case D2I:
-        case I2B:
-        case I2C:
-        case I2S:
-            return BasicValue.INT_VALUE;
-        case FNEG:
-        case I2F:
-        case L2F:
-        case D2F:
-            return BasicValue.FLOAT_VALUE;
-        case LNEG:
-        case I2L:
-        case F2L:
-        case D2L:
-            return BasicValue.LONG_VALUE;
-        case DNEG:
-        case I2D:
-        case L2D:
-        case F2D:
-            return BasicValue.DOUBLE_VALUE;
-        case IFEQ:
-        case IFNE:
-        case IFLT:
-        case IFGE:
-        case IFGT:
-        case IFLE:
-        case TABLESWITCH:
-        case LOOKUPSWITCH:
-        case IRETURN:
-        case LRETURN:
-        case FRETURN:
-        case DRETURN:
-        case ARETURN:
-        case PUTSTATIC:
-            return null;
-        case GETFIELD:
-            return newValue(Type.getType(((FieldInsnNode) insn).desc));
-        case NEWARRAY:
-            switch (((IntInsnNode) insn).operand) {
-            case T_BOOLEAN:
-                return newValue(Type.getType("[Z"));
-            case T_CHAR:
-                return newValue(Type.getType("[C"));
-            case T_BYTE:
-                return newValue(Type.getType("[B"));
-            case T_SHORT:
-                return newValue(Type.getType("[S"));
-            case T_INT:
-                return newValue(Type.getType("[I"));
-            case T_FLOAT:
-                return newValue(Type.getType("[F"));
-            case T_DOUBLE:
-                return newValue(Type.getType("[D"));
-            case T_LONG:
-                return newValue(Type.getType("[J"));
-            default:
-                throw new AnalyzerException(insn, "Invalid array type");
-            }
-        case ANEWARRAY:
-            String desc = ((TypeInsnNode) insn).desc;
-            return newValue(Type.getType("[" + Type.getObjectType(desc)));
-        case ARRAYLENGTH:
-            return BasicValue.INT_VALUE;
-        case ATHROW:
-            return null;
-        case CHECKCAST:
-            desc = ((TypeInsnNode) insn).desc;
-            return newValue(Type.getObjectType(desc));
-        case INSTANCEOF:
-            return BasicValue.INT_VALUE;
-        case MONITORENTER:
-        case MONITOREXIT:
-        case IFNULL:
-        case IFNONNULL:
-            return null;
-        default:
-            throw new Error("Internal error.");
-        }
-    }
-
-    @Override
-    public BasicValue binaryOperation(final AbstractInsnNode insn,
-            final BasicValue value1, final BasicValue value2)
-            throws AnalyzerException {
-        switch (insn.getOpcode()) {
-        case IALOAD:
-        case BALOAD:
-        case CALOAD:
-        case SALOAD:
-        case IADD:
-        case ISUB:
-        case IMUL:
-        case IDIV:
-        case IREM:
-        case ISHL:
-        case ISHR:
-        case IUSHR:
-        case IAND:
-        case IOR:
-        case IXOR:
-            return BasicValue.INT_VALUE;
-        case FALOAD:
-        case FADD:
-        case FSUB:
-        case FMUL:
-        case FDIV:
-        case FREM:
-            return BasicValue.FLOAT_VALUE;
-        case LALOAD:
-        case LADD:
-        case LSUB:
-        case LMUL:
-        case LDIV:
-        case LREM:
-        case LSHL:
-        case LSHR:
-        case LUSHR:
-        case LAND:
-        case LOR:
-        case LXOR:
-            return BasicValue.LONG_VALUE;
-        case DALOAD:
-        case DADD:
-        case DSUB:
-        case DMUL:
-        case DDIV:
-        case DREM:
-            return BasicValue.DOUBLE_VALUE;
-        case AALOAD:
-            return BasicValue.REFERENCE_VALUE;
-        case LCMP:
-        case FCMPL:
-        case FCMPG:
-        case DCMPL:
-        case DCMPG:
-            return BasicValue.INT_VALUE;
-        case IF_ICMPEQ:
-        case IF_ICMPNE:
-        case IF_ICMPLT:
-        case IF_ICMPGE:
-        case IF_ICMPGT:
-        case IF_ICMPLE:
-        case IF_ACMPEQ:
-        case IF_ACMPNE:
-        case PUTFIELD:
-            return null;
-        default:
-            throw new Error("Internal error.");
-        }
-    }
-
-    @Override
-    public BasicValue ternaryOperation(final AbstractInsnNode insn,
-            final BasicValue value1, final BasicValue value2,
-            final BasicValue value3) throws AnalyzerException {
-        return null;
-    }
-
-    @Override
-    public BasicValue naryOperation(final AbstractInsnNode insn,
-            final List<? extends BasicValue> values) throws AnalyzerException {
-        int opcode = insn.getOpcode();
-        if (opcode == MULTIANEWARRAY) {
-            return newValue(Type.getType(((MultiANewArrayInsnNode) insn).desc));
-        } else if (opcode == INVOKEDYNAMIC) {
-            return newValue(Type
-                    .getReturnType(((InvokeDynamicInsnNode) insn).desc));
-        } else {
-            return newValue(Type.getReturnType(((MethodInsnNode) insn).desc));
-        }
-    }
-
-    @Override
-    public void returnOperation(final AbstractInsnNode insn,
-            final BasicValue value, final BasicValue expected)
-            throws AnalyzerException {
-    }
-
-    @Override
-    public BasicValue merge(final BasicValue v, final BasicValue w) {
-        if (!v.equals(w)) {
-            return BasicValue.UNINITIALIZED_VALUE;
-        }
-        return v;
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/BasicValue.java b/src/asm/scala/tools/asm/tree/analysis/BasicValue.java
deleted file mode 100644
index 439941f..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/BasicValue.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import scala.tools.asm.Type;
-
-/**
- * A {@link Value} that is represented by its type in a seven types type system.
- * This type system distinguishes the UNINITIALZED, INT, FLOAT, LONG, DOUBLE,
- * REFERENCE and RETURNADDRESS types.
- *
- * @author Eric Bruneton
- */
-public class BasicValue implements Value {
-
-    public static final BasicValue UNINITIALIZED_VALUE = new BasicValue(null);
-
-    public static final BasicValue INT_VALUE = new BasicValue(Type.INT_TYPE);
-
-    public static final BasicValue FLOAT_VALUE = new BasicValue(Type.FLOAT_TYPE);
-
-    public static final BasicValue LONG_VALUE = new BasicValue(Type.LONG_TYPE);
-
-    public static final BasicValue DOUBLE_VALUE = new BasicValue(
-            Type.DOUBLE_TYPE);
-
-    public static final BasicValue REFERENCE_VALUE = new BasicValue(
-            Type.getObjectType("java/lang/Object"));
-
-    public static final BasicValue RETURNADDRESS_VALUE = new BasicValue(
-            Type.VOID_TYPE);
-
-    private final Type type;
-
-    public BasicValue(final Type type) {
-        this.type = type;
-    }
-
-    public Type getType() {
-        return type;
-    }
-
-    public int getSize() {
-        return type == Type.LONG_TYPE || type == Type.DOUBLE_TYPE ? 2 : 1;
-    }
-
-    public boolean isReference() {
-        return type != null
-                && (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY);
-    }
-
-    @Override
-    public boolean equals(final Object value) {
-        if (value == this) {
-            return true;
-        } else if (value instanceof BasicValue) {
-            if (type == null) {
-                return ((BasicValue) value).type == null;
-            } else {
-                return type.equals(((BasicValue) value).type);
-            }
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return type == null ? 0 : type.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        if (this == UNINITIALIZED_VALUE) {
-            return ".";
-        } else if (this == RETURNADDRESS_VALUE) {
-            return "A";
-        } else if (this == REFERENCE_VALUE) {
-            return "R";
-        } else {
-            return type.getDescriptor();
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/BasicVerifier.java b/src/asm/scala/tools/asm/tree/analysis/BasicVerifier.java
deleted file mode 100644
index b852f20..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/BasicVerifier.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.List;
-
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-import scala.tools.asm.tree.FieldInsnNode;
-import scala.tools.asm.tree.InvokeDynamicInsnNode;
-import scala.tools.asm.tree.MethodInsnNode;
-
-/**
- * An extended {@link BasicInterpreter} that checks that bytecode instructions
- * are correctly used.
- *
- * @author Eric Bruneton
- * @author Bing Ran
- */
-public class BasicVerifier extends BasicInterpreter {
-
-    public BasicVerifier() {
-        super(ASM5);
-    }
-
-    protected BasicVerifier(final int api) {
-        super(api);
-    }
-
-    @Override
-    public BasicValue copyOperation(final AbstractInsnNode insn,
-            final BasicValue value) throws AnalyzerException {
-        Value expected;
-        switch (insn.getOpcode()) {
-        case ILOAD:
-        case ISTORE:
-            expected = BasicValue.INT_VALUE;
-            break;
-        case FLOAD:
-        case FSTORE:
-            expected = BasicValue.FLOAT_VALUE;
-            break;
-        case LLOAD:
-        case LSTORE:
-            expected = BasicValue.LONG_VALUE;
-            break;
-        case DLOAD:
-        case DSTORE:
-            expected = BasicValue.DOUBLE_VALUE;
-            break;
-        case ALOAD:
-            if (!value.isReference()) {
-                throw new AnalyzerException(insn, null, "an object reference",
-                        value);
-            }
-            return value;
-        case ASTORE:
-            if (!value.isReference()
-                    && !BasicValue.RETURNADDRESS_VALUE.equals(value)) {
-                throw new AnalyzerException(insn, null,
-                        "an object reference or a return address", value);
-            }
-            return value;
-        default:
-            return value;
-        }
-        if (!expected.equals(value)) {
-            throw new AnalyzerException(insn, null, expected, value);
-        }
-        return value;
-    }
-
-    @Override
-    public BasicValue unaryOperation(final AbstractInsnNode insn,
-            final BasicValue value) throws AnalyzerException {
-        BasicValue expected;
-        switch (insn.getOpcode()) {
-        case INEG:
-        case IINC:
-        case I2F:
-        case I2L:
-        case I2D:
-        case I2B:
-        case I2C:
-        case I2S:
-        case IFEQ:
-        case IFNE:
-        case IFLT:
-        case IFGE:
-        case IFGT:
-        case IFLE:
-        case TABLESWITCH:
-        case LOOKUPSWITCH:
-        case IRETURN:
-        case NEWARRAY:
-        case ANEWARRAY:
-            expected = BasicValue.INT_VALUE;
-            break;
-        case FNEG:
-        case F2I:
-        case F2L:
-        case F2D:
-        case FRETURN:
-            expected = BasicValue.FLOAT_VALUE;
-            break;
-        case LNEG:
-        case L2I:
-        case L2F:
-        case L2D:
-        case LRETURN:
-            expected = BasicValue.LONG_VALUE;
-            break;
-        case DNEG:
-        case D2I:
-        case D2F:
-        case D2L:
-        case DRETURN:
-            expected = BasicValue.DOUBLE_VALUE;
-            break;
-        case GETFIELD:
-            expected = newValue(Type
-                    .getObjectType(((FieldInsnNode) insn).owner));
-            break;
-        case CHECKCAST:
-            if (!value.isReference()) {
-                throw new AnalyzerException(insn, null, "an object reference",
-                        value);
-            }
-            return super.unaryOperation(insn, value);
-        case ARRAYLENGTH:
-            if (!isArrayValue(value)) {
-                throw new AnalyzerException(insn, null, "an array reference",
-                        value);
-            }
-            return super.unaryOperation(insn, value);
-        case ARETURN:
-        case ATHROW:
-        case INSTANCEOF:
-        case MONITORENTER:
-        case MONITOREXIT:
-        case IFNULL:
-        case IFNONNULL:
-            if (!value.isReference()) {
-                throw new AnalyzerException(insn, null, "an object reference",
-                        value);
-            }
-            return super.unaryOperation(insn, value);
-        case PUTSTATIC:
-            expected = newValue(Type.getType(((FieldInsnNode) insn).desc));
-            break;
-        default:
-            throw new Error("Internal error.");
-        }
-        if (!isSubTypeOf(value, expected)) {
-            throw new AnalyzerException(insn, null, expected, value);
-        }
-        return super.unaryOperation(insn, value);
-    }
-
-    @Override
-    public BasicValue binaryOperation(final AbstractInsnNode insn,
-            final BasicValue value1, final BasicValue value2)
-            throws AnalyzerException {
-        BasicValue expected1;
-        BasicValue expected2;
-        switch (insn.getOpcode()) {
-        case IALOAD:
-            expected1 = newValue(Type.getType("[I"));
-            expected2 = BasicValue.INT_VALUE;
-            break;
-        case BALOAD:
-            if (isSubTypeOf(value1, newValue(Type.getType("[Z")))) {
-                expected1 = newValue(Type.getType("[Z"));
-            } else {
-                expected1 = newValue(Type.getType("[B"));
-            }
-            expected2 = BasicValue.INT_VALUE;
-            break;
-        case CALOAD:
-            expected1 = newValue(Type.getType("[C"));
-            expected2 = BasicValue.INT_VALUE;
-            break;
-        case SALOAD:
-            expected1 = newValue(Type.getType("[S"));
-            expected2 = BasicValue.INT_VALUE;
-            break;
-        case LALOAD:
-            expected1 = newValue(Type.getType("[J"));
-            expected2 = BasicValue.INT_VALUE;
-            break;
-        case FALOAD:
-            expected1 = newValue(Type.getType("[F"));
-            expected2 = BasicValue.INT_VALUE;
-            break;
-        case DALOAD:
-            expected1 = newValue(Type.getType("[D"));
-            expected2 = BasicValue.INT_VALUE;
-            break;
-        case AALOAD:
-            expected1 = newValue(Type.getType("[Ljava/lang/Object;"));
-            expected2 = BasicValue.INT_VALUE;
-            break;
-        case IADD:
-        case ISUB:
-        case IMUL:
-        case IDIV:
-        case IREM:
-        case ISHL:
-        case ISHR:
-        case IUSHR:
-        case IAND:
-        case IOR:
-        case IXOR:
-        case IF_ICMPEQ:
-        case IF_ICMPNE:
-        case IF_ICMPLT:
-        case IF_ICMPGE:
-        case IF_ICMPGT:
-        case IF_ICMPLE:
-            expected1 = BasicValue.INT_VALUE;
-            expected2 = BasicValue.INT_VALUE;
-            break;
-        case FADD:
-        case FSUB:
-        case FMUL:
-        case FDIV:
-        case FREM:
-        case FCMPL:
-        case FCMPG:
-            expected1 = BasicValue.FLOAT_VALUE;
-            expected2 = BasicValue.FLOAT_VALUE;
-            break;
-        case LADD:
-        case LSUB:
-        case LMUL:
-        case LDIV:
-        case LREM:
-        case LAND:
-        case LOR:
-        case LXOR:
-        case LCMP:
-            expected1 = BasicValue.LONG_VALUE;
-            expected2 = BasicValue.LONG_VALUE;
-            break;
-        case LSHL:
-        case LSHR:
-        case LUSHR:
-            expected1 = BasicValue.LONG_VALUE;
-            expected2 = BasicValue.INT_VALUE;
-            break;
-        case DADD:
-        case DSUB:
-        case DMUL:
-        case DDIV:
-        case DREM:
-        case DCMPL:
-        case DCMPG:
-            expected1 = BasicValue.DOUBLE_VALUE;
-            expected2 = BasicValue.DOUBLE_VALUE;
-            break;
-        case IF_ACMPEQ:
-        case IF_ACMPNE:
-            expected1 = BasicValue.REFERENCE_VALUE;
-            expected2 = BasicValue.REFERENCE_VALUE;
-            break;
-        case PUTFIELD:
-            FieldInsnNode fin = (FieldInsnNode) insn;
-            expected1 = newValue(Type.getObjectType(fin.owner));
-            expected2 = newValue(Type.getType(fin.desc));
-            break;
-        default:
-            throw new Error("Internal error.");
-        }
-        if (!isSubTypeOf(value1, expected1)) {
-            throw new AnalyzerException(insn, "First argument", expected1,
-                    value1);
-        } else if (!isSubTypeOf(value2, expected2)) {
-            throw new AnalyzerException(insn, "Second argument", expected2,
-                    value2);
-        }
-        if (insn.getOpcode() == AALOAD) {
-            return getElementValue(value1);
-        } else {
-            return super.binaryOperation(insn, value1, value2);
-        }
-    }
-
-    @Override
-    public BasicValue ternaryOperation(final AbstractInsnNode insn,
-            final BasicValue value1, final BasicValue value2,
-            final BasicValue value3) throws AnalyzerException {
-        BasicValue expected1;
-        BasicValue expected3;
-        switch (insn.getOpcode()) {
-        case IASTORE:
-            expected1 = newValue(Type.getType("[I"));
-            expected3 = BasicValue.INT_VALUE;
-            break;
-        case BASTORE:
-            if (isSubTypeOf(value1, newValue(Type.getType("[Z")))) {
-                expected1 = newValue(Type.getType("[Z"));
-            } else {
-                expected1 = newValue(Type.getType("[B"));
-            }
-            expected3 = BasicValue.INT_VALUE;
-            break;
-        case CASTORE:
-            expected1 = newValue(Type.getType("[C"));
-            expected3 = BasicValue.INT_VALUE;
-            break;
-        case SASTORE:
-            expected1 = newValue(Type.getType("[S"));
-            expected3 = BasicValue.INT_VALUE;
-            break;
-        case LASTORE:
-            expected1 = newValue(Type.getType("[J"));
-            expected3 = BasicValue.LONG_VALUE;
-            break;
-        case FASTORE:
-            expected1 = newValue(Type.getType("[F"));
-            expected3 = BasicValue.FLOAT_VALUE;
-            break;
-        case DASTORE:
-            expected1 = newValue(Type.getType("[D"));
-            expected3 = BasicValue.DOUBLE_VALUE;
-            break;
-        case AASTORE:
-            expected1 = value1;
-            expected3 = BasicValue.REFERENCE_VALUE;
-            break;
-        default:
-            throw new Error("Internal error.");
-        }
-        if (!isSubTypeOf(value1, expected1)) {
-            throw new AnalyzerException(insn, "First argument", "a "
-                    + expected1 + " array reference", value1);
-        } else if (!BasicValue.INT_VALUE.equals(value2)) {
-            throw new AnalyzerException(insn, "Second argument",
-                    BasicValue.INT_VALUE, value2);
-        } else if (!isSubTypeOf(value3, expected3)) {
-            throw new AnalyzerException(insn, "Third argument", expected3,
-                    value3);
-        }
-        return null;
-    }
-
-    @Override
-    public BasicValue naryOperation(final AbstractInsnNode insn,
-            final List<? extends BasicValue> values) throws AnalyzerException {
-        int opcode = insn.getOpcode();
-        if (opcode == MULTIANEWARRAY) {
-            for (int i = 0; i < values.size(); ++i) {
-                if (!BasicValue.INT_VALUE.equals(values.get(i))) {
-                    throw new AnalyzerException(insn, null,
-                            BasicValue.INT_VALUE, values.get(i));
-                }
-            }
-        } else {
-            int i = 0;
-            int j = 0;
-            if (opcode != INVOKESTATIC && opcode != INVOKEDYNAMIC) {
-                Type owner = Type.getObjectType(((MethodInsnNode) insn).owner);
-                if (!isSubTypeOf(values.get(i++), newValue(owner))) {
-                    throw new AnalyzerException(insn, "Method owner",
-                            newValue(owner), values.get(0));
-                }
-            }
-            String desc = (opcode == INVOKEDYNAMIC) ? ((InvokeDynamicInsnNode) insn).desc
-                    : ((MethodInsnNode) insn).desc;
-            Type[] args = Type.getArgumentTypes(desc);
-            while (i < values.size()) {
-                BasicValue expected = newValue(args[j++]);
-                BasicValue encountered = values.get(i++);
-                if (!isSubTypeOf(encountered, expected)) {
-                    throw new AnalyzerException(insn, "Argument " + j,
-                            expected, encountered);
-                }
-            }
-        }
-        return super.naryOperation(insn, values);
-    }
-
-    @Override
-    public void returnOperation(final AbstractInsnNode insn,
-            final BasicValue value, final BasicValue expected)
-            throws AnalyzerException {
-        if (!isSubTypeOf(value, expected)) {
-            throw new AnalyzerException(insn, "Incompatible return type",
-                    expected, value);
-        }
-    }
-
-    protected boolean isArrayValue(final BasicValue value) {
-        return value.isReference();
-    }
-
-    protected BasicValue getElementValue(final BasicValue objectArrayValue)
-            throws AnalyzerException {
-        return BasicValue.REFERENCE_VALUE;
-    }
-
-    protected boolean isSubTypeOf(final BasicValue value,
-            final BasicValue expected) {
-        return value.equals(expected);
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/Frame.java b/src/asm/scala/tools/asm/tree/analysis/Frame.java
deleted file mode 100644
index 44a07ee..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/Frame.java
+++ /dev/null
@@ -1,738 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-import scala.tools.asm.tree.IincInsnNode;
-import scala.tools.asm.tree.InvokeDynamicInsnNode;
-import scala.tools.asm.tree.MethodInsnNode;
-import scala.tools.asm.tree.MultiANewArrayInsnNode;
-import scala.tools.asm.tree.VarInsnNode;
-
-/**
- * A symbolic execution stack frame. A stack frame contains a set of local
- * variable slots, and an operand stack. Warning: long and double values are
- * represented by <i>two</i> slots in local variables, and by <i>one</i> slot in
- * the operand stack.
- *
- * @param <V>
- *            type of the Value used for the analysis.
- *
- * @author Eric Bruneton
- */
-public class Frame<V extends Value> {
-
-    /**
-     * The expected return type of the analyzed method, or <tt>null</tt> if the
-     * method returns void.
-     */
-    private V returnValue;
-
-    /**
-     * The local variables and operand stack of this frame.
-     */
-    private V[] values;
-
-    /**
-     * The number of local variables of this frame.
-     */
-    private int locals;
-
-    /**
-     * The number of elements in the operand stack.
-     */
-    private int top;
-
-    /**
-     * Constructs a new frame with the given size.
-     *
-     * @param nLocals
-     *            the maximum number of local variables of the frame.
-     * @param nStack
-     *            the maximum stack size of the frame.
-     */
-    public Frame(final int nLocals, final int nStack) {
-        this.values = (V[]) new Value[nLocals + nStack];
-        this.locals = nLocals;
-    }
-
-    /**
-     * Constructs a new frame that is identical to the given frame.
-     *
-     * @param src
-     *            a frame.
-     */
-    public Frame(final Frame<? extends V> src) {
-        this(src.locals, src.values.length - src.locals);
-        init(src);
-    }
-
-    /**
-     * Copies the state of the given frame into this frame.
-     *
-     * @param src
-     *            a frame.
-     * @return this frame.
-     */
-    public Frame<V> init(final Frame<? extends V> src) {
-        returnValue = src.returnValue;
-        System.arraycopy(src.values, 0, values, 0, values.length);
-        top = src.top;
-        return this;
-    }
-
-    /**
-     * Sets the expected return type of the analyzed method.
-     *
-     * @param v
-     *            the expected return type of the analyzed method, or
-     *            <tt>null</tt> if the method returns void.
-     */
-    public void setReturn(final V v) {
-        returnValue = v;
-    }
-
-    /**
-     * Returns the maximum number of local variables of this frame.
-     *
-     * @return the maximum number of local variables of this frame.
-     */
-    public int getLocals() {
-        return locals;
-    }
-
-    /**
-     * Returns the maximum stack size of this frame.
-     *
-     * @return the maximum stack size of this frame.
-     */
-    public int getMaxStackSize() {
-        return values.length - locals;
-    }
-
-    /**
-     * Returns the value of the given local variable.
-     *
-     * @param i
-     *            a local variable index.
-     * @return the value of the given local variable.
-     * @throws IndexOutOfBoundsException
-     *             if the variable does not exist.
-     */
-    public V getLocal(final int i) throws IndexOutOfBoundsException {
-        if (i >= locals) {
-            throw new IndexOutOfBoundsException(
-                    "Trying to access an inexistant local variable");
-        }
-        return values[i];
-    }
-
-    /**
-     * Sets the value of the given local variable.
-     *
-     * @param i
-     *            a local variable index.
-     * @param value
-     *            the new value of this local variable.
-     * @throws IndexOutOfBoundsException
-     *             if the variable does not exist.
-     */
-    public void setLocal(final int i, final V value)
-            throws IndexOutOfBoundsException {
-        if (i >= locals) {
-            throw new IndexOutOfBoundsException(
-                    "Trying to access an inexistant local variable " + i);
-        }
-        values[i] = value;
-    }
-
-    /**
-     * Returns the number of values in the operand stack of this frame. Long and
-     * double values are treated as single values.
-     *
-     * @return the number of values in the operand stack of this frame.
-     */
-    public int getStackSize() {
-        return top;
-    }
-
-    /**
-     * Returns the value of the given operand stack slot.
-     *
-     * @param i
-     *            the index of an operand stack slot.
-     * @return the value of the given operand stack slot.
-     * @throws IndexOutOfBoundsException
-     *             if the operand stack slot does not exist.
-     */
-    public V getStack(final int i) throws IndexOutOfBoundsException {
-        return values[i + locals];
-    }
-
-    /**
-     * Clears the operand stack of this frame.
-     */
-    public void clearStack() {
-        top = 0;
-    }
-
-    /**
-     * Pops a value from the operand stack of this frame.
-     *
-     * @return the value that has been popped from the stack.
-     * @throws IndexOutOfBoundsException
-     *             if the operand stack is empty.
-     */
-    public V pop() throws IndexOutOfBoundsException {
-        if (top == 0) {
-            throw new IndexOutOfBoundsException(
-                    "Cannot pop operand off an empty stack.");
-        }
-        return values[--top + locals];
-    }
-
-    /**
-     * Pushes a value into the operand stack of this frame.
-     *
-     * @param value
-     *            the value that must be pushed into the stack.
-     * @throws IndexOutOfBoundsException
-     *             if the operand stack is full.
-     */
-    public void push(final V value) throws IndexOutOfBoundsException {
-        if (top + locals >= values.length) {
-            throw new IndexOutOfBoundsException(
-                    "Insufficient maximum stack size.");
-        }
-        values[top++ + locals] = value;
-    }
-
-    public void execute(final AbstractInsnNode insn,
-            final Interpreter<V> interpreter) throws AnalyzerException {
-        V value1, value2, value3, value4;
-        List<V> values;
-        int var;
-
-        switch (insn.getOpcode()) {
-        case Opcodes.NOP:
-            break;
-        case Opcodes.ACONST_NULL:
-        case Opcodes.ICONST_M1:
-        case Opcodes.ICONST_0:
-        case Opcodes.ICONST_1:
-        case Opcodes.ICONST_2:
-        case Opcodes.ICONST_3:
-        case Opcodes.ICONST_4:
-        case Opcodes.ICONST_5:
-        case Opcodes.LCONST_0:
-        case Opcodes.LCONST_1:
-        case Opcodes.FCONST_0:
-        case Opcodes.FCONST_1:
-        case Opcodes.FCONST_2:
-        case Opcodes.DCONST_0:
-        case Opcodes.DCONST_1:
-        case Opcodes.BIPUSH:
-        case Opcodes.SIPUSH:
-        case Opcodes.LDC:
-            push(interpreter.newOperation(insn));
-            break;
-        case Opcodes.ILOAD:
-        case Opcodes.LLOAD:
-        case Opcodes.FLOAD:
-        case Opcodes.DLOAD:
-        case Opcodes.ALOAD:
-            push(interpreter.copyOperation(insn,
-                    getLocal(((VarInsnNode) insn).var)));
-            break;
-        case Opcodes.IALOAD:
-        case Opcodes.LALOAD:
-        case Opcodes.FALOAD:
-        case Opcodes.DALOAD:
-        case Opcodes.AALOAD:
-        case Opcodes.BALOAD:
-        case Opcodes.CALOAD:
-        case Opcodes.SALOAD:
-            value2 = pop();
-            value1 = pop();
-            push(interpreter.binaryOperation(insn, value1, value2));
-            break;
-        case Opcodes.ISTORE:
-        case Opcodes.LSTORE:
-        case Opcodes.FSTORE:
-        case Opcodes.DSTORE:
-        case Opcodes.ASTORE:
-            value1 = interpreter.copyOperation(insn, pop());
-            var = ((VarInsnNode) insn).var;
-            setLocal(var, value1);
-            if (value1.getSize() == 2) {
-                setLocal(var + 1, interpreter.newValue(null));
-            }
-            if (var > 0) {
-                Value local = getLocal(var - 1);
-                if (local != null && local.getSize() == 2) {
-                    setLocal(var - 1, interpreter.newValue(null));
-                }
-            }
-            break;
-        case Opcodes.IASTORE:
-        case Opcodes.LASTORE:
-        case Opcodes.FASTORE:
-        case Opcodes.DASTORE:
-        case Opcodes.AASTORE:
-        case Opcodes.BASTORE:
-        case Opcodes.CASTORE:
-        case Opcodes.SASTORE:
-            value3 = pop();
-            value2 = pop();
-            value1 = pop();
-            interpreter.ternaryOperation(insn, value1, value2, value3);
-            break;
-        case Opcodes.POP:
-            if (pop().getSize() == 2) {
-                throw new AnalyzerException(insn, "Illegal use of POP");
-            }
-            break;
-        case Opcodes.POP2:
-            if (pop().getSize() == 1) {
-                if (pop().getSize() != 1) {
-                    throw new AnalyzerException(insn, "Illegal use of POP2");
-                }
-            }
-            break;
-        case Opcodes.DUP:
-            value1 = pop();
-            if (value1.getSize() != 1) {
-                throw new AnalyzerException(insn, "Illegal use of DUP");
-            }
-            push(value1);
-            push(interpreter.copyOperation(insn, value1));
-            break;
-        case Opcodes.DUP_X1:
-            value1 = pop();
-            value2 = pop();
-            if (value1.getSize() != 1 || value2.getSize() != 1) {
-                throw new AnalyzerException(insn, "Illegal use of DUP_X1");
-            }
-            push(interpreter.copyOperation(insn, value1));
-            push(value2);
-            push(value1);
-            break;
-        case Opcodes.DUP_X2:
-            value1 = pop();
-            if (value1.getSize() == 1) {
-                value2 = pop();
-                if (value2.getSize() == 1) {
-                    value3 = pop();
-                    if (value3.getSize() == 1) {
-                        push(interpreter.copyOperation(insn, value1));
-                        push(value3);
-                        push(value2);
-                        push(value1);
-                        break;
-                    }
-                } else {
-                    push(interpreter.copyOperation(insn, value1));
-                    push(value2);
-                    push(value1);
-                    break;
-                }
-            }
-            throw new AnalyzerException(insn, "Illegal use of DUP_X2");
-        case Opcodes.DUP2:
-            value1 = pop();
-            if (value1.getSize() == 1) {
-                value2 = pop();
-                if (value2.getSize() == 1) {
-                    push(value2);
-                    push(value1);
-                    push(interpreter.copyOperation(insn, value2));
-                    push(interpreter.copyOperation(insn, value1));
-                    break;
-                }
-            } else {
-                push(value1);
-                push(interpreter.copyOperation(insn, value1));
-                break;
-            }
-            throw new AnalyzerException(insn, "Illegal use of DUP2");
-        case Opcodes.DUP2_X1:
-            value1 = pop();
-            if (value1.getSize() == 1) {
-                value2 = pop();
-                if (value2.getSize() == 1) {
-                    value3 = pop();
-                    if (value3.getSize() == 1) {
-                        push(interpreter.copyOperation(insn, value2));
-                        push(interpreter.copyOperation(insn, value1));
-                        push(value3);
-                        push(value2);
-                        push(value1);
-                        break;
-                    }
-                }
-            } else {
-                value2 = pop();
-                if (value2.getSize() == 1) {
-                    push(interpreter.copyOperation(insn, value1));
-                    push(value2);
-                    push(value1);
-                    break;
-                }
-            }
-            throw new AnalyzerException(insn, "Illegal use of DUP2_X1");
-        case Opcodes.DUP2_X2:
-            value1 = pop();
-            if (value1.getSize() == 1) {
-                value2 = pop();
-                if (value2.getSize() == 1) {
-                    value3 = pop();
-                    if (value3.getSize() == 1) {
-                        value4 = pop();
-                        if (value4.getSize() == 1) {
-                            push(interpreter.copyOperation(insn, value2));
-                            push(interpreter.copyOperation(insn, value1));
-                            push(value4);
-                            push(value3);
-                            push(value2);
-                            push(value1);
-                            break;
-                        }
-                    } else {
-                        push(interpreter.copyOperation(insn, value2));
-                        push(interpreter.copyOperation(insn, value1));
-                        push(value3);
-                        push(value2);
-                        push(value1);
-                        break;
-                    }
-                }
-            } else {
-                value2 = pop();
-                if (value2.getSize() == 1) {
-                    value3 = pop();
-                    if (value3.getSize() == 1) {
-                        push(interpreter.copyOperation(insn, value1));
-                        push(value3);
-                        push(value2);
-                        push(value1);
-                        break;
-                    }
-                } else {
-                    push(interpreter.copyOperation(insn, value1));
-                    push(value2);
-                    push(value1);
-                    break;
-                }
-            }
-            throw new AnalyzerException(insn, "Illegal use of DUP2_X2");
-        case Opcodes.SWAP:
-            value2 = pop();
-            value1 = pop();
-            if (value1.getSize() != 1 || value2.getSize() != 1) {
-                throw new AnalyzerException(insn, "Illegal use of SWAP");
-            }
-            push(interpreter.copyOperation(insn, value2));
-            push(interpreter.copyOperation(insn, value1));
-            break;
-        case Opcodes.IADD:
-        case Opcodes.LADD:
-        case Opcodes.FADD:
-        case Opcodes.DADD:
-        case Opcodes.ISUB:
-        case Opcodes.LSUB:
-        case Opcodes.FSUB:
-        case Opcodes.DSUB:
-        case Opcodes.IMUL:
-        case Opcodes.LMUL:
-        case Opcodes.FMUL:
-        case Opcodes.DMUL:
-        case Opcodes.IDIV:
-        case Opcodes.LDIV:
-        case Opcodes.FDIV:
-        case Opcodes.DDIV:
-        case Opcodes.IREM:
-        case Opcodes.LREM:
-        case Opcodes.FREM:
-        case Opcodes.DREM:
-            value2 = pop();
-            value1 = pop();
-            push(interpreter.binaryOperation(insn, value1, value2));
-            break;
-        case Opcodes.INEG:
-        case Opcodes.LNEG:
-        case Opcodes.FNEG:
-        case Opcodes.DNEG:
-            push(interpreter.unaryOperation(insn, pop()));
-            break;
-        case Opcodes.ISHL:
-        case Opcodes.LSHL:
-        case Opcodes.ISHR:
-        case Opcodes.LSHR:
-        case Opcodes.IUSHR:
-        case Opcodes.LUSHR:
-        case Opcodes.IAND:
-        case Opcodes.LAND:
-        case Opcodes.IOR:
-        case Opcodes.LOR:
-        case Opcodes.IXOR:
-        case Opcodes.LXOR:
-            value2 = pop();
-            value1 = pop();
-            push(interpreter.binaryOperation(insn, value1, value2));
-            break;
-        case Opcodes.IINC:
-            var = ((IincInsnNode) insn).var;
-            setLocal(var, interpreter.unaryOperation(insn, getLocal(var)));
-            break;
-        case Opcodes.I2L:
-        case Opcodes.I2F:
-        case Opcodes.I2D:
-        case Opcodes.L2I:
-        case Opcodes.L2F:
-        case Opcodes.L2D:
-        case Opcodes.F2I:
-        case Opcodes.F2L:
-        case Opcodes.F2D:
-        case Opcodes.D2I:
-        case Opcodes.D2L:
-        case Opcodes.D2F:
-        case Opcodes.I2B:
-        case Opcodes.I2C:
-        case Opcodes.I2S:
-            push(interpreter.unaryOperation(insn, pop()));
-            break;
-        case Opcodes.LCMP:
-        case Opcodes.FCMPL:
-        case Opcodes.FCMPG:
-        case Opcodes.DCMPL:
-        case Opcodes.DCMPG:
-            value2 = pop();
-            value1 = pop();
-            push(interpreter.binaryOperation(insn, value1, value2));
-            break;
-        case Opcodes.IFEQ:
-        case Opcodes.IFNE:
-        case Opcodes.IFLT:
-        case Opcodes.IFGE:
-        case Opcodes.IFGT:
-        case Opcodes.IFLE:
-            interpreter.unaryOperation(insn, pop());
-            break;
-        case Opcodes.IF_ICMPEQ:
-        case Opcodes.IF_ICMPNE:
-        case Opcodes.IF_ICMPLT:
-        case Opcodes.IF_ICMPGE:
-        case Opcodes.IF_ICMPGT:
-        case Opcodes.IF_ICMPLE:
-        case Opcodes.IF_ACMPEQ:
-        case Opcodes.IF_ACMPNE:
-            value2 = pop();
-            value1 = pop();
-            interpreter.binaryOperation(insn, value1, value2);
-            break;
-        case Opcodes.GOTO:
-            break;
-        case Opcodes.JSR:
-            push(interpreter.newOperation(insn));
-            break;
-        case Opcodes.RET:
-            break;
-        case Opcodes.TABLESWITCH:
-        case Opcodes.LOOKUPSWITCH:
-            interpreter.unaryOperation(insn, pop());
-            break;
-        case Opcodes.IRETURN:
-        case Opcodes.LRETURN:
-        case Opcodes.FRETURN:
-        case Opcodes.DRETURN:
-        case Opcodes.ARETURN:
-            value1 = pop();
-            interpreter.unaryOperation(insn, value1);
-            interpreter.returnOperation(insn, value1, returnValue);
-            break;
-        case Opcodes.RETURN:
-            if (returnValue != null) {
-                throw new AnalyzerException(insn, "Incompatible return type");
-            }
-            break;
-        case Opcodes.GETSTATIC:
-            push(interpreter.newOperation(insn));
-            break;
-        case Opcodes.PUTSTATIC:
-            interpreter.unaryOperation(insn, pop());
-            break;
-        case Opcodes.GETFIELD:
-            push(interpreter.unaryOperation(insn, pop()));
-            break;
-        case Opcodes.PUTFIELD:
-            value2 = pop();
-            value1 = pop();
-            interpreter.binaryOperation(insn, value1, value2);
-            break;
-        case Opcodes.INVOKEVIRTUAL:
-        case Opcodes.INVOKESPECIAL:
-        case Opcodes.INVOKESTATIC:
-        case Opcodes.INVOKEINTERFACE: {
-            values = new ArrayList<V>();
-            String desc = ((MethodInsnNode) insn).desc;
-            for (int i = Type.getArgumentTypes(desc).length; i > 0; --i) {
-                values.add(0, pop());
-            }
-            if (insn.getOpcode() != Opcodes.INVOKESTATIC) {
-                values.add(0, pop());
-            }
-            if (Type.getReturnType(desc) == Type.VOID_TYPE) {
-                interpreter.naryOperation(insn, values);
-            } else {
-                push(interpreter.naryOperation(insn, values));
-            }
-            break;
-        }
-        case Opcodes.INVOKEDYNAMIC: {
-            values = new ArrayList<V>();
-            String desc = ((InvokeDynamicInsnNode) insn).desc;
-            for (int i = Type.getArgumentTypes(desc).length; i > 0; --i) {
-                values.add(0, pop());
-            }
-            if (Type.getReturnType(desc) == Type.VOID_TYPE) {
-                interpreter.naryOperation(insn, values);
-            } else {
-                push(interpreter.naryOperation(insn, values));
-            }
-            break;
-        }
-        case Opcodes.NEW:
-            push(interpreter.newOperation(insn));
-            break;
-        case Opcodes.NEWARRAY:
-        case Opcodes.ANEWARRAY:
-        case Opcodes.ARRAYLENGTH:
-            push(interpreter.unaryOperation(insn, pop()));
-            break;
-        case Opcodes.ATHROW:
-            interpreter.unaryOperation(insn, pop());
-            break;
-        case Opcodes.CHECKCAST:
-        case Opcodes.INSTANCEOF:
-            push(interpreter.unaryOperation(insn, pop()));
-            break;
-        case Opcodes.MONITORENTER:
-        case Opcodes.MONITOREXIT:
-            interpreter.unaryOperation(insn, pop());
-            break;
-        case Opcodes.MULTIANEWARRAY:
-            values = new ArrayList<V>();
-            for (int i = ((MultiANewArrayInsnNode) insn).dims; i > 0; --i) {
-                values.add(0, pop());
-            }
-            push(interpreter.naryOperation(insn, values));
-            break;
-        case Opcodes.IFNULL:
-        case Opcodes.IFNONNULL:
-            interpreter.unaryOperation(insn, pop());
-            break;
-        default:
-            throw new RuntimeException("Illegal opcode " + insn.getOpcode());
-        }
-    }
-
-    /**
-     * Merges this frame with the given frame.
-     *
-     * @param frame
-     *            a frame.
-     * @param interpreter
-     *            the interpreter used to merge values.
-     * @return <tt>true</tt> if this frame has been changed as a result of the
-     *         merge operation, or <tt>false</tt> otherwise.
-     * @throws AnalyzerException
-     *             if the frames have incompatible sizes.
-     */
-    public boolean merge(final Frame<? extends V> frame,
-            final Interpreter<V> interpreter) throws AnalyzerException {
-        if (top != frame.top) {
-            throw new AnalyzerException(null, "Incompatible stack heights");
-        }
-        boolean changes = false;
-        for (int i = 0; i < locals + top; ++i) {
-            V v = interpreter.merge(values[i], frame.values[i]);
-            if (!v.equals(values[i])) {
-                values[i] = v;
-                changes = true;
-            }
-        }
-        return changes;
-    }
-
-    /**
-     * Merges this frame with the given frame (case of a RET instruction).
-     *
-     * @param frame
-     *            a frame
-     * @param access
-     *            the local variables that have been accessed by the subroutine
-     *            to which the RET instruction corresponds.
-     * @return <tt>true</tt> if this frame has been changed as a result of the
-     *         merge operation, or <tt>false</tt> otherwise.
-     */
-    public boolean merge(final Frame<? extends V> frame, final boolean[] access) {
-        boolean changes = false;
-        for (int i = 0; i < locals; ++i) {
-            if (!access[i] && !values[i].equals(frame.values[i])) {
-                values[i] = frame.values[i];
-                changes = true;
-            }
-        }
-        return changes;
-    }
-
-    /**
-     * Returns a string representation of this frame.
-     *
-     * @return a string representation of this frame.
-     */
-    @Override
-    public String toString() {
-        StringBuffer b = new StringBuffer();
-        for (int i = 0; i < getLocals(); ++i) {
-            b.append(getLocal(i));
-        }
-        b.append(' ');
-        for (int i = 0; i < getStackSize(); ++i) {
-            b.append(getStack(i).toString());
-        }
-        return b.toString();
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/Interpreter.java b/src/asm/scala/tools/asm/tree/analysis/Interpreter.java
deleted file mode 100644
index 00fe6c8..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/Interpreter.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.List;
-
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-
-/**
- * A semantic bytecode interpreter. More precisely, this interpreter only
- * manages the computation of values from other values: it does not manage the
- * transfer of values to or from the stack, and to or from the local variables.
- * This separation allows a generic bytecode {@link Analyzer} to work with
- * various semantic interpreters, without needing to duplicate the code to
- * simulate the transfer of values.
- *
- * @param <V>
- *            type of the Value used for the analysis.
- *
- * @author Eric Bruneton
- */
-public abstract class Interpreter<V extends Value> {
-
-    protected final int api;
-
-    protected Interpreter(final int api) {
-        this.api = api;
-    }
-
-    /**
-     * Creates a new value that represents the given type.
-     *
-     * Called for method parameters (including <code>this</code>), exception
-     * handler variable and with <code>null</code> type for variables reserved
-     * by long and double types.
-     *
-     * @param type
-     *            a primitive or reference type, or <tt>null</tt> to represent
-     *            an uninitialized value.
-     * @return a value that represents the given type. The size of the returned
-     *         value must be equal to the size of the given type.
-     */
-    public abstract V newValue(Type type);
-
-    /**
-     * Interprets a bytecode instruction without arguments. This method is
-     * called for the following opcodes:
-     *
-     * ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4,
-     * ICONST_5, LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0,
-     * DCONST_1, BIPUSH, SIPUSH, LDC, JSR, GETSTATIC, NEW
-     *
-     * @param insn
-     *            the bytecode instruction to be interpreted.
-     * @return the result of the interpretation of the given instruction.
-     * @throws AnalyzerException
-     *             if an error occurred during the interpretation.
-     */
-    public abstract V newOperation(AbstractInsnNode insn)
-            throws AnalyzerException;
-
-    /**
-     * Interprets a bytecode instruction that moves a value on the stack or to
-     * or from local variables. This method is called for the following opcodes:
-     *
-     * ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE,
-     * ASTORE, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP
-     *
-     * @param insn
-     *            the bytecode instruction to be interpreted.
-     * @param value
-     *            the value that must be moved by the instruction.
-     * @return the result of the interpretation of the given instruction. The
-     *         returned value must be <tt>equal</tt> to the given value.
-     * @throws AnalyzerException
-     *             if an error occurred during the interpretation.
-     */
-    public abstract V copyOperation(AbstractInsnNode insn, V value)
-            throws AnalyzerException;
-
-    /**
-     * Interprets a bytecode instruction with a single argument. This method is
-     * called for the following opcodes:
-     *
-     * INEG, LNEG, FNEG, DNEG, IINC, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L,
-     * F2D, D2I, D2L, D2F, I2B, I2C, I2S, IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE,
-     * TABLESWITCH, LOOKUPSWITCH, IRETURN, LRETURN, FRETURN, DRETURN, ARETURN,
-     * PUTSTATIC, GETFIELD, NEWARRAY, ANEWARRAY, ARRAYLENGTH, ATHROW, CHECKCAST,
-     * INSTANCEOF, MONITORENTER, MONITOREXIT, IFNULL, IFNONNULL
-     *
-     * @param insn
-     *            the bytecode instruction to be interpreted.
-     * @param value
-     *            the argument of the instruction to be interpreted.
-     * @return the result of the interpretation of the given instruction.
-     * @throws AnalyzerException
-     *             if an error occurred during the interpretation.
-     */
-    public abstract V unaryOperation(AbstractInsnNode insn, V value)
-            throws AnalyzerException;
-
-    /**
-     * Interprets a bytecode instruction with two arguments. This method is
-     * called for the following opcodes:
-     *
-     * IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IADD,
-     * LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV,
-     * LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, ISHL, LSHL, ISHR, LSHR, IUSHR,
-     * LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, LCMP, FCMPL, FCMPG, DCMPL,
-     * DCMPG, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
-     * IF_ACMPEQ, IF_ACMPNE, PUTFIELD
-     *
-     * @param insn
-     *            the bytecode instruction to be interpreted.
-     * @param value1
-     *            the first argument of the instruction to be interpreted.
-     * @param value2
-     *            the second argument of the instruction to be interpreted.
-     * @return the result of the interpretation of the given instruction.
-     * @throws AnalyzerException
-     *             if an error occurred during the interpretation.
-     */
-    public abstract V binaryOperation(AbstractInsnNode insn, V value1, V value2)
-            throws AnalyzerException;
-
-    /**
-     * Interprets a bytecode instruction with three arguments. This method is
-     * called for the following opcodes:
-     *
-     * IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, SASTORE
-     *
-     * @param insn
-     *            the bytecode instruction to be interpreted.
-     * @param value1
-     *            the first argument of the instruction to be interpreted.
-     * @param value2
-     *            the second argument of the instruction to be interpreted.
-     * @param value3
-     *            the third argument of the instruction to be interpreted.
-     * @return the result of the interpretation of the given instruction.
-     * @throws AnalyzerException
-     *             if an error occurred during the interpretation.
-     */
-    public abstract V ternaryOperation(AbstractInsnNode insn, V value1,
-            V value2, V value3) throws AnalyzerException;
-
-    /**
-     * Interprets a bytecode instruction with a variable number of arguments.
-     * This method is called for the following opcodes:
-     *
-     * INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE,
-     * MULTIANEWARRAY and INVOKEDYNAMIC
-     *
-     * @param insn
-     *            the bytecode instruction to be interpreted.
-     * @param values
-     *            the arguments of the instruction to be interpreted.
-     * @return the result of the interpretation of the given instruction.
-     * @throws AnalyzerException
-     *             if an error occurred during the interpretation.
-     */
-    public abstract V naryOperation(AbstractInsnNode insn,
-            List<? extends V> values) throws AnalyzerException;
-
-    /**
-     * Interprets a bytecode return instruction. This method is called for the
-     * following opcodes:
-     *
-     * IRETURN, LRETURN, FRETURN, DRETURN, ARETURN
-     *
-     * @param insn
-     *            the bytecode instruction to be interpreted.
-     * @param value
-     *            the argument of the instruction to be interpreted.
-     * @param expected
-     *            the expected return type of the analyzed method.
-     * @throws AnalyzerException
-     *             if an error occurred during the interpretation.
-     */
-    public abstract void returnOperation(AbstractInsnNode insn, V value,
-            V expected) throws AnalyzerException;
-
-    /**
-     * Merges two values. The merge operation must return a value that
-     * represents both values (for instance, if the two values are two types,
-     * the merged value must be a common super type of the two types. If the two
-     * values are integer intervals, the merged value must be an interval that
-     * contains the previous ones. Likewise for other types of values).
-     *
-     * @param v
-     *            a value.
-     * @param w
-     *            another value.
-     * @return the merged value. If the merged value is equal to <tt>v</tt>,
-     *         this method <i>must</i> return <tt>v</tt>.
-     */
-    public abstract V merge(V v, V w);
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/SimpleVerifier.java b/src/asm/scala/tools/asm/tree/analysis/SimpleVerifier.java
deleted file mode 100644
index a345981..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/SimpleVerifier.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.List;
-
-import scala.tools.asm.Type;
-
-/**
- * An extended {@link BasicVerifier} that performs more precise verifications.
- * This verifier computes exact class types, instead of using a single "object
- * reference" type (as done in the {@link BasicVerifier}).
- *
- * @author Eric Bruneton
- * @author Bing Ran
- */
-public class SimpleVerifier extends BasicVerifier {
-
-    /**
-     * The class that is verified.
-     */
-    private final Type currentClass;
-
-    /**
-     * The super class of the class that is verified.
-     */
-    private final Type currentSuperClass;
-
-    /**
-     * The interfaces implemented by the class that is verified.
-     */
-    private final List<Type> currentClassInterfaces;
-
-    /**
-     * If the class that is verified is an interface.
-     */
-    private final boolean isInterface;
-
-    /**
-     * The loader to use for referenced classes.
-     */
-    private ClassLoader loader = getClass().getClassLoader();
-
-    /**
-     * Constructs a new {@link SimpleVerifier}.
-     */
-    public SimpleVerifier() {
-        this(null, null, false);
-    }
-
-    /**
-     * Constructs a new {@link SimpleVerifier} to verify a specific class. This
-     * class will not be loaded into the JVM since it may be incorrect.
-     *
-     * @param currentClass
-     *            the class that is verified.
-     * @param currentSuperClass
-     *            the super class of the class that is verified.
-     * @param isInterface
-     *            if the class that is verified is an interface.
-     */
-    public SimpleVerifier(final Type currentClass,
-            final Type currentSuperClass, final boolean isInterface) {
-        this(currentClass, currentSuperClass, null, isInterface);
-    }
-
-    /**
-     * Constructs a new {@link SimpleVerifier} to verify a specific class. This
-     * class will not be loaded into the JVM since it may be incorrect.
-     *
-     * @param currentClass
-     *            the class that is verified.
-     * @param currentSuperClass
-     *            the super class of the class that is verified.
-     * @param currentClassInterfaces
-     *            the interfaces implemented by the class that is verified.
-     * @param isInterface
-     *            if the class that is verified is an interface.
-     */
-    public SimpleVerifier(final Type currentClass,
-            final Type currentSuperClass,
-            final List<Type> currentClassInterfaces, final boolean isInterface) {
-        this(ASM5, currentClass, currentSuperClass, currentClassInterfaces,
-                isInterface);
-    }
-
-    protected SimpleVerifier(final int api, final Type currentClass,
-            final Type currentSuperClass,
-            final List<Type> currentClassInterfaces, final boolean isInterface) {
-        super(api);
-        this.currentClass = currentClass;
-        this.currentSuperClass = currentSuperClass;
-        this.currentClassInterfaces = currentClassInterfaces;
-        this.isInterface = isInterface;
-    }
-
-    /**
-     * Set the <code>ClassLoader</code> which will be used to load referenced
-     * classes. This is useful if you are verifying multiple interdependent
-     * classes.
-     *
-     * @param loader
-     *            a <code>ClassLoader</code> to use
-     */
-    public void setClassLoader(final ClassLoader loader) {
-        this.loader = loader;
-    }
-
-    @Override
-    public BasicValue newValue(final Type type) {
-        if (type == null) {
-            return BasicValue.UNINITIALIZED_VALUE;
-        }
-
-        boolean isArray = type.getSort() == Type.ARRAY;
-        if (isArray) {
-            switch (type.getElementType().getSort()) {
-            case Type.BOOLEAN:
-            case Type.CHAR:
-            case Type.BYTE:
-            case Type.SHORT:
-                return new BasicValue(type);
-            }
-        }
-
-        BasicValue v = super.newValue(type);
-        if (BasicValue.REFERENCE_VALUE.equals(v)) {
-            if (isArray) {
-                v = newValue(type.getElementType());
-                String desc = v.getType().getDescriptor();
-                for (int i = 0; i < type.getDimensions(); ++i) {
-                    desc = '[' + desc;
-                }
-                v = new BasicValue(Type.getType(desc));
-            } else {
-                v = new BasicValue(type);
-            }
-        }
-        return v;
-    }
-
-    @Override
-    protected boolean isArrayValue(final BasicValue value) {
-        Type t = value.getType();
-        return t != null
-                && ("Lnull;".equals(t.getDescriptor()) || t.getSort() == Type.ARRAY);
-    }
-
-    @Override
-    protected BasicValue getElementValue(final BasicValue objectArrayValue)
-            throws AnalyzerException {
-        Type arrayType = objectArrayValue.getType();
-        if (arrayType != null) {
-            if (arrayType.getSort() == Type.ARRAY) {
-                return newValue(Type.getType(arrayType.getDescriptor()
-                        .substring(1)));
-            } else if ("Lnull;".equals(arrayType.getDescriptor())) {
-                return objectArrayValue;
-            }
-        }
-        throw new Error("Internal error");
-    }
-
-    @Override
-    protected boolean isSubTypeOf(final BasicValue value,
-            final BasicValue expected) {
-        Type expectedType = expected.getType();
-        Type type = value.getType();
-        switch (expectedType.getSort()) {
-        case Type.INT:
-        case Type.FLOAT:
-        case Type.LONG:
-        case Type.DOUBLE:
-            return type.equals(expectedType);
-        case Type.ARRAY:
-        case Type.OBJECT:
-            if ("Lnull;".equals(type.getDescriptor())) {
-                return true;
-            } else if (type.getSort() == Type.OBJECT
-                    || type.getSort() == Type.ARRAY) {
-                return isAssignableFrom(expectedType, type);
-            } else {
-                return false;
-            }
-        default:
-            throw new Error("Internal error");
-        }
-    }
-
-    @Override
-    public BasicValue merge(final BasicValue v, final BasicValue w) {
-        if (!v.equals(w)) {
-            Type t = v.getType();
-            Type u = w.getType();
-            if (t != null
-                    && (t.getSort() == Type.OBJECT || t.getSort() == Type.ARRAY)) {
-                if (u != null
-                        && (u.getSort() == Type.OBJECT || u.getSort() == Type.ARRAY)) {
-                    if ("Lnull;".equals(t.getDescriptor())) {
-                        return w;
-                    }
-                    if ("Lnull;".equals(u.getDescriptor())) {
-                        return v;
-                    }
-                    if (isAssignableFrom(t, u)) {
-                        return v;
-                    }
-                    if (isAssignableFrom(u, t)) {
-                        return w;
-                    }
-                    // TODO case of array classes of the same dimension
-                    // TODO should we look also for a common super interface?
-                    // problem: there may be several possible common super
-                    // interfaces
-                    do {
-                        if (t == null || isInterface(t)) {
-                            return BasicValue.REFERENCE_VALUE;
-                        }
-                        t = getSuperClass(t);
-                        if (isAssignableFrom(t, u)) {
-                            return newValue(t);
-                        }
-                    } while (true);
-                }
-            }
-            return BasicValue.UNINITIALIZED_VALUE;
-        }
-        return v;
-    }
-
-    protected boolean isInterface(final Type t) {
-        if (currentClass != null && t.equals(currentClass)) {
-            return isInterface;
-        }
-        return getClass(t).isInterface();
-    }
-
-    protected Type getSuperClass(final Type t) {
-        if (currentClass != null && t.equals(currentClass)) {
-            return currentSuperClass;
-        }
-        Class<?> c = getClass(t).getSuperclass();
-        return c == null ? null : Type.getType(c);
-    }
-
-    protected boolean isAssignableFrom(final Type t, final Type u) {
-        if (t.equals(u)) {
-            return true;
-        }
-        if (currentClass != null && t.equals(currentClass)) {
-            if (getSuperClass(u) == null) {
-                return false;
-            } else {
-                if (isInterface) {
-                    return u.getSort() == Type.OBJECT
-                            || u.getSort() == Type.ARRAY;
-                }
-                return isAssignableFrom(t, getSuperClass(u));
-            }
-        }
-        if (currentClass != null && u.equals(currentClass)) {
-            if (isAssignableFrom(t, currentSuperClass)) {
-                return true;
-            }
-            if (currentClassInterfaces != null) {
-                for (int i = 0; i < currentClassInterfaces.size(); ++i) {
-                    Type v = currentClassInterfaces.get(i);
-                    if (isAssignableFrom(t, v)) {
-                        return true;
-                    }
-                }
-            }
-            return false;
-        }
-        Class<?> tc = getClass(t);
-        if (tc.isInterface()) {
-            tc = Object.class;
-        }
-        return tc.isAssignableFrom(getClass(u));
-    }
-
-    protected Class<?> getClass(final Type t) {
-        try {
-            if (t.getSort() == Type.ARRAY) {
-                return Class.forName(t.getDescriptor().replace('/', '.'),
-                        false, loader);
-            }
-            return Class.forName(t.getClassName(), false, loader);
-        } catch (ClassNotFoundException e) {
-            throw new RuntimeException(e.toString());
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/SmallSet.java b/src/asm/scala/tools/asm/tree/analysis/SmallSet.java
deleted file mode 100644
index 205878d..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/SmallSet.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.AbstractSet;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * A set of at most two elements.
- *
- * @author Eric Bruneton
- */
-class SmallSet<E> extends AbstractSet<E> implements Iterator<E> {
-
-    // if e1 is null, e2 must be null; otherwise e2 must be different from e1
-
-    E e1, e2;
-
-    static final <T> Set<T> emptySet() {
-        return new SmallSet<T>(null, null);
-    }
-
-    SmallSet(final E e1, final E e2) {
-        this.e1 = e1;
-        this.e2 = e2;
-    }
-
-    // -------------------------------------------------------------------------
-    // Implementation of inherited abstract methods
-    // -------------------------------------------------------------------------
-
-    @Override
-    public Iterator<E> iterator() {
-        return new SmallSet<E>(e1, e2);
-    }
-
-    @Override
-    public int size() {
-        return e1 == null ? 0 : (e2 == null ? 1 : 2);
-    }
-
-    // -------------------------------------------------------------------------
-    // Implementation of the Iterator interface
-    // -------------------------------------------------------------------------
-
-    public boolean hasNext() {
-        return e1 != null;
-    }
-
-    public E next() {
-        if (e1 == null) {
-            throw new NoSuchElementException();
-        }
-        E e = e1;
-        e1 = e2;
-        e2 = null;
-        return e;
-    }
-
-    public void remove() {
-    }
-
-    // -------------------------------------------------------------------------
-    // Utility methods
-    // -------------------------------------------------------------------------
-
-    Set<E> union(final SmallSet<E> s) {
-        if ((s.e1 == e1 && s.e2 == e2) || (s.e1 == e2 && s.e2 == e1)) {
-            return this; // if the two sets are equal, return this
-        }
-        if (s.e1 == null) {
-            return this; // if s is empty, return this
-        }
-        if (e1 == null) {
-            return s; // if this is empty, return s
-        }
-        if (s.e2 == null) { // s contains exactly one element
-            if (e2 == null) {
-                return new SmallSet<E>(e1, s.e1); // necessarily e1 != s.e1
-            } else if (s.e1 == e1 || s.e1 == e2) { // s is included in this
-                return this;
-            }
-        }
-        if (e2 == null) { // this contains exactly one element
-            // if (s.e2 == null) { // cannot happen
-            // return new SmallSet(e1, s.e1); // necessarily e1 != s.e1
-            // } else
-            if (e1 == s.e1 || e1 == s.e2) { // this in included in s
-                return s;
-            }
-        }
-        // here we know that there are at least 3 distinct elements
-        HashSet<E> r = new HashSet<E>(4);
-        r.add(e1);
-        if (e2 != null) {
-            r.add(e2);
-        }
-        r.add(s.e1);
-        if (s.e2 != null) {
-            r.add(s.e2);
-        }
-        return r;
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/SourceInterpreter.java b/src/asm/scala/tools/asm/tree/analysis/SourceInterpreter.java
deleted file mode 100644
index 7d739d3..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/SourceInterpreter.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-import scala.tools.asm.tree.FieldInsnNode;
-import scala.tools.asm.tree.InvokeDynamicInsnNode;
-import scala.tools.asm.tree.LdcInsnNode;
-import scala.tools.asm.tree.MethodInsnNode;
-
-/**
- * An {@link Interpreter} for {@link SourceValue} values.
- *
- * @author Eric Bruneton
- */
-public class SourceInterpreter extends Interpreter<SourceValue> implements
-        Opcodes {
-
-    public SourceInterpreter() {
-        super(ASM5);
-    }
-
-    protected SourceInterpreter(final int api) {
-        super(api);
-    }
-
-    @Override
-    public SourceValue newValue(final Type type) {
-        if (type == Type.VOID_TYPE) {
-            return null;
-        }
-        return new SourceValue(type == null ? 1 : type.getSize());
-    }
-
-    @Override
-    public SourceValue newOperation(final AbstractInsnNode insn) {
-        int size;
-        switch (insn.getOpcode()) {
-        case LCONST_0:
-        case LCONST_1:
-        case DCONST_0:
-        case DCONST_1:
-            size = 2;
-            break;
-        case LDC:
-            Object cst = ((LdcInsnNode) insn).cst;
-            size = cst instanceof Long || cst instanceof Double ? 2 : 1;
-            break;
-        case GETSTATIC:
-            size = Type.getType(((FieldInsnNode) insn).desc).getSize();
-            break;
-        default:
-            size = 1;
-        }
-        return new SourceValue(size, insn);
-    }
-
-    @Override
-    public SourceValue copyOperation(final AbstractInsnNode insn,
-            final SourceValue value) {
-        return new SourceValue(value.getSize(), insn);
-    }
-
-    @Override
-    public SourceValue unaryOperation(final AbstractInsnNode insn,
-            final SourceValue value) {
-        int size;
-        switch (insn.getOpcode()) {
-        case LNEG:
-        case DNEG:
-        case I2L:
-        case I2D:
-        case L2D:
-        case F2L:
-        case F2D:
-        case D2L:
-            size = 2;
-            break;
-        case GETFIELD:
-            size = Type.getType(((FieldInsnNode) insn).desc).getSize();
-            break;
-        default:
-            size = 1;
-        }
-        return new SourceValue(size, insn);
-    }
-
-    @Override
-    public SourceValue binaryOperation(final AbstractInsnNode insn,
-            final SourceValue value1, final SourceValue value2) {
-        int size;
-        switch (insn.getOpcode()) {
-        case LALOAD:
-        case DALOAD:
-        case LADD:
-        case DADD:
-        case LSUB:
-        case DSUB:
-        case LMUL:
-        case DMUL:
-        case LDIV:
-        case DDIV:
-        case LREM:
-        case DREM:
-        case LSHL:
-        case LSHR:
-        case LUSHR:
-        case LAND:
-        case LOR:
-        case LXOR:
-            size = 2;
-            break;
-        default:
-            size = 1;
-        }
-        return new SourceValue(size, insn);
-    }
-
-    @Override
-    public SourceValue ternaryOperation(final AbstractInsnNode insn,
-            final SourceValue value1, final SourceValue value2,
-            final SourceValue value3) {
-        return new SourceValue(1, insn);
-    }
-
-    @Override
-    public SourceValue naryOperation(final AbstractInsnNode insn,
-            final List<? extends SourceValue> values) {
-        int size;
-        int opcode = insn.getOpcode();
-        if (opcode == MULTIANEWARRAY) {
-            size = 1;
-        } else {
-            String desc = (opcode == INVOKEDYNAMIC) ? ((InvokeDynamicInsnNode) insn).desc
-                    : ((MethodInsnNode) insn).desc;
-            size = Type.getReturnType(desc).getSize();
-        }
-        return new SourceValue(size, insn);
-    }
-
-    @Override
-    public void returnOperation(final AbstractInsnNode insn,
-            final SourceValue value, final SourceValue expected) {
-    }
-
-    @Override
-    public SourceValue merge(final SourceValue d, final SourceValue w) {
-        if (d.insns instanceof SmallSet && w.insns instanceof SmallSet) {
-            Set<AbstractInsnNode> s = ((SmallSet<AbstractInsnNode>) d.insns)
-                    .union((SmallSet<AbstractInsnNode>) w.insns);
-            if (s == d.insns && d.size == w.size) {
-                return d;
-            } else {
-                return new SourceValue(Math.min(d.size, w.size), s);
-            }
-        }
-        if (d.size != w.size || !d.insns.containsAll(w.insns)) {
-            HashSet<AbstractInsnNode> s = new HashSet<AbstractInsnNode>();
-            s.addAll(d.insns);
-            s.addAll(w.insns);
-            return new SourceValue(Math.min(d.size, w.size), s);
-        }
-        return d;
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/SourceValue.java b/src/asm/scala/tools/asm/tree/analysis/SourceValue.java
deleted file mode 100644
index 40d6b68..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/SourceValue.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.Set;
-
-import scala.tools.asm.tree.AbstractInsnNode;
-
-/**
- * A {@link Value} that is represented by its type in a two types type system.
- * This type system distinguishes the ONEWORD and TWOWORDS types.
- *
- * @author Eric Bruneton
- */
-public class SourceValue implements Value {
-
-    /**
-     * The size of this value.
-     */
-    public final int size;
-
-    /**
-     * The instructions that can produce this value. For example, for the Java
-     * code below, the instructions that can produce the value of <tt>i</tt> at
-     * line 5 are the txo ISTORE instructions at line 1 and 3:
-     *
-     * <pre>
-     * 1: i = 0;
-     * 2: if (...) {
-     * 3:   i = 1;
-     * 4: }
-     * 5: return i;
-     * </pre>
-     *
-     * This field is a set of {@link AbstractInsnNode} objects.
-     */
-    public final Set<AbstractInsnNode> insns;
-
-    public SourceValue(final int size) {
-        this(size, SmallSet.<AbstractInsnNode> emptySet());
-    }
-
-    public SourceValue(final int size, final AbstractInsnNode insn) {
-        this.size = size;
-        this.insns = new SmallSet<AbstractInsnNode>(insn, null);
-    }
-
-    public SourceValue(final int size, final Set<AbstractInsnNode> insns) {
-        this.size = size;
-        this.insns = insns;
-    }
-
-    public int getSize() {
-        return size;
-    }
-
-    @Override
-    public boolean equals(final Object value) {
-        if (!(value instanceof SourceValue)) {
-            return false;
-        }
-        SourceValue v = (SourceValue) value;
-        return size == v.size && insns.equals(v.insns);
-    }
-
-    @Override
-    public int hashCode() {
-        return insns.hashCode();
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/Subroutine.java b/src/asm/scala/tools/asm/tree/analysis/Subroutine.java
deleted file mode 100644
index d734bbd..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/Subroutine.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.asm.tree.JumpInsnNode;
-import scala.tools.asm.tree.LabelNode;
-
-/**
- * A method subroutine (corresponds to a JSR instruction).
- *
- * @author Eric Bruneton
- */
-class Subroutine {
-
-    LabelNode start;
-
-    boolean[] access;
-
-    List<JumpInsnNode> callers;
-
-    private Subroutine() {
-    }
-
-    Subroutine(final LabelNode start, final int maxLocals,
-            final JumpInsnNode caller) {
-        this.start = start;
-        this.access = new boolean[maxLocals];
-        this.callers = new ArrayList<JumpInsnNode>();
-        callers.add(caller);
-    }
-
-    public Subroutine copy() {
-        Subroutine result = new Subroutine();
-        result.start = start;
-        result.access = new boolean[access.length];
-        System.arraycopy(access, 0, result.access, 0, access.length);
-        result.callers = new ArrayList<JumpInsnNode>(callers);
-        return result;
-    }
-
-    public boolean merge(final Subroutine subroutine) throws AnalyzerException {
-        boolean changes = false;
-        for (int i = 0; i < access.length; ++i) {
-            if (subroutine.access[i] && !access[i]) {
-                access[i] = true;
-                changes = true;
-            }
-        }
-        if (subroutine.start == start) {
-            for (int i = 0; i < subroutine.callers.size(); ++i) {
-                JumpInsnNode caller = subroutine.callers.get(i);
-                if (!callers.contains(caller)) {
-                    callers.add(caller);
-                    changes = true;
-                }
-            }
-        }
-        return changes;
-    }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/Value.java b/src/asm/scala/tools/asm/tree/analysis/Value.java
deleted file mode 100644
index 1edf475..0000000
--- a/src/asm/scala/tools/asm/tree/analysis/Value.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-/**
- * An immutable symbolic value for semantic interpretation of bytecode.
- *
- * @author Eric Bruneton
- */
-public interface Value {
-
-    /**
-     * Returns the size of this value in words.
-     *
-     * @return either 1 or 2.
-     */
-    int getSize();
-}
diff --git a/src/asm/scala/tools/asm/util/ASMifiable.java b/src/asm/scala/tools/asm/util/ASMifiable.java
deleted file mode 100644
index 95cc6e3..0000000
--- a/src/asm/scala/tools/asm/util/ASMifiable.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.util.Map;
-
-import scala.tools.asm.Label;
-
-/**
- * An {@link scala.tools.asm.Attribute Attribute} that can print the ASM code
- * to create an equivalent attribute.
- *
- * @author Eugene Kuleshov
- */
-public interface ASMifiable {
-
-    /**
-     * Prints the ASM code to create an attribute equal to this attribute.
-     *
-     * @param buf
-     *            a buffer used for printing Java code.
-     * @param varName
-     *            name of the variable in a printed code used to store attribute
-     *            instance.
-     * @param labelNames
-     *            map of label instances to their names.
-     */
-    void asmify(StringBuffer buf, String varName, Map<Label, String> labelNames);
-}
diff --git a/src/asm/scala/tools/asm/util/ASMifier.java b/src/asm/scala/tools/asm/util/ASMifier.java
deleted file mode 100644
index 521e075..0000000
--- a/src/asm/scala/tools/asm/util/ASMifier.java
+++ /dev/null
@@ -1,1284 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.FileInputStream;
-import java.io.PrintWriter;
-import java.util.HashMap;
-import java.util.Map;
-
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassReader;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.TypePath;
-
-/**
- * A {@link Printer} that prints the ASM code to generate the classes if visits.
- *
- * @author Eric Bruneton
- */
-public class ASMifier extends Printer {
-
-    /**
-     * The name of the visitor variable in the produced code.
-     */
-    protected final String name;
-
-    /**
-     * Identifier of the annotation visitor variable in the produced code.
-     */
-    protected final int id;
-
-    /**
-     * The label names. This map associates String values to Label keys. It is
-     * used only in ASMifierMethodVisitor.
-     */
-    protected Map<Label, String> labelNames;
-
-    /**
-     * Pseudo access flag used to distinguish class access flags.
-     */
-    private static final int ACCESS_CLASS = 262144;
-
-    /**
-     * Pseudo access flag used to distinguish field access flags.
-     */
-    private static final int ACCESS_FIELD = 524288;
-
-    /**
-     * Pseudo access flag used to distinguish inner class flags.
-     */
-    private static final int ACCESS_INNER = 1048576;
-
-    /**
-     * Constructs a new {@link ASMifier}. <i>Subclasses must not use this
-     * constructor</i>. Instead, they must use the
-     * {@link #ASMifier(int, String, int)} version.
-     *
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public ASMifier() {
-        this(Opcodes.ASM5, "cw", 0);
-        if (getClass() != ASMifier.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs a new {@link ASMifier}.
-     *
-     * @param api
-     *            the ASM API version implemented by this class. Must be one of
-     *            {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param name
-     *            the name of the visitor variable in the produced code.
-     * @param id
-     *            identifier of the annotation visitor variable in the produced
-     *            code.
-     */
-    protected ASMifier(final int api, final String name, final int id) {
-        super(api);
-        this.name = name;
-        this.id = id;
-    }
-
-    /**
-     * Prints the ASM source code to generate the given class to the standard
-     * output.
-     * <p>
-     * Usage: ASMifier [-debug] <binary class name or class file name>
-     *
-     * @param args
-     *            the command line arguments.
-     *
-     * @throws Exception
-     *             if the class cannot be found, or if an IO exception occurs.
-     */
-    public static void main(final String[] args) throws Exception {
-        int i = 0;
-        int flags = ClassReader.SKIP_DEBUG;
-
-        boolean ok = true;
-        if (args.length < 1 || args.length > 2) {
-            ok = false;
-        }
-        if (ok && "-debug".equals(args[0])) {
-            i = 1;
-            flags = 0;
-            if (args.length != 2) {
-                ok = false;
-            }
-        }
-        if (!ok) {
-            System.err
-                    .println("Prints the ASM code to generate the given class.");
-            System.err.println("Usage: ASMifier [-debug] "
-                    + "<fully qualified class name or class file name>");
-            return;
-        }
-        ClassReader cr;
-        if (args[i].endsWith(".class") || args[i].indexOf('\\') > -1
-                || args[i].indexOf('/') > -1) {
-            cr = new ClassReader(new FileInputStream(args[i]));
-        } else {
-            cr = new ClassReader(args[i]);
-        }
-        cr.accept(new TraceClassVisitor(null, new ASMifier(), new PrintWriter(
-                System.out)), flags);
-    }
-
-    // ------------------------------------------------------------------------
-    // Classes
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visit(final int version, final int access, final String name,
-            final String signature, final String superName,
-            final String[] interfaces) {
-        String simpleName;
-        int n = name.lastIndexOf('/');
-        if (n == -1) {
-            simpleName = name;
-        } else {
-            text.add("package asm." + name.substring(0, n).replace('/', '.')
-                    + ";\n");
-            simpleName = name.substring(n + 1);
-        }
-        text.add("import java.util.*;\n");
-        text.add("import scala.tools.asm.*;\n");
-        text.add("public class " + simpleName + "Dump implements Opcodes {\n\n");
-        text.add("public static byte[] dump () throws Exception {\n\n");
-        text.add("ClassWriter cw = new ClassWriter(0);\n");
-        text.add("FieldVisitor fv;\n");
-        text.add("MethodVisitor mv;\n");
-        text.add("AnnotationVisitor av0;\n\n");
-
-        buf.setLength(0);
-        buf.append("cw.visit(");
-        switch (version) {
-        case Opcodes.V1_1:
-            buf.append("V1_1");
-            break;
-        case Opcodes.V1_2:
-            buf.append("V1_2");
-            break;
-        case Opcodes.V1_3:
-            buf.append("V1_3");
-            break;
-        case Opcodes.V1_4:
-            buf.append("V1_4");
-            break;
-        case Opcodes.V1_5:
-            buf.append("V1_5");
-            break;
-        case Opcodes.V1_6:
-            buf.append("V1_6");
-            break;
-        case Opcodes.V1_7:
-            buf.append("V1_7");
-            break;
-        default:
-            buf.append(version);
-            break;
-        }
-        buf.append(", ");
-        appendAccess(access | ACCESS_CLASS);
-        buf.append(", ");
-        appendConstant(name);
-        buf.append(", ");
-        appendConstant(signature);
-        buf.append(", ");
-        appendConstant(superName);
-        buf.append(", ");
-        if (interfaces != null && interfaces.length > 0) {
-            buf.append("new String[] {");
-            for (int i = 0; i < interfaces.length; ++i) {
-                buf.append(i == 0 ? " " : ", ");
-                appendConstant(interfaces[i]);
-            }
-            buf.append(" }");
-        } else {
-            buf.append("null");
-        }
-        buf.append(");\n\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitSource(final String file, final String debug) {
-        buf.setLength(0);
-        buf.append("cw.visitSource(");
-        appendConstant(file);
-        buf.append(", ");
-        appendConstant(debug);
-        buf.append(");\n\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitOuterClass(final String owner, final String name,
-            final String desc) {
-        buf.setLength(0);
-        buf.append("cw.visitOuterClass(");
-        appendConstant(owner);
-        buf.append(", ");
-        appendConstant(name);
-        buf.append(", ");
-        appendConstant(desc);
-        buf.append(");\n\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public ASMifier visitClassAnnotation(final String desc,
-            final boolean visible) {
-        return visitAnnotation(desc, visible);
-    }
-
-    @Override
-    public ASMifier visitClassTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        return visitTypeAnnotation(typeRef, typePath, desc, visible);
-    }
-
-    @Override
-    public void visitClassAttribute(final Attribute attr) {
-        visitAttribute(attr);
-    }
-
-    @Override
-    public void visitInnerClass(final String name, final String outerName,
-            final String innerName, final int access) {
-        buf.setLength(0);
-        buf.append("cw.visitInnerClass(");
-        appendConstant(name);
-        buf.append(", ");
-        appendConstant(outerName);
-        buf.append(", ");
-        appendConstant(innerName);
-        buf.append(", ");
-        appendAccess(access | ACCESS_INNER);
-        buf.append(");\n\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public ASMifier visitField(final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        buf.setLength(0);
-        buf.append("{\n");
-        buf.append("fv = cw.visitField(");
-        appendAccess(access | ACCESS_FIELD);
-        buf.append(", ");
-        appendConstant(name);
-        buf.append(", ");
-        appendConstant(desc);
-        buf.append(", ");
-        appendConstant(signature);
-        buf.append(", ");
-        appendConstant(value);
-        buf.append(");\n");
-        text.add(buf.toString());
-        ASMifier a = createASMifier("fv", 0);
-        text.add(a.getText());
-        text.add("}\n");
-        return a;
-    }
-
-    @Override
-    public ASMifier visitMethod(final int access, final String name,
-            final String desc, final String signature, final String[] exceptions) {
-        buf.setLength(0);
-        buf.append("{\n");
-        buf.append("mv = cw.visitMethod(");
-        appendAccess(access);
-        buf.append(", ");
-        appendConstant(name);
-        buf.append(", ");
-        appendConstant(desc);
-        buf.append(", ");
-        appendConstant(signature);
-        buf.append(", ");
-        if (exceptions != null && exceptions.length > 0) {
-            buf.append("new String[] {");
-            for (int i = 0; i < exceptions.length; ++i) {
-                buf.append(i == 0 ? " " : ", ");
-                appendConstant(exceptions[i]);
-            }
-            buf.append(" }");
-        } else {
-            buf.append("null");
-        }
-        buf.append(");\n");
-        text.add(buf.toString());
-        ASMifier a = createASMifier("mv", 0);
-        text.add(a.getText());
-        text.add("}\n");
-        return a;
-    }
-
-    @Override
-    public void visitClassEnd() {
-        text.add("cw.visitEnd();\n\n");
-        text.add("return cw.toByteArray();\n");
-        text.add("}\n");
-        text.add("}\n");
-    }
-
-    // ------------------------------------------------------------------------
-    // Annotations
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visit(final String name, final Object value) {
-        buf.setLength(0);
-        buf.append("av").append(id).append(".visit(");
-        appendConstant(buf, name);
-        buf.append(", ");
-        appendConstant(buf, value);
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitEnum(final String name, final String desc,
-            final String value) {
-        buf.setLength(0);
-        buf.append("av").append(id).append(".visitEnum(");
-        appendConstant(buf, name);
-        buf.append(", ");
-        appendConstant(buf, desc);
-        buf.append(", ");
-        appendConstant(buf, value);
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public ASMifier visitAnnotation(final String name, final String desc) {
-        buf.setLength(0);
-        buf.append("{\n");
-        buf.append("AnnotationVisitor av").append(id + 1).append(" = av");
-        buf.append(id).append(".visitAnnotation(");
-        appendConstant(buf, name);
-        buf.append(", ");
-        appendConstant(buf, desc);
-        buf.append(");\n");
-        text.add(buf.toString());
-        ASMifier a = createASMifier("av", id + 1);
-        text.add(a.getText());
-        text.add("}\n");
-        return a;
-    }
-
-    @Override
-    public ASMifier visitArray(final String name) {
-        buf.setLength(0);
-        buf.append("{\n");
-        buf.append("AnnotationVisitor av").append(id + 1).append(" = av");
-        buf.append(id).append(".visitArray(");
-        appendConstant(buf, name);
-        buf.append(");\n");
-        text.add(buf.toString());
-        ASMifier a = createASMifier("av", id + 1);
-        text.add(a.getText());
-        text.add("}\n");
-        return a;
-    }
-
-    @Override
-    public void visitAnnotationEnd() {
-        buf.setLength(0);
-        buf.append("av").append(id).append(".visitEnd();\n");
-        text.add(buf.toString());
-    }
-
-    // ------------------------------------------------------------------------
-    // Fields
-    // ------------------------------------------------------------------------
-
-    @Override
-    public ASMifier visitFieldAnnotation(final String desc,
-            final boolean visible) {
-        return visitAnnotation(desc, visible);
-    }
-
-    @Override
-    public ASMifier visitFieldTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        return visitTypeAnnotation(typeRef, typePath, desc, visible);
-    }
-
-    @Override
-    public void visitFieldAttribute(final Attribute attr) {
-        visitAttribute(attr);
-    }
-
-    @Override
-    public void visitFieldEnd() {
-        buf.setLength(0);
-        buf.append(name).append(".visitEnd();\n");
-        text.add(buf.toString());
-    }
-
-    // ------------------------------------------------------------------------
-    // Methods
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visitParameter(String parameterName, int access) {
-        buf.setLength(0);
-        buf.append(name).append(".visitParameter(");
-        appendString(buf, parameterName);
-        buf.append(", ");
-        appendAccess(access);
-        text.add(buf.append(");\n").toString());
-    }
-
-    @Override
-    public ASMifier visitAnnotationDefault() {
-        buf.setLength(0);
-        buf.append("{\n").append("av0 = ").append(name)
-                .append(".visitAnnotationDefault();\n");
-        text.add(buf.toString());
-        ASMifier a = createASMifier("av", 0);
-        text.add(a.getText());
-        text.add("}\n");
-        return a;
-    }
-
-    @Override
-    public ASMifier visitMethodAnnotation(final String desc,
-            final boolean visible) {
-        return visitAnnotation(desc, visible);
-    }
-
-    @Override
-    public ASMifier visitMethodTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        return visitTypeAnnotation(typeRef, typePath, desc, visible);
-    }
-
-    @Override
-    public ASMifier visitParameterAnnotation(final int parameter,
-            final String desc, final boolean visible) {
-        buf.setLength(0);
-        buf.append("{\n").append("av0 = ").append(name)
-                .append(".visitParameterAnnotation(").append(parameter)
-                .append(", ");
-        appendConstant(desc);
-        buf.append(", ").append(visible).append(");\n");
-        text.add(buf.toString());
-        ASMifier a = createASMifier("av", 0);
-        text.add(a.getText());
-        text.add("}\n");
-        return a;
-    }
-
-    @Override
-    public void visitMethodAttribute(final Attribute attr) {
-        visitAttribute(attr);
-    }
-
-    @Override
-    public void visitCode() {
-        text.add(name + ".visitCode();\n");
-    }
-
-    @Override
-    public void visitFrame(final int type, final int nLocal,
-            final Object[] local, final int nStack, final Object[] stack) {
-        buf.setLength(0);
-        switch (type) {
-        case Opcodes.F_NEW:
-        case Opcodes.F_FULL:
-            declareFrameTypes(nLocal, local);
-            declareFrameTypes(nStack, stack);
-            if (type == Opcodes.F_NEW) {
-                buf.append(name).append(".visitFrame(Opcodes.F_NEW, ");
-            } else {
-                buf.append(name).append(".visitFrame(Opcodes.F_FULL, ");
-            }
-            buf.append(nLocal).append(", new Object[] {");
-            appendFrameTypes(nLocal, local);
-            buf.append("}, ").append(nStack).append(", new Object[] {");
-            appendFrameTypes(nStack, stack);
-            buf.append('}');
-            break;
-        case Opcodes.F_APPEND:
-            declareFrameTypes(nLocal, local);
-            buf.append(name).append(".visitFrame(Opcodes.F_APPEND,")
-                    .append(nLocal).append(", new Object[] {");
-            appendFrameTypes(nLocal, local);
-            buf.append("}, 0, null");
-            break;
-        case Opcodes.F_CHOP:
-            buf.append(name).append(".visitFrame(Opcodes.F_CHOP,")
-                    .append(nLocal).append(", null, 0, null");
-            break;
-        case Opcodes.F_SAME:
-            buf.append(name).append(
-                    ".visitFrame(Opcodes.F_SAME, 0, null, 0, null");
-            break;
-        case Opcodes.F_SAME1:
-            declareFrameTypes(1, stack);
-            buf.append(name).append(
-                    ".visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {");
-            appendFrameTypes(1, stack);
-            buf.append('}');
-            break;
-        }
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitInsn(final int opcode) {
-        buf.setLength(0);
-        buf.append(name).append(".visitInsn(").append(OPCODES[opcode])
-                .append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitIntInsn(final int opcode, final int operand) {
-        buf.setLength(0);
-        buf.append(name)
-                .append(".visitIntInsn(")
-                .append(OPCODES[opcode])
-                .append(", ")
-                .append(opcode == Opcodes.NEWARRAY ? TYPES[operand] : Integer
-                        .toString(operand)).append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitVarInsn(final int opcode, final int var) {
-        buf.setLength(0);
-        buf.append(name).append(".visitVarInsn(").append(OPCODES[opcode])
-                .append(", ").append(var).append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitTypeInsn(final int opcode, final String type) {
-        buf.setLength(0);
-        buf.append(name).append(".visitTypeInsn(").append(OPCODES[opcode])
-                .append(", ");
-        appendConstant(type);
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitFieldInsn(final int opcode, final String owner,
-            final String name, final String desc) {
-        buf.setLength(0);
-        buf.append(this.name).append(".visitFieldInsn(")
-                .append(OPCODES[opcode]).append(", ");
-        appendConstant(owner);
-        buf.append(", ");
-        appendConstant(name);
-        buf.append(", ");
-        appendConstant(desc);
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Deprecated
-    @Override
-    public void visitMethodInsn(final int opcode, final String owner,
-            final String name, final String desc) {
-        if (api >= Opcodes.ASM5) {
-            super.visitMethodInsn(opcode, owner, name, desc);
-            return;
-        }
-        doVisitMethodInsn(opcode, owner, name, desc,
-                opcode == Opcodes.INVOKEINTERFACE);
-    }
-
-    @Override
-    public void visitMethodInsn(final int opcode, final String owner,
-            final String name, final String desc, final boolean itf) {
-        if (api < Opcodes.ASM5) {
-            super.visitMethodInsn(opcode, owner, name, desc, itf);
-            return;
-        }
-        doVisitMethodInsn(opcode, owner, name, desc, itf);
-    }
-
-    private void doVisitMethodInsn(final int opcode, final String owner,
-            final String name, final String desc, final boolean itf) {
-        buf.setLength(0);
-        buf.append(this.name).append(".visitMethodInsn(")
-                .append(OPCODES[opcode]).append(", ");
-        appendConstant(owner);
-        buf.append(", ");
-        appendConstant(name);
-        buf.append(", ");
-        appendConstant(desc);
-        buf.append(", ");
-        buf.append(itf ? "true" : "false");
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
-            Object... bsmArgs) {
-        buf.setLength(0);
-        buf.append(this.name).append(".visitInvokeDynamicInsn(");
-        appendConstant(name);
-        buf.append(", ");
-        appendConstant(desc);
-        buf.append(", ");
-        appendConstant(bsm);
-        buf.append(", new Object[]{");
-        for (int i = 0; i < bsmArgs.length; ++i) {
-            appendConstant(bsmArgs[i]);
-            if (i != bsmArgs.length - 1) {
-                buf.append(", ");
-            }
-        }
-        buf.append("});\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitJumpInsn(final int opcode, final Label label) {
-        buf.setLength(0);
-        declareLabel(label);
-        buf.append(name).append(".visitJumpInsn(").append(OPCODES[opcode])
-                .append(", ");
-        appendLabel(label);
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitLabel(final Label label) {
-        buf.setLength(0);
-        declareLabel(label);
-        buf.append(name).append(".visitLabel(");
-        appendLabel(label);
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitLdcInsn(final Object cst) {
-        buf.setLength(0);
-        buf.append(name).append(".visitLdcInsn(");
-        appendConstant(cst);
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitIincInsn(final int var, final int increment) {
-        buf.setLength(0);
-        buf.append(name).append(".visitIincInsn(").append(var).append(", ")
-                .append(increment).append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitTableSwitchInsn(final int min, final int max,
-            final Label dflt, final Label... labels) {
-        buf.setLength(0);
-        for (int i = 0; i < labels.length; ++i) {
-            declareLabel(labels[i]);
-        }
-        declareLabel(dflt);
-
-        buf.append(name).append(".visitTableSwitchInsn(").append(min)
-                .append(", ").append(max).append(", ");
-        appendLabel(dflt);
-        buf.append(", new Label[] {");
-        for (int i = 0; i < labels.length; ++i) {
-            buf.append(i == 0 ? " " : ", ");
-            appendLabel(labels[i]);
-        }
-        buf.append(" });\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
-            final Label[] labels) {
-        buf.setLength(0);
-        for (int i = 0; i < labels.length; ++i) {
-            declareLabel(labels[i]);
-        }
-        declareLabel(dflt);
-
-        buf.append(name).append(".visitLookupSwitchInsn(");
-        appendLabel(dflt);
-        buf.append(", new int[] {");
-        for (int i = 0; i < keys.length; ++i) {
-            buf.append(i == 0 ? " " : ", ").append(keys[i]);
-        }
-        buf.append(" }, new Label[] {");
-        for (int i = 0; i < labels.length; ++i) {
-            buf.append(i == 0 ? " " : ", ");
-            appendLabel(labels[i]);
-        }
-        buf.append(" });\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitMultiANewArrayInsn(final String desc, final int dims) {
-        buf.setLength(0);
-        buf.append(name).append(".visitMultiANewArrayInsn(");
-        appendConstant(desc);
-        buf.append(", ").append(dims).append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public ASMifier visitInsnAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        return visitTypeAnnotation("visitInsnAnnotation", typeRef, typePath,
-                desc, visible);
-    }
-
-    @Override
-    public void visitTryCatchBlock(final Label start, final Label end,
-            final Label handler, final String type) {
-        buf.setLength(0);
-        declareLabel(start);
-        declareLabel(end);
-        declareLabel(handler);
-        buf.append(name).append(".visitTryCatchBlock(");
-        appendLabel(start);
-        buf.append(", ");
-        appendLabel(end);
-        buf.append(", ");
-        appendLabel(handler);
-        buf.append(", ");
-        appendConstant(type);
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public ASMifier visitTryCatchAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        return visitTypeAnnotation("visitTryCatchAnnotation", typeRef,
-                typePath, desc, visible);
-    }
-
-    @Override
-    public void visitLocalVariable(final String name, final String desc,
-            final String signature, final Label start, final Label end,
-            final int index) {
-        buf.setLength(0);
-        buf.append(this.name).append(".visitLocalVariable(");
-        appendConstant(name);
-        buf.append(", ");
-        appendConstant(desc);
-        buf.append(", ");
-        appendConstant(signature);
-        buf.append(", ");
-        appendLabel(start);
-        buf.append(", ");
-        appendLabel(end);
-        buf.append(", ").append(index).append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public Printer visitLocalVariableAnnotation(int typeRef, TypePath typePath,
-            Label[] start, Label[] end, int[] index, String desc,
-            boolean visible) {
-        buf.setLength(0);
-        buf.append("{\n").append("av0 = ").append(name)
-                .append(".visitLocalVariableAnnotation(");
-        buf.append(typeRef);
-        buf.append(", TypePath.fromString(\"").append(typePath).append("\"), ");
-        buf.append("new Label[] {");
-        for (int i = 0; i < start.length; ++i) {
-            buf.append(i == 0 ? " " : ", ");
-            appendLabel(start[i]);
-        }
-        buf.append(" }, new Label[] {");
-        for (int i = 0; i < end.length; ++i) {
-            buf.append(i == 0 ? " " : ", ");
-            appendLabel(end[i]);
-        }
-        buf.append(" }, new int[] {");
-        for (int i = 0; i < index.length; ++i) {
-            buf.append(i == 0 ? " " : ", ").append(index[i]);
-        }
-        buf.append(" }, ");
-        appendConstant(desc);
-        buf.append(", ").append(visible).append(");\n");
-        text.add(buf.toString());
-        ASMifier a = createASMifier("av", 0);
-        text.add(a.getText());
-        text.add("}\n");
-        return a;
-    }
-
-    @Override
-    public void visitLineNumber(final int line, final Label start) {
-        buf.setLength(0);
-        buf.append(name).append(".visitLineNumber(").append(line).append(", ");
-        appendLabel(start);
-        buf.append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitMaxs(final int maxStack, final int maxLocals) {
-        buf.setLength(0);
-        buf.append(name).append(".visitMaxs(").append(maxStack).append(", ")
-                .append(maxLocals).append(");\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitMethodEnd() {
-        buf.setLength(0);
-        buf.append(name).append(".visitEnd();\n");
-        text.add(buf.toString());
-    }
-
-    // ------------------------------------------------------------------------
-    // Common methods
-    // ------------------------------------------------------------------------
-
-    public ASMifier visitAnnotation(final String desc, final boolean visible) {
-        buf.setLength(0);
-        buf.append("{\n").append("av0 = ").append(name)
-                .append(".visitAnnotation(");
-        appendConstant(desc);
-        buf.append(", ").append(visible).append(");\n");
-        text.add(buf.toString());
-        ASMifier a = createASMifier("av", 0);
-        text.add(a.getText());
-        text.add("}\n");
-        return a;
-    }
-
-    public ASMifier visitTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        return visitTypeAnnotation("visitTypeAnnotation", typeRef, typePath,
-                desc, visible);
-    }
-
-    public ASMifier visitTypeAnnotation(final String method, final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        buf.setLength(0);
-        buf.append("{\n").append("av0 = ").append(name).append(".")
-                .append(method).append("(");
-        buf.append(typeRef);
-        buf.append(", TypePath.fromString(\"").append(typePath).append("\"), ");
-        appendConstant(desc);
-        buf.append(", ").append(visible).append(");\n");
-        text.add(buf.toString());
-        ASMifier a = createASMifier("av", 0);
-        text.add(a.getText());
-        text.add("}\n");
-        return a;
-    }
-
-    public void visitAttribute(final Attribute attr) {
-        buf.setLength(0);
-        buf.append("// ATTRIBUTE ").append(attr.type).append('\n');
-        if (attr instanceof ASMifiable) {
-            if (labelNames == null) {
-                labelNames = new HashMap<Label, String>();
-            }
-            buf.append("{\n");
-            ((ASMifiable) attr).asmify(buf, "attr", labelNames);
-            buf.append(name).append(".visitAttribute(attr);\n");
-            buf.append("}\n");
-        }
-        text.add(buf.toString());
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods
-    // ------------------------------------------------------------------------
-
-    protected ASMifier createASMifier(final String name, final int id) {
-        return new ASMifier(Opcodes.ASM5, name, id);
-    }
-
-    /**
-     * Appends a string representation of the given access modifiers to
-     * {@link #buf buf}.
-     *
-     * @param access
-     *            some access modifiers.
-     */
-    void appendAccess(final int access) {
-        boolean first = true;
-        if ((access & Opcodes.ACC_PUBLIC) != 0) {
-            buf.append("ACC_PUBLIC");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_PRIVATE) != 0) {
-            buf.append("ACC_PRIVATE");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_PROTECTED) != 0) {
-            buf.append("ACC_PROTECTED");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_FINAL) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_FINAL");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_STATIC) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_STATIC");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_SYNCHRONIZED) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            if ((access & ACCESS_CLASS) == 0) {
-                buf.append("ACC_SYNCHRONIZED");
-            } else {
-                buf.append("ACC_SUPER");
-            }
-            first = false;
-        }
-        if ((access & Opcodes.ACC_VOLATILE) != 0
-                && (access & ACCESS_FIELD) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_VOLATILE");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_BRIDGE) != 0 && (access & ACCESS_CLASS) == 0
-                && (access & ACCESS_FIELD) == 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_BRIDGE");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_VARARGS) != 0 && (access & ACCESS_CLASS) == 0
-                && (access & ACCESS_FIELD) == 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_VARARGS");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_TRANSIENT) != 0
-                && (access & ACCESS_FIELD) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_TRANSIENT");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_NATIVE) != 0 && (access & ACCESS_CLASS) == 0
-                && (access & ACCESS_FIELD) == 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_NATIVE");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_ENUM) != 0
-                && ((access & ACCESS_CLASS) != 0
-                        || (access & ACCESS_FIELD) != 0 || (access & ACCESS_INNER) != 0)) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_ENUM");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_ANNOTATION) != 0
-                && ((access & ACCESS_CLASS) != 0 || (access & ACCESS_INNER) != 0)) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_ANNOTATION");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_ABSTRACT) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_ABSTRACT");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_INTERFACE) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_INTERFACE");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_STRICT) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_STRICT");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_SYNTHETIC");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_DEPRECATED");
-            first = false;
-        }
-        if ((access & Opcodes.ACC_MANDATED) != 0) {
-            if (!first) {
-                buf.append(" + ");
-            }
-            buf.append("ACC_MANDATED");
-            first = false;
-        }
-        if (first) {
-            buf.append('0');
-        }
-    }
-
-    /**
-     * Appends a string representation of the given constant to the given
-     * buffer.
-     *
-     * @param cst
-     *            an {@link Integer}, {@link Float}, {@link Long},
-     *            {@link Double} or {@link String} object. May be <tt>null</tt>.
-     */
-    protected void appendConstant(final Object cst) {
-        appendConstant(buf, cst);
-    }
-
-    /**
-     * Appends a string representation of the given constant to the given
-     * buffer.
-     *
-     * @param buf
-     *            a string buffer.
-     * @param cst
-     *            an {@link Integer}, {@link Float}, {@link Long},
-     *            {@link Double} or {@link String} object. May be <tt>null</tt>.
-     */
-    static void appendConstant(final StringBuffer buf, final Object cst) {
-        if (cst == null) {
-            buf.append("null");
-        } else if (cst instanceof String) {
-            appendString(buf, (String) cst);
-        } else if (cst instanceof Type) {
-            buf.append("Type.getType(\"");
-            buf.append(((Type) cst).getDescriptor());
-            buf.append("\")");
-        } else if (cst instanceof Handle) {
-            buf.append("new Handle(");
-            Handle h = (Handle) cst;
-            buf.append("Opcodes.").append(HANDLE_TAG[h.getTag()])
-                    .append(", \"");
-            buf.append(h.getOwner()).append("\", \"");
-            buf.append(h.getName()).append("\", \"");
-            buf.append(h.getDesc()).append("\")");
-        } else if (cst instanceof Byte) {
-            buf.append("new Byte((byte)").append(cst).append(')');
-        } else if (cst instanceof Boolean) {
-            buf.append(((Boolean) cst).booleanValue() ? "Boolean.TRUE"
-                    : "Boolean.FALSE");
-        } else if (cst instanceof Short) {
-            buf.append("new Short((short)").append(cst).append(')');
-        } else if (cst instanceof Character) {
-            int c = ((Character) cst).charValue();
-            buf.append("new Character((char)").append(c).append(')');
-        } else if (cst instanceof Integer) {
-            buf.append("new Integer(").append(cst).append(')');
-        } else if (cst instanceof Float) {
-            buf.append("new Float(\"").append(cst).append("\")");
-        } else if (cst instanceof Long) {
-            buf.append("new Long(").append(cst).append("L)");
-        } else if (cst instanceof Double) {
-            buf.append("new Double(\"").append(cst).append("\")");
-        } else if (cst instanceof byte[]) {
-            byte[] v = (byte[]) cst;
-            buf.append("new byte[] {");
-            for (int i = 0; i < v.length; i++) {
-                buf.append(i == 0 ? "" : ",").append(v[i]);
-            }
-            buf.append('}');
-        } else if (cst instanceof boolean[]) {
-            boolean[] v = (boolean[]) cst;
-            buf.append("new boolean[] {");
-            for (int i = 0; i < v.length; i++) {
-                buf.append(i == 0 ? "" : ",").append(v[i]);
-            }
-            buf.append('}');
-        } else if (cst instanceof short[]) {
-            short[] v = (short[]) cst;
-            buf.append("new short[] {");
-            for (int i = 0; i < v.length; i++) {
-                buf.append(i == 0 ? "" : ",").append("(short)").append(v[i]);
-            }
-            buf.append('}');
-        } else if (cst instanceof char[]) {
-            char[] v = (char[]) cst;
-            buf.append("new char[] {");
-            for (int i = 0; i < v.length; i++) {
-                buf.append(i == 0 ? "" : ",").append("(char)")
-                        .append((int) v[i]);
-            }
-            buf.append('}');
-        } else if (cst instanceof int[]) {
-            int[] v = (int[]) cst;
-            buf.append("new int[] {");
-            for (int i = 0; i < v.length; i++) {
-                buf.append(i == 0 ? "" : ",").append(v[i]);
-            }
-            buf.append('}');
-        } else if (cst instanceof long[]) {
-            long[] v = (long[]) cst;
-            buf.append("new long[] {");
-            for (int i = 0; i < v.length; i++) {
-                buf.append(i == 0 ? "" : ",").append(v[i]).append('L');
-            }
-            buf.append('}');
-        } else if (cst instanceof float[]) {
-            float[] v = (float[]) cst;
-            buf.append("new float[] {");
-            for (int i = 0; i < v.length; i++) {
-                buf.append(i == 0 ? "" : ",").append(v[i]).append('f');
-            }
-            buf.append('}');
-        } else if (cst instanceof double[]) {
-            double[] v = (double[]) cst;
-            buf.append("new double[] {");
-            for (int i = 0; i < v.length; i++) {
-                buf.append(i == 0 ? "" : ",").append(v[i]).append('d');
-            }
-            buf.append('}');
-        }
-    }
-
-    private void declareFrameTypes(final int n, final Object[] o) {
-        for (int i = 0; i < n; ++i) {
-            if (o[i] instanceof Label) {
-                declareLabel((Label) o[i]);
-            }
-        }
-    }
-
-    private void appendFrameTypes(final int n, final Object[] o) {
-        for (int i = 0; i < n; ++i) {
-            if (i > 0) {
-                buf.append(", ");
-            }
-            if (o[i] instanceof String) {
-                appendConstant(o[i]);
-            } else if (o[i] instanceof Integer) {
-                switch (((Integer) o[i]).intValue()) {
-                case 0:
-                    buf.append("Opcodes.TOP");
-                    break;
-                case 1:
-                    buf.append("Opcodes.INTEGER");
-                    break;
-                case 2:
-                    buf.append("Opcodes.FLOAT");
-                    break;
-                case 3:
-                    buf.append("Opcodes.DOUBLE");
-                    break;
-                case 4:
-                    buf.append("Opcodes.LONG");
-                    break;
-                case 5:
-                    buf.append("Opcodes.NULL");
-                    break;
-                case 6:
-                    buf.append("Opcodes.UNINITIALIZED_THIS");
-                    break;
-                }
-            } else {
-                appendLabel((Label) o[i]);
-            }
-        }
-    }
-
-    /**
-     * Appends a declaration of the given label to {@link #buf buf}. This
-     * declaration is of the form "Label lXXX = new Label();". Does nothing if
-     * the given label has already been declared.
-     *
-     * @param l
-     *            a label.
-     */
-    protected void declareLabel(final Label l) {
-        if (labelNames == null) {
-            labelNames = new HashMap<Label, String>();
-        }
-        String name = labelNames.get(l);
-        if (name == null) {
-            name = "l" + labelNames.size();
-            labelNames.put(l, name);
-            buf.append("Label ").append(name).append(" = new Label();\n");
-        }
-    }
-
-    /**
-     * Appends the name of the given label to {@link #buf buf}. The given label
-     * <i>must</i> already have a name. One way to ensure this is to always call
-     * {@link #declareLabel declared} before calling this method.
-     *
-     * @param l
-     *            a label.
-     */
-    protected void appendLabel(final Label l) {
-        buf.append(labelNames.get(l));
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/CheckAnnotationAdapter.java b/src/asm/scala/tools/asm/util/CheckAnnotationAdapter.java
deleted file mode 100644
index 70441d1..0000000
--- a/src/asm/scala/tools/asm/util/CheckAnnotationAdapter.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-
-/**
- * An {@link AnnotationVisitor} that checks that its methods are properly used.
- *
- * @author Eric Bruneton
- */
-public class CheckAnnotationAdapter extends AnnotationVisitor {
-
-    private final boolean named;
-
-    private boolean end;
-
-    public CheckAnnotationAdapter(final AnnotationVisitor av) {
-        this(av, true);
-    }
-
-    CheckAnnotationAdapter(final AnnotationVisitor av, final boolean named) {
-        super(Opcodes.ASM5, av);
-        this.named = named;
-    }
-
-    @Override
-    public void visit(final String name, final Object value) {
-        checkEnd();
-        checkName(name);
-        if (!(value instanceof Byte || value instanceof Boolean
-                || value instanceof Character || value instanceof Short
-                || value instanceof Integer || value instanceof Long
-                || value instanceof Float || value instanceof Double
-                || value instanceof String || value instanceof Type
-                || value instanceof byte[] || value instanceof boolean[]
-                || value instanceof char[] || value instanceof short[]
-                || value instanceof int[] || value instanceof long[]
-                || value instanceof float[] || value instanceof double[])) {
-            throw new IllegalArgumentException("Invalid annotation value");
-        }
-        if (value instanceof Type) {
-            int sort = ((Type) value).getSort();
-            if (sort == Type.METHOD) {
-                throw new IllegalArgumentException("Invalid annotation value");
-            }
-        }
-        if (av != null) {
-            av.visit(name, value);
-        }
-    }
-
-    @Override
-    public void visitEnum(final String name, final String desc,
-            final String value) {
-        checkEnd();
-        checkName(name);
-        CheckMethodAdapter.checkDesc(desc, false);
-        if (value == null) {
-            throw new IllegalArgumentException("Invalid enum value");
-        }
-        if (av != null) {
-            av.visitEnum(name, desc, value);
-        }
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String name,
-            final String desc) {
-        checkEnd();
-        checkName(name);
-        CheckMethodAdapter.checkDesc(desc, false);
-        return new CheckAnnotationAdapter(av == null ? null
-                : av.visitAnnotation(name, desc));
-    }
-
-    @Override
-    public AnnotationVisitor visitArray(final String name) {
-        checkEnd();
-        checkName(name);
-        return new CheckAnnotationAdapter(av == null ? null
-                : av.visitArray(name), false);
-    }
-
-    @Override
-    public void visitEnd() {
-        checkEnd();
-        end = true;
-        if (av != null) {
-            av.visitEnd();
-        }
-    }
-
-    private void checkEnd() {
-        if (end) {
-            throw new IllegalStateException(
-                    "Cannot call a visit method after visitEnd has been called");
-        }
-    }
-
-    private void checkName(final String name) {
-        if (named && name == null) {
-            throw new IllegalArgumentException(
-                    "Annotation value name must not be null");
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/CheckClassAdapter.java b/src/asm/scala/tools/asm/util/CheckClassAdapter.java
deleted file mode 100644
index 9909208..0000000
--- a/src/asm/scala/tools/asm/util/CheckClassAdapter.java
+++ /dev/null
@@ -1,1009 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.FileInputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassReader;
-import scala.tools.asm.ClassVisitor;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-import scala.tools.asm.tree.ClassNode;
-import scala.tools.asm.tree.MethodNode;
-import scala.tools.asm.tree.analysis.Analyzer;
-import scala.tools.asm.tree.analysis.BasicValue;
-import scala.tools.asm.tree.analysis.Frame;
-import scala.tools.asm.tree.analysis.SimpleVerifier;
-
-/**
- * A {@link ClassVisitor} that checks that its methods are properly used. More
- * precisely this class adapter checks each method call individually, based
- * <i>only</i> on its arguments, but does <i>not</i> check the <i>sequence</i>
- * of method calls. For example, the invalid sequence
- * <tt>visitField(ACC_PUBLIC, "i", "I", null)</tt> <tt>visitField(ACC_PUBLIC,
- * "i", "D", null)</tt> will <i>not</i> be detected by this class adapter.
- *
- * <p>
- * <code>CheckClassAdapter</code> can be also used to verify bytecode
- * transformations in order to make sure transformed bytecode is sane. For
- * example:
- *
- * <pre>
- *   InputStream is = ...; // get bytes for the source class
- *   ClassReader cr = new ClassReader(is);
- *   ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
- *   ClassVisitor cv = new <b>MyClassAdapter</b>(new CheckClassAdapter(cw));
- *   cr.accept(cv, 0);
- *
- *   StringWriter sw = new StringWriter();
- *   PrintWriter pw = new PrintWriter(sw);
- *   CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), false, pw);
- *   assertTrue(sw.toString(), sw.toString().length()==0);
- * </pre>
- *
- * Above code runs transformed bytecode trough the
- * <code>CheckClassAdapter</code>. It won't be exactly the same verification as
- * JVM does, but it run data flow analysis for the code of each method and
- * checks that expectations are met for each method instruction.
- *
- * <p>
- * If method bytecode has errors, assertion text will show the erroneous
- * instruction number and dump of the failed method with information about
- * locals and stack slot for each instruction. For example (format is -
- * insnNumber locals : stack):
- *
- * <pre>
- * org.objectweb.asm.tree.analysis.AnalyzerException: Error at instruction 71: Expected I, but found .
- *   at org.objectweb.asm.tree.analysis.Analyzer.analyze(Analyzer.java:289)
- *   at org.objectweb.asm.util.CheckClassAdapter.verify(CheckClassAdapter.java:135)
- * ...
- * remove()V
- * 00000 LinkedBlockingQueue$Itr . . . . . . . .  :
- *   ICONST_0
- * 00001 LinkedBlockingQueue$Itr . . . . . . . .  : I
- *   ISTORE 2
- * 00001 LinkedBlockingQueue$Itr <b>.</b> I . . . . . .  :
- * ...
- *
- * 00071 LinkedBlockingQueue$Itr <b>.</b> I . . . . . .  :
- *   ILOAD 1
- * 00072 <b>?</b>
- *   INVOKESPECIAL java/lang/Integer.<init> (I)V
- * ...
- * </pre>
- *
- * In the above output you can see that variable 1 loaded by
- * <code>ILOAD 1</code> instruction at position <code>00071</code> is not
- * initialized. You can also see that at the beginning of the method (code
- * inserted by the transformation) variable 2 is initialized.
- *
- * <p>
- * Note that when used like that, <code>CheckClassAdapter.verify()</code> can
- * trigger additional class loading, because it is using
- * <code>SimpleVerifier</code>.
- *
- * @author Eric Bruneton
- */
-public class CheckClassAdapter extends ClassVisitor {
-
-    /**
-     * The class version number.
-     */
-    private int version;
-
-    /**
-     * <tt>true</tt> if the visit method has been called.
-     */
-    private boolean start;
-
-    /**
-     * <tt>true</tt> if the visitSource method has been called.
-     */
-    private boolean source;
-
-    /**
-     * <tt>true</tt> if the visitOuterClass method has been called.
-     */
-    private boolean outer;
-
-    /**
-     * <tt>true</tt> if the visitEnd method has been called.
-     */
-    private boolean end;
-
-    /**
-     * The already visited labels. This map associate Integer values to Label
-     * keys.
-     */
-    private Map<Label, Integer> labels;
-
-    /**
-     * <tt>true</tt> if the method code must be checked with a BasicVerifier.
-     */
-    private boolean checkDataFlow;
-
-    /**
-     * Checks a given class.
-     * <p>
-     * Usage: CheckClassAdapter <binary class name or class file name>
-     *
-     * @param args
-     *            the command line arguments.
-     *
-     * @throws Exception
-     *             if the class cannot be found, or if an IO exception occurs.
-     */
-    public static void main(final String[] args) throws Exception {
-        if (args.length != 1) {
-            System.err.println("Verifies the given class.");
-            System.err.println("Usage: CheckClassAdapter "
-                    + "<fully qualified class name or class file name>");
-            return;
-        }
-        ClassReader cr;
-        if (args[0].endsWith(".class")) {
-            cr = new ClassReader(new FileInputStream(args[0]));
-        } else {
-            cr = new ClassReader(args[0]);
-        }
-
-        verify(cr, false, new PrintWriter(System.err));
-    }
-
-    /**
-     * Checks a given class.
-     *
-     * @param cr
-     *            a <code>ClassReader</code> that contains bytecode for the
-     *            analysis.
-     * @param loader
-     *            a <code>ClassLoader</code> which will be used to load
-     *            referenced classes. This is useful if you are verifiying
-     *            multiple interdependent classes.
-     * @param dump
-     *            true if bytecode should be printed out not only when errors
-     *            are found.
-     * @param pw
-     *            write where results going to be printed
-     */
-    public static void verify(final ClassReader cr, final ClassLoader loader,
-            final boolean dump, final PrintWriter pw) {
-        ClassNode cn = new ClassNode();
-        cr.accept(new CheckClassAdapter(cn, false), ClassReader.SKIP_DEBUG);
-
-        Type syperType = cn.superName == null ? null : Type
-                .getObjectType(cn.superName);
-        List<MethodNode> methods = cn.methods;
-
-        List<Type> interfaces = new ArrayList<Type>();
-        for (Iterator<String> i = cn.interfaces.iterator(); i.hasNext();) {
-            interfaces.add(Type.getObjectType(i.next()));
-        }
-
-        for (int i = 0; i < methods.size(); ++i) {
-            MethodNode method = methods.get(i);
-            SimpleVerifier verifier = new SimpleVerifier(
-                    Type.getObjectType(cn.name), syperType, interfaces,
-                    (cn.access & Opcodes.ACC_INTERFACE) != 0);
-            Analyzer<BasicValue> a = new Analyzer<BasicValue>(verifier);
-            if (loader != null) {
-                verifier.setClassLoader(loader);
-            }
-            try {
-                a.analyze(cn.name, method);
-                if (!dump) {
-                    continue;
-                }
-            } catch (Exception e) {
-                e.printStackTrace(pw);
-            }
-            printAnalyzerResult(method, a, pw);
-        }
-        pw.flush();
-    }
-
-    /**
-     * Checks a given class
-     *
-     * @param cr
-     *            a <code>ClassReader</code> that contains bytecode for the
-     *            analysis.
-     * @param dump
-     *            true if bytecode should be printed out not only when errors
-     *            are found.
-     * @param pw
-     *            write where results going to be printed
-     */
-    public static void verify(final ClassReader cr, final boolean dump,
-            final PrintWriter pw) {
-        verify(cr, null, dump, pw);
-    }
-
-    static void printAnalyzerResult(MethodNode method, Analyzer<BasicValue> a,
-            final PrintWriter pw) {
-        Frame<BasicValue>[] frames = a.getFrames();
-        Textifier t = new Textifier();
-        TraceMethodVisitor mv = new TraceMethodVisitor(t);
-
-        pw.println(method.name + method.desc);
-        for (int j = 0; j < method.instructions.size(); ++j) {
-            method.instructions.get(j).accept(mv);
-
-            StringBuffer s = new StringBuffer();
-            Frame<BasicValue> f = frames[j];
-            if (f == null) {
-                s.append('?');
-            } else {
-                for (int k = 0; k < f.getLocals(); ++k) {
-                    s.append(getShortName(f.getLocal(k).toString()))
-                            .append(' ');
-                }
-                s.append(" : ");
-                for (int k = 0; k < f.getStackSize(); ++k) {
-                    s.append(getShortName(f.getStack(k).toString()))
-                            .append(' ');
-                }
-            }
-            while (s.length() < method.maxStack + method.maxLocals + 1) {
-                s.append(' ');
-            }
-            pw.print(Integer.toString(j + 100000).substring(1));
-            pw.print(" " + s + " : " + t.text.get(t.text.size() - 1));
-        }
-        for (int j = 0; j < method.tryCatchBlocks.size(); ++j) {
-            method.tryCatchBlocks.get(j).accept(mv);
-            pw.print(" " + t.text.get(t.text.size() - 1));
-        }
-        pw.println();
-    }
-
-    private static String getShortName(final String name) {
-        int n = name.lastIndexOf('/');
-        int k = name.length();
-        if (name.charAt(k - 1) == ';') {
-            k--;
-        }
-        return n == -1 ? name : name.substring(n + 1, k);
-    }
-
-    /**
-     * Constructs a new {@link CheckClassAdapter}. <i>Subclasses must not use
-     * this constructor</i>. Instead, they must use the
-     * {@link #CheckClassAdapter(int, ClassVisitor, boolean)} version.
-     *
-     * @param cv
-     *            the class visitor to which this adapter must delegate calls.
-     */
-    public CheckClassAdapter(final ClassVisitor cv) {
-        this(cv, true);
-    }
-
-    /**
-     * Constructs a new {@link CheckClassAdapter}. <i>Subclasses must not use
-     * this constructor</i>. Instead, they must use the
-     * {@link #CheckClassAdapter(int, ClassVisitor, boolean)} version.
-     *
-     * @param cv
-     *            the class visitor to which this adapter must delegate calls.
-     * @param checkDataFlow
-     *            <tt>true</tt> to perform basic data flow checks, or
-     *            <tt>false</tt> to not perform any data flow check (see
-     *            {@link CheckMethodAdapter}). This option requires valid
-     *            maxLocals and maxStack values.
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public CheckClassAdapter(final ClassVisitor cv, final boolean checkDataFlow) {
-        this(Opcodes.ASM5, cv, checkDataFlow);
-        if (getClass() != CheckClassAdapter.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs a new {@link CheckClassAdapter}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param cv
-     *            the class visitor to which this adapter must delegate calls.
-     * @param checkDataFlow
-     *            <tt>true</tt> to perform basic data flow checks, or
-     *            <tt>false</tt> to not perform any data flow check (see
-     *            {@link CheckMethodAdapter}). This option requires valid
-     *            maxLocals and maxStack values.
-     */
-    protected CheckClassAdapter(final int api, final ClassVisitor cv,
-            final boolean checkDataFlow) {
-        super(api, cv);
-        this.labels = new HashMap<Label, Integer>();
-        this.checkDataFlow = checkDataFlow;
-    }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the ClassVisitor interface
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visit(final int version, final int access, final String name,
-            final String signature, final String superName,
-            final String[] interfaces) {
-        if (start) {
-            throw new IllegalStateException("visit must be called only once");
-        }
-        start = true;
-        checkState();
-        checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL
-                + Opcodes.ACC_SUPER + Opcodes.ACC_INTERFACE
-                + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC
-                + Opcodes.ACC_ANNOTATION + Opcodes.ACC_ENUM
-                + Opcodes.ACC_DEPRECATED + 0x40000); // ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
-        if (name == null || !name.endsWith("package-info")) {
-            CheckMethodAdapter.checkInternalName(name, "class name");
-        }
-        if ("java/lang/Object".equals(name)) {
-            if (superName != null) {
-                throw new IllegalArgumentException(
-                        "The super class name of the Object class must be 'null'");
-            }
-        } else {
-            CheckMethodAdapter.checkInternalName(superName, "super class name");
-        }
-        if (signature != null) {
-            checkClassSignature(signature);
-        }
-        if ((access & Opcodes.ACC_INTERFACE) != 0) {
-            if (!"java/lang/Object".equals(superName)) {
-                throw new IllegalArgumentException(
-                        "The super class name of interfaces must be 'java/lang/Object'");
-            }
-        }
-        if (interfaces != null) {
-            for (int i = 0; i < interfaces.length; ++i) {
-                CheckMethodAdapter.checkInternalName(interfaces[i],
-                        "interface name at index " + i);
-            }
-        }
-        this.version = version;
-        super.visit(version, access, name, signature, superName, interfaces);
-    }
-
-    @Override
-    public void visitSource(final String file, final String debug) {
-        checkState();
-        if (source) {
-            throw new IllegalStateException(
-                    "visitSource can be called only once.");
-        }
-        source = true;
-        super.visitSource(file, debug);
-    }
-
-    @Override
-    public void visitOuterClass(final String owner, final String name,
-            final String desc) {
-        checkState();
-        if (outer) {
-            throw new IllegalStateException(
-                    "visitOuterClass can be called only once.");
-        }
-        outer = true;
-        if (owner == null) {
-            throw new IllegalArgumentException("Illegal outer class owner");
-        }
-        if (desc != null) {
-            CheckMethodAdapter.checkMethodDesc(desc);
-        }
-        super.visitOuterClass(owner, name, desc);
-    }
-
-    @Override
-    public void visitInnerClass(final String name, final String outerName,
-            final String innerName, final int access) {
-        checkState();
-        CheckMethodAdapter.checkInternalName(name, "class name");
-        if (outerName != null) {
-            CheckMethodAdapter.checkInternalName(outerName, "outer class name");
-        }
-        if (innerName != null) {
-            int start = 0;
-            while (start < innerName.length()
-                    && Character.isDigit(innerName.charAt(start))) {
-                start++;
-            }
-            if (start == 0 || start < innerName.length()) {
-                CheckMethodAdapter.checkIdentifier(innerName, start, -1,
-                        "inner class name");
-            }
-        }
-        checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_PRIVATE
-                + Opcodes.ACC_PROTECTED + Opcodes.ACC_STATIC
-                + Opcodes.ACC_FINAL + Opcodes.ACC_INTERFACE
-                + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC
-                + Opcodes.ACC_ANNOTATION + Opcodes.ACC_ENUM);
-        super.visitInnerClass(name, outerName, innerName, access);
-    }
-
-    @Override
-    public FieldVisitor visitField(final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        checkState();
-        checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_PRIVATE
-                + Opcodes.ACC_PROTECTED + Opcodes.ACC_STATIC
-                + Opcodes.ACC_FINAL + Opcodes.ACC_VOLATILE
-                + Opcodes.ACC_TRANSIENT + Opcodes.ACC_SYNTHETIC
-                + Opcodes.ACC_ENUM + Opcodes.ACC_DEPRECATED + 0x40000); // ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
-        CheckMethodAdapter.checkUnqualifiedName(version, name, "field name");
-        CheckMethodAdapter.checkDesc(desc, false);
-        if (signature != null) {
-            checkFieldSignature(signature);
-        }
-        if (value != null) {
-            CheckMethodAdapter.checkConstant(value);
-        }
-        FieldVisitor av = super
-                .visitField(access, name, desc, signature, value);
-        return new CheckFieldAdapter(av);
-    }
-
-    @Override
-    public MethodVisitor visitMethod(final int access, final String name,
-            final String desc, final String signature, final String[] exceptions) {
-        checkState();
-        checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_PRIVATE
-                + Opcodes.ACC_PROTECTED + Opcodes.ACC_STATIC
-                + Opcodes.ACC_FINAL + Opcodes.ACC_SYNCHRONIZED
-                + Opcodes.ACC_BRIDGE + Opcodes.ACC_VARARGS + Opcodes.ACC_NATIVE
-                + Opcodes.ACC_ABSTRACT + Opcodes.ACC_STRICT
-                + Opcodes.ACC_SYNTHETIC + Opcodes.ACC_DEPRECATED + 0x40000); // ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
-        if (!"<init>".equals(name) && !"<clinit>".equals(name)) {
-            CheckMethodAdapter.checkMethodIdentifier(version, name,
-                    "method name");
-        }
-        CheckMethodAdapter.checkMethodDesc(desc);
-        if (signature != null) {
-            checkMethodSignature(signature);
-        }
-        if (exceptions != null) {
-            for (int i = 0; i < exceptions.length; ++i) {
-                CheckMethodAdapter.checkInternalName(exceptions[i],
-                        "exception name at index " + i);
-            }
-        }
-        CheckMethodAdapter cma;
-        if (checkDataFlow) {
-            cma = new CheckMethodAdapter(access, name, desc, super.visitMethod(
-                    access, name, desc, signature, exceptions), labels);
-        } else {
-            cma = new CheckMethodAdapter(super.visitMethod(access, name, desc,
-                    signature, exceptions), labels);
-        }
-        cma.version = version;
-        return cma;
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        checkState();
-        CheckMethodAdapter.checkDesc(desc, false);
-        return new CheckAnnotationAdapter(super.visitAnnotation(desc, visible));
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        checkState();
-        int sort = typeRef >>> 24;
-        if (sort != TypeReference.CLASS_TYPE_PARAMETER
-                && sort != TypeReference.CLASS_TYPE_PARAMETER_BOUND
-                && sort != TypeReference.CLASS_EXTENDS) {
-            throw new IllegalArgumentException("Invalid type reference sort 0x"
-                    + Integer.toHexString(sort));
-        }
-        checkTypeRefAndPath(typeRef, typePath);
-        CheckMethodAdapter.checkDesc(desc, false);
-        return new CheckAnnotationAdapter(super.visitTypeAnnotation(typeRef,
-                typePath, desc, visible));
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        checkState();
-        if (attr == null) {
-            throw new IllegalArgumentException(
-                    "Invalid attribute (must not be null)");
-        }
-        super.visitAttribute(attr);
-    }
-
-    @Override
-    public void visitEnd() {
-        checkState();
-        end = true;
-        super.visitEnd();
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Checks that the visit method has been called and that visitEnd has not
-     * been called.
-     */
-    private void checkState() {
-        if (!start) {
-            throw new IllegalStateException(
-                    "Cannot visit member before visit has been called.");
-        }
-        if (end) {
-            throw new IllegalStateException(
-                    "Cannot visit member after visitEnd has been called.");
-        }
-    }
-
-    /**
-     * Checks that the given access flags do not contain invalid flags. This
-     * method also checks that mutually incompatible flags are not set
-     * simultaneously.
-     *
-     * @param access
-     *            the access flags to be checked
-     * @param possibleAccess
-     *            the valid access flags.
-     */
-    static void checkAccess(final int access, final int possibleAccess) {
-        if ((access & ~possibleAccess) != 0) {
-            throw new IllegalArgumentException("Invalid access flags: "
-                    + access);
-        }
-        int pub = (access & Opcodes.ACC_PUBLIC) == 0 ? 0 : 1;
-        int pri = (access & Opcodes.ACC_PRIVATE) == 0 ? 0 : 1;
-        int pro = (access & Opcodes.ACC_PROTECTED) == 0 ? 0 : 1;
-        if (pub + pri + pro > 1) {
-            throw new IllegalArgumentException(
-                    "public private and protected are mutually exclusive: "
-                            + access);
-        }
-        int fin = (access & Opcodes.ACC_FINAL) == 0 ? 0 : 1;
-        int abs = (access & Opcodes.ACC_ABSTRACT) == 0 ? 0 : 1;
-        if (fin + abs > 1) {
-            throw new IllegalArgumentException(
-                    "final and abstract are mutually exclusive: " + access);
-        }
-    }
-
-    /**
-     * Checks a class signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     */
-    public static void checkClassSignature(final String signature) {
-        // ClassSignature:
-        // FormalTypeParameters? ClassTypeSignature ClassTypeSignature*
-
-        int pos = 0;
-        if (getChar(signature, 0) == '<') {
-            pos = checkFormalTypeParameters(signature, pos);
-        }
-        pos = checkClassTypeSignature(signature, pos);
-        while (getChar(signature, pos) == 'L') {
-            pos = checkClassTypeSignature(signature, pos);
-        }
-        if (pos != signature.length()) {
-            throw new IllegalArgumentException(signature + ": error at index "
-                    + pos);
-        }
-    }
-
-    /**
-     * Checks a method signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     */
-    public static void checkMethodSignature(final String signature) {
-        // MethodTypeSignature:
-        // FormalTypeParameters? ( TypeSignature* ) ( TypeSignature | V ) (
-        // ^ClassTypeSignature | ^TypeVariableSignature )*
-
-        int pos = 0;
-        if (getChar(signature, 0) == '<') {
-            pos = checkFormalTypeParameters(signature, pos);
-        }
-        pos = checkChar('(', signature, pos);
-        while ("ZCBSIFJDL[T".indexOf(getChar(signature, pos)) != -1) {
-            pos = checkTypeSignature(signature, pos);
-        }
-        pos = checkChar(')', signature, pos);
-        if (getChar(signature, pos) == 'V') {
-            ++pos;
-        } else {
-            pos = checkTypeSignature(signature, pos);
-        }
-        while (getChar(signature, pos) == '^') {
-            ++pos;
-            if (getChar(signature, pos) == 'L') {
-                pos = checkClassTypeSignature(signature, pos);
-            } else {
-                pos = checkTypeVariableSignature(signature, pos);
-            }
-        }
-        if (pos != signature.length()) {
-            throw new IllegalArgumentException(signature + ": error at index "
-                    + pos);
-        }
-    }
-
-    /**
-     * Checks a field signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     */
-    public static void checkFieldSignature(final String signature) {
-        int pos = checkFieldTypeSignature(signature, 0);
-        if (pos != signature.length()) {
-            throw new IllegalArgumentException(signature + ": error at index "
-                    + pos);
-        }
-    }
-
-    /**
-     * Checks the reference to a type in a type annotation.
-     *
-     * @param typeRef
-     *            a reference to an annotated type.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     */
-    static void checkTypeRefAndPath(int typeRef, TypePath typePath) {
-        int mask = 0;
-        switch (typeRef >>> 24) {
-        case TypeReference.CLASS_TYPE_PARAMETER:
-        case TypeReference.METHOD_TYPE_PARAMETER:
-        case TypeReference.METHOD_FORMAL_PARAMETER:
-            mask = 0xFFFF0000;
-            break;
-        case TypeReference.FIELD:
-        case TypeReference.METHOD_RETURN:
-        case TypeReference.METHOD_RECEIVER:
-        case TypeReference.LOCAL_VARIABLE:
-        case TypeReference.RESOURCE_VARIABLE:
-        case TypeReference.INSTANCEOF:
-        case TypeReference.NEW:
-        case TypeReference.CONSTRUCTOR_REFERENCE:
-        case TypeReference.METHOD_REFERENCE:
-            mask = 0xFF000000;
-            break;
-        case TypeReference.CLASS_EXTENDS:
-        case TypeReference.CLASS_TYPE_PARAMETER_BOUND:
-        case TypeReference.METHOD_TYPE_PARAMETER_BOUND:
-        case TypeReference.THROWS:
-        case TypeReference.EXCEPTION_PARAMETER:
-            mask = 0xFFFFFF00;
-            break;
-        case TypeReference.CAST:
-        case TypeReference.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT:
-        case TypeReference.METHOD_INVOCATION_TYPE_ARGUMENT:
-        case TypeReference.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT:
-        case TypeReference.METHOD_REFERENCE_TYPE_ARGUMENT:
-            mask = 0xFF0000FF;
-            break;
-        default:
-            throw new IllegalArgumentException("Invalid type reference sort 0x"
-                    + Integer.toHexString(typeRef >>> 24));
-        }
-        if ((typeRef & ~mask) != 0) {
-            throw new IllegalArgumentException("Invalid type reference 0x"
-                    + Integer.toHexString(typeRef));
-        }
-        if (typePath != null) {
-            for (int i = 0; i < typePath.getLength(); ++i) {
-                int step = typePath.getStep(i);
-                if (step != TypePath.ARRAY_ELEMENT
-                        && step != TypePath.INNER_TYPE
-                        && step != TypePath.TYPE_ARGUMENT
-                        && step != TypePath.WILDCARD_BOUND) {
-                    throw new IllegalArgumentException(
-                            "Invalid type path step " + i + " in " + typePath);
-                }
-                if (step != TypePath.TYPE_ARGUMENT
-                        && typePath.getStepArgument(i) != 0) {
-                    throw new IllegalArgumentException(
-                            "Invalid type path step argument for step " + i
-                                    + " in " + typePath);
-                }
-            }
-        }
-    }
-
-    /**
-     * Checks the formal type parameters of a class or method signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     * @param pos
-     *            index of first character to be checked.
-     * @return the index of the first character after the checked part.
-     */
-    private static int checkFormalTypeParameters(final String signature, int pos) {
-        // FormalTypeParameters:
-        // < FormalTypeParameter+ >
-
-        pos = checkChar('<', signature, pos);
-        pos = checkFormalTypeParameter(signature, pos);
-        while (getChar(signature, pos) != '>') {
-            pos = checkFormalTypeParameter(signature, pos);
-        }
-        return pos + 1;
-    }
-
-    /**
-     * Checks a formal type parameter of a class or method signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     * @param pos
-     *            index of first character to be checked.
-     * @return the index of the first character after the checked part.
-     */
-    private static int checkFormalTypeParameter(final String signature, int pos) {
-        // FormalTypeParameter:
-        // Identifier : FieldTypeSignature? (: FieldTypeSignature)*
-
-        pos = checkIdentifier(signature, pos);
-        pos = checkChar(':', signature, pos);
-        if ("L[T".indexOf(getChar(signature, pos)) != -1) {
-            pos = checkFieldTypeSignature(signature, pos);
-        }
-        while (getChar(signature, pos) == ':') {
-            pos = checkFieldTypeSignature(signature, pos + 1);
-        }
-        return pos;
-    }
-
-    /**
-     * Checks a field type signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     * @param pos
-     *            index of first character to be checked.
-     * @return the index of the first character after the checked part.
-     */
-    private static int checkFieldTypeSignature(final String signature, int pos) {
-        // FieldTypeSignature:
-        // ClassTypeSignature | ArrayTypeSignature | TypeVariableSignature
-        //
-        // ArrayTypeSignature:
-        // [ TypeSignature
-
-        switch (getChar(signature, pos)) {
-        case 'L':
-            return checkClassTypeSignature(signature, pos);
-        case '[':
-            return checkTypeSignature(signature, pos + 1);
-        default:
-            return checkTypeVariableSignature(signature, pos);
-        }
-    }
-
-    /**
-     * Checks a class type signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     * @param pos
-     *            index of first character to be checked.
-     * @return the index of the first character after the checked part.
-     */
-    private static int checkClassTypeSignature(final String signature, int pos) {
-        // ClassTypeSignature:
-        // L Identifier ( / Identifier )* TypeArguments? ( . Identifier
-        // TypeArguments? )* ;
-
-        pos = checkChar('L', signature, pos);
-        pos = checkIdentifier(signature, pos);
-        while (getChar(signature, pos) == '/') {
-            pos = checkIdentifier(signature, pos + 1);
-        }
-        if (getChar(signature, pos) == '<') {
-            pos = checkTypeArguments(signature, pos);
-        }
-        while (getChar(signature, pos) == '.') {
-            pos = checkIdentifier(signature, pos + 1);
-            if (getChar(signature, pos) == '<') {
-                pos = checkTypeArguments(signature, pos);
-            }
-        }
-        return checkChar(';', signature, pos);
-    }
-
-    /**
-     * Checks the type arguments in a class type signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     * @param pos
-     *            index of first character to be checked.
-     * @return the index of the first character after the checked part.
-     */
-    private static int checkTypeArguments(final String signature, int pos) {
-        // TypeArguments:
-        // < TypeArgument+ >
-
-        pos = checkChar('<', signature, pos);
-        pos = checkTypeArgument(signature, pos);
-        while (getChar(signature, pos) != '>') {
-            pos = checkTypeArgument(signature, pos);
-        }
-        return pos + 1;
-    }
-
-    /**
-     * Checks a type argument in a class type signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     * @param pos
-     *            index of first character to be checked.
-     * @return the index of the first character after the checked part.
-     */
-    private static int checkTypeArgument(final String signature, int pos) {
-        // TypeArgument:
-        // * | ( ( + | - )? FieldTypeSignature )
-
-        char c = getChar(signature, pos);
-        if (c == '*') {
-            return pos + 1;
-        } else if (c == '+' || c == '-') {
-            pos++;
-        }
-        return checkFieldTypeSignature(signature, pos);
-    }
-
-    /**
-     * Checks a type variable signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     * @param pos
-     *            index of first character to be checked.
-     * @return the index of the first character after the checked part.
-     */
-    private static int checkTypeVariableSignature(final String signature,
-            int pos) {
-        // TypeVariableSignature:
-        // T Identifier ;
-
-        pos = checkChar('T', signature, pos);
-        pos = checkIdentifier(signature, pos);
-        return checkChar(';', signature, pos);
-    }
-
-    /**
-     * Checks a type signature.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     * @param pos
-     *            index of first character to be checked.
-     * @return the index of the first character after the checked part.
-     */
-    private static int checkTypeSignature(final String signature, int pos) {
-        // TypeSignature:
-        // Z | C | B | S | I | F | J | D | FieldTypeSignature
-
-        switch (getChar(signature, pos)) {
-        case 'Z':
-        case 'C':
-        case 'B':
-        case 'S':
-        case 'I':
-        case 'F':
-        case 'J':
-        case 'D':
-            return pos + 1;
-        default:
-            return checkFieldTypeSignature(signature, pos);
-        }
-    }
-
-    /**
-     * Checks an identifier.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     * @param pos
-     *            index of first character to be checked.
-     * @return the index of the first character after the checked part.
-     */
-    private static int checkIdentifier(final String signature, int pos) {
-        if (!Character.isJavaIdentifierStart(getChar(signature, pos))) {
-            throw new IllegalArgumentException(signature
-                    + ": identifier expected at index " + pos);
-        }
-        ++pos;
-        while (Character.isJavaIdentifierPart(getChar(signature, pos))) {
-            ++pos;
-        }
-        return pos;
-    }
-
-    /**
-     * Checks a single character.
-     *
-     * @param signature
-     *            a string containing the signature that must be checked.
-     * @param pos
-     *            index of first character to be checked.
-     * @return the index of the first character after the checked part.
-     */
-    private static int checkChar(final char c, final String signature, int pos) {
-        if (getChar(signature, pos) == c) {
-            return pos + 1;
-        }
-        throw new IllegalArgumentException(signature + ": '" + c
-                + "' expected at index " + pos);
-    }
-
-    /**
-     * Returns the signature car at the given index.
-     *
-     * @param signature
-     *            a signature.
-     * @param pos
-     *            an index in signature.
-     * @return the character at the given index, or 0 if there is no such
-     *         character.
-     */
-    private static char getChar(final String signature, int pos) {
-        return pos < signature.length() ? signature.charAt(pos) : (char) 0;
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/CheckFieldAdapter.java b/src/asm/scala/tools/asm/util/CheckFieldAdapter.java
deleted file mode 100644
index e682df4..0000000
--- a/src/asm/scala/tools/asm/util/CheckFieldAdapter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-
-/**
- * A {@link FieldVisitor} that checks that its methods are properly used.
- */
-public class CheckFieldAdapter extends FieldVisitor {
-
-    private boolean end;
-
-    /**
-     * Constructs a new {@link CheckFieldAdapter}. <i>Subclasses must not use
-     * this constructor</i>. Instead, they must use the
-     * {@link #CheckFieldAdapter(int, FieldVisitor)} version.
-     *
-     * @param fv
-     *            the field visitor to which this adapter must delegate calls.
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public CheckFieldAdapter(final FieldVisitor fv) {
-        this(Opcodes.ASM5, fv);
-        if (getClass() != CheckFieldAdapter.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs a new {@link CheckFieldAdapter}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param fv
-     *            the field visitor to which this adapter must delegate calls.
-     */
-    protected CheckFieldAdapter(final int api, final FieldVisitor fv) {
-        super(api, fv);
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        checkEnd();
-        CheckMethodAdapter.checkDesc(desc, false);
-        return new CheckAnnotationAdapter(super.visitAnnotation(desc, visible));
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        checkEnd();
-        int sort = typeRef >>> 24;
-        if (sort != TypeReference.FIELD) {
-            throw new IllegalArgumentException("Invalid type reference sort 0x"
-                    + Integer.toHexString(sort));
-        }
-        CheckClassAdapter.checkTypeRefAndPath(typeRef, typePath);
-        CheckMethodAdapter.checkDesc(desc, false);
-        return new CheckAnnotationAdapter(super.visitTypeAnnotation(typeRef,
-                typePath, desc, visible));
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        checkEnd();
-        if (attr == null) {
-            throw new IllegalArgumentException(
-                    "Invalid attribute (must not be null)");
-        }
-        super.visitAttribute(attr);
-    }
-
-    @Override
-    public void visitEnd() {
-        checkEnd();
-        end = true;
-        super.visitEnd();
-    }
-
-    private void checkEnd() {
-        if (end) {
-            throw new IllegalStateException(
-                    "Cannot call a visit method after visitEnd has been called");
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/CheckMethodAdapter.java b/src/asm/scala/tools/asm/util/CheckMethodAdapter.java
deleted file mode 100644
index 131dfa5..0000000
--- a/src/asm/scala/tools/asm/util/CheckMethodAdapter.java
+++ /dev/null
@@ -1,1542 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-import scala.tools.asm.tree.MethodNode;
-import scala.tools.asm.tree.analysis.Analyzer;
-import scala.tools.asm.tree.analysis.BasicValue;
-import scala.tools.asm.tree.analysis.BasicVerifier;
-
-/**
- * A {@link MethodVisitor} that checks that its methods are properly used. More
- * precisely this method adapter checks each instruction individually, i.e.,
- * each visit method checks some preconditions based <i>only</i> on its
- * arguments - such as the fact that the given opcode is correct for a given
- * visit method. This adapter can also perform some basic data flow checks (more
- * precisely those that can be performed without the full class hierarchy - see
- * {@link scala.tools.asm.tree.analysis.BasicVerifier}). For instance in a
- * method whose signature is <tt>void m ()</tt>, the invalid instruction
- * IRETURN, or the invalid sequence IADD L2I will be detected if the data flow
- * checks are enabled. These checks are enabled by using the
- * {@link #CheckMethodAdapter(int,String,String,MethodVisitor,Map)} constructor.
- * They are not performed if any other constructor is used.
- *
- * @author Eric Bruneton
- */
-public class CheckMethodAdapter extends MethodVisitor {
-
-    /**
-     * The class version number.
-     */
-    public int version;
-
-    /**
-     * The access flags of the method.
-     */
-    private int access;
-
-    /**
-     * <tt>true</tt> if the visitCode method has been called.
-     */
-    private boolean startCode;
-
-    /**
-     * <tt>true</tt> if the visitMaxs method has been called.
-     */
-    private boolean endCode;
-
-    /**
-     * <tt>true</tt> if the visitEnd method has been called.
-     */
-    private boolean endMethod;
-
-    /**
-     * Number of visited instructions.
-     */
-    private int insnCount;
-
-    /**
-     * The already visited labels. This map associate Integer values to pseudo
-     * code offsets.
-     */
-    private final Map<Label, Integer> labels;
-
-    /**
-     * The labels used in this method. Every used label must be visited with
-     * visitLabel before the end of the method (i.e. should be in #labels).
-     */
-    private Set<Label> usedLabels;
-
-    /**
-     * Number of visited frames in expanded form.
-     */
-    private int expandedFrames;
-
-    /**
-     * Number of visited frames in compressed form.
-     */
-    private int compressedFrames;
-
-    /**
-     * Number of instructions before the last visited frame.
-     */
-    private int lastFrame = -1;
-
-    /**
-     * The exception handler ranges. Each pair of list element contains the
-     * start and end labels of an exception handler block.
-     */
-    private List<Label> handlers;
-
-    /**
-     * Code of the visit method to be used for each opcode.
-     */
-    private static final int[] TYPE;
-
-    /**
-     * The Label.status field.
-     */
-    private static Field labelStatusField;
-
-    static {
-        String s = "BBBBBBBBBBBBBBBBCCIAADDDDDAAAAAAAAAAAAAAAAAAAABBBBBBBBDD"
-                + "DDDAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
-                + "BBBBBBBBBBBBBBBBBBBJBBBBBBBBBBBBBBBBBBBBHHHHHHHHHHHHHHHHD"
-                + "KLBBBBBBFFFFGGGGAECEBBEEBBAMHHAA";
-        TYPE = new int[s.length()];
-        for (int i = 0; i < TYPE.length; ++i) {
-            TYPE[i] = s.charAt(i) - 'A' - 1;
-        }
-    }
-
-    // code to generate the above string
-    // public static void main (String[] args) {
-    // int[] TYPE = new int[] {
-    // 0, //NOP
-    // 0, //ACONST_NULL
-    // 0, //ICONST_M1
-    // 0, //ICONST_0
-    // 0, //ICONST_1
-    // 0, //ICONST_2
-    // 0, //ICONST_3
-    // 0, //ICONST_4
-    // 0, //ICONST_5
-    // 0, //LCONST_0
-    // 0, //LCONST_1
-    // 0, //FCONST_0
-    // 0, //FCONST_1
-    // 0, //FCONST_2
-    // 0, //DCONST_0
-    // 0, //DCONST_1
-    // 1, //BIPUSH
-    // 1, //SIPUSH
-    // 7, //LDC
-    // -1, //LDC_W
-    // -1, //LDC2_W
-    // 2, //ILOAD
-    // 2, //LLOAD
-    // 2, //FLOAD
-    // 2, //DLOAD
-    // 2, //ALOAD
-    // -1, //ILOAD_0
-    // -1, //ILOAD_1
-    // -1, //ILOAD_2
-    // -1, //ILOAD_3
-    // -1, //LLOAD_0
-    // -1, //LLOAD_1
-    // -1, //LLOAD_2
-    // -1, //LLOAD_3
-    // -1, //FLOAD_0
-    // -1, //FLOAD_1
-    // -1, //FLOAD_2
-    // -1, //FLOAD_3
-    // -1, //DLOAD_0
-    // -1, //DLOAD_1
-    // -1, //DLOAD_2
-    // -1, //DLOAD_3
-    // -1, //ALOAD_0
-    // -1, //ALOAD_1
-    // -1, //ALOAD_2
-    // -1, //ALOAD_3
-    // 0, //IALOAD
-    // 0, //LALOAD
-    // 0, //FALOAD
-    // 0, //DALOAD
-    // 0, //AALOAD
-    // 0, //BALOAD
-    // 0, //CALOAD
-    // 0, //SALOAD
-    // 2, //ISTORE
-    // 2, //LSTORE
-    // 2, //FSTORE
-    // 2, //DSTORE
-    // 2, //ASTORE
-    // -1, //ISTORE_0
-    // -1, //ISTORE_1
-    // -1, //ISTORE_2
-    // -1, //ISTORE_3
-    // -1, //LSTORE_0
-    // -1, //LSTORE_1
-    // -1, //LSTORE_2
-    // -1, //LSTORE_3
-    // -1, //FSTORE_0
-    // -1, //FSTORE_1
-    // -1, //FSTORE_2
-    // -1, //FSTORE_3
-    // -1, //DSTORE_0
-    // -1, //DSTORE_1
-    // -1, //DSTORE_2
-    // -1, //DSTORE_3
-    // -1, //ASTORE_0
-    // -1, //ASTORE_1
-    // -1, //ASTORE_2
-    // -1, //ASTORE_3
-    // 0, //IASTORE
-    // 0, //LASTORE
-    // 0, //FASTORE
-    // 0, //DASTORE
-    // 0, //AASTORE
-    // 0, //BASTORE
-    // 0, //CASTORE
-    // 0, //SASTORE
-    // 0, //POP
-    // 0, //POP2
-    // 0, //DUP
-    // 0, //DUP_X1
-    // 0, //DUP_X2
-    // 0, //DUP2
-    // 0, //DUP2_X1
-    // 0, //DUP2_X2
-    // 0, //SWAP
-    // 0, //IADD
-    // 0, //LADD
-    // 0, //FADD
-    // 0, //DADD
-    // 0, //ISUB
-    // 0, //LSUB
-    // 0, //FSUB
-    // 0, //DSUB
-    // 0, //IMUL
-    // 0, //LMUL
-    // 0, //FMUL
-    // 0, //DMUL
-    // 0, //IDIV
-    // 0, //LDIV
-    // 0, //FDIV
-    // 0, //DDIV
-    // 0, //IREM
-    // 0, //LREM
-    // 0, //FREM
-    // 0, //DREM
-    // 0, //INEG
-    // 0, //LNEG
-    // 0, //FNEG
-    // 0, //DNEG
-    // 0, //ISHL
-    // 0, //LSHL
-    // 0, //ISHR
-    // 0, //LSHR
-    // 0, //IUSHR
-    // 0, //LUSHR
-    // 0, //IAND
-    // 0, //LAND
-    // 0, //IOR
-    // 0, //LOR
-    // 0, //IXOR
-    // 0, //LXOR
-    // 8, //IINC
-    // 0, //I2L
-    // 0, //I2F
-    // 0, //I2D
-    // 0, //L2I
-    // 0, //L2F
-    // 0, //L2D
-    // 0, //F2I
-    // 0, //F2L
-    // 0, //F2D
-    // 0, //D2I
-    // 0, //D2L
-    // 0, //D2F
-    // 0, //I2B
-    // 0, //I2C
-    // 0, //I2S
-    // 0, //LCMP
-    // 0, //FCMPL
-    // 0, //FCMPG
-    // 0, //DCMPL
-    // 0, //DCMPG
-    // 6, //IFEQ
-    // 6, //IFNE
-    // 6, //IFLT
-    // 6, //IFGE
-    // 6, //IFGT
-    // 6, //IFLE
-    // 6, //IF_ICMPEQ
-    // 6, //IF_ICMPNE
-    // 6, //IF_ICMPLT
-    // 6, //IF_ICMPGE
-    // 6, //IF_ICMPGT
-    // 6, //IF_ICMPLE
-    // 6, //IF_ACMPEQ
-    // 6, //IF_ACMPNE
-    // 6, //GOTO
-    // 6, //JSR
-    // 2, //RET
-    // 9, //TABLESWITCH
-    // 10, //LOOKUPSWITCH
-    // 0, //IRETURN
-    // 0, //LRETURN
-    // 0, //FRETURN
-    // 0, //DRETURN
-    // 0, //ARETURN
-    // 0, //RETURN
-    // 4, //GETSTATIC
-    // 4, //PUTSTATIC
-    // 4, //GETFIELD
-    // 4, //PUTFIELD
-    // 5, //INVOKEVIRTUAL
-    // 5, //INVOKESPECIAL
-    // 5, //INVOKESTATIC
-    // 5, //INVOKEINTERFACE
-    // -1, //INVOKEDYNAMIC
-    // 3, //NEW
-    // 1, //NEWARRAY
-    // 3, //ANEWARRAY
-    // 0, //ARRAYLENGTH
-    // 0, //ATHROW
-    // 3, //CHECKCAST
-    // 3, //INSTANCEOF
-    // 0, //MONITORENTER
-    // 0, //MONITOREXIT
-    // -1, //WIDE
-    // 11, //MULTIANEWARRAY
-    // 6, //IFNULL
-    // 6, //IFNONNULL
-    // -1, //GOTO_W
-    // -1 //JSR_W
-    // };
-    // for (int i = 0; i < TYPE.length; ++i) {
-    // System.out.print((char)(TYPE[i] + 1 + 'A'));
-    // }
-    // System.out.println();
-    // }
-
-    /**
-     * Constructs a new {@link CheckMethodAdapter} object. This method adapter
-     * will not perform any data flow check (see
-     * {@link #CheckMethodAdapter(int,String,String,MethodVisitor,Map)}).
-     * <i>Subclasses must not use this constructor</i>. Instead, they must use
-     * the {@link #CheckMethodAdapter(int, MethodVisitor, Map)} version.
-     *
-     * @param mv
-     *            the method visitor to which this adapter must delegate calls.
-     */
-    public CheckMethodAdapter(final MethodVisitor mv) {
-        this(mv, new HashMap<Label, Integer>());
-    }
-
-    /**
-     * Constructs a new {@link CheckMethodAdapter} object. This method adapter
-     * will not perform any data flow check (see
-     * {@link #CheckMethodAdapter(int,String,String,MethodVisitor,Map)}).
-     * <i>Subclasses must not use this constructor</i>. Instead, they must use
-     * the {@link #CheckMethodAdapter(int, MethodVisitor, Map)} version.
-     *
-     * @param mv
-     *            the method visitor to which this adapter must delegate calls.
-     * @param labels
-     *            a map of already visited labels (in other methods).
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public CheckMethodAdapter(final MethodVisitor mv,
-            final Map<Label, Integer> labels) {
-        this(Opcodes.ASM5, mv, labels);
-        if (getClass() != CheckMethodAdapter.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs a new {@link CheckMethodAdapter} object. This method adapter
-     * will not perform any data flow check (see
-     * {@link #CheckMethodAdapter(int,String,String,MethodVisitor,Map)}).
-     *
-     * @param mv
-     *            the method visitor to which this adapter must delegate calls.
-     * @param labels
-     *            a map of already visited labels (in other methods).
-     */
-    protected CheckMethodAdapter(final int api, final MethodVisitor mv,
-            final Map<Label, Integer> labels) {
-        super(api, mv);
-        this.labels = labels;
-        this.usedLabels = new HashSet<Label>();
-        this.handlers = new ArrayList<Label>();
-    }
-
-    /**
-     * Constructs a new {@link CheckMethodAdapter} object. This method adapter
-     * will perform basic data flow checks. For instance in a method whose
-     * signature is <tt>void m ()</tt>, the invalid instruction IRETURN, or the
-     * invalid sequence IADD L2I will be detected.
-     *
-     * @param access
-     *            the method's access flags.
-     * @param name
-     *            the method's name.
-     * @param desc
-     *            the method's descriptor (see {@link Type Type}).
-     * @param cmv
-     *            the method visitor to which this adapter must delegate calls.
-     * @param labels
-     *            a map of already visited labels (in other methods).
-     */
-    public CheckMethodAdapter(final int access, final String name,
-            final String desc, final MethodVisitor cmv,
-            final Map<Label, Integer> labels) {
-        this(new MethodNode(Opcodes.ASM5, access, name, desc, null, null) {
-            @Override
-            public void visitEnd() {
-                Analyzer<BasicValue> a = new Analyzer<BasicValue>(
-                        new BasicVerifier());
-                try {
-                    a.analyze("dummy", this);
-                } catch (Exception e) {
-                    if (e instanceof IndexOutOfBoundsException
-                            && maxLocals == 0 && maxStack == 0) {
-                        throw new RuntimeException(
-                                "Data flow checking option requires valid, non zero maxLocals and maxStack values.");
-                    }
-                    e.printStackTrace();
-                    StringWriter sw = new StringWriter();
-                    PrintWriter pw = new PrintWriter(sw, true);
-                    CheckClassAdapter.printAnalyzerResult(this, a, pw);
-                    pw.close();
-                    throw new RuntimeException(e.getMessage() + ' '
-                            + sw.toString());
-                }
-                accept(cmv);
-            }
-        }, labels);
-        this.access = access;
-    }
-
-    @Override
-    public void visitParameter(String name, int access) {
-        if (name != null) {
-            checkUnqualifiedName(version, name, "name");
-        }
-        CheckClassAdapter.checkAccess(access, Opcodes.ACC_FINAL
-                + Opcodes.ACC_MANDATED + Opcodes.ACC_SYNTHETIC);
-        super.visitParameter(name, access);
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        checkEndMethod();
-        checkDesc(desc, false);
-        return new CheckAnnotationAdapter(super.visitAnnotation(desc, visible));
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        checkEndMethod();
-        int sort = typeRef >>> 24;
-        if (sort != TypeReference.METHOD_TYPE_PARAMETER
-                && sort != TypeReference.METHOD_TYPE_PARAMETER_BOUND
-                && sort != TypeReference.METHOD_RETURN
-                && sort != TypeReference.METHOD_RECEIVER
-                && sort != TypeReference.METHOD_FORMAL_PARAMETER
-                && sort != TypeReference.THROWS) {
-            throw new IllegalArgumentException("Invalid type reference sort 0x"
-                    + Integer.toHexString(sort));
-        }
-        CheckClassAdapter.checkTypeRefAndPath(typeRef, typePath);
-        CheckMethodAdapter.checkDesc(desc, false);
-        return new CheckAnnotationAdapter(super.visitTypeAnnotation(typeRef,
-                typePath, desc, visible));
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotationDefault() {
-        checkEndMethod();
-        return new CheckAnnotationAdapter(super.visitAnnotationDefault(), false);
-    }
-
-    @Override
-    public AnnotationVisitor visitParameterAnnotation(final int parameter,
-            final String desc, final boolean visible) {
-        checkEndMethod();
-        checkDesc(desc, false);
-        return new CheckAnnotationAdapter(super.visitParameterAnnotation(
-                parameter, desc, visible));
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        checkEndMethod();
-        if (attr == null) {
-            throw new IllegalArgumentException(
-                    "Invalid attribute (must not be null)");
-        }
-        super.visitAttribute(attr);
-    }
-
-    @Override
-    public void visitCode() {
-        if ((access & Opcodes.ACC_ABSTRACT) != 0) {
-            throw new RuntimeException("Abstract methods cannot have code");
-        }
-        startCode = true;
-        super.visitCode();
-    }
-
-    @Override
-    public void visitFrame(final int type, final int nLocal,
-            final Object[] local, final int nStack, final Object[] stack) {
-        if (insnCount == lastFrame) {
-            throw new IllegalStateException(
-                    "At most one frame can be visited at a given code location.");
-        }
-        lastFrame = insnCount;
-        int mLocal;
-        int mStack;
-        switch (type) {
-        case Opcodes.F_NEW:
-        case Opcodes.F_FULL:
-            mLocal = Integer.MAX_VALUE;
-            mStack = Integer.MAX_VALUE;
-            break;
-
-        case Opcodes.F_SAME:
-            mLocal = 0;
-            mStack = 0;
-            break;
-
-        case Opcodes.F_SAME1:
-            mLocal = 0;
-            mStack = 1;
-            break;
-
-        case Opcodes.F_APPEND:
-        case Opcodes.F_CHOP:
-            mLocal = 3;
-            mStack = 0;
-            break;
-
-        default:
-            throw new IllegalArgumentException("Invalid frame type " + type);
-        }
-
-        if (nLocal > mLocal) {
-            throw new IllegalArgumentException("Invalid nLocal=" + nLocal
-                    + " for frame type " + type);
-        }
-        if (nStack > mStack) {
-            throw new IllegalArgumentException("Invalid nStack=" + nStack
-                    + " for frame type " + type);
-        }
-
-        if (type != Opcodes.F_CHOP) {
-            if (nLocal > 0 && (local == null || local.length < nLocal)) {
-                throw new IllegalArgumentException(
-                        "Array local[] is shorter than nLocal");
-            }
-            for (int i = 0; i < nLocal; ++i) {
-                checkFrameValue(local[i]);
-            }
-        }
-        if (nStack > 0 && (stack == null || stack.length < nStack)) {
-            throw new IllegalArgumentException(
-                    "Array stack[] is shorter than nStack");
-        }
-        for (int i = 0; i < nStack; ++i) {
-            checkFrameValue(stack[i]);
-        }
-        if (type == Opcodes.F_NEW) {
-            ++expandedFrames;
-        } else {
-            ++compressedFrames;
-        }
-        if (expandedFrames > 0 && compressedFrames > 0) {
-            throw new RuntimeException(
-                    "Expanded and compressed frames must not be mixed.");
-        }
-        super.visitFrame(type, nLocal, local, nStack, stack);
-    }
-
-    @Override
-    public void visitInsn(final int opcode) {
-        checkStartCode();
-        checkEndCode();
-        checkOpcode(opcode, 0);
-        super.visitInsn(opcode);
-        ++insnCount;
-    }
-
-    @Override
-    public void visitIntInsn(final int opcode, final int operand) {
-        checkStartCode();
-        checkEndCode();
-        checkOpcode(opcode, 1);
-        switch (opcode) {
-        case Opcodes.BIPUSH:
-            checkSignedByte(operand, "Invalid operand");
-            break;
-        case Opcodes.SIPUSH:
-            checkSignedShort(operand, "Invalid operand");
-            break;
-        // case Constants.NEWARRAY:
-        default:
-            if (operand < Opcodes.T_BOOLEAN || operand > Opcodes.T_LONG) {
-                throw new IllegalArgumentException(
-                        "Invalid operand (must be an array type code T_...): "
-                                + operand);
-            }
-        }
-        super.visitIntInsn(opcode, operand);
-        ++insnCount;
-    }
-
-    @Override
-    public void visitVarInsn(final int opcode, final int var) {
-        checkStartCode();
-        checkEndCode();
-        checkOpcode(opcode, 2);
-        checkUnsignedShort(var, "Invalid variable index");
-        super.visitVarInsn(opcode, var);
-        ++insnCount;
-    }
-
-    @Override
-    public void visitTypeInsn(final int opcode, final String type) {
-        checkStartCode();
-        checkEndCode();
-        checkOpcode(opcode, 3);
-        checkInternalName(type, "type");
-        if (opcode == Opcodes.NEW && type.charAt(0) == '[') {
-            throw new IllegalArgumentException(
-                    "NEW cannot be used to create arrays: " + type);
-        }
-        super.visitTypeInsn(opcode, type);
-        ++insnCount;
-    }
-
-    @Override
-    public void visitFieldInsn(final int opcode, final String owner,
-            final String name, final String desc) {
-        checkStartCode();
-        checkEndCode();
-        checkOpcode(opcode, 4);
-        checkInternalName(owner, "owner");
-        checkUnqualifiedName(version, name, "name");
-        checkDesc(desc, false);
-        super.visitFieldInsn(opcode, owner, name, desc);
-        ++insnCount;
-    }
-
-    @Deprecated
-    @Override
-    public void visitMethodInsn(int opcode, String owner, String name,
-            String desc) {
-        if (api >= Opcodes.ASM5) {
-            super.visitMethodInsn(opcode, owner, name, desc);
-            return;
-        }
-        doVisitMethodInsn(opcode, owner, name, desc,
-                opcode == Opcodes.INVOKEINTERFACE);
-    }
-
-    @Override
-    public void visitMethodInsn(int opcode, String owner, String name,
-            String desc, boolean itf) {
-        if (api < Opcodes.ASM5) {
-            super.visitMethodInsn(opcode, owner, name, desc, itf);
-            return;
-        }
-        doVisitMethodInsn(opcode, owner, name, desc, itf);
-    }
-
-    private void doVisitMethodInsn(int opcode, final String owner,
-            final String name, final String desc, final boolean itf) {
-        checkStartCode();
-        checkEndCode();
-        checkOpcode(opcode, 5);
-        if (opcode != Opcodes.INVOKESPECIAL || !"<init>".equals(name)) {
-            checkMethodIdentifier(version, name, "name");
-        }
-        checkInternalName(owner, "owner");
-        checkMethodDesc(desc);
-        if (opcode == Opcodes.INVOKEVIRTUAL && itf) {
-            throw new IllegalArgumentException(
-                    "INVOKEVIRTUAL can't be used with interfaces");
-        }
-        if (opcode == Opcodes.INVOKEINTERFACE && !itf) {
-            throw new IllegalArgumentException(
-                    "INVOKEINTERFACE can't be used with classes");
-        }
-        // Calling super.visitMethodInsn requires to call the correct version
-        // depending on this.api (otherwise infinite loops can occur). To
-        // simplify and to make it easier to automatically remove the backward
-        // compatibility code, we inline the code of the overridden method here.
-        if (mv != null) {
-            mv.visitMethodInsn(opcode, owner, name, desc, itf);
-        }
-        ++insnCount;
-    }
-
-    @Override
-    public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
-            Object... bsmArgs) {
-        checkStartCode();
-        checkEndCode();
-        checkMethodIdentifier(version, name, "name");
-        checkMethodDesc(desc);
-        if (bsm.getTag() != Opcodes.H_INVOKESTATIC
-                && bsm.getTag() != Opcodes.H_NEWINVOKESPECIAL) {
-            throw new IllegalArgumentException("invalid handle tag "
-                    + bsm.getTag());
-        }
-        for (int i = 0; i < bsmArgs.length; i++) {
-            checkLDCConstant(bsmArgs[i]);
-        }
-        super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
-        ++insnCount;
-    }
-
-    @Override
-    public void visitJumpInsn(final int opcode, final Label label) {
-        checkStartCode();
-        checkEndCode();
-        checkOpcode(opcode, 6);
-        checkLabel(label, false, "label");
-        checkNonDebugLabel(label);
-        super.visitJumpInsn(opcode, label);
-        usedLabels.add(label);
-        ++insnCount;
-    }
-
-    @Override
-    public void visitLabel(final Label label) {
-        checkStartCode();
-        checkEndCode();
-        checkLabel(label, false, "label");
-        if (labels.get(label) != null) {
-            throw new IllegalArgumentException("Already visited label");
-        }
-        labels.put(label, new Integer(insnCount));
-        super.visitLabel(label);
-    }
-
-    @Override
-    public void visitLdcInsn(final Object cst) {
-        checkStartCode();
-        checkEndCode();
-        checkLDCConstant(cst);
-        super.visitLdcInsn(cst);
-        ++insnCount;
-    }
-
-    @Override
-    public void visitIincInsn(final int var, final int increment) {
-        checkStartCode();
-        checkEndCode();
-        checkUnsignedShort(var, "Invalid variable index");
-        checkSignedShort(increment, "Invalid increment");
-        super.visitIincInsn(var, increment);
-        ++insnCount;
-    }
-
-    @Override
-    public void visitTableSwitchInsn(final int min, final int max,
-            final Label dflt, final Label... labels) {
-        checkStartCode();
-        checkEndCode();
-        if (max < min) {
-            throw new IllegalArgumentException("Max = " + max
-                    + " must be greater than or equal to min = " + min);
-        }
-        checkLabel(dflt, false, "default label");
-        checkNonDebugLabel(dflt);
-        if (labels == null || labels.length != max - min + 1) {
-            throw new IllegalArgumentException(
-                    "There must be max - min + 1 labels");
-        }
-        for (int i = 0; i < labels.length; ++i) {
-            checkLabel(labels[i], false, "label at index " + i);
-            checkNonDebugLabel(labels[i]);
-        }
-        super.visitTableSwitchInsn(min, max, dflt, labels);
-        for (int i = 0; i < labels.length; ++i) {
-            usedLabels.add(labels[i]);
-        }
-        ++insnCount;
-    }
-
-    @Override
-    public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
-            final Label[] labels) {
-        checkEndCode();
-        checkStartCode();
-        checkLabel(dflt, false, "default label");
-        checkNonDebugLabel(dflt);
-        if (keys == null || labels == null || keys.length != labels.length) {
-            throw new IllegalArgumentException(
-                    "There must be the same number of keys and labels");
-        }
-        for (int i = 0; i < labels.length; ++i) {
-            checkLabel(labels[i], false, "label at index " + i);
-            checkNonDebugLabel(labels[i]);
-        }
-        super.visitLookupSwitchInsn(dflt, keys, labels);
-        usedLabels.add(dflt);
-        for (int i = 0; i < labels.length; ++i) {
-            usedLabels.add(labels[i]);
-        }
-        ++insnCount;
-    }
-
-    @Override
-    public void visitMultiANewArrayInsn(final String desc, final int dims) {
-        checkStartCode();
-        checkEndCode();
-        checkDesc(desc, false);
-        if (desc.charAt(0) != '[') {
-            throw new IllegalArgumentException(
-                    "Invalid descriptor (must be an array type descriptor): "
-                            + desc);
-        }
-        if (dims < 1) {
-            throw new IllegalArgumentException(
-                    "Invalid dimensions (must be greater than 0): " + dims);
-        }
-        if (dims > desc.lastIndexOf('[') + 1) {
-            throw new IllegalArgumentException(
-                    "Invalid dimensions (must not be greater than dims(desc)): "
-                            + dims);
-        }
-        super.visitMultiANewArrayInsn(desc, dims);
-        ++insnCount;
-    }
-
-    @Override
-    public AnnotationVisitor visitInsnAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        checkStartCode();
-        checkEndCode();
-        int sort = typeRef >>> 24;
-        if (sort != TypeReference.INSTANCEOF && sort != TypeReference.NEW
-                && sort != TypeReference.CONSTRUCTOR_REFERENCE
-                && sort != TypeReference.METHOD_REFERENCE
-                && sort != TypeReference.CAST
-                && sort != TypeReference.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
-                && sort != TypeReference.METHOD_INVOCATION_TYPE_ARGUMENT
-                && sort != TypeReference.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
-                && sort != TypeReference.METHOD_REFERENCE_TYPE_ARGUMENT) {
-            throw new IllegalArgumentException("Invalid type reference sort 0x"
-                    + Integer.toHexString(sort));
-        }
-        CheckClassAdapter.checkTypeRefAndPath(typeRef, typePath);
-        CheckMethodAdapter.checkDesc(desc, false);
-        return new CheckAnnotationAdapter(super.visitInsnAnnotation(typeRef,
-                typePath, desc, visible));
-    }
-
-    @Override
-    public void visitTryCatchBlock(final Label start, final Label end,
-            final Label handler, final String type) {
-        checkStartCode();
-        checkEndCode();
-        checkLabel(start, false, "start label");
-        checkLabel(end, false, "end label");
-        checkLabel(handler, false, "handler label");
-        checkNonDebugLabel(start);
-        checkNonDebugLabel(end);
-        checkNonDebugLabel(handler);
-        if (labels.get(start) != null || labels.get(end) != null
-                || labels.get(handler) != null) {
-            throw new IllegalStateException(
-                    "Try catch blocks must be visited before their labels");
-        }
-        if (type != null) {
-            checkInternalName(type, "type");
-        }
-        super.visitTryCatchBlock(start, end, handler, type);
-        handlers.add(start);
-        handlers.add(end);
-    }
-
-    @Override
-    public AnnotationVisitor visitTryCatchAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        checkStartCode();
-        checkEndCode();
-        int sort = typeRef >>> 24;
-        if (sort != TypeReference.EXCEPTION_PARAMETER) {
-            throw new IllegalArgumentException("Invalid type reference sort 0x"
-                    + Integer.toHexString(sort));
-        }
-        CheckClassAdapter.checkTypeRefAndPath(typeRef, typePath);
-        CheckMethodAdapter.checkDesc(desc, false);
-        return new CheckAnnotationAdapter(super.visitTryCatchAnnotation(
-                typeRef, typePath, desc, visible));
-    }
-
-    @Override
-    public void visitLocalVariable(final String name, final String desc,
-            final String signature, final Label start, final Label end,
-            final int index) {
-        checkStartCode();
-        checkEndCode();
-        checkUnqualifiedName(version, name, "name");
-        checkDesc(desc, false);
-        checkLabel(start, true, "start label");
-        checkLabel(end, true, "end label");
-        checkUnsignedShort(index, "Invalid variable index");
-        int s = labels.get(start).intValue();
-        int e = labels.get(end).intValue();
-        if (e < s) {
-            throw new IllegalArgumentException(
-                    "Invalid start and end labels (end must be greater than start)");
-        }
-        super.visitLocalVariable(name, desc, signature, start, end, index);
-    }
-
-    @Override
-    public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
-            TypePath typePath, Label[] start, Label[] end, int[] index,
-            String desc, boolean visible) {
-        checkStartCode();
-        checkEndCode();
-        int sort = typeRef >>> 24;
-        if (sort != TypeReference.LOCAL_VARIABLE
-                && sort != TypeReference.RESOURCE_VARIABLE) {
-            throw new IllegalArgumentException("Invalid type reference sort 0x"
-                    + Integer.toHexString(sort));
-        }
-        CheckClassAdapter.checkTypeRefAndPath(typeRef, typePath);
-        checkDesc(desc, false);
-        if (start == null || end == null || index == null
-                || end.length != start.length || index.length != start.length) {
-            throw new IllegalArgumentException(
-                    "Invalid start, end and index arrays (must be non null and of identical length");
-        }
-        for (int i = 0; i < start.length; ++i) {
-            checkLabel(start[i], true, "start label");
-            checkLabel(end[i], true, "end label");
-            checkUnsignedShort(index[i], "Invalid variable index");
-            int s = labels.get(start[i]).intValue();
-            int e = labels.get(end[i]).intValue();
-            if (e < s) {
-                throw new IllegalArgumentException(
-                        "Invalid start and end labels (end must be greater than start)");
-            }
-        }
-        return super.visitLocalVariableAnnotation(typeRef, typePath, start,
-                end, index, desc, visible);
-    }
-
-    @Override
-    public void visitLineNumber(final int line, final Label start) {
-        checkStartCode();
-        checkEndCode();
-        checkUnsignedShort(line, "Invalid line number");
-        checkLabel(start, true, "start label");
-        super.visitLineNumber(line, start);
-    }
-
-    @Override
-    public void visitMaxs(final int maxStack, final int maxLocals) {
-        checkStartCode();
-        checkEndCode();
-        endCode = true;
-        for (Label l : usedLabels) {
-            if (labels.get(l) == null) {
-                throw new IllegalStateException("Undefined label used");
-            }
-        }
-        for (int i = 0; i < handlers.size();) {
-            Integer start = labels.get(handlers.get(i++));
-            Integer end = labels.get(handlers.get(i++));
-            if (start == null || end == null) {
-                throw new IllegalStateException(
-                        "Undefined try catch block labels");
-            }
-            if (end.intValue() <= start.intValue()) {
-                throw new IllegalStateException(
-                        "Emty try catch block handler range");
-            }
-        }
-        checkUnsignedShort(maxStack, "Invalid max stack");
-        checkUnsignedShort(maxLocals, "Invalid max locals");
-        super.visitMaxs(maxStack, maxLocals);
-    }
-
-    @Override
-    public void visitEnd() {
-        checkEndMethod();
-        endMethod = true;
-        super.visitEnd();
-    }
-
-    // -------------------------------------------------------------------------
-
-    /**
-     * Checks that the visitCode method has been called.
-     */
-    void checkStartCode() {
-        if (!startCode) {
-            throw new IllegalStateException(
-                    "Cannot visit instructions before visitCode has been called.");
-        }
-    }
-
-    /**
-     * Checks that the visitMaxs method has not been called.
-     */
-    void checkEndCode() {
-        if (endCode) {
-            throw new IllegalStateException(
-                    "Cannot visit instructions after visitMaxs has been called.");
-        }
-    }
-
-    /**
-     * Checks that the visitEnd method has not been called.
-     */
-    void checkEndMethod() {
-        if (endMethod) {
-            throw new IllegalStateException(
-                    "Cannot visit elements after visitEnd has been called.");
-        }
-    }
-
-    /**
-     * Checks a stack frame value.
-     *
-     * @param value
-     *            the value to be checked.
-     */
-    void checkFrameValue(final Object value) {
-        if (value == Opcodes.TOP || value == Opcodes.INTEGER
-                || value == Opcodes.FLOAT || value == Opcodes.LONG
-                || value == Opcodes.DOUBLE || value == Opcodes.NULL
-                || value == Opcodes.UNINITIALIZED_THIS) {
-            return;
-        }
-        if (value instanceof String) {
-            checkInternalName((String) value, "Invalid stack frame value");
-            return;
-        }
-        if (!(value instanceof Label)) {
-            throw new IllegalArgumentException("Invalid stack frame value: "
-                    + value);
-        } else {
-            usedLabels.add((Label) value);
-        }
-    }
-
-    /**
-     * Checks that the type of the given opcode is equal to the given type.
-     *
-     * @param opcode
-     *            the opcode to be checked.
-     * @param type
-     *            the expected opcode type.
-     */
-    static void checkOpcode(final int opcode, final int type) {
-        if (opcode < 0 || opcode > 199 || TYPE[opcode] != type) {
-            throw new IllegalArgumentException("Invalid opcode: " + opcode);
-        }
-    }
-
-    /**
-     * Checks that the given value is a signed byte.
-     *
-     * @param value
-     *            the value to be checked.
-     * @param msg
-     *            an message to be used in case of error.
-     */
-    static void checkSignedByte(final int value, final String msg) {
-        if (value < Byte.MIN_VALUE || value > Byte.MAX_VALUE) {
-            throw new IllegalArgumentException(msg
-                    + " (must be a signed byte): " + value);
-        }
-    }
-
-    /**
-     * Checks that the given value is a signed short.
-     *
-     * @param value
-     *            the value to be checked.
-     * @param msg
-     *            an message to be used in case of error.
-     */
-    static void checkSignedShort(final int value, final String msg) {
-        if (value < Short.MIN_VALUE || value > Short.MAX_VALUE) {
-            throw new IllegalArgumentException(msg
-                    + " (must be a signed short): " + value);
-        }
-    }
-
-    /**
-     * Checks that the given value is an unsigned short.
-     *
-     * @param value
-     *            the value to be checked.
-     * @param msg
-     *            an message to be used in case of error.
-     */
-    static void checkUnsignedShort(final int value, final String msg) {
-        if (value < 0 || value > 65535) {
-            throw new IllegalArgumentException(msg
-                    + " (must be an unsigned short): " + value);
-        }
-    }
-
-    /**
-     * Checks that the given value is an {@link Integer}, a{@link Float}, a
-     * {@link Long}, a {@link Double} or a {@link String}.
-     *
-     * @param cst
-     *            the value to be checked.
-     */
-    static void checkConstant(final Object cst) {
-        if (!(cst instanceof Integer) && !(cst instanceof Float)
-                && !(cst instanceof Long) && !(cst instanceof Double)
-                && !(cst instanceof String)) {
-            throw new IllegalArgumentException("Invalid constant: " + cst);
-        }
-    }
-
-    void checkLDCConstant(final Object cst) {
-        if (cst instanceof Type) {
-            int s = ((Type) cst).getSort();
-            if (s != Type.OBJECT && s != Type.ARRAY && s != Type.METHOD) {
-                throw new IllegalArgumentException("Illegal LDC constant value");
-            }
-            if (s != Type.METHOD && (version & 0xFFFF) < Opcodes.V1_5) {
-                throw new IllegalArgumentException(
-                        "ldc of a constant class requires at least version 1.5");
-            }
-            if (s == Type.METHOD && (version & 0xFFFF) < Opcodes.V1_7) {
-                throw new IllegalArgumentException(
-                        "ldc of a method type requires at least version 1.7");
-            }
-        } else if (cst instanceof Handle) {
-            if ((version & 0xFFFF) < Opcodes.V1_7) {
-                throw new IllegalArgumentException(
-                        "ldc of a handle requires at least version 1.7");
-            }
-            int tag = ((Handle) cst).getTag();
-            if (tag < Opcodes.H_GETFIELD || tag > Opcodes.H_INVOKEINTERFACE) {
-                throw new IllegalArgumentException("invalid handle tag " + tag);
-            }
-        } else {
-            checkConstant(cst);
-        }
-    }
-
-    /**
-     * Checks that the given string is a valid unqualified name.
-     *
-     * @param version
-     *            the class version.
-     * @param name
-     *            the string to be checked.
-     * @param msg
-     *            a message to be used in case of error.
-     */
-    static void checkUnqualifiedName(int version, final String name,
-            final String msg) {
-        if ((version & 0xFFFF) < Opcodes.V1_5) {
-            checkIdentifier(name, msg);
-        } else {
-            for (int i = 0; i < name.length(); ++i) {
-                if (".;[/".indexOf(name.charAt(i)) != -1) {
-                    throw new IllegalArgumentException("Invalid " + msg
-                            + " (must be a valid unqualified name): " + name);
-                }
-            }
-        }
-    }
-
-    /**
-     * Checks that the given string is a valid Java identifier.
-     *
-     * @param name
-     *            the string to be checked.
-     * @param msg
-     *            a message to be used in case of error.
-     */
-    static void checkIdentifier(final String name, final String msg) {
-        checkIdentifier(name, 0, -1, msg);
-    }
-
-    /**
-     * Checks that the given substring is a valid Java identifier.
-     *
-     * @param name
-     *            the string to be checked.
-     * @param start
-     *            index of the first character of the identifier (inclusive).
-     * @param end
-     *            index of the last character of the identifier (exclusive). -1
-     *            is equivalent to <tt>name.length()</tt> if name is not
-     *            <tt>null</tt>.
-     * @param msg
-     *            a message to be used in case of error.
-     */
-    static void checkIdentifier(final String name, final int start,
-            final int end, final String msg) {
-        if (name == null || (end == -1 ? name.length() <= start : end <= start)) {
-            throw new IllegalArgumentException("Invalid " + msg
-                    + " (must not be null or empty)");
-        }
-        if (!Character.isJavaIdentifierStart(name.charAt(start))) {
-            throw new IllegalArgumentException("Invalid " + msg
-                    + " (must be a valid Java identifier): " + name);
-        }
-        int max = end == -1 ? name.length() : end;
-        for (int i = start + 1; i < max; ++i) {
-            if (!Character.isJavaIdentifierPart(name.charAt(i))) {
-                throw new IllegalArgumentException("Invalid " + msg
-                        + " (must be a valid Java identifier): " + name);
-            }
-        }
-    }
-
-    /**
-     * Checks that the given string is a valid Java identifier.
-     *
-     * @param version
-     *            the class version.
-     * @param name
-     *            the string to be checked.
-     * @param msg
-     *            a message to be used in case of error.
-     */
-    static void checkMethodIdentifier(int version, final String name,
-            final String msg) {
-        if (name == null || name.length() == 0) {
-            throw new IllegalArgumentException("Invalid " + msg
-                    + " (must not be null or empty)");
-        }
-        if ((version & 0xFFFF) >= Opcodes.V1_5) {
-            for (int i = 0; i < name.length(); ++i) {
-                if (".;[/<>".indexOf(name.charAt(i)) != -1) {
-                    throw new IllegalArgumentException("Invalid " + msg
-                            + " (must be a valid unqualified name): " + name);
-                }
-            }
-            return;
-        }
-        if (!Character.isJavaIdentifierStart(name.charAt(0))) {
-            throw new IllegalArgumentException(
-                    "Invalid "
-                            + msg
-                            + " (must be a '<init>', '<clinit>' or a valid Java identifier): "
-                            + name);
-        }
-        for (int i = 1; i < name.length(); ++i) {
-            if (!Character.isJavaIdentifierPart(name.charAt(i))) {
-                throw new IllegalArgumentException(
-                        "Invalid "
-                                + msg
-                                + " (must be '<init>' or '<clinit>' or a valid Java identifier): "
-                                + name);
-            }
-        }
-    }
-
-    /**
-     * Checks that the given string is a valid internal class name.
-     *
-     * @param name
-     *            the string to be checked.
-     * @param msg
-     *            a message to be used in case of error.
-     */
-    static void checkInternalName(final String name, final String msg) {
-        if (name == null || name.length() == 0) {
-            throw new IllegalArgumentException("Invalid " + msg
-                    + " (must not be null or empty)");
-        }
-        if (name.charAt(0) == '[') {
-            checkDesc(name, false);
-        } else {
-            checkInternalName(name, 0, -1, msg);
-        }
-    }
-
-    /**
-     * Checks that the given substring is a valid internal class name.
-     *
-     * @param name
-     *            the string to be checked.
-     * @param start
-     *            index of the first character of the identifier (inclusive).
-     * @param end
-     *            index of the last character of the identifier (exclusive). -1
-     *            is equivalent to <tt>name.length()</tt> if name is not
-     *            <tt>null</tt>.
-     * @param msg
-     *            a message to be used in case of error.
-     */
-    static void checkInternalName(final String name, final int start,
-            final int end, final String msg) {
-        int max = end == -1 ? name.length() : end;
-        try {
-            int begin = start;
-            int slash;
-            do {
-                slash = name.indexOf('/', begin + 1);
-                if (slash == -1 || slash > max) {
-                    slash = max;
-                }
-                checkIdentifier(name, begin, slash, null);
-                begin = slash + 1;
-            } while (slash != max);
-        } catch (IllegalArgumentException unused) {
-            throw new IllegalArgumentException(
-                    "Invalid "
-                            + msg
-                            + " (must be a fully qualified class name in internal form): "
-                            + name);
-        }
-    }
-
-    /**
-     * Checks that the given string is a valid type descriptor.
-     *
-     * @param desc
-     *            the string to be checked.
-     * @param canBeVoid
-     *            <tt>true</tt> if <tt>V</tt> can be considered valid.
-     */
-    static void checkDesc(final String desc, final boolean canBeVoid) {
-        int end = checkDesc(desc, 0, canBeVoid);
-        if (end != desc.length()) {
-            throw new IllegalArgumentException("Invalid descriptor: " + desc);
-        }
-    }
-
-    /**
-     * Checks that a the given substring is a valid type descriptor.
-     *
-     * @param desc
-     *            the string to be checked.
-     * @param start
-     *            index of the first character of the identifier (inclusive).
-     * @param canBeVoid
-     *            <tt>true</tt> if <tt>V</tt> can be considered valid.
-     * @return the index of the last character of the type decriptor, plus one.
-     */
-    static int checkDesc(final String desc, final int start,
-            final boolean canBeVoid) {
-        if (desc == null || start >= desc.length()) {
-            throw new IllegalArgumentException(
-                    "Invalid type descriptor (must not be null or empty)");
-        }
-        int index;
-        switch (desc.charAt(start)) {
-        case 'V':
-            if (canBeVoid) {
-                return start + 1;
-            } else {
-                throw new IllegalArgumentException("Invalid descriptor: "
-                        + desc);
-            }
-        case 'Z':
-        case 'C':
-        case 'B':
-        case 'S':
-        case 'I':
-        case 'F':
-        case 'J':
-        case 'D':
-            return start + 1;
-        case '[':
-            index = start + 1;
-            while (index < desc.length() && desc.charAt(index) == '[') {
-                ++index;
-            }
-            if (index < desc.length()) {
-                return checkDesc(desc, index, false);
-            } else {
-                throw new IllegalArgumentException("Invalid descriptor: "
-                        + desc);
-            }
-        case 'L':
-            index = desc.indexOf(';', start);
-            if (index == -1 || index - start < 2) {
-                throw new IllegalArgumentException("Invalid descriptor: "
-                        + desc);
-            }
-            try {
-                checkInternalName(desc, start + 1, index, null);
-            } catch (IllegalArgumentException unused) {
-                throw new IllegalArgumentException("Invalid descriptor: "
-                        + desc);
-            }
-            return index + 1;
-        default:
-            throw new IllegalArgumentException("Invalid descriptor: " + desc);
-        }
-    }
-
-    /**
-     * Checks that the given string is a valid method descriptor.
-     *
-     * @param desc
-     *            the string to be checked.
-     */
-    static void checkMethodDesc(final String desc) {
-        if (desc == null || desc.length() == 0) {
-            throw new IllegalArgumentException(
-                    "Invalid method descriptor (must not be null or empty)");
-        }
-        if (desc.charAt(0) != '(' || desc.length() < 3) {
-            throw new IllegalArgumentException("Invalid descriptor: " + desc);
-        }
-        int start = 1;
-        if (desc.charAt(start) != ')') {
-            do {
-                if (desc.charAt(start) == 'V') {
-                    throw new IllegalArgumentException("Invalid descriptor: "
-                            + desc);
-                }
-                start = checkDesc(desc, start, false);
-            } while (start < desc.length() && desc.charAt(start) != ')');
-        }
-        start = checkDesc(desc, start + 1, true);
-        if (start != desc.length()) {
-            throw new IllegalArgumentException("Invalid descriptor: " + desc);
-        }
-    }
-
-    /**
-     * Checks that the given label is not null. This method can also check that
-     * the label has been visited.
-     *
-     * @param label
-     *            the label to be checked.
-     * @param checkVisited
-     *            <tt>true</tt> to check that the label has been visited.
-     * @param msg
-     *            a message to be used in case of error.
-     */
-    void checkLabel(final Label label, final boolean checkVisited,
-            final String msg) {
-        if (label == null) {
-            throw new IllegalArgumentException("Invalid " + msg
-                    + " (must not be null)");
-        }
-        if (checkVisited && labels.get(label) == null) {
-            throw new IllegalArgumentException("Invalid " + msg
-                    + " (must be visited first)");
-        }
-    }
-
-    /**
-     * Checks that the given label is not a label used only for debug purposes.
-     *
-     * @param label
-     *            the label to be checked.
-     */
-    private static void checkNonDebugLabel(final Label label) {
-        Field f = getLabelStatusField();
-        int status = 0;
-        try {
-            status = f == null ? 0 : ((Integer) f.get(label)).intValue();
-        } catch (IllegalAccessException e) {
-            throw new Error("Internal error");
-        }
-        if ((status & 0x01) != 0) {
-            throw new IllegalArgumentException(
-                    "Labels used for debug info cannot be reused for control flow");
-        }
-    }
-
-    /**
-     * Returns the Field object corresponding to the Label.status field.
-     *
-     * @return the Field object corresponding to the Label.status field.
-     */
-    private static Field getLabelStatusField() {
-        if (labelStatusField == null) {
-            labelStatusField = getLabelField("a");
-            if (labelStatusField == null) {
-                labelStatusField = getLabelField("status");
-            }
-        }
-        return labelStatusField;
-    }
-
-    /**
-     * Returns the field of the Label class whose name is given.
-     *
-     * @param name
-     *            a field name.
-     * @return the field of the Label class whose name is given, or null.
-     */
-    private static Field getLabelField(final String name) {
-        try {
-            Field f = Label.class.getDeclaredField(name);
-            f.setAccessible(true);
-            return f;
-        } catch (NoSuchFieldException e) {
-            return null;
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/CheckSignatureAdapter.java b/src/asm/scala/tools/asm/util/CheckSignatureAdapter.java
deleted file mode 100644
index 54c9033..0000000
--- a/src/asm/scala/tools/asm/util/CheckSignatureAdapter.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.signature.SignatureVisitor;
-
-/**
- * A {@link SignatureVisitor} that checks that its methods are properly used.
- *
- * @author Eric Bruneton
- */
-public class CheckSignatureAdapter extends SignatureVisitor {
-
-    /**
-     * Type to be used to check class signatures. See
-     * {@link #CheckSignatureAdapter(int, SignatureVisitor)
-     * CheckSignatureAdapter}.
-     */
-    public static final int CLASS_SIGNATURE = 0;
-
-    /**
-     * Type to be used to check method signatures. See
-     * {@link #CheckSignatureAdapter(int, SignatureVisitor)
-     * CheckSignatureAdapter}.
-     */
-    public static final int METHOD_SIGNATURE = 1;
-
-    /**
-     * Type to be used to check type signatures.See
-     * {@link #CheckSignatureAdapter(int, SignatureVisitor)
-     * CheckSignatureAdapter}.
-     */
-    public static final int TYPE_SIGNATURE = 2;
-
-    private static final int EMPTY = 1;
-
-    private static final int FORMAL = 2;
-
-    private static final int BOUND = 4;
-
-    private static final int SUPER = 8;
-
-    private static final int PARAM = 16;
-
-    private static final int RETURN = 32;
-
-    private static final int SIMPLE_TYPE = 64;
-
-    private static final int CLASS_TYPE = 128;
-
-    private static final int END = 256;
-
-    /**
-     * Type of the signature to be checked.
-     */
-    private final int type;
-
-    /**
-     * State of the automaton used to check the order of method calls.
-     */
-    private int state;
-
-    /**
-     * <tt>true</tt> if the checked type signature can be 'V'.
-     */
-    private boolean canBeVoid;
-
-    /**
-     * The visitor to which this adapter must delegate calls. May be
-     * <tt>null</tt>.
-     */
-    private final SignatureVisitor sv;
-
-    /**
-     * Creates a new {@link CheckSignatureAdapter} object. <i>Subclasses must
-     * not use this constructor</i>. Instead, they must use the
-     * {@link #CheckSignatureAdapter(int, int, SignatureVisitor)} version.
-     *
-     * @param type
-     *            the type of signature to be checked. See
-     *            {@link #CLASS_SIGNATURE}, {@link #METHOD_SIGNATURE} and
-     *            {@link #TYPE_SIGNATURE}.
-     * @param sv
-     *            the visitor to which this adapter must delegate calls. May be
-     *            <tt>null</tt>.
-     */
-    public CheckSignatureAdapter(final int type, final SignatureVisitor sv) {
-        this(Opcodes.ASM5, type, sv);
-    }
-
-    /**
-     * Creates a new {@link CheckSignatureAdapter} object.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param type
-     *            the type of signature to be checked. See
-     *            {@link #CLASS_SIGNATURE}, {@link #METHOD_SIGNATURE} and
-     *            {@link #TYPE_SIGNATURE}.
-     * @param sv
-     *            the visitor to which this adapter must delegate calls. May be
-     *            <tt>null</tt>.
-     */
-    protected CheckSignatureAdapter(final int api, final int type,
-            final SignatureVisitor sv) {
-        super(api);
-        this.type = type;
-        this.state = EMPTY;
-        this.sv = sv;
-    }
-
-    // class and method signatures
-
-    @Override
-    public void visitFormalTypeParameter(final String name) {
-        if (type == TYPE_SIGNATURE
-                || (state != EMPTY && state != FORMAL && state != BOUND)) {
-            throw new IllegalStateException();
-        }
-        CheckMethodAdapter.checkIdentifier(name, "formal type parameter");
-        state = FORMAL;
-        if (sv != null) {
-            sv.visitFormalTypeParameter(name);
-        }
-    }
-
-    @Override
-    public SignatureVisitor visitClassBound() {
-        if (state != FORMAL) {
-            throw new IllegalStateException();
-        }
-        state = BOUND;
-        SignatureVisitor v = sv == null ? null : sv.visitClassBound();
-        return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
-    }
-
-    @Override
-    public SignatureVisitor visitInterfaceBound() {
-        if (state != FORMAL && state != BOUND) {
-            throw new IllegalArgumentException();
-        }
-        SignatureVisitor v = sv == null ? null : sv.visitInterfaceBound();
-        return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
-    }
-
-    // class signatures
-
-    @Override
-    public SignatureVisitor visitSuperclass() {
-        if (type != CLASS_SIGNATURE || (state & (EMPTY | FORMAL | BOUND)) == 0) {
-            throw new IllegalArgumentException();
-        }
-        state = SUPER;
-        SignatureVisitor v = sv == null ? null : sv.visitSuperclass();
-        return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
-    }
-
-    @Override
-    public SignatureVisitor visitInterface() {
-        if (state != SUPER) {
-            throw new IllegalStateException();
-        }
-        SignatureVisitor v = sv == null ? null : sv.visitInterface();
-        return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
-    }
-
-    // method signatures
-
-    @Override
-    public SignatureVisitor visitParameterType() {
-        if (type != METHOD_SIGNATURE
-                || (state & (EMPTY | FORMAL | BOUND | PARAM)) == 0) {
-            throw new IllegalArgumentException();
-        }
-        state = PARAM;
-        SignatureVisitor v = sv == null ? null : sv.visitParameterType();
-        return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
-    }
-
-    @Override
-    public SignatureVisitor visitReturnType() {
-        if (type != METHOD_SIGNATURE
-                || (state & (EMPTY | FORMAL | BOUND | PARAM)) == 0) {
-            throw new IllegalArgumentException();
-        }
-        state = RETURN;
-        SignatureVisitor v = sv == null ? null : sv.visitReturnType();
-        CheckSignatureAdapter cv = new CheckSignatureAdapter(TYPE_SIGNATURE, v);
-        cv.canBeVoid = true;
-        return cv;
-    }
-
-    @Override
-    public SignatureVisitor visitExceptionType() {
-        if (state != RETURN) {
-            throw new IllegalStateException();
-        }
-        SignatureVisitor v = sv == null ? null : sv.visitExceptionType();
-        return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
-    }
-
-    // type signatures
-
-    @Override
-    public void visitBaseType(final char descriptor) {
-        if (type != TYPE_SIGNATURE || state != EMPTY) {
-            throw new IllegalStateException();
-        }
-        if (descriptor == 'V') {
-            if (!canBeVoid) {
-                throw new IllegalArgumentException();
-            }
-        } else {
-            if ("ZCBSIFJD".indexOf(descriptor) == -1) {
-                throw new IllegalArgumentException();
-            }
-        }
-        state = SIMPLE_TYPE;
-        if (sv != null) {
-            sv.visitBaseType(descriptor);
-        }
-    }
-
-    @Override
-    public void visitTypeVariable(final String name) {
-        if (type != TYPE_SIGNATURE || state != EMPTY) {
-            throw new IllegalStateException();
-        }
-        CheckMethodAdapter.checkIdentifier(name, "type variable");
-        state = SIMPLE_TYPE;
-        if (sv != null) {
-            sv.visitTypeVariable(name);
-        }
-    }
-
-    @Override
-    public SignatureVisitor visitArrayType() {
-        if (type != TYPE_SIGNATURE || state != EMPTY) {
-            throw new IllegalStateException();
-        }
-        state = SIMPLE_TYPE;
-        SignatureVisitor v = sv == null ? null : sv.visitArrayType();
-        return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
-    }
-
-    @Override
-    public void visitClassType(final String name) {
-        if (type != TYPE_SIGNATURE || state != EMPTY) {
-            throw new IllegalStateException();
-        }
-        CheckMethodAdapter.checkInternalName(name, "class name");
-        state = CLASS_TYPE;
-        if (sv != null) {
-            sv.visitClassType(name);
-        }
-    }
-
-    @Override
-    public void visitInnerClassType(final String name) {
-        if (state != CLASS_TYPE) {
-            throw new IllegalStateException();
-        }
-        CheckMethodAdapter.checkIdentifier(name, "inner class name");
-        if (sv != null) {
-            sv.visitInnerClassType(name);
-        }
-    }
-
-    @Override
-    public void visitTypeArgument() {
-        if (state != CLASS_TYPE) {
-            throw new IllegalStateException();
-        }
-        if (sv != null) {
-            sv.visitTypeArgument();
-        }
-    }
-
-    @Override
-    public SignatureVisitor visitTypeArgument(final char wildcard) {
-        if (state != CLASS_TYPE) {
-            throw new IllegalStateException();
-        }
-        if ("+-=".indexOf(wildcard) == -1) {
-            throw new IllegalArgumentException();
-        }
-        SignatureVisitor v = sv == null ? null : sv.visitTypeArgument(wildcard);
-        return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
-    }
-
-    @Override
-    public void visitEnd() {
-        if (state != CLASS_TYPE) {
-            throw new IllegalStateException();
-        }
-        state = END;
-        if (sv != null) {
-            sv.visitEnd();
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/Printer.java b/src/asm/scala/tools/asm/util/Printer.java
deleted file mode 100644
index 773f129..0000000
--- a/src/asm/scala/tools/asm/util/Printer.java
+++ /dev/null
@@ -1,589 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.asm.Attribute;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * An abstract converter from visit events to text.
- *
- * @author Eric Bruneton
- */
-public abstract class Printer {
-
-    /**
-     * The names of the Java Virtual Machine opcodes.
-     */
-    public static final String[] OPCODES;
-
-    /**
-     * The names of the for <code>operand</code> parameter values of the
-     * {@link scala.tools.asm.MethodVisitor#visitIntInsn} method when
-     * <code>opcode</code> is <code>NEWARRAY</code>.
-     */
-    public static final String[] TYPES;
-
-    /**
-     * The names of the <code>tag</code> field values for
-     * {@link scala.tools.asm.Handle}.
-     */
-    public static final String[] HANDLE_TAG;
-
-    static {
-        String s = "NOP,ACONST_NULL,ICONST_M1,ICONST_0,ICONST_1,ICONST_2,"
-                + "ICONST_3,ICONST_4,ICONST_5,LCONST_0,LCONST_1,FCONST_0,"
-                + "FCONST_1,FCONST_2,DCONST_0,DCONST_1,BIPUSH,SIPUSH,LDC,,,"
-                + "ILOAD,LLOAD,FLOAD,DLOAD,ALOAD,,,,,,,,,,,,,,,,,,,,,IALOAD,"
-                + "LALOAD,FALOAD,DALOAD,AALOAD,BALOAD,CALOAD,SALOAD,ISTORE,"
-                + "LSTORE,FSTORE,DSTORE,ASTORE,,,,,,,,,,,,,,,,,,,,,IASTORE,"
-                + "LASTORE,FASTORE,DASTORE,AASTORE,BASTORE,CASTORE,SASTORE,POP,"
-                + "POP2,DUP,DUP_X1,DUP_X2,DUP2,DUP2_X1,DUP2_X2,SWAP,IADD,LADD,"
-                + "FADD,DADD,ISUB,LSUB,FSUB,DSUB,IMUL,LMUL,FMUL,DMUL,IDIV,LDIV,"
-                + "FDIV,DDIV,IREM,LREM,FREM,DREM,INEG,LNEG,FNEG,DNEG,ISHL,LSHL,"
-                + "ISHR,LSHR,IUSHR,LUSHR,IAND,LAND,IOR,LOR,IXOR,LXOR,IINC,I2L,"
-                + "I2F,I2D,L2I,L2F,L2D,F2I,F2L,F2D,D2I,D2L,D2F,I2B,I2C,I2S,LCMP,"
-                + "FCMPL,FCMPG,DCMPL,DCMPG,IFEQ,IFNE,IFLT,IFGE,IFGT,IFLE,"
-                + "IF_ICMPEQ,IF_ICMPNE,IF_ICMPLT,IF_ICMPGE,IF_ICMPGT,IF_ICMPLE,"
-                + "IF_ACMPEQ,IF_ACMPNE,GOTO,JSR,RET,TABLESWITCH,LOOKUPSWITCH,"
-                + "IRETURN,LRETURN,FRETURN,DRETURN,ARETURN,RETURN,GETSTATIC,"
-                + "PUTSTATIC,GETFIELD,PUTFIELD,INVOKEVIRTUAL,INVOKESPECIAL,"
-                + "INVOKESTATIC,INVOKEINTERFACE,INVOKEDYNAMIC,NEW,NEWARRAY,"
-                + "ANEWARRAY,ARRAYLENGTH,ATHROW,CHECKCAST,INSTANCEOF,"
-                + "MONITORENTER,MONITOREXIT,,MULTIANEWARRAY,IFNULL,IFNONNULL,";
-        OPCODES = new String[200];
-        int i = 0;
-        int j = 0;
-        int l;
-        while ((l = s.indexOf(',', j)) > 0) {
-            OPCODES[i++] = j + 1 == l ? null : s.substring(j, l);
-            j = l + 1;
-        }
-
-        s = "T_BOOLEAN,T_CHAR,T_FLOAT,T_DOUBLE,T_BYTE,T_SHORT,T_INT,T_LONG,";
-        TYPES = new String[12];
-        j = 0;
-        i = 4;
-        while ((l = s.indexOf(',', j)) > 0) {
-            TYPES[i++] = s.substring(j, l);
-            j = l + 1;
-        }
-
-        s = "H_GETFIELD,H_GETSTATIC,H_PUTFIELD,H_PUTSTATIC,"
-                + "H_INVOKEVIRTUAL,H_INVOKESTATIC,H_INVOKESPECIAL,"
-                + "H_NEWINVOKESPECIAL,H_INVOKEINTERFACE,";
-        HANDLE_TAG = new String[10];
-        j = 0;
-        i = 1;
-        while ((l = s.indexOf(',', j)) > 0) {
-            HANDLE_TAG[i++] = s.substring(j, l);
-            j = l + 1;
-        }
-    }
-
-    /**
-     * The ASM API version implemented by this class. The value of this field
-     * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    protected final int api;
-
-    /**
-     * A buffer that can be used to create strings.
-     */
-    protected final StringBuffer buf;
-
-    /**
-     * The text to be printed. Since the code of methods is not necessarily
-     * visited in sequential order, one method after the other, but can be
-     * interlaced (some instructions from method one, then some instructions
-     * from method two, then some instructions from method one again...), it is
-     * not possible to print the visited instructions directly to a sequential
-     * stream. A class is therefore printed in a two steps process: a string
-     * tree is constructed during the visit, and printed to a sequential stream
-     * at the end of the visit. This string tree is stored in this field, as a
-     * string list that can contain other string lists, which can themselves
-     * contain other string lists, and so on.
-     */
-    public final List<Object> text;
-
-    /**
-     * Constructs a new {@link Printer}.
-     */
-    protected Printer(final int api) {
-        this.api = api;
-        this.buf = new StringBuffer();
-        this.text = new ArrayList<Object>();
-    }
-
-    /**
-     * Class header. See {@link scala.tools.asm.ClassVisitor#visit}.
-     */
-    public abstract void visit(final int version, final int access,
-            final String name, final String signature, final String superName,
-            final String[] interfaces);
-
-    /**
-     * Class source. See {@link scala.tools.asm.ClassVisitor#visitSource}.
-     */
-    public abstract void visitSource(final String file, final String debug);
-
-    /**
-     * Class outer class. See
-     * {@link scala.tools.asm.ClassVisitor#visitOuterClass}.
-     */
-    public abstract void visitOuterClass(final String owner, final String name,
-            final String desc);
-
-    /**
-     * Class annotation. See
-     * {@link scala.tools.asm.ClassVisitor#visitAnnotation}.
-     */
-    public abstract Printer visitClassAnnotation(final String desc,
-            final boolean visible);
-
-    /**
-     * Class type annotation. See
-     * {@link scala.tools.asm.ClassVisitor#visitTypeAnnotation}.
-     */
-    public Printer visitClassTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        throw new RuntimeException("Must be overridden");
-    }
-
-    /**
-     * Class attribute. See
-     * {@link scala.tools.asm.ClassVisitor#visitAttribute}.
-     */
-    public abstract void visitClassAttribute(final Attribute attr);
-
-    /**
-     * Class inner name. See
-     * {@link scala.tools.asm.ClassVisitor#visitInnerClass}.
-     */
-    public abstract void visitInnerClass(final String name,
-            final String outerName, final String innerName, final int access);
-
-    /**
-     * Class field. See {@link scala.tools.asm.ClassVisitor#visitField}.
-     */
-    public abstract Printer visitField(final int access, final String name,
-            final String desc, final String signature, final Object value);
-
-    /**
-     * Class method. See {@link scala.tools.asm.ClassVisitor#visitMethod}.
-     */
-    public abstract Printer visitMethod(final int access, final String name,
-            final String desc, final String signature, final String[] exceptions);
-
-    /**
-     * Class end. See {@link scala.tools.asm.ClassVisitor#visitEnd}.
-     */
-    public abstract void visitClassEnd();
-
-    // ------------------------------------------------------------------------
-    // Annotations
-    // ------------------------------------------------------------------------
-
-    /**
-     * Annotation value. See {@link scala.tools.asm.AnnotationVisitor#visit}.
-     */
-    public abstract void visit(final String name, final Object value);
-
-    /**
-     * Annotation enum value. See
-     * {@link scala.tools.asm.AnnotationVisitor#visitEnum}.
-     */
-    public abstract void visitEnum(final String name, final String desc,
-            final String value);
-
-    /**
-     * Nested annotation value. See
-     * {@link scala.tools.asm.AnnotationVisitor#visitAnnotation}.
-     */
-    public abstract Printer visitAnnotation(final String name, final String desc);
-
-    /**
-     * Annotation array value. See
-     * {@link scala.tools.asm.AnnotationVisitor#visitArray}.
-     */
-    public abstract Printer visitArray(final String name);
-
-    /**
-     * Annotation end. See {@link scala.tools.asm.AnnotationVisitor#visitEnd}.
-     */
-    public abstract void visitAnnotationEnd();
-
-    // ------------------------------------------------------------------------
-    // Fields
-    // ------------------------------------------------------------------------
-
-    /**
-     * Field annotation. See
-     * {@link scala.tools.asm.FieldVisitor#visitAnnotation}.
-     */
-    public abstract Printer visitFieldAnnotation(final String desc,
-            final boolean visible);
-
-    /**
-     * Field type annotation. See
-     * {@link scala.tools.asm.FieldVisitor#visitTypeAnnotation}.
-     */
-    public Printer visitFieldTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        throw new RuntimeException("Must be overridden");
-    }
-
-    /**
-     * Field attribute. See
-     * {@link scala.tools.asm.FieldVisitor#visitAttribute}.
-     */
-    public abstract void visitFieldAttribute(final Attribute attr);
-
-    /**
-     * Field end. See {@link scala.tools.asm.FieldVisitor#visitEnd}.
-     */
-    public abstract void visitFieldEnd();
-
-    // ------------------------------------------------------------------------
-    // Methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Method parameter. See
-     * {@link scala.tools.asm.MethodVisitor#visitParameter(String, int)}.
-     */
-    public void visitParameter(String name, int access) {
-        throw new RuntimeException("Must be overridden");
-    }
-
-    /**
-     * Method default annotation. See
-     * {@link scala.tools.asm.MethodVisitor#visitAnnotationDefault}.
-     */
-    public abstract Printer visitAnnotationDefault();
-
-    /**
-     * Method annotation. See
-     * {@link scala.tools.asm.MethodVisitor#visitAnnotation}.
-     */
-    public abstract Printer visitMethodAnnotation(final String desc,
-            final boolean visible);
-
-    /**
-     * Method type annotation. See
-     * {@link scala.tools.asm.MethodVisitor#visitTypeAnnotation}.
-     */
-    public Printer visitMethodTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        throw new RuntimeException("Must be overridden");
-    }
-
-    /**
-     * Method parameter annotation. See
-     * {@link scala.tools.asm.MethodVisitor#visitParameterAnnotation}.
-     */
-    public abstract Printer visitParameterAnnotation(final int parameter,
-            final String desc, final boolean visible);
-
-    /**
-     * Method attribute. See
-     * {@link scala.tools.asm.MethodVisitor#visitAttribute}.
-     */
-    public abstract void visitMethodAttribute(final Attribute attr);
-
-    /**
-     * Method start. See {@link scala.tools.asm.MethodVisitor#visitCode}.
-     */
-    public abstract void visitCode();
-
-    /**
-     * Method stack frame. See
-     * {@link scala.tools.asm.MethodVisitor#visitFrame}.
-     */
-    public abstract void visitFrame(final int type, final int nLocal,
-            final Object[] local, final int nStack, final Object[] stack);
-
-    /**
-     * Method instruction. See {@link scala.tools.asm.MethodVisitor#visitInsn}
-     * .
-     */
-    public abstract void visitInsn(final int opcode);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitIntInsn}.
-     */
-    public abstract void visitIntInsn(final int opcode, final int operand);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitVarInsn}.
-     */
-    public abstract void visitVarInsn(final int opcode, final int var);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitTypeInsn}.
-     */
-    public abstract void visitTypeInsn(final int opcode, final String type);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitFieldInsn}.
-     */
-    public abstract void visitFieldInsn(final int opcode, final String owner,
-            final String name, final String desc);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitMethodInsn}.
-     */
-    @Deprecated
-    public void visitMethodInsn(final int opcode, final String owner,
-            final String name, final String desc) {
-        if (api >= Opcodes.ASM5) {
-            boolean itf = opcode == Opcodes.INVOKEINTERFACE;
-            visitMethodInsn(opcode, owner, name, desc, itf);
-            return;
-        }
-        throw new RuntimeException("Must be overridden");
-    }
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitMethodInsn}.
-     */
-    public void visitMethodInsn(final int opcode, final String owner,
-            final String name, final String desc, final boolean itf) {
-        if (api < Opcodes.ASM5) {
-            if (itf != (opcode == Opcodes.INVOKEINTERFACE)) {
-                throw new IllegalArgumentException(
-                        "INVOKESPECIAL/STATIC on interfaces require ASM 5");
-            }
-            visitMethodInsn(opcode, owner, name, desc);
-            return;
-        }
-        throw new RuntimeException("Must be overridden");
-    }
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitInvokeDynamicInsn}.
-     */
-    public abstract void visitInvokeDynamicInsn(String name, String desc,
-            Handle bsm, Object... bsmArgs);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitJumpInsn}.
-     */
-    public abstract void visitJumpInsn(final int opcode, final Label label);
-
-    /**
-     * Method label. See {@link scala.tools.asm.MethodVisitor#visitLabel}.
-     */
-    public abstract void visitLabel(final Label label);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitLdcInsn}.
-     */
-    public abstract void visitLdcInsn(final Object cst);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitIincInsn}.
-     */
-    public abstract void visitIincInsn(final int var, final int increment);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitTableSwitchInsn}.
-     */
-    public abstract void visitTableSwitchInsn(final int min, final int max,
-            final Label dflt, final Label... labels);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitLookupSwitchInsn}.
-     */
-    public abstract void visitLookupSwitchInsn(final Label dflt,
-            final int[] keys, final Label[] labels);
-
-    /**
-     * Method instruction. See
-     * {@link scala.tools.asm.MethodVisitor#visitMultiANewArrayInsn}.
-     */
-    public abstract void visitMultiANewArrayInsn(final String desc,
-            final int dims);
-
-    /**
-     * Instruction type annotation. See
-     * {@link scala.tools.asm.MethodVisitor#visitInsnAnnotation}.
-     */
-    public Printer visitInsnAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        throw new RuntimeException("Must be overridden");
-    }
-
-    /**
-     * Method exception handler. See
-     * {@link scala.tools.asm.MethodVisitor#visitTryCatchBlock}.
-     */
-    public abstract void visitTryCatchBlock(final Label start, final Label end,
-            final Label handler, final String type);
-
-    /**
-     * Try catch block type annotation. See
-     * {@link scala.tools.asm.MethodVisitor#visitTryCatchAnnotation}.
-     */
-    public Printer visitTryCatchAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        throw new RuntimeException("Must be overridden");
-    }
-
-    /**
-     * Method debug info. See
-     * {@link scala.tools.asm.MethodVisitor#visitLocalVariable}.
-     */
-    public abstract void visitLocalVariable(final String name,
-            final String desc, final String signature, final Label start,
-            final Label end, final int index);
-
-    /**
-     * Local variable type annotation. See
-     * {@link scala.tools.asm.MethodVisitor#visitTryCatchAnnotation}.
-     */
-    public Printer visitLocalVariableAnnotation(final int typeRef,
-            final TypePath typePath, final Label[] start, final Label[] end,
-            final int[] index, final String desc, final boolean visible) {
-        throw new RuntimeException("Must be overridden");
-    }
-
-    /**
-     * Method debug info. See
-     * {@link scala.tools.asm.MethodVisitor#visitLineNumber}.
-     */
-    public abstract void visitLineNumber(final int line, final Label start);
-
-    /**
-     * Method max stack and max locals. See
-     * {@link scala.tools.asm.MethodVisitor#visitMaxs}.
-     */
-    public abstract void visitMaxs(final int maxStack, final int maxLocals);
-
-    /**
-     * Method end. See {@link scala.tools.asm.MethodVisitor#visitEnd}.
-     */
-    public abstract void visitMethodEnd();
-
-    /**
-     * Returns the text constructed by this visitor.
-     *
-     * @return the text constructed by this visitor.
-     */
-    public List<Object> getText() {
-        return text;
-    }
-
-    /**
-     * Prints the text constructed by this visitor.
-     *
-     * @param pw
-     *            the print writer to be used.
-     */
-    public void print(final PrintWriter pw) {
-        printList(pw, text);
-    }
-
-    /**
-     * Appends a quoted string to a given buffer.
-     *
-     * @param buf
-     *            the buffer where the string must be added.
-     * @param s
-     *            the string to be added.
-     */
-    public static void appendString(final StringBuffer buf, final String s) {
-        buf.append('\"');
-        for (int i = 0; i < s.length(); ++i) {
-            char c = s.charAt(i);
-            if (c == '\n') {
-                buf.append("\\n");
-            } else if (c == '\r') {
-                buf.append("\\r");
-            } else if (c == '\\') {
-                buf.append("\\\\");
-            } else if (c == '"') {
-                buf.append("\\\"");
-            } else if (c < 0x20 || c > 0x7f) {
-                buf.append("\\u");
-                if (c < 0x10) {
-                    buf.append("000");
-                } else if (c < 0x100) {
-                    buf.append("00");
-                } else if (c < 0x1000) {
-                    buf.append('0');
-                }
-                buf.append(Integer.toString(c, 16));
-            } else {
-                buf.append(c);
-            }
-        }
-        buf.append('\"');
-    }
-
-    /**
-     * Prints the given string tree.
-     *
-     * @param pw
-     *            the writer to be used to print the tree.
-     * @param l
-     *            a string tree, i.e., a string list that can contain other
-     *            string lists, and so on recursively.
-     */
-    static void printList(final PrintWriter pw, final List<?> l) {
-        for (int i = 0; i < l.size(); ++i) {
-            Object o = l.get(i);
-            if (o instanceof List) {
-                printList(pw, (List<?>) o);
-            } else {
-                pw.print(o.toString());
-            }
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/Textifiable.java b/src/asm/scala/tools/asm/util/Textifiable.java
deleted file mode 100644
index 85e051e..0000000
--- a/src/asm/scala/tools/asm/util/Textifiable.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.util.Map;
-
-import scala.tools.asm.Label;
-
-/**
- * An {@link scala.tools.asm.Attribute Attribute} that can print a readable
- * representation of itself.
- *
- * Implementations should construct readable output from an attribute data
- * structure. Such representation could be used in unit test assertions.
- *
- * @author Eugene Kuleshov
- */
-public interface Textifiable {
-
-    /**
-     * Build a human readable representation of this attribute.
-     *
-     * @param buf
-     *            a buffer used for printing Java code.
-     * @param labelNames
-     *            map of label instances to their names.
-     */
-    void textify(StringBuffer buf, Map<Label, String> labelNames);
-}
diff --git a/src/asm/scala/tools/asm/util/Textifier.java b/src/asm/scala/tools/asm/util/Textifier.java
deleted file mode 100644
index 373e46f..0000000
--- a/src/asm/scala/tools/asm/util/Textifier.java
+++ /dev/null
@@ -1,1459 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.FileInputStream;
-import java.io.PrintWriter;
-import java.util.HashMap;
-import java.util.Map;
-
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassReader;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-import scala.tools.asm.signature.SignatureReader;
-
-/**
- * A {@link Printer} that prints a disassembled view of the classes it visits.
- *
- * @author Eric Bruneton
- */
-public class Textifier extends Printer {
-
-    /**
-     * Constant used in {@link #appendDescriptor appendDescriptor} for internal
-     * type names in bytecode notation.
-     */
-    public static final int INTERNAL_NAME = 0;
-
-    /**
-     * Constant used in {@link #appendDescriptor appendDescriptor} for field
-     * descriptors, formatted in bytecode notation
-     */
-    public static final int FIELD_DESCRIPTOR = 1;
-
-    /**
-     * Constant used in {@link #appendDescriptor appendDescriptor} for field
-     * signatures, formatted in bytecode notation
-     */
-    public static final int FIELD_SIGNATURE = 2;
-
-    /**
-     * Constant used in {@link #appendDescriptor appendDescriptor} for method
-     * descriptors, formatted in bytecode notation
-     */
-    public static final int METHOD_DESCRIPTOR = 3;
-
-    /**
-     * Constant used in {@link #appendDescriptor appendDescriptor} for method
-     * signatures, formatted in bytecode notation
-     */
-    public static final int METHOD_SIGNATURE = 4;
-
-    /**
-     * Constant used in {@link #appendDescriptor appendDescriptor} for class
-     * signatures, formatted in bytecode notation
-     */
-    public static final int CLASS_SIGNATURE = 5;
-
-    /**
-     * Constant used in {@link #appendDescriptor appendDescriptor} for field or
-     * method return value signatures, formatted in default Java notation
-     * (non-bytecode)
-     */
-    public static final int TYPE_DECLARATION = 6;
-
-    /**
-     * Constant used in {@link #appendDescriptor appendDescriptor} for class
-     * signatures, formatted in default Java notation (non-bytecode)
-     */
-    public static final int CLASS_DECLARATION = 7;
-
-    /**
-     * Constant used in {@link #appendDescriptor appendDescriptor} for method
-     * parameter signatures, formatted in default Java notation (non-bytecode)
-     */
-    public static final int PARAMETERS_DECLARATION = 8;
-
-    /**
-     * Constant used in {@link #appendDescriptor appendDescriptor} for handle
-     * descriptors, formatted in bytecode notation
-     */
-    public static final int HANDLE_DESCRIPTOR = 9;
-
-    /**
-     * Tab for class members.
-     */
-    protected String tab = "  ";
-
-    /**
-     * Tab for bytecode instructions.
-     */
-    protected String tab2 = "    ";
-
-    /**
-     * Tab for table and lookup switch instructions.
-     */
-    protected String tab3 = "      ";
-
-    /**
-     * Tab for labels.
-     */
-    protected String ltab = "   ";
-
-    /**
-     * The label names. This map associate String values to Label keys.
-     */
-    protected Map<Label, String> labelNames;
-
-    /**
-     * Class access flags
-     */
-    private int access;
-
-    private int valueNumber = 0;
-
-    /**
-     * Constructs a new {@link Textifier}. <i>Subclasses must not use this
-     * constructor</i>. Instead, they must use the {@link #Textifier(int)}
-     * version.
-     *
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public Textifier() {
-        this(Opcodes.ASM5);
-        if (getClass() != Textifier.class) {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * Constructs a new {@link Textifier}.
-     *
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     */
-    protected Textifier(final int api) {
-        super(api);
-    }
-
-    /**
-     * Prints a disassembled view of the given class to the standard output.
-     * <p>
-     * Usage: Textifier [-debug] <binary class name or class file name >
-     *
-     * @param args
-     *            the command line arguments.
-     *
-     * @throws Exception
-     *             if the class cannot be found, or if an IO exception occurs.
-     */
-    public static void main(final String[] args) throws Exception {
-        int i = 0;
-        int flags = ClassReader.SKIP_DEBUG;
-
-        boolean ok = true;
-        if (args.length < 1 || args.length > 2) {
-            ok = false;
-        }
-        if (ok && "-debug".equals(args[0])) {
-            i = 1;
-            flags = 0;
-            if (args.length != 2) {
-                ok = false;
-            }
-        }
-        if (!ok) {
-            System.err
-                    .println("Prints a disassembled view of the given class.");
-            System.err.println("Usage: Textifier [-debug] "
-                    + "<fully qualified class name or class file name>");
-            return;
-        }
-        ClassReader cr;
-        if (args[i].endsWith(".class") || args[i].indexOf('\\') > -1
-                || args[i].indexOf('/') > -1) {
-            cr = new ClassReader(new FileInputStream(args[i]));
-        } else {
-            cr = new ClassReader(args[i]);
-        }
-        cr.accept(new TraceClassVisitor(new PrintWriter(System.out)), flags);
-    }
-
-    // ------------------------------------------------------------------------
-    // Classes
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visit(final int version, final int access, final String name,
-            final String signature, final String superName,
-            final String[] interfaces) {
-        this.access = access;
-        int major = version & 0xFFFF;
-        int minor = version >>> 16;
-        buf.setLength(0);
-        buf.append("// class version ").append(major).append('.').append(minor)
-                .append(" (").append(version).append(")\n");
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            buf.append("// DEPRECATED\n");
-        }
-        buf.append("// access flags 0x")
-                .append(Integer.toHexString(access).toUpperCase()).append('\n');
-
-        appendDescriptor(CLASS_SIGNATURE, signature);
-        if (signature != null) {
-            TraceSignatureVisitor sv = new TraceSignatureVisitor(access);
-            SignatureReader r = new SignatureReader(signature);
-            r.accept(sv);
-            buf.append("// declaration: ").append(name)
-                    .append(sv.getDeclaration()).append('\n');
-        }
-
-        appendAccess(access & ~Opcodes.ACC_SUPER);
-        if ((access & Opcodes.ACC_ANNOTATION) != 0) {
-            buf.append("@interface ");
-        } else if ((access & Opcodes.ACC_INTERFACE) != 0) {
-            buf.append("interface ");
-        } else if ((access & Opcodes.ACC_ENUM) == 0) {
-            buf.append("class ");
-        }
-        appendDescriptor(INTERNAL_NAME, name);
-
-        if (superName != null && !"java/lang/Object".equals(superName)) {
-            buf.append(" extends ");
-            appendDescriptor(INTERNAL_NAME, superName);
-            buf.append(' ');
-        }
-        if (interfaces != null && interfaces.length > 0) {
-            buf.append(" implements ");
-            for (int i = 0; i < interfaces.length; ++i) {
-                appendDescriptor(INTERNAL_NAME, interfaces[i]);
-                buf.append(' ');
-            }
-        }
-        buf.append(" {\n\n");
-
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitSource(final String file, final String debug) {
-        buf.setLength(0);
-        if (file != null) {
-            buf.append(tab).append("// compiled from: ").append(file)
-                    .append('\n');
-        }
-        if (debug != null) {
-            buf.append(tab).append("// debug info: ").append(debug)
-                    .append('\n');
-        }
-        if (buf.length() > 0) {
-            text.add(buf.toString());
-        }
-    }
-
-    @Override
-    public void visitOuterClass(final String owner, final String name,
-            final String desc) {
-        buf.setLength(0);
-        buf.append(tab).append("OUTERCLASS ");
-        appendDescriptor(INTERNAL_NAME, owner);
-        buf.append(' ');
-        if (name != null) {
-            buf.append(name).append(' ');
-        }
-        appendDescriptor(METHOD_DESCRIPTOR, desc);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public Textifier visitClassAnnotation(final String desc,
-            final boolean visible) {
-        text.add("\n");
-        return visitAnnotation(desc, visible);
-    }
-
-    @Override
-    public Printer visitClassTypeAnnotation(int typeRef, TypePath typePath,
-            String desc, boolean visible) {
-        text.add("\n");
-        return visitTypeAnnotation(typeRef, typePath, desc, visible);
-    }
-
-    @Override
-    public void visitClassAttribute(final Attribute attr) {
-        text.add("\n");
-        visitAttribute(attr);
-    }
-
-    @Override
-    public void visitInnerClass(final String name, final String outerName,
-            final String innerName, final int access) {
-        buf.setLength(0);
-        buf.append(tab).append("// access flags 0x");
-        buf.append(
-                Integer.toHexString(access & ~Opcodes.ACC_SUPER).toUpperCase())
-                .append('\n');
-        buf.append(tab);
-        appendAccess(access);
-        buf.append("INNERCLASS ");
-        appendDescriptor(INTERNAL_NAME, name);
-        buf.append(' ');
-        appendDescriptor(INTERNAL_NAME, outerName);
-        buf.append(' ');
-        appendDescriptor(INTERNAL_NAME, innerName);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public Textifier visitField(final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        buf.setLength(0);
-        buf.append('\n');
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            buf.append(tab).append("// DEPRECATED\n");
-        }
-        buf.append(tab).append("// access flags 0x")
-                .append(Integer.toHexString(access).toUpperCase()).append('\n');
-        if (signature != null) {
-            buf.append(tab);
-            appendDescriptor(FIELD_SIGNATURE, signature);
-
-            TraceSignatureVisitor sv = new TraceSignatureVisitor(0);
-            SignatureReader r = new SignatureReader(signature);
-            r.acceptType(sv);
-            buf.append(tab).append("// declaration: ")
-                    .append(sv.getDeclaration()).append('\n');
-        }
-
-        buf.append(tab);
-        appendAccess(access);
-
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append(' ').append(name);
-        if (value != null) {
-            buf.append(" = ");
-            if (value instanceof String) {
-                buf.append('\"').append(value).append('\"');
-            } else {
-                buf.append(value);
-            }
-        }
-
-        buf.append('\n');
-        text.add(buf.toString());
-
-        Textifier t = createTextifier();
-        text.add(t.getText());
-        return t;
-    }
-
-    @Override
-    public Textifier visitMethod(final int access, final String name,
-            final String desc, final String signature, final String[] exceptions) {
-        buf.setLength(0);
-        buf.append('\n');
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            buf.append(tab).append("// DEPRECATED\n");
-        }
-        buf.append(tab).append("// access flags 0x")
-                .append(Integer.toHexString(access).toUpperCase()).append('\n');
-
-        if (signature != null) {
-            buf.append(tab);
-            appendDescriptor(METHOD_SIGNATURE, signature);
-
-            TraceSignatureVisitor v = new TraceSignatureVisitor(0);
-            SignatureReader r = new SignatureReader(signature);
-            r.accept(v);
-            String genericDecl = v.getDeclaration();
-            String genericReturn = v.getReturnType();
-            String genericExceptions = v.getExceptions();
-
-            buf.append(tab).append("// declaration: ").append(genericReturn)
-                    .append(' ').append(name).append(genericDecl);
-            if (genericExceptions != null) {
-                buf.append(" throws ").append(genericExceptions);
-            }
-            buf.append('\n');
-        }
-
-        buf.append(tab);
-        appendAccess(access & ~Opcodes.ACC_VOLATILE);
-        if ((access & Opcodes.ACC_NATIVE) != 0) {
-            buf.append("native ");
-        }
-        if ((access & Opcodes.ACC_VARARGS) != 0) {
-            buf.append("varargs ");
-        }
-        if ((access & Opcodes.ACC_BRIDGE) != 0) {
-            buf.append("bridge ");
-        }
-        if ((this.access & Opcodes.ACC_INTERFACE) != 0
-                && (access & Opcodes.ACC_ABSTRACT) == 0
-                && (access & Opcodes.ACC_STATIC) == 0) {
-            buf.append("default ");
-        }
-
-        buf.append(name);
-        appendDescriptor(METHOD_DESCRIPTOR, desc);
-        if (exceptions != null && exceptions.length > 0) {
-            buf.append(" throws ");
-            for (int i = 0; i < exceptions.length; ++i) {
-                appendDescriptor(INTERNAL_NAME, exceptions[i]);
-                buf.append(' ');
-            }
-        }
-
-        buf.append('\n');
-        text.add(buf.toString());
-
-        Textifier t = createTextifier();
-        text.add(t.getText());
-        return t;
-    }
-
-    @Override
-    public void visitClassEnd() {
-        text.add("}\n");
-    }
-
-    // ------------------------------------------------------------------------
-    // Annotations
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visit(final String name, final Object value) {
-        buf.setLength(0);
-        appendComa(valueNumber++);
-
-        if (name != null) {
-            buf.append(name).append('=');
-        }
-
-        if (value instanceof String) {
-            visitString((String) value);
-        } else if (value instanceof Type) {
-            visitType((Type) value);
-        } else if (value instanceof Byte) {
-            visitByte(((Byte) value).byteValue());
-        } else if (value instanceof Boolean) {
-            visitBoolean(((Boolean) value).booleanValue());
-        } else if (value instanceof Short) {
-            visitShort(((Short) value).shortValue());
-        } else if (value instanceof Character) {
-            visitChar(((Character) value).charValue());
-        } else if (value instanceof Integer) {
-            visitInt(((Integer) value).intValue());
-        } else if (value instanceof Float) {
-            visitFloat(((Float) value).floatValue());
-        } else if (value instanceof Long) {
-            visitLong(((Long) value).longValue());
-        } else if (value instanceof Double) {
-            visitDouble(((Double) value).doubleValue());
-        } else if (value.getClass().isArray()) {
-            buf.append('{');
-            if (value instanceof byte[]) {
-                byte[] v = (byte[]) value;
-                for (int i = 0; i < v.length; i++) {
-                    appendComa(i);
-                    visitByte(v[i]);
-                }
-            } else if (value instanceof boolean[]) {
-                boolean[] v = (boolean[]) value;
-                for (int i = 0; i < v.length; i++) {
-                    appendComa(i);
-                    visitBoolean(v[i]);
-                }
-            } else if (value instanceof short[]) {
-                short[] v = (short[]) value;
-                for (int i = 0; i < v.length; i++) {
-                    appendComa(i);
-                    visitShort(v[i]);
-                }
-            } else if (value instanceof char[]) {
-                char[] v = (char[]) value;
-                for (int i = 0; i < v.length; i++) {
-                    appendComa(i);
-                    visitChar(v[i]);
-                }
-            } else if (value instanceof int[]) {
-                int[] v = (int[]) value;
-                for (int i = 0; i < v.length; i++) {
-                    appendComa(i);
-                    visitInt(v[i]);
-                }
-            } else if (value instanceof long[]) {
-                long[] v = (long[]) value;
-                for (int i = 0; i < v.length; i++) {
-                    appendComa(i);
-                    visitLong(v[i]);
-                }
-            } else if (value instanceof float[]) {
-                float[] v = (float[]) value;
-                for (int i = 0; i < v.length; i++) {
-                    appendComa(i);
-                    visitFloat(v[i]);
-                }
-            } else if (value instanceof double[]) {
-                double[] v = (double[]) value;
-                for (int i = 0; i < v.length; i++) {
-                    appendComa(i);
-                    visitDouble(v[i]);
-                }
-            }
-            buf.append('}');
-        }
-
-        text.add(buf.toString());
-    }
-
-    private void visitInt(final int value) {
-        buf.append(value);
-    }
-
-    private void visitLong(final long value) {
-        buf.append(value).append('L');
-    }
-
-    private void visitFloat(final float value) {
-        buf.append(value).append('F');
-    }
-
-    private void visitDouble(final double value) {
-        buf.append(value).append('D');
-    }
-
-    private void visitChar(final char value) {
-        buf.append("(char)").append((int) value);
-    }
-
-    private void visitShort(final short value) {
-        buf.append("(short)").append(value);
-    }
-
-    private void visitByte(final byte value) {
-        buf.append("(byte)").append(value);
-    }
-
-    private void visitBoolean(final boolean value) {
-        buf.append(value);
-    }
-
-    private void visitString(final String value) {
-        appendString(buf, value);
-    }
-
-    private void visitType(final Type value) {
-        buf.append(value.getClassName()).append(".class");
-    }
-
-    @Override
-    public void visitEnum(final String name, final String desc,
-            final String value) {
-        buf.setLength(0);
-        appendComa(valueNumber++);
-        if (name != null) {
-            buf.append(name).append('=');
-        }
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append('.').append(value);
-        text.add(buf.toString());
-    }
-
-    @Override
-    public Textifier visitAnnotation(final String name, final String desc) {
-        buf.setLength(0);
-        appendComa(valueNumber++);
-        if (name != null) {
-            buf.append(name).append('=');
-        }
-        buf.append('@');
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append('(');
-        text.add(buf.toString());
-        Textifier t = createTextifier();
-        text.add(t.getText());
-        text.add(")");
-        return t;
-    }
-
-    @Override
-    public Textifier visitArray(final String name) {
-        buf.setLength(0);
-        appendComa(valueNumber++);
-        if (name != null) {
-            buf.append(name).append('=');
-        }
-        buf.append('{');
-        text.add(buf.toString());
-        Textifier t = createTextifier();
-        text.add(t.getText());
-        text.add("}");
-        return t;
-    }
-
-    @Override
-    public void visitAnnotationEnd() {
-    }
-
-    // ------------------------------------------------------------------------
-    // Fields
-    // ------------------------------------------------------------------------
-
-    @Override
-    public Textifier visitFieldAnnotation(final String desc,
-            final boolean visible) {
-        return visitAnnotation(desc, visible);
-    }
-
-    @Override
-    public Printer visitFieldTypeAnnotation(int typeRef, TypePath typePath,
-            String desc, boolean visible) {
-        return visitTypeAnnotation(typeRef, typePath, desc, visible);
-    }
-
-    @Override
-    public void visitFieldAttribute(final Attribute attr) {
-        visitAttribute(attr);
-    }
-
-    @Override
-    public void visitFieldEnd() {
-    }
-
-    // ------------------------------------------------------------------------
-    // Methods
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visitParameter(final String name, final int access) {
-        buf.setLength(0);
-        buf.append(tab2).append("// parameter ");
-        appendAccess(access);
-        buf.append(' ').append((name == null) ? "<no name>" : name)
-                .append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public Textifier visitAnnotationDefault() {
-        text.add(tab2 + "default=");
-        Textifier t = createTextifier();
-        text.add(t.getText());
-        text.add("\n");
-        return t;
-    }
-
-    @Override
-    public Textifier visitMethodAnnotation(final String desc,
-            final boolean visible) {
-        return visitAnnotation(desc, visible);
-    }
-
-    @Override
-    public Printer visitMethodTypeAnnotation(int typeRef, TypePath typePath,
-            String desc, boolean visible) {
-        return visitTypeAnnotation(typeRef, typePath, desc, visible);
-    }
-
-    @Override
-    public Textifier visitParameterAnnotation(final int parameter,
-            final String desc, final boolean visible) {
-        buf.setLength(0);
-        buf.append(tab2).append('@');
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append('(');
-        text.add(buf.toString());
-        Textifier t = createTextifier();
-        text.add(t.getText());
-        text.add(visible ? ") // parameter " : ") // invisible, parameter ");
-        text.add(new Integer(parameter));
-        text.add("\n");
-        return t;
-    }
-
-    @Override
-    public void visitMethodAttribute(final Attribute attr) {
-        buf.setLength(0);
-        buf.append(tab).append("ATTRIBUTE ");
-        appendDescriptor(-1, attr.type);
-
-        if (attr instanceof Textifiable) {
-            ((Textifiable) attr).textify(buf, labelNames);
-        } else {
-            buf.append(" : unknown\n");
-        }
-
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitCode() {
-    }
-
-    @Override
-    public void visitFrame(final int type, final int nLocal,
-            final Object[] local, final int nStack, final Object[] stack) {
-        buf.setLength(0);
-        buf.append(ltab);
-        buf.append("FRAME ");
-        switch (type) {
-        case Opcodes.F_NEW:
-        case Opcodes.F_FULL:
-            buf.append("FULL [");
-            appendFrameTypes(nLocal, local);
-            buf.append("] [");
-            appendFrameTypes(nStack, stack);
-            buf.append(']');
-            break;
-        case Opcodes.F_APPEND:
-            buf.append("APPEND [");
-            appendFrameTypes(nLocal, local);
-            buf.append(']');
-            break;
-        case Opcodes.F_CHOP:
-            buf.append("CHOP ").append(nLocal);
-            break;
-        case Opcodes.F_SAME:
-            buf.append("SAME");
-            break;
-        case Opcodes.F_SAME1:
-            buf.append("SAME1 ");
-            appendFrameTypes(1, stack);
-            break;
-        }
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitInsn(final int opcode) {
-        buf.setLength(0);
-        buf.append(tab2).append(OPCODES[opcode]).append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitIntInsn(final int opcode, final int operand) {
-        buf.setLength(0);
-        buf.append(tab2)
-                .append(OPCODES[opcode])
-                .append(' ')
-                .append(opcode == Opcodes.NEWARRAY ? TYPES[operand] : Integer
-                        .toString(operand)).append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitVarInsn(final int opcode, final int var) {
-        buf.setLength(0);
-        buf.append(tab2).append(OPCODES[opcode]).append(' ').append(var)
-                .append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitTypeInsn(final int opcode, final String type) {
-        buf.setLength(0);
-        buf.append(tab2).append(OPCODES[opcode]).append(' ');
-        appendDescriptor(INTERNAL_NAME, type);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitFieldInsn(final int opcode, final String owner,
-            final String name, final String desc) {
-        buf.setLength(0);
-        buf.append(tab2).append(OPCODES[opcode]).append(' ');
-        appendDescriptor(INTERNAL_NAME, owner);
-        buf.append('.').append(name).append(" : ");
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Deprecated
-    @Override
-    public void visitMethodInsn(final int opcode, final String owner,
-            final String name, final String desc) {
-        if (api >= Opcodes.ASM5) {
-            super.visitMethodInsn(opcode, owner, name, desc);
-            return;
-        }
-        doVisitMethodInsn(opcode, owner, name, desc,
-                opcode == Opcodes.INVOKEINTERFACE);
-    }
-
-    @Override
-    public void visitMethodInsn(final int opcode, final String owner,
-            final String name, final String desc, final boolean itf) {
-        if (api < Opcodes.ASM5) {
-            super.visitMethodInsn(opcode, owner, name, desc, itf);
-            return;
-        }
-        doVisitMethodInsn(opcode, owner, name, desc, itf);
-    }
-
-    private void doVisitMethodInsn(final int opcode, final String owner,
-            final String name, final String desc, final boolean itf) {
-        buf.setLength(0);
-        buf.append(tab2).append(OPCODES[opcode]).append(' ');
-        appendDescriptor(INTERNAL_NAME, owner);
-        buf.append('.').append(name).append(' ');
-        appendDescriptor(METHOD_DESCRIPTOR, desc);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
-            Object... bsmArgs) {
-        buf.setLength(0);
-        buf.append(tab2).append("INVOKEDYNAMIC").append(' ');
-        buf.append(name);
-        appendDescriptor(METHOD_DESCRIPTOR, desc);
-        buf.append(" [");
-        buf.append('\n');
-        buf.append(tab3);
-        appendHandle(bsm);
-        buf.append('\n');
-        buf.append(tab3).append("// arguments:");
-        if (bsmArgs.length == 0) {
-            buf.append(" none");
-        } else {
-            buf.append('\n');
-            for (int i = 0; i < bsmArgs.length; i++) {
-                buf.append(tab3);
-                Object cst = bsmArgs[i];
-                if (cst instanceof String) {
-                    Printer.appendString(buf, (String) cst);
-                } else if (cst instanceof Type) {
-                    Type type = (Type) cst;
-                    if(type.getSort() == Type.METHOD){
-                        appendDescriptor(METHOD_DESCRIPTOR, type.getDescriptor());
-                    } else {
-                        buf.append(type.getDescriptor()).append(".class");
-                    }
-                } else if (cst instanceof Handle) {
-                    appendHandle((Handle) cst);
-                } else {
-                    buf.append(cst);
-                }
-                buf.append(", \n");
-            }
-            buf.setLength(buf.length() - 3);
-        }
-        buf.append('\n');
-        buf.append(tab2).append("]\n");
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitJumpInsn(final int opcode, final Label label) {
-        buf.setLength(0);
-        buf.append(tab2).append(OPCODES[opcode]).append(' ');
-        appendLabel(label);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitLabel(final Label label) {
-        buf.setLength(0);
-        buf.append(ltab);
-        appendLabel(label);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitLdcInsn(final Object cst) {
-        buf.setLength(0);
-        buf.append(tab2).append("LDC ");
-        if (cst instanceof String) {
-            Printer.appendString(buf, (String) cst);
-        } else if (cst instanceof Type) {
-            buf.append(((Type) cst).getDescriptor()).append(".class");
-        } else {
-            buf.append(cst);
-        }
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitIincInsn(final int var, final int increment) {
-        buf.setLength(0);
-        buf.append(tab2).append("IINC ").append(var).append(' ')
-                .append(increment).append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitTableSwitchInsn(final int min, final int max,
-            final Label dflt, final Label... labels) {
-        buf.setLength(0);
-        buf.append(tab2).append("TABLESWITCH\n");
-        for (int i = 0; i < labels.length; ++i) {
-            buf.append(tab3).append(min + i).append(": ");
-            appendLabel(labels[i]);
-            buf.append('\n');
-        }
-        buf.append(tab3).append("default: ");
-        appendLabel(dflt);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
-            final Label[] labels) {
-        buf.setLength(0);
-        buf.append(tab2).append("LOOKUPSWITCH\n");
-        for (int i = 0; i < labels.length; ++i) {
-            buf.append(tab3).append(keys[i]).append(": ");
-            appendLabel(labels[i]);
-            buf.append('\n');
-        }
-        buf.append(tab3).append("default: ");
-        appendLabel(dflt);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitMultiANewArrayInsn(final String desc, final int dims) {
-        buf.setLength(0);
-        buf.append(tab2).append("MULTIANEWARRAY ");
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append(' ').append(dims).append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public Printer visitInsnAnnotation(int typeRef, TypePath typePath,
-            String desc, boolean visible) {
-        return visitTypeAnnotation(typeRef, typePath, desc, visible);
-    }
-
-    @Override
-    public void visitTryCatchBlock(final Label start, final Label end,
-            final Label handler, final String type) {
-        buf.setLength(0);
-        buf.append(tab2).append("TRYCATCHBLOCK ");
-        appendLabel(start);
-        buf.append(' ');
-        appendLabel(end);
-        buf.append(' ');
-        appendLabel(handler);
-        buf.append(' ');
-        appendDescriptor(INTERNAL_NAME, type);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public Printer visitTryCatchAnnotation(int typeRef, TypePath typePath,
-            String desc, boolean visible) {
-        buf.setLength(0);
-        buf.append(tab2).append("TRYCATCHBLOCK @");
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append('(');
-        text.add(buf.toString());
-        Textifier t = createTextifier();
-        text.add(t.getText());
-        buf.setLength(0);
-        buf.append(") : ");
-        appendTypeReference(typeRef);
-        buf.append(", ").append(typePath);
-        buf.append(visible ? "\n" : " // invisible\n");
-        text.add(buf.toString());
-        return t;
-    }
-
-    @Override
-    public void visitLocalVariable(final String name, final String desc,
-            final String signature, final Label start, final Label end,
-            final int index) {
-        buf.setLength(0);
-        buf.append(tab2).append("LOCALVARIABLE ").append(name).append(' ');
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append(' ');
-        appendLabel(start);
-        buf.append(' ');
-        appendLabel(end);
-        buf.append(' ').append(index).append('\n');
-
-        if (signature != null) {
-            buf.append(tab2);
-            appendDescriptor(FIELD_SIGNATURE, signature);
-
-            TraceSignatureVisitor sv = new TraceSignatureVisitor(0);
-            SignatureReader r = new SignatureReader(signature);
-            r.acceptType(sv);
-            buf.append(tab2).append("// declaration: ")
-                    .append(sv.getDeclaration()).append('\n');
-        }
-        text.add(buf.toString());
-    }
-
-    @Override
-    public Printer visitLocalVariableAnnotation(int typeRef, TypePath typePath,
-            Label[] start, Label[] end, int[] index, String desc,
-            boolean visible) {
-        buf.setLength(0);
-        buf.append(tab2).append("LOCALVARIABLE @");
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append('(');
-        text.add(buf.toString());
-        Textifier t = createTextifier();
-        text.add(t.getText());
-        buf.setLength(0);
-        buf.append(") : ");
-        appendTypeReference(typeRef);
-        buf.append(", ").append(typePath);
-        for (int i = 0; i < start.length; ++i) {
-            buf.append(" [ ");
-            appendLabel(start[i]);
-            buf.append(" - ");
-            appendLabel(end[i]);
-            buf.append(" - ").append(index[i]).append(" ]");
-        }
-        buf.append(visible ? "\n" : " // invisible\n");
-        text.add(buf.toString());
-        return t;
-    }
-
-    @Override
-    public void visitLineNumber(final int line, final Label start) {
-        buf.setLength(0);
-        buf.append(tab2).append("LINENUMBER ").append(line).append(' ');
-        appendLabel(start);
-        buf.append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitMaxs(final int maxStack, final int maxLocals) {
-        buf.setLength(0);
-        buf.append(tab2).append("MAXSTACK = ").append(maxStack).append('\n');
-        text.add(buf.toString());
-
-        buf.setLength(0);
-        buf.append(tab2).append("MAXLOCALS = ").append(maxLocals).append('\n');
-        text.add(buf.toString());
-    }
-
-    @Override
-    public void visitMethodEnd() {
-    }
-
-    // ------------------------------------------------------------------------
-    // Common methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Prints a disassembled view of the given annotation.
-     *
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values.
-     */
-    public Textifier visitAnnotation(final String desc, final boolean visible) {
-        buf.setLength(0);
-        buf.append(tab).append('@');
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append('(');
-        text.add(buf.toString());
-        Textifier t = createTextifier();
-        text.add(t.getText());
-        text.add(visible ? ")\n" : ") // invisible\n");
-        return t;
-    }
-
-    /**
-     * Prints a disassembled view of the given type annotation.
-     *
-     * @param typeRef
-     *            a reference to the annotated type. See {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values.
-     */
-    public Textifier visitTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) {
-        buf.setLength(0);
-        buf.append(tab).append('@');
-        appendDescriptor(FIELD_DESCRIPTOR, desc);
-        buf.append('(');
-        text.add(buf.toString());
-        Textifier t = createTextifier();
-        text.add(t.getText());
-        buf.setLength(0);
-        buf.append(") : ");
-        appendTypeReference(typeRef);
-        buf.append(", ").append(typePath);
-        buf.append(visible ? "\n" : " // invisible\n");
-        text.add(buf.toString());
-        return t;
-    }
-
-    /**
-     * Prints a disassembled view of the given attribute.
-     *
-     * @param attr
-     *            an attribute.
-     */
-    public void visitAttribute(final Attribute attr) {
-        buf.setLength(0);
-        buf.append(tab).append("ATTRIBUTE ");
-        appendDescriptor(-1, attr.type);
-
-        if (attr instanceof Textifiable) {
-            ((Textifiable) attr).textify(buf, null);
-        } else {
-            buf.append(" : unknown\n");
-        }
-
-        text.add(buf.toString());
-    }
-
-    // ------------------------------------------------------------------------
-    // Utility methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Creates a new TraceVisitor instance.
-     *
-     * @return a new TraceVisitor.
-     */
-    protected Textifier createTextifier() {
-        return new Textifier();
-    }
-
-    /**
-     * Appends an internal name, a type descriptor or a type signature to
-     * {@link #buf buf}.
-     *
-     * @param type
-     *            indicates if desc is an internal name, a field descriptor, a
-     *            method descriptor, a class signature, ...
-     * @param desc
-     *            an internal name, type descriptor, or type signature. May be
-     *            <tt>null</tt>.
-     */
-    protected void appendDescriptor(final int type, final String desc) {
-        if (type == CLASS_SIGNATURE || type == FIELD_SIGNATURE
-                || type == METHOD_SIGNATURE) {
-            if (desc != null) {
-                buf.append("// signature ").append(desc).append('\n');
-            }
-        } else {
-            buf.append(desc);
-        }
-    }
-
-    /**
-     * Appends the name of the given label to {@link #buf buf}. Creates a new
-     * label name if the given label does not yet have one.
-     *
-     * @param l
-     *            a label.
-     */
-    protected void appendLabel(final Label l) {
-        if (labelNames == null) {
-            labelNames = new HashMap<Label, String>();
-        }
-        String name = labelNames.get(l);
-        if (name == null) {
-            name = "L" + labelNames.size();
-            labelNames.put(l, name);
-        }
-        buf.append(name);
-    }
-
-    /**
-     * Appends the information about the given handle to {@link #buf buf}.
-     *
-     * @param h
-     *            a handle, non null.
-     */
-    protected void appendHandle(final Handle h) {
-        int tag = h.getTag();
-        buf.append("// handle kind 0x").append(Integer.toHexString(tag))
-                .append(" : ");
-        boolean isMethodHandle = false;
-        switch (tag) {
-        case Opcodes.H_GETFIELD:
-            buf.append("GETFIELD");
-            break;
-        case Opcodes.H_GETSTATIC:
-            buf.append("GETSTATIC");
-            break;
-        case Opcodes.H_PUTFIELD:
-            buf.append("PUTFIELD");
-            break;
-        case Opcodes.H_PUTSTATIC:
-            buf.append("PUTSTATIC");
-            break;
-        case Opcodes.H_INVOKEINTERFACE:
-            buf.append("INVOKEINTERFACE");
-            isMethodHandle = true;
-            break;
-        case Opcodes.H_INVOKESPECIAL:
-            buf.append("INVOKESPECIAL");
-            isMethodHandle = true;
-            break;
-        case Opcodes.H_INVOKESTATIC:
-            buf.append("INVOKESTATIC");
-            isMethodHandle = true;
-            break;
-        case Opcodes.H_INVOKEVIRTUAL:
-            buf.append("INVOKEVIRTUAL");
-            isMethodHandle = true;
-            break;
-        case Opcodes.H_NEWINVOKESPECIAL:
-            buf.append("NEWINVOKESPECIAL");
-            isMethodHandle = true;
-            break;
-        }
-        buf.append('\n');
-        buf.append(tab3);
-        appendDescriptor(INTERNAL_NAME, h.getOwner());
-        buf.append('.');
-        buf.append(h.getName());
-        if(!isMethodHandle){
-            buf.append('(');
-        }
-        appendDescriptor(HANDLE_DESCRIPTOR, h.getDesc());
-        if(!isMethodHandle){
-            buf.append(')');
-        }
-    }
-
-    /**
-     * Appends a string representation of the given access modifiers to
-     * {@link #buf buf}.
-     *
-     * @param access
-     *            some access modifiers.
-     */
-    private void appendAccess(final int access) {
-        if ((access & Opcodes.ACC_PUBLIC) != 0) {
-            buf.append("public ");
-        }
-        if ((access & Opcodes.ACC_PRIVATE) != 0) {
-            buf.append("private ");
-        }
-        if ((access & Opcodes.ACC_PROTECTED) != 0) {
-            buf.append("protected ");
-        }
-        if ((access & Opcodes.ACC_FINAL) != 0) {
-            buf.append("final ");
-        }
-        if ((access & Opcodes.ACC_STATIC) != 0) {
-            buf.append("static ");
-        }
-        if ((access & Opcodes.ACC_SYNCHRONIZED) != 0) {
-            buf.append("synchronized ");
-        }
-        if ((access & Opcodes.ACC_VOLATILE) != 0) {
-            buf.append("volatile ");
-        }
-        if ((access & Opcodes.ACC_TRANSIENT) != 0) {
-            buf.append("transient ");
-        }
-        if ((access & Opcodes.ACC_ABSTRACT) != 0) {
-            buf.append("abstract ");
-        }
-        if ((access & Opcodes.ACC_STRICT) != 0) {
-            buf.append("strictfp ");
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            buf.append("synthetic ");
-        }
-        if ((access & Opcodes.ACC_MANDATED) != 0) {
-            buf.append("mandated ");
-        }
-        if ((access & Opcodes.ACC_ENUM) != 0) {
-            buf.append("enum ");
-        }
-    }
-
-    private void appendComa(final int i) {
-        if (i != 0) {
-            buf.append(", ");
-        }
-    }
-
-    private void appendTypeReference(final int typeRef) {
-        TypeReference ref = new TypeReference(typeRef);
-        switch (ref.getSort()) {
-        case TypeReference.CLASS_TYPE_PARAMETER:
-            buf.append("CLASS_TYPE_PARAMETER ").append(
-                    ref.getTypeParameterIndex());
-            break;
-        case TypeReference.METHOD_TYPE_PARAMETER:
-            buf.append("METHOD_TYPE_PARAMETER ").append(
-                    ref.getTypeParameterIndex());
-            break;
-        case TypeReference.CLASS_EXTENDS:
-            buf.append("CLASS_EXTENDS ").append(ref.getSuperTypeIndex());
-            break;
-        case TypeReference.CLASS_TYPE_PARAMETER_BOUND:
-            buf.append("CLASS_TYPE_PARAMETER_BOUND ")
-                    .append(ref.getTypeParameterIndex()).append(", ")
-                    .append(ref.getTypeParameterBoundIndex());
-            break;
-        case TypeReference.METHOD_TYPE_PARAMETER_BOUND:
-            buf.append("METHOD_TYPE_PARAMETER_BOUND ")
-                    .append(ref.getTypeParameterIndex()).append(", ")
-                    .append(ref.getTypeParameterBoundIndex());
-            break;
-        case TypeReference.FIELD:
-            buf.append("FIELD");
-            break;
-        case TypeReference.METHOD_RETURN:
-            buf.append("METHOD_RETURN");
-            break;
-        case TypeReference.METHOD_RECEIVER:
-            buf.append("METHOD_RECEIVER");
-            break;
-        case TypeReference.METHOD_FORMAL_PARAMETER:
-            buf.append("METHOD_FORMAL_PARAMETER ").append(
-                    ref.getFormalParameterIndex());
-            break;
-        case TypeReference.THROWS:
-            buf.append("THROWS ").append(ref.getExceptionIndex());
-            break;
-        case TypeReference.LOCAL_VARIABLE:
-            buf.append("LOCAL_VARIABLE");
-            break;
-        case TypeReference.RESOURCE_VARIABLE:
-            buf.append("RESOURCE_VARIABLE");
-            break;
-        case TypeReference.EXCEPTION_PARAMETER:
-            buf.append("EXCEPTION_PARAMETER ").append(
-                    ref.getTryCatchBlockIndex());
-            break;
-        case TypeReference.INSTANCEOF:
-            buf.append("INSTANCEOF");
-            break;
-        case TypeReference.NEW:
-            buf.append("NEW");
-            break;
-        case TypeReference.CONSTRUCTOR_REFERENCE:
-            buf.append("CONSTRUCTOR_REFERENCE");
-            break;
-        case TypeReference.METHOD_REFERENCE:
-            buf.append("METHOD_REFERENCE");
-            break;
-        case TypeReference.CAST:
-            buf.append("CAST ").append(ref.getTypeArgumentIndex());
-            break;
-        case TypeReference.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT:
-            buf.append("CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT ").append(
-                    ref.getTypeArgumentIndex());
-            break;
-        case TypeReference.METHOD_INVOCATION_TYPE_ARGUMENT:
-            buf.append("METHOD_INVOCATION_TYPE_ARGUMENT ").append(
-                    ref.getTypeArgumentIndex());
-            break;
-        case TypeReference.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT:
-            buf.append("CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT ").append(
-                    ref.getTypeArgumentIndex());
-            break;
-        case TypeReference.METHOD_REFERENCE_TYPE_ARGUMENT:
-            buf.append("METHOD_REFERENCE_TYPE_ARGUMENT ").append(
-                    ref.getTypeArgumentIndex());
-            break;
-        }
-    }
-
-    private void appendFrameTypes(final int n, final Object[] o) {
-        for (int i = 0; i < n; ++i) {
-            if (i > 0) {
-                buf.append(' ');
-            }
-            if (o[i] instanceof String) {
-                String desc = (String) o[i];
-                if (desc.startsWith("[")) {
-                    appendDescriptor(FIELD_DESCRIPTOR, desc);
-                } else {
-                    appendDescriptor(INTERNAL_NAME, desc);
-                }
-            } else if (o[i] instanceof Integer) {
-                switch (((Integer) o[i]).intValue()) {
-                case 0:
-                    appendDescriptor(FIELD_DESCRIPTOR, "T");
-                    break;
-                case 1:
-                    appendDescriptor(FIELD_DESCRIPTOR, "I");
-                    break;
-                case 2:
-                    appendDescriptor(FIELD_DESCRIPTOR, "F");
-                    break;
-                case 3:
-                    appendDescriptor(FIELD_DESCRIPTOR, "D");
-                    break;
-                case 4:
-                    appendDescriptor(FIELD_DESCRIPTOR, "J");
-                    break;
-                case 5:
-                    appendDescriptor(FIELD_DESCRIPTOR, "N");
-                    break;
-                case 6:
-                    appendDescriptor(FIELD_DESCRIPTOR, "U");
-                    break;
-                }
-            } else {
-                appendLabel((Label) o[i]);
-            }
-        }
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/TraceAnnotationVisitor.java b/src/asm/scala/tools/asm/util/TraceAnnotationVisitor.java
deleted file mode 100644
index 7a9dbfe..0000000
--- a/src/asm/scala/tools/asm/util/TraceAnnotationVisitor.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * An {@link AnnotationVisitor} that prints the annotations it visits with a
- * {@link Printer}.
- *
- * @author Eric Bruneton
- */
-public final class TraceAnnotationVisitor extends AnnotationVisitor {
-
-    private final Printer p;
-
-    public TraceAnnotationVisitor(final Printer p) {
-        this(null, p);
-    }
-
-    public TraceAnnotationVisitor(final AnnotationVisitor av, final Printer p) {
-        super(Opcodes.ASM5, av);
-        this.p = p;
-    }
-
-    @Override
-    public void visit(final String name, final Object value) {
-        p.visit(name, value);
-        super.visit(name, value);
-    }
-
-    @Override
-    public void visitEnum(final String name, final String desc,
-            final String value) {
-        p.visitEnum(name, desc, value);
-        super.visitEnum(name, desc, value);
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String name,
-            final String desc) {
-        Printer p = this.p.visitAnnotation(name, desc);
-        AnnotationVisitor av = this.av == null ? null : this.av
-                .visitAnnotation(name, desc);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public AnnotationVisitor visitArray(final String name) {
-        Printer p = this.p.visitArray(name);
-        AnnotationVisitor av = this.av == null ? null : this.av
-                .visitArray(name);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public void visitEnd() {
-        p.visitAnnotationEnd();
-        super.visitEnd();
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/TraceClassVisitor.java b/src/asm/scala/tools/asm/util/TraceClassVisitor.java
deleted file mode 100644
index 842d286..0000000
--- a/src/asm/scala/tools/asm/util/TraceClassVisitor.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.PrintWriter;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassVisitor;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * A {@link ClassVisitor} that prints the classes it visits with a
- * {@link Printer}. This class visitor can be used in the middle of a class
- * visitor chain to trace the class that is visited at a given point in this
- * chain. This may be useful for debugging purposes.
- * <p>
- * The trace printed when visiting the <tt>Hello</tt> class is the following:
- * <p>
- * <blockquote>
- *
- * <pre>
- * // class version 49.0 (49) // access flags 0x21 public class Hello {
- *
- * // compiled from: Hello.java
- *
- * // access flags 0x1 public <init> ()V ALOAD 0 INVOKESPECIAL
- * java/lang/Object <init> ()V RETURN MAXSTACK = 1 MAXLOCALS = 1
- *
- * // access flags 0x9 public static main ([Ljava/lang/String;)V GETSTATIC
- * java/lang/System out Ljava/io/PrintStream; LDC "hello"
- * INVOKEVIRTUAL java/io/PrintStream println (Ljava/lang/String;)V RETURN
- * MAXSTACK = 2 MAXLOCALS = 1 }
- * </pre>
- *
- * </blockquote> where <tt>Hello</tt> is defined by:
- * <p>
- * <blockquote>
- *
- * <pre>
- * public class Hello {
- *
- *     public static void main(String[] args) {
- *         System.out.println("hello");
- *     }
- * }
- * </pre>
- *
- * </blockquote>
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public final class TraceClassVisitor extends ClassVisitor {
-
-    /**
-     * The print writer to be used to print the class. May be null.
-     */
-    private final PrintWriter pw;
-
-    /**
-     * The object that actually converts visit events into text.
-     */
-    public final Printer p;
-
-    /**
-     * Constructs a new {@link TraceClassVisitor}.
-     *
-     * @param pw
-     *            the print writer to be used to print the class.
-     */
-    public TraceClassVisitor(final PrintWriter pw) {
-        this(null, pw);
-    }
-
-    /**
-     * Constructs a new {@link TraceClassVisitor}.
-     *
-     * @param cv
-     *            the {@link ClassVisitor} to which this visitor delegates
-     *            calls. May be <tt>null</tt>.
-     * @param pw
-     *            the print writer to be used to print the class.
-     */
-    public TraceClassVisitor(final ClassVisitor cv, final PrintWriter pw) {
-        this(cv, new Textifier(), pw);
-    }
-
-    /**
-     * Constructs a new {@link TraceClassVisitor}.
-     *
-     * @param cv
-     *            the {@link ClassVisitor} to which this visitor delegates
-     *            calls. May be <tt>null</tt>.
-     * @param p
-     *            the object that actually converts visit events into text.
-     * @param pw
-     *            the print writer to be used to print the class. May be null if
-     *            you simply want to use the result via
-     *            {@link Printer#getText()}, instead of printing it.
-     */
-    public TraceClassVisitor(final ClassVisitor cv, final Printer p,
-            final PrintWriter pw) {
-        super(Opcodes.ASM5, cv);
-        this.pw = pw;
-        this.p = p;
-    }
-
-    @Override
-    public void visit(final int version, final int access, final String name,
-            final String signature, final String superName,
-            final String[] interfaces) {
-        p.visit(version, access, name, signature, superName, interfaces);
-        super.visit(version, access, name, signature, superName, interfaces);
-    }
-
-    @Override
-    public void visitSource(final String file, final String debug) {
-        p.visitSource(file, debug);
-        super.visitSource(file, debug);
-    }
-
-    @Override
-    public void visitOuterClass(final String owner, final String name,
-            final String desc) {
-        p.visitOuterClass(owner, name, desc);
-        super.visitOuterClass(owner, name, desc);
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        Printer p = this.p.visitClassAnnotation(desc, visible);
-        AnnotationVisitor av = cv == null ? null : cv.visitAnnotation(desc,
-                visible);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        Printer p = this.p.visitClassTypeAnnotation(typeRef, typePath, desc,
-                visible);
-        AnnotationVisitor av = cv == null ? null : cv.visitTypeAnnotation(
-                typeRef, typePath, desc, visible);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        p.visitClassAttribute(attr);
-        super.visitAttribute(attr);
-    }
-
-    @Override
-    public void visitInnerClass(final String name, final String outerName,
-            final String innerName, final int access) {
-        p.visitInnerClass(name, outerName, innerName, access);
-        super.visitInnerClass(name, outerName, innerName, access);
-    }
-
-    @Override
-    public FieldVisitor visitField(final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        Printer p = this.p.visitField(access, name, desc, signature, value);
-        FieldVisitor fv = cv == null ? null : cv.visitField(access, name, desc,
-                signature, value);
-        return new TraceFieldVisitor(fv, p);
-    }
-
-    @Override
-    public MethodVisitor visitMethod(final int access, final String name,
-            final String desc, final String signature, final String[] exceptions) {
-        Printer p = this.p.visitMethod(access, name, desc, signature,
-                exceptions);
-        MethodVisitor mv = cv == null ? null : cv.visitMethod(access, name,
-                desc, signature, exceptions);
-        return new TraceMethodVisitor(mv, p);
-    }
-
-    @Override
-    public void visitEnd() {
-        p.visitClassEnd();
-        if (pw != null) {
-            p.print(pw);
-            pw.flush();
-        }
-        super.visitEnd();
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/TraceFieldVisitor.java b/src/asm/scala/tools/asm/util/TraceFieldVisitor.java
deleted file mode 100644
index 1d0743a..0000000
--- a/src/asm/scala/tools/asm/util/TraceFieldVisitor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * A {@link FieldVisitor} that prints the fields it visits with a
- * {@link Printer}.
- *
- * @author Eric Bruneton
- */
-public final class TraceFieldVisitor extends FieldVisitor {
-
-    public final Printer p;
-
-    public TraceFieldVisitor(final Printer p) {
-        this(null, p);
-    }
-
-    public TraceFieldVisitor(final FieldVisitor fv, final Printer p) {
-        super(Opcodes.ASM5, fv);
-        this.p = p;
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        Printer p = this.p.visitFieldAnnotation(desc, visible);
-        AnnotationVisitor av = fv == null ? null : fv.visitAnnotation(desc,
-                visible);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        Printer p = this.p.visitFieldTypeAnnotation(typeRef, typePath, desc,
-                visible);
-        AnnotationVisitor av = fv == null ? null : fv.visitTypeAnnotation(
-                typeRef, typePath, desc, visible);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        p.visitFieldAttribute(attr);
-        super.visitAttribute(attr);
-    }
-
-    @Override
-    public void visitEnd() {
-        p.visitFieldEnd();
-        super.visitEnd();
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/TraceMethodVisitor.java b/src/asm/scala/tools/asm/util/TraceMethodVisitor.java
deleted file mode 100644
index db5f051..0000000
--- a/src/asm/scala/tools/asm/util/TraceMethodVisitor.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * A {@link MethodVisitor} that prints the methods it visits with a
- * {@link Printer}.
- *
- * @author Eric Bruneton
- */
-public final class TraceMethodVisitor extends MethodVisitor {
-
-    public final Printer p;
-
-    public TraceMethodVisitor(final Printer p) {
-        this(null, p);
-    }
-
-    public TraceMethodVisitor(final MethodVisitor mv, final Printer p) {
-        super(Opcodes.ASM5, mv);
-        this.p = p;
-    }
-
-    @Override
-    public void visitParameter(String name, int access) {
-        p.visitParameter(name, access);
-        super.visitParameter(name, access);
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        Printer p = this.p.visitMethodAnnotation(desc, visible);
-        AnnotationVisitor av = mv == null ? null : mv.visitAnnotation(desc,
-                visible);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        Printer p = this.p.visitMethodTypeAnnotation(typeRef, typePath, desc,
-                visible);
-        AnnotationVisitor av = mv == null ? null : mv.visitTypeAnnotation(
-                typeRef, typePath, desc, visible);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        p.visitMethodAttribute(attr);
-        super.visitAttribute(attr);
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotationDefault() {
-        Printer p = this.p.visitAnnotationDefault();
-        AnnotationVisitor av = mv == null ? null : mv.visitAnnotationDefault();
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public AnnotationVisitor visitParameterAnnotation(final int parameter,
-            final String desc, final boolean visible) {
-        Printer p = this.p.visitParameterAnnotation(parameter, desc, visible);
-        AnnotationVisitor av = mv == null ? null : mv.visitParameterAnnotation(
-                parameter, desc, visible);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public void visitCode() {
-        p.visitCode();
-        super.visitCode();
-    }
-
-    @Override
-    public void visitFrame(final int type, final int nLocal,
-            final Object[] local, final int nStack, final Object[] stack) {
-        p.visitFrame(type, nLocal, local, nStack, stack);
-        super.visitFrame(type, nLocal, local, nStack, stack);
-    }
-
-    @Override
-    public void visitInsn(final int opcode) {
-        p.visitInsn(opcode);
-        super.visitInsn(opcode);
-    }
-
-    @Override
-    public void visitIntInsn(final int opcode, final int operand) {
-        p.visitIntInsn(opcode, operand);
-        super.visitIntInsn(opcode, operand);
-    }
-
-    @Override
-    public void visitVarInsn(final int opcode, final int var) {
-        p.visitVarInsn(opcode, var);
-        super.visitVarInsn(opcode, var);
-    }
-
-    @Override
-    public void visitTypeInsn(final int opcode, final String type) {
-        p.visitTypeInsn(opcode, type);
-        super.visitTypeInsn(opcode, type);
-    }
-
-    @Override
-    public void visitFieldInsn(final int opcode, final String owner,
-            final String name, final String desc) {
-        p.visitFieldInsn(opcode, owner, name, desc);
-        super.visitFieldInsn(opcode, owner, name, desc);
-    }
-
-    @Deprecated
-    @Override
-    public void visitMethodInsn(int opcode, String owner, String name,
-            String desc) {
-        if (api >= Opcodes.ASM5) {
-            super.visitMethodInsn(opcode, owner, name, desc);
-            return;
-        }
-        p.visitMethodInsn(opcode, owner, name, desc);
-        if (mv != null) {
-            mv.visitMethodInsn(opcode, owner, name, desc);
-        }
-    }
-
-    @Override
-    public void visitMethodInsn(int opcode, String owner, String name,
-            String desc, boolean itf) {
-        if (api < Opcodes.ASM5) {
-            super.visitMethodInsn(opcode, owner, name, desc, itf);
-            return;
-        }
-        p.visitMethodInsn(opcode, owner, name, desc, itf);
-        if (mv != null) {
-            mv.visitMethodInsn(opcode, owner, name, desc, itf);
-        }
-    }
-
-    @Override
-    public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
-            Object... bsmArgs) {
-        p.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
-        super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
-    }
-
-    @Override
-    public void visitJumpInsn(final int opcode, final Label label) {
-        p.visitJumpInsn(opcode, label);
-        super.visitJumpInsn(opcode, label);
-    }
-
-    @Override
-    public void visitLabel(final Label label) {
-        p.visitLabel(label);
-        super.visitLabel(label);
-    }
-
-    @Override
-    public void visitLdcInsn(final Object cst) {
-        p.visitLdcInsn(cst);
-        super.visitLdcInsn(cst);
-    }
-
-    @Override
-    public void visitIincInsn(final int var, final int increment) {
-        p.visitIincInsn(var, increment);
-        super.visitIincInsn(var, increment);
-    }
-
-    @Override
-    public void visitTableSwitchInsn(final int min, final int max,
-            final Label dflt, final Label... labels) {
-        p.visitTableSwitchInsn(min, max, dflt, labels);
-        super.visitTableSwitchInsn(min, max, dflt, labels);
-    }
-
-    @Override
-    public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
-            final Label[] labels) {
-        p.visitLookupSwitchInsn(dflt, keys, labels);
-        super.visitLookupSwitchInsn(dflt, keys, labels);
-    }
-
-    @Override
-    public void visitMultiANewArrayInsn(final String desc, final int dims) {
-        p.visitMultiANewArrayInsn(desc, dims);
-        super.visitMultiANewArrayInsn(desc, dims);
-    }
-
-    @Override
-    public AnnotationVisitor visitInsnAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        Printer p = this.p
-                .visitInsnAnnotation(typeRef, typePath, desc, visible);
-        AnnotationVisitor av = mv == null ? null : mv.visitInsnAnnotation(
-                typeRef, typePath, desc, visible);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public void visitTryCatchBlock(final Label start, final Label end,
-            final Label handler, final String type) {
-        p.visitTryCatchBlock(start, end, handler, type);
-        super.visitTryCatchBlock(start, end, handler, type);
-    }
-
-    @Override
-    public AnnotationVisitor visitTryCatchAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        Printer p = this.p.visitTryCatchAnnotation(typeRef, typePath, desc,
-                visible);
-        AnnotationVisitor av = mv == null ? null : mv.visitTryCatchAnnotation(
-                typeRef, typePath, desc, visible);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public void visitLocalVariable(final String name, final String desc,
-            final String signature, final Label start, final Label end,
-            final int index) {
-        p.visitLocalVariable(name, desc, signature, start, end, index);
-        super.visitLocalVariable(name, desc, signature, start, end, index);
-    }
-
-    @Override
-    public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
-            TypePath typePath, Label[] start, Label[] end, int[] index,
-            String desc, boolean visible) {
-        Printer p = this.p.visitLocalVariableAnnotation(typeRef, typePath,
-                start, end, index, desc, visible);
-        AnnotationVisitor av = mv == null ? null : mv
-                .visitLocalVariableAnnotation(typeRef, typePath, start, end,
-                        index, desc, visible);
-        return new TraceAnnotationVisitor(av, p);
-    }
-
-    @Override
-    public void visitLineNumber(final int line, final Label start) {
-        p.visitLineNumber(line, start);
-        super.visitLineNumber(line, start);
-    }
-
-    @Override
-    public void visitMaxs(final int maxStack, final int maxLocals) {
-        p.visitMaxs(maxStack, maxLocals);
-        super.visitMaxs(maxStack, maxLocals);
-    }
-
-    @Override
-    public void visitEnd() {
-        p.visitMethodEnd();
-        super.visitEnd();
-    }
-}
diff --git a/src/asm/scala/tools/asm/util/TraceSignatureVisitor.java b/src/asm/scala/tools/asm/util/TraceSignatureVisitor.java
deleted file mode 100644
index f99ec2b..0000000
--- a/src/asm/scala/tools/asm/util/TraceSignatureVisitor.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.signature.SignatureVisitor;
-
-/**
- * A {@link SignatureVisitor} that prints a disassembled view of the signature
- * it visits.
- *
- * @author Eugene Kuleshov
- * @author Eric Bruneton
- */
-public final class TraceSignatureVisitor extends SignatureVisitor {
-
-    private final StringBuffer declaration;
-
-    private boolean isInterface;
-
-    private boolean seenFormalParameter;
-
-    private boolean seenInterfaceBound;
-
-    private boolean seenParameter;
-
-    private boolean seenInterface;
-
-    private StringBuffer returnType;
-
-    private StringBuffer exceptions;
-
-    /**
-     * Stack used to keep track of class types that have arguments. Each element
-     * of this stack is a boolean encoded in one bit. The top of the stack is
-     * the lowest order bit. Pushing false = *2, pushing true = *2+1, popping =
-     * /2.
-     */
-    private int argumentStack;
-
-    /**
-     * Stack used to keep track of array class types. Each element of this stack
-     * is a boolean encoded in one bit. The top of the stack is the lowest order
-     * bit. Pushing false = *2, pushing true = *2+1, popping = /2.
-     */
-    private int arrayStack;
-
-    private String separator = "";
-
-    public TraceSignatureVisitor(final int access) {
-        super(Opcodes.ASM5);
-        isInterface = (access & Opcodes.ACC_INTERFACE) != 0;
-        this.declaration = new StringBuffer();
-    }
-
-    private TraceSignatureVisitor(final StringBuffer buf) {
-        super(Opcodes.ASM5);
-        this.declaration = buf;
-    }
-
-    @Override
-    public void visitFormalTypeParameter(final String name) {
-        declaration.append(seenFormalParameter ? ", " : "<").append(name);
-        seenFormalParameter = true;
-        seenInterfaceBound = false;
-    }
-
-    @Override
-    public SignatureVisitor visitClassBound() {
-        separator = " extends ";
-        startType();
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitInterfaceBound() {
-        separator = seenInterfaceBound ? ", " : " extends ";
-        seenInterfaceBound = true;
-        startType();
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitSuperclass() {
-        endFormals();
-        separator = " extends ";
-        startType();
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitInterface() {
-        separator = seenInterface ? ", " : isInterface ? " extends "
-                : " implements ";
-        seenInterface = true;
-        startType();
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitParameterType() {
-        endFormals();
-        if (seenParameter) {
-            declaration.append(", ");
-        } else {
-            seenParameter = true;
-            declaration.append('(');
-        }
-        startType();
-        return this;
-    }
-
-    @Override
-    public SignatureVisitor visitReturnType() {
-        endFormals();
-        if (seenParameter) {
-            seenParameter = false;
-        } else {
-            declaration.append('(');
-        }
-        declaration.append(')');
-        returnType = new StringBuffer();
-        return new TraceSignatureVisitor(returnType);
-    }
-
-    @Override
-    public SignatureVisitor visitExceptionType() {
-        if (exceptions == null) {
-            exceptions = new StringBuffer();
-        } else {
-            exceptions.append(", ");
-        }
-        // startType();
-        return new TraceSignatureVisitor(exceptions);
-    }
-
-    @Override
-    public void visitBaseType(final char descriptor) {
-        switch (descriptor) {
-        case 'V':
-            declaration.append("void");
-            break;
-        case 'B':
-            declaration.append("byte");
-            break;
-        case 'J':
-            declaration.append("long");
-            break;
-        case 'Z':
-            declaration.append("boolean");
-            break;
-        case 'I':
-            declaration.append("int");
-            break;
-        case 'S':
-            declaration.append("short");
-            break;
-        case 'C':
-            declaration.append("char");
-            break;
-        case 'F':
-            declaration.append("float");
-            break;
-        // case 'D':
-        default:
-            declaration.append("double");
-            break;
-        }
-        endType();
-    }
-
-    @Override
-    public void visitTypeVariable(final String name) {
-        declaration.append(name);
-        endType();
-    }
-
-    @Override
-    public SignatureVisitor visitArrayType() {
-        startType();
-        arrayStack |= 1;
-        return this;
-    }
-
-    @Override
-    public void visitClassType(final String name) {
-        if ("java/lang/Object".equals(name)) {
-            // Map<java.lang.Object,java.util.List>
-            // or
-            // abstract public V get(Object key); (seen in Dictionary.class)
-            // should have Object
-            // but java.lang.String extends java.lang.Object is unnecessary
-            boolean needObjectClass = argumentStack % 2 != 0 || seenParameter;
-            if (needObjectClass) {
-                declaration.append(separator).append(name.replace('/', '.'));
-            }
-        } else {
-            declaration.append(separator).append(name.replace('/', '.'));
-        }
-        separator = "";
-        argumentStack *= 2;
-    }
-
-    @Override
-    public void visitInnerClassType(final String name) {
-        if (argumentStack % 2 != 0) {
-            declaration.append('>');
-        }
-        argumentStack /= 2;
-        declaration.append('.');
-        declaration.append(separator).append(name.replace('/', '.'));
-        separator = "";
-        argumentStack *= 2;
-    }
-
-    @Override
-    public void visitTypeArgument() {
-        if (argumentStack % 2 == 0) {
-            ++argumentStack;
-            declaration.append('<');
-        } else {
-            declaration.append(", ");
-        }
-        declaration.append('?');
-    }
-
-    @Override
-    public SignatureVisitor visitTypeArgument(final char tag) {
-        if (argumentStack % 2 == 0) {
-            ++argumentStack;
-            declaration.append('<');
-        } else {
-            declaration.append(", ");
-        }
-
-        if (tag == EXTENDS) {
-            declaration.append("? extends ");
-        } else if (tag == SUPER) {
-            declaration.append("? super ");
-        }
-
-        startType();
-        return this;
-    }
-
-    @Override
-    public void visitEnd() {
-        if (argumentStack % 2 != 0) {
-            declaration.append('>');
-        }
-        argumentStack /= 2;
-        endType();
-    }
-
-    public String getDeclaration() {
-        return declaration.toString();
-    }
-
-    public String getReturnType() {
-        return returnType == null ? null : returnType.toString();
-    }
-
-    public String getExceptions() {
-        return exceptions == null ? null : exceptions.toString();
-    }
-
-    // -----------------------------------------------
-
-    private void endFormals() {
-        if (seenFormalParameter) {
-            declaration.append('>');
-            seenFormalParameter = false;
-        }
-    }
-
-    private void startType() {
-        arrayStack *= 2;
-    }
-
-    private void endType() {
-        if (arrayStack % 2 == 0) {
-            arrayStack /= 2;
-        } else {
-            while (arrayStack % 2 != 0) {
-                arrayStack /= 2;
-                declaration.append("[]");
-            }
-        }
-    }
-}
diff --git a/src/build/InnerObjectTestGen.scala b/src/build/InnerObjectTestGen.scala
index b661126..e0b889c 100644
--- a/src/build/InnerObjectTestGen.scala
+++ b/src/build/InnerObjectTestGen.scala
@@ -22,7 +22,7 @@ object Contexts extends Enumeration {
  *  object, or equivalent).
  *
  *  Usage: TestGen <nr of levels>
- *     - by default it's 2 leves. Currently, 3-level deep uncovers bugs in the type checker.
+ *     - by default it's 2 levels. Currently, 3-level deep uncovers bugs in the type checker.
  *
  * @author Iulian Dragos
  */
diff --git a/src/build/genprod.scala b/src/build/genprod.scala
index ed436fe2..f85a151 100644
--- a/src/build/genprod.scala
+++ b/src/build/genprod.scala
@@ -15,7 +15,6 @@ import scala.language.postfixOps
  *      where the argument is the desired output directory
  *
  *  @author  Burak Emir, Stephane Micheloud, Geoffrey Washburn, Paul Phillips
- *  @version 1.1
  */
 object genprod extends App {
   val MAX_ARITY = 22
@@ -123,7 +122,10 @@ object FunctionOne extends Function(1) {
  *      def apply(x: Int): Int = x + 1
  *    }
  *    assert(succ(0) == anonfun1(0))
- * """)
+ * """) + """
+ *
+ *  Note that the difference between `Function1` and [[scala.PartialFunction]]
+ *  is that the latter can specify inputs which it will not handle."""
 
   override def moreMethods = """
   /** Composes two instances of Function1 in a new Function1, with this function applied last.
@@ -178,13 +180,7 @@ class Function(val i: Int) extends Group("Function") with Arity {
  *
  *  {{{
  *  object Main extends App {%s}
- *  }}}
- *
- *  Note that `Function1` does not define a total function, as might
- *  be suggested by the existence of [[scala.PartialFunction]]. The only
- *  distinction between `Function1` and `PartialFunction` is that the
- *  latter can specify inputs which it will not handle.
-"""
+ *  }}}"""
 
   def toStr() = "\"" + ("<function%d>" format i) + "\""
   def apply() = {
@@ -356,7 +352,7 @@ object ProductTwo extends Product(2)
 
 class Product(val i: Int) extends Group("Product") with Arity {
   val productElementComment = """
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/build/maven/scala-actors-pom.xml b/src/build/maven/scala-actors-pom.xml
index a0ebcec..37500bf 100644
--- a/src/build/maven/scala-actors-pom.xml
+++ b/src/build/maven/scala-actors-pom.xml
@@ -44,8 +44,8 @@
       <name>EPFL LAMP</name>
     </developer>
     <developer>
-      <id>Typesafe</id>
-      <name>Typesafe, Inc.</name>
+      <id>Lightbend</id>
+      <name>Lightbend, Inc.</name>
     </developer>
   </developers>
 </project>
diff --git a/src/build/maven/scala-compiler-doc-pom.xml b/src/build/maven/scala-compiler-doc-pom.xml
index 8572e55..0c33d23 100644
--- a/src/build/maven/scala-compiler-doc-pom.xml
+++ b/src/build/maven/scala-compiler-doc-pom.xml
@@ -51,8 +51,8 @@
       <name>EPFL LAMP</name>
     </developer>
     <developer>
-      <id>Typesafe</id>
-      <name>Typesafe, Inc.</name>
+      <id>Lightbend</id>
+      <name>Lightbend, Inc.</name>
     </developer>
   </developers>
 </project>
diff --git a/src/build/maven/scala-compiler-interactive-pom.xml b/src/build/maven/scala-compiler-interactive-pom.xml
index ad8192b..d3e5e0b 100644
--- a/src/build/maven/scala-compiler-interactive-pom.xml
+++ b/src/build/maven/scala-compiler-interactive-pom.xml
@@ -41,8 +41,8 @@
       <name>EPFL LAMP</name>
     </developer>
     <developer>
-      <id>Typesafe</id>
-      <name>Typesafe, Inc.</name>
+      <id>Lightbend</id>
+      <name>Lightbend, Inc.</name>
     </developer>
   </developers>
 </project>
diff --git a/src/build/maven/scala-compiler-pom.xml b/src/build/maven/scala-compiler-pom.xml
index 8ca18f6..1554610 100644
--- a/src/build/maven/scala-compiler-pom.xml
+++ b/src/build/maven/scala-compiler-pom.xml
@@ -63,8 +63,8 @@
       <name>EPFL LAMP</name>
     </developer>
     <developer>
-      <id>Typesafe</id>
-      <name>Typesafe, Inc.</name>
+      <id>Lightbend</id>
+      <name>Lightbend, Inc.</name>
     </developer>
   </developers>
 </project>
diff --git a/src/build/maven/scala-dist-pom.xml b/src/build/maven/scala-dist-pom.xml
index 9477e14..6788ff0 100644
--- a/src/build/maven/scala-dist-pom.xml
+++ b/src/build/maven/scala-dist-pom.xml
@@ -68,8 +68,8 @@
       <name>EPFL LAMP</name>
     </developer>
     <developer>
-      <id>Typesafe</id>
-      <name>Typesafe, Inc.</name>
+      <id>Lightbend</id>
+      <name>Lightbend, Inc.</name>
     </developer>
   </developers>
 </project>
diff --git a/src/build/maven/scala-library-all-pom.xml b/src/build/maven/scala-library-all-pom.xml
index 3fcf207..1991bae 100644
--- a/src/build/maven/scala-library-all-pom.xml
+++ b/src/build/maven/scala-library-all-pom.xml
@@ -81,8 +81,8 @@
       <name>EPFL LAMP</name>
     </developer>
     <developer>
-      <id>Typesafe</id>
-      <name>Typesafe, Inc.</name>
+      <id>Lightbend</id>
+      <name>Lightbend, Inc.</name>
     </developer>
   </developers>
 </project>
diff --git a/src/build/maven/scala-library-pom.xml b/src/build/maven/scala-library-pom.xml
index 78fc05a..e27f8fb 100644
--- a/src/build/maven/scala-library-pom.xml
+++ b/src/build/maven/scala-library-pom.xml
@@ -39,8 +39,8 @@
       <name>EPFL LAMP</name>
     </developer>
     <developer>
-      <id>Typesafe</id>
-      <name>Typesafe, Inc.</name>
+      <id>Lightbend</id>
+      <name>Lightbend, Inc.</name>
     </developer>
   </developers>
 </project>
diff --git a/src/build/maven/scala-reflect-pom.xml b/src/build/maven/scala-reflect-pom.xml
index c21caef..f7f3c8b 100644
--- a/src/build/maven/scala-reflect-pom.xml
+++ b/src/build/maven/scala-reflect-pom.xml
@@ -44,8 +44,8 @@
       <name>EPFL LAMP</name>
     </developer>
     <developer>
-      <id>Typesafe</id>
-      <name>Typesafe, Inc.</name>
+      <id>Lightbend</id>
+      <name>Lightbend, Inc.</name>
     </developer>
   </developers>
 </project>
diff --git a/src/build/maven/scalap-pom.xml b/src/build/maven/scalap-pom.xml
index 236ac99..acdd44f 100644
--- a/src/build/maven/scalap-pom.xml
+++ b/src/build/maven/scalap-pom.xml
@@ -41,8 +41,8 @@
       <name>EPFL LAMP</name>
     </developer>
     <developer>
-      <id>Typesafe</id>
-      <name>Typesafe, Inc.</name>
+      <id>Lightbend</id>
+      <name>Lightbend, Inc.</name>
     </developer>
   </developers>
 </project>
diff --git a/src/compiler/scala/reflect/quasiquotes/Holes.scala b/src/compiler/scala/reflect/quasiquotes/Holes.scala
index 38b05f9..47084fc 100644
--- a/src/compiler/scala/reflect/quasiquotes/Holes.scala
+++ b/src/compiler/scala/reflect/quasiquotes/Holes.scala
@@ -132,7 +132,7 @@ trait Holes { self: Quasiquotes =>
     private def mapF(tree: Tree, f: Tree => Tree): Tree =
       if (f(Ident(TermName("x"))) equalsStructure Ident(TermName("x"))) tree
       else {
-        val x: TermName = c.freshName()
+        val x = TermName(c.freshName())
         // q"$tree.map { $x => ${f(Ident(x))} }"
         Apply(Select(tree, nme.map),
           Function(ValDef(Modifiers(PARAM), x, TypeTree(), EmptyTree) :: Nil,
@@ -151,7 +151,7 @@ trait Holes { self: Quasiquotes =>
         else None
     }
 
-    /** Map high-rank unquotee onto an expression that eveluates as a list of given rank.
+    /** Map high-rank unquotee onto an expression that evaluates as a list of given rank.
      *
      *  All possible combinations of representations are given in the table below:
      *
@@ -187,7 +187,7 @@ trait Holes { self: Quasiquotes =>
     lazy val tree =
       tptopt.map { tpt =>
         val TypeDef(_, _, _, typedTpt) =
-          try c.typeCheck(TypeDef(NoMods, TypeName("T"), Nil, tpt))
+          try c.typecheck(TypeDef(NoMods, TypeName("T"), Nil, tpt))
           catch { case TypecheckException(pos, msg) => c.abort(pos.asInstanceOf[c.Position], msg) }
         val tpe = typedTpt.tpe
         val (iterableRank, _) = stripIterable(tpe)
diff --git a/src/compiler/scala/reflect/quasiquotes/Parsers.scala b/src/compiler/scala/reflect/quasiquotes/Parsers.scala
index 97ec7db..108ad0b 100644
--- a/src/compiler/scala/reflect/quasiquotes/Parsers.scala
+++ b/src/compiler/scala/reflect/quasiquotes/Parsers.scala
@@ -59,6 +59,10 @@ trait Parsers { self: Quasiquotes =>
 
       override implicit lazy val fresh: FreshNameCreator = new FreshNameCreator(nme.QUASIQUOTE_PREFIX)
 
+      // Do not check for tuple arity. The placeholders can support arbitrary tuple sizes.
+      override def makeSafeTupleTerm(trees: List[Tree], offset: Offset): Tree = treeBuilder.makeTupleTerm(trees)
+      override def makeSafeTupleType(trees: List[Tree], offset: Offset): Tree = treeBuilder.makeTupleType(trees)
+
       override val treeBuilder = new ParserTreeBuilder {
         override implicit def fresh: FreshNameCreator = parser.fresh
 
diff --git a/src/compiler/scala/reflect/quasiquotes/Reifiers.scala b/src/compiler/scala/reflect/quasiquotes/Reifiers.scala
index cc98717..b2002a0 100644
--- a/src/compiler/scala/reflect/quasiquotes/Reifiers.scala
+++ b/src/compiler/scala/reflect/quasiquotes/Reifiers.scala
@@ -247,7 +247,7 @@ trait Reifiers { self: Quasiquotes =>
         hole.tree
       case Placeholder(hole: UnapplyHole) => hole.treeNoUnlift
       case FreshName(prefix) if prefix != nme.QUASIQUOTE_NAME_PREFIX =>
-        def fresh() = c.freshName[TermName](nme.QUASIQUOTE_NAME_PREFIX)
+        def fresh() = c.freshName(TermName(nme.QUASIQUOTE_NAME_PREFIX))
         def introduceName() = { val n = fresh(); nameMap(name) += n; n}
         def result(n: Name) = if (isReifyingExpressions) Ident(n) else Bind(n, Ident(nme.WILDCARD))
         if (isReifyingPatterns) result(introduceName())
@@ -317,12 +317,12 @@ trait Reifiers { self: Quasiquotes =>
      *  Reification of non-trivial list is done in two steps:
      *
      *  1. split the list into groups where every placeholder is always
-     *     put in a group of it's own and all subsquent non-holeMap are
+     *     put in a group of its own and all subsequent non-holeMap are
      *     grouped together; element is considered to be a placeholder if it's
      *     in the domain of the fill function;
      *
      *  2. fold the groups into a sequence of lists added together with ++ using
-     *     fill reification for holeMap and fallback reification for non-holeMap.
+     *     fill reification for holeMap and fallback reification for non-holeMap.
      *
      *  Example:
      *
diff --git a/src/compiler/scala/reflect/reify/codegen/GenSymbols.scala b/src/compiler/scala/reflect/reify/codegen/GenSymbols.scala
index 52ddcb1..e41fbf0 100644
--- a/src/compiler/scala/reflect/reify/codegen/GenSymbols.scala
+++ b/src/compiler/scala/reflect/reify/codegen/GenSymbols.scala
@@ -39,7 +39,7 @@ trait GenSymbols {
     else if (sym.isModuleClass)
       if (sym.sourceModule.isLocatable) Select(Select(reify(sym.sourceModule), nme.asModule), nme.moduleClass)
       else reifySymDef(sym)
-    else if (sym.isPackage)
+    else if (sym.hasPackageFlag)
       mirrorMirrorCall(nme.staticPackage, reify(sym.fullName))
     else if (sym.isLocatable) {
       /*  This is a fancy conundrum that stems from the fact that Scala allows
diff --git a/src/compiler/scala/reflect/reify/codegen/GenTrees.scala b/src/compiler/scala/reflect/reify/codegen/GenTrees.scala
index 743fe13..f34d751 100644
--- a/src/compiler/scala/reflect/reify/codegen/GenTrees.scala
+++ b/src/compiler/scala/reflect/reify/codegen/GenTrees.scala
@@ -153,7 +153,7 @@ trait GenTrees {
         else mirrorCall(nme.Ident, reify(name))
 
       case Select(qual, name) =>
-        if (qual.symbol != null && qual.symbol.isPackage) {
+        if (qual.symbol != null && qual.symbol.hasPackageFlag) {
           mirrorBuildCall(nme.mkIdent, reify(sym))
         } else {
           val effectiveName = if (sym != null && sym != NoSymbol) sym.name else name
@@ -199,7 +199,7 @@ trait GenTrees {
           }
         }
         else tree match {
-          case Select(qual, name) if !qual.symbol.isPackage =>
+          case Select(qual, name) if !qual.symbol.hasPackageFlag =>
             if (reifyDebug) println(s"reifying Select($qual, $name)")
             mirrorCall(nme.Select, reify(qual), reify(name))
           case SelectFromTypeTree(qual, name) =>
diff --git a/src/compiler/scala/reflect/reify/codegen/GenUtils.scala b/src/compiler/scala/reflect/reify/codegen/GenUtils.scala
index de9fec0..b5b0f93 100644
--- a/src/compiler/scala/reflect/reify/codegen/GenUtils.scala
+++ b/src/compiler/scala/reflect/reify/codegen/GenUtils.scala
@@ -15,7 +15,7 @@ trait GenUtils {
   def reifyProduct(prefix: String, elements: List[Any]): Tree = {
     // reflection would be more robust, but, hey, this is a hot path
     if (prefix.startsWith("Tuple")) scalaFactoryCall(prefix, (elements map reify).toList: _*)
-    else mirrorCall(prefix, (elements map reify): _*)
+    else mirrorCall(TermName(prefix), (elements map reify): _*)
   }
 
   // helper functions
@@ -49,16 +49,16 @@ trait GenUtils {
     call("" + nme.MIRROR_PREFIX + name, args: _*)
 
   def mirrorFactoryCall(value: Product, args: Tree*): Tree =
-    mirrorFactoryCall(value.productPrefix, args: _*)
+    mirrorFactoryCall(TermName(value.productPrefix), args: _*)
 
   def mirrorFactoryCall(prefix: TermName, args: Tree*): Tree =
-    mirrorCall("" + prefix, args: _*)
+    mirrorCall(TermName("" + prefix), args: _*)
 
   def scalaFactoryCall(name: TermName, args: Tree*): Tree =
     call(s"scala.$name.apply", args: _*)
 
   def scalaFactoryCall(name: String, args: Tree*): Tree =
-    scalaFactoryCall(name: TermName, args: _*)
+    scalaFactoryCall(TermName(name), args: _*)
 
   def mkList(args: List[Tree]): Tree =
     scalaFactoryCall("collection.immutable.List", args: _*)
diff --git a/src/compiler/scala/tools/ant/FastScalac.scala b/src/compiler/scala/tools/ant/FastScalac.scala
index c3eb9ee..6f0a30a 100644
--- a/src/compiler/scala/tools/ant/FastScalac.scala
+++ b/src/compiler/scala/tools/ant/FastScalac.scala
@@ -15,7 +15,7 @@ import org.apache.tools.ant.types.Path
 import scala.tools.nsc.Settings
 import scala.tools.nsc.io.File
 import scala.tools.nsc.settings.FscSettings
-import scala.tools.nsc.util.ScalaClassLoader
+import scala.reflect.internal.util.ScalaClassLoader
 
 /** An Ant task to compile with the fast Scala compiler (`fsc`).
  *
diff --git a/src/compiler/scala/tools/ant/Scalac.scala b/src/compiler/scala/tools/ant/Scalac.scala
index 13bf0ef..f46f014 100644
--- a/src/compiler/scala/tools/ant/Scalac.scala
+++ b/src/compiler/scala/tools/ant/Scalac.scala
@@ -131,7 +131,7 @@ class Scalac extends ScalaMatchingTask with ScalacShared {
   /** The character encoding of the files to compile. */
   protected var encoding: Option[String] = None
 
-  // the targetted backend
+  // the targeted backend
   protected var backend: Option[String] = None
 
   /** Whether to force compilation of all files or not. */
diff --git a/src/compiler/scala/tools/ant/sabbus/Compiler.scala b/src/compiler/scala/tools/ant/sabbus/Compiler.scala
index 65cd9f4..81cd1f3 100644
--- a/src/compiler/scala/tools/ant/sabbus/Compiler.scala
+++ b/src/compiler/scala/tools/ant/sabbus/Compiler.scala
@@ -12,7 +12,7 @@ package scala.tools.ant.sabbus
 import java.io.File
 import java.net.URL
 import java.lang.reflect.InvocationTargetException
-import scala.tools.nsc.util.ScalaClassLoader
+import scala.reflect.internal.util.ScalaClassLoader
 
 class Compiler(classpath: Array[URL], val settings: Settings)
 {
diff --git a/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala b/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala
index 595b45a..cde827b 100644
--- a/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala
+++ b/src/compiler/scala/tools/ant/sabbus/ScalacFork.scala
@@ -16,7 +16,7 @@ import org.apache.tools.ant.taskdefs.Java
 import org.apache.tools.ant.util.{ GlobPatternMapper, SourceFileScanner }
 import org.apache.tools.ant.BuildException
 import scala.tools.nsc.io
-import scala.tools.nsc.util.ScalaClassLoader
+import scala.reflect.internal.util.ScalaClassLoader
 
 /** An Ant task to compile with the new Scala compiler (NSC).
  *
diff --git a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl
index 9862ea7..5e6b3c0 100755
--- a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl
+++ b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl
@@ -67,6 +67,11 @@ if uname | grep -q ^MINGW; then
   mingw="$(uname)"
 fi
 
+unset msys
+if uname | grep -q ^MSYS; then
+  msys="$(uname)"
+fi
+
 # Finding the root folder for this Scala distribution
 SCALA_HOME="$(findScalaHome)"
 SEP=":"
@@ -111,9 +116,9 @@ if [[ -n "$cygwin" ]]; then
     TOOL_CLASSPATH="$(cygpath --path --$format "$TOOL_CLASSPATH")"
 fi
 
-if [[ -n "$cygwin$mingw" ]]; then
+if [[ -n "$cygwin$mingw$msys" ]]; then
     case "$TERM" in
-        rxvt* | xterm*)
+        rxvt* | xterm* | cygwin*)
             stty -icanon min 1 -echo
             WINDOWS_OPT="-Djline.terminal=unix"
         ;;
@@ -137,8 +142,8 @@ while [[ $# -gt 0 ]]; do
     -D*)
       # pass to scala as well: otherwise we lose it sometimes when we
       # need it, e.g. communicating with a server compiler.
-      java_args=("${java_args[@@]}" "$1")
-      scala_args=("${scala_args[@@]}" "$1")
+      java_args+=("$1")
+      scala_args+=("$1")
       # respect user-supplied -Dscala.usejavacp
       case "$1" in -Dscala.usejavacp*) OVERRIDE_USEJAVACP="";; esac
       shift
@@ -146,8 +151,8 @@ while [[ $# -gt 0 ]]; do
     -J*)
       # as with -D, pass to scala even though it will almost
       # never be used.
-      java_args=("${java_args[@@]}" "${1:2}")
-      scala_args=("${scala_args[@@]}" "$1")
+      java_args+=("${1:2}")
+      scala_args+=("$1")
       shift
       ;;
     -toolcp)
@@ -167,7 +172,7 @@ while [[ $# -gt 0 ]]; do
       shift
       ;;
     *)
-      scala_args=("${scala_args[@@]}" "$1")
+      scala_args+=("$1")
       shift
       ;;
   esac
@@ -182,10 +187,10 @@ fi
 
 declare -a classpath_args
 
-# default to the boot classpath for speed, except on cygwin/mingw because
+# default to the boot classpath for speed, except on cygwin/mingw/msys because
 # JLine on Windows requires a custom DLL to be loaded.
 unset usebootcp
-if [[ -z "$cygwin$mingw" ]]; then
+if [[ -z "$cygwin$mingw$msys" ]]; then
   usebootcp="true"
 fi
 
diff --git a/src/compiler/scala/tools/nsc/EvalLoop.scala b/src/compiler/scala/tools/nsc/EvalLoop.scala
index 15a296c..73f4b9a 100644
--- a/src/compiler/scala/tools/nsc/EvalLoop.scala
+++ b/src/compiler/scala/tools/nsc/EvalLoop.scala
@@ -6,6 +6,7 @@
 package scala.tools.nsc
 
 import scala.annotation.tailrec
+import scala.io.StdIn
 import java.io.EOFException
 
 trait EvalLoop {
@@ -14,7 +15,7 @@ trait EvalLoop {
   def loop(action: (String) => Unit) {
     @tailrec def inner() {
       Console.print(prompt)
-      val line = try Console.readLine() catch { case _: EOFException => null }
+      val line = try StdIn.readLine() catch { case _: EOFException => null }
       if (line != null && line != "") {
         action(line)
         inner()
diff --git a/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala b/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala
index dbdeec8..24496fa 100644
--- a/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala
+++ b/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala
@@ -6,6 +6,7 @@
 package scala.tools.nsc
 
 import GenericRunnerCommand._
+import scala.reflect.internal.util.ScalaClassLoader
 
 /** A command for ScriptRunner */
 class GenericRunnerCommand(
@@ -32,7 +33,7 @@ extends CompilerCommand(args, settings) {
   private def guessHowToRun(target: String): GenericRunnerCommand.HowToRun = {
     if (!ok) Error
     else if (io.Jar.isJarOrZip(target)) AsJar
-    else if (util.ScalaClassLoader.classExists(settings.classpathURLs, target)) AsObject
+    else if (ScalaClassLoader.classExists(settings.classpathURLs, target)) AsObject
     else {
       val f = io.File(target)
       if (!f.hasExtension("class", "jar", "zip") && f.canRead) AsScript
@@ -86,7 +87,11 @@ A file argument will be run as a scala script unless it contains only
 self-contained compilation units (classes and objects) and exactly one
 runnable main method.  In that case the file will be compiled and the
 main method invoked.  This provides a bridge between scripts and standard
-scala source.%n"""
+scala source.
+
+When running a script or using -e, an already running compilation daemon
+(fsc) is used, or a new one started on demand.  The -nc option can be
+used to prevent this.%n"""
 }
 
 object GenericRunnerCommand {
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index 1c9dbad..a618b08 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -10,7 +10,6 @@ package nsc
 import java.io.{ File, FileOutputStream, PrintWriter, IOException, FileNotFoundException }
 import java.net.URL
 import java.nio.charset.{ Charset, CharsetDecoder, IllegalCharsetNameException, UnsupportedCharsetException }
-import scala.compat.Platform.currentTime
 import scala.collection.{ mutable, immutable }
 import io.{ SourceReader, AbstractFile, Path }
 import reporters.{ Reporter, ConsoleReporter }
@@ -232,7 +231,7 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
   /** Called from parser, which signals hereby that a method definition has been parsed. */
   def signalParseProgress(pos: Position) {}
 
-  /** Called by ScalaDocAnalyzer when a doc comment has been parsed. */
+  /** Called by ScaladocAnalyzer when a doc comment has been parsed. */
   def signalParsedDocComment(comment: String, pos: Position) = {
     // TODO: this is all very broken (only works for scaladoc comments, not regular ones)
     //       --> add hooks to parser and refactor Interactive global to handle comments directly
@@ -1487,6 +1486,8 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
       compileUnitsInternal(units, fromPhase)
 
     private def compileUnitsInternal(units: List[CompilationUnit], fromPhase: Phase) {
+      def currentTime = java.util.concurrent.TimeUnit.NANOSECONDS.toMillis(System.nanoTime())
+
       units foreach addUnit
       val startTime = currentTime
 
@@ -1551,7 +1552,8 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
 
       if (reporter.hasErrors) {
         for ((sym, file) <- symSource.iterator) {
-          sym.reset(new loaders.SourcefileLoader(file))
+          if (file != null)
+            sym.reset(new loaders.SourcefileLoader(file))
           if (sym.isTerm)
             sym.moduleClass reset loaders.moduleClassLoader
         }
@@ -1673,23 +1675,28 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
   def getFile(clazz: Symbol, suffix: String): File = getFile(clazz.sourceFile, clazz.fullName split '.', suffix)
 
   private def writeICode() {
-    val printer = new icodes.TextPrinter(null, icodes.linearizer)
-    icodes.classes.values.foreach((cls) => {
-      val moduleSfx = if (cls.symbol.hasModuleFlag) "$" else ""
-      val phaseSfx  = if (settings.debug) phase else "" // only for debugging, appending the full phasename breaks windows build
-      val file      = getFile(cls.symbol, s"$moduleSfx$phaseSfx.icode")
+    val printer = new icodes.TextPrinter(writer = null, icodes.linearizer)
+    icodes.classes.values foreach { cls =>
+      val file = {
+        val module = if (cls.symbol.hasModuleFlag) "$" else ""
+        val faze   = if (settings.debug) phase.name else f"${phase.id}%02d" // avoid breaking windows build with long filename
+        getFile(cls.symbol, s"$module-$faze.icode")
+      }
 
       try {
         val stream = new FileOutputStream(file)
         printer.setWriter(new PrintWriter(stream, true))
-        printer.printClass(cls)
-        informProgress("wrote " + file)
+        try
+          printer.printClass(cls)
+        finally
+          stream.close()
+        informProgress(s"wrote $file")
       } catch {
-        case ex: IOException =>
-          if (settings.debug) ex.printStackTrace()
-        globalError("could not write file " + file)
+        case e: IOException =>
+          if (settings.debug) e.printStackTrace()
+          globalError(s"could not write file $file")
       }
-    })
+    }
   }
   def createJavadoc    = false
 }
diff --git a/src/compiler/scala/tools/nsc/ObjectRunner.scala b/src/compiler/scala/tools/nsc/ObjectRunner.scala
index 7c14f49..8e01418 100644
--- a/src/compiler/scala/tools/nsc/ObjectRunner.scala
+++ b/src/compiler/scala/tools/nsc/ObjectRunner.scala
@@ -7,8 +7,8 @@
 package scala.tools.nsc
 
 import java.net.URL
-import util.ScalaClassLoader
 import util.Exceptional.unwrap
+import scala.reflect.internal.util.ScalaClassLoader
 
 trait CommonRunner {
   /** Run a given object, specified by name, using a
diff --git a/src/compiler/scala/tools/nsc/PhaseAssembly.scala b/src/compiler/scala/tools/nsc/PhaseAssembly.scala
index e1cfa63..ef9818c 100644
--- a/src/compiler/scala/tools/nsc/PhaseAssembly.scala
+++ b/src/compiler/scala/tools/nsc/PhaseAssembly.scala
@@ -127,7 +127,7 @@ trait PhaseAssembly {
     }
 
     /* Find all edges in the given graph that are hard links. For each hard link we
-     * need to check that its the only dependency. If not, then we will promote the
+     * need to check that it's the only dependency. If not, then we will promote the
      * other dependencies down
      */
     def validateAndEnforceHardlinks() {
@@ -226,7 +226,7 @@ trait PhaseAssembly {
   }
 
   /** Given the phases set, will build a dependency graph from the phases set
-   *  Using the aux. method of the DependencyGraph to create nodes and egdes.
+   *  Using the aux. method of the DependencyGraph to create nodes and edges.
    */
   private def phasesSetToDepGraph(phsSet: mutable.HashSet[SubComponent]): DependencyGraph = {
     val graph = new DependencyGraph()
diff --git a/src/compiler/scala/tools/nsc/Properties.scala b/src/compiler/scala/tools/nsc/Properties.scala
index 9f160e2..cb523ed 100644
--- a/src/compiler/scala/tools/nsc/Properties.scala
+++ b/src/compiler/scala/tools/nsc/Properties.scala
@@ -12,8 +12,16 @@ object Properties extends scala.util.PropertiesTrait {
   protected def pickJarBasedOn = classOf[Global]
 
   // settings based on jar properties, falling back to System prefixed by "scala."
+
+  // messages to display at startup or prompt, format string with string parameters
+  // Scala version, Java version, JVM name
   def residentPromptString = scalaPropOrElse("resident.prompt", "\nnsc> ")
-  def shellPromptString    = scalaPropOrElse("shell.prompt", "\nscala> ")
+  def shellPromptString    = scalaPropOrElse("shell.prompt", "%nscala> ")
+  def shellWelcomeString   = scalaPropOrElse("shell.welcome",
+    """Welcome to Scala %1$#s (%3$s, Java %2$s).
+      |Type in expressions for evaluation. Or try :help.""".stripMargin
+  )
+
   // message to display at EOF (which by default ends with
   // a newline so as not to break the user's terminal)
   def shellInterruptedString = scalaPropOrElse("shell.interrupted", f":quit$lineSeparator")
diff --git a/src/compiler/scala/tools/nsc/Reporting.scala b/src/compiler/scala/tools/nsc/Reporting.scala
index 4d7e9e7..e01c536 100644
--- a/src/compiler/scala/tools/nsc/Reporting.scala
+++ b/src/compiler/scala/tools/nsc/Reporting.scala
@@ -26,7 +26,7 @@ trait Reporting extends scala.reflect.internal.Reporting { self: ast.Positions w
   protected def PerRunReporting = new PerRunReporting
   class PerRunReporting extends PerRunReportingBase {
     /** Collects for certain classes of warnings during this run. */
-    private class ConditionalWarning(what: String, option: Settings#BooleanSetting) {
+    private class ConditionalWarning(what: String, option: Settings#BooleanSetting)(reRunFlag: String = option.name) {
       val warnings = mutable.LinkedHashMap[Position, String]()
       def warn(pos: Position, msg: String) =
         if (option) reporter.warning(pos, msg)
@@ -37,16 +37,16 @@ trait Reporting extends scala.reflect.internal.Reporting { self: ast.Positions w
           val warningVerb  = if (numWarnings == 1) "was" else "were"
           val warningCount = countElementsAsString(numWarnings, s"$what warning")
 
-          reporter.warning(NoPosition, s"there $warningVerb $warningCount; re-run with ${option.name} for details")
+          reporter.warning(NoPosition, s"there $warningVerb $warningCount; re-run with $reRunFlag for details")
         }
     }
 
     // This change broke sbt; I gave it the thrilling name of uncheckedWarnings0 so
     // as to recover uncheckedWarnings for its ever-fragile compiler interface.
-    private val _deprecationWarnings    = new ConditionalWarning("deprecation", settings.deprecation)
-    private val _uncheckedWarnings      = new ConditionalWarning("unchecked", settings.unchecked)
-    private val _featureWarnings        = new ConditionalWarning("feature", settings.feature)
-    private val _inlinerWarnings        = new ConditionalWarning("inliner", settings.YinlinerWarnings)
+    private val _deprecationWarnings    = new ConditionalWarning("deprecation", settings.deprecation)()
+    private val _uncheckedWarnings      = new ConditionalWarning("unchecked", settings.unchecked)()
+    private val _featureWarnings        = new ConditionalWarning("feature", settings.feature)()
+    private val _inlinerWarnings        = new ConditionalWarning("inliner", settings.YinlinerWarnings)(if (settings.isBCodeActive) settings.YoptWarnings.name else settings.YinlinerWarnings.name)
     private val _allConditionalWarnings = List(_deprecationWarnings, _uncheckedWarnings, _featureWarnings, _inlinerWarnings)
 
     // TODO: remove in favor of the overload that takes a Symbol, give that argument a default (NoSymbol)
@@ -78,7 +78,7 @@ trait Reporting extends scala.reflect.internal.Reporting { self: ast.Positions w
         s"""|
             |This can be achieved by adding the import clause 'import $fqname'
             |or by setting the compiler option -language:$featureName.
-            |See the Scala docs for value $fqname for a discussion
+            |See the Scaladoc for value $fqname for a discussion
             |why the feature $req be explicitly enabled.""".stripMargin
       )
       reportedFeature += featureTrait
diff --git a/src/compiler/scala/tools/nsc/ScriptRunner.scala b/src/compiler/scala/tools/nsc/ScriptRunner.scala
index 6d24b31..bf93ad3 100644
--- a/src/compiler/scala/tools/nsc/ScriptRunner.scala
+++ b/src/compiler/scala/tools/nsc/ScriptRunner.scala
@@ -16,16 +16,16 @@ import util.Exceptional.unwrap
 
 /** An object that runs Scala code in script files.
  *
- *  <p>For example, here is a complete Scala script on Unix:</pre>
- *  <pre>
+ *  For example, here is a complete Scala script on Unix:
+ *  {{{
  *    #!/bin/sh
  *    exec scala "$0" "$@"
  *    !#
  *    Console.println("Hello, world!")
  *    args.toList foreach Console.println
- *  </pre>
- *  <p>And here is a batch file example on Windows XP:</p>
- *  <pre>
+ *  }}}
+ *  And here is a batch file example on Windows XP:
+ *  {{{
  *    ::#!
  *    @echo off
  *    call scala %0 %*
@@ -33,7 +33,7 @@ import util.Exceptional.unwrap
  *    ::!#
  *    Console.println("Hello, world!")
  *    args.toList foreach Console.println
- *  </pre>
+ *  }}}
  *
  *  @author  Lex Spoon
  *  @version 1.0, 15/05/2006
diff --git a/src/compiler/scala/tools/nsc/ast/DocComments.scala b/src/compiler/scala/tools/nsc/ast/DocComments.scala
old mode 100755
new mode 100644
index 02a199f..6442ef2
--- a/src/compiler/scala/tools/nsc/ast/DocComments.scala
+++ b/src/compiler/scala/tools/nsc/ast/DocComments.scala
@@ -76,9 +76,9 @@ trait DocComments { self: Global =>
 
     superComment(sym) match {
       case None =>
-        if (ownComment.indexOf("@inheritdoc") != -1)
-          reporter.warning(sym.pos, "The comment for " + sym +
-              " contains @inheritdoc, but no parent comment is available to inherit from.")
+        // SI-8210 - The warning would be false negative when this symbol is a setter
+        if (ownComment.indexOf("@inheritdoc") != -1 && ! sym.isSetter)
+          reporter.warning(sym.pos, s"The comment for ${sym} contains @inheritdoc, but no parent comment is available to inherit from.")
         ownComment.replaceAllLiterally("@inheritdoc", "<invalid inheritdoc annotation>")
       case Some(sc) =>
         if (ownComment == "") sc
diff --git a/src/compiler/scala/tools/nsc/ast/NodePrinters.scala b/src/compiler/scala/tools/nsc/ast/NodePrinters.scala
index 9c8e13a..6fe85cd 100644
--- a/src/compiler/scala/tools/nsc/ast/NodePrinters.scala
+++ b/src/compiler/scala/tools/nsc/ast/NodePrinters.scala
@@ -9,6 +9,7 @@ package ast
 import scala.compat.Platform.EOL
 import symtab.Flags._
 import scala.language.postfixOps
+import scala.reflect.internal.util.ListOfNil
 
 /** The object `nodePrinter` converts the internal tree
  *  representation to a string.
diff --git a/src/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
index 0575b97..332acf4 100644
--- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala
+++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
@@ -233,7 +233,7 @@ abstract class TreeGen extends scala.reflect.internal.TreeGen with TreeDSL {
   }
 
   /** Return the synchronized part of the double-checked locking idiom around the syncBody tree. It guards with `cond` and
-   *  synchronizez on `clazz.this`. Additional statements can be included after initialization,
+   *  synchronizes on `clazz.this`. Additional statements can be included after initialization,
    *  (outside the synchronized block).
    *
    *  The idiom works only if the condition is using a volatile field.
@@ -261,7 +261,7 @@ abstract class TreeGen extends scala.reflect.internal.TreeGen with TreeDSL {
    * Create a method based on a Function
    *
    * Used both to under `-Ydelambdafy:method` create a lifted function and
-   * under `-Ydelamdafy:inline` to create the apply method on the anonymous
+   * under `-Ydelambdafy:inline` to create the apply method on the anonymous
    * class.
    *
    * It creates a method definition with value params cloned from the
diff --git a/src/compiler/scala/tools/nsc/ast/Trees.scala b/src/compiler/scala/tools/nsc/ast/Trees.scala
index 3652f51..9342570 100644
--- a/src/compiler/scala/tools/nsc/ast/Trees.scala
+++ b/src/compiler/scala/tools/nsc/ast/Trees.scala
@@ -178,7 +178,7 @@ trait Trees extends scala.reflect.internal.Trees { self: Global =>
     }
   }
 
-  // Finally, noone resetAllAttrs it anymore, so I'm removing it from the compiler.
+  // Finally, no one uses resetAllAttrs anymore, so I'm removing it from the compiler.
   // Even though it's with great pleasure I'm doing that, I'll leave its body here to warn future generations about what happened in the past.
   //
   // So what actually happened in the past is that we used to have two flavors of resetAttrs: resetAllAttrs and resetLocalAttrs.
@@ -308,7 +308,7 @@ trait Trees extends scala.reflect.internal.Trees { self: Global =>
                 // Erasing locally-defined symbols is useful to prevent tree corruption, but erasing external bindings is not,
                 // therefore we want to retain those bindings, especially given that restoring them can be impossible
                 // if we move these trees into lexical contexts different from their original locations.
-                if (dupl.hasSymbol) {
+                if (dupl.hasSymbolField) {
                   val sym = dupl.symbol
                   val vetoScope = !brutally && !(locals contains sym) && !(locals contains sym.deSkolemize)
                   val vetoThis = dupl.isInstanceOf[This] && sym.isPackageClass
diff --git a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala
old mode 100755
new mode 100644
index 96939e6..52b8a51
--- a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala
@@ -6,6 +6,7 @@
 package scala.tools.nsc
 package ast.parser
 
+import scala.annotation.tailrec
 import scala.collection.mutable
 import mutable.{ Buffer, ArrayBuffer, ListBuffer }
 import scala.util.control.ControlThrowable
@@ -172,20 +173,19 @@ trait MarkupParsers {
     }
 
     def appendText(pos: Position, ts: Buffer[Tree], txt: String): Unit = {
-      def append(t: String) = ts append handle.text(pos, t)
-
-      if (preserveWS) append(txt)
-      else {
+      def append(text: String): Unit = {
+        val tree = handle.text(pos, text)
+        ts append tree
+      }
+      val clean = if (preserveWS) txt else {
         val sb = new StringBuilder()
-
         txt foreach { c =>
           if (!isSpace(c)) sb append c
           else if (sb.isEmpty || !isSpace(sb.last)) sb append ' '
         }
-
-        val trimmed = sb.toString.trim
-        if (!trimmed.isEmpty) append(trimmed)
+        sb.toString.trim
       }
+      if (!clean.isEmpty) append(clean)
     }
 
     /** adds entity/character to ts as side-effect
@@ -216,44 +216,75 @@ trait MarkupParsers {
       if (xCheckEmbeddedBlock) ts append xEmbeddedExpr
       else appendText(p, ts, xText)
 
-    /** Returns true if it encounters an end tag (without consuming it),
-     *  appends trees to ts as side-effect.
+    /** At an open angle-bracket, detects an end tag
+     *  or consumes CDATA, comment, PI or element.
+     *  Trees are appended to `ts` as a side-effect.
+     *  @return true if an end tag (without consuming it)
      */
-    private def content_LT(ts: ArrayBuffer[Tree]): Boolean = {
-      if (ch == '/')
-        return true   // end tag
-
-      val toAppend = ch match {
-        case '!'    => nextch() ; if (ch =='[') xCharData else xComment // CDATA or Comment
-        case '?'    => nextch() ; xProcInstr                            // PI
-        case _      => element                                        // child node
+    private def content_LT(ts: ArrayBuffer[Tree]): Boolean =
+      (ch == '/') || {
+        val toAppend = ch match {
+          case '!' => nextch() ; if (ch =='[') xCharData else xComment // CDATA or Comment
+          case '?' => nextch() ; xProcInstr                            // PI
+          case _   => element                                          // child node
+        }
+        ts append toAppend
+        false
       }
 
-      ts append toAppend
-      false
-    }
-
     def content: Buffer[Tree] = {
       val ts = new ArrayBuffer[Tree]
-      while (true) {
-        if (xEmbeddedBlock)
+      val coalescing = settings.XxmlSettings.isCoalescing
+      @tailrec def loopContent(): Unit =
+        if (xEmbeddedBlock) {
           ts append xEmbeddedExpr
-        else {
+          loopContent()
+        } else {
           tmppos = o2p(curOffset)
           ch match {
-            // end tag, cdata, comment, pi or child node
-            case '<'  => nextch() ; if (content_LT(ts)) return ts
-            // either the character '{' or an embedded scala block }
-            case '{'  => content_BRACE(tmppos, ts)  // }
-            // EntityRef or CharRef
-            case '&'  => content_AMP(ts)
-            case SU   => return ts
-            // text content - here xEmbeddedBlock might be true
-            case _    => appendText(tmppos, ts, xText)
+            case '<' =>           // end tag, cdata, comment, pi or child node
+              nextch()
+              if (!content_LT(ts)) loopContent()
+            case '{'  =>          // } literal brace or embedded Scala block
+              content_BRACE(tmppos, ts)
+              loopContent()
+            case '&' =>           // EntityRef or CharRef
+              content_AMP(ts)
+              loopContent()
+            case SU  => ()
+            case _   =>           // text content - here xEmbeddedBlock might be true
+              appendText(tmppos, ts, xText)
+              loopContent()
           }
         }
+      // merge text sections and strip attachments
+      def coalesce(): ArrayBuffer[Tree] = {
+        def copy() = {
+          val buf = new ArrayBuffer[Tree]
+          var acc = new StringBuilder
+          var pos: Position = NoPosition
+          def emit() = if (acc.nonEmpty) {
+            appendText(pos, buf, acc.toString)
+            acc.clear()
+          }
+          for (t <- ts)
+            t.attachments.get[handle.TextAttache] match {
+              case Some(ta) =>
+                if (acc.isEmpty) pos = ta.pos
+                acc append ta.text
+              case _        =>
+                emit()
+                buf += t
+            }
+          emit()
+          buf
+        }
+        val res = if (ts.count(_.hasAttachment[handle.TextAttache]) > 1) copy() else ts
+        for (t <- res) t.removeAttachment[handle.TextAttache]
+        res
       }
-      unreachable
+      loopContent()
+      if (coalescing) coalesce() else ts
     }
 
     /** '<' element ::= xmlTag1 '>'  { xmlExpr | '{' simpleExpr '}' } ETag
@@ -289,20 +320,16 @@ trait MarkupParsers {
     private def xText: String = {
       assert(!xEmbeddedBlock, "internal error: encountered embedded block")
       val buf = new StringBuilder
-      def done = buf.toString
-
-      while (ch != SU) {
-        if (ch == '}') {
-          if (charComingAfter(nextch()) == '}') nextch()
-          else errorBraces()
-        }
-
-        buf append ch
-        nextch()
-        if (xCheckEmbeddedBlock || ch == '<' ||  ch == '&')
-          return done
-      }
-      done
+      if (ch != SU)
+        do {
+          if (ch == '}') {
+            if (charComingAfter(nextch()) == '}') nextch()
+            else errorBraces()
+          }
+          buf append ch
+          nextch()
+        } while (!(ch == SU || xCheckEmbeddedBlock || ch == '<' ||  ch == '&'))
+      buf.toString
     }
 
     /** Some try/catch/finally logic used by xLiteral and xLiteralPattern.  */
@@ -344,12 +371,12 @@ trait MarkupParsers {
         tmppos = o2p(curOffset)    // Iuli: added this line, as it seems content_LT uses tmppos when creating trees
         content_LT(ts)
 
-        // parse more XML ?
+        // parse more XML?
         if (charComingAfter(xSpaceOpt()) == '<') {
           do {
             xSpaceOpt()
             nextch()
-            ts append element
+            content_LT(ts)
           } while (charComingAfter(xSpaceOpt()) == '<')
           handle.makeXMLseq(r2p(start, start, curOffset), ts)
         }
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
index 4663810..c04d305 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
@@ -13,7 +13,7 @@ import scala.collection.{ mutable, immutable }
 import mutable.{ ListBuffer, StringBuilder }
 import scala.reflect.internal.{ Precedence, ModifierFlags => Flags }
 import scala.reflect.internal.Chars.{ isScalaLetter }
-import scala.reflect.internal.util.{ SourceFile, Position, FreshNameCreator }
+import scala.reflect.internal.util.{ SourceFile, Position, FreshNameCreator, ListOfNil }
 import Tokens._
 
 /** Historical note: JavaParsers started life as a direct copy of Parsers
@@ -766,7 +766,58 @@ self =>
     @inline final def caseSeparated[T](part: => T): List[T] = tokenSeparated(CASE, sepFirst = true, part)
     def readAnnots(part: => Tree): List[Tree] = tokenSeparated(AT, sepFirst = true, part)
 
-/* --------- OPERAND/OPERATOR STACK --------------------------------------- */
+    /** Create a tuple type Tree. If the arity is not supported, a syntax error is emitted. */
+    def makeSafeTupleType(elems: List[Tree], offset: Offset) = {
+      if (checkTupleSize(elems, offset)) makeTupleType(elems)
+      else makeTupleType(Nil) // create a dummy node; makeTupleType(elems) would fail
+    }
+
+    /** Create a tuple term Tree. If the arity is not supported, a syntax error is emitted. */
+    def makeSafeTupleTerm(elems: List[Tree], offset: Offset) = {
+      checkTupleSize(elems, offset)
+      makeTupleTerm(elems)
+    }
+
+    private[this] def checkTupleSize(elems: List[Tree], offset: Offset): Boolean =
+      if (elems.lengthCompare(definitions.MaxTupleArity) > 0) {
+        syntaxError(offset, "too many elements for tuple: "+elems.length+", allowed: "+definitions.MaxTupleArity, skipIt = false)
+        false
+      } else true
+
+    /** Strip the artifitial `Parens` node to create a tuple term Tree. */
+    def stripParens(t: Tree) = t match {
+      case Parens(ts) => atPos(t.pos) { makeSafeTupleTerm(ts, t.pos.point) }
+      case _ => t
+    }
+
+    /** Create tree representing (unencoded) binary operation expression or pattern. */
+    def makeBinop(isExpr: Boolean, left: Tree, op: TermName, right: Tree, opPos: Position, targs: List[Tree] = Nil): Tree = {
+      require(isExpr || targs.isEmpty || targs.exists(_.isErroneous), s"Incompatible args to makeBinop: !isExpr but targs=$targs")
+
+      def mkSelection(t: Tree) = {
+        def sel = atPos(opPos union t.pos)(Select(stripParens(t), op.encode))
+        if (targs.isEmpty) sel else atPos(left.pos)(TypeApply(sel, targs))
+      }
+      def mkNamed(args: List[Tree]) = if (isExpr) args map treeInfo.assignmentToMaybeNamedArg else args
+      val arguments = right match {
+        case Parens(args) => mkNamed(args)
+        case _            => List(right)
+      }
+      if (isExpr) {
+        if (treeInfo.isLeftAssoc(op)) {
+          Apply(mkSelection(left), arguments)
+        } else {
+          val x = freshTermName()
+          Block(
+            List(ValDef(Modifiers(symtab.Flags.SYNTHETIC | symtab.Flags.ARTIFACT), x, TypeTree(), stripParens(left))),
+            Apply(mkSelection(right), List(Ident(x))))
+        }
+      } else {
+        Apply(Ident(op.encode), stripParens(left) :: arguments)
+      }
+    }
+
+    /* --------- OPERAND/OPERATOR STACK --------------------------------------- */
 
     /** Modes for infix types. */
     object InfixMode extends Enumeration {
@@ -870,7 +921,7 @@ self =>
             atPos(start, in.skipToken()) { makeFunctionTypeTree(ts, typ()) }
           else {
             ts foreach checkNotByNameOrVarargs
-            val tuple = atPos(start) { makeTupleType(ts) }
+            val tuple = atPos(start) { makeSafeTupleType(ts, start) }
             infixTypeRest(
               compoundTypeRest(
                 annotTypeRest(
@@ -937,7 +988,7 @@ self =>
       def simpleType(): Tree = {
         val start = in.offset
         simpleTypeRest(in.token match {
-          case LPAREN   => atPos(start)(makeTupleType(inParens(types())))
+          case LPAREN   => atPos(start)(makeSafeTupleType(inParens(types()), start))
           case USCORE   => wildcardType(in.skipToken())
           case _        =>
             path(thisOK = false, typeOK = true) match {
@@ -1259,7 +1310,7 @@ self =>
         atPos(start) { Apply(t3, exprsBuf.toList) }
       }
       if (inPattern) stringCheese
-      else withPlaceholders(stringCheese, isAny = true) // strinterpolator params are Any* by definition
+      else withPlaceholders(stringCheese, isAny = true) // string interpolator params are Any* by definition
     }
 
 /* ------------- NEW LINES ------------------------------------------------- */
@@ -2031,11 +2082,11 @@ self =>
     /** Drop `private` modifier when followed by a qualifier.
      *  Contract `abstract` and `override` to ABSOVERRIDE
      */
-    private def normalizeModifers(mods: Modifiers): Modifiers =
+    private def normalizeModifiers(mods: Modifiers): Modifiers =
       if (mods.isPrivate && mods.hasAccessBoundary)
-        normalizeModifers(mods &~ Flags.PRIVATE)
+        normalizeModifiers(mods &~ Flags.PRIVATE)
       else if (mods hasAllFlags (Flags.ABSTRACT | Flags.OVERRIDE))
-        normalizeModifers(mods &~ (Flags.ABSTRACT | Flags.OVERRIDE) | Flags.ABSOVERRIDE)
+        normalizeModifiers(mods &~ (Flags.ABSTRACT | Flags.OVERRIDE) | Flags.ABSOVERRIDE)
       else
         mods
 
@@ -2080,7 +2131,7 @@ self =>
      *  AccessModifier ::= (private | protected) [AccessQualifier]
      *  }}}
      */
-    def accessModifierOpt(): Modifiers = normalizeModifers {
+    def accessModifierOpt(): Modifiers = normalizeModifiers {
       in.token match {
         case m @ (PRIVATE | PROTECTED)  => in.nextToken() ; accessQualifierOpt(Modifiers(flagTokens(m)))
         case _                          => NoMods
@@ -2094,7 +2145,7 @@ self =>
      *              |  override
      *  }}}
      */
-    def modifiers(): Modifiers = normalizeModifers {
+    def modifiers(): Modifiers = normalizeModifiers {
       def loop(mods: Modifiers): Modifiers = in.token match {
         case PRIVATE | PROTECTED =>
           loop(accessQualifierOpt(addMod(mods, flagTokens(in.token), tokenRange(in))))
@@ -2680,7 +2731,10 @@ self =>
           case t if t == SUPERTYPE || t == SUBTYPE || t == COMMA || t == RBRACE || isStatSep(t) =>
             TypeDef(mods | Flags.DEFERRED, name, tparams, typeBounds())
           case _ =>
-            syntaxErrorOrIncompleteAnd("`=', `>:', or `<:' expected", skipIt = true)(EmptyTree)
+            syntaxErrorOrIncompleteAnd("`=', `>:', or `<:' expected", skipIt = true)(
+              // assume a dummy type def so as to have somewhere to stash the annotations
+              TypeDef(mods, tpnme.ERROR, Nil, EmptyTree)
+            )
         }
       }
     }
@@ -2713,7 +2767,10 @@ self =>
         case CASEOBJECT =>
           objectDef(pos, (mods | Flags.CASE) withPosition (Flags.CASE, tokenRange(in.prev /*scanner skips on 'case' to 'object', thus take prev*/)))
         case _ =>
-          syntaxErrorOrIncompleteAnd("expected start of definition", skipIt = true)(EmptyTree)
+          syntaxErrorOrIncompleteAnd("expected start of definition", skipIt = true)(
+            // assume a class definition so as to have somewhere to stash the annotations
+            atPos(pos)(gen.mkClassDef(mods, tpnme.ERROR, Nil, Template(Nil, noSelfType, Nil)))
+          )
       }
     }
 
@@ -2788,7 +2845,7 @@ self =>
      */
     def packageObjectDef(start: Offset): PackageDef = {
       val defn   = objectDef(in.offset, NoMods)
-      val pidPos = o2p(defn.pos.startOrPoint)
+      val pidPos = o2p(defn.pos.start)
       val pkgPos = r2p(start, pidPos.point)
       gen.mkPackageObject(defn, pidPos, pkgPos)
     }
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
index 92833d6..cd41c75 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
@@ -226,7 +226,7 @@ trait Scanners extends ScannersCommon {
      *  RPAREN    if region starts with '('
      *  RBRACKET  if region starts with '['
      *  RBRACE    if region starts with '{'
-     *  ARROW     if region starts with `case'
+     *  ARROW     if region starts with 'case'
      *  STRINGLIT if region is a string interpolation expression starting with '${'
      *            (the STRINGLIT appears twice in succession on the stack iff the
      *             expression is a multiline string literal).
diff --git a/src/compiler/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala b/src/compiler/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala
old mode 100755
new mode 100644
index 8cd915b..67241ef
--- a/src/compiler/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala
@@ -8,6 +8,7 @@ package ast.parser
 
 import scala.collection.{ mutable, immutable }
 import symtab.Flags.MUTABLE
+import scala.reflect.internal.util.ListOfNil
 import scala.reflect.internal.util.StringOps.splitWhere
 
 /** This class builds instance of `Tree` that represent XML.
@@ -35,6 +36,7 @@ abstract class SymbolicXMLBuilder(p: Parsers#Parser, preserveWS: Boolean) {
     val _MetaData: NameType            = "MetaData"
     val _NamespaceBinding: NameType    = "NamespaceBinding"
     val _NodeBuffer: NameType          = "NodeBuffer"
+    val _PCData: NameType              = "PCData"
     val _PrefixedAttribute: NameType   = "PrefixedAttribute"
     val _ProcInstr: NameType           = "ProcInstr"
     val _Text: NameType                = "Text"
@@ -45,6 +47,7 @@ abstract class SymbolicXMLBuilder(p: Parsers#Parser, preserveWS: Boolean) {
   private object xmlterms extends TermNames {
     val _Null: NameType     = "Null"
     val __Elem: NameType    = "Elem"
+    val _PCData: NameType   = "PCData"
     val __Text: NameType    = "Text"
     val _buf: NameType      = "$buf"
     val _md: NameType       = "$md"
@@ -54,10 +57,15 @@ abstract class SymbolicXMLBuilder(p: Parsers#Parser, preserveWS: Boolean) {
     val _xml: NameType      = "xml"
   }
 
-  import xmltypes.{_Comment, _Elem, _EntityRef, _Group, _MetaData, _NamespaceBinding, _NodeBuffer,
-    _PrefixedAttribute, _ProcInstr, _Text, _Unparsed, _UnprefixedAttribute}
+  import xmltypes.{
+    _Comment, _Elem, _EntityRef, _Group, _MetaData, _NamespaceBinding, _NodeBuffer,
+    _PCData, _PrefixedAttribute, _ProcInstr, _Text, _Unparsed, _UnprefixedAttribute
+  }
+
+  import xmlterms.{ _Null, __Elem, __Text, _buf, _md, _plus, _scope, _tmpscope, _xml }
 
-  import xmlterms.{_Null, __Elem, __Text, _buf, _md, _plus, _scope, _tmpscope, _xml}
+  /** Attachment for trees deriving from text nodes (Text, CData, entities). Used for coalescing. */
+  case class TextAttache(pos: Position, text: String)
 
   // convenience methods
   private def LL[A](x: A*): List[List[A]] = List(List(x:_*))
@@ -107,16 +115,21 @@ abstract class SymbolicXMLBuilder(p: Parsers#Parser, preserveWS: Boolean) {
   final def entityRef(pos: Position, n: String) =
     atPos(pos)( New(_scala_xml_EntityRef, LL(const(n))) )
 
+  private def coalescing = settings.XxmlSettings.isCoalescing
+
   // create scala.xml.Text here <: scala.xml.Node
   final def text(pos: Position, txt: String): Tree = atPos(pos) {
-    if (isPattern) makeTextPat(const(txt))
-    else makeText1(const(txt))
+    val t = if (isPattern) makeTextPat(const(txt)) else makeText1(const(txt))
+    if (coalescing) t updateAttachment TextAttache(pos, txt) else t
   }
 
   def makeTextPat(txt: Tree)                = Apply(_scala_xml__Text, List(txt))
   def makeText1(txt: Tree)                  = New(_scala_xml_Text, LL(txt))
   def comment(pos: Position, text: String)  = atPos(pos)( Comment(const(text)) )
-  def charData(pos: Position, txt: String)  = atPos(pos)( makeText1(const(txt)) )
+  def charData(pos: Position, txt: String)  = if (coalescing) text(pos, txt) else atPos(pos) {
+    if (isPattern) Apply(_scala_xml(xmlterms._PCData), List(const(txt)))
+    else New(_scala_xml(_PCData), LL(const(txt)))
+  }
 
   def procInstr(pos: Position, target: String, txt: String) =
     atPos(pos)( ProcInstr(const(target), const(txt)) )
diff --git a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala
index 6e5a3f6..cc9e39f 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala
@@ -43,44 +43,12 @@ abstract class TreeBuilder {
 
   def makeTupleType(elems: List[Tree]) = gen.mkTupleType(elems)
 
-  def stripParens(t: Tree) = t match {
-    case Parens(ts) => atPos(t.pos) { makeTupleTerm(ts) }
-    case _ => t
-  }
-
   def makeAnnotated(t: Tree, annot: Tree): Tree =
     atPos(annot.pos union t.pos)(Annotated(annot, t))
 
   def makeSelfDef(name: TermName, tpt: Tree): ValDef =
     ValDef(Modifiers(PRIVATE), name, tpt, EmptyTree)
 
-  /** Create tree representing (unencoded) binary operation expression or pattern. */
-  def makeBinop(isExpr: Boolean, left: Tree, op: TermName, right: Tree, opPos: Position, targs: List[Tree] = Nil): Tree = {
-    require(isExpr || targs.isEmpty || targs.exists(_.isErroneous), s"Incompatible args to makeBinop: !isExpr but targs=$targs")
-
-    def mkSelection(t: Tree) = {
-      def sel = atPos(opPos union t.pos)(Select(stripParens(t), op.encode))
-      if (targs.isEmpty) sel else atPos(left.pos)(TypeApply(sel, targs))
-    }
-    def mkNamed(args: List[Tree]) = if (isExpr) args map treeInfo.assignmentToMaybeNamedArg else args
-    val arguments = right match {
-      case Parens(args) => mkNamed(args)
-      case _            => List(right)
-    }
-    if (isExpr) {
-      if (treeInfo.isLeftAssoc(op)) {
-        Apply(mkSelection(left), arguments)
-      } else {
-        val x = freshTermName()
-        Block(
-          List(ValDef(Modifiers(SYNTHETIC | ARTIFACT), x, TypeTree(), stripParens(left))),
-          Apply(mkSelection(right), List(Ident(x))))
-      }
-    } else {
-      Apply(Ident(op.encode), stripParens(left) :: arguments)
-    }
-  }
-
   /** Tree for `od op`, start is start0 if od.pos is borked. */
   def makePostfixSelect(start0: Int, end: Int, od: Tree, op: Name): Tree = {
     val start = if (od.pos.isDefined) od.pos.start else start0
diff --git a/src/compiler/scala/tools/nsc/ast/parser/xml/Utility.scala b/src/compiler/scala/tools/nsc/ast/parser/xml/Utility.scala
old mode 100755
new mode 100644
diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
index cf52ad6..b6f9bcc 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
@@ -876,13 +876,20 @@ abstract class GenICode extends SubComponent {
                 genLoadModule(ctx, tree)
                 generatedType = toTypeKind(sym.info)
               } else {
-                try {
-                  val Some(l) = ctx.method.lookupLocal(sym)
-                  ctx.bb.emit(LOAD_LOCAL(l), tree.pos)
-                  generatedType = l.kind
-                } catch {
-                  case ex: MatchError =>
-                    abort("symbol " + sym + " does not exist in " + ctx.method)
+                ctx.method.lookupLocal(sym) match {
+                  case Some(l) =>
+                    ctx.bb.emit(LOAD_LOCAL(l), tree.pos)
+                    generatedType = l.kind
+                  case None =>
+                    val saved = settings.uniqid
+                    settings.uniqid.value = true
+                    try {
+                      val methodCode = unit.body.collect { case dd: DefDef
+                        if dd.symbol == ctx.method.symbol => showCode(dd);
+                      }.headOption.getOrElse("<unknown>")
+                      abort(s"symbol $sym does not exist in ${ctx.method}, which contains locals ${ctx.method.locals.mkString(",")}. \nMethod code: $methodCode")
+                    }
+                    finally settings.uniqid.value = saved
                 }
               }
             }
@@ -1015,7 +1022,7 @@ abstract class GenICode extends SubComponent {
         tree match {
           case Literal(Constant(null)) if generatedType == NullReference && expectedType != UNIT =>
             // literal null on the stack (as opposed to a boxed null, see SI-8233),
-            // we can bypass `adapt` which would otherwise emitt a redundant [DROP, CONSTANT(null)]
+            // we can bypass `adapt` which would otherwise emit a redundant [DROP, CONSTANT(null)]
             // except one case: when expected type is UNIT (unboxed) where we need to emit just a DROP
           case _ =>
             adapt(generatedType, expectedType, resCtx, tree.pos)
@@ -2009,7 +2016,7 @@ abstract class GenICode extends SubComponent {
        *
        *  This could result in unreachable code which has to be cleaned up later, e.g. if the try and all the exception
        *  handlers always end in RETURN then there will be no "normal" flow out of the try/catch/finally.
-       *  Later reachability analysis will remove unreacahble code.
+       *  Later reachability analysis will remove unreachable code.
        */
       def Try(body: Context => Context,
               handlers: List[(Symbol, TypeKind, Context => Context)],
@@ -2053,7 +2060,7 @@ abstract class GenICode extends SubComponent {
         if (settings.YdisableUnreachablePrevention || !outerCtx.bb.ignore) {
           if (finalizer != EmptyTree) {
             val exh = outerCtx.newExceptionHandler(NoSymbol, finalizer.pos) // finalizer covers exception handlers
-            this.addActiveHandler(exh)  // .. and body aswell
+            this.addActiveHandler(exh)  // .. and body as well
             val exhStartCtx = finalizerCtx.enterExceptionHandler(exh)
             exhStartCtx.bb killIf outerCtx.bb.ignore
             val exception = exhStartCtx.makeLocal(finalizer.pos, ThrowableTpe, "exc")
@@ -2101,7 +2108,7 @@ abstract class GenICode extends SubComponent {
     /**
      * Represent a label in the current method code. In order
      * to support forward jumps, labels can be created without
-     * having a deisgnated target block. They can later be attached
+     * having a designated target block. They can later be attached
      * by calling `anchor`.
      */
     class Label(val symbol: Symbol) {
diff --git a/src/compiler/scala/tools/nsc/backend/icode/ICodeCheckers.scala b/src/compiler/scala/tools/nsc/backend/icode/ICodeCheckers.scala
index 0cdf629..0f17b5d 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/ICodeCheckers.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/ICodeCheckers.scala
@@ -20,7 +20,7 @@ abstract class ICodeCheckers {
    *  </p>
    *  <ul>
    *    <li>
-   *      for primitive operations: the type and numer of operands match
+   *      for primitive operations: the type and number of operands match
    *      the type of the operation
    *    </li>
    *    <li>
@@ -109,7 +109,7 @@ abstract class ICodeCheckers {
 
     /** Only called when m1 < m2, so already known that (m1 ne m2).
      */
-    private def isConfict(m1: IMember, m2: IMember, canOverload: Boolean) = (
+    private def isConflict(m1: IMember, m2: IMember, canOverload: Boolean) = (
       (m1.symbol.name == m2.symbol.name) &&
       (!canOverload || (m1.symbol.tpe =:= m2.symbol.tpe))
     )
@@ -119,11 +119,11 @@ abstract class ICodeCheckers {
       clasz = cls
 
       for (f1 <- cls.fields ; f2 <- cls.fields ; if f1 < f2)
-        if (isConfict(f1, f2, canOverload = false))
+        if (isConflict(f1, f2, canOverload = false))
           icodeError("Repetitive field name: " + f1.symbol.fullName)
 
       for (m1 <- cls.methods ; m2 <- cls.methods ; if m1 < m2)
-        if (isConfict(m1, m2, canOverload = true))
+        if (isConflict(m1, m2, canOverload = true))
           icodeError("Repetitive method: " + m1.symbol.fullName)
 
       clasz.methods foreach check
@@ -471,7 +471,7 @@ abstract class ICodeCheckers {
            pushStack(local.kind)
 
          case LOAD_FIELD(field, isStatic) =>
-           // the symbol's owner should contain it's field, but
+           // the symbol's owner should contain its field, but
            // this is already checked by the type checker, no need
            // to redo that here
            if (isStatic) ()
diff --git a/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala b/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala
index 076f84c..351a8e3 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala
@@ -86,7 +86,7 @@ trait Opcodes { self: ICodes =>
    *  Each case subclass will represent a specific operation.
    */
   abstract class Instruction extends Cloneable {
-    // Vlad: I used these for checking the quality of the implementation, and we should regularely run a build with them
+    // Vlad: I used these for checking the quality of the implementation, and we should regularly run a build with them
     // enabled. But for production these should definitely be disabled, unless we enjoy getting angry emails from Greg :)
     //if (!this.isInstanceOf[opcodes.LOAD_EXCEPTION])
     //  assert(consumed == consumedTypes.length)
diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala
index b0ad5bd..64c9901 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala
@@ -387,7 +387,7 @@ abstract class TypeFlowAnalysis {
 
       Moreover, it's often the case that the last CALL_METHOD of interest ("of interest" equates to "being tracked in `isOnWatchlist`) isn't the last instruction on the block.
       There are cases where the typeflows computed past this `lastInstruction` are needed, and cases when they aren't.
-      The reasoning behind this decsision is described in `populatePerimeter()`. All `blockTransfer()` needs to do (in order to know at which instruction it can stop)
+      The reasoning behind this decision is described in `populatePerimeter()`. All `blockTransfer()` needs to do (in order to know at which instruction it can stop)
       is querying `isOnPerimeter`.
 
       Upon visiting a CALL_METHOD that's an inlining candidate, the relevant pieces of information about the pre-instruction typestack are collected for future use.
@@ -572,7 +572,7 @@ abstract class TypeFlowAnalysis {
 
         - `inlined` : These blocks were spliced into the method's CFG as part of inlining. Being new blocks, they haven't been visited yet by the typeflow analysis.
 
-        - `staleIn` : These blocks are what `doInline()` calls `afterBlock`s, ie the new home for instructions that previously appearead
+        - `staleIn` : These blocks are what `doInline()` calls `afterBlock`s, ie the new home for instructions that previously appeared
                       after a callsite in a `staleOut` block.
 
       Based on the above information, we have to bring up-to-date the caches that `forwardAnalysis` and `blockTransfer` use to skip blocks and instructions.
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/AsmUtils.scala b/src/compiler/scala/tools/nsc/backend/jvm/AsmUtils.scala
index 75aa0fc..cd7e0b8 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/AsmUtils.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/AsmUtils.scala
@@ -7,9 +7,11 @@ package scala.tools.nsc.backend.jvm
 
 import scala.tools.asm.tree.{InsnList, AbstractInsnNode, ClassNode, MethodNode}
 import java.io.{StringWriter, PrintWriter}
-import scala.tools.asm.util.{TraceClassVisitor, TraceMethodVisitor, Textifier}
-import scala.tools.asm.ClassReader
+import scala.tools.asm.util.{CheckClassAdapter, TraceClassVisitor, TraceMethodVisitor, Textifier}
+import scala.tools.asm.{ClassWriter, Attribute, ClassReader}
 import scala.collection.convert.decorateAsScala._
+import scala.tools.nsc.backend.jvm.analysis.InitialProducer
+import scala.tools.nsc.backend.jvm.opt.InlineInfoAttributePrototype
 
 object AsmUtils {
 
@@ -49,7 +51,7 @@ object AsmUtils {
 
   def readClass(bytes: Array[Byte]): ClassNode = {
     val node = new ClassNode()
-    new ClassReader(bytes).accept(node, 0)
+    new ClassReader(bytes).accept(node, Array[Attribute](InlineInfoAttributePrototype), 0)
     node
   }
 
@@ -80,13 +82,16 @@ object AsmUtils {
   /**
    * Returns a human-readable representation of the given instruction.
    */
-  def textify(insn: AbstractInsnNode): String = {
-    val trace = new TraceMethodVisitor(new Textifier)
-    insn.accept(trace)
-    val sw = new StringWriter
-    val pw = new PrintWriter(sw)
-    trace.p.print(pw)
-    sw.toString.trim
+  def textify(insn: AbstractInsnNode): String = insn match {
+    case _: InitialProducer =>
+      insn.toString
+    case _ =>
+      val trace = new TraceMethodVisitor(new Textifier)
+      insn.accept(trace)
+      val sw = new StringWriter
+      val pw = new PrintWriter(sw)
+      trace.p.print(pw)
+      sw.toString.trim
   }
 
   /**
@@ -105,4 +110,18 @@ object AsmUtils {
    * Returns a human-readable representation of the given instruction sequence.
    */
   def textify(insns: InsnList): String = textify(insns.iterator().asScala)
+
+  /**
+   * Run ASM's CheckClassAdapter over a class. Returns None if no problem is found, otherwise
+   * Some(msg) with the verifier's error message.
+   */
+  def checkClass(classNode: ClassNode): Option[String] = {
+    val cw = new ClassWriter(ClassWriter.COMPUTE_MAXS)
+    classNode.accept(cw)
+    val sw = new StringWriter()
+    val pw = new PrintWriter(sw)
+    CheckClassAdapter.verify(new ClassReader(cw.toByteArray), false, pw)
+    val res = sw.toString
+    if (res.isEmpty) None else Some(res)
+  }
 }
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeAsmCommon.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeAsmCommon.scala
index 2782701..93f5159 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeAsmCommon.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeAsmCommon.scala
@@ -3,9 +3,13 @@
  * @author  Martin Odersky
  */
 
-package scala.tools.nsc.backend.jvm
+package scala.tools.nsc
+package backend.jvm
 
 import scala.tools.nsc.Global
+import scala.tools.nsc.backend.jvm.BTypes.{InternalName, MethodInlineInfo, InlineInfo}
+import BackendReporting.ClassSymbolInfoFailureSI9111
+import scala.tools.asm
 
 /**
  * This trait contains code shared between GenBCode and GenASM that depends on types defined in
@@ -226,6 +230,47 @@ final class BCodeAsmCommon[G <: Global](val global: G) {
   }
 
   /**
+   * Reconstruct the classfile flags from a Java defined class symbol.
+   *
+   * The implementation of this method is slightly different that `javaFlags` in BTypesFromSymbols.
+   * The javaFlags method is primarily used to map Scala symbol flags to sensible classfile flags
+   * that are used in the generated classfiles. For example, all classes emitted by the Scala
+   * compiler have ACC_PUBLIC.
+   *
+   * When building a [[ClassBType]] from a Java class symbol, the flags in the type's `info` have
+   * to correspond exactly to the flags in the classfile. For example, if the class is package
+   * protected (i.e., it doesn't have the ACC_PUBLIC flag), this needs to be reflected in the
+   * ClassBType. For example, the inliner needs the correct flags for access checks.
+   *
+   * Class flags are listed here:
+   *   https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1-200-E.1
+   */
+  def javaClassfileFlags(classSym: Symbol): Int = {
+    assert(classSym.isJava, s"Expected Java class symbol, got ${classSym.fullName}")
+    import asm.Opcodes._
+    def enumFlags = ACC_ENUM | {
+      // Java enums have the `ACC_ABSTRACT` flag if they have a deferred method.
+      // We cannot trust `hasAbstractFlag`: the ClassfileParser adds `ABSTRACT` and `SEALED` to all
+      // Java enums for exhaustiveness checking.
+      val hasAbstractMethod = classSym.info.decls.exists(s => s.isMethod && s.isDeferred)
+      if (hasAbstractMethod) ACC_ABSTRACT else 0
+    }
+    GenBCode.mkFlags(
+      // SI-9393: the classfile / java source parser make java annotation symbols look like classes.
+      // here we recover the actual classfile flags.
+      if (classSym.hasJavaAnnotationFlag)                        ACC_ANNOTATION | ACC_INTERFACE | ACC_ABSTRACT else 0,
+      if (classSym.isPublic)                                     ACC_PUBLIC    else 0,
+      if (classSym.isFinal)                                      ACC_FINAL     else 0,
+      // see the link above. javac does the same: ACC_SUPER for all classes, but not interfaces.
+      if (classSym.isInterface)                                  ACC_INTERFACE else ACC_SUPER,
+      // for Java enums, we cannot trust `hasAbstractFlag` (see comment in enumFlags)
+      if (!classSym.hasJavaEnumFlag && classSym.hasAbstractFlag) ACC_ABSTRACT  else 0,
+      if (classSym.isArtifact)                                   ACC_SYNTHETIC else 0,
+      if (classSym.hasJavaEnumFlag)                              enumFlags     else 0
+    )
+  }
+
+  /**
    * The member classes of a class symbol. Note that the result of this method depends on the
    * current phase, for example, after lambdalift, all local classes become member of the enclosing
    * class.
@@ -247,7 +292,7 @@ final class BCodeAsmCommon[G <: Global](val global: G) {
   lazy val AnnotationRetentionPolicyRuntimeValue = AnnotationRetentionPolicyModule.tpe.member(TermName("RUNTIME"))
 
   /** Whether an annotation should be emitted as a Java annotation
-    * .initialize: if 'annot' is read from pickle, atp might be un-initialized
+    * .initialize: if 'annot' is read from pickle, atp might be uninitialized
     */
   def shouldEmitAnnotation(annot: AnnotationInfo) = {
     annot.symbol.initialize.isJavaDefined &&
@@ -268,10 +313,10 @@ final class BCodeAsmCommon[G <: Global](val global: G) {
   }
 
   private def retentionPolicyOf(annot: AnnotationInfo): Symbol =
-    annot.atp.typeSymbol.getAnnotation(AnnotationRetentionAttr).map(_.assocs).map(assoc =>
+    annot.atp.typeSymbol.getAnnotation(AnnotationRetentionAttr).map(_.assocs).flatMap(assoc =>
       assoc.collectFirst {
         case (`nme`.value, LiteralAnnotArg(Constant(value: Symbol))) => value
-      }).flatten.getOrElse(AnnotationRetentionPolicyClassValue)
+      }).getOrElse(AnnotationRetentionPolicyClassValue)
 
   def implementedInterfaces(classSym: Symbol): List[Symbol] = {
     // Additional interface parents based on annotations and other cues
@@ -280,9 +325,18 @@ final class BCodeAsmCommon[G <: Global](val global: G) {
       case _          => None
     }
 
-    def isInterfaceOrTrait(sym: Symbol) = sym.isInterface || sym.isTrait
+    // SI-9393: java annotations are interfaces, but the classfile / java source parsers make them look like classes.
+    def isInterfaceOrTrait(sym: Symbol) = sym.isInterface || sym.isTrait || sym.hasJavaAnnotationFlag
+
+    val classParents = {
+      val parents = classSym.info.parents
+      // SI-9393: the classfile / java source parsers add Annotation and ClassfileAnnotation to the
+      // parents of a java annotations. undo this for the backend (where we need classfile-level information).
+      if (classSym.hasJavaAnnotationFlag) parents.filterNot(c => c.typeSymbol == ClassfileAnnotationClass || c.typeSymbol == AnnotationClass)
+      else parents
+    }
 
-    val allParents = classSym.info.parents ++ classSym.annotations.flatMap(newParentForAnnotation)
+    val allParents = classParents ++ classSym.annotations.flatMap(newParentForAnnotation)
 
     // We keep the superClass when computing minimizeParents to eliminate more interfaces.
     // Example: T can be eliminated from D
@@ -300,4 +354,112 @@ final class BCodeAsmCommon[G <: Global](val global: G) {
     }
     interfaces.map(_.typeSymbol)
   }
+
+  /**
+   * This is a hack to work around SI-9111. The completer of `methodSym` may report type errors. We
+   * cannot change the typer context of the completer at this point and make it silent: the context
+   * captured when creating the completer in the namer. However, we can temporarily replace
+   * global.reporter (it's a var) to store errors.
+   */
+  def completeSilentlyAndCheckErroneous(sym: Symbol): Boolean = {
+    if (sym.hasCompleteInfo) false
+    else {
+      val originalReporter = global.reporter
+      val storeReporter = new reporters.StoreReporter()
+      global.reporter = storeReporter
+      try {
+        sym.info
+      } finally {
+        global.reporter = originalReporter
+      }
+      sym.isErroneous
+    }
+  }
+
+  /**
+   * Build the [[InlineInfo]] for a class symbol.
+   */
+  def buildInlineInfoFromClassSymbol(classSym: Symbol, classSymToInternalName: Symbol => InternalName, methodSymToDescriptor: Symbol => String): InlineInfo = {
+    val traitSelfType = if (classSym.isTrait && !classSym.isImplClass) {
+      // The mixin phase uses typeOfThis for the self parameter in implementation class methods.
+      val selfSym = classSym.typeOfThis.typeSymbol
+      if (selfSym != classSym) Some(classSymToInternalName(selfSym)) else None
+    } else {
+      None
+    }
+
+    val isEffectivelyFinal = classSym.isEffectivelyFinal
+
+    var warning = Option.empty[ClassSymbolInfoFailureSI9111]
+
+    // Primitive methods cannot be inlined, so there's no point in building a MethodInlineInfo. Also, some
+    // primitive methods (e.g., `isInstanceOf`) have non-erased types, which confuses [[typeToBType]].
+    val methodInlineInfos = classSym.info.decls.iterator.filter(m => m.isMethod && !scalaPrimitives.isPrimitive(m)).flatMap({
+      case methodSym =>
+        if (completeSilentlyAndCheckErroneous(methodSym)) {
+          // Happens due to SI-9111. Just don't provide any MethodInlineInfo for that method, we don't need fail the compiler.
+          if (!classSym.isJavaDefined) devWarning("SI-9111 should only be possible for Java classes")
+          warning = Some(ClassSymbolInfoFailureSI9111(classSym.fullName))
+          None
+        } else {
+          val name      = methodSym.javaSimpleName.toString // same as in genDefDef
+          val signature = name + methodSymToDescriptor(methodSym)
+
+          // Some detours are required here because of changing flags (lateDEFERRED, lateMODULE):
+          // 1. Why the phase travel? Concrete trait methods obtain the lateDEFERRED flag in Mixin.
+          //    This makes isEffectivelyFinalOrNotOverridden false, which would prevent non-final
+          //    but non-overridden methods of sealed traits from being inlined.
+          // 2. Why the special case for `classSym.isImplClass`? Impl class symbols obtain the
+          //    lateMODULE flag during Mixin. During the phase travel to exitingPickler, the late
+          //    flag is ignored. The members are therefore not isEffectivelyFinal (their owner
+          //    is not a module). Since we know that all impl class members are static, we can
+          //    just take the shortcut.
+          val effectivelyFinal = classSym.isImplClass || exitingPickler(methodSym.isEffectivelyFinalOrNotOverridden)
+
+          // Identify trait interface methods that have a static implementation in the implementation
+          // class. Invocations of these methods can be re-wrired directly to the static implementation
+          // if they are final or the receiver is known.
+          //
+          // Using `erasure.needsImplMethod` is not enough: it keeps field accessors, module getters
+          // and super accessors. When AddInterfaces creates the impl class, these methods are
+          // initially added to it.
+          //
+          // The mixin phase later on filters out most of these members from the impl class (see
+          // Mixin.isImplementedStatically). However, accessors for concrete lazy vals remain in the
+          // impl class after mixin. So the filter in mixin is not exactly what we need here (we
+          // want to identify concrete trait methods, not any accessors). So we check some symbol
+          // properties manually.
+          val traitMethodWithStaticImplementation = {
+            import symtab.Flags._
+            classSym.isTrait && !classSym.isImplClass &&
+              erasure.needsImplMethod(methodSym) &&
+              !methodSym.isModule &&
+              !(methodSym hasFlag (ACCESSOR | SUPERACCESSOR))
+          }
+
+          val info = MethodInlineInfo(
+            effectivelyFinal                    = effectivelyFinal,
+            traitMethodWithStaticImplementation = traitMethodWithStaticImplementation,
+            annotatedInline                     = methodSym.hasAnnotation(ScalaInlineClass),
+            annotatedNoInline                   = methodSym.hasAnnotation(ScalaNoInlineClass)
+          )
+          Some((signature, info))
+        }
+    }).toMap
+
+    InlineInfo(traitSelfType, isEffectivelyFinal, methodInlineInfos, warning)
+  }
+}
+
+object BCodeAsmCommon {
+  /**
+   * Valid flags for InnerClass attribute entry.
+   * See http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.6
+   */
+  val INNER_CLASSES_FLAGS = {
+    asm.Opcodes.ACC_PUBLIC   | asm.Opcodes.ACC_PRIVATE   | asm.Opcodes.ACC_PROTECTED  |
+      asm.Opcodes.ACC_STATIC   | asm.Opcodes.ACC_FINAL     | asm.Opcodes.ACC_INTERFACE  |
+      asm.Opcodes.ACC_ABSTRACT | asm.Opcodes.ACC_SYNTHETIC | asm.Opcodes.ACC_ANNOTATION |
+      asm.Opcodes.ACC_ENUM
+  }
 }
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala
index 062daa4..416628d 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala
@@ -10,8 +10,11 @@ package backend
 package jvm
 
 import scala.annotation.switch
+import scala.reflect.internal.Flags
 
 import scala.tools.asm
+import GenBCode._
+import BackendReporting._
 
 /*
  *
@@ -30,7 +33,6 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
    * Functionality to build the body of ASM MethodNode, except for `synchronized` and `try` expressions.
    */
   abstract class PlainBodyBuilder(cunit: CompilationUnit) extends PlainSkelBuilder(cunit) {
-
     import icodes.TestOp
     import icodes.opcodes.InvokeStyle
 
@@ -90,9 +92,9 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
 
     def genThrow(expr: Tree): BType = {
       val thrownKind = tpeTK(expr)
-      // `throw null` is valid although scala.Null (as defined in src/libray-aux) isn't a subtype of Throwable.
-      // Similarly for scala.Nothing (again, as defined in src/libray-aux).
-      assert(thrownKind.isNullType || thrownKind.isNothingType || thrownKind.asClassBType.isSubtypeOf(ThrowableReference))
+      // `throw null` is valid although scala.Null (as defined in src/library-aux) isn't a subtype of Throwable.
+      // Similarly for scala.Nothing (again, as defined in src/library-aux).
+      assert(thrownKind.isNullType || thrownKind.isNothingType || thrownKind.asClassBType.isSubtypeOf(ThrowableReference).get)
       genLoad(expr, thrownKind)
       lineNumber(expr)
       emit(asm.Opcodes.ATHROW) // ICode enters here into enterIgnoreMode, we'll rely instead on DCE at ClassNode level.
@@ -229,7 +231,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
 
       if (isArithmeticOp(code))                genArithmeticOp(tree, code)
       else if (code == scalaPrimitives.CONCAT) genStringConcat(tree)
-      else if (code == scalaPrimitives.HASH)   genScalaHash(receiver)
+      else if (code == scalaPrimitives.HASH)   genScalaHash(receiver, tree.pos)
       else if (isArrayOp(code))                genArrayOp(tree, code, expectedType)
       else if (isLogicalOp(code) || isComparisonOp(code)) {
         val success, failure, after = new asm.Label
@@ -583,7 +585,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
           // if (fun.symbol.isConstructor) Static(true) else SuperCall(mix);
           mnode.visitVarInsn(asm.Opcodes.ALOAD, 0)
           genLoadArguments(args, paramTKs(app))
-          genCallMethod(fun.symbol, invokeStyle, pos = app.pos)
+          genCallMethod(fun.symbol, invokeStyle, app.pos)
           generatedType = asmMethodType(fun.symbol).returnType
 
         // 'new' constructor call: Note: since constructors are
@@ -613,7 +615,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
                  */
                 for (i <- args.length until dims) elemKind = ArrayBType(elemKind)
               }
-              (argsSize : @switch) match {
+              argsSize match {
                 case 1 => bc newarray elemKind
                 case _ =>
                   val descr = ('[' * argsSize) + elemKind.descriptor // denotes the same as: arrayN(elemKind, argsSize).descriptor
@@ -625,17 +627,22 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
               mnode.visitTypeInsn(asm.Opcodes.NEW, rt.internalName)
               bc dup generatedType
               genLoadArguments(args, paramTKs(app))
-              genCallMethod(ctor, icodes.opcodes.Static(onInstance = true))
+              genCallMethod(ctor, icodes.opcodes.Static(onInstance = true), app.pos)
 
             case _ =>
               abort(s"Cannot instantiate $tpt of kind: $generatedType")
           }
+        case Apply(fun, args) if app.hasAttachment[delambdafy.LambdaMetaFactoryCapable] =>
+          val attachment = app.attachments.get[delambdafy.LambdaMetaFactoryCapable].get
+          genLoadArguments(args, paramTKs(app))
+          genInvokeDynamicLambda(attachment.target, attachment.arity, attachment.functionalInterface)
+          generatedType = asmMethodType(fun.symbol).returnType
 
         case Apply(fun @ _, List(expr)) if currentRun.runDefinitions.isBox(fun.symbol) =>
           val nativeKind = tpeTK(expr)
           genLoad(expr, nativeKind)
           val MethodNameAndType(mname, methodType) = asmBoxTo(nativeKind)
-          bc.invokestatic(BoxesRunTime.internalName, mname, methodType.descriptor)
+          bc.invokestatic(BoxesRunTime.internalName, mname, methodType.descriptor, app.pos)
           generatedType = boxResultType(fun.symbol) // was toTypeKind(fun.symbol.tpe.resultType)
 
         case Apply(fun @ _, List(expr)) if currentRun.runDefinitions.isUnbox(fun.symbol) =>
@@ -643,7 +650,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
           val boxType = unboxResultType(fun.symbol) // was toTypeKind(fun.symbol.owner.linkedClassOfClass.tpe)
           generatedType = boxType
           val MethodNameAndType(mname, methodType) = asmUnboxTo(boxType)
-          bc.invokestatic(BoxesRunTime.internalName, mname, methodType.descriptor)
+          bc.invokestatic(BoxesRunTime.internalName, mname, methodType.descriptor, app.pos)
 
         case app @ Apply(fun, args) =>
           val sym = fun.symbol
@@ -694,10 +701,10 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
                 // descriptor (instead of a class internal name):
                 //   invokevirtual  #2; //Method "[I".clone:()Ljava/lang/Object
                 val target: String = targetTypeKind.asRefBType.classOrArrayType
-                bc.invokevirtual(target, "clone", "()Ljava/lang/Object;")
+                bc.invokevirtual(target, "clone", "()Ljava/lang/Object;", app.pos)
               }
               else {
-                genCallMethod(sym, invokeStyle, hostClass, app.pos)
+                genCallMethod(sym, invokeStyle, app.pos, hostClass)
               }
 
             } // end of genNormalMethodCall()
@@ -809,7 +816,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
     }
 
     def adapt(from: BType, to: BType) {
-      if (!from.conformsTo(to)) {
+      if (!from.conformsTo(to).get) {
         to match {
           case UNIT => bc drop from
           case _    => bc.emitT2T(from, to)
@@ -975,23 +982,23 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
         // Optimization for expressions of the form "" + x.  We can avoid the StringBuilder.
         case List(Literal(Constant("")), arg) =>
           genLoad(arg, ObjectReference)
-          genCallMethod(String_valueOf, icodes.opcodes.Static(onInstance = false))
+          genCallMethod(String_valueOf, icodes.opcodes.Static(onInstance = false), arg.pos)
 
         case concatenations =>
-          bc.genStartConcat
+          bc.genStartConcat(tree.pos)
           for (elem <- concatenations) {
             val kind = tpeTK(elem)
             genLoad(elem, kind)
-            bc.genStringConcat(kind)
+            bc.genStringConcat(kind, elem.pos)
           }
-          bc.genEndConcat
+          bc.genEndConcat(tree.pos)
 
       }
 
       StringReference
     }
 
-    def genCallMethod(method: Symbol, style: InvokeStyle, hostClass0: Symbol = null, pos: Position = NoPosition) {
+    def genCallMethod(method: Symbol, style: InvokeStyle, pos: Position, hostClass0: Symbol = null) {
 
       val siteSymbol = claszSymbol
       val hostSymbol = if (hostClass0 == null) method.owner else hostClass0
@@ -1035,26 +1042,26 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
       }
 
       if (style.isStatic) {
-        if (style.hasInstance) { bc.invokespecial  (jowner, jname, mdescr) }
-        else                   { bc.invokestatic   (jowner, jname, mdescr) }
+        if (style.hasInstance) { bc.invokespecial  (jowner, jname, mdescr, pos) }
+        else                   { bc.invokestatic   (jowner, jname, mdescr, pos) }
       }
       else if (style.isDynamic) {
-        if (needsInterfaceCall(receiver)) { bc.invokeinterface(jowner, jname, mdescr) }
-        else                              { bc.invokevirtual  (jowner, jname, mdescr) }
+        if (needsInterfaceCall(receiver)) { bc.invokeinterface(jowner, jname, mdescr, pos) }
+        else                              { bc.invokevirtual  (jowner, jname, mdescr, pos) }
       }
       else {
         assert(style.isSuper, s"An unknown InvokeStyle: $style")
-        bc.invokespecial(jowner, jname, mdescr)
+        bc.invokespecial(jowner, jname, mdescr, pos)
         initModule()
       }
 
     } // end of genCallMethod()
 
     /* Generate the scala ## method. */
-    def genScalaHash(tree: Tree): BType = {
+    def genScalaHash(tree: Tree, applyPos: Position): BType = {
       genLoadModule(ScalaRunTimeModule) // TODO why load ScalaRunTimeModule if ## has InvokeStyle of Static(false) ?
       genLoad(tree, ObjectReference)
-      genCallMethod(hashMethodSym, icodes.opcodes.Static(onInstance = false))
+      genCallMethod(hashMethodSym, icodes.opcodes.Static(onInstance = false), applyPos)
 
       INT
     }
@@ -1186,8 +1193,8 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
               // TODO !!!!!!!!!! isReferenceType, in the sense of TypeKind? (ie non-array, non-boxed, non-nothing, may be null)
               if (scalaPrimitives.isUniversalEqualityOp(code) && tpeTK(lhs).isClass) {
                 // `lhs` has reference type
-                if (code == EQ) genEqEqPrimitive(lhs, rhs, success, failure)
-                else            genEqEqPrimitive(lhs, rhs, failure, success)
+                if (code == EQ) genEqEqPrimitive(lhs, rhs, success, failure, tree.pos)
+                else            genEqEqPrimitive(lhs, rhs, failure, success, tree.pos)
               }
               else if (scalaPrimitives.isComparisonOp(code))
                 genComparisonOp(lhs, rhs, code)
@@ -1207,7 +1214,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
      * @param l       left-hand-side  of the '=='
      * @param r       right-hand-side of the '=='
      */
-    def genEqEqPrimitive(l: Tree, r: Tree, success: asm.Label, failure: asm.Label) {
+    def genEqEqPrimitive(l: Tree, r: Tree, success: asm.Label, failure: asm.Label, pos: Position) {
 
       /* True if the equality comparison is between values that require the use of the rich equality
        * comparator (scala.runtime.Comparator.equals). This is the case when either side of the
@@ -1231,7 +1238,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
         }
         genLoad(l, ObjectReference)
         genLoad(r, ObjectReference)
-        genCallMethod(equalsMethod, icodes.opcodes.Static(onInstance = false))
+        genCallMethod(equalsMethod, icodes.opcodes.Static(onInstance = false), pos)
         genCZJUMP(success, failure, icodes.NE, BOOL)
       }
       else {
@@ -1247,7 +1254,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
           // SI-7852 Avoid null check if L is statically non-null.
           genLoad(l, ObjectReference)
           genLoad(r, ObjectReference)
-          genCallMethod(Object_equals, icodes.opcodes.Dynamic)
+          genCallMethod(Object_equals, icodes.opcodes.Dynamic, pos)
           genCZJUMP(success, failure, icodes.NE, BOOL)
         } else {
           // l == r -> if (l eq null) r eq null else l.equals(r)
@@ -1268,7 +1275,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
 
           markProgramPoint(lNonNull)
           locals.load(eqEqTempLocal)
-          genCallMethod(Object_equals, icodes.opcodes.Dynamic)
+          genCallMethod(Object_equals, icodes.opcodes.Dynamic, pos)
           genCZJUMP(success, failure, icodes.NE, BOOL)
         }
       }
@@ -1278,6 +1285,44 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
     def genSynchronized(tree: Apply, expectedType: BType): BType
     def genLoadTry(tree: Try): BType
 
+    def genInvokeDynamicLambda(lambdaTarget: Symbol, arity: Int, functionalInterface: Symbol) {
+      val isStaticMethod = lambdaTarget.hasFlag(Flags.STATIC)
+      def asmType(sym: Symbol) = classBTypeFromSymbol(sym).toASMType
+
+      val implMethodHandle =
+        new asm.Handle(if (lambdaTarget.hasFlag(Flags.STATIC)) asm.Opcodes.H_INVOKESTATIC else asm.Opcodes.H_INVOKEVIRTUAL,
+          classBTypeFromSymbol(lambdaTarget.owner).internalName,
+          lambdaTarget.name.toString,
+          asmMethodType(lambdaTarget).descriptor)
+      val receiver = if (isStaticMethod) Nil else lambdaTarget.owner :: Nil
+      val (capturedParams, lambdaParams) = lambdaTarget.paramss.head.splitAt(lambdaTarget.paramss.head.length - arity)
+      // Requires https://github.com/scala/scala-java8-compat on the runtime classpath
+      val invokedType = asm.Type.getMethodDescriptor(asmType(functionalInterface), (receiver ::: capturedParams).map(sym => toTypeKind(sym.info).toASMType): _*)
+
+      val constrainedType = new MethodBType(lambdaParams.map(p => toTypeKind(p.tpe)), toTypeKind(lambdaTarget.tpe.resultType)).toASMType
+      val sam = functionalInterface.info.decls.find(_.isDeferred).getOrElse(functionalInterface.info.member(nme.apply))
+      val samName = sam.name.toString
+      val samMethodType = asmMethodType(sam).toASMType
+
+      val flags = 3 // TODO 2.12.x Replace with LambdaMetafactory.FLAG_SERIALIZABLE | LambdaMetafactory.FLAG_MARKERS
+
+      val ScalaSerializable = classBTypeFromSymbol(definitions.SerializableClass).toASMType
+      bc.jmethod.visitInvokeDynamicInsn(samName, invokedType, lambdaMetaFactoryBootstrapHandle,
+        /* samMethodType          = */ samMethodType,
+        /* implMethod             = */ implMethodHandle,
+        /* instantiatedMethodType = */ constrainedType,
+        /* flags                  = */ flags.asInstanceOf[AnyRef],
+        /* markerInterfaceCount   = */ 1.asInstanceOf[AnyRef],
+        /* markerInterfaces[0]    = */ ScalaSerializable,
+        /* bridgeCount            = */ 0.asInstanceOf[AnyRef]
+      )
+      indyLambdaHosts += this.claszSymbol
+    }
   }
 
+  lazy val lambdaMetaFactoryBootstrapHandle =
+    new asm.Handle(asm.Opcodes.H_INVOKESTATIC,
+      definitions.LambdaMetaFactory.fullName('/'), sn.AltMetafactory.toString,
+      "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;")
+
 }
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala
index ccee230..1b97681 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala
@@ -10,6 +10,8 @@ package backend.jvm
 import scala.tools.asm
 import scala.collection.mutable
 import scala.tools.nsc.io.AbstractFile
+import GenBCode._
+import BackendReporting._
 
 /*
  *  Traits encapsulating functionality to convert Scala AST Trees into ASM ClassNodes.
@@ -33,15 +35,14 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
   /*
    * must-single-thread
    */
-  def getOutFolder(csym: Symbol, cName: String, cunit: CompilationUnit): _root_.scala.tools.nsc.io.AbstractFile = {
-    try {
+  def getOutFolder(csym: Symbol, cName: String, cunit: CompilationUnit): _root_.scala.tools.nsc.io.AbstractFile =
+    _root_.scala.util.Try {
       outputDirectory(csym)
-    } catch {
+    }.recover {
       case ex: Throwable =>
         reporter.error(cunit.body.pos, s"Couldn't create file for class $cName\n${ex.getMessage}")
         null
-    }
-  }
+    }.get
 
   var pickledBytes = 0 // statistics
 
@@ -66,7 +67,7 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
     override def getCommonSuperClass(inameA: String, inameB: String): String = {
       val a = classBTypeFromInternalName(inameA)
       val b = classBTypeFromInternalName(inameB)
-      val lub = a.jvmWiseLUB(b)
+      val lub = a.jvmWiseLUB(b).get
       val lubName = lub.internalName
       assert(lubName != "scala/Any")
       lubName // ASM caches the answer during the lifetime of a ClassWriter. We outlive that. Not sure whether caching on our side would improve things.
@@ -204,12 +205,12 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
    * can-multi-thread
    */
   final def addInnerClassesASM(jclass: asm.ClassVisitor, refedInnerClasses: List[ClassBType]) {
-    val allNestedClasses = refedInnerClasses.flatMap(_.enclosingNestedClassesChain).distinct
+    val allNestedClasses = refedInnerClasses.flatMap(_.enclosingNestedClassesChain.get).distinct
 
     // sorting ensures nested classes are listed after their enclosing class thus satisfying the Eclipse Java compiler
     for (nestedClass <- allNestedClasses.sortBy(_.internalName.toString)) {
       // Extract the innerClassEntry - we know it exists, enclosingNestedClassesChain only returns nested classes.
-      val Some(e) = nestedClass.innerClassAttributeEntry
+      val Some(e) = nestedClass.innerClassAttributeEntry.get
       jclass.visitInnerClass(e.name, e.outerName, e.innerName, e.flags)
     }
   }
@@ -327,129 +328,47 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
       // If the `sym` is a java module class, we use the java class instead. This ensures that we
       // register the class (instead of the module class) in innerClassBufferASM.
       // The two symbols have the same name, so the resulting internalName is the same.
-      val classSym = if (sym.isJavaDefined && sym.isModuleClass) sym.linkedClassOfClass else sym
+      // Phase travel (exitingPickler) required for SI-6613 - linkedCoC is only reliable in early phases (nesting)
+      val classSym = if (sym.isJavaDefined && sym.isModuleClass) exitingPickler(sym.linkedClassOfClass) else sym
       getClassBTypeAndRegisterInnerClass(classSym).internalName
     }
 
-    private def assertClassNotArray(sym: Symbol): Unit = {
-      assert(sym.isClass, sym)
-      assert(sym != definitions.ArrayClass || isCompilingArray, sym)
-    }
-
-    private def assertClassNotArrayNotPrimitive(sym: Symbol): Unit = {
-      assertClassNotArray(sym)
-      assert(!primitiveTypeMap.contains(sym) || isCompilingPrimitive, sym)
-    }
-
     /**
      * The ClassBType for a class symbol. If the class is nested, the ClassBType is added to the
      * innerClassBufferASM.
      *
-     * The class symbol scala.Nothing is mapped to the class scala.runtime.Nothing$. Similarly,
-     * scala.Null is mapped to scala.runtime.Null$. This is because there exist no class files
-     * for the Nothing / Null. If used for example as a parameter type, we use the runtime classes
-     * in the classfile method signature.
-     *
-     * Note that the referenced class symbol may be an implementation class. For example when
-     * compiling a mixed-in method that forwards to the static method in the implementation class,
-     * the class descriptor of the receiver (the implementation class) is obtained by creating the
-     * ClassBType.
+     * TODO: clean up the way we track referenced inner classes.
+     * doing it during code generation is not correct when the optimizer changes the code.
      */
     final def getClassBTypeAndRegisterInnerClass(sym: Symbol): ClassBType = {
-      assertClassNotArrayNotPrimitive(sym)
-
-      if (sym == definitions.NothingClass) RT_NOTHING
-      else if (sym == definitions.NullClass) RT_NULL
-      else {
-       val r = classBTypeFromSymbol(sym)
-       if (r.isNestedClass) innerClassBufferASM += r
-       r
-      }
+      val r = classBTypeFromSymbol(sym)
+      if (r.isNestedClass.get) innerClassBufferASM += r
+      r
     }
 
     /**
-     * This method returns the BType for a type reference, for example a parameter type.
-     *
-     * If the result is a ClassBType for a nested class, it is added to the innerClassBufferASM.
-     *
-     * If `t` references a class, toTypeKind ensures that the class is not an implementation class.
-     * See also comment on getClassBTypeAndRegisterInnerClass, which is invoked for implementation
-     * classes.
+     * The BType for a type reference. If the result is a ClassBType for a nested class, it is added
+     * to the innerClassBufferASM.
+     * TODO: clean up the way we track referenced inner classes.
      */
-    final def toTypeKind(t: Type): BType = {
-      import definitions.ArrayClass
-
-      /**
-       * Primitive types are represented as TypeRefs to the class symbol of, for example, scala.Int.
-       * The `primitiveTypeMap` maps those class symbols to the corresponding PrimitiveBType.
-       */
-      def primitiveOrClassToBType(sym: Symbol): BType = {
-        assertClassNotArray(sym)
-        assert(!sym.isImplClass, sym)
-        primitiveTypeMap.getOrElse(sym, getClassBTypeAndRegisterInnerClass(sym))
-      }
-
-      /**
-       * When compiling Array.scala, the type parameter T is not erased and shows up in method
-       * signatures, e.g. `def apply(i: Int): T`. A TyperRef to T is replaced by ObjectReference.
-       */
-      def nonClassTypeRefToBType(sym: Symbol): ClassBType = {
-        assert(sym.isType && isCompilingArray, sym)
-        ObjectReference
-      }
-
-      t.dealiasWiden match {
-        case TypeRef(_, ArrayClass, List(arg))  => ArrayBType(toTypeKind(arg))  // Array type such as Array[Int] (kept by erasure)
-        case TypeRef(_, sym, _) if !sym.isClass => nonClassTypeRefToBType(sym)  // See comment on nonClassTypeRefToBType
-        case TypeRef(_, sym, _)                 => primitiveOrClassToBType(sym) // Common reference to a type such as scala.Int or java.lang.String
-        case ClassInfoType(_, _, sym)           => primitiveOrClassToBType(sym) // We get here, for example, for genLoadModule, which invokes toTypeKind(moduleClassSymbol.info)
-
-        /* AnnotatedType should (probably) be eliminated by erasure. However we know it happens for
-         * meta-annotated annotations (@(ann @getter) val x = 0), so we don't emit a warning.
-         * The type in the AnnotationInfo is an AnnotatedTpe. Tested in jvm/annotations.scala.
-         */
-        case a @ AnnotatedType(_, t) =>
-          debuglog(s"typeKind of annotated type $a")
-          toTypeKind(t)
-
-        /* ExistentialType should (probably) be eliminated by erasure. We know they get here for
-         * classOf constants:
-         *   class C[T]
-         *   class T { final val k = classOf[C[_]] }
-         */
-        case e @ ExistentialType(_, t) =>
-          debuglog(s"typeKind of existential type $e")
-          toTypeKind(t)
-
-        /* The cases below should probably never occur. They are kept for now to avoid introducing
-         * new compiler crashes, but we added a warning. The compiler / library bootstrap and the
-         * test suite don't produce any warning.
-         */
-
-        case tp =>
-          currentUnit.warning(tp.typeSymbol.pos,
-            s"an unexpected type representation reached the compiler backend while compiling $currentUnit: $tp. " +
-            "If possible, please file a bug on issues.scala-lang.org.")
-
-          tp match {
-            case ThisType(ArrayClass)               => ObjectReference // was introduced in 9b17332f11 to fix SI-999, but this code is not reached in its test, or any other test
-            case ThisType(sym)                      => getClassBTypeAndRegisterInnerClass(sym)
-            case SingleType(_, sym)                 => primitiveOrClassToBType(sym)
-            case ConstantType(_)                    => toTypeKind(t.underlying)
-            case RefinedType(parents, _)            => parents.map(toTypeKind(_).asClassBType).reduceLeft((a, b) => a.jvmWiseLUB(b))
-          }
-      }
+    final def toTypeKind(t: Type): BType = typeToBType(t) match {
+      case c: ClassBType if c.isNestedClass.get =>
+        innerClassBufferASM += c
+        c
+      case r => r
     }
 
-    /*
-     * must-single-thread
+    /**
+     * Class components that are nested classes are added to the innerClassBufferASM.
+     * TODO: clean up the way we track referenced inner classes.
      */
     final def asmMethodType(msym: Symbol): MethodBType = {
-      assert(msym.isMethod, s"not a method-symbol: $msym")
-      val resT: BType =
-        if (msym.isClassConstructor || msym.isConstructor) UNIT
-        else toTypeKind(msym.tpe.resultType)
-      MethodBType(msym.tpe.paramTypes map toTypeKind, resT)
+      val r = methodBTypeFromSymbol(msym)
+      (r.returnType :: r.argumentTypes) foreach {
+        case c: ClassBType if c.isNestedClass.get => innerClassBufferASM += c
+        case _ =>
+      }
+      r
     }
 
     /**
@@ -763,6 +682,60 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
         new java.lang.Long(id)
       ).visitEnd()
     }
+
+    /**
+     * Add:
+     * private static java.util.Map $deserializeLambdaCache$ = null
+     * private static Object $deserializeLambda$(SerializedLambda l) {
+     *   var cache = $deserializeLambdaCache$
+     *   if (cache eq null) {
+     *     cache = new java.util.HashMap()
+     *     $deserializeLambdaCache$ = cache
+     *   }
+     *   return scala.compat.java8.runtime.LambdaDeserializer.deserializeLambda(MethodHandles.lookup(), cache, l);
+     * }
+     */
+    def addLambdaDeserialize(clazz: Symbol, jclass: asm.ClassVisitor): Unit = {
+      val cw = jclass
+      import scala.tools.asm.Opcodes._
+
+      // Need to force creation of BTypes for these as `getCommonSuperClass` is called on
+      // automatically computing the max stack size (`visitMaxs`) during method writing.
+      javaUtilHashMapReference
+      javaUtilMapReference
+
+      cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", ACC_PUBLIC + ACC_FINAL + ACC_STATIC)
+
+      {
+        val fv = cw.visitField(ACC_PRIVATE + ACC_STATIC + ACC_SYNTHETIC, "$deserializeLambdaCache$", "Ljava/util/Map;", null, null)
+        fv.visitEnd()
+      }
+
+      {
+        val mv = cw.visitMethod(ACC_PRIVATE + ACC_STATIC + ACC_SYNTHETIC, "$deserializeLambda$", "(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;", null, null)
+        mv.visitCode()
+        // javaBinaryName returns the internal name of a class. Also used in BTypesFromsymbols.classBTypeFromSymbol.
+        mv.visitFieldInsn(GETSTATIC, clazz.javaBinaryName.toString, "$deserializeLambdaCache$", "Ljava/util/Map;")
+        mv.visitVarInsn(ASTORE, 1)
+        mv.visitVarInsn(ALOAD, 1)
+        val l0 = new asm.Label()
+        mv.visitJumpInsn(IFNONNULL, l0)
+        mv.visitTypeInsn(NEW, "java/util/HashMap")
+        mv.visitInsn(DUP)
+        mv.visitMethodInsn(INVOKESPECIAL, "java/util/HashMap", "<init>", "()V", false)
+        mv.visitVarInsn(ASTORE, 1)
+        mv.visitVarInsn(ALOAD, 1)
+        mv.visitFieldInsn(PUTSTATIC, clazz.javaBinaryName.toString, "$deserializeLambdaCache$", "Ljava/util/Map;")
+        mv.visitLabel(l0)
+        mv.visitFieldInsn(GETSTATIC, "scala/compat/java8/runtime/LambdaDeserializer$", "MODULE$", "Lscala/compat/java8/runtime/LambdaDeserializer$;")
+        mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "lookup", "()Ljava/lang/invoke/MethodHandles$Lookup;", false)
+        mv.visitVarInsn(ALOAD, 1)
+        mv.visitVarInsn(ALOAD, 0)
+        mv.visitMethodInsn(INVOKEVIRTUAL, "scala/compat/java8/runtime/LambdaDeserializer$", "deserializeLambda", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/util/Map;Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;", false)
+        mv.visitInsn(ARETURN)
+        mv.visitEnd()
+      }
+    }
   } // end of trait BCClassGen
 
   /* functionality for building plain and mirror classes */
@@ -796,7 +769,7 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
       val mirrorClass = new asm.tree.ClassNode
       mirrorClass.visit(
         classfileVersion,
-        bType.info.flags,
+        bType.info.get.flags,
         bType.internalName,
         null /* no java-generic-signature */,
         ObjectReference.internalName,
@@ -812,7 +785,7 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
 
       addForwarders(isRemote(moduleClass), mirrorClass, bType.internalName, moduleClass)
 
-      innerClassBufferASM ++= bType.info.nestedClasses
+      innerClassBufferASM ++= bType.info.get.nestedClasses
       addInnerClassesASM(mirrorClass, innerClassBufferASM.toList)
 
       mirrorClass.visitEnd()
@@ -861,8 +834,8 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
       var fieldList = List[String]()
 
       for (f <- fieldSymbols if f.hasGetter;
-	         g = f.getter(cls);
-	         s = f.setter(cls);
+                 g = f.getterIn(cls);
+                 s = f.setterIn(cls);
 	         if g.isPublic && !(f.name startsWith "$")
           ) {
              // inserting $outer breaks the bean
@@ -928,7 +901,7 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
       constructor.visitMaxs(0, 0) // just to follow protocol, dummy arguments
       constructor.visitEnd()
 
-      innerClassBufferASM ++= classBTypeFromSymbol(cls).info.nestedClasses
+      innerClassBufferASM ++= classBTypeFromSymbol(cls).info.get.nestedClasses
       addInnerClassesASM(beanInfoClass, innerClassBufferASM.toList)
 
       beanInfoClass.visitEnd()
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeIdiomatic.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeIdiomatic.scala
index c3db281..eb0da7c 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeIdiomatic.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeIdiomatic.scala
@@ -10,6 +10,8 @@ package backend.jvm
 import scala.tools.asm
 import scala.annotation.switch
 import scala.collection.mutable
+import GenBCode._
+import scala.tools.asm.tree.MethodInsnNode
 
 /*
  *  A high-level facade to the ASM API for bytecode generation.
@@ -42,9 +44,6 @@ abstract class BCodeIdiomatic extends SubComponent {
 
   val StringBuilderClassName = "scala/collection/mutable/StringBuilder"
 
-  val CLASS_CONSTRUCTOR_NAME    = "<clinit>"
-  val INSTANCE_CONSTRUCTOR_NAME = "<init>"
-
   val EMPTY_STRING_ARRAY   = Array.empty[String]
   val EMPTY_INT_ARRAY      = Array.empty[Int]
   val EMPTY_LABEL_ARRAY    = Array.empty[asm.Label]
@@ -107,7 +106,7 @@ abstract class BCodeIdiomatic extends SubComponent {
    */
   abstract class JCodeMethodN {
 
-    def jmethod: asm.MethodVisitor
+    def jmethod: asm.tree.MethodNode
 
     import asm.Opcodes;
     import icodes.opcodes.{ Static, Dynamic,  SuperCall }
@@ -207,20 +206,21 @@ abstract class BCodeIdiomatic extends SubComponent {
     /*
      * can-multi-thread
      */
-    final def genStartConcat {
+    final def genStartConcat(pos: Position): Unit = {
       jmethod.visitTypeInsn(Opcodes.NEW, StringBuilderClassName)
       jmethod.visitInsn(Opcodes.DUP)
       invokespecial(
         StringBuilderClassName,
         INSTANCE_CONSTRUCTOR_NAME,
-        "()V"
+        "()V",
+        pos
       )
     }
 
     /*
      * can-multi-thread
      */
-    final def genStringConcat(el: BType) {
+    final def genStringConcat(el: BType, pos: Position): Unit = {
 
       val jtype =
         if (el.isArray || el.isClass) ObjectReference
@@ -228,14 +228,14 @@ abstract class BCodeIdiomatic extends SubComponent {
 
       val bt = MethodBType(List(jtype), StringBuilderReference)
 
-      invokevirtual(StringBuilderClassName, "append", bt.descriptor)
+      invokevirtual(StringBuilderClassName, "append", bt.descriptor, pos)
     }
 
     /*
      * can-multi-thread
      */
-    final def genEndConcat {
-      invokevirtual(StringBuilderClassName, "toString", "()Ljava/lang/String;")
+    final def genEndConcat(pos: Position): Unit = {
+      invokevirtual(StringBuilderClassName, "toString", "()Ljava/lang/String;", pos)
     }
 
     /*
@@ -391,20 +391,29 @@ abstract class BCodeIdiomatic extends SubComponent {
     final def rem(tk: BType) { emitPrimitive(JCodeMethodN.remOpcodes, tk) } // can-multi-thread
 
     // can-multi-thread
-    final def invokespecial(owner: String, name: String, desc: String) {
-      jmethod.visitMethodInsn(Opcodes.INVOKESPECIAL, owner, name, desc, false)
+    final def invokespecial(owner: String, name: String, desc: String, pos: Position) {
+      addInvoke(Opcodes.INVOKESPECIAL, owner, name, desc, false, pos)
     }
     // can-multi-thread
-    final def invokestatic(owner: String, name: String, desc: String) {
-      jmethod.visitMethodInsn(Opcodes.INVOKESTATIC, owner, name, desc, false)
+    final def invokestatic(owner: String, name: String, desc: String, pos: Position) {
+      addInvoke(Opcodes.INVOKESTATIC, owner, name, desc, false, pos)
     }
     // can-multi-thread
-    final def invokeinterface(owner: String, name: String, desc: String) {
-      jmethod.visitMethodInsn(Opcodes.INVOKEINTERFACE, owner, name, desc, true)
+    final def invokeinterface(owner: String, name: String, desc: String, pos: Position) {
+      addInvoke(Opcodes.INVOKEINTERFACE, owner, name, desc, true, pos)
     }
     // can-multi-thread
-    final def invokevirtual(owner: String, name: String, desc: String) {
-      jmethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, owner, name, desc, false)
+    final def invokevirtual(owner: String, name: String, desc: String, pos: Position) {
+      addInvoke(Opcodes.INVOKEVIRTUAL, owner, name, desc, false, pos)
+    }
+
+    private def addInvoke(opcode: Int, owner: String, name: String, desc: String, itf: Boolean, pos: Position) = {
+      val node = new MethodInsnNode(opcode, owner, name, desc, itf)
+      jmethod.instructions.add(node)
+      if (settings.YoptInlinerEnabled) callsitePositions(node) = pos
+    }
+    final def invokedynamic(owner: String, name: String, desc: String) {
+      jmethod.visitMethodInsn(Opcodes.INVOKEDYNAMIC, owner, name, desc)
     }
 
     // can-multi-thread
@@ -430,7 +439,7 @@ abstract class BCodeIdiomatic extends SubComponent {
       else            { emitTypeBased(JCodeMethodN.returnOpcodes, tk)      }
     }
 
-    /* Emits one of tableswitch or lookoupswitch.
+    /* Emits one of tableswitch or lookupswitch.
      *
      * can-multi-thread
      */
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeSkelBuilder.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeSkelBuilder.scala
index 142c901..a9b6a31 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeSkelBuilder.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeSkelBuilder.scala
@@ -4,18 +4,17 @@
  */
 
 
-package scala
-package tools.nsc
+package scala.tools.nsc
 package backend
 package jvm
 
 import scala.collection.{ mutable, immutable }
+import scala.tools.nsc.backend.jvm.opt.ByteCodeRepository
 import scala.tools.nsc.symtab._
-import scala.annotation.switch
 
 import scala.tools.asm
-import scala.tools.asm.util.{TraceMethodVisitor, ASMifier}
-import java.io.PrintWriter
+import GenBCode._
+import BackendReporting._
 
 /*
  *
@@ -69,6 +68,8 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
     var isCZStaticModule           = false
     var isCZRemote                 = false
 
+    protected val indyLambdaHosts = collection.mutable.Set[Symbol]()
+
     /* ---------------- idiomatic way to ask questions to typer ---------------- */
 
     def paramTKs(app: Apply): List[BType] = {
@@ -89,7 +90,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
 
     override def getCurrentCUnit(): CompilationUnit = { cunit }
 
-    /* ---------------- helper utils for generating classes and fiels ---------------- */
+    /* ---------------- helper utils for generating classes and fields ---------------- */
 
     def genPlainClass(cd: ClassDef) {
       assert(cnode == null, "GenBCode detected nested methods.")
@@ -101,6 +102,8 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
       isCZRemote        = isRemote(claszSymbol)
       thisName          = internalName(claszSymbol)
 
+      val classBType = classBTypeFromSymbol(claszSymbol)
+
       cnode = new asm.tree.ClassNode()
 
       initJClass(cnode)
@@ -118,16 +121,31 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
 
       addClassFields()
 
-      innerClassBufferASM ++= classBTypeFromSymbol(claszSymbol).info.nestedClasses
+      innerClassBufferASM ++= classBType.info.get.nestedClasses
       gen(cd.impl)
+
+
+      val shouldAddLambdaDeserialize = (
+        settings.target.value == "jvm-1.8"
+          && settings.Ydelambdafy.value == "method"
+          && indyLambdaHosts.contains(claszSymbol))
+
+      if (shouldAddLambdaDeserialize)
+        addLambdaDeserialize(claszSymbol, cnode)
+
       addInnerClassesASM(cnode, innerClassBufferASM.toList)
 
+      cnode.visitAttribute(classBType.inlineInfoAttribute.get)
+
       if (AsmUtils.traceClassEnabled && cnode.name.contains(AsmUtils.traceClassPattern))
         AsmUtils.traceClass(cnode)
 
-      cnode.innerClasses
-      assert(cd.symbol == claszSymbol, "Someone messed up BCodePhase.claszSymbol during genPlainClass().")
+      if (settings.YoptAddToBytecodeRepository) {
+        // The inliner needs to find all classes in the code repo, also those being compiled
+        byteCodeRepository.add(cnode, ByteCodeRepository.CompilationUnit)
+      }
 
+      assert(cd.symbol == claszSymbol, "Someone messed up BCodePhase.claszSymbol during genPlainClass().")
     } // end of method genPlainClass()
 
     /*
@@ -135,11 +153,11 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
      */
     private def initJClass(jclass: asm.ClassVisitor) {
 
-      val ps = claszSymbol.info.parents
-      val superClass: String = if (ps.isEmpty) ObjectReference.internalName else internalName(ps.head.typeSymbol)
-      val interfaceNames = classBTypeFromSymbol(claszSymbol).info.interfaces map {
+      val bType = classBTypeFromSymbol(claszSymbol)
+      val superClass = bType.info.get.superClass.getOrElse(ObjectReference).internalName
+      val interfaceNames = bType.info.get.interfaces map {
         case classBType =>
-          if (classBType.isNestedClass) { innerClassBufferASM += classBType }
+          if (classBType.isNestedClass.get) { innerClassBufferASM += classBType }
           classBType.internalName
       }
 
@@ -425,7 +443,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
      *        which rethrows the caught exception once it's done with the cleanup code.
      *
      *  A particular cleanup may in general contain LabelDefs. Care is needed when duplicating such jump-targets,
-     *  so as to preserve agreement wit the (also duplicated) jump-sources.
+     *  so as to preserve agreement with the (also duplicated) jump-sources.
      *  This is achieved based on the bookkeeping provided by two maps:
      *    - `labelDefsAtOrUnder` lists all LabelDefs enclosed by a given Tree node (the key)
      *    - `labelDef` provides the LabelDef node whose symbol is used as key.
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala b/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala
index a194fe8..0c26e01 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala
@@ -6,18 +6,24 @@
 package scala.tools.nsc
 package backend.jvm
 
+import scala.annotation.switch
+import scala.collection.concurrent.TrieMap
+import scala.reflect.internal.util.Position
 import scala.tools.asm
 import asm.Opcodes
-import scala.tools.asm.tree.{InnerClassNode, ClassNode}
-import opt.ByteCodeRepository
+import scala.tools.asm.tree.{MethodNode, MethodInsnNode, InnerClassNode, ClassNode}
+import scala.tools.nsc.backend.jvm.BTypes.{InlineInfo, MethodInlineInfo}
+import scala.tools.nsc.backend.jvm.BackendReporting._
+import scala.tools.nsc.backend.jvm.opt._
 import scala.collection.convert.decorateAsScala._
+import scala.tools.nsc.settings.ScalaSettings
 
 /**
- * The BTypes component defines The BType class hierarchy. BTypes encapsulate all type information
+ * The BTypes component defines The BType class hierarchy. A BType stores all type information
  * that is required after building the ASM nodes. This includes optimizations, generation of
  * InnerClass attributes and generation of stack map frames.
  *
- * This representation is immutable and independent of the compiler data structures, hence it can
+ * The representation is immutable and independent of the compiler data structures, hence it can
  * be queried by concurrent threads.
  */
 abstract class BTypes {
@@ -34,9 +40,23 @@ abstract class BTypes {
    */
   val byteCodeRepository: ByteCodeRepository
 
+  val localOpt: LocalOpt[this.type]
+
+  val inliner: Inliner[this.type]
+
+  val closureOptimizer: ClosureOptimizer[this.type]
+
+  val callGraph: CallGraph[this.type]
+
+  val backendReporting: BackendReporting
+
   // Allows to define per-run caches here and in the CallGraph component, which don't have a global
   def recordPerRunCache[T <: collection.generic.Clearable](cache: T): T
 
+  // Allows access to the compiler settings for backend components that don't have a global in scope
+  def compilerSettings: ScalaSettings
+
+
   /**
    * A map from internal names to ClassBTypes. Every ClassBType is added to this map on its
    * construction.
@@ -48,13 +68,69 @@ abstract class BTypes {
    * Concurrent because stack map frames are computed when in the class writer, which might run
    * on multiple classes concurrently.
    */
-  val classBTypeFromInternalName: collection.concurrent.Map[InternalName, ClassBType] = recordPerRunCache(collection.concurrent.TrieMap.empty[InternalName, ClassBType])
+  val classBTypeFromInternalName: collection.concurrent.Map[InternalName, ClassBType] = recordPerRunCache(TrieMap.empty)
+
+  /**
+   * Store the position of every MethodInsnNode during code generation. This allows each callsite
+   * in the call graph to remember its source position, which is required for inliner warnings.
+   */
+  val callsitePositions: collection.concurrent.Map[MethodInsnNode, Position] = recordPerRunCache(TrieMap.empty)
+
+  /**
+   * Contains the internal names of all classes that are defined in Java source files of the current
+   * compilation run (mixed compilation). Used for more detailed error reporting.
+   */
+  val javaDefinedClasses: collection.mutable.Set[InternalName] = recordPerRunCache(collection.mutable.Set.empty)
+
+  /**
+   * Cache, contains methods whose unreachable instructions are eliminated.
+   *
+   * The ASM Analyzer class does not compute any frame information for unreachable instructions.
+   * Transformations that use an analyzer (including inlining) therefore require unreachable code
+   * to be eliminated.
+   *
+   * This cache allows running dead code elimination whenever an analyzer is used. If the method
+   * is already optimized, DCE can return early.
+   */
+  val unreachableCodeEliminated: collection.mutable.Set[MethodNode] = recordPerRunCache(collection.mutable.Set.empty)
+
+  /**
+   * Obtain the BType for a type descriptor or internal name. For class descriptors, the ClassBType
+   * is constructed by parsing the corresponding classfile.
+   * 
+   * Some JVM operations use either a full descriptor or only an internal name. Example:
+   *   ANEWARRAY java/lang/String    // a new array of strings (internal name for the String class)
+   *   ANEWARRAY [Ljava/lang/String; // a new array of array of string (full descriptor for the String class)
+   *
+   * This method supports both descriptors and internal names.
+   */
+  def bTypeForDescriptorOrInternalNameFromClassfile(desc: String): BType = (desc(0): @switch) match {
+    case 'V'                     => UNIT
+    case 'Z'                     => BOOL
+    case 'C'                     => CHAR
+    case 'B'                     => BYTE
+    case 'S'                     => SHORT
+    case 'I'                     => INT
+    case 'F'                     => FLOAT
+    case 'J'                     => LONG
+    case 'D'                     => DOUBLE
+    case '['                     => ArrayBType(bTypeForDescriptorOrInternalNameFromClassfile(desc.substring(1)))
+    case 'L' if desc.last == ';' => classBTypeFromParsedClassfile(desc.substring(1, desc.length - 1))
+    case _                       => classBTypeFromParsedClassfile(desc)
+  }
 
   /**
-   * Parse the classfile for `internalName` and construct the [[ClassBType]].
+   * Parse the classfile for `internalName` and construct the [[ClassBType]]. If the classfile cannot
+   * be found in the `byteCodeRepository`, the `info` of the resulting ClassBType is undefined.
    */
   def classBTypeFromParsedClassfile(internalName: InternalName): ClassBType = {
-    classBTypeFromClassNode(byteCodeRepository.classNode(internalName))
+    classBTypeFromInternalName.getOrElse(internalName, {
+      val res = ClassBType(internalName)
+      byteCodeRepository.classNode(internalName) match {
+        case Left(msg) => res.info = Left(NoClassBTypeInfoMissingBytecode(msg)); res
+        case Right(c)  => setClassInfoFromParsedClassfile(c, res)
+      }
+    })
   }
 
   /**
@@ -62,11 +138,11 @@ abstract class BTypes {
    */
   def classBTypeFromClassNode(classNode: ClassNode): ClassBType = {
     classBTypeFromInternalName.getOrElse(classNode.name, {
-      setClassInfo(classNode, ClassBType(classNode.name))
+      setClassInfoFromParsedClassfile(classNode, ClassBType(classNode.name))
     })
   }
 
-  private def setClassInfo(classNode: ClassNode, classBType: ClassBType): ClassBType = {
+  private def setClassInfoFromParsedClassfile(classNode: ClassNode, classBType: ClassBType): ClassBType = {
     val superClass = classNode.superName match {
       case null =>
         assert(classNode.name == ObjectReference.internalName, s"class with missing super type: ${classNode.name}")
@@ -89,11 +165,13 @@ abstract class BTypes {
      * For local and anonymous classes, innerClassNode.outerName is null. Such classes are required
      * to have an EnclosingMethod attribute declaring the outer class. So we keep those local and
      * anonymous classes whose outerClass is classNode.name.
-     *
      */
     def nestedInCurrentClass(innerClassNode: InnerClassNode): Boolean = {
       (innerClassNode.outerName != null && innerClassNode.outerName == classNode.name) ||
-      (innerClassNode.outerName == null && byteCodeRepository.classNode(innerClassNode.name).outerClass == classNode.name)
+      (innerClassNode.outerName == null && {
+        val classNodeForInnerClass = byteCodeRepository.classNode(innerClassNode.name).get // TODO: don't get here, but set the info to Left at the end
+        classNodeForInnerClass.outerClass == classNode.name
+      })
     }
 
     val nestedClasses: List[ClassBType] = classNode.innerClasses.asScala.collect({
@@ -116,11 +194,58 @@ abstract class BTypes {
         val staticFlag = (innerEntry.access & Opcodes.ACC_STATIC) != 0
         NestedInfo(enclosingClass, Option(innerEntry.outerName), Option(innerEntry.innerName), staticFlag)
     }
-    classBType.info = ClassInfo(superClass, interfaces, flags, nestedClasses, nestedInfo)
+
+    val inlineInfo = inlineInfoFromClassfile(classNode)
+
+    classBType.info = Right(ClassInfo(superClass, interfaces, flags, nestedClasses, nestedInfo, inlineInfo))
     classBType
   }
 
   /**
+   * Build the InlineInfo for a class. For Scala classes, the information is stored in the
+   * ScalaInlineInfo attribute. If the attribute is missing, the InlineInfo is built using the
+   * metadata available in the classfile (ACC_FINAL flags, etc).
+   */
+  def inlineInfoFromClassfile(classNode: ClassNode): InlineInfo = {
+    def fromClassfileAttribute: Option[InlineInfo] = {
+      if (classNode.attrs == null) None
+      else classNode.attrs.asScala.collect({ case a: InlineInfoAttribute => a}).headOption.map(_.inlineInfo)
+    }
+
+    def fromClassfileWithoutAttribute = {
+      val warning = {
+        val isScala = classNode.attrs != null && classNode.attrs.asScala.exists(a => a.`type` == BTypes.ScalaAttributeName || a.`type` == BTypes.ScalaSigAttributeName)
+        if (isScala) Some(NoInlineInfoAttribute(classNode.name))
+        else None
+      }
+      // when building MethodInlineInfos for the members of a ClassSymbol, we exclude those methods
+      // in scalaPrimitives. This is necessary because some of them have non-erased types, which would
+      // require special handling. Excluding is OK because they are never inlined.
+      // Here we are parsing from a classfile and we don't need to do anything special. Many of these
+      // primitives don't even exist, for example Any.isInstanceOf.
+      val methodInfos = classNode.methods.asScala.map(methodNode => {
+        val info = MethodInlineInfo(
+          effectivelyFinal                    = BytecodeUtils.isFinalMethod(methodNode),
+          traitMethodWithStaticImplementation = false,
+          annotatedInline                     = false,
+          annotatedNoInline                   = false)
+        (methodNode.name + methodNode.desc, info)
+      }).toMap
+      InlineInfo(
+        traitImplClassSelfType = None,
+        isEffectivelyFinal = BytecodeUtils.isFinalClass(classNode),
+        methodInfos = methodInfos,
+        warning)
+    }
+
+    // The InlineInfo is built from the classfile (not from the symbol) for all classes that are NOT
+    // being compiled. For those classes, the info is only needed if the inliner is enabled, othewise
+    // we can save the memory.
+    if (!compilerSettings.YoptInlinerEnabled) BTypes.EmptyInlineInfo
+    else fromClassfileAttribute getOrElse fromClassfileWithoutAttribute
+  }
+
+  /**
    * A BType is either a primitive type, a ClassBType, an ArrayBType of one of these, or a MethodType
    * referring to BTypes.
    */
@@ -184,7 +309,7 @@ abstract class BTypes {
      * promotions (e.g. BYTE to INT). Its operation can be visualized more easily in terms of the
      * Java bytecode type hierarchy.
      */
-    final def conformsTo(other: BType): Boolean = {
+    final def conformsTo(other: BType): Either[NoClassBTypeInfo, Boolean] = tryEither(Right({
       assert(isRef || isPrimitive, s"conformsTo cannot handle $this")
       assert(other.isRef || other.isPrimitive, s"conformsTo cannot handle $other")
 
@@ -192,7 +317,7 @@ abstract class BTypes {
         case ArrayBType(component) =>
           if (other == ObjectReference || other == jlCloneableReference || other == jioSerializableReference) true
           else other match {
-            case ArrayBType(otherComponoent) => component.conformsTo(otherComponoent)
+            case ArrayBType(otherComponent) => component.conformsTo(otherComponent).orThrow
             case _ => false
           }
 
@@ -201,7 +326,7 @@ abstract class BTypes {
             if (other.isBoxed) this == other
             else if (other == ObjectReference) true
             else other match {
-              case otherClassType: ClassBType => classType.isSubtypeOf(otherClassType) // e.g., java/lang/Double conforms to java/lang/Number
+              case otherClassType: ClassBType => classType.isSubtypeOf(otherClassType).orThrow // e.g., java/lang/Double conforms to java/lang/Number
               case _ => false
             }
           } else if (isNullType) {
@@ -211,7 +336,7 @@ abstract class BTypes {
           } else if (isNothingType) {
             true
           } else other match {
-            case otherClassType: ClassBType => classType.isSubtypeOf(otherClassType)
+            case otherClassType: ClassBType => classType.isSubtypeOf(otherClassType).orThrow
             // case ArrayBType(_) => this.isNullType   // documentation only, because `if (isNullType)` above covers this case
             case _ =>
               // isNothingType ||                      // documentation only, because `if (isNothingType)` above covers this case
@@ -226,7 +351,7 @@ abstract class BTypes {
           assert(isPrimitive && other.isPrimitive, s"Expected primitive types $this - $other")
           this == other
       }
-    }
+    }))
 
     /**
      * Compute the upper bound of two types.
@@ -245,7 +370,7 @@ abstract class BTypes {
         ObjectReference
 
       case _: MethodBType =>
-        throw new AssertionError(s"unexpected method type when computing maxType: $this")
+        assertionError(s"unexpected method type when computing maxType: $this")
     }
 
     /**
@@ -336,7 +461,7 @@ abstract class BTypes {
      */
     final def maxValueType(other: BType): BType = {
 
-      def uncomparable: Nothing = throw new AssertionError(s"Cannot compute maxValueType: $this, $other")
+      def uncomparable: Nothing = assertionError(s"Cannot compute maxValueType: $this, $other")
 
       if (!other.isPrimitive && !other.isNothingType) uncomparable
 
@@ -523,7 +648,7 @@ abstract class BTypes {
    * JVMS 4.7.7: the attribute must be present "if and only if it represents a local class
    * or an anonymous class" (i.e. not for member classes).
    *
-   * The attribute is mis-named, it should be called "EnclosingClass". It has to be defined for all
+   * The attribute is misnamed, it should be called "EnclosingClass". It has to be defined for all
    * local and anonymous classes, no matter if there is an enclosing method or not. Accordingly, the
    * "class" field (see below) must be always defined, while the "method" field may be null.
    *
@@ -665,6 +790,21 @@ abstract class BTypes {
   /**
    * A ClassBType represents a class or interface type. The necessary information to build a
    * ClassBType is extracted from compiler symbols and types, see BTypesFromSymbols.
+   *
+   * The `info` field contains either the class information on an error message why the info could
+   * not be computed. There are two reasons for an erroneous info:
+   *   1. The ClassBType was built from a class symbol that stems from a java source file, and the
+   *      symbol's type could not be completed successfully (SI-9111)
+   *   2. The ClassBType should be built from a classfile, but the class could not be found on the
+   *      compilation classpath.
+   *
+   * Note that all ClassBTypes required in a non-optimized run are built during code generation from
+   * the class symbols referenced by the ASTs, so they have a valid info. Therefore the backend
+   * often invokes `info.get` (which asserts the info to exist) when reading data from the ClassBType.
+   *
+   * The inliner on the other hand uses ClassBTypes that are built from classfiles, which may have
+   * a missing info. In order not to crash the compiler unnecessarily, the inliner does not force
+   * infos using `get`, but it reports inliner warnings for missing infos that prevent inlining.
    */
   final case class ClassBType(internalName: InternalName) extends RefBType {
     /**
@@ -674,14 +814,14 @@ abstract class BTypes {
      *   B.info.nestedInfo.outerClass == A
      *   A.info.nestedClasses contains B
      */
-    private var _info: ClassInfo = null
+    private var _info: Either[NoClassBTypeInfo, ClassInfo] = null
 
-    def info: ClassInfo = {
+    def info: Either[NoClassBTypeInfo, ClassInfo] = {
       assert(_info != null, s"ClassBType.info not yet assigned: $this")
       _info
     }
 
-    def info_=(i: ClassInfo): Unit = {
+    def info_=(i: Either[NoClassBTypeInfo, ClassInfo]): Unit = {
       assert(_info == null, s"Cannot set ClassBType.info multiple times: $this")
       _info = i
       checkInfoConsistency()
@@ -690,27 +830,29 @@ abstract class BTypes {
     classBTypeFromInternalName(internalName) = this
 
     private def checkInfoConsistency(): Unit = {
+      if (info.isLeft) return
+
       // we assert some properties. however, some of the linked ClassBType (members, superClass,
       // interfaces) may not yet have an `_info` (initialization of cyclic structures). so we do a
-      // best-effort verification.
-      def ifInit(c: ClassBType)(p: ClassBType => Boolean): Boolean = c._info == null || p(c)
+      // best-effort verification. also we don't report an error if the info is a Left.
+      def ifInit(c: ClassBType)(p: ClassBType => Boolean): Boolean = c._info == null || c.info.isLeft || p(c)
 
       def isJLO(t: ClassBType) = t.internalName == ObjectReference.internalName
 
       assert(!ClassBType.isInternalPhantomType(internalName), s"Cannot create ClassBType for phantom type $this")
 
       assert(
-        if (info.superClass.isEmpty) { isJLO(this) || (isCompilingPrimitive && ClassBType.hasNoSuper(internalName)) }
-        else if (isInterface) isJLO(info.superClass.get)
-        else !isJLO(this) && ifInit(info.superClass.get)(!_.isInterface),
-        s"Invalid superClass in $this: ${info.superClass}"
+        if (info.get.superClass.isEmpty) { isJLO(this) || (isCompilingPrimitive && ClassBType.hasNoSuper(internalName)) }
+        else if (isInterface.get) isJLO(info.get.superClass.get)
+        else !isJLO(this) && ifInit(info.get.superClass.get)(!_.isInterface.get),
+        s"Invalid superClass in $this: ${info.get.superClass}"
       )
       assert(
-        info.interfaces.forall(c => ifInit(c)(_.isInterface)),
-        s"Invalid interfaces in $this: ${info.interfaces}"
+        info.get.interfaces.forall(c => ifInit(c)(_.isInterface.get)),
+        s"Invalid interfaces in $this: ${info.get.interfaces}"
       )
 
-      assert(info.nestedClasses.forall(c => ifInit(c)(_.isNestedClass)), info.nestedClasses)
+      assert(info.get.nestedClasses.forall(c => ifInit(c)(_.isNestedClass.get)), info.get.nestedClasses)
     }
 
     /**
@@ -718,20 +860,37 @@ abstract class BTypes {
      */
     def simpleName: String = internalName.split("/").last
 
-    def isInterface = (info.flags & asm.Opcodes.ACC_INTERFACE) != 0
+    def isInterface: Either[NoClassBTypeInfo, Boolean] = info.map(i => (i.flags & asm.Opcodes.ACC_INTERFACE) != 0)
+
+    def superClassesTransitive: Either[NoClassBTypeInfo, List[ClassBType]] = info.flatMap(i => i.superClass match {
+      case None => Right(Nil)
+      case Some(sc) =>  sc.superClassesTransitive.map(sc :: _)
+    })
 
-    def superClassesTransitive: List[ClassBType] = info.superClass match {
-      case None => Nil
-      case Some(sc) => sc :: sc.superClassesTransitive
+    /**
+     * The prefix of the internal name until the last '/', or the empty string.
+     */
+    def packageInternalName: String = {
+      val name = internalName
+      name.lastIndexOf('/') match {
+        case -1 => ""
+        case i  => name.substring(0, i)
+      }
     }
 
-    def isNestedClass = info.nestedInfo.isDefined
+    def isPublic: Either[NoClassBTypeInfo, Boolean] = info.map(i => (i.flags & asm.Opcodes.ACC_PUBLIC) != 0)
 
-    def enclosingNestedClassesChain: List[ClassBType] =
-      if (isNestedClass) this :: info.nestedInfo.get.enclosingClass.enclosingNestedClassesChain
-      else Nil
+    def isNestedClass: Either[NoClassBTypeInfo, Boolean] = info.map(_.nestedInfo.isDefined)
+
+    def enclosingNestedClassesChain: Either[NoClassBTypeInfo, List[ClassBType]] = {
+      isNestedClass.flatMap(isNested => {
+        // if isNested is true, we know that info.get is defined, and nestedInfo.get is also defined.
+        if (isNested) info.get.nestedInfo.get.enclosingClass.enclosingNestedClassesChain.map(this :: _)
+        else Right(Nil)
+      })
+    }
 
-    def innerClassAttributeEntry: Option[InnerClassEntry] = info.nestedInfo map {
+    def innerClassAttributeEntry: Either[NoClassBTypeInfo, Option[InnerClassEntry]] = info.map(i => i.nestedInfo map {
       case NestedInfo(_, outerName, innerName, isStaticNestedClass) =>
         InnerClassEntry(
           internalName,
@@ -739,28 +898,39 @@ abstract class BTypes {
           innerName.orNull,
           GenBCode.mkFlags(
             // the static flag in the InnerClass table has a special meaning, see InnerClass comment
-            info.flags & ~Opcodes.ACC_STATIC,
+            i.flags & ~Opcodes.ACC_STATIC,
             if (isStaticNestedClass) Opcodes.ACC_STATIC else 0
-          ) & ClassBType.INNER_CLASSES_FLAGS
+          ) & BCodeAsmCommon.INNER_CLASSES_FLAGS
         )
-    }
+    })
 
-    def isSubtypeOf(other: ClassBType): Boolean = {
-      if (this == other) return true
+    def inlineInfoAttribute: Either[NoClassBTypeInfo, InlineInfoAttribute] = info.map(i => {
+      // InlineInfos are serialized for classes being compiled. For those the info was built by
+      // buildInlineInfoFromClassSymbol, which only adds a warning under SI-9111, which in turn
+      // only happens for class symbols of java source files.
+      // we could put this assertion into InlineInfoAttribute, but it is more safe to put it here
+      // where it affect only GenBCode, and not add any assertion to GenASM in 2.11.6.
+      assert(i.inlineInfo.warning.isEmpty, i.inlineInfo.warning)
+      InlineInfoAttribute(i.inlineInfo)
+    })
 
-      if (isInterface) {
-        if (other == ObjectReference) return true // interfaces conform to Object
-        if (!other.isInterface) return false // this is an interface, the other is some class other than object. interfaces cannot extend classes, so the result is false.
+    def isSubtypeOf(other: ClassBType): Either[NoClassBTypeInfo, Boolean] = try {
+      if (this == other) return Right(true)
+      if (isInterface.orThrow) {
+        if (other == ObjectReference) return Right(true) // interfaces conform to Object
+        if (!other.isInterface.orThrow) return Right(false)   // this is an interface, the other is some class other than object. interfaces cannot extend classes, so the result is false.
         // else: this and other are both interfaces. continue to (*)
       } else {
-        val sc = info.superClass
-        if (sc.isDefined && sc.get.isSubtypeOf(other)) return true // the superclass of this class conforms to other
-        if (!other.isInterface) return false // this and other are both classes, and the superclass of this does not conform
+        val sc = info.orThrow.superClass
+        if (sc.isDefined && sc.get.isSubtypeOf(other).orThrow) return Right(true) // the superclass of this class conforms to other
+        if (!other.isInterface.orThrow) return Right(false) // this and other are both classes, and the superclass of this does not conform
         // else: this is a class, the other is an interface. continue to (*)
       }
 
       // (*) check if some interface of this class conforms to other.
-      info.interfaces.exists(_.isSubtypeOf(other))
+      Right(info.orThrow.interfaces.exists(_.isSubtypeOf(other).orThrow))
+    } catch {
+      case Invalid(noInfo: NoClassBTypeInfo) => Left(noInfo)
     }
 
     /**
@@ -770,34 +940,36 @@ abstract class BTypes {
      *   http://comments.gmane.org/gmane.comp.java.vm.languages/2293
      *   https://issues.scala-lang.org/browse/SI-3872
      */
-    def jvmWiseLUB(other: ClassBType): ClassBType = {
+    def jvmWiseLUB(other: ClassBType): Either[NoClassBTypeInfo, ClassBType] = {
       def isNotNullOrNothing(c: ClassBType) = !c.isNullType && !c.isNothingType
-      assert(isNotNullOrNothing(this) && isNotNullOrNothing(other), s"jvmWiseLub for null or nothing: $this - $other")
-
-      val res: ClassBType = (this.isInterface, other.isInterface) match {
-        case (true, true) =>
-          // exercised by test/files/run/t4761.scala
-          if      (other.isSubtypeOf(this)) this
-          else if (this.isSubtypeOf(other)) other
-          else ObjectReference
-
-        case (true, false) =>
-          if (other.isSubtypeOf(this)) this else ObjectReference
-
-        case (false, true) =>
-          if (this.isSubtypeOf(other)) other else ObjectReference
+      assert(isNotNullOrNothing(this) && isNotNullOrNothing(other), s"jvmWiseLUB for null or nothing: $this - $other")
+
+      tryEither {
+        val res: ClassBType = (this.isInterface.orThrow, other.isInterface.orThrow) match {
+          case (true, true) =>
+            // exercised by test/files/run/t4761.scala
+            if (other.isSubtypeOf(this).orThrow) this
+            else if (this.isSubtypeOf(other).orThrow) other
+            else ObjectReference
+
+          case (true, false) =>
+            if (other.isSubtypeOf(this).orThrow) this else ObjectReference
+
+          case (false, true) =>
+            if (this.isSubtypeOf(other).orThrow) other else ObjectReference
+
+          case _ =>
+            // TODO @lry I don't really understand the reasoning here.
+            // Both this and other are classes. The code takes (transitively) all superclasses and
+            // finds the first common one.
+            // MOST LIKELY the answer can be found here, see the comments and links by Miguel:
+            //  - https://issues.scala-lang.org/browse/SI-3872
+            firstCommonSuffix(this :: this.superClassesTransitive.orThrow, other :: other.superClassesTransitive.orThrow)
+        }
 
-        case _ =>
-          // TODO @lry I don't really understand the reasoning here.
-          // Both this and other are classes. The code takes (transitively) all superclasses and
-          // finds the first common one.
-          // MOST LIKELY the answer can be found here, see the comments and links by Miguel:
-          //  - https://issues.scala-lang.org/browse/SI-3872
-          firstCommonSuffix(this :: this.superClassesTransitive, other :: other.superClassesTransitive)
+        assert(isNotNullOrNothing(res), s"jvmWiseLUB computed: $res")
+        Right(res)
       }
-
-      assert(isNotNullOrNothing(res), s"jvmWiseLub computed: $res")
-      res
     }
 
     private def firstCommonSuffix(as: List[ClassBType], bs: List[ClassBType]): ClassBType = {
@@ -817,17 +989,6 @@ abstract class BTypes {
   }
 
   object ClassBType {
-    /**
-     * Valid flags for InnerClass attribute entry.
-     * See http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.6
-     */
-    private val INNER_CLASSES_FLAGS = {
-      asm.Opcodes.ACC_PUBLIC   | asm.Opcodes.ACC_PRIVATE   | asm.Opcodes.ACC_PROTECTED  |
-      asm.Opcodes.ACC_STATIC   | asm.Opcodes.ACC_FINAL     | asm.Opcodes.ACC_INTERFACE  |
-      asm.Opcodes.ACC_ABSTRACT | asm.Opcodes.ACC_SYNTHETIC | asm.Opcodes.ACC_ANNOTATION |
-      asm.Opcodes.ACC_ENUM
-    }
-
     // Primitive classes have no super class. A ClassBType for those is only created when
     // they are actually being compiled (e.g., when compiling scala/Boolean.scala).
     private val hasNoSuper = Set(
@@ -859,9 +1020,11 @@ abstract class BTypes {
    * @param nestedClasses Classes nested in this class. Those need to be added to the
    *                      InnerClass table, see the InnerClass spec summary above.
    * @param nestedInfo    If this describes a nested class, information for the InnerClass table.
+   * @param inlineInfo    Information about this class for the inliner.
    */
   final case class ClassInfo(superClass: Option[ClassBType], interfaces: List[ClassBType], flags: Int,
-                             nestedClasses: List[ClassBType], nestedInfo: Option[NestedInfo])
+                             nestedClasses: List[ClassBType], nestedInfo: Option[NestedInfo],
+                             inlineInfo: InlineInfo)
 
   /**
    * Information required to add a class to an InnerClass table.
@@ -936,4 +1099,60 @@ object BTypes {
    * But that would create overhead in a Collection[InternalName].
    */
   type InternalName = String
+
+  /**
+   * Metadata about a ClassBType, used by the inliner.
+   *
+   * More information may be added in the future to enable more elaborate inlinine heuristics.
+   *
+   * @param traitImplClassSelfType `Some(tp)` if this InlineInfo describes a trait, and the `self`
+   *                               parameter type of the methods in the implementation class is not
+   *                               the trait itself. Example:
+   *                                 trait T { self: U => def f = 1 }
+   *                               Generates something like:
+   *                                 class T$class { static def f(self: U) = 1 }
+   *
+   *                               In order to inline a trat method call, the INVOKEINTERFACE is
+   *                               rewritten to an INVOKESTATIC of the impl class, so we need the
+   *                               self type (U) to get the right signature.
+   *
+   *                               `None` if the self type is the interface type, or if this
+   *                               InlineInfo does not describe a trait.
+   *
+   * @param isEffectivelyFinal     True if the class cannot have subclasses: final classes, module
+   *                               classes, trait impl classes.
+   *
+   * @param methodInfos            The [[MethodInlineInfo]]s for the methods declared in this class.
+   *                               The map is indexed by the string s"$name$descriptor" (to
+   *                               disambiguate overloads).
+   *
+   * @param warning                Contains an warning message if an error occurred when building this
+   *                               InlineInfo, for example if some classfile could not be found on
+   *                               the classpath. This warning can be reported later by the inliner.
+   */
+  final case class InlineInfo(traitImplClassSelfType: Option[InternalName],
+                              isEffectivelyFinal: Boolean,
+                              methodInfos: Map[String, MethodInlineInfo],
+                              warning: Option[ClassInlineInfoWarning])
+
+  val EmptyInlineInfo = InlineInfo(None, false, Map.empty, None)
+
+  /**
+   * Metadata about a method, used by the inliner.
+   *
+   * @param effectivelyFinal                    True if the method cannot be overridden (in Scala)
+   * @param traitMethodWithStaticImplementation True if the method is an interface method method of
+   *                                            a trait method and has a static counterpart in the
+   *                                            implementation class.
+   * @param annotatedInline                     True if the method is annotated `@inline`
+   * @param annotatedNoInline                   True if the method is annotated `@noinline`
+   */
+  final case class MethodInlineInfo(effectivelyFinal: Boolean,
+                                    traitMethodWithStaticImplementation: Boolean,
+                                    annotatedInline: Boolean,
+                                    annotatedNoInline: Boolean)
+
+  // no static way (without symbol table instance) to get to nme.ScalaATTR / ScalaSignatureATTR
+  val ScalaAttributeName    = "Scala"
+  val ScalaSigAttributeName = "ScalaSig"
 }
\ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala b/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala
index 2af665d..45d9cc3 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala
@@ -7,10 +7,10 @@ package scala.tools.nsc
 package backend.jvm
 
 import scala.tools.asm
-import opt.ByteCodeRepository
-import scala.tools.asm.tree.ClassNode
-import scala.tools.nsc.backend.jvm.opt.ByteCodeRepository.Source
-import BTypes.InternalName
+import scala.tools.nsc.backend.jvm.opt._
+import scala.tools.nsc.backend.jvm.BTypes.{InlineInfo, MethodInlineInfo, InternalName}
+import BackendReporting._
+import scala.tools.nsc.settings.ScalaSettings
 
 /**
  * This class mainly contains the method classBTypeFromSymbol, which extracts the necessary
@@ -36,7 +36,17 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
   val coreBTypes = new CoreBTypesProxy[this.type](this)
   import coreBTypes._
 
-  val byteCodeRepository = new ByteCodeRepository(global.classPath, recordPerRunCache(collection.concurrent.TrieMap.empty[InternalName, (ClassNode, Source)]))
+  val byteCodeRepository = new ByteCodeRepository(global.classPath, javaDefinedClasses, recordPerRunCache(collection.concurrent.TrieMap.empty))
+
+  val localOpt: LocalOpt[this.type] = new LocalOpt(this)
+
+  val inliner: Inliner[this.type] = new Inliner(this)
+
+  val closureOptimizer: ClosureOptimizer[this.type] = new ClosureOptimizer(this)
+
+  val callGraph: CallGraph[this.type] = new CallGraph(this)
+
+  val backendReporting: BackendReporting = new BackendReportingImpl(global)
 
   final def initializeCoreBTypes(): Unit = {
     coreBTypes.setBTypes(new CoreBTypes[this.type](this))
@@ -44,6 +54,8 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
 
   def recordPerRunCache[T <: collection.generic.Clearable](cache: T): T = perRunCaches.recordCache(cache)
 
+  def compilerSettings: ScalaSettings = settings
+
   // helpers that need access to global.
   // TODO @lry create a separate component, they don't belong to BTypesFromSymbols
 
@@ -76,26 +88,146 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
   // end helpers
 
   /**
-   * The ClassBType for a class symbol `sym`.
+   * The ClassBType for a class symbol `classSym`.
+   *
+   * The class symbol scala.Nothing is mapped to the class scala.runtime.Nothing$. Similarly,
+   * scala.Null is mapped to scala.runtime.Null$. This is because there exist no class files
+   * for the Nothing / Null. If used for example as a parameter type, we use the runtime classes
+   * in the classfile method signature.
+   *
+   * Note that the referenced class symbol may be an implementation class. For example when
+   * compiling a mixed-in method that forwards to the static method in the implementation class,
+   * the class descriptor of the receiver (the implementation class) is obtained by creating the
+   * ClassBType.
    */
   final def classBTypeFromSymbol(classSym: Symbol): ClassBType = {
     assert(classSym != NoSymbol, "Cannot create ClassBType from NoSymbol")
     assert(classSym.isClass, s"Cannot create ClassBType from non-class symbol $classSym")
-    assert(
-      (!primitiveTypeMap.contains(classSym) || isCompilingPrimitive) &&
-      (classSym != NothingClass && classSym != NullClass),
-      s"Cannot create ClassBType for special class symbol ${classSym.fullName}")
+    assertClassNotArrayNotPrimitive(classSym)
+    assert(!primitiveTypeMap.contains(classSym) || isCompilingPrimitive, s"Cannot create ClassBType for primitive class symbol $classSym")
+    if (classSym == NothingClass) RT_NOTHING
+    else if (classSym == NullClass) RT_NULL
+    else {
+      val internalName = classSym.javaBinaryName.toString
+      classBTypeFromInternalName.getOrElse(internalName, {
+        // The new ClassBType is added to the map in its constructor, before we set its info. This
+        // allows initializing cyclic dependencies, see the comment on variable ClassBType._info.
+        val res = ClassBType(internalName)
+        if (completeSilentlyAndCheckErroneous(classSym)) {
+          res.info = Left(NoClassBTypeInfoClassSymbolInfoFailedSI9111(classSym.fullName))
+          res
+        } else {
+          setClassInfo(classSym, res)
+        }
+      })
+    }
+  }
 
-    val internalName = classSym.javaBinaryName.toString
-    classBTypeFromInternalName.getOrElse(internalName, {
-      // The new ClassBType is added to the map in its constructor, before we set its info. This
-      // allows initializing cyclic dependencies, see the comment on variable ClassBType._info.
-      setClassInfo(classSym, ClassBType(internalName))
-    })
+  /**
+   * Builds a [[MethodBType]] for a method symbol.
+   */
+  final def methodBTypeFromSymbol(methodSymbol: Symbol): MethodBType = {
+    assert(methodSymbol.isMethod, s"not a method-symbol: $methodSymbol")
+    val resultType: BType =
+      if (methodSymbol.isClassConstructor || methodSymbol.isConstructor) UNIT
+      else typeToBType(methodSymbol.tpe.resultType)
+    MethodBType(methodSymbol.tpe.paramTypes map typeToBType, resultType)
+  }
+
+  /**
+   * This method returns the BType for a type reference, for example a parameter type.
+   *
+   * If `t` references a class, typeToBType ensures that the class is not an implementation class.
+   * See also comment on classBTypeFromSymbol, which is invoked for implementation classes.
+   */
+  final def typeToBType(t: Type): BType = {
+    import definitions.ArrayClass
+
+    /**
+     * Primitive types are represented as TypeRefs to the class symbol of, for example, scala.Int.
+     * The `primitiveTypeMap` maps those class symbols to the corresponding PrimitiveBType.
+     */
+    def primitiveOrClassToBType(sym: Symbol): BType = {
+      assertClassNotArray(sym)
+      assert(!sym.isImplClass, sym)
+      primitiveTypeMap.getOrElse(sym, classBTypeFromSymbol(sym))
+    }
+
+    /**
+     * When compiling Array.scala, the type parameter T is not erased and shows up in method
+     * signatures, e.g. `def apply(i: Int): T`. A TyperRef to T is replaced by ObjectReference.
+     */
+    def nonClassTypeRefToBType(sym: Symbol): ClassBType = {
+      assert(sym.isType && isCompilingArray, sym)
+      ObjectReference
+    }
+
+    t.dealiasWiden match {
+      case TypeRef(_, ArrayClass, List(arg))  => ArrayBType(typeToBType(arg)) // Array type such as Array[Int] (kept by erasure)
+      case TypeRef(_, sym, _) if !sym.isClass => nonClassTypeRefToBType(sym)  // See comment on nonClassTypeRefToBType
+      case TypeRef(_, sym, _)                 => primitiveOrClassToBType(sym) // Common reference to a type such as scala.Int or java.lang.String
+      case ClassInfoType(_, _, sym)           => primitiveOrClassToBType(sym) // We get here, for example, for genLoadModule, which invokes typeToBType(moduleClassSymbol.info)
+
+      /* AnnotatedType should (probably) be eliminated by erasure. However we know it happens for
+       * meta-annotated annotations (@(ann @getter) val x = 0), so we don't emit a warning.
+       * The type in the AnnotationInfo is an AnnotatedTpe. Tested in jvm/annotations.scala.
+       */
+      case a @ AnnotatedType(_, t) =>
+        debuglog(s"typeKind of annotated type $a")
+        typeToBType(t)
+
+      /* ExistentialType should (probably) be eliminated by erasure. We know they get here for
+       * classOf constants:
+       *   class C[T]
+       *   class T { final val k = classOf[C[_]] }
+       */
+      case e @ ExistentialType(_, t) =>
+        debuglog(s"typeKind of existential type $e")
+        typeToBType(t)
+
+      /* The cases below should probably never occur. They are kept for now to avoid introducing
+       * new compiler crashes, but we added a warning. The compiler / library bootstrap and the
+       * test suite don't produce any warning.
+       */
+
+      case tp =>
+        currentUnit.warning(tp.typeSymbol.pos,
+          s"an unexpected type representation reached the compiler backend while compiling $currentUnit: $tp. " +
+            "If possible, please file a bug on issues.scala-lang.org.")
+
+        tp match {
+          case ThisType(ArrayClass)               => ObjectReference // was introduced in 9b17332f11 to fix SI-999, but this code is not reached in its test, or any other test
+          case ThisType(sym)                      => classBTypeFromSymbol(sym)
+          case SingleType(_, sym)                 => primitiveOrClassToBType(sym)
+          case ConstantType(_)                    => typeToBType(t.underlying)
+          case RefinedType(parents, _)            => parents.map(typeToBType(_).asClassBType).reduceLeft((a, b) => a.jvmWiseLUB(b).get)
+        }
+    }
+  }
+
+  def assertClassNotArray(sym: Symbol): Unit = {
+    assert(sym.isClass, sym)
+    assert(sym != definitions.ArrayClass || isCompilingArray, sym)
+  }
+
+  def assertClassNotArrayNotPrimitive(sym: Symbol): Unit = {
+    assertClassNotArray(sym)
+    assert(!primitiveTypeMap.contains(sym) || isCompilingPrimitive, sym)
   }
 
   private def setClassInfo(classSym: Symbol, classBType: ClassBType): ClassBType = {
-    val superClassSym = if (classSym.isImplClass) ObjectClass else classSym.superClass
+    // Check for isImplClass: trait implementation classes have NoSymbol as superClass
+    // Check for hasAnnotationFlag for SI-9393: the classfile / java source parsers add
+    // scala.annotation.Annotation as superclass to java annotations. In reality, java
+    // annotation classfiles have superclass Object (like any interface classfile).
+    val superClassSym = if (classSym.isImplClass || classSym.hasJavaAnnotationFlag) ObjectClass else {
+      val sc = classSym.superClass
+      // SI-9393: Java annotation classes don't have the ABSTRACT/INTERFACE flag, so they appear
+      // (wrongly) as superclasses. Fix this for BTypes: the java annotation will appear as interface
+      // (handled by method implementedInterfaces), the superclass is set to Object.
+      if (sc.hasJavaAnnotationFlag) ObjectClass
+      else sc
+    }
     assert(
       if (classSym == ObjectClass)
         superClassSym == NoSymbol
@@ -111,7 +243,10 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
 
     val interfaces = implementedInterfaces(classSym).map(classBTypeFromSymbol)
 
-    val flags = javaFlags(classSym)
+    val flags = {
+      if (classSym.isJava) javaClassfileFlags(classSym) // see comment on javaClassfileFlags
+      else javaFlags(classSym)
+    }
 
     /* The InnerClass table of a class C must contain all nested classes of C, even if they are only
      * declared but not otherwise referenced in C (from the bytecode or a method / field signature).
@@ -171,7 +306,7 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
         val javaCompatMembers = {
           if (linkedClass != NoSymbol && isTopLevelModuleClass(linkedClass))
           // phase travel to exitingPickler: this makes sure that memberClassesForInnerClassTable only sees member
-          // classes, not local classes of the companion module (E in the exmaple) that were lifted by lambdalift.
+          // classes, not local classes of the companion module (E in the example) that were lifted by lambdalift.
             exitingPickler(memberClassesForInnerClassTable(linkedClass))
           else
             Nil
@@ -215,7 +350,9 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
 
     val nestedInfo = buildNestedInfo(classSym)
 
-    classBType.info = ClassInfo(superClass, interfaces, flags, nestedClasses, nestedInfo)
+    val inlineInfo = buildInlineInfo(classSym, classBType.internalName)
+
+    classBType.info = Right(ClassInfo(superClass, interfaces, flags, nestedClasses, nestedInfo, inlineInfo))
     classBType
   }
 
@@ -225,11 +362,19 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
     val isTopLevel = innerClassSym.rawowner.isPackageClass
     // impl classes are considered top-level, see comment in BTypes
     if (isTopLevel || considerAsTopLevelImplementationArtifact(innerClassSym)) None
-    else {
+    else if (innerClassSym.rawowner.isTerm) {
+      // This case should never be reached: the lambdalift phase mutates the rawowner field of all
+      // classes to be the enclosing class. SI-9392 shows an errant macro that leaves a reference
+      // to a local class symbol that no longer exists, which is not updated by lambdalift.
+      devWarning(innerClassSym.pos,
+        s"""The class symbol $innerClassSym with the term symbol ${innerClassSym.rawowner} as `rawowner` reached the backend.
+           |Most likely this indicates a stale reference to a non-existing class introduced by a macro, see SI-9392.""".stripMargin)
+      None
+    } else {
       // See comment in BTypes, when is a class marked static in the InnerClass table.
       val isStaticNestedClass = isOriginallyStaticOwner(innerClassSym.originalOwner)
 
-      // After lambdalift (which is where we are), the rawowoner field contains the enclosing class.
+      // After lambdalift (which is where we are), the rawowner field contains the enclosing class.
       val enclosingClass = {
         // (1) Example java source: class C { static class D { } }
         // The Scala compiler creates a class and a module symbol for C. Because D is a static
@@ -271,6 +416,40 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
   }
 
   /**
+   * Build the InlineInfo for a ClassBType from the class symbol.
+   *
+   * Note that the InlineInfo is only built from the symbolic information for classes that are being
+   * compiled. For all other classes we delegate to inlineInfoFromClassfile. The reason is that
+   * mixed-in methods are only added to class symbols being compiled, but not to other classes
+   * extending traits. Creating the InlineInfo from the symbol would prevent these mixins from being
+   * inlined.
+   *
+   * So for classes being compiled, the InlineInfo is created here and stored in the ScalaInlineInfo
+   * classfile attribute.
+   */
+  private def buildInlineInfo(classSym: Symbol, internalName: InternalName): InlineInfo = {
+    def buildFromSymbol = buildInlineInfoFromClassSymbol(classSym, classBTypeFromSymbol(_).internalName, methodBTypeFromSymbol(_).descriptor)
+
+    // phase travel required, see implementation of `compiles`. for nested classes, it checks if the
+    // enclosingTopLevelClass is being compiled. after flatten, all classes are considered top-level,
+    // so `compiles` would return `false`.
+    if (exitingPickler(currentRun.compiles(classSym))) buildFromSymbol    // InlineInfo required for classes being compiled, we have to create the classfile attribute
+    else if (!compilerSettings.YoptInlinerEnabled) BTypes.EmptyInlineInfo // For other classes, we need the InlineInfo only inf the inliner is enabled.
+    else {
+      // For classes not being compiled, the InlineInfo is read from the classfile attribute. This
+      // fixes an issue with mixed-in methods: the mixin phase enters mixin methods only to class
+      // symbols being compiled. For non-compiled classes, we could not build MethodInlineInfos
+      // for those mixin members, which prevents inlining.
+      byteCodeRepository.classNode(internalName) match {
+        case Right(classNode) =>
+          inlineInfoFromClassfile(classNode)
+        case Left(missingClass) =>
+          InlineInfo(None, false, Map.empty, Some(ClassNotFoundWhenBuildingInlineInfoFromSymbol(missingClass)))
+      }
+    }
+  }
+
+  /**
    * For top-level objects without a companion class, the compilere generates a mirror class with
    * static forwarders (Java compat). There's no symbol for the mirror class, but we still need a
    * ClassBType (its info.nestedClasses will hold the InnerClass entries, see comment in BTypes).
@@ -282,13 +461,13 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
       val c = ClassBType(internalName)
       // class info consistent with BCodeHelpers.genMirrorClass
       val nested = exitingPickler(memberClassesForInnerClassTable(moduleClassSym)) map classBTypeFromSymbol
-      c.info = ClassInfo(
+      c.info = Right(ClassInfo(
         superClass = Some(ObjectReference),
         interfaces = Nil,
         flags = asm.Opcodes.ACC_SUPER | asm.Opcodes.ACC_PUBLIC | asm.Opcodes.ACC_FINAL,
         nestedClasses = nested,
-        nestedInfo = None
-      )
+        nestedInfo = None,
+        InlineInfo(None, true, Map.empty, None))) // no InlineInfo needed, scala never invokes methods on the mirror class
       c
     })
   }
@@ -322,8 +501,8 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
   }
 
   // legacy, to be removed when the @remote annotation gets removed
-  final def isRemote(s: Symbol) = (s hasAnnotation definitions.RemoteAttr)
-  final def hasPublicBitSet(flags: Int) = ((flags & asm.Opcodes.ACC_PUBLIC) != 0)
+  final def isRemote(s: Symbol) = s hasAnnotation definitions.RemoteAttr
+  final def hasPublicBitSet(flags: Int) = (flags & asm.Opcodes.ACC_PUBLIC) != 0
 
   /**
    * Return the Java modifiers for the given symbol.
@@ -399,7 +578,7 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
       if (sym.isBridge) ACC_BRIDGE | ACC_SYNTHETIC else 0,
       if (sym.isArtifact) ACC_SYNTHETIC else 0,
       if (sym.isClass && !sym.isInterface) ACC_SUPER else 0,
-      if (sym.hasEnumFlag) ACC_ENUM else 0,
+      if (sym.hasJavaEnumFlag) ACC_ENUM else 0,
       if (sym.isVarargsMethod) ACC_VARARGS else 0,
       if (sym.hasFlag(symtab.Flags.SYNCHRONIZED)) ACC_SYNCHRONIZED else 0,
       if (sym.isDeprecated) asm.Opcodes.ACC_DEPRECATED else 0
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BackendReporting.scala b/src/compiler/scala/tools/nsc/backend/jvm/BackendReporting.scala
new file mode 100644
index 0000000..b41d0de
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BackendReporting.scala
@@ -0,0 +1,306 @@
+package scala.tools.nsc
+package backend.jvm
+
+import scala.tools.asm.tree.{InvokeDynamicInsnNode, AbstractInsnNode, MethodNode}
+import scala.tools.nsc.backend.jvm.BTypes.InternalName
+import scala.reflect.internal.util.Position
+import scala.tools.nsc.settings.ScalaSettings
+import scala.util.control.ControlThrowable
+
+/**
+ * Interface for emitting inline warnings. The interface is required because the implementation
+ * depends on Global, which is not available in BTypes (only in BTypesFromSymbols).
+ */
+sealed abstract class BackendReporting {
+  def inlinerWarning(pos: Position, message: String): Unit
+}
+
+final class BackendReportingImpl(val global: Global) extends BackendReporting {
+  import global._
+
+  def inlinerWarning(pos: Position, message: String): Unit = {
+    currentRun.reporting.inlinerWarning(pos, message)
+  }
+}
+
+/**
+ * Utilities for error reporting.
+ *
+ * Defines some tools to make error reporting with Either easier. Would be subsumed by a right-biased
+ * Either in the standard library (or scalaz \/) (Validation is different, it accumulates multiple
+ * errors).
+ */
+object BackendReporting {
+  def methodSignature(classInternalName: InternalName, name: String, desc: String) = {
+    classInternalName + "::" + name + desc
+  }
+
+  def methodSignature(classInternalName: InternalName, method: MethodNode): String = {
+    methodSignature(classInternalName, method.name, method.desc)
+  }
+
+  def assertionError(message: String): Nothing = throw new AssertionError(message)
+
+  implicit class RightBiasedEither[A, B](val v: Either[A, B]) extends AnyVal {
+    def map[U](f: B => U) = v.right.map(f)
+    def flatMap[BB](f: B => Either[A, BB]) = v.right.flatMap(f)
+    def filter(f: B => Boolean)(implicit empty: A): Either[A, B] = v match {
+      case Left(_)  => v
+      case Right(e) => if (f(e)) v else Left(empty) // scalaz.\/ requires an implicit Monoid m to get m.empty
+    }
+    def foreach[U](f: B => U) = v.right.foreach(f)
+
+    def getOrElse[BB >: B](alt: => BB): BB = v.right.getOrElse(alt)
+
+    /**
+     * Get the value, fail with an assertion if this is an error.
+     */
+    def get: B = {
+      assert(v.isRight, v.left.get)
+      v.right.get
+    }
+
+    /**
+     * Get the right value of an `Either` by throwing a potential error message. Can simplify the
+     * implementation of methods that act on multiple `Either` instances. Instead of flat-mapping,
+     * the first error can be collected as
+     *
+     *     tryEither {
+     *       eitherOne.orThrow .... eitherTwo.orThrow ... eitherThree.orThrow
+     *     }
+     */
+    def orThrow: B = v match {
+      case Left(m)  => throw Invalid(m)
+      case Right(t) => t
+    }
+  }
+
+  case class Invalid[A](e: A) extends ControlThrowable
+
+  /**
+   * See documentation of orThrow above.
+   */
+  def tryEither[A, B](op: => Either[A, B]): Either[A, B] = try { op } catch { case Invalid(e) => Left(e.asInstanceOf[A]) }
+
+  sealed trait OptimizerWarning {
+    def emitWarning(settings: ScalaSettings): Boolean
+  }
+
+  // Method filter in RightBiasedEither requires an implicit empty value. Taking the value here
+  // in scope allows for-comprehensions that desugar into filter calls (for example when using a
+  // tuple de-constructor).
+  implicit object emptyOptimizerWarning extends OptimizerWarning {
+    def emitWarning(settings: ScalaSettings): Boolean = false
+  }
+
+  sealed trait MissingBytecodeWarning extends OptimizerWarning {
+    override def toString = this match {
+      case ClassNotFound(internalName, definedInJavaSource) =>
+        s"The classfile for $internalName could not be found on the compilation classpath." + {
+          if (definedInJavaSource) "\nThe class is defined in a Java source file that is being compiled (mixed compilation), therefore no bytecode is available."
+          else ""
+        }
+
+      case MethodNotFound(name, descriptor, ownerInternalName, missingClasses) =>
+        val (javaDef, others) = missingClasses.partition(_.definedInJavaSource)
+        s"The method $name$descriptor could not be found in the class $ownerInternalName or any of its parents." +
+          (if (others.isEmpty) "" else others.map(_.internalName).mkString("\nNote that the following parent classes could not be found on the classpath: ", ", ", "")) +
+          (if (javaDef.isEmpty) "" else javaDef.map(_.internalName).mkString("\nNote that the following parent classes are defined in Java sources (mixed compilation), no bytecode is available: ", ",", ""))
+
+      case FieldNotFound(name, descriptor, ownerInternalName, missingClass) =>
+        s"The field node $name$descriptor could not be found because the classfile $ownerInternalName cannot be found on the classpath." +
+          missingClass.map(c => s" Reason:\n$c").getOrElse("")
+    }
+
+    def emitWarning(settings: ScalaSettings): Boolean = this match {
+      case ClassNotFound(_, javaDefined) =>
+        if (javaDefined) settings.YoptWarningNoInlineMixed
+        else settings.YoptWarningNoInlineMissingBytecode
+
+      case m @ MethodNotFound(_, _, _, missing) =>
+        if (m.isArrayMethod) false
+        else settings.YoptWarningNoInlineMissingBytecode || missing.exists(_.emitWarning(settings))
+
+      case FieldNotFound(_, _, _, missing) =>
+        settings.YoptWarningNoInlineMissingBytecode || missing.exists(_.emitWarning(settings))
+    }
+  }
+
+  case class ClassNotFound(internalName: InternalName, definedInJavaSource: Boolean) extends MissingBytecodeWarning
+  case class MethodNotFound(name: String, descriptor: String, ownerInternalNameOrArrayDescriptor: InternalName, missingClasses: List[ClassNotFound]) extends MissingBytecodeWarning {
+    def isArrayMethod = ownerInternalNameOrArrayDescriptor.charAt(0) == '['
+  }
+  case class FieldNotFound(name: String, descriptor: String, ownerInternalName: InternalName, missingClass: Option[ClassNotFound]) extends MissingBytecodeWarning
+
+  sealed trait NoClassBTypeInfo extends OptimizerWarning {
+    override def toString = this match {
+      case NoClassBTypeInfoMissingBytecode(cause) =>
+        cause.toString
+
+      case NoClassBTypeInfoClassSymbolInfoFailedSI9111(classFullName) =>
+        s"Failed to get the type of class symbol $classFullName due to SI-9111."
+    }
+
+    def emitWarning(settings: ScalaSettings): Boolean = this match {
+      case NoClassBTypeInfoMissingBytecode(cause)         => cause.emitWarning(settings)
+      case NoClassBTypeInfoClassSymbolInfoFailedSI9111(_) => settings.YoptWarningNoInlineMissingBytecode
+    }
+  }
+
+  case class NoClassBTypeInfoMissingBytecode(cause: MissingBytecodeWarning) extends NoClassBTypeInfo
+  case class NoClassBTypeInfoClassSymbolInfoFailedSI9111(classFullName: String) extends NoClassBTypeInfo
+
+  /**
+   * Used in the CallGraph for nodes where an issue occurred determining the callee information.
+   */
+  sealed trait CalleeInfoWarning extends OptimizerWarning {
+    def declarationClass: InternalName
+    def name: String
+    def descriptor: String
+
+    def warningMessageSignature = BackendReporting.methodSignature(declarationClass, name, descriptor)
+
+    override def toString = this match {
+      case MethodInlineInfoIncomplete(_, _, _, cause) =>
+        s"The inline information for $warningMessageSignature may be incomplete:\n" + cause
+
+      case MethodInlineInfoMissing(_, _, _, cause) =>
+        s"No inline information for method $warningMessageSignature could be found." +
+          cause.map(" Possible reason:\n" + _).getOrElse("")
+
+      case MethodInlineInfoError(_, _, _, cause) =>
+        s"Error while computing the inline information for method $warningMessageSignature:\n" + cause
+
+      case RewriteTraitCallToStaticImplMethodFailed(_, _, _, cause) =>
+        cause.toString
+    }
+
+    def emitWarning(settings: ScalaSettings): Boolean = this match {
+      case MethodInlineInfoIncomplete(_, _, _, cause)               => cause.emitWarning(settings)
+
+      case MethodInlineInfoMissing(_, _, _, Some(cause))            => cause.emitWarning(settings)
+      case MethodInlineInfoMissing(_, _, _, None)                   => settings.YoptWarningNoInlineMissingBytecode
+
+      case MethodInlineInfoError(_, _, _, cause)                    => cause.emitWarning(settings)
+
+      case RewriteTraitCallToStaticImplMethodFailed(_, _, _, cause) => cause.emitWarning(settings)
+    }
+  }
+
+  case class MethodInlineInfoIncomplete(declarationClass: InternalName, name: String, descriptor: String, cause: ClassInlineInfoWarning) extends CalleeInfoWarning
+  case class MethodInlineInfoMissing(declarationClass: InternalName, name: String, descriptor: String, cause: Option[ClassInlineInfoWarning]) extends CalleeInfoWarning
+  case class MethodInlineInfoError(declarationClass: InternalName, name: String, descriptor: String, cause: NoClassBTypeInfo) extends CalleeInfoWarning
+  case class RewriteTraitCallToStaticImplMethodFailed(declarationClass: InternalName, name: String, descriptor: String, cause: OptimizerWarning) extends CalleeInfoWarning
+
+  sealed trait CannotInlineWarning extends OptimizerWarning {
+    def calleeDeclarationClass: InternalName
+    def name: String
+    def descriptor: String
+
+    def calleeMethodSig = BackendReporting.methodSignature(calleeDeclarationClass, name, descriptor)
+
+    override def toString = this match {
+      case IllegalAccessInstruction(_, _, _, callsiteClass, instruction) =>
+        s"The callee $calleeMethodSig contains the instruction ${AsmUtils.textify(instruction)}" +
+          s"\nthat would cause an IllegalAccessError when inlined into class $callsiteClass."
+
+      case IllegalAccessCheckFailed(_, _, _, callsiteClass, instruction, cause) =>
+        s"Failed to check if $calleeMethodSig can be safely inlined to $callsiteClass without causing an IllegalAccessError. Checking instruction ${AsmUtils.textify(instruction)} failed:\n" + cause
+
+      case MethodWithHandlerCalledOnNonEmptyStack(_, _, _, callsiteClass, callsiteName, callsiteDesc) =>
+        s"""The operand stack at the callsite in ${BackendReporting.methodSignature(callsiteClass, callsiteName, callsiteDesc)} contains more values than the
+           |arguments expected by the callee $calleeMethodSig. These values would be discarded
+           |when entering an exception handler declared in the inlined method.""".stripMargin
+
+      case SynchronizedMethod(_, _, _) =>
+        s"Method $calleeMethodSig cannot be inlined because it is synchronized."
+
+      case StrictfpMismatch(_, _, _, callsiteClass, callsiteName, callsiteDesc) =>
+        s"""The callsite method ${BackendReporting.methodSignature(callsiteClass, callsiteName, callsiteDesc)}
+           |does not have the same strictfp mode as the callee $calleeMethodSig.
+         """.stripMargin
+
+      case ResultingMethodTooLarge(_, _, _, callsiteClass, callsiteName, callsiteDesc) =>
+        s"""The size of the callsite method ${BackendReporting.methodSignature(callsiteClass, callsiteName, callsiteDesc)}
+           |would exceed the JVM method size limit after inlining $calleeMethodSig.
+         """.stripMargin
+    }
+
+    def emitWarning(settings: ScalaSettings): Boolean = this match {
+      case _: IllegalAccessInstruction | _: MethodWithHandlerCalledOnNonEmptyStack | _: SynchronizedMethod | _: StrictfpMismatch | _: ResultingMethodTooLarge =>
+        settings.YoptWarningEmitAtInlineFailed
+
+      case IllegalAccessCheckFailed(_, _, _, _, _, cause) =>
+        cause.emitWarning(settings)
+    }
+  }
+  case class IllegalAccessInstruction(calleeDeclarationClass: InternalName, name: String, descriptor: String,
+                                      callsiteClass: InternalName, instruction: AbstractInsnNode) extends CannotInlineWarning
+  case class IllegalAccessCheckFailed(calleeDeclarationClass: InternalName, name: String, descriptor: String,
+                                      callsiteClass: InternalName, instruction: AbstractInsnNode, cause: OptimizerWarning) extends CannotInlineWarning
+  case class MethodWithHandlerCalledOnNonEmptyStack(calleeDeclarationClass: InternalName, name: String, descriptor: String,
+                                                    callsiteClass: InternalName, callsiteName: String, callsiteDesc: String) extends CannotInlineWarning
+  case class SynchronizedMethod(calleeDeclarationClass: InternalName, name: String, descriptor: String) extends CannotInlineWarning
+  case class StrictfpMismatch(calleeDeclarationClass: InternalName, name: String, descriptor: String,
+                              callsiteClass: InternalName, callsiteName: String, callsiteDesc: String) extends CannotInlineWarning
+  case class ResultingMethodTooLarge(calleeDeclarationClass: InternalName, name: String, descriptor: String,
+                                     callsiteClass: InternalName, callsiteName: String, callsiteDesc: String) extends CannotInlineWarning
+
+  case object UnknownInvokeDynamicInstruction extends OptimizerWarning {
+    override def toString = "The callee contains an InvokeDynamic instruction with an unknown bootstrap method (not a LambdaMetaFactory)."
+    def emitWarning(settings: ScalaSettings): Boolean = settings.YoptWarningEmitAtInlineFailed
+  }
+
+  /**
+   * Used in `rewriteClosureApplyInvocations` when a closure apply callsite cannot be rewritten
+   * to the closure body method.
+   */
+  sealed trait RewriteClosureApplyToClosureBodyFailed extends OptimizerWarning {
+    def pos: Position
+
+    override def emitWarning(settings: ScalaSettings): Boolean = this match {
+      case RewriteClosureAccessCheckFailed(_, cause) => cause.emitWarning(settings)
+      case RewriteClosureIllegalAccess(_, _)         => settings.YoptWarningEmitAtInlineFailed
+    }
+
+    override def toString: String = this match {
+      case RewriteClosureAccessCheckFailed(_, cause) =>
+        s"Failed to rewrite the closure invocation to its implementation method:\n" + cause
+      case RewriteClosureIllegalAccess(_, callsiteClass) =>
+        s"The closure body invocation cannot be rewritten because the target method is not accessible in class $callsiteClass."
+    }
+  }
+  case class RewriteClosureAccessCheckFailed(pos: Position, cause: OptimizerWarning) extends RewriteClosureApplyToClosureBodyFailed
+  case class RewriteClosureIllegalAccess(pos: Position, callsiteClass: InternalName) extends RewriteClosureApplyToClosureBodyFailed
+
+  /**
+   * Used in the InlineInfo of a ClassBType, when some issue occurred obtaining the inline information.
+   */
+  sealed trait ClassInlineInfoWarning extends OptimizerWarning {
+    override def toString = this match {
+      case NoInlineInfoAttribute(internalName) =>
+        s"The Scala classfile $internalName does not have a ScalaInlineInfo attribute."
+
+      case ClassSymbolInfoFailureSI9111(classFullName) =>
+        s"Failed to get the type of a method of class symbol $classFullName due to SI-9111."
+
+      case ClassNotFoundWhenBuildingInlineInfoFromSymbol(missingClass) =>
+        s"Failed to build the inline information: $missingClass."
+
+      case UnknownScalaInlineInfoVersion(internalName, version) =>
+        s"Cannot read ScalaInlineInfo version $version in classfile $internalName. Use a more recent compiler."
+    }
+
+    def emitWarning(settings: ScalaSettings): Boolean = this match {
+      case NoInlineInfoAttribute(_)                             => settings.YoptWarningNoInlineMissingScalaInlineInfoAttr
+      case ClassNotFoundWhenBuildingInlineInfoFromSymbol(cause) => cause.emitWarning(settings)
+      case ClassSymbolInfoFailureSI9111(_)                      => settings.YoptWarningNoInlineMissingBytecode
+      case UnknownScalaInlineInfoVersion(_, _)                  => settings.YoptWarningNoInlineMissingScalaInlineInfoAttr
+    }
+  }
+
+  case class NoInlineInfoAttribute(internalName: InternalName) extends ClassInlineInfoWarning
+  case class ClassSymbolInfoFailureSI9111(classFullName: String) extends ClassInlineInfoWarning
+  case class ClassNotFoundWhenBuildingInlineInfoFromSymbol(missingClass: ClassNotFound) extends ClassInlineInfoWarning
+  case class UnknownScalaInlineInfoVersion(internalName: InternalName, version: Int) extends ClassInlineInfoWarning
+}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala b/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala
index 246235f..00ca096 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/CoreBTypes.scala
@@ -99,10 +99,9 @@ class CoreBTypes[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes: BTFS) {
    *
    * Therefore, when RT_NOTHING or RT_NULL are to be emitted, a mapping is needed: the internal
    * names of NothingClass and NullClass can't be emitted as-is.
-   * TODO @lry Once there's a 2.11.3 starr, use the commented argument list. The current starr crashes on the type literal `scala.runtime.Nothing$`
    */
-  lazy val RT_NOTHING : ClassBType = classBTypeFromSymbol(rootMirror.getRequiredClass("scala.runtime.Nothing$")) // (requiredClass[scala.runtime.Nothing$])
-  lazy val RT_NULL    : ClassBType = classBTypeFromSymbol(rootMirror.getRequiredClass("scala.runtime.Null$"))    // (requiredClass[scala.runtime.Null$])
+  lazy val RT_NOTHING : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.Nothing$])
+  lazy val RT_NULL    : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.Null$])
 
   lazy val ObjectReference   : ClassBType = classBTypeFromSymbol(ObjectClass)
   lazy val objArrayReference : ArrayBType = ArrayBType(ObjectReference)
@@ -115,6 +114,8 @@ class CoreBTypes[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes: BTFS) {
   lazy val jioSerializableReference    : ClassBType = classBTypeFromSymbol(JavaSerializableClass)     // java/io/Serializable
   lazy val scalaSerializableReference  : ClassBType = classBTypeFromSymbol(SerializableClass)         // scala/Serializable
   lazy val classCastExceptionReference : ClassBType = classBTypeFromSymbol(ClassCastExceptionClass)   // java/lang/ClassCastException
+  lazy val javaUtilMapReference        : ClassBType = classBTypeFromSymbol(JavaUtilMap)               // java/util/Map
+  lazy val javaUtilHashMapReference    : ClassBType = classBTypeFromSymbol(JavaUtilHashMap)           // java/util/HashMap
 
   lazy val srBooleanRef : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.BooleanRef])
   lazy val srByteRef    : ClassBType = classBTypeFromSymbol(requiredClass[scala.runtime.ByteRef])
@@ -259,6 +260,8 @@ final class CoreBTypesProxy[BTFS <: BTypesFromSymbols[_ <: Global]](val bTypes:
   def jioSerializableReference    : ClassBType = _coreBTypes.jioSerializableReference
   def scalaSerializableReference  : ClassBType = _coreBTypes.scalaSerializableReference
   def classCastExceptionReference : ClassBType = _coreBTypes.classCastExceptionReference
+  def javaUtilMapReference        : ClassBType = _coreBTypes.javaUtilMapReference
+  def javaUtilHashMapReference    : ClassBType = _coreBTypes.javaUtilHashMapReference
 
   def srBooleanRef : ClassBType = _coreBTypes.srBooleanRef
   def srByteRef    : ClassBType = _coreBTypes.srByteRef
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
index 707336e..4768417 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
@@ -9,6 +9,7 @@ package backend.jvm
 
 import scala.collection.{ mutable, immutable }
 import scala.reflect.internal.pickling.{ PickleFormat, PickleBuffer }
+import scala.tools.nsc.backend.jvm.opt.InlineInfoAttribute
 import scala.tools.nsc.symtab._
 import scala.tools.asm
 import asm.Label
@@ -306,7 +307,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
       if (sym.isBridge) ACC_BRIDGE | ACC_SYNTHETIC else 0,
       if (sym.isArtifact) ACC_SYNTHETIC else 0,
       if (sym.isClass && !sym.isInterface) ACC_SUPER else 0,
-      if (sym.hasEnumFlag) ACC_ENUM else 0,
+      if (sym.hasJavaEnumFlag) ACC_ENUM else 0,
       if (sym.isVarargsMethod) ACC_VARARGS else 0,
       if (sym.hasFlag(Flags.SYNCHRONIZED)) ACC_SYNCHRONIZED else 0
     )
@@ -478,10 +479,6 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
     val CLASS_CONSTRUCTOR_NAME    = "<clinit>"
     val INSTANCE_CONSTRUCTOR_NAME = "<init>"
 
-    val INNER_CLASSES_FLAGS =
-      (asm.Opcodes.ACC_PUBLIC    | asm.Opcodes.ACC_PRIVATE | asm.Opcodes.ACC_PROTECTED |
-       asm.Opcodes.ACC_STATIC    | asm.Opcodes.ACC_INTERFACE | asm.Opcodes.ACC_ABSTRACT | asm.Opcodes.ACC_FINAL)
-
     // -----------------------------------------------------------------------------------------
     // factory methods
     // -----------------------------------------------------------------------------------------
@@ -498,8 +495,8 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
      *        generic classes or interfaces.
      *
      * @param superName the internal of name of the super class. For interfaces,
-     *        the super class is {@link Object}. May be <tt>null</tt>, but
-     *        only for the {@link Object} class.
+     *        the super class is [[Object]]. May be <tt>null</tt>, but
+     *        only for the [[Object]] class.
      *
      * @param interfaces the internal names of the class's interfaces (see
      *        {@link Type#getInternalName() getInternalName}). May be
@@ -532,9 +529,13 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
         }
         bytecodeWriter.writeClass(label, jclassName, arr, outF)
       } catch {
-        case e: java.lang.RuntimeException if e != null && (e.getMessage contains "too large!") =>
+        case e: java.lang.RuntimeException if e.getMessage != null && (e.getMessage contains "too large!") =>
           reporter.error(sym.pos,
             s"Could not write class $jclassName because it exceeds JVM code size limits. ${e.getMessage}")
+        case e: java.io.IOException if e.getMessage != null && (e.getMessage contains "File name too long")  =>
+          reporter.error(sym.pos, e.getMessage + "\n" +
+            "This can happen on some encrypted or legacy file systems.  Please see SI-3623 for more details.")
+
       }
     }
 
@@ -616,18 +617,16 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
         val internalName = cachedJN.toString()
         val trackedSym = jsymbol(sym)
         reverseJavaName.get(internalName) match {
-          case Some(oldsym) if oldsym.exists && trackedSym.exists =>
-            assert(
-              // In contrast, neither NothingClass nor NullClass show up bytecode-level.
-              (oldsym == trackedSym) || (oldsym == RuntimeNothingClass) || (oldsym == RuntimeNullClass) || (oldsym.isModuleClass && (oldsym.sourceModule == trackedSym.sourceModule)),
-              s"""|Different class symbols have the same bytecode-level internal name:
-                  |     name: $internalName
-                  |   oldsym: ${oldsym.fullNameString}
-                  |  tracked: ${trackedSym.fullNameString}
-              """.stripMargin
-            )
-          case _ =>
+          case None =>
             reverseJavaName.put(internalName, trackedSym)
+          case Some(oldsym) =>
+            // TODO: `duplicateOk` seems pretty ad-hoc (a more aggressive version caused SI-9356 because it called oldSym.exists, which failed in the unpickler; see also SI-5031)
+            def duplicateOk = oldsym == NoSymbol || trackedSym == NoSymbol || (syntheticCoreClasses contains oldsym) || (oldsym.isModuleClass && (oldsym.sourceModule == trackedSym.sourceModule))
+            if (oldsym != trackedSym && !duplicateOk)
+              devWarning(s"""|Different class symbols have the same bytecode-level internal name:
+                             |     name: $internalName
+                             |   oldsym: ${oldsym.fullNameString}
+                             |  tracked: ${trackedSym.fullNameString}""".stripMargin)
         }
       }
 
@@ -688,7 +687,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
           null
         else {
           val outerName = javaName(innerSym.rawowner)
-          if (isTopLevelModule(innerSym.rawowner)) "" + nme.stripModuleSuffix(newTermName(outerName))
+          if (isTopLevelModule(innerSym.rawowner)) "" + TermName(outerName).dropModule
           else outerName
         }
       }
@@ -757,9 +756,9 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
           val flagsWithFinal: Int = mkFlags(
             // See comment in BTypes, when is a class marked static in the InnerClass table.
             if (isOriginallyStaticOwner(innerSym.originalOwner)) asm.Opcodes.ACC_STATIC else 0,
-            javaFlags(innerSym),
+            (if (innerSym.isJava) javaClassfileFlags(innerSym) else javaFlags(innerSym)) & ~asm.Opcodes.ACC_STATIC,
             if(isDeprecated(innerSym)) asm.Opcodes.ACC_DEPRECATED else 0 // ASM pseudo-access flag
-          ) & (INNER_CLASSES_FLAGS | asm.Opcodes.ACC_DEPRECATED)
+          ) & (BCodeAsmCommon.INNER_CLASSES_FLAGS | asm.Opcodes.ACC_DEPRECATED)
           val flags = if (innerSym.isModuleClass) flagsWithFinal & ~asm.Opcodes.ACC_FINAL else flagsWithFinal // For SI-5676, object overriding.
           val jname = javaName(innerSym)  // never null
           val oname = outerName(innerSym) // null when method-enclosed
@@ -1292,6 +1291,9 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
       jclass.visitAttribute(if(ssa.isDefined) pickleMarkerLocal else pickleMarkerForeign)
       emitAnnotations(jclass, c.symbol.annotations ++ ssa)
 
+      if (!settings.YskipInlineInfoAttribute.value)
+        jclass.visitAttribute(InlineInfoAttribute(buildInlineInfoFromClassSymbol(c.symbol, javaName, javaType(_).getDescriptor)))
+
       // typestate: entering mode with valid call sequences:
       //   ( visitInnerClass | visitField | visitMethod )* visitEnd
 
@@ -2050,7 +2052,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
                 seen ::= LocVarEntry(lv, start, end)
               case _ =>
                 // TODO SI-6049 track down the cause for these.
-                debugwarn(s"$iPos: Visited SCOPE_EXIT before visiting corresponding SCOPE_ENTER. SI-6191")
+                devWarning(s"$iPos: Visited SCOPE_EXIT before visiting corresponding SCOPE_ENTER. SI-6191")
             }
           }
 
@@ -2420,7 +2422,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
                 // SI-6102: Determine whether eliding this JUMP results in an empty range being covered by some EH.
                 // If so, emit a NOP in place of the elided JUMP, to avoid "java.lang.ClassFormatError: Illegal exception table range"
               else if (newNormal.isJumpOnly(b) && m.exh.exists(eh => eh.covers(b))) {
-                debugwarn("Had a jump only block that wasn't collapsed")
+                devWarning("Had a jump only block that wasn't collapsed")
                 emit(asm.Opcodes.NOP)
               }
 
@@ -2698,7 +2700,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
               case CMPG =>
                 (kind: @unchecked) match {
                   case FLOAT  => emit(Opcodes.FCMPG)
-                  case DOUBLE => emit(Opcodes.DCMPL) // TODO bug? why not DCMPG? http://docs.oracle.com/javase/specs/jvms/se5.0/html/Instructions2.doc3.html
+                  case DOUBLE => emit(Opcodes.DCMPL) // TODO bug? why not DCMPG? http://docs.oracle.com/javase/specs/jvms/se6/html/Instructions2.doc3.html
 
                 }
             }
@@ -2879,8 +2881,8 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
       var fieldList = List[String]()
 
       for (f <- clasz.fields if f.symbol.hasGetter;
-	         g = f.symbol.getter(clasz.symbol);
-	         s = f.symbol.setter(clasz.symbol)
+                 g = f.symbol.getterIn(clasz.symbol);
+                 s = f.symbol.setterIn(clasz.symbol)
            if g.isPublic && !(f.symbol.name startsWith "$")
           ) {
              // inserting $outer breaks the bean
@@ -3033,7 +3035,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
      *
      *  Rationale for this normalization:
      *    test/files/run/private-inline.scala after -optimize is chock full of
-     *    BasicBlocks containing just JUMP(whereTo), where no exception handler straddles them.
+     *    BasicBlocks containing just JUMP(whereto), where no exception handler straddles them.
      *    They should be collapsed by IMethod.normalize() but aren't.
      *    That was fine in FJBG times when by the time the exception table was emitted,
      *    it already contained "anchored" labels (ie instruction offsets were known)
@@ -3132,13 +3134,13 @@ abstract class GenASM extends SubComponent with BytecodeWriters { self =>
         val (remappings, cycles) = detour partition {case (source, target) => source != target}
         for ((source, target) <- remappings) {
 		   debuglog(s"Will elide jump only block $source because it can be jumped around to get to $target.")
-		   if (m.startBlock == source) debugwarn("startBlock should have been re-wired by now")
+                   if (m.startBlock == source) devWarning("startBlock should have been re-wired by now")
         }
         val sources = remappings.keySet
         val targets = remappings.values.toSet
         val intersection = sources intersect targets
 
-        if (intersection.nonEmpty) debugwarn(s"contradiction: we seem to have some source and target overlap in blocks ${intersection.mkString}. Map was ${detour.mkString}")
+        if (intersection.nonEmpty) devWarning(s"contradiction: we seem to have some source and target overlap in blocks ${intersection.mkString}. Map was ${detour.mkString}")
 
         for ((source, _) <- cycles) {
           debuglog(s"Block $source is in a do-nothing infinite loop. Did the user write 'while(true){}'?")
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala
index d5e95c4..af962c4 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala
@@ -14,7 +14,6 @@ import scala.reflect.internal.util.Statistics
 
 import scala.tools.asm
 import scala.tools.asm.tree.ClassNode
-import scala.tools.nsc.backend.jvm.opt.LocalOpt
 
 /*
  *  Prepare in-memory representations of classfiles using the ASM Tree API, and serialize them to disk.
@@ -168,6 +167,11 @@ abstract class GenBCode extends BCodeSyncAndTry {
             )
         }
 
+        // shim for SBT, see https://github.com/sbt/sbt/issues/2076
+        // TODO put this closer to classfile writing once we have closure elimination
+        // TODO create a nicer public API to find out the correspondence between sourcefile and ultimate classfiles
+        currentUnit.icode += new icodes.IClass(cd.symbol)
+
         // -------------- mirror class, if needed --------------
         val mirrorC =
           if (isTopLevelModuleClass(claszSymbol)) {
@@ -215,13 +219,28 @@ abstract class GenBCode extends BCodeSyncAndTry {
      *          - converting the plain ClassNode to byte array and placing it on queue-3
      */
     class Worker2 {
-      lazy val localOpt = new LocalOpt(settings)
+      def runGlobalOptimizations(): Unit = {
+        import scala.collection.convert.decorateAsScala._
+        if (settings.YoptBuildCallGraph) {
+          q2.asScala foreach {
+            case Item2(_, _, plain, _, _) =>
+              // skip mirror / bean: wd don't inline into tem, and they are not used in the plain class
+              if (plain != null) callGraph.addClass(plain)
+          }
+        }
+        if (settings.YoptInlinerEnabled)
+          bTypes.inliner.runInliner()
+        if (settings.YoptClosureElimination)
+          closureOptimizer.rewriteClosureApplyInvocations()
+      }
 
       def localOptimizations(classNode: ClassNode): Unit = {
         BackendStats.timed(BackendStats.methodOptTimer)(localOpt.methodOptimizations(classNode))
       }
 
       def run() {
+        runGlobalOptimizations()
+
         while (true) {
           val item = q2.poll
           if (item.isPoison) {
@@ -269,7 +288,12 @@ abstract class GenBCode extends BCodeSyncAndTry {
 
     var arrivalPos = 0
 
-    /*
+    /**
+     * The `run` method is overridden because the backend has a different data flow than the default
+     * phase: the backend does not transform compilation units one by one, but on all units in the
+     * same run. This allows cross-unit optimizations and running some stages of the backend
+     * concurrently on multiple units.
+     *
      *  A run of the BCodePhase phase comprises:
      *
      *    (a) set-up steps (most notably supporting maps in `BCodeTypes`,
@@ -287,6 +311,10 @@ abstract class GenBCode extends BCodeSyncAndTry {
       arrivalPos = 0 // just in case
       scalaPrimitives.init()
       bTypes.initializeCoreBTypes()
+      bTypes.javaDefinedClasses.clear()
+      bTypes.javaDefinedClasses ++= currentRun.symSource collect {
+        case (sym, _) if sym.isJavaDefined => sym.javaBinaryName.toString
+      }
       Statistics.stopTimer(BackendStats.bcodeInitTimer, initStart)
 
       // initBytecodeWriter invokes fullName, thus we have to run it before the typer-dependent thread is activated.
@@ -410,4 +438,7 @@ object GenBCode {
 
   final val PublicStatic      = asm.Opcodes.ACC_PUBLIC | asm.Opcodes.ACC_STATIC
   final val PublicStaticFinal = asm.Opcodes.ACC_PUBLIC | asm.Opcodes.ACC_STATIC | asm.Opcodes.ACC_FINAL
+
+  val CLASS_CONSTRUCTOR_NAME    = "<clinit>"
+  val INSTANCE_CONSTRUCTOR_NAME = "<init>"
 }
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/analysis/AliasingFrame.scala b/src/compiler/scala/tools/nsc/backend/jvm/analysis/AliasingFrame.scala
new file mode 100644
index 0000000..7bbe1e2
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/jvm/analysis/AliasingFrame.scala
@@ -0,0 +1,251 @@
+package scala.tools.nsc
+package backend.jvm
+package analysis
+
+import scala.annotation.switch
+import scala.collection.{mutable, immutable}
+import scala.tools.asm.Opcodes
+import scala.tools.asm.tree._
+import scala.tools.asm.tree.analysis.{Analyzer, Value, Frame, Interpreter}
+import opt.BytecodeUtils._
+
+object AliasingFrame {
+  private var _idCounter: Long = 0l
+  private def nextId = { _idCounter += 1; _idCounter }
+}
+
+class AliasingFrame[V <: Value](nLocals: Int, nStack: Int) extends Frame[V](nLocals, nStack) {
+  import Opcodes._
+
+  // Auxiliary constructor required for implementing `AliasingAnalyzer.newFrame`
+  def this(src: Frame[_ <: V]) {
+    this(src.getLocals, src.getMaxStackSize)
+    init(src)
+  }
+
+  /**
+   * For each slot (entry in the `values` array of the frame), an id that uniquely represents
+   * the object stored in it. If two values have the same id, they are aliases of the same
+   * object.
+   */
+  private val aliasIds: Array[Long] = Array.fill(nLocals + nStack)(AliasingFrame.nextId)
+
+  /**
+   * The object alias id of for a value index.
+   */
+  def aliasId(entry: Int) = aliasIds(entry)
+
+  /**
+   * Returns the indices of the values array which are aliases of the object `id`.
+   */
+  def valuesWithAliasId(id: Long): Set[Int] = immutable.BitSet.empty ++ aliasIds.indices.iterator.filter(i => aliasId(i) == id)
+
+  /**
+   * The set of aliased values for a given entry in the `values` array.
+   */
+  def aliasesOf(entry: Int): Set[Int] = valuesWithAliasId(aliasIds(entry))
+
+  /**
+   * Define a new alias. For example, given
+   *   var a = this       // this, a have the same aliasId
+   * then an assignment
+   *   b = a
+   * will set the same the aliasId for `b`.
+   */
+  private def newAlias(assignee: Int, source: Int): Unit = {
+    aliasIds(assignee) = aliasIds(source)
+  }
+
+  /**
+   * An assignment
+   *   a = someUnknownValue()
+   * sets a fresh alias id for `a`.
+   * A stack value is also removed from its alias set when being consumed.
+   */
+  private def removeAlias(assignee: Int): Unit = {
+    aliasIds(assignee) = AliasingFrame.nextId
+  }
+
+  override def execute(insn: AbstractInsnNode, interpreter: Interpreter[V]): Unit = {
+    // Make the extendsion methods easier to use (otherwise we have to repeat `this`.stackTop)
+    def stackTop: Int = this.stackTop
+    def peekStack(n: Int): V = this.peekStack(n)
+
+    // the val pattern `val (p, c) = f` still allocates a tuple (https://github.com/scala-opt/scala/issues/28)
+    val prodCons = InstructionStackEffect(insn, this) // needs to be called before super.execute, see its doc
+    val consumed = prodCons._1
+    val produced = prodCons._2
+
+    super.execute(insn, interpreter)
+
+    (insn.getOpcode: @switch) match {
+      case ALOAD =>
+        newAlias(assignee = stackTop, source = insn.asInstanceOf[VarInsnNode].`var`)
+
+      case DUP =>
+        val top = stackTop
+        newAlias(assignee = top, source = top - 1)
+
+      case DUP_X1 =>
+        val top = stackTop
+        newAlias(assignee = top,     source = top - 1)
+        newAlias(assignee = top - 1, source = top - 2)
+        newAlias(assignee = top - 2, source = top)
+
+      case DUP_X2 =>
+        // Check if the second element on the stack is size 2
+        // https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.dup_x2
+        val isSize2 = peekStack(1).getSize == 2
+        val top = stackTop
+        newAlias(assignee = top,     source = top - 1)
+        newAlias(assignee = top - 1, source = top - 2)
+        if (isSize2) {
+          // Size 2 values on the stack only take one slot in the `values` array
+          newAlias(assignee = top - 2, source = top)
+        } else {
+          newAlias(assignee = top - 2, source = top - 3)
+          newAlias(assignee = top - 3, source = top)
+        }
+
+      case DUP2 =>
+        val isSize2 = peekStack(0).getSize == 2
+        val top = stackTop
+        if (isSize2) {
+          newAlias(assignee = top, source = top - 1)
+        } else {
+          newAlias(assignee = top - 1, source = top - 3)
+          newAlias(assignee = top,     source = top - 2)
+        }
+
+      case DUP2_X1 =>
+        val isSize2 = peekStack(0).getSize == 2
+        val top = stackTop
+        if (isSize2) {
+          newAlias(assignee = top,     source = top - 1)
+          newAlias(assignee = top - 1, source = top - 2)
+          newAlias(assignee = top - 2, source = top)
+        } else {
+          newAlias(assignee = top,     source = top - 2)
+          newAlias(assignee = top - 1, source = top - 3)
+          newAlias(assignee = top - 2, source = top - 4)
+          newAlias(assignee = top - 4, source = top)
+          newAlias(assignee = top - 5, source = top - 1)
+        }
+
+      case DUP2_X2 =>
+        val top = stackTop
+        // https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.dup2_x2
+        val v1isSize2 = peekStack(0).getSize == 2
+        if (v1isSize2) {
+          newAlias(assignee = top,     source = top - 1)
+          newAlias(assignee = top - 1, source = top - 2)
+          val v2isSize2 = peekStack(1).getSize == 2
+          if (v2isSize2) {
+            // Form 4
+            newAlias(assignee = top - 2, source = top)
+          } else {
+            // Form 2
+            newAlias(assignee = top - 2, source = top - 3)
+            newAlias(assignee = top - 3, source = top)
+          }
+        } else {
+          newAlias(assignee = top,     source = top - 2)
+          newAlias(assignee = top - 1, source = top - 3)
+          newAlias(assignee = top - 2, source = top - 4)
+          val v3isSize2 = peekStack(2).getSize == 2
+          if (v3isSize2) {
+            // Form 3
+            newAlias(assignee = top - 3, source = top)
+            newAlias(assignee = top - 4, source = top - 1)
+          } else {
+            // Form 1
+            newAlias(assignee = top - 3, source = top - 5)
+            newAlias(assignee = top - 4, source = top)
+            newAlias(assignee = top - 5, source = top - 1)
+          }
+        }
+
+      case SWAP =>
+        val top = stackTop
+        val idTop = aliasIds(top)
+        aliasIds(top)     = aliasIds(top - 1)
+        aliasIds(top - 1) = idTop
+
+      case opcode =>
+        if (opcode == ASTORE) {
+          // Not a separate case because we need to remove the consumed stack value from alias sets after.
+          val stackTopBefore = stackTop - produced + consumed
+          val local = insn.asInstanceOf[VarInsnNode].`var`
+          newAlias(assignee = local, source = stackTopBefore)
+          // if the value written is size 2, it overwrites the subsequent slot, which is then no
+          // longer an alias of anything. see the corresponding case in `Frame.execute`.
+          if (getLocal(local).getSize == 2)
+            removeAlias(local + 1)
+
+          // if the value at the preceding index is size 2, it is no longer valid, so we remove its
+          // aliasing. see corresponding case in `Frame.execute`
+          if (local > 0) {
+            val precedingValue = getLocal(local - 1)
+            if (precedingValue != null && precedingValue.getSize == 2)
+              removeAlias(local - 1)
+          }
+        }
+
+        // Remove consumed stack values from aliasing sets.
+        // Example: iadd
+        //  - before: local1, local2, stack1, consumed1, consumed2
+        //  - after:  local1, local2, stack1, produced1             // stackTop = 3
+        val firstConsumed = stackTop - produced + 1                 // firstConsumed = 3
+        for (i <- 0 until consumed)
+          removeAlias(firstConsumed + i)                            // remove aliases for 3 and 4
+
+        // We don't need to set the aliases ids for the produced values: the aliasIds array already
+        // contains fresh ids for non-used stack values (ensured by removeAlias).
+    }
+  }
+
+  /**
+   * Merge the AliasingFrame `other` into this AliasingFrame.
+   *
+   * Aliases that are common in both frames are kept. Example:
+   *
+   * var x, y = null
+   * if (...) {
+   *   x = a
+   *   y = a     // (x, y, a) are aliases
+   * } else {
+   *   x = a
+   *   y = b     // (x, a) and (y, b)
+   * }
+   * [...]       // (x, a)
+   */
+  override def merge(other: Frame[_ <: V], interpreter: Interpreter[V]): Boolean = {
+    val valuesChanged = super.merge(other, interpreter)
+    var aliasesChanged = false
+    val aliasingOther = other.asInstanceOf[AliasingFrame[_]]
+    for (i <- aliasIds.indices) {
+      val thisAliases = aliasesOf(i)
+      val thisNotOther = thisAliases diff (thisAliases intersect aliasingOther.aliasesOf(i))
+      if (thisNotOther.nonEmpty) {
+        aliasesChanged = true
+        thisNotOther foreach removeAlias
+      }
+    }
+    valuesChanged || aliasesChanged
+  }
+
+  override def init(src: Frame[_ <: V]): Frame[V] = {
+    super.init(src)
+    compat.Platform.arraycopy(src.asInstanceOf[AliasingFrame[_]].aliasIds, 0, aliasIds, 0, aliasIds.length)
+    this
+  }
+}
+
+/**
+ * An analyzer that uses AliasingFrames instead of bare Frames. This can be used when an analysis
+ * needs to track aliases, but doesn't require a more specific Frame subclass.
+ */
+class AliasingAnalyzer[V <: Value](interpreter: Interpreter[V]) extends Analyzer[V](interpreter) {
+  override def newFrame(nLocals: Int, nStack: Int): AliasingFrame[V] = new AliasingFrame(nLocals, nStack)
+  override def newFrame(src: Frame[_ <: V]): AliasingFrame[V] = new AliasingFrame(src)
+}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/analysis/InstructionStackEffect.scala b/src/compiler/scala/tools/nsc/backend/jvm/analysis/InstructionStackEffect.scala
new file mode 100644
index 0000000..8d8ea83
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/jvm/analysis/InstructionStackEffect.scala
@@ -0,0 +1,265 @@
+package scala.tools.nsc
+package backend.jvm
+package analysis
+
+import scala.annotation.switch
+import scala.tools.asm.Opcodes._
+import scala.tools.asm.Type
+import scala.tools.asm.tree.{MultiANewArrayInsnNode, InvokeDynamicInsnNode, MethodInsnNode, AbstractInsnNode}
+import scala.tools.asm.tree.analysis.{Frame, Value}
+import opt.BytecodeUtils._
+import collection.immutable
+
+object InstructionStackEffect {
+  private var cache: immutable.IntMap[(Int, Int)] = immutable.IntMap.empty
+  private def t(x: Int, y: Int): (Int, Int) = {
+    // x can go up to 255 (number of parameters of a method, dimensions in multianewarray) we cache
+    // x up to 10, which covers most cases and limits the cache. y doesn't go above 6 (see cases).
+    if (x > 10 || y > 6) (x, y)
+    else {
+      val key = (x << 8) + y // this would work for any x < 256
+      if (cache contains key) {
+        cache(key)
+      } else {
+        val r = (x, y)
+        cache += key -> r
+        r
+      }
+    }
+  }
+
+  /**
+   * Returns a pair with the number of stack values consumed and produced by `insn`.
+   * This method requires the `frame` to be in the state **before** executing / interpreting
+   * the `insn`.
+   */
+  def apply[V <: Value](insn: AbstractInsnNode, frame: Frame[V]): (Int, Int) = {
+    def peekStack(n: Int): V = frame.peekStack(n)
+
+    (insn.getOpcode: @switch) match {
+      // The order of opcodes is the same as in Frame.execute.
+      case NOP => t(0, 0)
+
+      case ACONST_NULL |
+           ICONST_M1 |
+           ICONST_0 |
+           ICONST_1 |
+           ICONST_2 |
+           ICONST_3 |
+           ICONST_4 |
+           ICONST_5 |
+           LCONST_0 |
+           LCONST_1 |
+           FCONST_0 |
+           FCONST_1 |
+           FCONST_2 |
+           DCONST_0 |
+           DCONST_1 |
+           BIPUSH |
+           SIPUSH |
+           LDC |
+           ILOAD |
+           LLOAD |
+           FLOAD |
+           DLOAD |
+           ALOAD => t(0, 1)
+
+      case IALOAD |
+           LALOAD |
+           FALOAD |
+           DALOAD |
+           AALOAD |
+           BALOAD |
+           CALOAD |
+           SALOAD => t(2, 1)
+
+      case ISTORE |
+           LSTORE |
+           FSTORE |
+           DSTORE |
+           ASTORE => t(1, 0)
+
+      case IASTORE |
+           LASTORE |
+           FASTORE |
+           DASTORE |
+           AASTORE |
+           BASTORE |
+           CASTORE |
+           SASTORE => t(3, 0)
+
+      case POP => t(1, 0)
+
+      case POP2 =>
+        val isSize2 = peekStack(0).getSize == 2
+        if (isSize2) t(1, 0) else t(2, 0)
+
+      case DUP => t(1, 2)
+
+      case DUP_X1 => t(2, 3)
+
+      case DUP_X2 =>
+        val isSize2 = peekStack(1).getSize == 2
+        if (isSize2) t(2, 3) else t(3, 4)
+
+      case DUP2 =>
+        val isSize2 = peekStack(0).getSize == 2
+        if (isSize2) t(1, 2) else t(2, 4)
+
+      case DUP2_X1 =>
+        val isSize2 = peekStack(0).getSize == 2
+        if (isSize2) t(2, 3) else t(3, 4)
+
+      case DUP2_X2 =>
+        val v1isSize2 = peekStack(0).getSize == 2
+        if (v1isSize2) {
+          val v2isSize2 = peekStack(1).getSize == 2
+          if (v2isSize2) t(2, 3) else t(3, 4)
+        } else {
+          val v3isSize2 = peekStack(2).getSize == 2
+          if (v3isSize2) t(3, 5) else t(4, 6)
+        }
+
+      case SWAP => t(2, 2)
+
+      case IADD |
+           LADD |
+           FADD |
+           DADD |
+           ISUB |
+           LSUB |
+           FSUB |
+           DSUB |
+           IMUL |
+           LMUL |
+           FMUL |
+           DMUL |
+           IDIV |
+           LDIV |
+           FDIV |
+           DDIV |
+           IREM |
+           LREM |
+           FREM |
+           DREM => t(2, 1)
+
+      case INEG |
+           LNEG |
+           FNEG |
+           DNEG => t(1, 1)
+
+      case ISHL |
+           LSHL |
+           ISHR |
+           LSHR |
+           IUSHR |
+           LUSHR |
+           IAND |
+           LAND |
+           IOR |
+           LOR |
+           IXOR |
+           LXOR => t(2, 1)
+
+      case IINC => t(0, 0)
+
+      case I2L |
+           I2F |
+           I2D |
+           L2I |
+           L2F |
+           L2D |
+           F2I |
+           F2L |
+           F2D |
+           D2I |
+           D2L |
+           D2F |
+           I2B |
+           I2C |
+           I2S => t(1, 1)
+
+      case LCMP |
+           FCMPL |
+           FCMPG |
+           DCMPL |
+           DCMPG => t(2, 1)
+
+      case IFEQ |
+           IFNE |
+           IFLT |
+           IFGE |
+           IFGT |
+           IFLE => t(1, 0)
+
+      case IF_ICMPEQ |
+           IF_ICMPNE |
+           IF_ICMPLT |
+           IF_ICMPGE |
+           IF_ICMPGT |
+           IF_ICMPLE |
+           IF_ACMPEQ |
+           IF_ACMPNE => t(2, 0)
+
+      case GOTO => t(0, 0)
+
+      case JSR => t(0, 1)
+
+      case RET => t(0, 0)
+
+      case TABLESWITCH |
+           LOOKUPSWITCH => t(1, 0)
+
+      case IRETURN |
+           LRETURN |
+           FRETURN |
+           DRETURN |
+           ARETURN => t(1, 0) // Frame.execute consumes one stack value
+
+      case RETURN => t(0, 0) // Frame.execute does not change the stack
+
+      case GETSTATIC => t(0, 1)
+
+      case PUTSTATIC => t(1, 0)
+
+      case GETFIELD => t(1, 1)
+
+      case PUTFIELD => t(2, 0)
+
+      case INVOKEVIRTUAL |
+           INVOKESPECIAL |
+           INVOKESTATIC |
+           INVOKEINTERFACE =>
+        val desc = insn.asInstanceOf[MethodInsnNode].desc
+        val cons = Type.getArgumentTypes(desc).length + (if (insn.getOpcode == INVOKESTATIC) 0 else 1)
+        val prod = if (Type.getReturnType(desc) == Type.VOID_TYPE) 0 else 1
+        t(cons, prod)
+
+      case INVOKEDYNAMIC =>
+        val desc = insn.asInstanceOf[InvokeDynamicInsnNode].desc
+        val cons = Type.getArgumentTypes(desc).length
+        val prod = if (Type.getReturnType(desc) == Type.VOID_TYPE) 0 else 1
+        t(cons, prod)
+
+      case NEW => t(0, 1)
+
+      case NEWARRAY |
+           ANEWARRAY |
+           ARRAYLENGTH => t(1, 1)
+
+      case ATHROW => t(1, 0) // Frame.execute consumes one stack value
+
+      case CHECKCAST |
+           INSTANCEOF => t(1, 1) // Frame.execute does push(pop()) for both of them
+
+      case MONITORENTER |
+           MONITOREXIT => t(1, 0)
+
+      case MULTIANEWARRAY => t(insn.asInstanceOf[MultiANewArrayInsnNode].dims, 1)
+
+      case IFNULL |
+           IFNONNULL => t(1, 0)
+    }
+  }
+
+}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzer.scala b/src/compiler/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzer.scala
new file mode 100644
index 0000000..31b62f7
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzer.scala
@@ -0,0 +1,282 @@
+package scala.tools.nsc
+package backend.jvm
+package analysis
+
+import java.util
+
+import scala.annotation.switch
+import scala.tools.asm.{Type, Opcodes}
+import scala.tools.asm.tree.{MethodInsnNode, LdcInsnNode, AbstractInsnNode}
+import scala.tools.asm.tree.analysis.{Frame, Analyzer, Interpreter, Value}
+import scala.tools.nsc.backend.jvm.opt.BytecodeUtils
+import BytecodeUtils._
+
+/**
+ * Some notes on the ASM analyzer framework.
+ *
+ * Value
+ *  - Abstract, needs to be implemented for each analysis.
+ *  - Represents the desired information about local variables and stack values, for example:
+ *    - Is this value known to be null / not null?
+ *    - What are the instructions that could potentially have produced this value?
+ *
+ * Interpreter
+ *  - Abstract, needs to be implemented for each analysis. Sometimes one can subclass an existing
+ *    interpreter, e.g., SourceInterpreter or BasicInterpreter.
+ *  - Multiple abstract methods that receive an instruction and the instruction's input values, and
+ *    return a value representing the result of that instruction.
+ *    - Note: due to control flow, the interpreter can be invoked multiple times for the same
+ *      instruction, until reaching a fixed point.
+ *  - Abstract `merge` function that computes the least upper bound of two values. Used by
+ *    Frame.merge (see below).
+ *
+ * Frame
+ *  - Can be used directly for many analyses, no subclass required.
+ *  - Every frame has an array of values: one for each local variable and for each stack slot.
+ *    - A `top` index stores the index of the current stack top
+ *    - NOTE: for a size-2 local variable at index i, the local variable at i+1 is set to an empty
+ *      value. However, for a size-2 value at index i on the stack, the value at i+1 holds the next
+ *      stack value.
+ *  - Defines the `execute(instruction)` method.
+ *    - executing mutates the state of the frame according to the effect of the instruction
+ *      - pop consumed values from the stack
+ *      - pass them to the interpreter together with the instruction
+ *      - if applicable, push the resulting value on the stack
+ *  - Defines the `merge(otherFrame)` method
+ *    - called by the analyzer when multiple control flow paths lead to an instruction
+ *      - the frame at the branching instruction is merged into the current frame of the
+ *        instruction (held by the analyzer)
+ *      - mutates the values of the current frame, merges all values using interpreter.merge.
+ *
+ * Analyzer
+ *   - Stores a frame for each instruction
+ *   - `merge` function takes an instruction and a frame, merges the existing frame for that instr
+ *     (from the frames array) with the new frame passed as argument.
+ *     if the frame changed, puts the instruction on the work queue (fixpiont).
+ *   - initial frame: initialized for first instr by calling interpreter.new[...]Value
+ *     for each slot (locals and params), stored in frames[firstInstr] by calling `merge`
+ *   - work queue of instructions (`queue` array, `top` index for next instruction to analyze)
+ *   - analyze(method): simulate control flow. while work queue non-empty:
+ *     - copy the state of `frames[instr]` into a local frame `current`
+ *     - call `current.execute(instr, interpreter)`, mutating the `current` frame
+ *     - if it's a branching instruction
+ *       - for all potential destination instructions
+ *         - merge the destination instruction frame with the `current` frame
+ *           (this enqueues the destination instr if its frame changed)
+ *       - invoke `newControlFlowEdge` (see below)
+ *   - the analyzer also tracks active exception handlers at each instruction
+ *   - the empty method `newControlFlowEdge` can be overridden to track control flow if required
+ *
+ *
+ * Some notes on nullness analysis.
+ *
+ * For an instance method, `this` is non-null at entry. So we have to return a NotNull value when
+ * the analyzer is initializing the first frame of a method (see above). This required a change of
+ * the analyzer: before it would simply call `interpreter.newValue`, where we don't have the
+ * required context. See https://github.com/scala/scala-asm/commit/8133d75032.
+ *
+ * After some operations we know that a certain value is not null (e.g. the receiver of an instance
+ * call). However, the receiver is an value on the stack and consumed while interpreting the
+ * instruction - so we can only gain some knowledge if we know that the receiver was an alias of
+ * some other local variable or stack slot. Therefore we use the AliasingFrame class.
+ *
+ * TODO:
+ * Finally, we'd also like to exploit the knowledge gained from `if (x == null)` tests: x is known
+ * to be null in one branch, not null in the other. This will make use of alias tracking as well.
+ * We still have to figure out how to do this exactly in the analyzer framework.
+ */
+
+/**
+ * Type to represent nullness of values.
+ */
+sealed trait Nullness {
+  final def merge(other: Nullness) = if (this == other) this else Unknown
+}
+case object NotNull extends Nullness
+case object Unknown extends Nullness
+case object Null    extends Nullness
+
+/**
+ * Represents the nullness state for a local variable or stack value.
+ *
+ * Note that nullness of primitive values is not tracked, it will be always [[Unknown]].
+ */
+sealed trait NullnessValue extends Value {
+  /**
+   * The nullness of this value.
+   */
+  def nullness: Nullness
+
+  /**
+   * True if this value is a long or double. The Analyzer framework needs to know
+   * the size of each value when interpreting instructions, see `Frame.execute`.
+   */
+  def isSize2: Boolean
+  /**
+   * The size of the slot described by this value. Cannot be 0 because no values are allocated
+   * for void-typed slots, see NullnessInterpreter.newValue.
+   **/
+  def getSize: Int = if (isSize2) 2 else 1
+
+  def merge(other: NullnessValue) = NullnessValue(nullness merge other.nullness, isSize2)
+}
+
+object NullValue     extends NullnessValue { def nullness = Null;    def isSize2 = false; override def toString = "Null"     }
+object UnknownValue1 extends NullnessValue { def nullness = Unknown; def isSize2 = false; override def toString = "Unknown1" }
+object UnknownValue2 extends NullnessValue { def nullness = Unknown; def isSize2 = true;  override def toString = "Unknown2" }
+object NotNullValue  extends NullnessValue { def nullness = NotNull; def isSize2 = false; override def toString = "NotNull"  }
+
+object NullnessValue {
+  def apply(nullness: Nullness, isSize2: Boolean): NullnessValue = {
+    if      (nullness == Null)    NullValue
+    else if (nullness == NotNull) NotNullValue
+    else if (isSize2)             UnknownValue2
+    else                          UnknownValue1
+  }
+
+  def apply(nullness: Nullness, insn: AbstractInsnNode): NullnessValue = {
+    apply(nullness, isSize2 = BytecodeUtils.instructionResultSize(insn) == 2)
+  }
+}
+
+final class NullnessInterpreter extends Interpreter[NullnessValue](Opcodes.ASM5) {
+  def newValue(tp: Type): NullnessValue = {
+    // ASM loves giving semantics to null. The behavior here is the same as in SourceInterpreter,
+    // which is provided by the framework.
+    //
+    // (1) For the void type, the ASM framework expects newValue to return `null`.
+    //     Also, the Frame.returnValue field is `null` for methods with return type void.
+    //     Example callsite passing VOID_TYPE: in Analyzer, `newValue(Type.getReturnType(m.desc))`.
+    //
+    // (2) `tp` may also be `null`. When creating the initial frame, the analyzer invokes
+    //     `newValue(null)` for each local variable. We have to return a value of size 1.
+    if (tp == Type.VOID_TYPE) null // (1)
+    else NullnessValue(Unknown, isSize2 = tp != null /*(2)*/ && tp.getSize == 2 )
+  }
+
+  override def newParameterValue(isInstanceMethod: Boolean, local: Int, tp: Type): NullnessValue = {
+    // For instance methods, the `this` parameter is known to be not null.
+    if (isInstanceMethod && local == 0) NullnessValue(NotNull, isSize2 = false)
+    else super.newParameterValue(isInstanceMethod, local, tp)
+  }
+
+  def newOperation(insn: AbstractInsnNode): NullnessValue = {
+    val nullness = (insn.getOpcode: @switch) match {
+      case Opcodes.ACONST_NULL => Null
+
+      case Opcodes.LDC => insn.asInstanceOf[LdcInsnNode].cst match {
+        case _: String | _: Type => NotNull
+        case _ => Unknown
+      }
+
+      case _ => Unknown
+    }
+
+    // for Opcodes.NEW, we use Unknown. The value will become NotNull after the constructor call.
+    NullnessValue(nullness, insn)
+  }
+
+  def copyOperation(insn: AbstractInsnNode, value: NullnessValue): NullnessValue = value
+
+  def unaryOperation(insn: AbstractInsnNode, value: NullnessValue): NullnessValue = (insn.getOpcode: @switch) match {
+    case Opcodes.CHECKCAST => value
+
+    case Opcodes.NEWARRAY |
+         Opcodes.ANEWARRAY => NullnessValue(NotNull, isSize2 = false)
+
+    case _ => NullnessValue(Unknown, insn)
+  }
+
+  def binaryOperation(insn: AbstractInsnNode, value1: NullnessValue, value2: NullnessValue): NullnessValue = {
+    NullnessValue(Unknown, insn)
+  }
+
+  def ternaryOperation(insn: AbstractInsnNode, value1: NullnessValue, value2: NullnessValue, value3: NullnessValue): NullnessValue = {
+    NullnessValue(Unknown, isSize2 = false)
+  }
+
+  def naryOperation(insn: AbstractInsnNode, values: util.List[_ <: NullnessValue]): NullnessValue = (insn.getOpcode: @switch) match {
+    case Opcodes.MULTIANEWARRAY =>
+      NullnessValue(NotNull, isSize2 = false)
+
+    case _ =>
+      // TODO: use a list of methods that are known to return non-null values
+      NullnessValue(Unknown, insn)
+  }
+
+  def returnOperation(insn: AbstractInsnNode, value: NullnessValue, expected: NullnessValue): Unit = ()
+
+  def merge(a: NullnessValue, b: NullnessValue): NullnessValue = a merge b
+}
+
+class NullnessFrame(nLocals: Int, nStack: Int) extends AliasingFrame[NullnessValue](nLocals, nStack) {
+  // Auxiliary constructor required for implementing `NullnessAnalyzer.newFrame`
+  def this(src: Frame[_ <: NullnessValue]) {
+    this(src.getLocals, src.getMaxStackSize)
+    init(src)
+  }
+
+  override def execute(insn: AbstractInsnNode, interpreter: Interpreter[NullnessValue]): Unit = {
+    import Opcodes._
+
+    // get the object id of the object that is known to be not-null after this operation
+    val nullCheckedAliasId: Long = (insn.getOpcode: @switch) match {
+      case IALOAD |
+           LALOAD |
+           FALOAD |
+           DALOAD |
+           AALOAD |
+           BALOAD |
+           CALOAD |
+           SALOAD =>
+        aliasId(this.stackTop - 1)
+
+      case IASTORE |
+           FASTORE |
+           AASTORE |
+           BASTORE |
+           CASTORE |
+           SASTORE |
+           LASTORE |
+           DASTORE =>
+        aliasId(this.stackTop - 2)
+
+      case GETFIELD =>
+        aliasId(this.stackTop)
+
+      case PUTFIELD =>
+        aliasId(this.stackTop - 1)
+
+      case INVOKEVIRTUAL |
+           INVOKESPECIAL |
+           INVOKEINTERFACE =>
+        val desc = insn.asInstanceOf[MethodInsnNode].desc
+        val numArgs = Type.getArgumentTypes(desc).length
+        aliasId(this.stackTop - numArgs)
+
+      case ARRAYLENGTH |
+           MONITORENTER |
+           MONITOREXIT =>
+        aliasId(this.stackTop)
+
+      case _ =>
+        -1
+    }
+
+    super.execute(insn, interpreter)
+
+    if (nullCheckedAliasId != -1) {
+      for (i <- valuesWithAliasId(nullCheckedAliasId))
+        this.setValue(i, NotNullValue)
+    }
+  }
+}
+
+/**
+ * This class is required to override the `newFrame` methods, which makes makes sure the analyzer
+ * uses NullnessFrames.
+ */
+class NullnessAnalyzer extends Analyzer[NullnessValue](new NullnessInterpreter) {
+  override def newFrame(nLocals: Int, nStack: Int): NullnessFrame = new NullnessFrame(nLocals, nStack)
+  override def newFrame(src: Frame[_ <: NullnessValue]): NullnessFrame = new NullnessFrame(src)
+}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/analysis/ProdConsAnalyzer.scala b/src/compiler/scala/tools/nsc/backend/jvm/analysis/ProdConsAnalyzer.scala
new file mode 100644
index 0000000..594fd89
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/jvm/analysis/ProdConsAnalyzer.scala
@@ -0,0 +1,478 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2015 LAMP/EPFL
+ * @author Martin Odersky
+ */
+
+package scala.tools.nsc
+package backend.jvm
+package analysis
+
+import java.util
+
+import scala.annotation.switch
+import scala.collection.mutable
+import scala.tools.asm.{Type, MethodVisitor}
+import scala.tools.asm.Opcodes._
+import scala.tools.asm.tree._
+import scala.tools.asm.tree.analysis._
+import scala.tools.nsc.backend.jvm.BTypes.InternalName
+
+import opt.BytecodeUtils._
+
+import scala.collection.convert.decorateAsScala._
+
+/**
+ * This class provides additional queries over ASM's built-in `SourceValue` analysis.
+ *
+ * The analysis computes for each value in a frame a set of source instructions, which are the
+ * potential producers. Most instructions produce either nothing or a stack value. For example,
+ * a `LOAD` instruction is the producer of the value pushed onto the stack. The exception are
+ * `STORE` instructions, which produce a new value for a local variable slot, so they are used
+ * as producers for the value they stored.
+ *
+ * Note that pseudo-instructions are used as initial producers for parameters and local variables.
+ * See the documentation on class InitialProducer.
+ *
+ * This class implements the following queries over the data computed by the SourceValue analysis:
+ *
+ *   - producersForValueAt(insn, slot)
+ *   - consumersOfValueAt(insn, slot)
+ *
+ *   - producersForInputsOf(insn)
+ *   - consumersOfOutputsFrom(insn)
+ *
+ *   - initialProducersForValueAt(insn, slot)
+ *   - ultimateConsumersOfValueAt(insn, slot)
+ *
+ *   - initialProducersForInputsOf(insn)
+ *   - ultimateConsumersOfOutputsFrom(insn)
+ *
+ * The following operations are considered as copying operations:
+ *   - xLOAD, xSTORE
+ *   - DUP, DUP2, DUP_X1, DUP_X2, DUP2_X1, DUP2_X2
+ *   - SWAP
+ *   - CHECKCAST
+ *
+ * If ever needed, we could introduce a mode where primitive conversions (l2i) are considered as
+ * copying operations.
+ */
+class ProdConsAnalyzer(methodNode: MethodNode, classInternalName: InternalName) {
+
+  /* Timers for benchmarking ProdCons
+  import scala.reflect.internal.util.Statistics._
+  import ProdConsAnalyzer._
+  val analyzerTimer = newSubTimer(classInternalName + "#" + methodNode.name + " - analysis", prodConsAnalyzerTimer)
+  val consumersTimer = newSubTimer(classInternalName + "#" + methodNode.name + " - consumers", prodConsAnalyzerTimer)
+  */
+
+  val analyzer = new Analyzer(new InitialProducerSourceInterpreter)
+
+//  val start = analyzerTimer.start()
+  analyzer.analyze(classInternalName, methodNode)
+//  analyzerTimer.stop(start)
+//  println(analyzerTimer.line)
+
+  def frameAt(insn: AbstractInsnNode) = analyzer.frameAt(insn, methodNode)
+
+  /**
+   * Returns the potential producer instructions of a (local or stack) value in the frame of `insn`.
+   * This method simply returns the producer information computed by the SourceValue analysis.
+   */
+  def producersForValueAt(insn: AbstractInsnNode, slot: Int): Set[AbstractInsnNode] = {
+    frameAt(insn).getValue(slot).insns.asScala.toSet
+  }
+
+  /**
+   * Returns the potential consumer instructions of a (local or stack) value in the frame of `insn`.
+   * This is the counterpart of `producersForValueAt`.
+   */
+  def consumersOfValueAt(insn: AbstractInsnNode, slot: Int): Set[AbstractInsnNode] = {
+    producersForValueAt(insn, slot).flatMap(prod => {
+      val outputNumber = outputValueSlots(prod).indexOf(slot)
+      _consumersOfOutputsFrom.get(prod).map(v => {
+        v(outputNumber)
+      }).getOrElse(Set.empty)
+    })
+  }
+
+  /**
+   * Returns the potential producer instructions of any of the values consumed by `insn`.
+   */
+  def producersForInputsOf(insn: AbstractInsnNode): Set[AbstractInsnNode] = {
+    inputValues(insn).iterator.flatMap(v => v.insns.asScala).toSet
+  }
+
+  def consumersOfOutputsFrom(insn: AbstractInsnNode): Set[AbstractInsnNode] =
+    _consumersOfOutputsFrom.get(insn).map(v => v.indices.flatMap(v.apply)(collection.breakOut): Set[AbstractInsnNode]).getOrElse(Set.empty)
+
+  /**
+   * Returns the potential initial producer instructions of a value in the frame of `insn`.
+   *
+   * Unlike `producersForValueAt`, producers are tracked through copying instructions such as STORE
+   * and LOAD. If the producer of the value is a LOAD, then the producers of the stored value(s) are
+   * returned instead.
+   */
+  def initialProducersForValueAt(insn: AbstractInsnNode, slot: Int): Set[AbstractInsnNode] = {
+    def initialProducers(insn: AbstractInsnNode, producedSlot: Int): Set[AbstractInsnNode] = {
+      if (isCopyOperation(insn)) {
+        val key = (insn, producedSlot)
+        _initialProducersCache.getOrElseUpdate(key, {
+          // prevent infinite recursion if an instruction is its own producer or consumer
+          // see cyclicProdCons in ProdConsAnalyzerTest
+          _initialProducersCache(key) = Set.empty
+          val (sourceValue, sourceValueSlot) = copyOperationSourceValue(insn, producedSlot)
+          sourceValue.insns.iterator.asScala.flatMap(initialProducers(_, sourceValueSlot)).toSet
+        })
+      } else {
+        Set(insn)
+      }
+    }
+    producersForValueAt(insn, slot).flatMap(initialProducers(_, slot))
+  }
+
+  /**
+   * Returns the potential ultimate consumers of a value in the frame of `insn`. Consumers are
+   * tracked through copying operations such as SOTRE and LOAD.
+   */
+  def ultimateConsumersOfValueAt(insn: AbstractInsnNode, slot: Int): Set[AbstractInsnNode] = {
+    def ultimateConsumers(insn: AbstractInsnNode, consumedSlot: Int): Set[AbstractInsnNode] = {
+      if (isCopyOperation(insn)) {
+        val key = (insn, consumedSlot)
+        _ultimateConsumersCache.getOrElseUpdate(key, {
+          // prevent infinite recursion if an instruction is its own producer or consumer
+          // see cyclicProdCons in ProdConsAnalyzerTest
+          _ultimateConsumersCache(key) = Set.empty
+          for {
+            producedSlot     <- copyOperationProducedValueSlots(insn, consumedSlot)
+            consumer         <- consumersOfValueAt(insn.getNext, producedSlot)
+            ultimateConsumer <- ultimateConsumers(consumer, producedSlot)
+          } yield ultimateConsumer
+        })
+      } else {
+        Set(insn)
+      }
+    }
+    consumersOfValueAt(insn, slot).flatMap(ultimateConsumers(_, slot))
+  }
+
+  def initialProducersForInputsOf(insn: AbstractInsnNode): Set[AbstractInsnNode] = {
+    inputValueSlots(insn).flatMap(slot => initialProducersForValueAt(insn, slot)).toSet
+  }
+
+  def ultimateConsumersOfOutputsFrom(insn: AbstractInsnNode): Set[AbstractInsnNode] = {
+    lazy val next = insn.getNext
+    outputValueSlots(insn).flatMap(slot => ultimateConsumersOfValueAt(next, slot)).toSet
+  }
+
+  private def isCopyOperation(insn: AbstractInsnNode): Boolean = {
+    isVarInstruction(insn) || {
+      (insn.getOpcode: @switch) match {
+        case DUP | DUP_X1 | DUP_X2 | DUP2 | DUP2_X1 | DUP2_X2 | SWAP | CHECKCAST => true
+        case _ => false
+      }
+    }
+  }
+
+  /**
+   * Returns the value and its frame slot that `copyOp` copies into `producedSlot`.
+   *
+   * Example:
+   *   - copyOp = DUP_X1, assume it produces slots 2,3,4
+   *   - producedSlot = 3
+   *   - the result is the value at slot 2 in the frame of `copyOp`
+   */
+  private def copyOperationSourceValue(copyOp: AbstractInsnNode, producedSlot: Int): (SourceValue, Int) = {
+    val frame = frameAt(copyOp)
+
+    // Index of the produced value. Example: DUP_X1 produces 3 values, so producedIndex is 0, 1 or 2,
+    // where 0 corresponds to the lowest value on the stack.
+    def producedIndex(numConsumed: Int) = {
+      val numUsedSlotsBeforeCopy = frame.stackTop + 1
+      producedSlot - (numUsedSlotsBeforeCopy - numConsumed)
+    }
+
+    def stackValue(n: Int) = (frame.peekStack(n), frame.stackTop - n)
+
+    def dupX1Case = (producedIndex(2): @switch) match {
+      case 0 | 2 => stackValue(0)
+      case 1     => stackValue(1)
+    }
+
+    // Form 1 of dup_x2
+    def dupX2Case = (producedIndex(3): @switch) match {
+      case 0 | 3 => stackValue(0)
+      case 1     => stackValue(2)
+      case 2     => stackValue(1)
+    }
+
+    // Form 1 of dup2_x1
+    def dup2X1Case = (producedIndex(3): @switch) match {
+      case 0 | 3 => stackValue(1)
+      case 1 | 4 => stackValue(0)
+      case 2     => stackValue(2)
+    }
+
+    if (isLoad(copyOp)) {
+      val slot = copyOp.asInstanceOf[VarInsnNode].`var`
+      (frame.getLocal(slot), slot)
+    } else if (isStore(copyOp)) {
+      stackValue(0)
+    } else (copyOp.getOpcode: @switch) match {
+      case DUP =>
+        stackValue(0) // the current stack top is the source of both produced values
+
+      case DUP_X1 =>
+        dupX1Case
+
+      case DUP_X2 =>
+        if (frame.peekStack(1).getSize == 2) dupX1Case
+        else dupX2Case
+
+      case DUP2 =>
+        if (frame.peekStack(0).getSize == 2) stackValue(0)
+        else {
+          (producedIndex(2): @switch) match {
+            case 0 | 2 => stackValue(1)
+            case 1 | 3 => stackValue(0)
+          }
+        }
+
+      case DUP2_X1 =>
+        if (frame.peekStack(0).getSize == 2) dupX1Case
+        else dup2X1Case
+
+      case DUP2_X2 =>
+        val v1isSize2 = frame.peekStack(0).getSize == 2
+        if (v1isSize2) {
+          val v2isSize2 = frame.peekStack(1).getSize == 2
+          if (v2isSize2) dupX1Case // Form 4
+          else dupX2Case // Form 2
+        } else {
+          val v3isSize2 = frame.peekStack(2).getSize == 2
+          if (v3isSize2) dup2X1Case // Form 3
+          else {
+            // Form 1
+            (producedIndex(4): @switch) match {
+              case 0 | 4 => stackValue(1)
+              case 1 | 5 => stackValue(0)
+              case 2     => stackValue(3)
+              case 3     => stackValue(2)
+            }
+          }
+        }
+
+      case SWAP =>
+        if (producedIndex(2) == 0) stackValue(0)
+        else stackValue(1)
+
+      case CHECKCAST =>
+        stackValue(0)
+    }
+  }
+
+  /**
+   * Returns the value slots into which `copyOp` copies the value at `consumedSlot`.
+   *
+   * Example:
+   *   - copyOp = DUP_X1, assume it consumes slots 2,3 and produces 2,3,4
+   *   - if consumedSlot == 2, the result is Set(3)
+   *   - if consumedSlot == 3, the result is Set(2, 4)
+   */
+  private def copyOperationProducedValueSlots(copyOp: AbstractInsnNode, consumedSlot: Int): Set[Int] = {
+    if (isStore(copyOp)) Set(copyOp.asInstanceOf[VarInsnNode].`var`)
+    else {
+      val nextFrame = frameAt(copyOp.getNext)
+      val top = nextFrame.stackTop
+
+      // Index of the consumed value. Example: DUP_X1 consumes two values, so consumedIndex is
+      // 0 or 1, where 0 corresponds to the lower value on the stack.
+      def consumedIndex(numProduced: Int) = {
+        val numUsedSlotsAfterCopy = top + 1
+        consumedSlot - (numUsedSlotsAfterCopy - numProduced)
+      }
+
+      def dupX1Case = (consumedIndex(3): @switch) match {
+        case 0 => Set(top - 1)
+        case 1 => Set(top - 2, top)
+      }
+
+      def dupX2Case = (consumedIndex(4): @switch) match {
+        case 0 => Set(top - 2)
+        case 1 => Set(top - 1)
+        case 2 => Set(top - 3, top)
+      }
+
+      def dup2X1Case = (consumedIndex(5): @switch) match {
+        case 0 => Set(top - 2)
+        case 1 => Set(top - 4, top - 1)
+        case 2 => Set(top - 3, top)
+      }
+
+      if (isLoad(copyOp)) Set(top)
+      else (copyOp.getOpcode: @switch) match {
+        case DUP =>
+          Set(top - 1, top)
+
+        case DUP_X1 =>
+          dupX1Case
+
+        case DUP_X2 =>
+          if (nextFrame.peekStack(1).getSize == 2) dupX1Case
+          else dupX2Case
+
+        case DUP2 =>
+          if (nextFrame.peekStack(0).getSize == 2) Set(top - 1, top)
+          else (consumedIndex(4): @switch) match {
+            case 0 => Set(top - 3, top - 1)
+            case 1 => Set(top - 2, top)
+          }
+
+        case DUP2_X1 =>
+          if (nextFrame.peekStack(0).getSize == 2) dupX1Case
+          else dup2X1Case
+
+        case DUP2_X2 =>
+          val v1isSize2 = nextFrame.peekStack(0).getSize == 2
+          if (v1isSize2) {
+            val v2isSize2 = nextFrame.peekStack(1).getSize == 2
+            if (v2isSize2) dupX1Case // Form 4
+            else dupX2Case // Form 2
+          } else {
+            val v3isSize2 = nextFrame.peekStack(2).getSize == 2
+            if (v3isSize2) dup2X1Case // Form 3
+            else {
+              // Form 1
+              (consumedIndex(6): @switch) match {
+                case 0 => Set(top - 3)
+                case 1 => Set(top - 2)
+                case 2 => Set(top - 5, top - 1)
+                case 3 => Set(top - 4, top)
+              }
+            }
+          }
+
+        case SWAP =>
+          if (consumedIndex(2) == 0) Set(top)
+          else Set(top - 1)
+
+        case CHECKCAST =>
+          Set(top)
+      }
+    }
+  }
+
+  /** Returns the frame values consumed by executing `insn`. */
+  private def inputValues(insn: AbstractInsnNode): Seq[SourceValue] = {
+    lazy val frame = frameAt(insn)
+    inputValueSlots(insn) map frame.getValue
+  }
+
+  /** Returns the frame slots holding the values consumed by executing `insn`. */
+  private def inputValueSlots(insn: AbstractInsnNode): Seq[Int] = {
+    if (insn.getOpcode == -1) return Seq.empty
+    if (isLoad(insn)) {
+      Seq(insn.asInstanceOf[VarInsnNode].`var`)
+    } else if (insn.getOpcode == IINC) {
+      Seq(insn.asInstanceOf[IincInsnNode].`var`)
+    } else {
+      val frame = frameAt(insn)
+      val stackEffect = InstructionStackEffect(insn, frame)
+      val stackSize = frame.getLocals + frame.getStackSize
+      (stackSize - stackEffect._1) until stackSize
+    }
+  }
+
+  /** Returns the frame slots holding the values produced by executing `insn`. */
+  private def outputValueSlots(insn: AbstractInsnNode): Seq[Int] = insn match {
+    case ParameterProducer(local)          => Seq(local)
+    case UninitializedLocalProducer(local) => Seq(local)
+    case ExceptionProducer(frame)          => Seq(frame.stackTop)
+    case _ =>
+      if (insn.getOpcode == -1) return Seq.empty
+      if (isStore(insn)) {
+        Seq(insn.asInstanceOf[VarInsnNode].`var`)
+      } else if (insn.getOpcode == IINC) {
+        Seq(insn.asInstanceOf[IincInsnNode].`var`)
+      } else {
+        val frame = frameAt(insn)
+        val stackEffect = InstructionStackEffect(insn, frame)
+        val nextFrame = frameAt(insn.getNext)
+        val stackSize = nextFrame.getLocals + nextFrame.getStackSize
+        (stackSize - stackEffect._2) until stackSize
+      }
+  }
+
+  /** For each instruction, a set of potential consumers of the produced values. */
+  private lazy val _consumersOfOutputsFrom: Map[AbstractInsnNode, Vector[Set[AbstractInsnNode]]] = {
+//    val start = consumersTimer.start()
+    var res = Map.empty[AbstractInsnNode, Vector[Set[AbstractInsnNode]]]
+    for {
+      insn <- methodNode.instructions.iterator.asScala
+      frame = frameAt(insn)
+      i <- inputValueSlots(insn)
+      producer <- frame.getValue(i).insns.asScala
+    } {
+      val producedSlots = outputValueSlots(producer)
+      val currentConsumers = res.getOrElse(producer, Vector.fill(producedSlots.size)(Set.empty[AbstractInsnNode]))
+      val outputIndex = producedSlots.indexOf(i)
+      res = res.updated(producer, currentConsumers.updated(outputIndex, currentConsumers(outputIndex) + insn))
+    }
+//    consumersTimer.stop(start)
+//    println(consumersTimer.line)
+    res
+  }
+
+  private val _initialProducersCache:  mutable.AnyRefMap[(AbstractInsnNode, Int), Set[AbstractInsnNode]] = mutable.AnyRefMap.empty
+  private val _ultimateConsumersCache: mutable.AnyRefMap[(AbstractInsnNode, Int), Set[AbstractInsnNode]] = mutable.AnyRefMap.empty
+}
+
+object ProdConsAnalyzer {
+  import scala.reflect.internal.util.Statistics._
+  val prodConsAnalyzerTimer = newTimer("Time in ProdConsAnalyzer", "jvm")
+}
+
+/**
+ * A class for pseudo-instructions representing the initial producers of local values that have
+ * no producer instruction in the method:
+ *   - parameters, including `this`
+ *   - uninitialized local variables
+ *   - exception values in handlers
+ *
+ * The ASM built-in SourceValue analysis yields an empty producers set for such values. This leads
+ * to ambiguities. Example (in Java one can re-assign parameter):
+ *
+ *   void foo(int a) {
+ *     if (a == 0) a = 1;
+ *     return a;
+ *   }
+ *
+ * In the first frame of the method, the SoruceValue for parameter `a` gives an empty set of
+ * producer instructions.
+ *
+ * In the frame of the `IRETURN` instruction, the SoruceValue for parameter `a` lists a single
+ * producer instruction: the `ISTORE 1`. This makes it look as if there was a single producer for
+ * `a`, where in fact it might still hold the parameter's initial value.
+ */
+abstract class InitialProducer extends AbstractInsnNode(-1) {
+  override def getType: Int = throw new UnsupportedOperationException
+  override def clone(labels: util.Map[LabelNode, LabelNode]): AbstractInsnNode = throw new UnsupportedOperationException
+  override def accept(cv: MethodVisitor): Unit = throw new UnsupportedOperationException
+}
+
+case class ParameterProducer(local: Int)                      extends InitialProducer
+case class UninitializedLocalProducer(local: Int)             extends InitialProducer
+case class ExceptionProducer(handlerFrame: Frame[_ <: Value]) extends InitialProducer
+
+class InitialProducerSourceInterpreter extends SourceInterpreter {
+  override def newParameterValue(isInstanceMethod: Boolean, local: Int, tp: Type): SourceValue = {
+    new SourceValue(tp.getSize, ParameterProducer(local))
+  }
+
+  override def newEmptyNonParameterLocalValue(local: Int): SourceValue = {
+    new SourceValue(1, UninitializedLocalProducer(local))
+  }
+
+  override def newExceptionValue(tryCatchBlockNode: TryCatchBlockNode, handlerFrame: Frame[_ <: Value], exceptionType: Type): SourceValue = {
+    new SourceValue(1, ExceptionProducer(handlerFrame))
+  }
+}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/ByteCodeRepository.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/ByteCodeRepository.scala
index 7b424d2..a5b85e5 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/opt/ByteCodeRepository.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/ByteCodeRepository.scala
@@ -10,11 +10,14 @@ package opt
 import scala.tools.asm
 import asm.tree._
 import scala.collection.convert.decorateAsScala._
+import scala.tools.asm.Attribute
+import scala.tools.nsc.backend.jvm.BackendReporting._
 import scala.tools.nsc.io.AbstractFile
 import scala.tools.nsc.util.ClassFileLookup
-import OptimizerReporting._
+import BytecodeUtils._
 import ByteCodeRepository._
 import BTypes.InternalName
+import java.util.concurrent.atomic.AtomicLong
 
 /**
  * The ByteCodeRepository provides utilities to read the bytecode of classfiles from the compilation
@@ -24,58 +27,125 @@ import BTypes.InternalName
  * @param classes   Cache for parsed ClassNodes. Also stores the source of the bytecode:
  *                  [[Classfile]] if read from `classPath`, [[CompilationUnit]] if the bytecode
  *                  corresponds to a class being compiled.
+ *                  The `Long` field encodes the age of the node in the map, which allows removing
+ *                  old entries when the map grows too large.
+ *                  For Java classes in mixed compilation, the map contains an error message: no
+ *                  ClassNode is generated by the backend and also no classfile that could be parsed.
  */
-class ByteCodeRepository(val classPath: ClassFileLookup[AbstractFile], val classes: collection.concurrent.Map[InternalName, (ClassNode, Source)]) {
+class ByteCodeRepository(val classPath: ClassFileLookup[AbstractFile], val isJavaSourceDefined: InternalName => Boolean, val classes: collection.concurrent.Map[InternalName, Either[ClassNotFound, (ClassNode, Source, Long)]]) {
+
+  private val maxCacheSize = 1500
+  private val targetSize   = 500
+
+  private val idCounter = new AtomicLong(0)
+
+  /**
+   * Prevent the code repository from growing too large. Profiling reveals that the average size
+   * of a ClassNode is about 30 kb. I observed having 17k+ classes in the cache, i.e., 500 mb.
+   *
+   * We can only remove classes with `Source == Classfile`, those can be parsed again if requested.
+   */
+  private def limitCacheSize(): Unit = {
+    if (classes.count(c => c._2.isRight && c._2.right.get._2 == Classfile) > maxCacheSize) {
+      val removeId = idCounter.get - targetSize
+      val toRemove = classes.iterator.collect({
+        case (name, Right((_, Classfile, id))) if id < removeId => name
+      }).toList
+      toRemove foreach classes.remove
+    }
+  }
+
+  def add(classNode: ClassNode, source: Source) = {
+    classes(classNode.name) = Right((classNode, source, idCounter.incrementAndGet()))
+  }
+
   /**
    * The class node and source for an internal name. If the class node is not yet available, it is
    * parsed from the classfile on the compile classpath.
    */
-  def classNodeAndSource(internalName: InternalName): (ClassNode, Source) = {
-    classes.getOrElseUpdate(internalName, (parseClass(internalName), Classfile))
+  def classNodeAndSource(internalName: InternalName): Either[ClassNotFound, (ClassNode, Source)] = {
+    val r = classes.getOrElseUpdate(internalName, {
+      limitCacheSize()
+      parseClass(internalName).map((_, Classfile, idCounter.incrementAndGet()))
+    })
+    r.map(v => (v._1, v._2))
   }
 
   /**
    * The class node for an internal name. If the class node is not yet available, it is parsed from
    * the classfile on the compile classpath.
    */
-  def classNode(internalName: InternalName) = classNodeAndSource(internalName)._1
+  def classNode(internalName: InternalName): Either[ClassNotFound, ClassNode] = classNodeAndSource(internalName).map(_._1)
 
   /**
    * The field node for a field matching `name` and `descriptor`, accessed in class `classInternalName`.
    * The declaration of the field may be in one of the superclasses.
    *
-   * @return The [[FieldNode]] of the requested field and the [[InternalName]] of its declaring class.
+   * @return The [[FieldNode]] of the requested field and the [[InternalName]] of its declaring
+   *         class, or an error message if the field could not be found
    */
-  def fieldNode(classInternalName: InternalName, name: String, descriptor: String): Option[(FieldNode, InternalName)] = {
-    val c = classNode(classInternalName)
-    c.fields.asScala.find(f => f.name == name && f.desc == descriptor).map((_, classInternalName)) orElse {
-      Option(c.superName).flatMap(n => fieldNode(n, name, descriptor))
+  def fieldNode(classInternalName: InternalName, name: String, descriptor: String): Either[FieldNotFound, (FieldNode, InternalName)] = {
+    def fieldNodeImpl(parent: InternalName): Either[FieldNotFound, (FieldNode, InternalName)] = {
+      def msg = s"The field node $name$descriptor could not be found in class $classInternalName or any of its superclasses."
+      classNode(parent) match {
+        case Left(e)  => Left(FieldNotFound(name, descriptor, classInternalName, Some(e)))
+        case Right(c) =>
+          c.fields.asScala.find(f => f.name == name && f.desc == descriptor) match {
+            case Some(f) => Right((f, parent))
+            case None    =>
+              if (c.superName == null) Left(FieldNotFound(name, descriptor, classInternalName, None))
+              else fieldNode(c.superName, name, descriptor)
+          }
+      }
     }
+    fieldNodeImpl(classInternalName)
   }
 
   /**
-   * The method node for a method matching `name` and `descriptor`, accessed in class `classInternalName`.
+   * The method node for a method matching `name` and `descriptor`, accessed in class `ownerInternalNameOrArrayDescriptor`.
    * The declaration of the method may be in one of the parents.
    *
-   * @return The [[MethodNode]] of the requested method and the [[InternalName]] of its declaring class.
+   * @return The [[MethodNode]] of the requested method and the [[InternalName]] of its declaring
+   *         class, or an error message if the method could not be found.
    */
-  def methodNode(classInternalName: InternalName, name: String, descriptor: String): Option[(MethodNode, InternalName)] = {
-    val c = classNode(classInternalName)
-    c.methods.asScala.find(m => m.name == name && m.desc == descriptor).map((_, classInternalName)) orElse {
-      val parents = Option(c.superName) ++ c.interfaces.asScala
-      // `view` to stop at the first result
-      parents.view.flatMap(methodNode(_, name, descriptor)).headOption
+  def methodNode(ownerInternalNameOrArrayDescriptor: String, name: String, descriptor: String): Either[MethodNotFound, (MethodNode, InternalName)] = {
+    // on failure, returns a list of class names that could not be found on the classpath
+    def methodNodeImpl(ownerInternalName: InternalName): Either[List[ClassNotFound], (MethodNode, InternalName)] = {
+      classNode(ownerInternalName) match {
+        case Left(e)  => Left(List(e))
+        case Right(c) =>
+          c.methods.asScala.find(m => m.name == name && m.desc == descriptor) match {
+            case Some(m) => Right((m, ownerInternalName))
+            case None    => findInParents(Option(c.superName) ++: c.interfaces.asScala.toList, Nil)
+          }
+      }
     }
+
+    // find the MethodNode in one of the parent classes
+    def findInParents(parents: List[InternalName], failedClasses: List[ClassNotFound]): Either[List[ClassNotFound], (MethodNode, InternalName)] = parents match {
+      case x :: xs => methodNodeImpl(x).left.flatMap(failed => findInParents(xs, failed ::: failedClasses))
+      case Nil     => Left(failedClasses)
+    }
+
+    // In a MethodInsnNode, the `owner` field may be an array descriptor, for example when invoking `clone`. We don't have a method node to return in this case.
+    if (ownerInternalNameOrArrayDescriptor.charAt(0) == '[')
+      Left(MethodNotFound(name, descriptor, ownerInternalNameOrArrayDescriptor, Nil))
+    else
+      methodNodeImpl(ownerInternalNameOrArrayDescriptor).left.map(MethodNotFound(name, descriptor, ownerInternalNameOrArrayDescriptor, _))
   }
 
-  private def parseClass(internalName: InternalName): ClassNode = {
+  private def parseClass(internalName: InternalName): Either[ClassNotFound, ClassNode] = {
     val fullName = internalName.replace('/', '.')
     classPath.findClassFile(fullName) map { classFile =>
       val classNode = new asm.tree.ClassNode()
       val classReader = new asm.ClassReader(classFile.toByteArray)
+
+      // Passing the InlineInfoAttributePrototype makes the ClassReader invoke the specific `read`
+      // method of the InlineInfoAttribute class, instead of putting the byte array into a generic
+      // Attribute.
       // We don't need frames when inlining, but we want to keep the local variable table, so we
       // don't use SKIP_DEBUG.
-      classReader.accept(classNode, asm.ClassReader.SKIP_FRAMES)
+      classReader.accept(classNode, Array[Attribute](InlineInfoAttributePrototype), asm.ClassReader.SKIP_FRAMES)
       // SKIP_FRAMES leaves line number nodes. Remove them because they are not correct after
       // inlining.
       // TODO: we need to remove them also for classes that are not parsed from classfiles, why not simplify and do it once when inlining?
@@ -85,18 +155,9 @@ class ByteCodeRepository(val classPath: ClassFileLookup[AbstractFile], val class
       //   https://jcp.org/aboutJava/communityprocess/final/jsr045/index.html
       removeLineNumberNodes(classNode)
       classNode
-    } getOrElse {
-      inlineFailure(s"Class file for class $fullName not found.")
-    }
-  }
-
-  private def removeLineNumberNodes(classNode: ClassNode): Unit = {
-    for (method <- classNode.methods.asScala) {
-      val iter = method.instructions.iterator()
-      while (iter.hasNext) iter.next() match {
-        case _: LineNumberNode => iter.remove()
-        case _ =>
-      }
+    } match {
+      case Some(node) => Right(node)
+      case None       => Left(ClassNotFound(internalName, isJavaSourceDefined(internalName)))
     }
   }
 }
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala
index 6b4047c..7aadd2c 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala
@@ -10,12 +10,23 @@ package opt
 import scala.annotation.{tailrec, switch}
 import scala.collection.mutable
 import scala.reflect.internal.util.Collections._
-import scala.tools.asm.Opcodes
+import scala.tools.asm.commons.CodeSizeEvaluator
+import scala.tools.asm.tree.analysis._
+import scala.tools.asm.{MethodWriter, ClassWriter, Label, Opcodes, Type}
 import scala.tools.asm.tree._
+import GenBCode._
 import scala.collection.convert.decorateAsScala._
+import scala.collection.convert.decorateAsJava._
+import scala.tools.nsc.backend.jvm.BTypes._
 
 object BytecodeUtils {
 
+  // http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.9.1
+  final val maxJVMMethodSize         = 65535
+
+  // 5% margin, more than enough for the instructions added by the inliner (store / load args, null check for instance methods)
+  final val maxMethodSizeAfterInline = maxJVMMethodSize - (maxJVMMethodSize / 20)
+
   object Goto {
     def unapply(instruction: AbstractInsnNode): Option[JumpInsnNode] = {
       if (instruction.getOpcode == Opcodes.GOTO) Some(instruction.asInstanceOf[JumpInsnNode])
@@ -61,13 +72,40 @@ object BytecodeUtils {
     op >= Opcodes.IRETURN && op <= Opcodes.RETURN
   }
 
-  def isVarInstruction(instruction: AbstractInsnNode): Boolean = {
+  def isLoad(instruction: AbstractInsnNode): Boolean = {
     val op = instruction.getOpcode
-    (op >= Opcodes.ILOAD  && op <= Opcodes.ALOAD) || (op >= Opcodes.ISTORE && op <= Opcodes.ASTORE)
+    op >= Opcodes.ILOAD  && op <= Opcodes.ALOAD
   }
 
+  def isStore(instruction: AbstractInsnNode): Boolean = {
+    val op = instruction.getOpcode
+    op >= Opcodes.ISTORE && op <= Opcodes.ASTORE
+  }
+
+  def isVarInstruction(instruction: AbstractInsnNode): Boolean = isLoad(instruction) || isStore(instruction)
+
   def isExecutable(instruction: AbstractInsnNode): Boolean = instruction.getOpcode >= 0
 
+  def isConstructor(methodNode: MethodNode): Boolean = {
+    methodNode.name == INSTANCE_CONSTRUCTOR_NAME || methodNode.name == CLASS_CONSTRUCTOR_NAME
+  }
+
+  def isStaticMethod(methodNode: MethodNode): Boolean = (methodNode.access & Opcodes.ACC_STATIC) != 0
+
+  def isAbstractMethod(methodNode: MethodNode): Boolean = (methodNode.access & Opcodes.ACC_ABSTRACT) != 0
+
+  def isSynchronizedMethod(methodNode: MethodNode): Boolean = (methodNode.access & Opcodes.ACC_SYNCHRONIZED) != 0
+
+  def isNativeMethod(methodNode: MethodNode): Boolean = (methodNode.access & Opcodes.ACC_NATIVE) != 0
+
+  def isFinalClass(classNode: ClassNode): Boolean = (classNode.access & Opcodes.ACC_FINAL) != 0
+
+  def isFinalMethod(methodNode: MethodNode): Boolean = (methodNode.access & (Opcodes.ACC_FINAL | Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC)) != 0
+
+  def isStrictfpMethod(methodNode: MethodNode): Boolean = (methodNode.access & Opcodes.ACC_STRICT) != 0
+
+  def isReference(t: Type) = t.getSort == Type.OBJECT || t.getSort == Type.ARRAY
+
   def nextExecutableInstruction(instruction: AbstractInsnNode, alsoKeep: AbstractInsnNode => Boolean = Set()): Option[AbstractInsnNode] = {
     var result = instruction
     do { result = result.getNext }
@@ -76,7 +114,7 @@ object BytecodeUtils {
   }
 
   def sameTargetExecutableInstruction(a: JumpInsnNode, b: JumpInsnNode): Boolean = {
-    // Compare next executable instead of the the labels. Identifies a, b as the same target:
+    // Compare next executable instead of the labels. Identifies a, b as the same target:
     //   LabelNode(a)
     //   LabelNode(b)
     //   Instr
@@ -140,6 +178,8 @@ object BytecodeUtils {
     new InsnNode(op)
   }
 
+  def instructionResultSize(instruction: AbstractInsnNode) = InstructionResultSize(instruction)
+
   def labelReferences(method: MethodNode): Map[LabelNode, Set[AnyRef]] = {
     val res = mutable.Map.empty[LabelNode, Set[AnyRef]]
     def add(l: LabelNode, ref: AnyRef) = if (res contains l) res(l) = res(l) + ref else res(l) = Set(ref)
@@ -181,4 +221,175 @@ object BytecodeUtils {
         if (handler.end == from) handler.end = to
     }
   }
+
+  /**
+   * In order to run an Analyzer, the maxLocals / maxStack fields need to be available. The ASM
+   * framework only computes these values during bytecode generation.
+   *
+   * Since there's currently no better way, we run a bytecode generator on the method and extract
+   * the computed values. This required changes to the ASM codebase:
+   *   - the [[MethodWriter]] class was made public
+   *   - accessors for maxLocals / maxStack were added to the MethodWriter class
+   *
+   * We could probably make this faster (and allocate less memory) by hacking the ASM framework
+   * more: create a subclass of MethodWriter with a /dev/null byteVector. Another option would be
+   * to create a separate visitor for computing those values, duplicating the functionality from the
+   * MethodWriter.
+   */
+  def computeMaxLocalsMaxStack(method: MethodNode): Unit = {
+    val cw = new ClassWriter(ClassWriter.COMPUTE_MAXS)
+    val excs = method.exceptions.asScala.toArray
+    val mw = cw.visitMethod(method.access, method.name, method.desc, method.signature, excs).asInstanceOf[MethodWriter]
+    method.accept(mw)
+    method.maxLocals = mw.getMaxLocals
+    method.maxStack = mw.getMaxStack
+  }
+
+  def codeSizeOKForInlining(caller: MethodNode, callee: MethodNode): Boolean = {
+    // Looking at the implementation of CodeSizeEvaluator, all instructions except tableswitch and
+    // lookupswitch are <= 8 bytes. These should be rare enough for 8 to be an OK rough upper bound.
+    def roughUpperBound(methodNode: MethodNode): Int = methodNode.instructions.size * 8
+
+    def maxSize(methodNode: MethodNode): Int = {
+      val eval = new CodeSizeEvaluator(null)
+      methodNode.accept(eval)
+      eval.getMaxSize
+    }
+
+    (roughUpperBound(caller) + roughUpperBound(callee) > maxMethodSizeAfterInline) &&
+      (maxSize(caller) + maxSize(callee) > maxMethodSizeAfterInline)
+  }
+
+  def removeLineNumberNodes(classNode: ClassNode): Unit = {
+    for (m <- classNode.methods.asScala) removeLineNumberNodes(m.instructions)
+  }
+
+  def removeLineNumberNodes(instructions: InsnList): Unit = {
+    val iter = instructions.iterator()
+    while (iter.hasNext) iter.next() match {
+      case _: LineNumberNode => iter.remove()
+      case _ =>
+    }
+  }
+
+  def cloneLabels(methodNode: MethodNode): Map[LabelNode, LabelNode] = {
+    methodNode.instructions.iterator().asScala.collect({
+      case labelNode: LabelNode => (labelNode, newLabelNode)
+    }).toMap
+  }
+
+  /**
+   * Create a new [[LabelNode]] with a correctly associated [[Label]].
+   */
+  def newLabelNode: LabelNode = {
+    val label = new Label
+    val labelNode = new LabelNode(label)
+    label.info = labelNode
+    labelNode
+  }
+
+  /**
+   * Clone the instructions in `methodNode` into a new [[InsnList]], mapping labels according to
+   * the `labelMap`. Returns the new instruction list and a map from old to new instructions.
+   */
+  def cloneInstructions(methodNode: MethodNode, labelMap: Map[LabelNode, LabelNode]): (InsnList, Map[AbstractInsnNode, AbstractInsnNode]) = {
+    val javaLabelMap = labelMap.asJava
+    val result = new InsnList
+    var map = Map.empty[AbstractInsnNode, AbstractInsnNode]
+    for (ins <- methodNode.instructions.iterator.asScala) {
+      val cloned = ins.clone(javaLabelMap)
+      result add cloned
+      map += ((ins, cloned))
+    }
+    (result, map)
+  }
+
+  /**
+   * Clone the local variable descriptors of `methodNode` and map their `start` and `end` labels
+   * according to the `labelMap`.
+   */
+  def cloneLocalVariableNodes(methodNode: MethodNode, labelMap: Map[LabelNode, LabelNode], prefix: String): List[LocalVariableNode] = {
+    methodNode.localVariables.iterator().asScala.map(localVariable => new LocalVariableNode(
+      prefix + localVariable.name,
+      localVariable.desc,
+      localVariable.signature,
+      labelMap(localVariable.start),
+      labelMap(localVariable.end),
+      localVariable.index
+    )).toList
+  }
+
+  /**
+   * Clone the local try/catch blocks of `methodNode` and map their `start` and `end` and `handler`
+   * labels according to the `labelMap`.
+   */
+  def cloneTryCatchBlockNodes(methodNode: MethodNode, labelMap: Map[LabelNode, LabelNode]): List[TryCatchBlockNode] = {
+    methodNode.tryCatchBlocks.iterator().asScala.map(tryCatch => new TryCatchBlockNode(
+      labelMap(tryCatch.start),
+      labelMap(tryCatch.end),
+      labelMap(tryCatch.handler),
+      tryCatch.`type`
+    )).toList
+  }
+
+  /**
+   * This method is used by optimizer components to eliminate phantom values of instruction
+   * that load a value of type `Nothing$` or `Null$`. Such values on the stack don't interact well
+   * with stack map frames.
+   *
+   * For example, `opt.getOrElse(throw e)` is re-written to an invocation of the lambda body, a
+   * method with return type `Nothing$`. Similarly for `opt.getOrElse(null)` and `Null$`.
+   *
+   * During bytecode generation this is handled by BCodeBodyBuilder.adapt. See the comment in that
+   * method which explains the issue with such phantom values.
+   */
+  def fixLoadedNothingOrNullValue(loadedType: Type, loadInstr: AbstractInsnNode, methodNode: MethodNode, bTypes: BTypes): Unit = {
+    if (loadedType == bTypes.coreBTypes.RT_NOTHING.toASMType) {
+      methodNode.instructions.insert(loadInstr, new InsnNode(Opcodes.ATHROW))
+    } else if (loadedType == bTypes.coreBTypes.RT_NULL.toASMType) {
+      methodNode.instructions.insert(loadInstr, new InsnNode(Opcodes.ACONST_NULL))
+      methodNode.instructions.insert(loadInstr, new InsnNode(Opcodes.POP))
+    }
+  }
+
+  /**
+   * A wrapper to make ASM's Analyzer a bit easier to use.
+   */
+  class AsmAnalyzer[V <: Value](methodNode: MethodNode, classInternalName: InternalName, interpreter: Interpreter[V] = new BasicInterpreter) {
+    val analyzer = new Analyzer(interpreter)
+    analyzer.analyze(classInternalName, methodNode)
+    def frameAt(instruction: AbstractInsnNode): Frame[V] = analyzer.frameAt(instruction, methodNode)
+  }
+
+  implicit class AnalyzerExtensions[V <: Value](val analyzer: Analyzer[V]) extends AnyVal {
+    def frameAt(instruction: AbstractInsnNode, methodNode: MethodNode): Frame[V] = analyzer.getFrames()(methodNode.instructions.indexOf(instruction))
+  }
+
+  implicit class FrameExtensions[V <: Value](val frame: Frame[V]) extends AnyVal {
+    /**
+     * The value `n` positions down the stack.
+     */
+    def peekStack(n: Int): V = frame.getStack(frame.getStackSize - 1 - n)
+
+    /**
+     * The index of the current stack top.
+     */
+    def stackTop = frame.getLocals + frame.getStackSize - 1
+
+    /**
+     * Gets the value at slot i, where i may be a local or a stack index.
+     */
+    def getValue(i: Int): V = {
+      if (i < frame.getLocals) frame.getLocal(i)
+      else frame.getStack(i - frame.getLocals)
+    }
+
+    /**
+     * Sets the value at slot i, where i may be a local or a stack index.
+     */
+    def setValue(i: Int, value: V): Unit = {
+      if (i < frame.getLocals) frame.setLocal(i, value)
+      else frame.setStack(i - frame.getLocals, value)
+    }
+  }
 }
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/CallGraph.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/CallGraph.scala
new file mode 100644
index 0000000..96455c0
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/CallGraph.scala
@@ -0,0 +1,317 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2014 LAMP/EPFL
+ * @author  Martin Odersky
+ */
+
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import scala.reflect.internal.util.{NoPosition, Position}
+import scala.tools.asm.tree.analysis.{Value, Analyzer, BasicInterpreter}
+import scala.tools.asm.{Opcodes, Type, Handle}
+import scala.tools.asm.tree._
+import scala.collection.concurrent
+import scala.collection.convert.decorateAsScala._
+import scala.tools.nsc.backend.jvm.BTypes.InternalName
+import scala.tools.nsc.backend.jvm.BackendReporting._
+import scala.tools.nsc.backend.jvm.analysis.{NotNull, NullnessAnalyzer}
+import ByteCodeRepository.{Source, CompilationUnit}
+import BytecodeUtils._
+
+class CallGraph[BT <: BTypes](val btypes: BT) {
+  import btypes._
+
+  val callsites: concurrent.Map[MethodInsnNode, Callsite] = recordPerRunCache(concurrent.TrieMap.empty)
+
+  val closureInstantiations: concurrent.Map[InvokeDynamicInsnNode, ClosureInstantiation] = recordPerRunCache(concurrent.TrieMap.empty)
+
+  def addClass(classNode: ClassNode): Unit = {
+    val classType = classBTypeFromClassNode(classNode)
+    for {
+      m <- classNode.methods.asScala
+      (calls, closureInits) = analyzeCallsites(m, classType)
+    } {
+      calls foreach (callsite => callsites(callsite.callsiteInstruction) = callsite)
+      closureInits foreach (lmf => closureInstantiations(lmf.indy) = ClosureInstantiation(lmf, m, classType))
+    }
+  }
+
+  /**
+   * Returns a list of callsites in the method, plus a list of closure instantiation indy instructions.
+   */
+  def analyzeCallsites(methodNode: MethodNode, definingClass: ClassBType): (List[Callsite], List[LambdaMetaFactoryCall]) = {
+
+    case class CallsiteInfo(safeToInline: Boolean, safeToRewrite: Boolean,
+                            annotatedInline: Boolean, annotatedNoInline: Boolean,
+                            warning: Option[CalleeInfoWarning])
+
+    /**
+     * Analyze a callsite and gather meta-data that can be used for inlining decisions.
+     */
+    def analyzeCallsite(calleeMethodNode: MethodNode, calleeDeclarationClassBType: ClassBType, receiverTypeInternalName: InternalName, calleeSource: Source): CallsiteInfo = {
+      val methodSignature = calleeMethodNode.name + calleeMethodNode.desc
+
+      try {
+        // The inlineInfo.methodInfos of a ClassBType holds an InlineInfo for each method *declared*
+        // within a class (not for inherited methods). Since we already have the  classBType of the
+        // callee, we only check there for the methodInlineInfo, we should find it there.
+        calleeDeclarationClassBType.info.orThrow.inlineInfo.methodInfos.get(methodSignature) match {
+          case Some(methodInlineInfo) =>
+            val canInlineFromSource = compilerSettings.YoptInlineGlobal || calleeSource == CompilationUnit
+
+            val isAbstract = BytecodeUtils.isAbstractMethod(calleeMethodNode)
+
+            // (1) A non-final method can be safe to inline if the receiver type is a final subclass. Example:
+            //   class A { @inline def f = 1 }; object B extends A; B.f  // can be inlined
+            //
+            // TODO: type analysis can render more calls statically resolved. Example:
+            //   new A.f  // can be inlined, the receiver type is known to be exactly A.
+            val isStaticallyResolved: Boolean = {
+              methodInlineInfo.effectivelyFinal ||
+                classBTypeFromParsedClassfile(receiverTypeInternalName).info.orThrow.inlineInfo.isEffectivelyFinal // (1)
+            }
+
+            val isRewritableTraitCall = isStaticallyResolved && methodInlineInfo.traitMethodWithStaticImplementation
+
+            val warning = calleeDeclarationClassBType.info.orThrow.inlineInfo.warning.map(
+              MethodInlineInfoIncomplete(calleeDeclarationClassBType.internalName, calleeMethodNode.name, calleeMethodNode.desc, _))
+
+            // (1) For invocations of final trait methods, the callee isStaticallyResolved but also
+            //     abstract. Such a callee is not safe to inline - it needs to be re-written to the
+            //     static impl method first (safeToRewrite).
+            // (2) Final trait methods can be rewritten from the interface to the static implementation
+            //     method to enable inlining.
+            CallsiteInfo(
+              safeToInline      =
+                canInlineFromSource &&
+                isStaticallyResolved &&  // (1)
+                !isAbstract &&
+                !BytecodeUtils.isConstructor(calleeMethodNode) &&
+                !BytecodeUtils.isNativeMethod(calleeMethodNode),
+              safeToRewrite     = canInlineFromSource && isRewritableTraitCall, // (2)
+              annotatedInline   = methodInlineInfo.annotatedInline,
+              annotatedNoInline = methodInlineInfo.annotatedNoInline,
+              warning           = warning)
+
+          case None =>
+            val warning = MethodInlineInfoMissing(calleeDeclarationClassBType.internalName, calleeMethodNode.name, calleeMethodNode.desc, calleeDeclarationClassBType.info.orThrow.inlineInfo.warning)
+            CallsiteInfo(false, false, false, false, Some(warning))
+        }
+      } catch {
+        case Invalid(noInfo: NoClassBTypeInfo) =>
+          val warning = MethodInlineInfoError(calleeDeclarationClassBType.internalName, calleeMethodNode.name, calleeMethodNode.desc, noInfo)
+          CallsiteInfo(false, false, false, false, Some(warning))
+      }
+    }
+
+    // TODO: run dataflow analyses to make the call graph more precise
+    //  - producers to get forwarded parameters (ForwardedParam)
+    //  - typeAnalysis for more precise argument types, more precise callee
+
+    // For now we run a NullnessAnalyzer. It is used to determine if the receiver of an instance
+    // call is known to be not-null, in which case we don't have to emit a null check when inlining.
+    // It is also used to get the stack height at the call site.
+    localOpt.minimalRemoveUnreachableCode(methodNode, definingClass.internalName)
+
+    val analyzer: Analyzer[_ <: Value] = {
+      if (compilerSettings.YoptNullnessTracking) new NullnessAnalyzer
+      else new Analyzer(new BasicInterpreter)
+    }
+    analyzer.analyze(definingClass.internalName, methodNode)
+
+    def receiverNotNullByAnalysis(call: MethodInsnNode, numArgs: Int) = analyzer match {
+      case nullnessAnalyzer: NullnessAnalyzer =>
+        val frame = nullnessAnalyzer.frameAt(call, methodNode)
+        frame.getStack(frame.getStackSize - 1 - numArgs).nullness == NotNull
+
+      case _ => false
+    }
+
+    val callsites = new collection.mutable.ListBuffer[Callsite]
+    val closureInstantiations = new collection.mutable.ListBuffer[LambdaMetaFactoryCall]
+
+    methodNode.instructions.iterator.asScala foreach {
+      case call: MethodInsnNode =>
+        val callee: Either[OptimizerWarning, Callee] = for {
+          (method, declarationClass)     <- byteCodeRepository.methodNode(call.owner, call.name, call.desc): Either[OptimizerWarning, (MethodNode, InternalName)]
+          (declarationClassNode, source) <- byteCodeRepository.classNodeAndSource(declarationClass): Either[OptimizerWarning, (ClassNode, Source)]
+          declarationClassBType          =  classBTypeFromClassNode(declarationClassNode)
+        } yield {
+          val CallsiteInfo(safeToInline, safeToRewrite, annotatedInline, annotatedNoInline, warning) = analyzeCallsite(method, declarationClassBType, call.owner, source)
+          Callee(
+            callee = method,
+            calleeDeclarationClass = declarationClassBType,
+            safeToInline = safeToInline,
+            safeToRewrite = safeToRewrite,
+            annotatedInline = annotatedInline,
+            annotatedNoInline = annotatedNoInline,
+            calleeInfoWarning = warning)
+        }
+
+        val argInfos = if (callee.isLeft) Nil else {
+          // TODO: for now it's Nil, because we don't run any data flow analysis
+          // there's no point in using the parameter types, that doesn't add any information.
+          // NOTE: need to run the same analyses after inlining, to re-compute the argInfos for the
+          // new duplicated callsites, see Inliner.inline
+          Nil
+        }
+
+        val receiverNotNull = call.getOpcode == Opcodes.INVOKESTATIC || {
+          val numArgs = Type.getArgumentTypes(call.desc).length
+          receiverNotNullByAnalysis(call, numArgs)
+        }
+
+        callsites += Callsite(
+          callsiteInstruction = call,
+          callsiteMethod = methodNode,
+          callsiteClass = definingClass,
+          callee = callee,
+          argInfos = argInfos,
+          callsiteStackHeight = analyzer.frameAt(call, methodNode).getStackSize,
+          receiverKnownNotNull = receiverNotNull,
+          callsitePosition = callsitePositions.getOrElse(call, NoPosition)
+        )
+
+      case LambdaMetaFactoryCall(indy, samMethodType, implMethod, instantiatedMethodType) =>
+        closureInstantiations += LambdaMetaFactoryCall(indy, samMethodType, implMethod, instantiatedMethodType)
+
+      case _ =>
+    }
+
+    (callsites.toList, closureInstantiations.toList)
+  }
+
+  /**
+   * A callsite in the call graph.
+   *
+   * @param callsiteInstruction The invocation instruction
+   * @param callsiteMethod      The method containing the callsite
+   * @param callsiteClass       The class containing the callsite
+   * @param callee              The callee, as it appears in the invocation instruction. For virtual
+   *                            calls, an override of the callee might be invoked. Also, the callee
+   *                            can be abstract. Contains a warning message if the callee MethodNode
+   *                            cannot be found in the bytecode repository.
+   * @param argInfos            Information about the invocation receiver and arguments
+   * @param callsiteStackHeight The stack height at the callsite, required by the inliner
+   * @param callsitePosition    The source position of the callsite, used for inliner warnings.
+   */
+  final case class Callsite(callsiteInstruction: MethodInsnNode, callsiteMethod: MethodNode, callsiteClass: ClassBType,
+                            callee: Either[OptimizerWarning, Callee], argInfos: List[ArgInfo],
+                            callsiteStackHeight: Int, receiverKnownNotNull: Boolean, callsitePosition: Position) {
+    override def toString =
+      "Invocation of" +
+        s" ${callee.map(_.calleeDeclarationClass.internalName).getOrElse("?")}.${callsiteInstruction.name + callsiteInstruction.desc}" +
+        s"@${callsiteMethod.instructions.indexOf(callsiteInstruction)}" +
+        s" in ${callsiteClass.internalName}.${callsiteMethod.name}"
+  }
+
+  /**
+   * Information about invocation arguments, obtained through data flow analysis of the callsite method.
+   */
+  sealed trait ArgInfo
+  final case class ArgTypeInfo(argType: BType, isPrecise: Boolean, knownNotNull: Boolean) extends ArgInfo
+  final case class ForwardedParam(index: Int) extends ArgInfo
+  // can be extended, e.g., with constant types
+
+  /**
+   * A callee in the call graph.
+   *
+   * @param callee                 The callee, as it appears in the invocation instruction. For
+   *                               virtual calls, an override of the callee might be invoked. Also,
+   *                               the callee can be abstract.
+   * @param calleeDeclarationClass The class in which the callee is declared
+   * @param safeToInline           True if the callee can be safely inlined: it cannot be overridden,
+   *                               and the inliner settings (project / global) allow inlining it.
+   * @param safeToRewrite          True if the callee is the interface method of a concrete trait method
+   *                               that can be safely re-written to the static implementation method.
+   * @param annotatedInline        True if the callee is annotated @inline
+   * @param annotatedNoInline      True if the callee is annotated @noinline
+   * @param calleeInfoWarning      An inliner warning if some information was not available while
+   *                               gathering the information about this callee.
+   */
+  final case class Callee(callee: MethodNode, calleeDeclarationClass: ClassBType,
+                          safeToInline: Boolean, safeToRewrite: Boolean,
+                          annotatedInline: Boolean, annotatedNoInline: Boolean,
+                          calleeInfoWarning: Option[CalleeInfoWarning]) {
+    assert(!(safeToInline && safeToRewrite), s"A callee of ${callee.name} can be either safeToInline or safeToRewrite, but not both.")
+  }
+
+  final case class ClosureInstantiation(lambdaMetaFactoryCall: LambdaMetaFactoryCall, ownerMethod: MethodNode, ownerClass: ClassBType) {
+    override def toString = s"ClosureInstantiation($lambdaMetaFactoryCall, ${ownerMethod.name + ownerMethod.desc}, $ownerClass)"
+  }
+  final case class LambdaMetaFactoryCall(indy: InvokeDynamicInsnNode, samMethodType: Type, implMethod: Handle, instantiatedMethodType: Type)
+
+  object LambdaMetaFactoryCall {
+    private val lambdaMetaFactoryInternalName: InternalName = "java/lang/invoke/LambdaMetafactory"
+
+    private val metafactoryHandle = {
+      val metafactoryMethodName: String = "metafactory"
+      val metafactoryDesc: String       = "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"
+      new Handle(Opcodes.H_INVOKESTATIC, lambdaMetaFactoryInternalName, metafactoryMethodName, metafactoryDesc)
+    }
+
+    private val altMetafactoryHandle = {
+      val altMetafactoryMethodName: String = "altMetafactory"
+      val altMetafactoryDesc: String       = "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;"
+      new Handle(Opcodes.H_INVOKESTATIC, lambdaMetaFactoryInternalName, altMetafactoryMethodName, altMetafactoryDesc)
+    }
+
+    def unapply(insn: AbstractInsnNode): Option[(InvokeDynamicInsnNode, Type, Handle, Type)] = insn match {
+      case indy: InvokeDynamicInsnNode if indy.bsm == metafactoryHandle || indy.bsm == altMetafactoryHandle =>
+        indy.bsmArgs match {
+          case Array(samMethodType: Type, implMethod: Handle, instantiatedMethodType: Type, xs at _*) => // xs binding because IntelliJ gets confused about _ at _*
+            // LambdaMetaFactory performs a number of automatic adaptations when invoking the lambda
+            // implementation method (casting, boxing, unboxing, and primitive widening, see Javadoc).
+            //
+            // The closure optimizer supports only one of those adaptations: it will cast arguments
+            // to the correct type when re-writing a closure call to the body method. Example:
+            //
+            //   val fun: String => String = l => l
+            //   val l = List("")
+            //   fun(l.head)
+            //
+            // The samMethodType of Function1 is `(Object)Object`, while the instantiatedMethodType
+            // is `(String)String`. The return type of `List.head` is `Object`.
+            //
+            // The implMethod has the signature `C$anonfun(String)String`.
+            //
+            // At the closure callsite, we have an `INVOKEINTERFACE Function1.apply (Object)Object`,
+            // so the object returned by `List.head` can be directly passed into the call (no cast).
+            //
+            // The closure object will cast the object to String before passing it to the implMethod.
+            //
+            // When re-writing the closure callsite to the implMethod, we have to insert a cast.
+            //
+            // The check below ensures that
+            //   (1) the implMethod type has the expected singature (captured types plus argument types
+            //       from instantiatedMethodType)
+            //   (2) the receiver of the implMethod matches the first captured type
+            //   (3) all parameters that are not the same in samMethodType and instantiatedMethodType
+            //       are reference types, so that we can insert casts to perform the same adaptation
+            //       that the closure object would.
+
+            val isStatic                   = implMethod.getTag == Opcodes.H_INVOKESTATIC
+            val indyParamTypes             = Type.getArgumentTypes(indy.desc)
+            val instantiatedMethodArgTypes = instantiatedMethodType.getArgumentTypes
+            val expectedImplMethodType     = {
+              val paramTypes = (if (isStatic) indyParamTypes else indyParamTypes.tail) ++ instantiatedMethodArgTypes
+              Type.getMethodType(instantiatedMethodType.getReturnType, paramTypes: _*)
+            }
+
+            val isIndyLambda = (
+                 Type.getType(implMethod.getDesc) == expectedImplMethodType              // (1)
+              && (isStatic || implMethod.getOwner == indyParamTypes(0).getInternalName)  // (2)
+              && samMethodType.getArgumentTypes.corresponds(instantiatedMethodArgTypes)((samArgType, instArgType) =>
+                   samArgType == instArgType || isReference(samArgType) && isReference(instArgType)) // (3)
+            )
+
+            if (isIndyLambda) Some((indy, samMethodType, implMethod, instantiatedMethodType))
+            else None
+
+          case _ => None
+        }
+      case _ => None
+    }
+  }
+}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala
new file mode 100644
index 0000000..b0dc6ea
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala
@@ -0,0 +1,373 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2015 LAMP/EPFL
+ * @author  Martin Odersky
+ */
+
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import scala.annotation.switch
+import scala.collection.immutable
+import scala.reflect.internal.util.NoPosition
+import scala.tools.asm.{Type, Opcodes}
+import scala.tools.asm.tree._
+import scala.tools.nsc.backend.jvm.BTypes.InternalName
+import scala.tools.nsc.backend.jvm.analysis.ProdConsAnalyzer
+import BytecodeUtils._
+import BackendReporting._
+import Opcodes._
+import scala.tools.nsc.backend.jvm.opt.ByteCodeRepository.CompilationUnit
+import scala.collection.convert.decorateAsScala._
+
+class ClosureOptimizer[BT <: BTypes](val btypes: BT) {
+  import btypes._
+  import callGraph._
+
+  /**
+   * If a closure is allocated and invoked within the same method, re-write the invocation to the
+   * closure body method.
+   *
+   * Note that the closure body method (generated by delambdafy:method) takes additional parameters
+   * for the values captured by the closure. The bytecode is transformed from
+   *
+   *   [generate captured values]
+   *   [closure init, capturing values]
+   *   [...]
+   *   [load closure object]
+   *   [generate closure invocation arguments]
+   *   [invoke closure.apply]
+   *
+   * to
+   *
+   *   [generate captured values]
+   *   [store captured values into new locals]
+   *   [load the captured values from locals]    // a future optimization will eliminate the closure
+   *   [closure init, capturing values]          // instantiation if the closure object becomes unused
+   *   [...]
+   *   [load closure object]
+   *   [generate closure invocation arguments]
+   *   [store argument values into new locals]
+   *   [drop the closure object]
+   *   [load captured values from locals]
+   *   [load argument values from locals]
+   *   [invoke the closure body method]
+   */
+  def rewriteClosureApplyInvocations(): Unit = {
+    implicit object closureInitOrdering extends Ordering[ClosureInstantiation] {
+      override def compare(x: ClosureInstantiation, y: ClosureInstantiation): Int = {
+        val cls = x.ownerClass.internalName compareTo y.ownerClass.internalName
+        if (cls != 0) return cls
+
+        val mName = x.ownerMethod.name compareTo y.ownerMethod.name
+        if (mName != 0) return mName
+
+        val mDesc = x.ownerMethod.desc compareTo y.ownerMethod.desc
+        if (mDesc != 0) return mDesc
+
+        def pos(inst: ClosureInstantiation) = inst.ownerMethod.instructions.indexOf(inst.lambdaMetaFactoryCall.indy)
+        pos(x) - pos(y)
+      }
+    }
+
+    // Grouping the closure instantiations by method allows running the ProdConsAnalyzer only once per
+    // method. Also sort the instantiations: If there are multiple closure instantiations in a method,
+    // closure invocations need to be re-written in a consistent order for bytecode stability. The local
+    // variable slots for storing captured values depends on the order of rewriting.
+    val closureInstantiationsByMethod: Map[MethodNode, immutable.TreeSet[ClosureInstantiation]] = {
+      closureInstantiations.values.groupBy(_.ownerMethod).mapValues(immutable.TreeSet.empty ++ _)
+    }
+
+    // For each closure instantiation, a list of callsites of the closure that can be re-written
+    // If a callsite cannot be rewritten, for example because the lambda body method is not accessible,
+    // a warning is returned instead.
+    val callsitesToRewrite: List[(ClosureInstantiation, List[Either[RewriteClosureApplyToClosureBodyFailed, (MethodInsnNode, Int)]])] = {
+      closureInstantiationsByMethod.iterator.flatMap({
+        case (methodNode, closureInits) =>
+          // A lazy val to ensure the analysis only runs if necessary (the value is passed by name to `closureCallsites`)
+          lazy val prodCons = new ProdConsAnalyzer(methodNode, closureInits.head.ownerClass.internalName)
+          closureInits.iterator.map(init => (init, closureCallsites(init, prodCons)))
+      }).toList // mapping to a list (not a map) to keep the sorting of closureInstantiationsByMethod
+    }
+
+    // Rewrite all closure callsites (or issue inliner warnings for those that cannot be rewritten)
+    for ((closureInit, callsites) <- callsitesToRewrite) {
+      // Local variables that hold the captured values and the closure invocation arguments.
+      // They are lazy vals to ensure that locals for captured values are only allocated if there's
+      // actually a callsite to rewrite (an not only warnings to be issued).
+      lazy val (localsForCapturedValues, argumentLocalsList) = localsForClosureRewrite(closureInit)
+      for (callsite <- callsites) callsite match {
+        case Left(warning) =>
+          backendReporting.inlinerWarning(warning.pos, warning.toString)
+
+        case Right((invocation, stackHeight)) =>
+          rewriteClosureApplyInvocation(closureInit, invocation, stackHeight, localsForCapturedValues, argumentLocalsList)
+      }
+    }
+  }
+
+  /**
+   * Insert instructions to store the values captured by a closure instantiation into local variables,
+   * and load the values back to the stack.
+   *
+   * Returns the list of locals holding those captured values, and a list of locals that should be
+   * used at the closure invocation callsite to store the arguments passed to the closure invocation.
+   */
+  private def localsForClosureRewrite(closureInit: ClosureInstantiation): (LocalsList, LocalsList) = {
+    val ownerMethod = closureInit.ownerMethod
+    val captureLocals = storeCaptures(closureInit)
+
+    // allocate locals for storing the arguments of the closure apply callsites.
+    // if there are multiple callsites, the same locals are re-used.
+    val argTypes = closureInit.lambdaMetaFactoryCall.samMethodType.getArgumentTypes
+    val firstArgLocal = ownerMethod.maxLocals
+
+    // The comment in the unapply method of `LambdaMetaFactoryCall` explains why we have to introduce
+    // casts for arguments that have different types in samMethodType and instantiatedMethodType.
+    val castLoadTypes = {
+      val instantiatedMethodType = closureInit.lambdaMetaFactoryCall.instantiatedMethodType
+      (argTypes, instantiatedMethodType.getArgumentTypes).zipped map {
+        case (samArgType, instantiatedArgType) if samArgType != instantiatedArgType =>
+          // the LambdaMetaFactoryCall extractor ensures that the two types are reference types,
+          // so we don't end up casting primitive values.
+          Some(instantiatedArgType)
+        case _ =>
+          None
+      }
+    }
+    val argLocals = LocalsList.fromTypes(firstArgLocal, argTypes, castLoadTypes)
+    ownerMethod.maxLocals = firstArgLocal + argLocals.size
+
+    (captureLocals, argLocals)
+  }
+
+  /**
+   * Find all callsites of a closure within the method where the closure is allocated.
+   */
+  private def closureCallsites(closureInit: ClosureInstantiation, prodCons: => ProdConsAnalyzer): List[Either[RewriteClosureApplyToClosureBodyFailed, (MethodInsnNode, Int)]] = {
+    val ownerMethod = closureInit.ownerMethod
+    val ownerClass = closureInit.ownerClass
+    val lambdaBodyHandle = closureInit.lambdaMetaFactoryCall.implMethod
+
+    ownerMethod.instructions.iterator.asScala.collect({
+      case invocation: MethodInsnNode if isSamInvocation(invocation, closureInit, prodCons) =>
+        // TODO: This is maybe over-cautious.
+        // We are checking if the closure body method is accessible at the closure callsite.
+        // If the closure allocation has access to the body method, then the callsite (in the same
+        // method as the alloction) should have access too.
+        val bodyAccessible: Either[OptimizerWarning, Boolean] = for {
+          (bodyMethodNode, declClass) <- byteCodeRepository.methodNode(lambdaBodyHandle.getOwner, lambdaBodyHandle.getName, lambdaBodyHandle.getDesc): Either[OptimizerWarning, (MethodNode, InternalName)]
+          isAccessible                <- inliner.memberIsAccessible(bodyMethodNode.access, classBTypeFromParsedClassfile(declClass), classBTypeFromParsedClassfile(lambdaBodyHandle.getOwner), ownerClass)
+        } yield {
+          isAccessible
+        }
+
+        def pos = callGraph.callsites.get(invocation).map(_.callsitePosition).getOrElse(NoPosition)
+        val stackSize: Either[RewriteClosureApplyToClosureBodyFailed, Int] = bodyAccessible match {
+          case Left(w)      => Left(RewriteClosureAccessCheckFailed(pos, w))
+          case Right(false) => Left(RewriteClosureIllegalAccess(pos, ownerClass.internalName))
+          case _            => Right(prodCons.frameAt(invocation).getStackSize)
+        }
+
+        stackSize.right.map((invocation, _))
+    }).toList
+  }
+
+  private def isSamInvocation(invocation: MethodInsnNode, closureInit: ClosureInstantiation, prodCons: => ProdConsAnalyzer): Boolean = {
+    val indy = closureInit.lambdaMetaFactoryCall.indy
+    if (invocation.getOpcode == INVOKESTATIC) false
+    else {
+      def closureIsReceiver = {
+        val invocationFrame = prodCons.frameAt(invocation)
+        val receiverSlot = {
+          val numArgs = Type.getArgumentTypes(invocation.desc).length
+          invocationFrame.stackTop - numArgs
+        }
+        val receiverProducers = prodCons.initialProducersForValueAt(invocation, receiverSlot)
+        receiverProducers.size == 1 && receiverProducers.head == indy
+      }
+
+      invocation.name == indy.name && {
+        val indySamMethodDesc = closureInit.lambdaMetaFactoryCall.samMethodType.getDescriptor
+        indySamMethodDesc == invocation.desc
+      } &&
+        closureIsReceiver // most expensive check last
+    }
+  }
+
+  private def rewriteClosureApplyInvocation(closureInit: ClosureInstantiation, invocation: MethodInsnNode, stackHeight: Int, localsForCapturedValues: LocalsList, argumentLocalsList: LocalsList): Unit = {
+    val ownerMethod = closureInit.ownerMethod
+    val lambdaBodyHandle = closureInit.lambdaMetaFactoryCall.implMethod
+
+    // store arguments
+    insertStoreOps(invocation, ownerMethod, argumentLocalsList)
+
+    // drop the closure from the stack
+    ownerMethod.instructions.insertBefore(invocation, new InsnNode(POP))
+
+    // load captured values and arguments
+    insertLoadOps(invocation, ownerMethod, localsForCapturedValues)
+    insertLoadOps(invocation, ownerMethod, argumentLocalsList)
+
+    // update maxStack
+    val capturesStackSize = localsForCapturedValues.size
+    val invocationStackHeight = stackHeight + capturesStackSize - 1 // -1 because the closure is gone
+    if (invocationStackHeight > ownerMethod.maxStack)
+      ownerMethod.maxStack = invocationStackHeight
+
+    // replace the callsite with a new call to the body method
+    val bodyOpcode = (lambdaBodyHandle.getTag: @switch) match {
+      case H_INVOKEVIRTUAL    => INVOKEVIRTUAL
+      case H_INVOKESTATIC     => INVOKESTATIC
+      case H_INVOKESPECIAL    => INVOKESPECIAL
+      case H_INVOKEINTERFACE  => INVOKEINTERFACE
+      case H_NEWINVOKESPECIAL =>
+        val insns = ownerMethod.instructions
+        insns.insertBefore(invocation, new TypeInsnNode(NEW, lambdaBodyHandle.getOwner))
+        insns.insertBefore(invocation, new InsnNode(DUP))
+        INVOKESPECIAL
+    }
+    val isInterface = bodyOpcode == INVOKEINTERFACE
+    val bodyInvocation = new MethodInsnNode(bodyOpcode, lambdaBodyHandle.getOwner, lambdaBodyHandle.getName, lambdaBodyHandle.getDesc, isInterface)
+    ownerMethod.instructions.insertBefore(invocation, bodyInvocation)
+
+    val returnType = Type.getReturnType(lambdaBodyHandle.getDesc)
+    fixLoadedNothingOrNullValue(returnType, bodyInvocation, ownerMethod, btypes) // see comment of that method
+
+    ownerMethod.instructions.remove(invocation)
+
+    // update the call graph
+    val originalCallsite = callGraph.callsites.remove(invocation)
+
+    // the method node is needed for building the call graph entry
+    val bodyMethod = byteCodeRepository.methodNode(lambdaBodyHandle.getOwner, lambdaBodyHandle.getName, lambdaBodyHandle.getDesc)
+    def bodyMethodIsBeingCompiled = byteCodeRepository.classNodeAndSource(lambdaBodyHandle.getOwner).map(_._2 == CompilationUnit).getOrElse(false)
+    val bodyMethodCallsite = Callsite(
+      callsiteInstruction = bodyInvocation,
+      callsiteMethod = ownerMethod,
+      callsiteClass = closureInit.ownerClass,
+      callee = bodyMethod.map({
+        case (bodyMethodNode, bodyMethodDeclClass) => Callee(
+          callee = bodyMethodNode,
+          calleeDeclarationClass = classBTypeFromParsedClassfile(bodyMethodDeclClass),
+          safeToInline = compilerSettings.YoptInlineGlobal || bodyMethodIsBeingCompiled,
+          safeToRewrite = false, // the lambda body method is not a trait interface method
+          annotatedInline = false,
+          annotatedNoInline = false,
+          calleeInfoWarning = None)
+      }),
+      argInfos = Nil,
+      callsiteStackHeight = invocationStackHeight,
+      receiverKnownNotNull = true, // see below (*)
+      callsitePosition = originalCallsite.map(_.callsitePosition).getOrElse(NoPosition)
+    )
+    // (*) The documentation in class LambdaMetafactory says:
+    //     "if implMethod corresponds to an instance method, the first capture argument
+    //     (corresponding to the receiver) must be non-null"
+    // Explanation: If the lambda body method is non-static, the receiver is a captured
+    // value. It can only be captured within some instance method, so we know it's non-null.
+    callGraph.callsites(bodyInvocation) = bodyMethodCallsite
+  }
+
+  /**
+   * Stores the values captured by a closure creation into fresh local variables, and loads the
+   * values back onto the stack. Returns the list of locals holding the captured values.
+   */
+  private def storeCaptures(closureInit: ClosureInstantiation): LocalsList = {
+    val indy = closureInit.lambdaMetaFactoryCall.indy
+    val capturedTypes = Type.getArgumentTypes(indy.desc)
+    val firstCaptureLocal = closureInit.ownerMethod.maxLocals
+
+    // This could be optimized: in many cases the captured values are produced by LOAD instructions.
+    // If the variable is not modified within the method, we could avoid introducing yet another
+    // local. On the other hand, further optimizations (copy propagation, remove unused locals) will
+    // clean it up.
+
+    // Captured variables don't need to be cast when loaded at the callsite (castLoadTypes are None).
+    // This is checked in `isClosureInstantiation`: the types of the captured variables in the indy
+    // instruction match exactly the corresponding parameter types in the body method.
+    val localsForCaptures = LocalsList.fromTypes(firstCaptureLocal, capturedTypes, castLoadTypes = _ => None)
+    closureInit.ownerMethod.maxLocals = firstCaptureLocal + localsForCaptures.size
+
+    insertStoreOps(indy, closureInit.ownerMethod, localsForCaptures)
+    insertLoadOps(indy, closureInit.ownerMethod, localsForCaptures)
+
+    localsForCaptures
+  }
+
+  /**
+   * Insert store operations in front of the `before` instruction to copy stack values into the
+   * locals denoted by `localsList`.
+   *
+   * The lowest stack value is stored in the head of the locals list, so the last local is stored first.
+   */
+  private def insertStoreOps(before: AbstractInsnNode, methodNode: MethodNode, localsList: LocalsList) =
+    insertLocalValueOps(before, methodNode, localsList, store = true)
+
+  /**
+   * Insert load operations in front of the `before` instruction to copy the local values denoted
+   * by `localsList` onto the stack.
+   *
+   * The head of the locals list will be the lowest value on the stack, so the first local is loaded first.
+   */
+  private def insertLoadOps(before: AbstractInsnNode, methodNode: MethodNode, localsList: LocalsList) =
+    insertLocalValueOps(before, methodNode, localsList, store = false)
+
+  private def insertLocalValueOps(before: AbstractInsnNode, methodNode: MethodNode, localsList: LocalsList, store: Boolean): Unit = {
+    // If `store` is true, the first instruction needs to store into the last local of the `localsList`.
+    // Load instructions on the other hand are emitted in the order of the list.
+    // To avoid reversing the list, we use `insert(previousInstr)` for stores and `insertBefore(before)` for loads.
+    lazy val previous = before.getPrevious
+    for (l <- localsList.locals) {
+      val varOp = new VarInsnNode(if (store) l.storeOpcode else l.loadOpcode, l.local)
+      if (store) methodNode.instructions.insert(previous, varOp)
+      else methodNode.instructions.insertBefore(before, varOp)
+      if (!store) for (castType <- l.castLoadedValue)
+        methodNode.instructions.insert(varOp, new TypeInsnNode(CHECKCAST, castType.getInternalName))
+    }
+  }
+
+  /**
+   * A list of local variables. Each local stores information about its type, see class [[Local]].
+   */
+  case class LocalsList(locals: List[Local]) {
+    val size = locals.iterator.map(_.size).sum
+  }
+
+  object LocalsList {
+    /**
+     * A list of local variables starting at `firstLocal` that can hold values of the types in the
+     * `types` parameter.
+     *
+     * For example, `fromTypes(3, Array(Int, Long, String))` returns
+     *   Local(3, intOpOffset)  ::
+     *   Local(4, longOpOffset) ::  // note that this local occupies two slots, the next is at 6
+     *   Local(6, refOpOffset)  ::
+     *   Nil
+     */
+    def fromTypes(firstLocal: Int, types: Array[Type], castLoadTypes: Int => Option[Type]): LocalsList = {
+      var sizeTwoOffset = 0
+      val locals: List[Local] = types.indices.map(i => {
+        // The ASM method `type.getOpcode` returns the opcode for operating on a value of `type`.
+        val offset = types(i).getOpcode(ILOAD) - ILOAD
+        val local = Local(firstLocal + i + sizeTwoOffset, offset, castLoadTypes(i))
+        if (local.size == 2) sizeTwoOffset += 1
+        local
+      })(collection.breakOut)
+      LocalsList(locals)
+    }
+  }
+
+  /**
+   * Stores a local variable index the opcode offset required for operating on that variable.
+   *
+   * The xLOAD / xSTORE opcodes are in the following sequence: I, L, F, D, A, so the offset for
+   * a local variable holding a reference (`A`) is 4. See also method `getOpcode` in [[scala.tools.asm.Type]].
+   */
+  case class Local(local: Int, opcodeOffset: Int, castLoadedValue: Option[Type]) {
+    def size = if (loadOpcode == LLOAD || loadOpcode == DLOAD) 2  else 1
+
+    def loadOpcode = ILOAD + opcodeOffset
+    def storeOpcode = ISTORE + opcodeOffset
+  }
+}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/InlineInfoAttribute.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/InlineInfoAttribute.scala
new file mode 100644
index 0000000..e7dd5ab
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/InlineInfoAttribute.scala
@@ -0,0 +1,148 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2014 LAMP/EPFL
+ * @author  Martin Odersky
+ */
+
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import scala.tools.asm._
+import scala.tools.nsc.backend.jvm.BTypes.{InlineInfo, MethodInlineInfo}
+import scala.tools.nsc.backend.jvm.BackendReporting.UnknownScalaInlineInfoVersion
+
+/**
+ * This attribute stores the InlineInfo for a ClassBType as an independent classfile attribute.
+ * The compiler does so for every class being compiled.
+ *
+ * The reason is that a precise InlineInfo can only be obtained if the symbol for a class is available.
+ * For example, we need to know if a method is final in Scala's terms, or if it has the @inline annotation.
+ * Looking up a class symbol for a given class filename is brittle (name-mangling).
+ *
+ * The attribute is also helpful for inlining mixin methods. The mixin phase only adds mixin method
+ * symbols to classes that are being compiled. For all other class symbols, there are no mixin members.
+ * However, the inliner requires an InlineInfo for inlining mixin members. That problem is solved by
+ * reading the InlineInfo from this attribute.
+ *
+ * In principle we could encode the InlineInfo into a Java annotation (instead of a classfile attribute).
+ * However, an attribute allows us to save many bits. In particular, note that the strings in an
+ * InlineInfo are serialized as references to constants in the constant pool, and those strings
+ * (traitImplClassSelfType, method names, method signatures) would exist in there anyway. So the
+ * ScalaInlineAttribute remains relatively compact.
+ */
+case class InlineInfoAttribute(inlineInfo: InlineInfo) extends Attribute(InlineInfoAttribute.attributeName) {
+  /**
+   * Not sure what this method is good for, it is not invoked anywhere in the ASM framework. However,
+   * the example in the ASM manual also overrides it to `false` for custom attributes, so it might be
+   * a good idea.
+   */
+  override def isUnknown: Boolean = false
+
+  /**
+   * Serialize the `inlineInfo` into a byte array. Strings are added to the constant pool and serialized
+   * as references.
+   */
+  override def write(cw: ClassWriter, code: Array[Byte], len: Int, maxStack: Int, maxLocals: Int): ByteVector = {
+    val result = new ByteVector()
+
+    result.putByte(InlineInfoAttribute.VERSION)
+
+    var hasSelfIsFinal = 0
+    if (inlineInfo.isEffectivelyFinal)               hasSelfIsFinal |= 1
+    if (inlineInfo.traitImplClassSelfType.isDefined) hasSelfIsFinal |= 2
+    result.putByte(hasSelfIsFinal)
+
+    for (selfInternalName <- inlineInfo.traitImplClassSelfType) {
+      result.putShort(cw.newUTF8(selfInternalName))
+    }
+
+    // The method count fits in a short (the methods_count in a classfile is also a short)
+    result.putShort(inlineInfo.methodInfos.size)
+
+    // Sort the methodInfos for stability of classfiles
+    for ((nameAndType, info) <- inlineInfo.methodInfos.toList.sortBy(_._1)) {
+      val (name, desc) = nameAndType.span(_ != '(')
+      // Name and desc are added separately because a NameAndType entry also stores them separately.
+      // This makes sure that we use the existing constant pool entries for the method.
+      result.putShort(cw.newUTF8(name))
+      result.putShort(cw.newUTF8(desc))
+
+      var inlineInfo = 0
+      if (info.effectivelyFinal)                    inlineInfo |= 1
+      if (info.traitMethodWithStaticImplementation) inlineInfo |= 2
+      if (info.annotatedInline)                     inlineInfo |= 4
+      if (info.annotatedNoInline)                   inlineInfo |= 8
+      result.putByte(inlineInfo)
+    }
+
+    result
+  }
+
+  /**
+   * De-serialize the attribute into an InlineInfo. The attribute starts at cr.b(off), but we don't
+   * need to access that array directly, we can use the `read` methods provided by the ClassReader.
+   *
+   * `buf` is a pre-allocated character array that is guaranteed to be long enough to hold any
+   * string of the constant pool. So we can use it to invoke `cr.readUTF8`.
+   */
+  override def read(cr: ClassReader, off: Int, len: Int, buf: Array[Char], codeOff: Int, labels: Array[Label]): InlineInfoAttribute = {
+    var next = off
+
+    def nextByte()  = { val r = cr.readByte(next)     ; next += 1; r }
+    def nextUTF8()  = { val r = cr.readUTF8(next, buf); next += 2; r }
+    def nextShort() = { val r = cr.readShort(next)    ; next += 2; r }
+
+    val version = nextByte()
+    if (version == 1) {
+      val hasSelfIsFinal = nextByte()
+      val isFinal = (hasSelfIsFinal & 1) != 0
+      val hasSelf = (hasSelfIsFinal & 2) != 0
+
+      val self = if (hasSelf) {
+        val selfName = nextUTF8()
+        Some(selfName)
+      } else {
+        None
+      }
+
+      val numEntries = nextShort()
+      val infos = (0 until numEntries).map(_ => {
+        val name = nextUTF8()
+        val desc = nextUTF8()
+
+        val inlineInfo = nextByte()
+        val isFinal                             = (inlineInfo & 1) != 0
+        val traitMethodWithStaticImplementation = (inlineInfo & 2) != 0
+        val isInline                            = (inlineInfo & 4) != 0
+        val isNoInline                          = (inlineInfo & 8) != 0
+        (name + desc, MethodInlineInfo(isFinal, traitMethodWithStaticImplementation, isInline, isNoInline))
+      }).toMap
+
+      InlineInfoAttribute(InlineInfo(self, isFinal, infos, None))
+    } else {
+      val msg = UnknownScalaInlineInfoVersion(cr.getClassName, version)
+      InlineInfoAttribute(BTypes.EmptyInlineInfo.copy(warning = Some(msg)))
+    }
+  }
+}
+
+object InlineInfoAttribute {
+  /**
+   * [u1]    version
+   * [u1]    isEffectivelyFinal (<< 0), hasTraitImplClassSelfType (<< 1)
+   * [u2]?   traitImplClassSelfType (reference)
+   * [u2]    numMethodEntries
+   *   [u2]  name (reference)
+   *   [u2]  descriptor (reference)
+   *   [u1]  isFinal (<< 0), traitMethodWithStaticImplementation (<< 1), hasInlineAnnotation (<< 2), hasNoInlineAnnotation (<< 3)
+   */
+  final val VERSION: Byte = 1
+
+  final val attributeName = "ScalaInlineInfo"
+}
+
+/**
+ * In order to instruct the ASM framework to de-serialize the ScalaInlineInfo attribute, we need
+ * to pass a prototype instance when running the class reader.
+ */
+object InlineInfoAttributePrototype extends InlineInfoAttribute(InlineInfo(null, false, null, null))
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala
new file mode 100644
index 0000000..6b2786c
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala
@@ -0,0 +1,775 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2014 LAMP/EPFL
+ * @author  Martin Odersky
+ */
+
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import scala.annotation.tailrec
+import scala.tools.asm
+import asm.Handle
+import asm.Opcodes._
+import asm.tree._
+import scala.collection.convert.decorateAsScala._
+import scala.collection.convert.decorateAsJava._
+import AsmUtils._
+import BytecodeUtils._
+import collection.mutable
+import scala.tools.asm.tree.analysis.SourceInterpreter
+import BackendReporting._
+import scala.tools.nsc.backend.jvm.BTypes.InternalName
+
+class Inliner[BT <: BTypes](val btypes: BT) {
+  import btypes._
+  import callGraph._
+
+  def eliminateUnreachableCodeAndUpdateCallGraph(methodNode: MethodNode, definingClass: InternalName): Unit = {
+    localOpt.minimalRemoveUnreachableCode(methodNode, definingClass) foreach {
+      case invocation: MethodInsnNode  => callGraph.callsites.remove(invocation)
+      case indy: InvokeDynamicInsnNode => callGraph.closureInstantiations.remove(indy)
+      case _ =>
+    }
+  }
+
+  def runInliner(): Unit = {
+    rewriteFinalTraitMethodInvocations()
+
+    for (request <- collectAndOrderInlineRequests) {
+      val Right(callee) = request.callee // collectAndOrderInlineRequests returns callsites with a known callee
+
+      // Inlining a method can create unreachable code. Example:
+      //   def f = throw e
+      //   def g = f; println() // println is unreachable after inlining f
+      // If we have an inline request for a call to g, and f has been already inlined into g, we
+      // need to run DCE before inlining g.
+      eliminateUnreachableCodeAndUpdateCallGraph(callee.callee, callee.calleeDeclarationClass.internalName)
+
+      // DCE above removes unreachable callsites from the call graph. If the inlining request denotes
+      // such an eliminated callsite, do nothing.
+      if (callGraph.callsites contains request.callsiteInstruction) {
+        val r = inline(request.callsiteInstruction, request.callsiteStackHeight, request.callsiteMethod, request.callsiteClass,
+          callee.callee, callee.calleeDeclarationClass,
+          request.receiverKnownNotNull, keepLineNumbers = false)
+
+        for (warning <- r) {
+          if ((callee.annotatedInline && btypes.compilerSettings.YoptWarningEmitAtInlineFailed) || warning.emitWarning(compilerSettings)) {
+            val annotWarn = if (callee.annotatedInline) " is annotated @inline but" else ""
+            val msg = s"${BackendReporting.methodSignature(callee.calleeDeclarationClass.internalName, callee.callee)}$annotWarn could not be inlined:\n$warning"
+            backendReporting.inlinerWarning(request.callsitePosition, msg)
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * Ordering for inline requests. Required to make the inliner deterministic:
+   *   - Always remove the same request when breaking inlining cycles
+   *   - Perform inlinings in a consistent order
+   */
+  object callsiteOrdering extends Ordering[Callsite] {
+    override def compare(x: Callsite, y: Callsite): Int = {
+      val cls = x.callsiteClass.internalName compareTo y.callsiteClass.internalName
+      if (cls != 0) return cls
+
+      val name = x.callsiteMethod.name compareTo y.callsiteMethod.name
+      if (name != 0) return name
+
+      val desc = x.callsiteMethod.desc compareTo y.callsiteMethod.desc
+      if (desc != 0) return desc
+
+      def pos(c: Callsite) = c.callsiteMethod.instructions.indexOf(c.callsiteInstruction)
+      pos(x) - pos(y)
+    }
+  }
+
+  /**
+   * Select callsites from the call graph that should be inlined. The resulting list of inlining
+   * requests is allowed to have cycles, and the callsites can appear in any order.
+   */
+  def selectCallsitesForInlining: List[Callsite] = {
+    callsites.valuesIterator.filter({
+      case callsite @ Callsite(_, _, _, Right(Callee(callee, calleeDeclClass, safeToInline, _, annotatedInline, _, warning)), _, _, _, pos) =>
+        val res = doInlineCallsite(callsite)
+
+        if (!res) {
+          if (annotatedInline && btypes.compilerSettings.YoptWarningEmitAtInlineFailed) {
+            // if the callsite is annotated @inline, we report an inline warning even if the underlying
+            // reason is, for example, mixed compilation (which has a separate -Yopt-warning flag).
+            def initMsg = s"${BackendReporting.methodSignature(calleeDeclClass.internalName, callee)} is annotated @inline but cannot be inlined"
+            def warnMsg = warning.map(" Possible reason:\n" + _).getOrElse("")
+            if (doRewriteTraitCallsite(callsite))
+              backendReporting.inlinerWarning(pos, s"$initMsg: the trait method call could not be rewritten to the static implementation method." + warnMsg)
+            else if (!safeToInline)
+              backendReporting.inlinerWarning(pos, s"$initMsg: the method is not final and may be overridden." + warnMsg)
+            else
+              backendReporting.inlinerWarning(pos, s"$initMsg." + warnMsg)
+          } else if (warning.isDefined && warning.get.emitWarning(compilerSettings)) {
+            // when annotatedInline is false, and there is some warning, the callsite metadata is possibly incomplete.
+            backendReporting.inlinerWarning(pos, s"there was a problem determining if method ${callee.name} can be inlined: \n"+ warning.get)
+          }
+        }
+
+        res
+
+      case Callsite(ins, _, _, Left(warning), _, _, _, pos) =>
+        if (warning.emitWarning(compilerSettings))
+          backendReporting.inlinerWarning(pos, s"failed to determine if ${ins.name} should be inlined:\n$warning")
+        false
+    }).toList
+  }
+
+  /**
+   * The current inlining heuristics are simple: inline calls to methods annotated @inline.
+   */
+  def doInlineCallsite(callsite: Callsite): Boolean = callsite match {
+    case Callsite(_, _, _, Right(Callee(callee, calleeDeclClass, safeToInline, _, annotatedInline, _, warning)), _, _, _, pos) =>
+      if (compilerSettings.YoptInlineHeuristics.value == "everything") safeToInline
+      else annotatedInline && safeToInline
+
+    case _ => false
+  }
+
+  def rewriteFinalTraitMethodInvocations(): Unit = {
+    // Rewriting final trait method callsites to the implementation class enables inlining.
+    // We cannot just iterate over the values of the `callsites` map because the rewrite changes the
+    // map. Therefore we first copy the values to a list.
+    callsites.values.toList.foreach(rewriteFinalTraitMethodInvocation)
+  }
+
+  /**
+   * True for statically resolved trait callsites that should be rewritten to the static implementation method.
+   */
+  def doRewriteTraitCallsite(callsite: Callsite) = callsite.callee match {
+    case Right(Callee(callee, calleeDeclarationClass, safeToInline, true, annotatedInline, annotatedNoInline, infoWarning)) => true
+    case _ => false
+  }
+
+  /**
+   * Rewrite the INVOKEINTERFACE callsite of a final trait method invocation to INVOKESTATIC of the
+   * corresponding method in the implementation class. This enables inlining final trait methods.
+   *
+   * In a final trait method callsite, the callee is safeToInline and the callee method is abstract
+   * (the receiver type is the interface, so the method is abstract).
+   */
+  def rewriteFinalTraitMethodInvocation(callsite: Callsite): Unit = {
+    if (doRewriteTraitCallsite(callsite)) {
+      val Right(Callee(callee, calleeDeclarationClass, _, _, annotatedInline, annotatedNoInline, infoWarning)) = callsite.callee
+
+      val traitMethodArgumentTypes = asm.Type.getArgumentTypes(callee.desc)
+
+      val implClassInternalName = calleeDeclarationClass.internalName + "$class"
+
+      val selfParamTypeV: Either[OptimizerWarning, ClassBType] = calleeDeclarationClass.info.map(_.inlineInfo.traitImplClassSelfType match {
+        case Some(internalName) => classBTypeFromParsedClassfile(internalName)
+        case None               => calleeDeclarationClass
+      })
+
+      def implClassMethodV(implMethodDescriptor: String): Either[OptimizerWarning, MethodNode] = {
+        byteCodeRepository.methodNode(implClassInternalName, callee.name, implMethodDescriptor).map(_._1)
+      }
+
+      // The rewrite reading the implementation class and the implementation method from the bytecode
+      // repository. If either of the two fails, the rewrite is not performed.
+      val res = for {
+        selfParamType        <- selfParamTypeV
+        implMethodDescriptor =  asm.Type.getMethodDescriptor(asm.Type.getReturnType(callee.desc), selfParamType.toASMType +: traitMethodArgumentTypes: _*)
+        implClassMethod      <- implClassMethodV(implMethodDescriptor)
+        implClassBType       =  classBTypeFromParsedClassfile(implClassInternalName)
+        selfTypeOk           <- calleeDeclarationClass.isSubtypeOf(selfParamType)
+      } yield {
+
+        // The self parameter type may be incompatible with the trait type.
+        //   trait T { self: S => def foo = 1 }
+        // The $self parameter type of T$class.foo is S, which may be unrelated to T. If we re-write
+        // a call to T.foo to T$class.foo, we need to cast the receiver to S, otherwise we get a
+        // VerifyError. We run a `SourceInterpreter` to find all producer instructions of the
+        // receiver value and add a cast to the self type after each.
+        if (!selfTypeOk) {
+          // there's no need to run eliminateUnreachableCode here. building the call graph does that
+          // already, no code can become unreachable in the meantime.
+          val analyzer = new AsmAnalyzer(callsite.callsiteMethod, callsite.callsiteClass.internalName, new SourceInterpreter)
+          val receiverValue = analyzer.frameAt(callsite.callsiteInstruction).peekStack(traitMethodArgumentTypes.length)
+          for (i <- receiverValue.insns.asScala) {
+            val cast = new TypeInsnNode(CHECKCAST, selfParamType.internalName)
+            callsite.callsiteMethod.instructions.insert(i, cast)
+          }
+        }
+
+        val newCallsiteInstruction = new MethodInsnNode(INVOKESTATIC, implClassInternalName, callee.name, implMethodDescriptor, false)
+        callsite.callsiteMethod.instructions.insert(callsite.callsiteInstruction, newCallsiteInstruction)
+        callsite.callsiteMethod.instructions.remove(callsite.callsiteInstruction)
+
+        callGraph.callsites.remove(callsite.callsiteInstruction)
+        val staticCallsite = Callsite(
+          callsiteInstruction = newCallsiteInstruction,
+          callsiteMethod      = callsite.callsiteMethod,
+          callsiteClass       = callsite.callsiteClass,
+          callee              = Right(Callee(
+            callee                 = implClassMethod,
+            calleeDeclarationClass = implClassBType,
+            safeToInline           = true,
+            safeToRewrite          = false,
+            annotatedInline        = annotatedInline,
+            annotatedNoInline      = annotatedNoInline,
+            calleeInfoWarning      = infoWarning)),
+          argInfos            = Nil,
+          callsiteStackHeight = callsite.callsiteStackHeight,
+          receiverKnownNotNull = callsite.receiverKnownNotNull,
+          callsitePosition = callsite.callsitePosition
+        )
+        callGraph.callsites(newCallsiteInstruction) = staticCallsite
+      }
+
+      for (warning <- res.left) {
+        val Right(callee) = callsite.callee
+        val newCallee = callee.copy(calleeInfoWarning = Some(RewriteTraitCallToStaticImplMethodFailed(calleeDeclarationClass.internalName, callee.callee.name, callee.callee.desc, warning)))
+        callGraph.callsites(callsite.callsiteInstruction) = callsite.copy(callee = Right(newCallee))
+      }
+    }
+  }
+
+  /**
+   * Returns the callsites that can be inlined. Ensures that the returned inline request graph does
+   * not contain cycles.
+   *
+   * The resulting list is sorted such that the leaves of the inline request graph are on the left.
+   * Once these leaves are inlined, the successive elements will be leaves, etc.
+   */
+  private def collectAndOrderInlineRequests: List[Callsite] = {
+    val requests = selectCallsitesForInlining
+
+    // This map is an index to look up the inlining requests for a method. The value sets are mutable
+    // to allow removing elided requests (to break inlining cycles). The map itself is mutable to
+    // allow efficient building: requests.groupBy would build values as List[Callsite] that need to
+    // be transformed to mutable sets.
+    val inlineRequestsForMethod: mutable.Map[MethodNode, mutable.Set[Callsite]] = mutable.HashMap.empty.withDefaultValue(mutable.HashSet.empty)
+    for (r <- requests) inlineRequestsForMethod.getOrElseUpdate(r.callsiteMethod, mutable.HashSet.empty) += r
+
+    /**
+     * Break cycles in the inline request graph by removing callsites.
+     *
+     * The list `requests` is traversed left-to-right, removing those callsites that are part of a
+     * cycle. Elided callsites are also removed from the `inlineRequestsForMethod` map.
+     */
+    def breakInlineCycles(requests: List[Callsite]): List[Callsite] = {
+      // is there a path of inline requests from start to goal?
+      def isReachable(start: MethodNode, goal: MethodNode): Boolean = {
+        @tailrec def reachableImpl(check: List[MethodNode], visited: Set[MethodNode]): Boolean = check match {
+          case x :: xs =>
+            if (x == goal) true
+            else if (visited(x)) reachableImpl(xs, visited)
+            else {
+              val callees = inlineRequestsForMethod(x).map(_.callee.get.callee)
+              reachableImpl(xs ::: callees.toList, visited + x)
+            }
+
+          case Nil =>
+            false
+        }
+        reachableImpl(List(start), Set.empty)
+      }
+
+      val result = new mutable.ListBuffer[Callsite]()
+      // sort the inline requests to ensure that removing requests is deterministic
+      for (r <- requests.sorted(callsiteOrdering)) {
+        // is there a chain of inlining requests that would inline the callsite method into the callee?
+        if (isReachable(r.callee.get.callee, r.callsiteMethod))
+          inlineRequestsForMethod(r.callsiteMethod) -= r
+        else
+          result += r
+      }
+      result.toList
+    }
+
+    // sort the remaining inline requests such that the leaves appear first, then those requests
+    // that become leaves, etc.
+    def leavesFirst(requests: List[Callsite], visited: Set[Callsite] = Set.empty): List[Callsite] = {
+      if (requests.isEmpty) Nil
+      else {
+        val (leaves, others) = requests.partition(r => {
+          val inlineRequestsForCallee = inlineRequestsForMethod(r.callee.get.callee)
+          inlineRequestsForCallee.forall(visited)
+        })
+        assert(leaves.nonEmpty, requests)
+        leaves ::: leavesFirst(others, visited ++ leaves)
+      }
+    }
+
+    leavesFirst(breakInlineCycles(requests))
+  }
+
+
+  /**
+   * Copy and adapt the instructions of a method to a callsite.
+   *
+   * Preconditions:
+   *   - The maxLocals and maxStack values of the callsite method are correctly computed
+   *   - The callsite method contains no unreachable basic blocks, i.e., running an [[Analyzer]]
+   *     does not produce any `null` frames
+   *
+   * @param callsiteInstruction     The invocation instruction
+   * @param callsiteStackHeight     The stack height at the callsite
+   * @param callsiteMethod          The method in which the invocation occurs
+   * @param callsiteClass           The class in which the callsite method is defined
+   * @param callee                  The invoked method
+   * @param calleeDeclarationClass  The class in which the invoked method is defined
+   * @param receiverKnownNotNull    `true` if the receiver is known to be non-null
+   * @param keepLineNumbers         `true` if LineNumberNodes should be copied to the call site
+   * @return                        `Some(message)` if inlining cannot be performed, `None` otherwise
+   */
+  def inline(callsiteInstruction: MethodInsnNode, callsiteStackHeight: Int, callsiteMethod: MethodNode, callsiteClass: ClassBType,
+             callee: MethodNode, calleeDeclarationClass: ClassBType,
+             receiverKnownNotNull: Boolean, keepLineNumbers: Boolean): Option[CannotInlineWarning] = {
+    canInline(callsiteInstruction, callsiteStackHeight, callsiteMethod, callsiteClass, callee, calleeDeclarationClass) orElse {
+      // New labels for the cloned instructions
+      val labelsMap = cloneLabels(callee)
+      val (clonedInstructions, instructionMap) = cloneInstructions(callee, labelsMap)
+      if (!keepLineNumbers) {
+        removeLineNumberNodes(clonedInstructions)
+      }
+
+      // local vars in the callee are shifted by the number of locals at the callsite
+      val localVarShift = callsiteMethod.maxLocals
+      clonedInstructions.iterator.asScala foreach {
+        case varInstruction: VarInsnNode => varInstruction.`var` += localVarShift
+        case iinc: IincInsnNode          => iinc.`var` += localVarShift
+        case _ => ()
+      }
+
+      // add a STORE instruction for each expected argument, including for THIS instance if any
+      val argStores = new InsnList
+      var nextLocalIndex = callsiteMethod.maxLocals
+      if (!isStaticMethod(callee)) {
+        if (!receiverKnownNotNull) {
+          argStores.add(new InsnNode(DUP))
+          val nonNullLabel = newLabelNode
+          argStores.add(new JumpInsnNode(IFNONNULL, nonNullLabel))
+          argStores.add(new InsnNode(ACONST_NULL))
+          argStores.add(new InsnNode(ATHROW))
+          argStores.add(nonNullLabel)
+        }
+        argStores.add(new VarInsnNode(ASTORE, nextLocalIndex))
+        nextLocalIndex += 1
+      }
+
+      // We just use an asm.Type here, no need to create the MethodBType.
+      val calleAsmType = asm.Type.getMethodType(callee.desc)
+
+      for(argTp <- calleAsmType.getArgumentTypes) {
+        val opc = argTp.getOpcode(ISTORE) // returns the correct xSTORE instruction for argTp
+        argStores.insert(new VarInsnNode(opc, nextLocalIndex)) // "insert" is "prepend" - the last argument is on the top of the stack
+        nextLocalIndex += argTp.getSize
+      }
+
+      clonedInstructions.insert(argStores)
+
+      // label for the exit of the inlined functions. xRETURNs are replaced by GOTOs to this label.
+      val postCallLabel = newLabelNode
+      clonedInstructions.add(postCallLabel)
+
+      // replace xRETURNs:
+      //   - store the return value (if any)
+      //   - clear the stack of the inlined method (insert DROPs)
+      //   - load the return value
+      //   - GOTO postCallLabel
+
+      val returnType = calleAsmType.getReturnType
+      val hasReturnValue = returnType.getSort != asm.Type.VOID
+      val returnValueIndex = callsiteMethod.maxLocals + callee.maxLocals
+      nextLocalIndex += returnType.getSize
+
+      def returnValueStore(returnInstruction: AbstractInsnNode) = {
+        val opc = returnInstruction.getOpcode match {
+          case IRETURN => ISTORE
+          case LRETURN => LSTORE
+          case FRETURN => FSTORE
+          case DRETURN => DSTORE
+          case ARETURN => ASTORE
+        }
+        new VarInsnNode(opc, returnValueIndex)
+      }
+
+      // We run an interpreter to know the stack height at each xRETURN instruction and the sizes
+      // of the values on the stack.
+      val analyzer = new AsmAnalyzer(callee, calleeDeclarationClass.internalName)
+
+      for (originalReturn <- callee.instructions.iterator().asScala if isReturn(originalReturn)) {
+        val frame = analyzer.frameAt(originalReturn)
+        var stackHeight = frame.getStackSize
+
+        val inlinedReturn = instructionMap(originalReturn)
+        val returnReplacement = new InsnList
+
+        def drop(slot: Int) = returnReplacement add getPop(frame.peekStack(slot).getSize)
+
+        // for non-void methods, store the stack top into the return local variable
+        if (hasReturnValue) {
+          returnReplacement add returnValueStore(originalReturn)
+          stackHeight -= 1
+        }
+
+        // drop the rest of the stack
+        for (i <- 0 until stackHeight) drop(i)
+
+        returnReplacement add new JumpInsnNode(GOTO, postCallLabel)
+        clonedInstructions.insert(inlinedReturn, returnReplacement)
+        clonedInstructions.remove(inlinedReturn)
+      }
+
+      // Load instruction for the return value
+      if (hasReturnValue) {
+        val retVarLoad = {
+          val opc = returnType.getOpcode(ILOAD)
+          new VarInsnNode(opc, returnValueIndex)
+        }
+        clonedInstructions.insert(postCallLabel, retVarLoad)
+      }
+
+      callsiteMethod.instructions.insert(callsiteInstruction, clonedInstructions)
+      callsiteMethod.instructions.remove(callsiteInstruction)
+
+      callsiteMethod.localVariables.addAll(cloneLocalVariableNodes(callee, labelsMap, callee.name + "_").asJava)
+      callsiteMethod.tryCatchBlocks.addAll(cloneTryCatchBlockNodes(callee, labelsMap).asJava)
+
+      // Add all invocation instructions and closure instantiations that were inlined to the call graph
+      callee.instructions.iterator().asScala foreach {
+        case originalCallsiteIns: MethodInsnNode =>
+          callGraph.callsites.get(originalCallsiteIns) match {
+            case Some(originalCallsite) =>
+              val newCallsiteIns = instructionMap(originalCallsiteIns).asInstanceOf[MethodInsnNode]
+              callGraph.callsites(newCallsiteIns) = Callsite(
+                callsiteInstruction = newCallsiteIns,
+                callsiteMethod = callsiteMethod,
+                callsiteClass = callsiteClass,
+                callee = originalCallsite.callee,
+                argInfos = Nil, // TODO: re-compute argInfos for new destination (once we actually compute them)
+                callsiteStackHeight = callsiteStackHeight + originalCallsite.callsiteStackHeight,
+                receiverKnownNotNull = originalCallsite.receiverKnownNotNull,
+                callsitePosition = originalCallsite.callsitePosition
+              )
+
+            case None =>
+          }
+
+        case indy: InvokeDynamicInsnNode =>
+          callGraph.closureInstantiations.get(indy) match {
+            case Some(closureInit) =>
+              val newIndy = instructionMap(indy).asInstanceOf[InvokeDynamicInsnNode]
+              callGraph.closureInstantiations(newIndy) = ClosureInstantiation(closureInit.lambdaMetaFactoryCall.copy(indy = newIndy), callsiteMethod, callsiteClass)
+
+            case None =>
+          }
+
+        case _ =>
+      }
+      // Remove the elided invocation from the call graph
+      callGraph.callsites.remove(callsiteInstruction)
+
+      // Inlining a method body can render some code unreachable, see example above (in runInliner).
+      unreachableCodeEliminated -= callsiteMethod
+
+      callsiteMethod.maxLocals += returnType.getSize + callee.maxLocals
+      callsiteMethod.maxStack = math.max(callsiteMethod.maxStack, callee.maxStack + callsiteStackHeight)
+
+      None
+    }
+  }
+
+  /**
+   * Check whether an inling can be performed. Parmeters are described in method [[inline]].
+   * @return `Some(message)` if inlining cannot be performed, `None` otherwise
+   */
+  def canInline(callsiteInstruction: MethodInsnNode, callsiteStackHeight: Int, callsiteMethod: MethodNode, callsiteClass: ClassBType,
+                callee: MethodNode, calleeDeclarationClass: ClassBType): Option[CannotInlineWarning] = {
+
+    def calleeDesc = s"${callee.name} of type ${callee.desc} in ${calleeDeclarationClass.internalName}"
+    def methodMismatch = s"Wrong method node for inlining ${textify(callsiteInstruction)}: $calleeDesc"
+    assert(callsiteInstruction.name == callee.name, methodMismatch)
+    assert(callsiteInstruction.desc == callee.desc, methodMismatch)
+    assert(!isConstructor(callee), s"Constructors cannot be inlined: $calleeDesc")
+    assert(!BytecodeUtils.isAbstractMethod(callee), s"Callee is abstract: $calleeDesc")
+    assert(callsiteMethod.instructions.contains(callsiteInstruction), s"Callsite ${textify(callsiteInstruction)} is not an instruction of $calleeDesc")
+
+    // When an exception is thrown, the stack is cleared before jumping to the handler. When
+    // inlining a method that catches an exception, all values that were on the stack before the
+    // call (in addition to the arguments) would be cleared (SI-6157). So we don't inline methods
+    // with handlers in case there are values on the stack.
+    // Alternatively, we could save all stack values below the method arguments into locals, but
+    // that would be inefficient: we'd need to pop all parameters, save the values, and push the
+    // parameters back for the (inlined) invocation. Similarly for the result after the call.
+    def stackHasNonParameters: Boolean = {
+      val expectedArgs = asm.Type.getArgumentTypes(callsiteInstruction.desc).length + (callsiteInstruction.getOpcode match {
+        case INVOKEVIRTUAL | INVOKESPECIAL | INVOKEINTERFACE => 1
+        case INVOKESTATIC => 0
+        case INVOKEDYNAMIC =>
+          assertionError(s"Unexpected opcode, cannot inline ${textify(callsiteInstruction)}")
+      })
+      callsiteStackHeight > expectedArgs
+    }
+
+    if (codeSizeOKForInlining(callsiteMethod, callee)) {
+      Some(ResultingMethodTooLarge(
+        calleeDeclarationClass.internalName, callee.name, callee.desc,
+        callsiteClass.internalName, callsiteMethod.name, callsiteMethod.desc))
+    } else if (isSynchronizedMethod(callee)) {
+      // Could be done by locking on the receiver, wrapping the inlined code in a try and unlocking
+      // in finally. But it's probably not worth the effort, scala never emits synchronized methods.
+      Some(SynchronizedMethod(calleeDeclarationClass.internalName, callee.name, callee.desc))
+    } else if (isStrictfpMethod(callsiteMethod) != isStrictfpMethod(callee)) {
+      Some(StrictfpMismatch(
+        calleeDeclarationClass.internalName, callee.name, callee.desc,
+        callsiteClass.internalName, callsiteMethod.name, callsiteMethod.desc))
+    } else if (!callee.tryCatchBlocks.isEmpty && stackHasNonParameters) {
+      Some(MethodWithHandlerCalledOnNonEmptyStack(
+        calleeDeclarationClass.internalName, callee.name, callee.desc,
+        callsiteClass.internalName, callsiteMethod.name, callsiteMethod.desc))
+    } else findIllegalAccess(callee.instructions, calleeDeclarationClass, callsiteClass) map {
+      case (illegalAccessIns, None) =>
+        IllegalAccessInstruction(
+          calleeDeclarationClass.internalName, callee.name, callee.desc,
+          callsiteClass.internalName, illegalAccessIns)
+
+      case (illegalAccessIns, Some(warning)) =>
+        IllegalAccessCheckFailed(
+          calleeDeclarationClass.internalName, callee.name, callee.desc,
+          callsiteClass.internalName, illegalAccessIns, warning)
+    }
+  }
+
+  /**
+   * Check if a type is accessible to some class, as defined in JVMS 5.4.4.
+   *  (A1) C is public
+   *  (A2) C and D are members of the same run-time package
+   */
+  def classIsAccessible(accessed: BType, from: ClassBType): Either[OptimizerWarning, Boolean] = (accessed: @unchecked) match {
+    // TODO: A2 requires "same run-time package", which seems to be package + classloader (JMVS 5.3.). is the below ok?
+    case c: ClassBType     => c.isPublic.map(_ || c.packageInternalName == from.packageInternalName)
+    case a: ArrayBType     => classIsAccessible(a.elementType, from)
+    case _: PrimitiveBType => Right(true)
+  }
+
+  /**
+   * Check if a member reference is accessible from the [[destinationClass]], as defined in the
+   * JVMS 5.4.4. Note that the class name in a field / method reference is not necessarily the
+   * class in which the member is declared:
+   *
+   *   class A { def f = 0 }; class B extends A { f }
+   *
+   * The INVOKEVIRTUAL instruction uses a method reference "B.f ()I". Therefore this method has
+   * two parameters:
+   *
+   * @param memberDeclClass The class in which the member is declared (A)
+   * @param memberRefClass  The class used in the member reference (B)
+   *
+   * (B0) JVMS 5.4.3.2 / 5.4.3.3: when resolving a member of class C in D, the class C is resolved
+   * first. According to 5.4.3.1, this requires C to be accessible in D.
+   *
+   * JVMS 5.4.4 summary: A field or method R is accessible to a class D (destinationClass) iff
+   *  (B1) R is public
+   *  (B2) R is protected, declared in C (memberDeclClass) and D is a subclass of C.
+   *       If R is not static, R must contain a symbolic reference to a class T (memberRefClass),
+   *       such that T is either a subclass of D, a superclass of D, or D itself.
+   *       Also (P) needs to be satisfied.
+   *  (B3) R is either protected or has default access and declared by a class in the same
+   *       run-time package as D.
+   *       If R is protected, also (P) needs to be satisfied.
+   *  (B4) R is private and is declared in D.
+   *
+   *  (P) When accessing a protected instance member, the target object on the stack (the receiver)
+   *      has to be a subtype of D (destinationClass). This is enforced by classfile verification
+   *      (https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.1.8).
+   *
+   * TODO: we cannot currently implement (P) because we don't have the necessary information
+   * available. Once we have a type propagation analysis implemented, we can extract the receiver
+   * type from there (https://github.com/scala-opt/scala/issues/13).
+   */
+  def memberIsAccessible(memberFlags: Int, memberDeclClass: ClassBType, memberRefClass: ClassBType, from: ClassBType): Either[OptimizerWarning, Boolean] = {
+    // TODO: B3 requires "same run-time package", which seems to be package + classloader (JMVS 5.3.). is the below ok?
+    def samePackageAsDestination = memberDeclClass.packageInternalName == from.packageInternalName
+    def targetObjectConformsToDestinationClass = false // needs type propagation analysis, see above
+
+    def memberIsAccessibleImpl = {
+      val key = (ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE) & memberFlags
+      key match {
+        case ACC_PUBLIC => // B1
+          Right(true)
+
+        case ACC_PROTECTED => // B2
+          val isStatic = (ACC_STATIC & memberFlags) != 0
+          tryEither {
+            val condB2 = from.isSubtypeOf(memberDeclClass).orThrow && {
+              isStatic || memberRefClass.isSubtypeOf(from).orThrow || from.isSubtypeOf(memberRefClass).orThrow
+            }
+            Right(
+              (condB2 || samePackageAsDestination /* B3 (protected) */) &&
+              (isStatic || targetObjectConformsToDestinationClass) // (P)
+            )
+          }
+
+        case 0 => // B3 (default access)
+          Right(samePackageAsDestination)
+
+        case ACC_PRIVATE => // B4
+          Right(memberDeclClass == from)
+      }
+    }
+
+    classIsAccessible(memberDeclClass, from) match { // B0
+      case Right(true) => memberIsAccessibleImpl
+      case r => r
+    }
+  }
+
+  /**
+   * Returns the first instruction in the `instructions` list that would cause a
+   * [[java.lang.IllegalAccessError]] when inlined into the `destinationClass`.
+   *
+   * If validity of some instruction could not be checked because an error occurred, the instruction
+   * is returned together with a warning message that describes the problem.
+   */
+  def findIllegalAccess(instructions: InsnList, calleeDeclarationClass: ClassBType, destinationClass: ClassBType): Option[(AbstractInsnNode, Option[OptimizerWarning])] = {
+    /**
+     * Check if `instruction` can be transplanted to `destinationClass`.
+     *
+     * If the instruction references a class, method or field that cannot be found in the
+     * byteCodeRepository, it is considered as not legal. This is known to happen in mixed
+     * compilation: for Java classes there is no classfile that could be parsed, nor does the
+     * compiler generate any bytecode.
+     *
+     * Returns a warning message describing the problem if checking the legality for the instruction
+     * failed.
+     */
+    def isLegal(instruction: AbstractInsnNode): Either[OptimizerWarning, Boolean] = instruction match {
+      case ti: TypeInsnNode  =>
+        // NEW, ANEWARRAY, CHECKCAST or INSTANCEOF. For these instructions, the reference
+        // "must be a symbolic reference to a class, array, or interface type" (JVMS 6), so
+        // it can be an internal name, or a full array descriptor.
+        classIsAccessible(bTypeForDescriptorOrInternalNameFromClassfile(ti.desc), destinationClass)
+
+      case ma: MultiANewArrayInsnNode =>
+        // "a symbolic reference to a class, array, or interface type"
+        classIsAccessible(bTypeForDescriptorOrInternalNameFromClassfile(ma.desc), destinationClass)
+
+      case fi: FieldInsnNode =>
+        val fieldRefClass = classBTypeFromParsedClassfile(fi.owner)
+        for {
+          (fieldNode, fieldDeclClassNode) <- byteCodeRepository.fieldNode(fieldRefClass.internalName, fi.name, fi.desc): Either[OptimizerWarning, (FieldNode, InternalName)]
+          fieldDeclClass                  =  classBTypeFromParsedClassfile(fieldDeclClassNode)
+          res                             <- memberIsAccessible(fieldNode.access, fieldDeclClass, fieldRefClass, destinationClass)
+        } yield {
+          res
+        }
+
+      case mi: MethodInsnNode =>
+        if (mi.owner.charAt(0) == '[') Right(true) // array methods are accessible
+        else {
+          def canInlineCall(opcode: Int, methodFlags: Int, methodDeclClass: ClassBType, methodRefClass: ClassBType): Either[OptimizerWarning, Boolean] = {
+            opcode match {
+              case INVOKESPECIAL if mi.name != GenBCode.INSTANCE_CONSTRUCTOR_NAME =>
+                // invokespecial is used for private method calls, super calls and instance constructor calls.
+                // private method and super calls can only be inlined into the same class.
+                Right(destinationClass == calleeDeclarationClass)
+
+              case _ => // INVOKEVIRTUAL, INVOKESTATIC, INVOKEINTERFACE and INVOKESPECIAL of constructors
+                memberIsAccessible(methodFlags, methodDeclClass, methodRefClass, destinationClass)
+            }
+          }
+
+          val methodRefClass = classBTypeFromParsedClassfile(mi.owner)
+          for {
+            (methodNode, methodDeclClassNode) <- byteCodeRepository.methodNode(methodRefClass.internalName, mi.name, mi.desc): Either[OptimizerWarning, (MethodNode, InternalName)]
+            methodDeclClass                   =  classBTypeFromParsedClassfile(methodDeclClassNode)
+            res                               <- canInlineCall(mi.getOpcode, methodNode.access, methodDeclClass, methodRefClass)
+          } yield {
+            res
+          }
+        }
+
+      case _: InvokeDynamicInsnNode if destinationClass == calleeDeclarationClass =>
+        // within the same class, any indy instruction can be inlined
+         Right(true)
+
+      // does the InvokeDynamicInsnNode call LambdaMetaFactory?
+      case LambdaMetaFactoryCall(_, _, implMethod, _) =>
+        // an indy instr points to a "call site specifier" (CSP) [1]
+        //  - a reference to a bootstrap method [2]
+        //    - bootstrap method name
+        //    - references to constant arguments, which can be:
+        //      - constant (string, long, int, float, double)
+        //      - class
+        //      - method type (without name)
+        //      - method handle
+        //  - a method name+type
+        //
+        // execution [3]
+        //  - resolve the CSP, yielding the bootstrap method handle, the static args and the name+type
+        //    - resolution entails accessibility checking [4]
+        //  - execute the `invoke` method of the bootstrap method handle (which is signature polymorphic, check its javadoc)
+        //    - the descriptor for the call is made up from the actual arguments on the stack:
+        //      - the first parameters are "MethodHandles.Lookup, String, MethodType", then the types of the constant arguments,
+        //      - the return type is CallSite
+        //    - the values for the call are
+        //      - the bootstrap method handle of the CSP is the receiver
+        //      - the Lookup object for the class in which the callsite occurs (obtained as through calling MethodHandles.lookup())
+        //      - the method name of the CSP
+        //      - the method type of the CSP
+        //      - the constants of the CSP (primitives are not boxed)
+        //  - the resulting `CallSite` object
+        //    - has as `type` the method type of the CSP
+        //    - is popped from the operand stack
+        //  - the `invokeExact` method (signature polymorphic!) of the `target` method handle of the CallSite is invoked
+        //    - the method descriptor is that of the CSP
+        //    - the receiver is the target of the CallSite
+        //    - the other argument values are those that were on the operand stack at the indy instruction (indyLambda: the captured values)
+        //
+        // [1] http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.10
+        // [2] http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.23
+        // [3] http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokedynamic
+        // [4] http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.4.3
+
+        // We cannot generically check if an `invokedynamic` instruction can be safely inlined into
+        // a different class, that depends on the bootstrap method. The Lookup object passed to the
+        // bootstrap method is a capability to access private members of the callsite class. We can
+        // only move the invokedynamic to a new class if we know that the bootstrap method doesn't
+        // use this capability for otherwise non-accessible members.
+        // In the case of indyLambda, it depends on the visibility of the implMethod handle. If
+        // the implMethod is public, lambdaMetaFactory doesn't use the Lookup object's extended
+        // capability, and we can safely inline the instruction into a different class.
+
+        val methodRefClass = classBTypeFromParsedClassfile(implMethod.getOwner)
+        for {
+          (methodNode, methodDeclClassNode) <- byteCodeRepository.methodNode(methodRefClass.internalName, implMethod.getName, implMethod.getDesc): Either[OptimizerWarning, (MethodNode, InternalName)]
+          methodDeclClass                   =  classBTypeFromParsedClassfile(methodDeclClassNode)
+          res                               <- memberIsAccessible(methodNode.access, methodDeclClass, methodRefClass, destinationClass)
+        } yield {
+          res
+        }
+
+      case _: InvokeDynamicInsnNode => Left(UnknownInvokeDynamicInstruction)
+
+      case ci: LdcInsnNode => ci.cst match {
+        case t: asm.Type => classIsAccessible(bTypeForDescriptorOrInternalNameFromClassfile(t.getInternalName), destinationClass)
+        case _           => Right(true)
+      }
+
+      case _ => Right(true)
+    }
+
+    val it = instructions.iterator.asScala
+    @tailrec def find: Option[(AbstractInsnNode, Option[OptimizerWarning])] = {
+      if (!it.hasNext) None // all instructions are legal
+      else {
+        val i = it.next()
+        isLegal(i) match {
+          case Left(warning) => Some((i, Some(warning))) // checking isLegal for i failed
+          case Right(false)  => Some((i, None))          // an illegal instruction was found
+          case _             => find
+        }
+      }
+    }
+    find
+  }
+}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/InstructionResultSize.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/InstructionResultSize.scala
new file mode 100644
index 0000000..8d744f6
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/InstructionResultSize.scala
@@ -0,0 +1,240 @@
+package scala.tools.nsc.backend.jvm.opt
+
+import scala.annotation.switch
+import scala.tools.asm.{Handle, Type, Opcodes}
+import scala.tools.asm.tree._
+
+object InstructionResultSize {
+  import Opcodes._
+  def apply(instruction: AbstractInsnNode): Int = (instruction.getOpcode: @switch) match {
+    // The order of opcodes is (almost) the same as in Opcodes.java
+    case ACONST_NULL => 1
+
+    case ICONST_M1 |
+         ICONST_0 |
+         ICONST_1 |
+         ICONST_2 |
+         ICONST_3 |
+         ICONST_4 |
+         ICONST_5 => 1
+
+    case LCONST_0 |
+         LCONST_1 => 2
+
+    case FCONST_0 |
+         FCONST_1 |
+         FCONST_2 => 1
+
+    case DCONST_0 |
+         DCONST_1 => 2
+
+    case BIPUSH |
+         SIPUSH => 1
+
+    case LDC =>
+      instruction.asInstanceOf[LdcInsnNode].cst match {
+        case _: java.lang.Integer |
+             _: java.lang.Float |
+             _: String |
+             _: Type |
+             _: Handle => 1
+
+        case _: java.lang.Long |
+             _: java.lang.Double => 2
+      }
+
+    case ILOAD |
+         FLOAD |
+         ALOAD => 1
+
+    case LLOAD |
+         DLOAD => 2
+
+    case IALOAD |
+         FALOAD |
+         AALOAD |
+         BALOAD |
+         CALOAD |
+         SALOAD => 1
+
+    case LALOAD |
+         DALOAD => 2
+
+    case ISTORE |
+         LSTORE |
+         FSTORE |
+         DSTORE |
+         ASTORE => 0
+
+    case IASTORE |
+         LASTORE |
+         FASTORE |
+         DASTORE |
+         AASTORE |
+         BASTORE |
+         CASTORE |
+         SASTORE => 0
+
+    case POP |
+         POP2 => 0
+
+    case DUP |
+         DUP_X1 |
+         DUP_X2 |
+         DUP2 |
+         DUP2_X1 |
+         DUP2_X2 |
+         SWAP => throw new IllegalArgumentException("Can't compute the size of DUP/SWAP without knowing what's on stack top")
+
+    case IADD |
+         FADD => 1
+
+    case LADD |
+         DADD => 2
+
+    case ISUB |
+         FSUB => 1
+
+    case LSUB |
+         DSUB => 2
+
+    case IMUL |
+         FMUL => 1
+
+    case LMUL |
+         DMUL => 2
+
+    case IDIV |
+         FDIV => 1
+
+    case LDIV |
+         DDIV => 2
+
+    case IREM |
+         FREM => 1
+
+    case LREM |
+         DREM => 2
+
+    case INEG |
+         FNEG => 1
+
+    case LNEG |
+         DNEG => 2
+
+    case ISHL |
+         ISHR => 1
+
+    case LSHL |
+         LSHR => 2
+
+    case IUSHR => 1
+
+    case LUSHR => 2
+
+    case IAND |
+         IOR |
+         IXOR => 1
+
+    case LAND |
+         LOR |
+         LXOR => 2
+
+    case IINC => 1
+
+    case I2F |
+         L2I |
+         L2F |
+         F2I |
+         D2I |
+         D2F |
+         I2B |
+         I2C |
+         I2S => 1
+
+    case I2L |
+         I2D |
+         L2D |
+         F2L |
+         F2D |
+         D2L => 2
+
+    case LCMP |
+         FCMPL |
+         FCMPG |
+         DCMPL |
+         DCMPG => 1
+
+    case IFEQ |
+         IFNE |
+         IFLT |
+         IFGE |
+         IFGT |
+         IFLE => 0
+
+    case IF_ICMPEQ |
+         IF_ICMPNE |
+         IF_ICMPLT |
+         IF_ICMPGE |
+         IF_ICMPGT |
+         IF_ICMPLE |
+         IF_ACMPEQ |
+         IF_ACMPNE => 0
+
+    case GOTO => 0
+
+    case JSR => throw new IllegalArgumentException("Subroutines are not supported.")
+
+    case RET => 0
+
+    case TABLESWITCH |
+         LOOKUPSWITCH => 0
+
+    case IRETURN |
+         FRETURN |
+         ARETURN => 1
+
+    case LRETURN |
+         DRETURN => 2
+
+    case RETURN => 0
+
+    case GETSTATIC => Type.getType(instruction.asInstanceOf[FieldInsnNode].desc).getSize
+
+    case PUTSTATIC => 0
+
+    case GETFIELD => Type.getType(instruction.asInstanceOf[FieldInsnNode].desc).getSize
+
+    case PUTFIELD => 0
+
+    case INVOKEVIRTUAL |
+         INVOKESPECIAL |
+         INVOKESTATIC |
+         INVOKEINTERFACE =>
+      val desc = instruction.asInstanceOf[MethodInsnNode].desc
+      Type.getReturnType(desc).getSize
+
+    case INVOKEDYNAMIC =>
+      val desc = instruction.asInstanceOf[InvokeDynamicInsnNode].desc
+      Type.getReturnType(desc).getSize
+
+    case NEW => 1
+
+    case NEWARRAY |
+         ANEWARRAY |
+         ARRAYLENGTH => 1
+
+    case ATHROW => 0
+
+    case CHECKCAST |
+         INSTANCEOF => 1
+
+    case MONITORENTER |
+         MONITOREXIT => 0
+
+    case MULTIANEWARRAY => 1
+
+    case IFNULL |
+         IFNONNULL => 0
+  }
+}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala
index 87ad715..4132710 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala
@@ -8,12 +8,12 @@ package backend.jvm
 package opt
 
 import scala.annotation.switch
-import scala.tools.asm.{Opcodes, MethodWriter, ClassWriter}
-import scala.tools.asm.tree.analysis.{Analyzer, BasicValue, BasicInterpreter}
+import scala.tools.asm.Opcodes
+import scala.tools.asm.tree.analysis.{Analyzer, BasicInterpreter}
 import scala.tools.asm.tree._
 import scala.collection.convert.decorateAsScala._
+import scala.tools.nsc.backend.jvm.BTypes.InternalName
 import scala.tools.nsc.backend.jvm.opt.BytecodeUtils._
-import scala.tools.nsc.settings.ScalaSettings
 
 /**
  * Optimizations within a single method.
@@ -31,7 +31,7 @@ import scala.tools.nsc.settings.ScalaSettings
  *       catch block, and the recursive invocation is not necessary.
  *
  * simplify jumps
- *   - various simplifications, see doc domments of individual optimizations
+ *   - various simplifications, see doc comments of individual optimizations
  *   + changing or eliminating jumps may render some code unreachable, therefore "simplify jumps" is
  *     executed in a loop with "unreachable code"
  *
@@ -46,7 +46,42 @@ import scala.tools.nsc.settings.ScalaSettings
  * stale labels
  *   - eliminate labels that are not referenced, merge sequences of label definitions.
  */
-class LocalOpt(settings: ScalaSettings) {
+class LocalOpt[BT <: BTypes](val btypes: BT) {
+  import LocalOptImpls._
+  import btypes._
+
+  /**
+   * Remove unreachable code from a method.
+   *
+   * This implementation only removes instructions that are unreachable for an ASM analyzer /
+   * interpreter. This ensures that future analyses will not produce `null` frames. The inliner
+   * and call graph builder depend on this property.
+   *
+   * @return A set containing the eliminated instructions
+   */
+  def minimalRemoveUnreachableCode(method: MethodNode, ownerClassName: InternalName): Set[AbstractInsnNode] = {
+    if (method.instructions.size == 0) return Set.empty     // fast path for abstract methods
+    if (unreachableCodeEliminated(method)) return Set.empty // we know there is no unreachable code
+
+    // For correctness, after removing unreachable code, we have to eliminate empty exception
+    // handlers, see scaladoc of def methodOptimizations. Removing an live handler may render more
+    // code unreachable and therefore requires running another round.
+    def removalRound(): Set[AbstractInsnNode] = {
+      val (removedInstructions, liveLabels) = removeUnreachableCodeImpl(method, ownerClassName)
+      val removedRecursively = if (removedInstructions.nonEmpty) {
+        val liveHandlerRemoved = removeEmptyExceptionHandlers(method).exists(h => liveLabels(h.start))
+        if (liveHandlerRemoved) removalRound()
+        else Set.empty
+      } else Set.empty
+      removedInstructions ++ removedRecursively
+    }
+
+    val removedInstructions = removalRound()
+    if (removedInstructions.nonEmpty) removeUnusedLocalVariableNodes(method)()
+    unreachableCodeEliminated += method
+    removedInstructions
+  }
+
   /**
    * Remove unreachable instructions from all (non-abstract) methods and apply various other
    * cleanups to the bytecode.
@@ -55,7 +90,7 @@ class LocalOpt(settings: ScalaSettings) {
    * @return      `true` if unreachable code was eliminated in some method, `false` otherwise.
    */
   def methodOptimizations(clazz: ClassNode): Boolean = {
-    !settings.YoptNone && clazz.methods.asScala.foldLeft(false) {
+    !compilerSettings.YoptNone && clazz.methods.asScala.foldLeft(false) {
       case (changed, method) => methodOptimizations(method, clazz.name) || changed
     }
   }
@@ -73,7 +108,7 @@ class LocalOpt(settings: ScalaSettings) {
    *
    * Returns `true` if the bytecode of `method` was changed.
    */
-  private def methodOptimizations(method: MethodNode, ownerClassName: String): Boolean = {
+  def methodOptimizations(method: MethodNode, ownerClassName: InternalName): Boolean = {
     if (method.instructions.size == 0) return false // fast path for abstract methods
 
     // unreachable-code also removes unused local variable nodes and empty exception handlers.
@@ -102,35 +137,36 @@ class LocalOpt(settings: ScalaSettings) {
     // This triggers "ClassFormatError: Illegal exception table range in class file C". Similar
     // for local variables in dead blocks. Maybe that's a bug in the ASM framework.
 
-    var recurse = true
-    var codeHandlersOrJumpsChanged = false
-    while (recurse) {
+    def removalRound(): Boolean = {
       // unreachable-code, empty-handlers and simplify-jumps run until reaching a fixpoint (see doc on class LocalOpt)
-      val (codeRemoved, handlersRemoved, liveHandlerRemoved) = if (settings.YoptUnreachableCode) {
-        val (codeRemoved, liveLabels) = removeUnreachableCodeImpl(method, ownerClassName)
+      val (codeRemoved, handlersRemoved, liveHandlerRemoved) = if (compilerSettings.YoptUnreachableCode) {
+        val (removedInstructions, liveLabels) = removeUnreachableCodeImpl(method, ownerClassName)
         val removedHandlers = removeEmptyExceptionHandlers(method)
-        (codeRemoved, removedHandlers.nonEmpty, removedHandlers.exists(h => liveLabels(h.start)))
+        (removedInstructions.nonEmpty, removedHandlers.nonEmpty, removedHandlers.exists(h => liveLabels(h.start)))
       } else {
         (false, false, false)
       }
 
-      val jumpsChanged = if (settings.YoptSimplifyJumps) simplifyJumps(method) else false
+      val jumpsChanged = if (compilerSettings.YoptSimplifyJumps) simplifyJumps(method) else false
 
-      codeHandlersOrJumpsChanged ||= (codeRemoved || handlersRemoved || jumpsChanged)
+      // Eliminating live handlers and simplifying jump instructions may render more code
+      // unreachable, so we need to run another round.
+      if (liveHandlerRemoved || jumpsChanged) removalRound()
 
-      // The doc comment of class LocalOpt explains why we recurse if jumpsChanged || liveHandlerRemoved
-      recurse = settings.YoptRecurseUnreachableJumps && (jumpsChanged || liveHandlerRemoved)
+      codeRemoved || handlersRemoved || jumpsChanged
     }
 
+    val codeHandlersOrJumpsChanged = removalRound()
+
     // (*) Removing stale local variable descriptors is required for correctness of unreachable-code
     val localsRemoved =
-      if (settings.YoptCompactLocals) compactLocalVariables(method)
-      else if (settings.YoptUnreachableCode) removeUnusedLocalVariableNodes(method)() // (*)
+      if (compilerSettings.YoptCompactLocals) compactLocalVariables(method) // also removes unused
+      else if (compilerSettings.YoptUnreachableCode) removeUnusedLocalVariableNodes(method)() // (*)
       else false
 
-    val lineNumbersRemoved = if (settings.YoptEmptyLineNumbers) removeEmptyLineNumbers(method) else false
+    val lineNumbersRemoved = if (compilerSettings.YoptEmptyLineNumbers) removeEmptyLineNumbers(method) else false
 
-    val labelsRemoved = if (settings.YoptEmptyLabels) removeEmptyLabelNodes(method) else false
+    val labelsRemoved = if (compilerSettings.YoptEmptyLabels) removeEmptyLabelNodes(method) else false
 
     // assert that local variable annotations are empty (we don't emit them) - otherwise we'd have
     // to eliminate those covering an empty range, similar to removeUnusedLocalVariableNodes.
@@ -138,24 +174,32 @@ class LocalOpt(settings: ScalaSettings) {
     assert(nullOrEmpty(method.visibleLocalVariableAnnotations), method.visibleLocalVariableAnnotations)
     assert(nullOrEmpty(method.invisibleLocalVariableAnnotations), method.invisibleLocalVariableAnnotations)
 
+    unreachableCodeEliminated += method
+
     codeHandlersOrJumpsChanged || localsRemoved || lineNumbersRemoved || labelsRemoved
   }
 
+}
+
+object LocalOptImpls {
   /**
    * Removes unreachable basic blocks.
    *
    * TODO: rewrite, don't use computeMaxLocalsMaxStack (runs a ClassWriter) / Analyzer. Too slow.
+   *
+   * @return A set containing eliminated instructions, and a set containing all live label nodes.
    */
-  def removeUnreachableCodeImpl(method: MethodNode, ownerClassName: String): (Boolean, Set[LabelNode]) = {
+  def removeUnreachableCodeImpl(method: MethodNode, ownerClassName: InternalName): (Set[AbstractInsnNode], Set[LabelNode]) = {
     // The data flow analysis requires the maxLocals / maxStack fields of the method to be computed.
     computeMaxLocalsMaxStack(method)
-    val a = new Analyzer[BasicValue](new BasicInterpreter)
+    val a = new Analyzer(new BasicInterpreter)
     a.analyze(ownerClassName, method)
     val frames = a.getFrames
 
     val initialSize = method.instructions.size
     var i = 0
     var liveLabels = Set.empty[LabelNode]
+    var removedInstructions = Set.empty[AbstractInsnNode]
     val itr = method.instructions.iterator()
     while (itr.hasNext) {
       itr.next() match {
@@ -168,11 +212,12 @@ class LocalOpt(settings: ScalaSettings) {
             // Instruction iterators allow removing during iteration.
             // Removing is O(1): instructions are doubly linked list elements.
             itr.remove()
+            removedInstructions += ins
           }
       }
       i += 1
     }
-    (method.instructions.size != initialSize, liveLabels)
+    (removedInstructions, liveLabels)
   }
 
   /**
@@ -217,7 +262,7 @@ class LocalOpt(settings: ScalaSettings) {
    * the same index, but distinct start / end ranges are different variables, they may have not the
    * same type or name.
    */
-  def removeUnusedLocalVariableNodes(method: MethodNode)(fistLocalIndex: Int = parametersSize(method), renumber: Int => Int = identity): Boolean = {
+  def removeUnusedLocalVariableNodes(method: MethodNode)(firstLocalIndex: Int = parametersSize(method), renumber: Int => Int = identity): Boolean = {
     def variableIsUsed(start: AbstractInsnNode, end: LabelNode, varIndex: Int): Boolean = {
       start != end && (start match {
         case v: VarInsnNode if v.`var` == varIndex => true
@@ -231,7 +276,7 @@ class LocalOpt(settings: ScalaSettings) {
       val local = localsIter.next()
       val index = local.index
       // parameters and `this` (the lowest indices, starting at 0) are never removed or renumbered
-      if (index >= fistLocalIndex) {
+      if (index >= firstLocalIndex) {
         if (!variableIsUsed(local.start, local.end, index)) localsIter.remove()
         else if (renumber(index) != index) local.index = renumber(index)
       }
@@ -319,29 +364,6 @@ class LocalOpt(settings: ScalaSettings) {
   }
 
   /**
-   * In order to run an Analyzer, the maxLocals / maxStack fields need to be available. The ASM
-   * framework only computes these values during bytecode generation.
-   *
-   * Since there's currently no better way, we run a bytecode generator on the method and extract
-   * the computed values. This required changes to the ASM codebase:
-   *   - the [[MethodWriter]] class was made public
-   *   - accessors for maxLocals / maxStack were added to the MethodWriter class
-   *
-   * We could probably make this faster (and allocate less memory) by hacking the ASM framework
-   * more: create a subclass of MethodWriter with a /dev/null byteVector. Another option would be
-   * to create a separate visitor for computing those values, duplicating the functionality from the
-   * MethodWriter.
-   */
-  private def computeMaxLocalsMaxStack(method: MethodNode) {
-    val cw = new ClassWriter(ClassWriter.COMPUTE_MAXS)
-    val excs = method.exceptions.asScala.toArray
-    val mw = cw.visitMethod(method.access, method.name, method.desc, method.signature, excs).asInstanceOf[MethodWriter]
-    method.accept(mw)
-    method.maxLocals = mw.getMaxLocals
-    method.maxStack = mw.getMaxStack
-  }
-
-  /**
    * Removes LineNumberNodes that don't describe any executable instructions.
    *
    * This method expects (and asserts) that the `start` label of each LineNumberNode is the
@@ -473,7 +495,7 @@ class LocalOpt(settings: ScalaSettings) {
    * Replace jumps to a sequence of GOTO instructions by a jump to the final destination.
    *
    *      Jump l;  [any ops];  l: GOTO m;  [any ops];  m: GOTO n;  [any ops];   n: NotGOTO; [...]
-   *   => Jump n;  [rest unchaned]
+   *   => Jump n;  [rest unchanged]
    *
    * If there's a loop of GOTOs, the initial jump is replaced by one of the labels in the loop.
    */
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/OptimizerReporting.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/OptimizerReporting.scala
deleted file mode 100644
index 7002e43..0000000
--- a/src/compiler/scala/tools/nsc/backend/jvm/opt/OptimizerReporting.scala
+++ /dev/null
@@ -1,24 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2014 LAMP/EPFL
- * @author  Martin Odersky
- */
-
-package scala.tools.nsc
-package backend.jvm
-
-import scala.tools.asm
-import asm.tree._
-
-/**
- * Reporting utilities used in the optimizer.
- */
-object OptimizerReporting {
-  def methodSignature(className: String, methodName: String, methodDescriptor: String): String = {
-    className + "::" + methodName + methodDescriptor
-  }
-
-  def methodSignature(className: String, method: MethodNode): String = methodSignature(className, method.name, method.desc)
-
-  def inlineFailure(reason: String): Nothing = MissingRequirementError.signal(reason)
-  def assertionError(message: String): Nothing = throw new AssertionError(message)
-}
diff --git a/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala b/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
index 0e6ee76..a7ce7df 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
@@ -170,9 +170,11 @@ abstract class ConstantOptimization extends SubComponent {
         // out all the possibilities
         case Impossible(possible2) => (possible -- possible2).nonEmpty
       })
-      def mightNotEqual(other: Contents): Boolean = (this ne other) && (other match {
-        // two Possibles might not be equal if either has possible members that the other doesn't
-        case Possible(possible2) => (possible -- possible2).nonEmpty || (possible2 -- possible).nonEmpty
+      def mightNotEqual(other: Contents): Boolean = (other match {
+        case Possible(possible2) =>
+          // two Possibles must equal if each is known to be of the same, single value
+          val mustEqual = possible.size == 1 && possible == possible2
+          !mustEqual
         case Impossible(_) => true
       })
     }
@@ -246,7 +248,7 @@ abstract class ConstantOptimization extends SubComponent {
         new State(newVariables, stack.tail)
       }
       /**
-       * Load the specified local onto the top of the stack. An error the the local is uninitialized.
+       * Load the specified local onto the top of the stack. An error if the local is uninitialized.
        */
       def load(variable: Local): State = {
         val contents: Contents = locals.getOrElse(variable, sys.error(s"$variable is not initialized"))
diff --git a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
index 3704acb..8911a3a 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
@@ -173,7 +173,7 @@ abstract class DeadCodeElimination extends SubComponent {
               moveToWorkList()
 
             case LOAD_FIELD(sym, isStatic) if isStatic || !inliner.isClosureClass(sym.owner) =>
-              // static load may trigger static initization.
+              // static load may trigger static initialization.
               // non-static load can throw NPE (but we know closure fields can't be accessed via a
               // null reference.
               moveToWorkList()
@@ -191,7 +191,7 @@ abstract class DeadCodeElimination extends SubComponent {
                   case LOAD_EXCEPTION(_) | DUP(_) | LOAD_MODULE(_) => true
                   case _ =>
                     dropOf((bb1, idx1)) = (bb,idx) :: dropOf.getOrElse((bb1, idx1), Nil)
-                    debuglog("DROP is innessential: " + i + " because of: " + bb1(idx1) + " at " + bb1 + ":" + idx1)
+                    debuglog("DROP is inessential: " + i + " because of: " + bb1(idx1) + " at " + bb1 + ":" + idx1)
                     false
                 }
               }
@@ -378,7 +378,7 @@ abstract class DeadCodeElimination extends SubComponent {
           } else {
             i match {
               case NEW(REFERENCE(sym)) =>
-                log(s"Eliminated instantation of $sym inside $m")
+                log(s"Eliminated instantiation of $sym inside $m")
               case STORE_LOCAL(l) if clobbers contains ((bb, idx)) =>
                 // if an unused instruction was a clobber of a used store to a reference or array type
                 // then we'll replace it with the store of a null to make sure the reference is
diff --git a/src/compiler/scala/tools/nsc/backend/opt/InlineExceptionHandlers.scala b/src/compiler/scala/tools/nsc/backend/opt/InlineExceptionHandlers.scala
index 425c10d..9f6883f 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/InlineExceptionHandlers.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/InlineExceptionHandlers.scala
@@ -343,7 +343,7 @@ abstract class InlineExceptionHandlers extends SubComponent {
     /**
       * This function takes care of duplicating the basic block code for inlining the handler
       *
-      * Note: This function does not duplicate the same basic block twice. It wil contain a map of the duplicated
+      * Note: This function does not duplicate the same basic block twice. It will contain a map of the duplicated
       * basic blocks
       */
     private def duplicateExceptionHandlerCache(handler: BasicBlock) =
diff --git a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
index 8f6fc65..8cd2a14 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
@@ -773,7 +773,7 @@ abstract class Inliners extends SubComponent {
 
         staleOut += block
 
-        tfa.remainingCALLs.remove(instr) // this bookkpeeping is done here and not in MTFAGrowable.reinit due to (1st) convenience and (2nd) necessity.
+        tfa.remainingCALLs.remove(instr) // this bookkeeping is done here and not in MTFAGrowable.reinit due to (1st) convenience and (2nd) necessity.
         tfa.isOnWatchlist.remove(instr)  // ditto
         tfa.warnIfInlineFails.remove(instr)
 
diff --git a/src/compiler/scala/tools/nsc/classpath/ZipAndJarFileLookupFactory.scala b/src/compiler/scala/tools/nsc/classpath/ZipAndJarFileLookupFactory.scala
index 84e21a3..85c7c3c 100644
--- a/src/compiler/scala/tools/nsc/classpath/ZipAndJarFileLookupFactory.scala
+++ b/src/compiler/scala/tools/nsc/classpath/ZipAndJarFileLookupFactory.scala
@@ -61,7 +61,7 @@ object ZipAndJarFlatClassPathFactory extends ZipAndJarFileLookupFactory {
   }
 
   /**
-   * This type of classpath is closly related to the support for JSR-223.
+   * This type of classpath is closely related to the support for JSR-223.
    * Its usage can be observed e.g. when running:
    * jrunscript -classpath scala-compiler.jar;scala-reflect.jar;scala-library.jar -l scala
    * with a particularly prepared scala-library.jar. It should have all classes listed in the manifest like e.g. this entry:
diff --git a/src/compiler/scala/tools/nsc/io/Jar.scala b/src/compiler/scala/tools/nsc/io/Jar.scala
index 2967f67..efb026c 100644
--- a/src/compiler/scala/tools/nsc/io/Jar.scala
+++ b/src/compiler/scala/tools/nsc/io/Jar.scala
@@ -154,7 +154,7 @@ object Jar {
     def update(key: Attributes.Name, value: String) = attrs.put(key, value)
   }
 
-  // See http://download.java.net/jdk7/docs/api/java/nio/file/Path.html
+  // See http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html
   // for some ideas.
   private val ZipMagicNumber = List[Byte](80, 75, 3, 4)
   private def magicNumberIsZip(f: Path) = f.isFile && (f.toFile.bytes().take(4).toList == ZipMagicNumber)
diff --git a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala
index 9433ddc..eb25eb6 100644
--- a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala
+++ b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala
@@ -13,6 +13,7 @@ import symtab.Flags
 import JavaTokens._
 import scala.language.implicitConversions
 import scala.reflect.internal.util.Position
+import scala.reflect.internal.util.ListOfNil
 
 trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners {
   val global : Global
@@ -125,7 +126,7 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners {
     def makeSyntheticParam(count: Int, tpt: Tree): ValDef =
       makeParam(nme.syntheticParamName(count), tpt)
     def makeParam(name: String, tpt: Tree): ValDef =
-      makeParam(name: TermName, tpt)
+      makeParam(TermName(name), tpt)
     def makeParam(name: TermName, tpt: Tree): ValDef =
       ValDef(Modifiers(Flags.JAVA | Flags.PARAM), name, tpt, EmptyTree)
 
@@ -369,7 +370,7 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners {
             flags |= Flags.FINAL
             in.nextToken()
           case DEFAULT =>
-            flags |= Flags.DEFAULTMETHOD
+            flags |= Flags.JAVA_DEFAULTMETHOD
             in.nextToken()
           case NATIVE =>
             addAnnot(NativeAttr)
@@ -488,8 +489,8 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners {
           val vparams = formalParams()
           if (!isVoid) rtpt = optArrayBrackets(rtpt)
           optThrows()
-          val isStatic = mods hasFlag Flags.STATIC
-          val bodyOk = !inInterface || ((mods hasFlag Flags.DEFAULTMETHOD) || isStatic)
+          val isConcreteInterfaceMethod = !inInterface || (mods hasFlag Flags.JAVA_DEFAULTMETHOD) || (mods hasFlag Flags.STATIC)
+          val bodyOk = !(mods1 hasFlag Flags.DEFERRED) && isConcreteInterfaceMethod
           val body =
             if (bodyOk && in.token == LBRACE) {
               methodBody()
@@ -508,7 +509,9 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners {
                 EmptyTree
               }
             }
-          if (inInterface && !isStatic) mods1 |= Flags.DEFERRED
+          // for abstract methods (of classes), the `DEFERRED` flag is alredy set.
+          // here we also set it for interface methods that are not static and not default.
+          if (!isConcreteInterfaceMethod) mods1 |= Flags.DEFERRED
           List {
             atPos(pos) {
               DefDef(mods1, name.toTermName, tparams, List(vparams), rtpt, body)
@@ -748,7 +751,7 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners {
       val (statics, body) = typeBody(AT, name)
       val templ = makeTemplate(annotationParents, body)
       addCompanionObject(statics, atPos(pos) {
-        ClassDef(mods, name, List(), templ)
+        ClassDef(mods | Flags.JAVA_ANNOTATION, name, List(), templ)
       })
     }
 
@@ -760,9 +763,13 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners {
       val interfaces = interfacesOpt()
       accept(LBRACE)
       val buf = new ListBuffer[Tree]
+      var enumIsFinal = true
       def parseEnumConsts() {
         if (in.token != RBRACE && in.token != SEMI && in.token != EOF) {
-          buf += enumConst(enumType)
+          val (const, hasClassBody) = enumConst(enumType)
+          buf += const
+          // if any of the enum constants has a class body, the enum class is not final (JLS 8.9.)
+          enumIsFinal &&= !hasClassBody
           if (in.token == COMMA) {
             in.nextToken()
             parseEnumConsts()
@@ -792,15 +799,25 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners {
       accept(RBRACE)
       val superclazz =
         AppliedTypeTree(javaLangDot(tpnme.Enum), List(enumType))
+      val finalFlag = if (enumIsFinal) Flags.FINAL else 0l
+      val abstractFlag = {
+        // javac adds `ACC_ABSTRACT` to enum classes with deferred members
+        val hasAbstractMember = body exists {
+          case d: DefDef => d.mods.isDeferred
+          case _         => false
+        }
+        if (hasAbstractMember) Flags.ABSTRACT else 0l
+      }
       addCompanionObject(consts ::: statics ::: predefs, atPos(pos) {
-        ClassDef(mods | Flags.ENUM, name, List(),
+        ClassDef(mods | Flags.JAVA_ENUM | finalFlag | abstractFlag, name, List(),
                  makeTemplate(superclazz :: interfaces, body))
       })
     }
 
-    def enumConst(enumType: Tree) = {
+    def enumConst(enumType: Tree): (ValDef, Boolean) = {
       annotations()
-      atPos(in.currentPos) {
+      var hasClassBody = false
+      val res = atPos(in.currentPos) {
         val name = ident()
         if (in.token == LPAREN) {
           // skip arguments
@@ -808,12 +825,14 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners {
           accept(RPAREN)
         }
         if (in.token == LBRACE) {
+          hasClassBody = true
           // skip classbody
           skipAhead()
           accept(RBRACE)
         }
-        ValDef(Modifiers(Flags.ENUM | Flags.STABLE | Flags.JAVA | Flags.STATIC), name.toTermName, enumType, blankExpr)
+        ValDef(Modifiers(Flags.JAVA_ENUM | Flags.STABLE | Flags.JAVA | Flags.STATIC), name.toTermName, enumType, blankExpr)
       }
+      (res, hasClassBody)
     }
 
     def typeDecl(mods: Modifiers): List[Tree] = in.token match {
diff --git a/src/compiler/scala/tools/nsc/plugins/Plugin.scala b/src/compiler/scala/tools/nsc/plugins/Plugin.scala
index 7837f9a..dd17750 100644
--- a/src/compiler/scala/tools/nsc/plugins/Plugin.scala
+++ b/src/compiler/scala/tools/nsc/plugins/Plugin.scala
@@ -7,7 +7,7 @@ package scala.tools.nsc
 package plugins
 
 import scala.tools.nsc.io.{ Jar }
-import scala.tools.nsc.util.ScalaClassLoader
+import scala.reflect.internal.util.ScalaClassLoader
 import scala.reflect.io.{ Directory, File, Path }
 import java.io.InputStream
 import java.util.zip.ZipException
@@ -60,6 +60,8 @@ abstract class Plugin {
    *  @return true to continue, or false to opt out
    */
   def init(options: List[String], error: String => Unit): Boolean = {
+    // call to deprecated method required here, we must continue to support
+    // code that subclasses that override `processOptions`.
     processOptions(options, error)
     true
   }
@@ -156,8 +158,8 @@ object Plugin {
       def loop(qs: List[Path]): Try[PluginDescription] = qs match {
         case Nil       => Failure(new MissingPluginException(ps))
         case p :: rest =>
-          if (p.isDirectory) loadDescriptionFromFile(p.toDirectory / PluginXML)
-          else if (p.isFile) loadDescriptionFromJar(p.toFile)
+          if (p.isDirectory) loadDescriptionFromFile(p.toDirectory / PluginXML) orElse loop(rest)
+          else if (p.isFile) loadDescriptionFromJar(p.toFile) orElse loop(rest)
           else loop(rest)
       }
       loop(ps)
diff --git a/src/compiler/scala/tools/nsc/reporters/Reporter.scala b/src/compiler/scala/tools/nsc/reporters/Reporter.scala
index 3d688ef..bd438f0 100644
--- a/src/compiler/scala/tools/nsc/reporters/Reporter.scala
+++ b/src/compiler/scala/tools/nsc/reporters/Reporter.scala
@@ -20,7 +20,7 @@ abstract class Reporter extends scala.reflect.internal.Reporter {
   /** Informational messages. If `!force`, they may be suppressed. */
   final def info(pos: Position, msg: String, force: Boolean): Unit = info0(pos, msg, INFO, force)
 
-  /** For sending a message which should not be labeled as a warning/error,
+  /** For sending a message which should not be labelled as a warning/error,
    *  but also shouldn't require -verbose to be visible.
    */
   def echo(msg: String): Unit = info(NoPosition, msg, force = true)
diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
index a5b7226..1817cfa 100644
--- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
@@ -76,7 +76,7 @@ trait ScalaSettings extends AbsScalaSettings
     val implicitConversions = Choice("implicitConversions", "Allow definition of implicit functions called views")
     val higherKinds         = Choice("higherKinds",         "Allow higher-kinded types")
     val existentials        = Choice("existentials",        "Existential types (besides wildcard types) can be written and inferred")
-    val macros              = Choice("experimental.macros", "Allow macro defintion (besides implementation and application)")
+    val macros              = Choice("experimental.macros", "Allow macro definition (besides implementation and application)")
   }
   val language      = {
     val description = "Enable or disable language features"
@@ -101,7 +101,8 @@ trait ScalaSettings extends AbsScalaSettings
   val Xhelp              = BooleanSetting      ("-X", "Print a synopsis of advanced options.")
   val checkInit          = BooleanSetting      ("-Xcheckinit", "Wrap field accessors to throw an exception on uninitialized access.")
   val developer          = BooleanSetting      ("-Xdev", "Indicates user is a developer - issue warnings about anything which seems amiss")
-  val noassertions       = BooleanSetting      ("-Xdisable-assertions", "Generate no assertions or assumptions.")
+  val noassertions       = BooleanSetting      ("-Xdisable-assertions", "Generate no assertions or assumptions.") andThen (flag =>
+                                                if (flag) elidebelow.value = elidable.ASSERTION + 1)
   val elidebelow         = IntSetting          ("-Xelide-below", "Calls to @elidable methods are omitted if method priority is lower than argument",
                                                 elidable.MINIMUM, None, elidable.byName get _)
   val noForwarders       = BooleanSetting      ("-Xno-forwarders", "Do not generate static forwarders in mirror classes.")
@@ -139,6 +140,18 @@ trait ScalaSettings extends AbsScalaSettings
   val XnoPatmatAnalysis = BooleanSetting ("-Xno-patmat-analysis", "Don't perform exhaustivity/unreachability analysis. Also, ignore @switch annotation.")
   val XfullLubs         = BooleanSetting ("-Xfull-lubs", "Retains pre 2.10 behavior of less aggressive truncation of least upper bounds.")
 
+  // XML parsing options
+  object XxmlSettings extends MultiChoiceEnumeration {
+    val coalescing   = Choice("coalescing", "Convert PCData to Text and coalesce sibling nodes")
+    def isCoalescing = (Xxml contains coalescing) || (!isScala212 && !Xxml.isSetByUser)
+  }
+  val Xxml = MultiChoiceSetting(
+    name    = "-Xxml",
+    helpArg = "property",
+    descr   = "Configure XML parsing",
+    domain  = XxmlSettings
+  )
+
   /** Compatibility stubs for options whose value name did
    *  not previously match the option name.
    */
@@ -162,6 +175,7 @@ trait ScalaSettings extends AbsScalaSettings
   val YconstOptimization  = BooleanSetting    ("-Yconst-opt", "Perform optimization with constant values.")
   val Ycompacttrees   = BooleanSetting    ("-Ycompact-trees", "Use compact tree printer when displaying trees.")
   val noCompletion    = BooleanSetting    ("-Yno-completion", "Disable tab-completion in the REPL.")
+  val completion      = ChoiceSetting     ("-Ycompletion", "provider", "Select tab-completion in the REPL.", List("pc","adhoc","none"), "pc")
   val Xdce            = BooleanSetting    ("-Ydead-code", "Perform dead code elimination.")
   val debug           = BooleanSetting    ("-Ydebug", "Increase the quantity of debugging output.")
   //val doc           = BooleanSetting    ("-Ydoc", "Generate documentation")
@@ -213,26 +227,31 @@ trait ScalaSettings extends AbsScalaSettings
   // the current standard is "inline" but we are moving towards "method"
   val Ydelambdafy        = ChoiceSetting     ("-Ydelambdafy", "strategy", "Strategy used for translating lambdas into JVM code.", List("inline", "method"), "inline")
 
+  val YskipInlineInfoAttribute = BooleanSetting("-Yskip-inline-info-attribute", "Do not add the ScalaInlineInfo attribute to classfiles generated by -Ybackend:GenASM")
+
   object YoptChoices extends MultiChoiceEnumeration {
     val unreachableCode         = Choice("unreachable-code",          "Eliminate unreachable code, exception handlers protecting no instructions, debug information of eliminated variables.")
     val simplifyJumps           = Choice("simplify-jumps",            "Simplify branching instructions, eliminate unnecessary ones.")
-    val recurseUnreachableJumps = Choice("recurse-unreachable-jumps", "Recursively apply unreachable-code and simplify-jumps (if enabled) until reaching a fixpoint.")
     val emptyLineNumbers        = Choice("empty-line-numbers",        "Eliminate unnecessary line number information.")
     val emptyLabels             = Choice("empty-labels",              "Eliminate and collapse redundant labels in the bytecode.")
     val compactLocals           = Choice("compact-locals",            "Eliminate empty slots in the sequence of local variables.")
+    val nullnessTracking        = Choice("nullness-tracking",         "Track nullness / non-nullness of local variables and apply optimizations.")
+    val closureElimination      = Choice("closure-elimination" ,      "Rewrite closure invocations to the implementation method and eliminate closures.")
+    val inlineProject           = Choice("inline-project",            "Inline only methods defined in the files being compiled.")
+    val inlineGlobal            = Choice("inline-global",             "Inline methods from any source, including classfiles on the compile classpath.")
 
     val lNone           = Choice("l:none",      "Don't enable any optimizations.")
 
     private val defaultChoices = List(unreachableCode)
     val lDefault        = Choice("l:default",   "Enable default optimizations: "+ defaultChoices.mkString(","),                                    expandsTo = defaultChoices)
 
-    private val methodChoices = List(unreachableCode, simplifyJumps, recurseUnreachableJumps, emptyLineNumbers, emptyLabels, compactLocals)
+    private val methodChoices = List(unreachableCode, simplifyJumps, emptyLineNumbers, emptyLabels, compactLocals, nullnessTracking, closureElimination)
     val lMethod         = Choice("l:method",    "Enable intra-method optimizations: "+ methodChoices.mkString(","),                                expandsTo = methodChoices)
 
-    private val projectChoices = List(lMethod)
+    private val projectChoices = List(lMethod, inlineProject)
     val lProject        = Choice("l:project",   "Enable cross-method optimizations within the current project: "+ projectChoices.mkString(","),    expandsTo = projectChoices)
 
-    private val classpathChoices = List(lProject)
+    private val classpathChoices = List(lProject, inlineGlobal)
     val lClasspath      = Choice("l:classpath", "Enable cross-method optimizations across the entire classpath: "+ classpathChoices.mkString(","), expandsTo = classpathChoices)
   }
 
@@ -245,10 +264,53 @@ trait ScalaSettings extends AbsScalaSettings
   def YoptNone                    = Yopt.isSetByUser && Yopt.value.isEmpty
   def YoptUnreachableCode         = !Yopt.isSetByUser || Yopt.contains(YoptChoices.unreachableCode)
   def YoptSimplifyJumps           = Yopt.contains(YoptChoices.simplifyJumps)
-  def YoptRecurseUnreachableJumps = Yopt.contains(YoptChoices.recurseUnreachableJumps)
   def YoptEmptyLineNumbers        = Yopt.contains(YoptChoices.emptyLineNumbers)
   def YoptEmptyLabels             = Yopt.contains(YoptChoices.emptyLabels)
   def YoptCompactLocals           = Yopt.contains(YoptChoices.compactLocals)
+  def YoptNullnessTracking        = Yopt.contains(YoptChoices.nullnessTracking)
+  def YoptClosureElimination      = Yopt.contains(YoptChoices.closureElimination)
+
+  def YoptInlineProject           = Yopt.contains(YoptChoices.inlineProject)
+  def YoptInlineGlobal            = Yopt.contains(YoptChoices.inlineGlobal)
+  def YoptInlinerEnabled          = YoptInlineProject || YoptInlineGlobal
+
+  def YoptBuildCallGraph          = YoptInlinerEnabled || YoptClosureElimination
+  def YoptAddToBytecodeRepository = YoptInlinerEnabled || YoptClosureElimination
+
+  val YoptInlineHeuristics = ChoiceSetting(
+    name = "-Yopt-inline-heuristics",
+    helpArg = "strategy",
+    descr = "Set the heuristics for inlining decisions.",
+    choices = List("at-inline-annotated", "everything"),
+    default = "at-inline-annotated")
+
+  object YoptWarningsChoices extends MultiChoiceEnumeration {
+    val none                               = Choice("none"                       , "No optimizer warnings.")
+    val atInlineFailedSummary              = Choice("at-inline-failed-summary"   , "One-line summary if there were @inline method calls that could not be inlined.")
+    val atInlineFailed                     = Choice("at-inline-failed"           , "A detailed warning for each @inline method call that could not be inlined.")
+    val noInlineMixed                      = Choice("no-inline-mixed"            , "In mixed compilation, warn at callsites methods defined in java sources (the inlining decision cannot be made without bytecode).")
+    val noInlineMissingBytecode            = Choice("no-inline-missing-bytecode" , "Warn if an inlining decision cannot be made because a the bytecode of a class or member cannot be found on the compilation classpath.")
+    val noInlineMissingScalaInlineInfoAttr = Choice("no-inline-missing-attribute", "Warn if an inlining decision cannot be made because a Scala classfile does not have a ScalaInlineInfo attribute.")
+  }
+
+  val YoptWarnings = MultiChoiceSetting(
+    name = "-Yopt-warnings",
+    helpArg = "warning",
+    descr = "Enable optimizer warnings",
+    domain = YoptWarningsChoices,
+    default = Some(List(YoptWarningsChoices.atInlineFailed.name))) withPostSetHook (self => {
+    if (self.value subsetOf Set(YoptWarningsChoices.none, YoptWarningsChoices.atInlineFailedSummary)) YinlinerWarnings.value = false
+    else YinlinerWarnings.value = true
+  })
+
+  def YoptWarningEmitAtInlineFailed =
+    !YoptWarnings.isSetByUser ||
+      YoptWarnings.contains(YoptWarningsChoices.atInlineFailedSummary) ||
+      YoptWarnings.contains(YoptWarningsChoices.atInlineFailed)
+
+  def YoptWarningNoInlineMixed                      = YoptWarnings.contains(YoptWarningsChoices.noInlineMixed)
+  def YoptWarningNoInlineMissingBytecode            = YoptWarnings.contains(YoptWarningsChoices.noInlineMissingBytecode)
+  def YoptWarningNoInlineMissingScalaInlineInfoAttr = YoptWarnings.contains(YoptWarningsChoices.noInlineMissingScalaInlineInfoAttr)
 
   private def removalIn212 = "This flag is scheduled for removal in 2.12. If you have a case where you need this flag then please report a bug."
 
@@ -305,8 +367,8 @@ trait ScalaSettings extends AbsScalaSettings
    */
   val YpresentationVerbose = BooleanSetting("-Ypresentation-verbose", "Print information about presentation compiler tasks.")
   val YpresentationDebug   = BooleanSetting("-Ypresentation-debug",  "Enable debugging output for the presentation compiler.")
-  val YpresentationStrict  = BooleanSetting("-Ypresentation-strict", "Do not report type errors in sources with syntax errors.")
-
+  val YpresentationAnyThread  = BooleanSetting("-Ypresentation-any-thread", "Allow use of the presentation compiler from any thread")
+  val YpresentationStrict     = BooleanSetting("-Ypresentation-strict", "Do not report type errors in sources with syntax errors.")
   val YpresentationLog     = StringSetting("-Ypresentation-log", "file", "Log presentation compiler events into file", "")
   val YpresentationReplay  = StringSetting("-Ypresentation-replay", "file", "Replay presentation compiler events from file", "")
   val YpresentationDelay   = IntSetting("-Ypresentation-delay", "Wait number of ms after typing before starting typechecking", 0, Some((0, 999)), str => Some(str.toInt))
@@ -320,12 +382,7 @@ trait ScalaSettings extends AbsScalaSettings
   /** Test whether this is scaladoc we're looking at */
   def isScaladoc = false
 
-  /**
-   * Helper utilities for use by checkConflictingSettings()
-   */
-  def isBCodeActive   = !isICodeAskedFor
-  def isBCodeAskedFor = (Ybackend.value != "GenASM")
-  def isICodeAskedFor = ((Ybackend.value == "GenASM") || optimiseSettings.exists(_.value) || writeICode.isSetByUser)
+  def isBCodeActive = Ybackend.value == "GenBCode"
 
   object MacroExpand {
     val None = "none"
diff --git a/src/compiler/scala/tools/nsc/settings/Warnings.scala b/src/compiler/scala/tools/nsc/settings/Warnings.scala
index 41ce083..f570037 100644
--- a/src/compiler/scala/tools/nsc/settings/Warnings.scala
+++ b/src/compiler/scala/tools/nsc/settings/Warnings.scala
@@ -23,7 +23,7 @@ trait Warnings {
   val warnValueDiscard     = BooleanSetting("-Ywarn-value-discard", "Warn when non-Unit expression results are unused.")
   val warnNumericWiden     = BooleanSetting("-Ywarn-numeric-widen", "Warn when numerics are widened.")
   // SI-7712, SI-7707 warnUnused not quite ready for prime-time
-  val warnUnused           = BooleanSetting("-Ywarn-unused", "Warn when local and private vals, vars, defs, and types are are unused.")
+  val warnUnused           = BooleanSetting("-Ywarn-unused", "Warn when local and private vals, vars, defs, and types are unused.")
   // currently considered too noisy for general use
   val warnUnusedImport     = BooleanSetting("-Ywarn-unused-import", "Warn when imports are unused.")
 
@@ -49,7 +49,7 @@ trait Warnings {
     val NullaryOverride        = LintWarning("nullary-override",          "Warn when non-nullary `def f()' overrides nullary `def f'.",                true)
     val InferAny               = LintWarning("infer-any",                 "Warn when a type argument is inferred to be `Any`.",                        true)
     val MissingInterpolator    = LintWarning("missing-interpolator",      "A string literal appears to be missing an interpolator id.")
-    val DocDetached            = LintWarning("doc-detached",              "A ScalaDoc comment appears to be detached from its element.")
+    val DocDetached            = LintWarning("doc-detached",              "A Scaladoc comment appears to be detached from its element.")
     val PrivateShadow          = LintWarning("private-shadow",            "A private field (or class parameter) shadows a superclass field.")
     val TypeParameterShadow    = LintWarning("type-parameter-shadow",     "A local type parameter shadows a type already in scope.")
     val PolyImplicitOverload   = LintWarning("poly-implicit-overload",    "Parameterized overloaded implicit methods are not visible as view bounds.")
diff --git a/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala b/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala
index 8fd2ea4..4f5589f 100644
--- a/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala
+++ b/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala
@@ -8,7 +8,6 @@ package symtab
 
 import classfile.ClassfileParser
 import java.io.IOException
-import scala.compat.Platform.currentTime
 import scala.reflect.internal.MissingRequirementError
 import scala.reflect.internal.util.Statistics
 import scala.reflect.io.{ AbstractFile, NoAbstractFile }
@@ -207,7 +206,7 @@ abstract class SymbolLoaders {
 
     override def complete(root: Symbol) {
       try {
-        val start = currentTime
+        val start = java.util.concurrent.TimeUnit.NANOSECONDS.toMillis(System.nanoTime())
         val currentphase = phase
         doComplete(root)
         phase = currentphase
@@ -374,7 +373,7 @@ abstract class SymbolLoaders {
     protected def doComplete(root: Symbol) { root.sourceModule.initialize }
   }
 
-  /** used from classfile parser to avoid cyclies */
+  /** used from classfile parser to avoid cycles */
   var parentsLevel = 0
   var pendingLoadActions: List[() => Unit] = Nil
 }
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index 4d08be3..99e61d2 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -15,6 +15,7 @@ import scala.collection.mutable.{ ListBuffer, ArrayBuffer }
 import scala.annotation.switch
 import scala.reflect.internal.{ JavaAccFlags }
 import scala.reflect.internal.pickling.{PickleBuffer, ByteCodecs}
+import scala.reflect.io.NoAbstractFile
 import scala.tools.nsc.io.AbstractFile
 import scala.tools.nsc.util.ClassFileLookup
 
@@ -52,6 +53,7 @@ abstract class ClassfileParser {
   protected type ThisConstantPool <: ConstantPool
   protected def newConstantPool: ThisConstantPool
 
+  protected var file: AbstractFile     = _  // the class file
   protected var in: AbstractFileReader = _  // the class file reader
   protected var clazz: Symbol = _           // the class symbol containing dynamic members
   protected var staticModule: Symbol = _    // the module symbol containing static members
@@ -82,6 +84,9 @@ abstract class ClassfileParser {
   protected final def u2(): Int = in.nextChar.toInt
   protected final def u4(): Int = in.nextInt
 
+  protected final def s1(): Int = in.nextByte.toInt // sign-extend the byte to int
+  protected final def s2(): Int = (in.nextByte.toInt << 8) | u1 // sign-extend and shift the first byte, or with the unsigned second byte
+
   private def readInnerClassFlags() = readClassFlags()
   private def readClassFlags()      = JavaAccFlags classFlags u2
   private def readMethodFlags()     = JavaAccFlags methodFlags u2
@@ -96,14 +101,14 @@ abstract class ClassfileParser {
 
   private def handleMissing(e: MissingRequirementError) = {
     if (settings.debug) e.printStackTrace
-    throw new IOException(s"Missing dependency '${e.req}', required by ${in.file}")
+    throw new IOException(s"Missing dependency '${e.req}', required by $file")
   }
   private def handleError(e: Exception) = {
     if (settings.debug) e.printStackTrace()
-    throw new IOException(s"class file '${in.file}' is broken\n(${e.getClass}/${e.getMessage})")
+    throw new IOException(s"class file '$file' is broken\n(${e.getClass}/${e.getMessage})")
   }
   private def mismatchError(c: Symbol) = {
-    throw new IOException(s"class file '${in.file}' has location not matching its contents: contains $c")
+    throw new IOException(s"class file '$file' has location not matching its contents: contains $c")
   }
 
   private def parseErrorHandler[T]: PartialFunction[Throwable, T] = {
@@ -130,6 +135,7 @@ abstract class ClassfileParser {
   def parse(file: AbstractFile, root: Symbol): Unit = {
     debuglog("[class] >> " + root.fullName)
 
+    this.file = file
     pushBusy(root) {
       this.in           = new AbstractFileReader(file)
       this.clazz        = if (root.isModule) root.companionClass else root
@@ -281,7 +287,7 @@ abstract class ClassfileParser {
 
     def getType(index: Int): Type              = getType(null, index)
     def getType(sym: Symbol, index: Int): Type = sigToType(sym, getExternalName(index))
-    def getSuperClass(index: Int): Symbol      = if (index == 0) AnyClass else getClassSymbol(index)
+    def getSuperClass(index: Int): Symbol      = if (index == 0) AnyClass else getClassSymbol(index) // the only classfile that is allowed to have `0` in the super_class is java/lang/Object (see jvm spec)
 
     private def createConstant(index: Int): Constant = {
       val start = starts(index)
@@ -536,6 +542,8 @@ abstract class ClassfileParser {
             devWarning(s"no linked class for java enum $sym in ${sym.owner}. A referencing class file might be missing an InnerClasses entry.")
           case linked =>
             if (!linked.isSealed)
+              // Marking the enum class SEALED | ABSTRACT enables exhaustiveness checking.
+              // This is a bit of a hack and requires excluding the ABSTRACT flag in the backend, see method javaClassfileFlags.
               linked setFlag (SEALED | ABSTRACT)
             linked addChild sym
         }
@@ -807,10 +815,10 @@ abstract class ClassfileParser {
           val c = pool.getConstant(u2)
           val c1 = convertTo(c, symtype)
           if (c1 ne null) sym.setInfo(ConstantType(c1))
-          else debugwarn(s"failure to convert $c to $symtype")
+          else devWarning(s"failure to convert $c to $symtype")
         case tpnme.ScalaSignatureATTR =>
           if (!isScalaAnnot) {
-            debugwarn(s"symbol ${sym.fullName} has pickled signature in attribute")
+            devWarning(s"symbol ${sym.fullName} has pickled signature in attribute")
             unpickler.unpickle(in.buf, in.bp, clazz, staticModule, in.file.name)
           }
           in.skip(attrLen)
@@ -857,7 +865,7 @@ abstract class ClassfileParser {
           srcfile0 = settings.outputDirs.srcFilesFor(in.file, srcpath).find(_.exists)
         case tpnme.CodeATTR =>
           if (sym.owner.isInterface) {
-            sym setFlag DEFAULTMETHOD
+            sym setFlag JAVA_DEFAULTMETHOD
             log(s"$sym in ${sym.owner} is a java8+ default method.")
           }
           in.skip(attrLen)
@@ -922,6 +930,7 @@ abstract class ClassfileParser {
       Some(ScalaSigBytes(pool.getBytes(entries.toList)))
     }
 
+    // TODO SI-9296 duplicated code, refactor
     /* Parse and return a single annotation.  If it is malformed,
      * return None.
      */
@@ -1022,11 +1031,18 @@ abstract class ClassfileParser {
       val sflags      = jflags.toScalaFlags
       val owner       = ownerForFlags(jflags)
       val scope       = getScope(jflags)
-      val innerClass  = owner.newClass(name.toTypeName, NoPosition, sflags) setInfo completer
-      val innerModule = owner.newModule(name.toTermName, NoPosition, sflags) setInfo completer
+      def newStub(name: Name) =
+        owner.newStubSymbol(name, s"Class file for ${entry.externalName} not found").setFlag(JAVA)
 
-      innerModule.moduleClass setInfo loaders.moduleClassLoader
-      List(innerClass, innerModule.moduleClass) foreach (_.associatedFile = file)
+      val (innerClass, innerModule) = if (file == NoAbstractFile) {
+        (newStub(name.toTypeName), newStub(name.toTermName))
+      } else {
+        val cls = owner.newClass(name.toTypeName, NoPosition, sflags) setInfo completer
+        val mod = owner.newModule(name.toTermName, NoPosition, sflags) setInfo completer
+        mod.moduleClass setInfo loaders.moduleClassLoader
+        List(cls, mod.moduleClass) foreach (_.associatedFile = file)
+        (cls, mod)
+      }
 
       scope enter innerClass
       scope enter innerModule
@@ -1046,10 +1062,8 @@ abstract class ClassfileParser {
     for (entry <- innerClasses.entries) {
       // create a new class member for immediate inner classes
       if (entry.outerName == currentClass) {
-        val file = classFileLookup.findClassFile(entry.externalName.toString) getOrElse {
-          throw new AssertionError(s"Class file for ${entry.externalName} not found")
-        }
-        enterClassAndModule(entry, file)
+        val file = classFileLookup.findClassFile(entry.externalName.toString)
+        enterClassAndModule(entry, file.getOrElse(NoAbstractFile))
       }
     }
   }
@@ -1103,7 +1117,7 @@ abstract class ClassfileParser {
     def enclosing    = if (jflags.isStatic) enclModule else enclClass
 
     // The name of the outer class, without its trailing $ if it has one.
-    private def strippedOuter = nme stripModuleSuffix outerName
+    private def strippedOuter = outerName.dropModule
     private def isInner       = innerClasses contains strippedOuter
     private def enclClass     = if (isInner) innerClasses innerSymbol strippedOuter else classNameToSymbol(strippedOuter)
     private def enclModule    = enclClass.companionModule
@@ -1123,7 +1137,7 @@ abstract class ClassfileParser {
 
     def add(entry: InnerClassEntry): Unit = {
       inners get entry.externalName foreach (existing =>
-        debugwarn(s"Overwriting inner class entry! Was $existing, now $entry")
+        devWarning(s"Overwriting inner class entry! Was $existing, now $entry")
       )
       inners(entry.externalName) = entry
     }
@@ -1135,16 +1149,12 @@ abstract class ClassfileParser {
     private def innerSymbol(entry: InnerClassEntry): Symbol = {
       val name      = entry.originalName.toTypeName
       val enclosing = entry.enclosing
-      def getMember = (
+      val member = (
         if (enclosing == clazz) entry.scope lookup name
         else lookupMemberAtTyperPhaseIfPossible(enclosing, name)
       )
-      getMember
-      /*  There used to be an assertion that this result is not NoSymbol; changing it to an error
-       *  revealed it had been going off all the time, but has been swallowed by a catch t: Throwable
-       *  in Repository.scala. Since it has been accomplishing nothing except misleading anyone who
-       *  thought it wasn't triggering, I removed it entirely.
-       */
+      def newStub = enclosing.newStubSymbol(name, s"Unable to locate class corresponding to inner class entry for $name in owner ${entry.outerName}")
+      member.orElse(newStub)
     }
   }
 
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala
index bd1fa4e..b2f5a41 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala
@@ -74,7 +74,7 @@ abstract class ICodeReader extends ClassfileParser {
             first != CONSTANT_METHODREF &&
             first != CONSTANT_INTFMETHODREF) errorBadTag(start)
         val ownerTpe = getClassOrArrayType(in.getChar(start + 1).toInt)
-        debuglog("getMemberSymbol(static: " + static + "): owner type: " + ownerTpe + " " + ownerTpe.typeSymbol.originalName)
+        debuglog("getMemberSymbol(static: " + static + "): owner type: " + ownerTpe + " " + ownerTpe.typeSymbol.unexpandedName)
         val (name0, tpe0) = getNameAndType(in.getChar(start + 3).toInt, ownerTpe)
         debuglog("getMemberSymbol: name and tpe: " + name0 + ": " + tpe0)
 
@@ -326,8 +326,8 @@ abstract class ICodeReader extends ClassfileParser {
         case JVM.dconst_0    => code emit CONSTANT(Constant(0.0))
         case JVM.dconst_1    => code emit CONSTANT(Constant(1.0))
 
-        case JVM.bipush      => code.emit(CONSTANT(Constant(u1))); size += 1
-        case JVM.sipush      => code.emit(CONSTANT(Constant(u2))); size += 2
+        case JVM.bipush      => code.emit(CONSTANT(Constant(s1))); size += 1
+        case JVM.sipush      => code.emit(CONSTANT(Constant(s2))); size += 2
         case JVM.ldc         => code.emit(CONSTANT(pool.getConstant(u1))); size += 1
         case JVM.ldc_w       => code.emit(CONSTANT(pool.getConstant(u2))); size += 2
         case JVM.ldc2_w      => code.emit(CONSTANT(pool.getConstant(u2))); size += 2
@@ -466,7 +466,7 @@ abstract class ICodeReader extends ClassfileParser {
           size += 2
           val local = code.getLocal(u1, INT)
           code.emit(LOAD_LOCAL(local))
-          code.emit(CONSTANT(Constant(u1)))
+          code.emit(CONSTANT(Constant(s1)))
           code.emit(CALL_PRIMITIVE(Arithmetic(ADD, INT)))
           code.emit(STORE_LOCAL(local))
 
@@ -599,7 +599,7 @@ abstract class ICodeReader extends ClassfileParser {
           }
         case JVM.invokedynamic  =>
           // TODO, this is just a place holder. A real implementation must parse the class constant entry
-          debuglog("Found JVM invokedynamic instructionm, inserting place holder ICode INVOKE_DYNAMIC.")
+          debuglog("Found JVM invokedynamic instruction, inserting place holder ICode INVOKE_DYNAMIC.")
           containsInvokeDynamic = true
           val poolEntry = in.nextChar.toInt
           in.skip(2)
diff --git a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala
index f786ffb..82e7c76 100644
--- a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala
+++ b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala
@@ -55,7 +55,7 @@ abstract class AddInterfaces extends InfoTransform { self: Erasure =>
   )
 
   /** Does symbol need an implementation method? */
-  private def needsImplMethod(sym: Symbol) = (
+  def needsImplMethod(sym: Symbol) = (
        sym.isMethod
     && isInterfaceMember(sym)
     && (!sym.hasFlag(DEFERRED | SUPERACCESSOR) || (sym hasFlag lateDEFERRED))
@@ -111,7 +111,7 @@ abstract class AddInterfaces extends InfoTransform { self: Erasure =>
     impl setInfo new LazyImplClassType(iface)
   }
 
-  /** Return the implementation class of a trait; create a new one of one does not yet exist */
+  /** Return the implementation class of a trait; create a new one if one does not yet exist */
   def implClass(iface: Symbol): Symbol = {
     iface.info
 
@@ -207,7 +207,7 @@ abstract class AddInterfaces extends InfoTransform { self: Erasure =>
   }
 
   def transformMixinInfo(tp: Type): Type = tp match {
-    case ClassInfoType(parents, decls, clazz) =>
+    case ClassInfoType(parents, decls, clazz) if clazz.isPackageClass || !clazz.isJavaDefined =>
       if (clazz.needsImplClass)
         implClass(clazz setFlag lateINTERFACE) // generate an impl class
 
diff --git a/src/compiler/scala/tools/nsc/transform/Constructors.scala b/src/compiler/scala/tools/nsc/transform/Constructors.scala
index 362cbde..b2aac58 100644
--- a/src/compiler/scala/tools/nsc/transform/Constructors.scala
+++ b/src/compiler/scala/tools/nsc/transform/Constructors.scala
@@ -8,6 +8,7 @@ package transform
 
 import scala.collection.{ mutable, immutable }
 import scala.collection.mutable.ListBuffer
+import scala.reflect.internal.util.ListOfNil
 import symtab.Flags._
 
 /** This phase converts classes with parameters into Java-like classes with
@@ -136,7 +137,7 @@ abstract class Constructors extends Statics with Transform with ast.TreeDSL {
    *       and thus may only be accessed from value or method definitions owned by the current class
    *       (ie there's no point drilling down into nested classes).
    *
-   *   (d) regarding candidates in (b), they are accesible from all places listed in (c) and in addition
+   *   (d) regarding candidates in (b), they are accessible from all places listed in (c) and in addition
    *       from nested classes (nested at any number of levels).
    *
    * In all cases, we're done with traversing as soon as all candidates have been ruled out.
@@ -314,7 +315,7 @@ abstract class Constructors extends Statics with Transform with ast.TreeDSL {
     }
 
     def rewriteDelayedInit() {
-      /* XXX This is not corect: remainingConstrStats.nonEmpty excludes too much,
+      /* XXX This is not correct: remainingConstrStats.nonEmpty excludes too much,
        * but excluding it includes too much.  The constructor sequence being mimicked
        * needs to be reproduced with total fidelity.
        *
@@ -327,7 +328,7 @@ abstract class Constructors extends Statics with Transform with ast.TreeDSL {
         val delayedHook: DefDef = delayedEndpointDef(remainingConstrStats)
         defBuf += delayedHook
         val hookCallerClass = {
-          // transform to make the closure-class' default constructor assign the the outer instance to its param-accessor field.
+          // transform to make the closure-class' default constructor assign the outer instance to its param-accessor field.
           val drillDown = new ConstructorTransformer(unit)
           drillDown transform delayedInitClosure(delayedHook.symbol.asInstanceOf[MethodSymbol])
         }
diff --git a/src/compiler/scala/tools/nsc/transform/Delambdafy.scala b/src/compiler/scala/tools/nsc/transform/Delambdafy.scala
index 1f832ba..8e323de 100644
--- a/src/compiler/scala/tools/nsc/transform/Delambdafy.scala
+++ b/src/compiler/scala/tools/nsc/transform/Delambdafy.scala
@@ -9,23 +9,29 @@ import scala.reflect.internal.Symbols
 import scala.collection.mutable.LinkedHashMap
 
 /**
- * This transformer is responsible for turning lambdas into anonymous classes.
+ * This transformer is responsible for preparing lambdas for runtime, by either translating to anonymous classes
+ * or to a tree that will be convereted to invokedynamic by the JVM 1.8+ backend.
+ *
  * The main assumption it makes is that a lambda {args => body} has been turned into
  * {args => liftedBody()} where lifted body is a top level method that implements the body of the lambda.
  * Currently Uncurry is responsible for that transformation.
  *
- * From a lambda, Delambdafy will create
- * 1) a static forwarder at the top level of the class that contained the lambda
- * 2) a new top level class that
+ * From a lambda, Delambdafy will create:
+ *
+ * Under -target:jvm-1.7 and below:
+ *
+ * 1) a new top level class that
       a) has fields and a constructor taking the captured environment (including possibly the "this"
  *       reference)
- *    b) an apply method that calls the static forwarder
+ *    b) an apply method that calls the target method
  *    c) if needed a bridge method for the apply method
- *  3) an instantiation of the newly created class which replaces the lambda
+ * 2) an instantiation of the newly created class which replaces the lambda
  *
- *  TODO the main work left to be done is to plug into specialization. Primarily that means choosing a
- * specialized FunctionN trait instead of the generic FunctionN trait as a parent and creating the
- * appropriately named applysp method
+ * Under -target:jvm-1.8 with GenBCode:
+ *
+ * 1) An application of the captured arguments to a fictional symbol representing the lambda factory.
+ *    This will be translated by the backed into an invokedynamic using a bootstrap method in JDK8's `LambdaMetaFactory`.
+ *    The captured arguments include `this` if `liftedBody` is unable to be made STATIC.
  */
 abstract class Delambdafy extends Transform with TypingTransformers with ast.TreeDSL with TypeAdaptingTransformer {
   import global._
@@ -76,36 +82,37 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
       referrers
     }
 
-    val accessorMethods = mutable.ArrayBuffer[Tree]()
+    // the result of the transformFunction method.
+    sealed abstract class TransformedFunction
+    // A class definition for the lambda, an expression instantiating the lambda class
+    case class DelambdafyAnonClass(lambdaClassDef: ClassDef, newExpr: Tree) extends TransformedFunction
+    case class InvokeDynamicLambda(tree: Apply) extends TransformedFunction
 
-    // the result of the transformFunction method. A class definition for the lambda, an expression
-    // insantiating the lambda class, and an accessor method for the lambda class to be able to
-    // call the implementation
-    case class TransformedFunction(lambdaClassDef: ClassDef, newExpr: Tree, accessorMethod: Tree)
+    private val boxingBridgeMethods = mutable.ArrayBuffer[Tree]()
 
     // here's the main entry point of the transform
     override def transform(tree: Tree): Tree = tree match {
       // the main thing we care about is lambdas
       case fun @ Function(_, _) =>
-        // a lambda beccomes a new class, an instantiation expression, and an
-        // accessor method
-        val TransformedFunction(lambdaClassDef, newExpr, accessorMethod) = transformFunction(fun)
-        // we'll add accessor methods to the current template later
-        accessorMethods += accessorMethod
-        val pkg = lambdaClassDef.symbol.owner
-
-        // we'll add the lambda class to the package later
-        lambdaClassDefs(pkg) = lambdaClassDef :: lambdaClassDefs(pkg)
-
-        super.transform(newExpr)
-      // when we encounter a template (basically the thing that holds body of a class/trait)
-      // we need to updated it to include newly created accessor methods after transforming it
+        transformFunction(fun) match {
+          case DelambdafyAnonClass(lambdaClassDef, newExpr) =>
+            // a lambda becomes a new class, an instantiation expression
+            val pkg = lambdaClassDef.symbol.owner
+
+            // we'll add the lambda class to the package later
+            lambdaClassDefs(pkg) = lambdaClassDef :: lambdaClassDefs(pkg)
+
+            super.transform(newExpr)
+          case InvokeDynamicLambda(apply) =>
+            // ... or an invokedynamic call
+            super.transform(apply)
+        }
       case Template(_, _, _) =>
         try {
-          // during this call accessorMethods will be populated from the Function case
+          // during this call boxingBridgeMethods will be populated from the Function case
           val Template(parents, self, body) = super.transform(tree)
-          Template(parents, self, body ++ accessorMethods)
-        } finally accessorMethods.clear()
+          Template(parents, self, body ++ boxingBridgeMethods)
+        } finally boxingBridgeMethods.clear()
       case _ => super.transform(tree)
     }
 
@@ -120,8 +127,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
 
     private def optionSymbol(sym: Symbol): Option[Symbol] = if (sym.exists) Some(sym) else None
 
-    // turns a lambda into a new class def, a New expression instantiating that class, and an
-    // accessor method fo the body of the lambda
+    // turns a lambda into a new class def, a New expression instantiating that class
     private def transformFunction(originalFunction: Function): TransformedFunction = {
       val functionTpe = originalFunction.tpe
       val targs = functionTpe.typeArgs
@@ -132,46 +138,75 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
       // passed into the constructor of the anonymous function class
       val captures = FreeVarTraverser.freeVarsOf(originalFunction)
 
-      /**
-       * Creates the apply method for the anonymous subclass of FunctionN
-       */
-      def createAccessorMethod(thisProxy: Symbol, fun: Function): DefDef = {
-        val target = targetMethod(fun)
-        if (!thisProxy.exists) {
-          target setFlag STATIC
+      val target = targetMethod(originalFunction)
+      target.makeNotPrivate(target.owner)
+      if (!thisReferringMethods.contains(target))
+        target setFlag STATIC
+
+      val isStatic = target.hasFlag(STATIC)
+
+      def createBoxingBridgeMethod(functionParamTypes: List[Type], functionResultType: Type): Tree = {
+        // Note: we bail out of this method and return EmptyTree if we find there is no adaptation required.
+        // If we need to improve performance, we could check the types first before creating the
+        // method and parameter symbols.
+        val methSym = oldClass.newMethod(target.name.append("$adapted").toTermName, target.pos, target.flags | FINAL | ARTIFACT)
+        var neededAdaptation = false
+        def boxedType(tpe: Type): Type = {
+          if (isPrimitiveValueClass(tpe.typeSymbol)) {neededAdaptation = true; ObjectTpe}
+          else if (enteringErasure(tpe.typeSymbol.isDerivedValueClass)) {neededAdaptation = true; ObjectTpe}
+          else tpe
         }
-        val params = ((optionSymbol(thisProxy) map {proxy:Symbol => ValDef(proxy)}) ++ (target.paramss.flatten map ValDef.apply)).toList
-
-        val methSym = oldClass.newMethod(unit.freshTermName(nme.accessor.toString() + "$"), target.pos, FINAL | BRIDGE | SYNTHETIC | PROTECTED | STATIC)
-
-        val paramSyms = params map {param => methSym.newSyntheticValueParam(param.symbol.tpe, param.name) }
-
-        params zip paramSyms foreach { case (valdef, sym) => valdef.symbol = sym }
-        params foreach (_.symbol.owner = methSym)
-
-        val methodType = MethodType(paramSyms, restpe)
+        val targetParams: List[Symbol] = target.paramss.head
+        val numCaptures = targetParams.length - functionParamTypes.length
+        val (targetCaptureParams, targetFunctionParams) = targetParams.splitAt(numCaptures)
+        val bridgeParams: List[Symbol] =
+          targetCaptureParams.map(param => methSym.newSyntheticValueParam(param.tpe, param.name.toTermName)) :::
+          map2(targetFunctionParams, functionParamTypes)((param, tp) => methSym.newSyntheticValueParam(boxedType(tp), param.name.toTermName))
+
+        val bridgeResultType: Type = {
+          if (target.info.resultType == UnitTpe && functionResultType != UnitTpe) {
+            neededAdaptation = true
+            ObjectTpe
+          } else
+            boxedType(functionResultType)
+        }
+        val methodType = MethodType(bridgeParams, bridgeResultType)
         methSym setInfo methodType
-
-        oldClass.info.decls enter methSym
-
-        val body = localTyper.typed {
-          val newTarget = Select(if (thisProxy.exists) gen.mkAttributedRef(paramSyms(0)) else gen.mkAttributedThis(oldClass), target)
-          val newParams = paramSyms drop (if (thisProxy.exists) 1 else 0) map Ident
-          Apply(newTarget, newParams)
-        } setPos fun.pos
-        val methDef = DefDef(methSym, List(params), body)
-
-        // Have to repack the type to avoid mismatches when existentials
-        // appear in the result - see SI-4869.
-        // TODO probably don't need packedType
-        methDef.tpt setType localTyper.packedType(body, methSym)
-        methDef
+        if (!neededAdaptation)
+          EmptyTree
+        else {
+          val bridgeParamTrees = bridgeParams.map(ValDef(_))
+
+          oldClass.info.decls enter methSym
+
+          val body = localTyper.typedPos(originalFunction.pos) {
+            val newTarget = Select(gen.mkAttributedThis(oldClass), target)
+            val args: List[Tree] = mapWithIndex(bridgeParams) { (param, i) =>
+              if (i < numCaptures) {
+                gen.mkAttributedRef(param)
+              } else {
+                val functionParam = functionParamTypes(i - numCaptures)
+                val targetParam = targetParams(i)
+                if (enteringErasure(functionParam.typeSymbol.isDerivedValueClass)) {
+                  val casted = cast(gen.mkAttributedRef(param), functionParam)
+                  val unboxed = unbox(casted, ErasedValueType(functionParam.typeSymbol, targetParam.tpe)).modifyType(postErasure.elimErasedValueType)
+                  unboxed
+                } else adaptToType(gen.mkAttributedRef(param), targetParam.tpe)
+              }
+            }
+            gen.mkMethodCall(newTarget, args)
+          }
+          val body1 = if (enteringErasure(functionResultType.typeSymbol.isDerivedValueClass))
+            adaptToType(box(body.setType(ErasedValueType(functionResultType.typeSymbol, body.tpe)), "boxing lambda target"), bridgeResultType)
+          else adaptToType(body, bridgeResultType)
+          val methDef0 = DefDef(methSym, List(bridgeParamTrees), body1)
+          postErasure.newTransformer(unit).transform(methDef0).asInstanceOf[DefDef]
+        }
       }
-
       /**
        * Creates the apply method for the anonymous subclass of FunctionN
        */
-      def createApplyMethod(newClass: Symbol, fun: Function, accessor: DefDef, thisProxy: Symbol): DefDef = {
+      def createApplyMethod(newClass: Symbol, fun: Function, thisProxy: Symbol): DefDef = {
         val methSym = newClass.newMethod(nme.apply, fun.pos, FINAL | SYNTHETIC)
         val params = fun.vparams map (_.duplicate)
 
@@ -187,8 +222,12 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
         newClass.info.decls enter methSym
 
         val Apply(_, oldParams) = fun.body
+        val qual = if (thisProxy.exists)
+          Select(gen.mkAttributedThis(newClass), thisProxy)
+        else
+          gen.mkAttributedThis(oldClass) // sort of a lie, EmptyTree.<static method> would be more honest, but the backend chokes on that.
 
-        val body = localTyper typed Apply(Select(gen.mkAttributedThis(oldClass), accessor.symbol), (optionSymbol(thisProxy) map {tp => Select(gen.mkAttributedThis(newClass), tp)}).toList ++ oldParams)
+        val body = localTyper typed Apply(Select(qual, target), oldParams)
         body.substituteSymbols(fun.vparams map (_.symbol), params map (_.symbol))
         body changeOwner (fun.symbol -> methSym)
 
@@ -238,11 +277,11 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
       val abstractFunctionErasedType = AbstractFunctionClass(formals.length).tpe
 
       // anonymous subclass of FunctionN with an apply method
-      def makeAnonymousClass = {
+      def makeAnonymousClass: ClassDef = {
         val parents = addSerializable(abstractFunctionErasedType)
         val funOwner = originalFunction.symbol.owner
 
-        // TODO harmonize the naming of delamdafy anon-fun classes with those spun up by Uncurry
+        // TODO harmonize the naming of delambdafy anon-fun classes with those spun up by Uncurry
         //      - make `anonClass.isAnonymousClass` true.
         //      - use `newAnonymousClassSymbol` or push the required variations into a similar factory method
         //      - reinstate the assertion in `Erasure.resolveAnonymousBridgeClash`
@@ -255,6 +294,9 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
         val name = unit.freshTypeName(s"$oldClassPart$suffix".replace("$anon", "$nestedInAnon"))
 
         val lambdaClass = pkg newClassSymbol(name, originalFunction.pos, FINAL | SYNTHETIC) addAnnotation SerialVersionUIDAnnotation
+        lambdaClass.associatedFile = unit.source.file
+        // make sure currentRun.compiles(lambdaClass) is true (AddInterfaces does the same for trait impl classes)
+        currentRun.symSource(lambdaClass) = funOwner.sourceFile
         lambdaClass setInfo ClassInfoType(parents, newScope, lambdaClass)
         assert(!lambdaClass.isAnonymousClass && !lambdaClass.isAnonymousFunction, "anonymous class name: "+ lambdaClass.name)
         assert(lambdaClass.isDelambdafyFunction, "not lambda class name: " + lambdaClass.name)
@@ -269,18 +311,16 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
         // the Optional proxy that will hold a reference to the 'this'
         // object used by the lambda, if any. NoSymbol if there is no this proxy
         val thisProxy = {
-          val target = targetMethod(originalFunction)
-          if (thisReferringMethods contains target) {
+          if (isStatic)
+            NoSymbol
+          else {
             val sym = lambdaClass.newVariable(nme.FAKE_LOCAL_THIS, originalFunction.pos, SYNTHETIC)
-            sym.info = oldClass.tpe
-            sym
-          } else NoSymbol
+            sym.setInfo(oldClass.tpe)
+          }
         }
 
         val decapturify = new DeCapturifyTransformer(captureProxies2, unit, oldClass, lambdaClass, originalFunction.symbol.pos, thisProxy)
 
-        val accessorMethod = createAccessorMethod(thisProxy, originalFunction)
-
         val decapturedFunction = decapturify.transform(originalFunction).asInstanceOf[Function]
 
         val members = (optionSymbol(thisProxy).toList ++ (captureProxies2 map (_._2))) map {member =>
@@ -292,7 +332,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
         val constr = createConstructor(lambdaClass, members)
 
         // apply method with same arguments and return type as original lambda.
-        val applyMethodDef = createApplyMethod(lambdaClass, decapturedFunction, accessorMethod, thisProxy)
+        val applyMethodDef = createApplyMethod(lambdaClass, decapturedFunction, thisProxy)
 
         val bridgeMethod = createBridgeMethod(lambdaClass, originalFunction, applyMethodDef)
 
@@ -310,22 +350,73 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
         val body = members ++ List(constr, applyMethodDef) ++ bridgeMethod
 
         // TODO if member fields are private this complains that they're not accessible
-        (localTyper.typedPos(decapturedFunction.pos)(ClassDef(lambdaClass, body)).asInstanceOf[ClassDef], thisProxy, accessorMethod)
+        localTyper.typedPos(decapturedFunction.pos)(ClassDef(lambdaClass, body)).asInstanceOf[ClassDef]
       }
 
-      val (anonymousClassDef, thisProxy, accessorMethod) = makeAnonymousClass
-
-      pkg.info.decls enter anonymousClassDef.symbol
-
-      val thisArg = optionSymbol(thisProxy) map (_ => gen.mkAttributedThis(oldClass) setPos originalFunction.pos)
-      val captureArgs = captures map (capture => Ident(capture) setPos originalFunction.pos)
-
-      val newStat =
-          Typed(New(anonymousClassDef.symbol, (thisArg.toList ++ captureArgs): _*), TypeTree(abstractFunctionErasedType))
+      val allCaptureArgs: List[Tree] = {
+        val thisArg = if (isStatic) Nil else (gen.mkAttributedThis(oldClass) setPos originalFunction.pos) :: Nil
+        val captureArgs = captures.iterator.map(capture => gen.mkAttributedRef(capture) setPos originalFunction.pos).toList
+        thisArg ::: captureArgs
+      }
 
-      val typedNewStat = localTyper.typedPos(originalFunction.pos)(newStat)
+      val arity = originalFunction.vparams.length
+
+      // Reconstruct the type of the function entering erasure.
+      // We do this by taking the type after erasure, and re-boxing `ErasedValueType`.
+      //
+      // Unfortunately, the more obvious `enteringErasure(target.info)` doesn't work
+      // as we would like, value classes in parameter position show up as the unboxed types.
+      val (functionParamTypes, functionResultType) = exitingErasure {
+        def boxed(tp: Type) = tp match {
+          case ErasedValueType(valueClazz, _) => TypeRef(NoPrefix, valueClazz, Nil)
+          case _ => tp
+        }
+        // We don't need to deeply map `boxedValueClassType` over the infos as `ErasedValueType`
+        // will only appear directly as a parameter type in a method signature, as shown
+        // https://gist.github.com/retronym/ba81dbd462282c504ff8
+        val info = target.info
+        val boxedParamTypes = info.paramTypes.takeRight(arity).map(boxed)
+        (boxedParamTypes, boxed(info.resultType))
+      }
+      val functionType = definitions.functionType(functionParamTypes, functionResultType)
+
+      val (functionalInterface, isSpecialized) = java8CompatFunctionalInterface(target, functionType)
+      if (functionalInterface.exists) {
+        // Create a symbol representing a fictional lambda factory method that accepts the captured
+        // arguments and returns a Function.
+        val msym = currentOwner.newMethod(nme.ANON_FUN_NAME, originalFunction.pos, ARTIFACT)
+        val argTypes: List[Type] = allCaptureArgs.map(_.tpe)
+        val params = msym.newSyntheticValueParams(argTypes)
+        msym.setInfo(MethodType(params, functionType))
+        val arity = originalFunction.vparams.length
+
+        val lambdaTarget =
+          if (isSpecialized)
+            target
+          else {
+            createBoxingBridgeMethod(functionParamTypes, functionResultType) match {
+              case EmptyTree =>
+                target
+              case bridge =>
+                boxingBridgeMethods += bridge
+                bridge.symbol
+            }
+          }
 
-      TransformedFunction(anonymousClassDef, typedNewStat, accessorMethod)
+        // We then apply this symbol to the captures.
+        val apply = localTyper.typedPos(originalFunction.pos)(Apply(Ident(msym), allCaptureArgs)).asInstanceOf[Apply]
+
+        // The backend needs to know the target of the lambda and the functional interface in order
+        // to emit the invokedynamic instruction. We pass this information as tree attachment.
+        apply.updateAttachment(LambdaMetaFactoryCapable(lambdaTarget, arity, functionalInterface))
+        InvokeDynamicLambda(apply)
+      } else {
+        val anonymousClassDef = makeAnonymousClass
+        pkg.info.decls enter anonymousClassDef.symbol
+        val newStat = Typed(New(anonymousClassDef.symbol, allCaptureArgs: _*), TypeTree(abstractFunctionErasedType))
+        val typedNewStat = localTyper.typedPos(originalFunction.pos)(newStat)
+        DelambdafyAnonClass(anonymousClassDef, typedNewStat)
+      }
     }
 
     /**
@@ -354,7 +445,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
       def adaptAndPostErase(tree: Tree, pt: Type): (Boolean, Tree) = {
         val (needsAdapt, adaptedTree) = adapt(tree, pt)
         val trans = postErasure.newTransformer(unit)
-        val postErasedTree = trans.atOwner(currentOwner)(trans.transform(adaptedTree)) // SI-8017 elimnates ErasedValueTypes
+        val postErasedTree = trans.atOwner(currentOwner)(trans.transform(adaptedTree)) // SI-8017 eliminates ErasedValueTypes
         (needsAdapt, postErasedTree)
       }
 
@@ -475,4 +566,28 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
         super.traverse(tree)
     }
   }
+
+  final case class LambdaMetaFactoryCapable(target: Symbol, arity: Int, functionalInterface: Symbol)
+
+  // The functional interface that can be used to adapt the lambda target method `target` to the
+  // given function type. Returns `NoSymbol` if the compiler settings are unsuitable.
+  private def java8CompatFunctionalInterface(target: Symbol, functionType: Type): (Symbol, Boolean) = {
+    val canUseLambdaMetafactory: Boolean = {
+      val isTarget18 = settings.target.value.contains("jvm-1.8")
+      settings.isBCodeActive && isTarget18
+    }
+
+    val sym = functionType.typeSymbol
+    val pack = currentRun.runDefinitions.Scala_Java8_CompatPackage
+    val name1 = specializeTypes.specializedFunctionName(sym, functionType.typeArgs)
+    val paramTps :+ restpe = functionType.typeArgs
+    val arity = paramTps.length
+    val isSpecialized = name1.toTypeName != sym.name
+    val functionalInterface = if (!isSpecialized) {
+      currentRun.runDefinitions.Scala_Java8_CompatPackage_JFunction(arity)
+    } else {
+      pack.info.decl(name1.toTypeName.prepend("J"))
+    }
+    (if (canUseLambdaMetafactory) functionalInterface else NoSymbol, isSpecialized)
+  }
 }
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index 5c72bb3..a04625c 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -188,14 +188,16 @@ abstract class Erasure extends AddInterfaces
   /* Drop redundant types (ones which are implemented by some other parent) from the immediate parents.
    * This is important on Android because there is otherwise an interface explosion.
    */
-  def minimizeParents(parents: List[Type]): List[Type] = {
-    var rest   = parents
-    var leaves = collection.mutable.ListBuffer.empty[Type]
+  def minimizeParents(parents: List[Type]): List[Type] = if (parents.isEmpty) parents else {
+    def isInterfaceOrTrait(sym: Symbol) = sym.isInterface || sym.isTrait
+
+    var rest   = parents.tail
+    var leaves = collection.mutable.ListBuffer.empty[Type] += parents.head
     while(rest.nonEmpty) {
       val candidate = rest.head
       val nonLeaf = leaves exists { t => t.typeSymbol isSubClass candidate.typeSymbol }
       if(!nonLeaf) {
-        leaves = leaves filterNot { t => candidate.typeSymbol isSubClass t.typeSymbol }
+        leaves = leaves filterNot { t => isInterfaceOrTrait(t.typeSymbol) && (candidate.typeSymbol isSubClass t.typeSymbol) }
         leaves += candidate
       }
       rest = rest.tail
@@ -812,11 +814,10 @@ abstract class Erasure extends AddInterfaces
         // specialized members have no type history before 'specialize', causing double def errors for curried defs
         override def exclude(sym: Symbol): Boolean = (
              sym.isType
-          || sym.isPrivate
           || super.exclude(sym)
           || !sym.hasTypeAt(currentRun.refchecksPhase.id)
         )
-        override def matches(lo: Symbol, high: Symbol) = true
+        override def matches(lo: Symbol, high: Symbol) = !high.isPrivate
       }
       def isErasureDoubleDef(pair: SymbolPair) = {
         import pair._
@@ -1036,7 +1037,7 @@ abstract class Erasure extends AddInterfaces
                 //    See SI-5568.
                 tree setSymbol Object_getClass
               } else {
-                debugwarn(s"The symbol '${fn.symbol}' was interecepted but didn't match any cases, that means the intercepted methods set doesn't match the code")
+                devWarning(s"The symbol '${fn.symbol}' was interecepted but didn't match any cases, that means the intercepted methods set doesn't match the code")
                 tree
               }
             } else qual match {
diff --git a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
index 6225b48..540de2c 100644
--- a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
+++ b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
@@ -207,7 +207,7 @@ abstract class ExplicitOuter extends InfoTransform
       // class needs to have a common naming scheme, independently of whether
       // the field was accessed from an inner class or not. See #2946
       if (sym.owner.isTrait && sym.isLocalToThis &&
-              (sym.getter(sym.owner.toInterface) == NoSymbol))
+              (sym.getterIn(sym.owner.toInterface) == NoSymbol))
         sym.makeNotPrivate(sym.owner)
       tp
   }
diff --git a/src/compiler/scala/tools/nsc/transform/LambdaLift.scala b/src/compiler/scala/tools/nsc/transform/LambdaLift.scala
index 5e2fe21..d1be155 100644
--- a/src/compiler/scala/tools/nsc/transform/LambdaLift.scala
+++ b/src/compiler/scala/tools/nsc/transform/LambdaLift.scala
@@ -376,7 +376,7 @@ abstract class LambdaLift extends InfoTransform {
 
     private def addFreeArgs(pos: Position, sym: Symbol, args: List[Tree]) = {
       free get sym match {
-        case Some(fvs) => args ++ (fvs.toList map (fv => atPos(pos)(proxyRef(fv))))
+        case Some(fvs) => addFree(sym, free = fvs.toList map (fv => atPos(pos)(proxyRef(fv))), original = args)
         case _         => args
       }
     }
@@ -388,9 +388,9 @@ abstract class LambdaLift extends InfoTransform {
           case DefDef(_, _, _, vparams :: _, _, _) =>
             val addParams = cloneSymbols(ps).map(_.setFlag(PARAM))
             sym.updateInfo(
-              lifted(MethodType(sym.info.params ::: addParams, sym.info.resultType)))
+              lifted(MethodType(addFree(sym, free = addParams, original = sym.info.params), sym.info.resultType)))
 
-            copyDefDef(tree)(vparamss = List(vparams ++ freeParams))
+            copyDefDef(tree)(vparamss = List(addFree(sym, free = freeParams, original = vparams)))
           case ClassDef(_, _, _, _) =>
             // SI-6231
             // Disabled attempt to to add getters to freeParams
@@ -571,4 +571,12 @@ abstract class LambdaLift extends InfoTransform {
     }
   } // class LambdaLifter
 
+  private def addFree[A](sym: Symbol, free: List[A], original: List[A]): List[A] = {
+    val prependFree = (
+         !sym.isConstructor // this condition is redundant for now. It will be needed if we remove the second condition in 2.12.x
+      && (settings.Ydelambdafy.value == "method" && sym.isDelambdafyTarget) // SI-8359 Makes the lambda body a viable as the target MethodHandle for a call to LambdaMetafactory
+    )
+    if (prependFree) free ::: original
+    else             original ::: free
+  }
 }
diff --git a/src/compiler/scala/tools/nsc/transform/LazyVals.scala b/src/compiler/scala/tools/nsc/transform/LazyVals.scala
index 38671eb..b6695ef 100644
--- a/src/compiler/scala/tools/nsc/transform/LazyVals.scala
+++ b/src/compiler/scala/tools/nsc/transform/LazyVals.scala
@@ -168,7 +168,7 @@ abstract class LazyVals extends Transform with TypingTransformers with ast.TreeD
     /** Add the bitmap definitions to the rhs of a method definition.
      *  If the rhs has been tail-call transformed, insert the bitmap
      *  definitions inside the top-level label definition, so that each
-     *  iteration has the lazy values un-initialized. Otherwise add them
+     *  iteration has the lazy values uninitialized. Otherwise add them
      *  at the very beginning of the method.
      */
     private def addBitmapDefs(methSym: Symbol, rhs: Tree): Tree = {
@@ -219,7 +219,7 @@ abstract class LazyVals extends Transform with TypingTransformers with ast.TreeD
      *    l$
      *  } or
      *  <rhs> when the lazy value has type Unit (for which there is no field
-     *  to cache it's value.
+     *  to cache its value.
      *
      *  Similarly as for normal lazy val members (see Mixin), the result will be a tree of the form
      *  { if ((bitmap&n & MASK) == 0) this.l$compute()
diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala
index 7927875..a079a76 100644
--- a/src/compiler/scala/tools/nsc/transform/Mixin.scala
+++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala
@@ -26,7 +26,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
    */
   private val treatedClassInfos = perRunCaches.newMap[Symbol, Type]() withDefaultValue NoType
 
-  /** Map a lazy, mixedin field accessor to it's trait member accessor */
+  /** Map a lazy, mixedin field accessor to its trait member accessor */
   private val initializer = perRunCaches.newMap[Symbol, Symbol]()
 
 // --------- helper functions -----------------------------------------------
@@ -79,9 +79,9 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
 
   /** Does this field require an initialized bit?
    *  Note: fields of classes inheriting DelayedInit are not checked.
-   *        This is because the they are neither initialized in the constructor
+   *        This is because they are neither initialized in the constructor
    *        nor do they have a setter (not if they are vals anyway). The usual
-   *        logic for setting bitmaps does therefor not work for such fields.
+   *        logic for setting bitmaps does therefore not work for such fields.
    *        That's why they are excluded.
    *  Note: The `checkinit` option does not check if transient fields are initialized.
    */
@@ -232,13 +232,13 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
       for (member <- impl.info.decls) {
         if (!member.isMethod && !member.isModule && !member.isModuleVar) {
           assert(member.isTerm && !member.isDeferred, member)
-          if (member.getter(impl).isPrivate) {
+          if (member.getterIn(impl).isPrivate) {
             member.makeNotPrivate(clazz) // this will also make getter&setter not private
           }
-          val getter = member.getter(clazz)
+          val getter = member.getterIn(clazz)
           if (getter == NoSymbol) addMember(clazz, newGetter(member))
           if (!member.tpe.isInstanceOf[ConstantType] && !member.isLazy) {
-            val setter = member.setter(clazz)
+            val setter = member.setterIn(clazz)
             if (setter == NoSymbol) addMember(clazz, newSetter(member))
           }
         }
@@ -267,7 +267,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
 
     /* Mix in members of implementation class mixinClass into class clazz */
     def mixinImplClassMembers(mixinClass: Symbol, mixinInterface: Symbol) {
-      if (!mixinClass.isImplClass) debugwarn ("Impl class flag is not set " +
+      if (!mixinClass.isImplClass) devWarning ("Impl class flag is not set " +
         ((mixinClass.debugLocationString, mixinInterface.debugLocationString)))
 
       for (member <- mixinClass.info.decls ; if isForwarded(member)) {
@@ -872,7 +872,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
         }
 
       def mkCheckedAccessor(clazz: Symbol, retVal: Tree, offset: Int, pos: Position, fieldSym: Symbol): Tree = {
-        val sym = fieldSym.getter(fieldSym.owner)
+        val sym = fieldSym.getterIn(fieldSym.owner)
         val bitmapSym = bitmapFor(clazz, offset, sym)
         val kind      = bitmapKind(sym)
         val mask      = maskForOffset(offset, sym, kind)
@@ -886,7 +886,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
       }
 
       /* Complete lazy field accessors. Applies only to classes,
-       * for it's own (non inherited) lazy fields. If 'checkinit'
+       * for its own (non inherited) lazy fields. If 'checkinit'
        * is enabled, getters that check for the initialized bit are
        * generated, and the class constructor is changed to set the
        * initialized bits.
@@ -921,7 +921,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
             deriveDefDef(stat)(addInitBits(clazz, _))
           }
           else if (settings.checkInit && !clazz.isTrait && sym.isSetter) {
-            val getter = sym.getter(clazz)
+            val getter = sym.getterIn(clazz)
             if (needsInitFlag(getter) && fieldOffset.isDefinedAt(getter))
               deriveDefDef(stat)(rhs => Block(List(rhs, localTyper.typed(mkSetFlag(clazz, fieldOffset(getter), getter, bitmapKind(getter)))), UNIT))
             else stat
@@ -1057,7 +1057,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
       def isOverriddenSetter(sym: Symbol) =
         nme.isTraitSetterName(sym.name) && {
           val other = sym.nextOverriddenSymbol
-          isOverriddenAccessor(other.getter(other.owner), clazz.info.baseClasses)
+          isOverriddenAccessor(other.getterIn(other.owner), clazz.info.baseClasses)
         }
 
       // for all symbols `sym` in the class definition, which are mixed in:
@@ -1122,7 +1122,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
       if (scope exists (_.isLazy)) {
         val map = mutable.Map[Symbol, Set[Symbol]]() withDefaultValue Set()
         // check what fields can be nulled for
-        for ((field, users) <- singleUseFields(templ); lazyFld <- users)
+        for ((field, users) <- singleUseFields(templ); lazyFld <- users if !lazyFld.accessed.hasAnnotation(TransientAttr))
           map(lazyFld) += field
 
         map.toMap
@@ -1232,7 +1232,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
           // refer to fields in some implementation class via an abstract
           // getter in the interface.
           val iface  = toInterface(sym.owner.tpe).typeSymbol
-          val ifaceGetter = sym getter iface
+          val ifaceGetter = sym getterIn iface
 
           if (ifaceGetter == NoSymbol) abort("No getter for " + sym + " in " + iface)
           else typedPos(tree.pos)((qual DOT ifaceGetter)())
@@ -1240,7 +1240,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
         case Assign(Apply(lhs @ Select(qual, _), List()), rhs) =>
           // assign to fields in some implementation class via an abstract
           // setter in the interface.
-          def setter = lhs.symbol.setter(toInterface(lhs.symbol.owner.tpe).typeSymbol) setPos lhs.pos
+          def setter = lhs.symbol.setterIn(toInterface(lhs.symbol.owner.tpe).typeSymbol) setPos lhs.pos
 
           typedPos(tree.pos)((qual DOT setter)(rhs))
 
diff --git a/src/compiler/scala/tools/nsc/transform/SampleTransform.scala b/src/compiler/scala/tools/nsc/transform/SampleTransform.scala
index cffb483..ba303f7 100644
--- a/src/compiler/scala/tools/nsc/transform/SampleTransform.scala
+++ b/src/compiler/scala/tools/nsc/transform/SampleTransform.scala
@@ -27,7 +27,7 @@ abstract class SampleTransform extends Transform {
       tree1 match {
         case Block(List(), expr) =>           // a simple optimization
           expr
-        case Block(defs, sup @ Super(qual, mix)) => // A hypthothetic transformation, which replaces
+        case Block(defs, sup @ Super(qual, mix)) => // A hypothetical transformation, which replaces
                                                     // {super} by {super.sample}
           treeCopy.Block(                           // `copy` is the usual lazy tree copier
             tree1, defs,
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
index 1691b01..53a1347 100644
--- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
+++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
@@ -303,6 +303,17 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
     }
   }
 
+  def specializedFunctionName(sym: Symbol, args: List[Type]) = exitingSpecialize {
+    require(isFunctionSymbol(sym), sym)
+    val env: TypeEnv = TypeEnv.fromSpecialization(sym, args)
+    specializedClass.get((sym, env)) match {
+      case Some(x) =>
+        x.name
+      case None =>
+        sym.name
+    }
+  }
+
   /** Return the specialized name of 'sym' in the given environment. It
    *  guarantees the same result regardless of the map order by sorting
    *  type variables alphabetically.
@@ -315,10 +326,14 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
       if (sym.isClass) env.keySet
       else specializedTypeVars(sym).intersect(env.keySet)
     )
+    specializedName(sym.name, tvars, env)
+  }
+
+  private def specializedName(name: Name, tvars: immutable.Set[Symbol], env: TypeEnv): TermName = {
     val (methparams, others) = tvars.toList sortBy ("" + _.name) partition (_.owner.isMethod)
     // debuglog("specName(" + sym + ") env: " + env + " tvars: " + tvars)
 
-    specializedName(sym.name, methparams map env, others map env)
+    specializedName(name, methparams map env, others map env)
   }
 
   /** Specialize name for the two list of types. The first one denotes
@@ -610,7 +625,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
       exitingSpecialize(sClass setInfo specializedInfoType)
       val fullEnv = outerEnv ++ env
 
-      /* Enter 'sym' in the scope of the current specialized class. It's type is
+      /* Enter 'sym' in the scope of the current specialized class. Its type is
        * mapped through the active environment, binding type variables to concrete
        * types. The existing typeEnv for `sym` is composed with the current active
        * environment
@@ -699,7 +714,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
 
         } else if (m.isValue && !m.isMethod && !m.hasFlag(LAZY)) { // concrete value definition
           def mkAccessor(field: Symbol, name: Name) = {
-            val newFlags = (SPECIALIZED | m.getter(clazz).flags) & ~(LOCAL | CASEACCESSOR | PARAMACCESSOR)
+            val newFlags = (SPECIALIZED | m.getterIn(clazz).flags) & ~(LOCAL | CASEACCESSOR | PARAMACCESSOR)
             // we rely on the super class to initialize param accessors
             val sym = sClass.newMethod(name.toTermName, field.pos, newFlags)
             info(sym) = SpecializedAccessor(field)
@@ -720,7 +735,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
 
           if (nme.isLocalName(m.name)) {
             val specGetter = mkAccessor(specVal, specVal.getterName) setInfo MethodType(Nil, specVal.info)
-            val origGetter = overrideIn(sClass, m.getter(clazz))
+            val origGetter = overrideIn(sClass, m.getterIn(clazz))
             info(origGetter) = Forward(specGetter)
             enterMember(specGetter)
             enterMember(origGetter)
@@ -733,12 +748,12 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
               debuglog("override case field accessor %s -> %s".format(m.name.decode, cfaGetter.name.decode))
             }
 
-            if (specVal.isVariable && m.setter(clazz) != NoSymbol) {
+            if (specVal.isVariable && m.setterIn(clazz) != NoSymbol) {
               val specSetter = mkAccessor(specVal, specGetter.setterName)
                 .resetFlag(STABLE)
               specSetter.setInfo(MethodType(specSetter.newSyntheticValueParams(List(specVal.info)),
                                             UnitTpe))
-              val origSetter = overrideIn(sClass, m.setter(clazz))
+              val origSetter = overrideIn(sClass, m.setterIn(clazz))
               info(origSetter) = Forward(specSetter)
               enterMember(specSetter)
               enterMember(origSetter)
@@ -1368,7 +1383,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
   )
 
   def specializeCalls(unit: CompilationUnit) = new TypingTransformer(unit) {
-    /** Map a specializable method to it's rhs, when not deferred. */
+    /** Map a specializable method to its rhs, when not deferred. */
     val body = perRunCaches.newMap[Symbol, Tree]()
 
     /** Map a specializable method to its value parameter symbols. */
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
index e1cf530..870c353 100644
--- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala
+++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
@@ -10,6 +10,7 @@ package transform
 import symtab.Flags._
 import scala.collection.{ mutable, immutable }
 import scala.language.postfixOps
+import scala.reflect.internal.util.ListOfNil
 
 /*<export> */
 /** - uncurry all symbol and tree types (@see UnCurryPhase) -- this includes normalizing all proper types.
@@ -70,6 +71,14 @@ abstract class UnCurry extends InfoTransform
     private val noApply           = mutable.HashSet[Tree]()
     private val newMembers        = mutable.Map[Symbol, mutable.Buffer[Tree]]()
 
+    private lazy val forceSpecializationInfoTransformOfFunctionN: Unit = {
+      if (currentRun.specializePhase != NoPhase) { // be robust in case of -Ystop-after:uncurry
+        exitingSpecialize {
+          FunctionClass.seq.foreach(cls => cls.info)
+        }
+      }
+    }
+
     /** Add a new synthetic member for `currentOwner` */
     private def addNewMember(t: Tree): Unit =
       newMembers.getOrElseUpdate(currentOwner, mutable.Buffer()) += t
@@ -206,7 +215,7 @@ abstract class UnCurry extends InfoTransform
         // (() => Int) { def apply(): Int @typeConstraint }
         case RefinedType(List(funTp), decls) =>
           debuglog(s"eliminate refinement from function type ${fun.tpe}")
-          fun.tpe = funTp
+          fun.setType(funTp)
         case _ =>
           ()
       }
@@ -220,8 +229,16 @@ abstract class UnCurry extends InfoTransform
           def mkMethod(owner: Symbol, name: TermName, additionalFlags: FlagSet = NoFlags): DefDef =
             gen.mkMethodFromFunction(localTyper)(fun, owner, name, additionalFlags)
 
-          val canUseDelamdafyMethod = (inConstructorFlag == 0) // Avoiding synthesizing code prone to SI-6666, SI-8363 by using old-style lambda translation
+          def isSpecialized = {
+            forceSpecializationInfoTransformOfFunctionN
+            val specialized = specializeTypes.specializedType(fun.tpe)
+            !(specialized =:= fun.tpe)
+          }
 
+          def canUseDelamdafyMethod = (
+               (inConstructorFlag == 0) // Avoiding synthesizing code prone to SI-6666, SI-8363 by using old-style lambda translation
+            && (!isSpecialized || (settings.isBCodeActive && settings.target.value == "jvm-1.8")) // DelambdafyTransformer currently only emits generic FunctionN-s, use the old style in the meantime
+          )
           if (inlineFunctionExpansion || !canUseDelamdafyMethod) {
             val parents = addSerializable(abstractFunctionForFunctionType(fun.tpe))
             val anonClass = fun.symbol.owner newAnonymousFunctionClass(fun.pos, inConstructorFlag) addAnnotation SerialVersionUIDAnnotation
@@ -416,13 +433,11 @@ abstract class UnCurry extends InfoTransform
 
       val sym = tree.symbol
 
-      // true if the taget is a lambda body that's been lifted into a method
+      // true if the target is a lambda body that's been lifted into a method
       def isLiftedLambdaBody(target: Tree) = target.symbol.isLocalToBlock && target.symbol.isArtifact && target.symbol.name.containsName(nme.ANON_FUN_NAME)
 
       val result = (
-        // TODO - settings.noassertions.value temporarily retained to avoid
-        // breakage until a reasonable interface is settled upon.
-        if ((sym ne null) && (sym.elisionLevel.exists (_ < settings.elidebelow.value || settings.noassertions)))
+        if ((sym ne null) && sym.elisionLevel.exists(_ < settings.elidebelow.value))
           replaceElidableTree(tree)
         else translateSynchronized(tree) match {
           case dd @ DefDef(mods, name, tparams, _, tpt, rhs) =>
@@ -460,13 +475,6 @@ abstract class UnCurry extends InfoTransform
               withNeedLift(needLift = true) { super.transform(tree) }
             else
               super.transform(tree)
-          case UnApply(fn, args) =>
-            val fn1   = transform(fn)
-            val args1 = fn.symbol.name match {
-              case nme.unapplySeq => transformArgs(tree.pos, fn.symbol, args, patmat.alignPatterns(global.typer.context, tree).expectedTypes)
-              case _              => args
-            }
-            treeCopy.UnApply(tree, fn1, args1)
 
           case Apply(fn, args) =>
             val needLift = needTryLift || !fn.symbol.isLabel // SI-6749, no need to lift in args to label jumps.
@@ -630,7 +638,7 @@ abstract class UnCurry extends InfoTransform
      * This transformation erases the dependent method types by:
      *   - Widening the formal parameter type to existentially abstract
      *     over the prior parameters (using `packSymbols`). This transformation
-     *     is performed in the the `InfoTransform`er [[scala.reflect.internal.transform.UnCurry]].
+     *     is performed in the `InfoTransform`er [[scala.reflect.internal.transform.UnCurry]].
      *   - Inserting casts in the method body to cast to the original,
      *     precise type.
      *
@@ -676,9 +684,46 @@ abstract class UnCurry extends InfoTransform
               // declared type and assign this to a synthetic val. Later, we'll patch
               // the method body to refer to this, rather than the parameter.
               val tempVal: ValDef = {
+                // SI-9442: using the "uncurry-erased" type (the one after the uncurry phase) can lead to incorrect 
+                // tree transformations. For example, compiling:
+                // ```
+                //   def foo(c: Ctx)(l: c.Tree): Unit = {
+                //     val l2: c.Tree = l
+                //   }
+                // ```
+                // Results in the following AST:
+                // ```
+                //   def foo(c: Ctx, l: Ctx#Tree): Unit = {
+                //     val l$1: Ctx#Tree = l.asInstanceOf[Ctx#Tree]
+                //     val l2: c.Tree = l$1 // no, not really, it's not.
+                //   }
+                // ```
+                // Of course, this is incorrect, since `l$1` has type `Ctx#Tree`, which is not a subtype of `c.Tree`.
+                //
+                // So what we need to do is to use the pre-uncurry type when creating `l$1`, which is `c.Tree` and is
+                // correct. Now, there are two additional problems:
+                // 1. when varargs and byname params are involved, the uncurry transformation desugares these special
+                //    cases to actual typerefs, eg:
+                //    ```
+                //           T*  ~> Seq[T] (Scala-defined varargs)
+                //           T*  ~> Array[T] (Java-defined varargs)
+                //           =>T ~> Function0[T] (by name params)
+                //    ```
+                //    we use the DesugaredParameterType object (defined in scala.reflect.internal.transform.UnCurry)
+                //    to redo this desugaring manually here
+                // 2. the type needs to be normalized, since `gen.mkCast` checks this (no HK here, just aliases have
+                //    to be expanded before handing the type to `gen.mkAttributedCast`, which calls `gen.mkCast`)
+                val info0 = 
+                  enteringUncurry(p.symbol.info) match {
+                    case DesugaredParameterType(desugaredTpe) =>
+                      desugaredTpe
+                    case tpe =>
+                      tpe
+                  }
+                val info = info0.normalize
                 val tempValName = unit freshTermName (p.name + "$")
-                val newSym = dd.symbol.newTermSymbol(tempValName, p.pos, SYNTHETIC).setInfo(p.symbol.info)
-                atPos(p.pos)(ValDef(newSym, gen.mkAttributedCast(Ident(p.symbol), p.symbol.info)))
+                val newSym = dd.symbol.newTermSymbol(tempValName, p.pos, SYNTHETIC).setInfo(info)
+                atPos(p.pos)(ValDef(newSym, gen.mkAttributedCast(Ident(p.symbol), info)))
               }
               Packed(newParam, tempVal)
             }
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/Logic.scala b/src/compiler/scala/tools/nsc/transform/patmat/Logic.scala
index 0b53dc3..91777b3 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/Logic.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/Logic.scala
@@ -9,8 +9,8 @@ package tools.nsc.transform.patmat
 
 import scala.language.postfixOps
 import scala.collection.mutable
-import scala.reflect.internal.util.Statistics
-import scala.reflect.internal.util.HashSet
+import scala.reflect.internal.util.{NoPosition, Position, Statistics, HashSet}
+import scala.tools.nsc.Global
 
 trait Logic extends Debugging  {
   import PatternMatchingStats._
@@ -38,7 +38,7 @@ trait Logic extends Debugging  {
     padded.transpose.map(alignedColumns).transpose map (_.mkString(sep)) mkString(lineSep)
   }
 
-  // http://www.cis.upenn.edu/~cis510/tcl/chap3.pdf
+  // ftp://ftp.cis.upenn.edu/pub/cis511/public_html/Spring04/chap3.pdf
   // http://users.encs.concordia.ca/~ta_ahmed/ms_thesis.pdf
   // propositional logic with constants and equality
   trait PropositionalLogic {
@@ -71,6 +71,8 @@ trait Logic extends Debugging  {
       def unapply(v: Var): Some[Tree]
     }
 
+    def uncheckedWarning(pos: Position, msg: String): Unit
+
     def reportWarning(message: String): Unit
 
     // resets hash consing -- only supposed to be called by TreeMakersToProps
@@ -89,6 +91,8 @@ trait Logic extends Debugging  {
       // compute the domain and return it (call registerNull first!)
       def domainSyms: Option[Set[Sym]]
 
+      def groupedDomains: List[Set[Sym]]
+
       // the symbol for this variable being equal to its statically known type
       // (only available if registerEquality has been called for that type before)
       def symForStaticTp: Option[Sym]
@@ -117,6 +121,9 @@ trait Logic extends Debugging  {
 
     final case class Not(a: Prop) extends Prop
 
+    // mutually exclusive (i.e., not more than one symbol is set)
+    final case class AtMostOne(ops: List[Sym]) extends Prop
+
     case object True extends Prop
     case object False extends Prop
 
@@ -191,7 +198,8 @@ trait Logic extends Debugging  {
         case Not(negated) => negationNormalFormNot(negated)
         case True
              | False
-             | (_: Sym)   => p
+             | (_: Sym)
+             | (_: AtMostOne)   => p
       }
 
       def simplifyProp(p: Prop): Prop = p match {
@@ -251,6 +259,7 @@ trait Logic extends Debugging  {
         case Not(a) => apply(a)
         case Eq(a, b) => applyVar(a); applyConst(b)
         case s: Sym => applySymbol(s)
+        case AtMostOne(ops) => ops.foreach(applySymbol)
         case _ =>
       }
       def applyVar(x: Var): Unit = {}
@@ -283,6 +292,23 @@ trait Logic extends Debugging  {
       }
     }
 
+    // to govern how much time we spend analyzing matches for unreachability/exhaustivity
+    object AnalysisBudget {
+      val maxDPLLdepth = global.settings.YpatmatExhaustdepth.value
+      val maxFormulaSize = 100 * math.min(Int.MaxValue / 100, maxDPLLdepth)
+
+      private def advice =
+        s"Please try with scalac -Ypatmat-exhaust-depth ${maxDPLLdepth * 2} or -Ypatmat-exhaust-depth off."
+
+      def recursionDepthReached =
+        s"Exhaustivity analysis reached max recursion depth, not all missing cases are reported.\n($advice)"
+
+      abstract class Exception(val advice: String) extends RuntimeException("CNF budget exceeded")
+
+      object formulaSizeExceeded extends Exception(s"The analysis required more space than allowed.\n$advice")
+
+    }
+
     // TODO: remove since deprecated
     val budgetProp = scala.sys.Prop[String]("scalac.patmat.analysisBudget")
     if (budgetProp.isSet) {
@@ -356,7 +382,22 @@ trait Logic extends Debugging  {
           // when sym is true, what must hold...
           implied  foreach (impliedSym  => addAxiom(Or(Not(sym), impliedSym)))
           // ... and what must not?
-          excluded foreach (excludedSym => addAxiom(Or(Not(sym), Not(excludedSym))))
+          excluded foreach {
+            excludedSym =>
+              val exclusive = v.groupedDomains.exists {
+                domain => domain.contains(sym) && domain.contains(excludedSym)
+              }
+
+              // TODO: populate `v.exclusiveDomains` with `Set`s from the start, and optimize to:
+              // val exclusive = v.exclusiveDomains.exists { inDomain => inDomain(sym) && inDomain(excludedSym) }
+              if (!exclusive)
+                addAxiom(Or(Not(sym), Not(excludedSym)))
+          }
+        }
+
+        // all symbols in a domain are mutually exclusive
+        v.groupedDomains.foreach {
+          syms => if (syms.size > 1) addAxiom(AtMostOne(syms.toList))
         }
       }
 
@@ -385,7 +426,7 @@ trait Logic extends Debugging  {
 
     def findModelFor(solvable: Solvable): Model
 
-    def findAllModelsFor(solvable: Solvable): List[Solution]
+    def findAllModelsFor(solvable: Solvable, pos: Position = NoPosition): List[Solution]
   }
 }
 
@@ -431,7 +472,9 @@ trait ScalaLogic extends Interface with Logic with TreeAndTypeAnalysis {
       // once we go to run-time checks (on Const's), convert them to checkable types
       // TODO: there seems to be bug for singleton domains (variable does not show up in model)
       lazy val domain: Option[Set[Const]] = {
-        val subConsts = enumerateSubtypes(staticTp).map{ tps =>
+        val subConsts =
+          enumerateSubtypes(staticTp, grouped = false)
+          .headOption.map { tps =>
           tps.toSet[Type].map{ tp =>
             val domainC = TypeConst(tp)
             registerEquality(domainC)
@@ -449,6 +492,15 @@ trait ScalaLogic extends Interface with Logic with TreeAndTypeAnalysis {
         observed(); allConsts
       }
 
+      lazy val groupedDomains: List[Set[Sym]] = {
+        val subtypes = enumerateSubtypes(staticTp, grouped = true)
+        subtypes.map {
+          subTypes =>
+            val syms = subTypes.flatMap(tpe => symForEqualsTo.get(TypeConst(tpe))).toSet
+            if (mayBeNull) syms + symForEqualsTo(NullConst) else syms
+        }.filter(_.nonEmpty)
+      }
+
       // populate equalitySyms
       // don't care about the result, but want only one fresh symbol per distinct constant c
       def registerEquality(c: Const): Unit = {ensureCanModify(); symForEqualsTo getOrElseUpdate(c, Sym(this, c))}
@@ -458,7 +510,7 @@ trait ScalaLogic extends Interface with Logic with TreeAndTypeAnalysis {
       def propForEqualsTo(c: Const): Prop = {observed(); symForEqualsTo.getOrElse(c, False)}
 
       // [implementation NOTE: don't access until all potential equalities have been registered using registerEquality]p
-      /** the information needed to construct the boolean proposition that encods the equality proposition (V = C)
+      /** the information needed to construct the boolean proposition that encodes the equality proposition (V = C)
        *
        * that models a type test pattern `_: C` or constant pattern `C`, where the type test gives rise to a TypeConst C,
        * and the constant pattern yields a ValueConst C
@@ -490,7 +542,7 @@ trait ScalaLogic extends Interface with Logic with TreeAndTypeAnalysis {
          *
          * (0) A or B must be in the domain to draw any conclusions.
          *
-         *     For example, knowing the the scrutinee is *not* true does not
+         *     For example, knowing the scrutinee is *not* true does not
          *     statically exclude it from being `X`, because that is an opaque
          *     Boolean.
          *
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala
index 34ebbc7..1331eb6 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala
@@ -95,58 +95,88 @@ trait TreeAndTypeAnalysis extends Debugging {
     val typer: Typer
 
     // TODO: domain of other feasibly enumerable built-in types (char?)
-    def enumerateSubtypes(tp: Type): Option[List[Type]] =
+    def enumerateSubtypes(tp: Type, grouped: Boolean): List[List[Type]] =
       tp.typeSymbol match {
         // TODO case _ if tp.isTupleType => // recurse into component types?
-        case UnitClass =>
-          Some(List(UnitTpe))
-        case BooleanClass =>
-          Some(ConstantTrue :: ConstantFalse :: Nil)
+        case UnitClass if !grouped =>
+          List(List(UnitTpe))
+        case BooleanClass if !grouped =>
+          List(ConstantTrue :: ConstantFalse :: Nil)
         // TODO case _ if tp.isTupleType => // recurse into component types
-        case modSym: ModuleClassSymbol =>
-          Some(List(tp))
+        case modSym: ModuleClassSymbol if !grouped =>
+          List(List(tp))
         case sym: RefinementClassSymbol =>
-          val parentSubtypes: List[Option[List[Type]]] = tp.parents.map(parent => enumerateSubtypes(parent))
-          if (parentSubtypes exists (_.isDefined))
+          val parentSubtypes = tp.parents.flatMap(parent => enumerateSubtypes(parent, grouped))
+          if (parentSubtypes exists (_.nonEmpty)) {
             // If any of the parents is enumerable, then the refinement type is enumerable.
-            Some(
-              // We must only include subtypes of the parents that conform to `tp`.
-              // See neg/virtpatmat_exhaust_compound.scala for an example.
-              parentSubtypes flatMap (_.getOrElse(Nil)) filter (_ <:< tp)
-            )
-          else None
+            // We must only include subtypes of the parents that conform to `tp`.
+            // See neg/virtpatmat_exhaust_compound.scala for an example.
+            parentSubtypes map (_.filter(_ <:< tp))
+          }
+          else Nil
         // make sure it's not a primitive, else (5: Byte) match { case 5 => ... } sees no Byte
         case sym if sym.isSealed =>
-          val subclasses = debug.patmatResult(s"enum $sym sealed, subclasses")(
-            // symbols which are both sealed and abstract need not be covered themselves, because
-            // all of their children must be and they cannot otherwise be created.
-            sym.sealedDescendants.toList
-              sortBy (_.sealedSortName)
-              filterNot (x => x.isSealed && x.isAbstractClass && !isPrimitiveValueClass(x))
-          )
 
           val tpApprox = typer.infer.approximateAbstracts(tp)
           val pre = tpApprox.prefix
 
-          Some(debug.patmatResult(s"enum sealed tp=$tp, tpApprox=$tpApprox as") {
-          // valid subtypes are turned into checkable types, as we are entering the realm of the dynamic
-            subclasses flatMap { sym =>
+          def filterChildren(children: List[Symbol]): List[Type] = {
+            children flatMap { sym =>
               // have to filter out children which cannot match: see ticket #3683 for an example
               // compare to the fully known type `tp` (modulo abstract types),
               // so that we can rule out stuff like: sealed trait X[T]; class XInt extends X[Int] --> XInt not valid when enumerating X[String]
               // however, must approximate abstract types in
 
-              val memberType  = nestedMemberType(sym, pre, tpApprox.typeSymbol.owner)
-              val subTp       = appliedType(memberType, sym.typeParams.map(_ => WildcardType))
+              val memberType = nestedMemberType(sym, pre, tpApprox.typeSymbol.owner)
+              val subTp = appliedType(memberType, sym.typeParams.map(_ => WildcardType))
               val subTpApprox = typer.infer.approximateAbstracts(subTp) // TODO: needed?
               // debug.patmat("subtp"+(subTpApprox <:< tpApprox, subTpApprox, tpApprox))
               if (subTpApprox <:< tpApprox) Some(checkableType(subTp))
               else None
             }
-          })
+          }
+
+          if(grouped) {
+            def enumerateChildren(sym: Symbol) = {
+              sym.children.toList
+                .sortBy(_.sealedSortName)
+                .filterNot(x => x.isSealed && x.isAbstractClass && !isPrimitiveValueClass(x))
+            }
+
+            // enumerate only direct subclasses,
+            // subclasses of subclasses are enumerated in the next iteration
+            // and added to a new group
+            def groupChildren(wl: List[Symbol],
+                              acc: List[List[Type]]): List[List[Type]] = wl match {
+              case hd :: tl =>
+                val children = enumerateChildren(hd)
+                // put each trait in a new group, since traits could belong to the same
+                // group as a derived class
+                val (traits, nonTraits) = children.partition(_.isTrait)
+                val filtered = (traits.map(List(_)) ++ List(nonTraits)).map(filterChildren)
+                groupChildren(tl ++ children, acc ++ filtered)
+              case Nil      => acc
+            }
+
+            groupChildren(sym :: Nil, Nil)
+          } else {
+            val subclasses = debug.patmatResult(s"enum $sym sealed, subclasses")(
+              // symbols which are both sealed and abstract need not be covered themselves, because
+              // all of their children must be and they cannot otherwise be created.
+              sym.sealedDescendants.toList
+                sortBy (_.sealedSortName)
+                filterNot (x => x.isSealed && x.isAbstractClass && !isPrimitiveValueClass(x))
+            )
+
+            List(debug.patmatResult(s"enum sealed tp=$tp, tpApprox=$tpApprox as") {
+              // valid subtypes are turned into checkable types, as we are entering the realm of the dynamic
+              filterChildren(subclasses)
+            })
+          }
+
         case sym =>
           debug.patmat("enum unsealed "+ ((tp, sym, sym.isSealed, isPrimitiveValueClass(sym))))
-          None
+          Nil
       }
 
     // approximate a type to the static type that is fully checkable at run time,
@@ -176,7 +206,7 @@ trait TreeAndTypeAnalysis extends Debugging {
     def uncheckableType(tp: Type): Boolean = {
       val checkable = (
            (isTupleType(tp) && tupleComponents(tp).exists(tp => !uncheckableType(tp)))
-        || enumerateSubtypes(tp).nonEmpty)
+        || enumerateSubtypes(tp, grouped = false).nonEmpty)
       // if (!checkable) debug.patmat("deemed uncheckable: "+ tp)
       !checkable
     }
@@ -399,6 +429,7 @@ trait MatchAnalysis extends MatchApproximation {
 
   trait MatchAnalyzer extends MatchApproximator  {
     def uncheckedWarning(pos: Position, msg: String) = currentRun.reporting.uncheckedWarning(pos, msg)
+    def warn(pos: Position, ex: AnalysisBudget.Exception, kind: String) = uncheckedWarning(pos, s"Cannot check match for $kind.\n${ex.advice}")
     def reportWarning(message: String) = global.reporter.warning(typer.context.tree.pos, message)
 
   // TODO: model dependencies between variables: if V1 corresponds to (x: List[_]) and V2 is (x.hd), V2 cannot be assigned when V1 = null or V1 = Nil
@@ -429,44 +460,50 @@ trait MatchAnalysis extends MatchApproximation {
       val propsCasesOk   = approximate(True)  map caseWithoutBodyToProp
       val propsCasesFail = approximate(False) map (t => Not(caseWithoutBodyToProp(t)))
 
-      val (eqAxiomsFail, symbolicCasesFail) = removeVarEq(propsCasesFail, modelNull = true)
-      val (eqAxiomsOk, symbolicCasesOk)     = removeVarEq(propsCasesOk, modelNull = true)
-      val eqAxioms = simplify(And(eqAxiomsOk, eqAxiomsFail)) // I'm pretty sure eqAxiomsOk == eqAxiomsFail, but not 100% sure.
-
-      val prefix = mutable.ArrayBuffer[Prop]()
-      prefix += eqAxioms
-
-      var prefixRest = symbolicCasesFail
-      var current = symbolicCasesOk
-      var reachable = true
-      var caseIndex = 0
-
-      debug.patmat("reachability, vars:\n" + ((propsCasesFail flatMap gatherVariables).distinct map (_.describe) mkString ("\n")))
-      debug.patmat(s"equality axioms:\n$eqAxiomsOk")
-
-      // invariant (prefixRest.length == current.length) && (prefix.reverse ++ prefixRest == symbolicCasesFail)
-      // termination: prefixRest.length decreases by 1
-      while (prefixRest.nonEmpty && reachable) {
-        val prefHead = prefixRest.head
-        caseIndex += 1
-        prefixRest = prefixRest.tail
-        if (prefixRest.isEmpty) reachable = true
-        else {
-          prefix += prefHead
-          current = current.tail
+      try {
+        val (eqAxiomsFail, symbolicCasesFail) = removeVarEq(propsCasesFail, modelNull = true)
+        val (eqAxiomsOk, symbolicCasesOk) = removeVarEq(propsCasesOk, modelNull = true)
+        val eqAxioms = simplify(And(eqAxiomsOk, eqAxiomsFail)) // I'm pretty sure eqAxiomsOk == eqAxiomsFail, but not 100% sure.
+
+        val prefix = mutable.ArrayBuffer[Prop]()
+        prefix += eqAxioms
+
+        var prefixRest = symbolicCasesFail
+        var current = symbolicCasesOk
+        var reachable = true
+        var caseIndex = 0
+
+        debug.patmat("reachability, vars:\n" + ((propsCasesFail flatMap gatherVariables).distinct map (_.describe) mkString ("\n")))
+        debug.patmat(s"equality axioms:\n$eqAxiomsOk")
+
+        // invariant (prefixRest.length == current.length) && (prefix.reverse ++ prefixRest == symbolicCasesFail)
+        // termination: prefixRest.length decreases by 1
+        while (prefixRest.nonEmpty && reachable) {
+          val prefHead = prefixRest.head
+          caseIndex += 1
+          prefixRest = prefixRest.tail
+          if (prefixRest.isEmpty) reachable = true
+          else {
+            prefix += prefHead
+            current = current.tail
           val and = And((current.head +: prefix): _*)
           val model = findModelFor(eqFreePropToSolvable(and))
 
-          // debug.patmat("trying to reach:\n"+ cnfString(current.head) +"\nunder prefix:\n"+ cnfString(prefix))
-          // if (NoModel ne model) debug.patmat("reached: "+ modelString(model))
+            // debug.patmat("trying to reach:\n"+ cnfString(current.head) +"\nunder prefix:\n"+ cnfString(prefix))
+            // if (NoModel ne model) debug.patmat("reached: "+ modelString(model))
 
-          reachable = NoModel ne model
+            reachable = NoModel ne model
+          }
         }
-      }
 
-      if (Statistics.canEnable) Statistics.stopTimer(patmatAnaReach, start)
+        if (Statistics.canEnable) Statistics.stopTimer(patmatAnaReach, start)
 
-      if (reachable) None else Some(caseIndex)
+        if (reachable) None else Some(caseIndex)
+      } catch {
+        case ex: AnalysisBudget.Exception =>
+          warn(prevBinder.pos, ex, "unreachability")
+          None // CNF budget exceeded
+      }
     }
 
     // exhaustivity
@@ -507,32 +544,38 @@ trait MatchAnalysis extends MatchApproximation {
         // when does the match fail?
         val matchFails = Not(\/(symbolicCases))
 
-  // debug output:
+        // debug output:
         debug.patmat("analysing:")
         showTreeMakers(cases)
 
         // debug.patmat("\nvars:\n"+ (vars map (_.describe) mkString ("\n")))
         // debug.patmat("\nmatchFails as CNF:\n"+ cnfString(propToSolvable(matchFails)))
 
-        // find the models (under which the match fails)
-        val matchFailModels = findAllModelsFor(propToSolvable(matchFails))
+        try {
+          // find the models (under which the match fails)
+          val matchFailModels = findAllModelsFor(propToSolvable(matchFails), prevBinder.pos)
 
-        val scrutVar = Var(prevBinderTree)
-        val counterExamples = {
-          matchFailModels.flatMap {
-            model =>
-              val varAssignments = expandModel(model)
-              varAssignments.flatMap(modelToCounterExample(scrutVar) _)
+          val scrutVar = Var(prevBinderTree)
+          val counterExamples = {
+            matchFailModels.flatMap {
+              model =>
+                val varAssignments = expandModel(model)
+                varAssignments.flatMap(modelToCounterExample(scrutVar) _)
+            }
           }
-        }
-
-        // sorting before pruning is important here in order to
-        // keep neg/t7020.scala stable
-        // since e.g. List(_, _) would cover List(1, _)
-        val pruned = CounterExample.prune(counterExamples.sortBy(_.toString)).map(_.toString)
 
-        if (Statistics.canEnable) Statistics.stopTimer(patmatAnaExhaust, start)
-        pruned
+          // sorting before pruning is important here in order to
+          // keep neg/t7020.scala stable
+          // since e.g. List(_, _) would cover List(1, _)
+          val pruned = CounterExample.prune(counterExamples.sortBy(_.toString)).map(_.toString)
+
+          if (Statistics.canEnable) Statistics.stopTimer(patmatAnaExhaust, start)
+          pruned
+        } catch {
+          case ex: AnalysisBudget.Exception =>
+            warn(prevBinder.pos, ex, "exhaustivity")
+            Nil // CNF budget exceeded
+        }
       }
     }
 
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchCodeGen.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchCodeGen.scala
index 06b39b0..1642613 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/MatchCodeGen.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchCodeGen.scala
@@ -134,7 +134,7 @@ trait MatchCodeGen extends Interface {
   trait OptimizedCodegen extends CodegenCore with TypedSubstitution with MatchMonadInterface {
     override def codegen: AbsCodegen = optimizedCodegen
 
-    // when we know we're targetting Option, do some inlining the optimizer won't do
+    // when we know we're targeting Option, do some inlining the optimizer won't do
     // for example, `o.flatMap(f)` becomes `if(o == None) None else f(o.get)`, similarly for orElse and guard
     //   this is a special instance of the advanced inlining optimization that takes a method call on
     //   an object of a type that only has two concrete subclasses, and inlines both bodies, guarded by an if to distinguish the two cases
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchOptimization.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchOptimization.scala
index b3aef8a..cca8d2d 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/MatchOptimization.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchOptimization.scala
@@ -286,8 +286,8 @@ trait MatchOptimization extends MatchTreeMaking with MatchAnalysis {
             else Apply(Ident(defaultLabel), Nil)
 
           val guardedBody = same.foldRight(jumpToDefault){
-            // the last case may be un-guarded (we know it's the last one since fold's accum == jumpToDefault)
-            // --> replace jumpToDefault by the un-guarded case's body
+            // the last case may be unguarded (we know it's the last one since fold's accum == jumpToDefault)
+            // --> replace jumpToDefault by the unguarded case's body
             case (CaseDef(_, EmptyTree, b), `jumpToDefault`)     => b
             case (cd at CaseDef(_, g, b), els) if isGuardedCase(cd) => If(g, b, els)
           }
@@ -322,7 +322,7 @@ trait MatchOptimization extends MatchTreeMaking with MatchAnalysis {
         var remainingCases = cases
         val collapsed      = scala.collection.mutable.ListBuffer.empty[CaseDef]
 
-        // when some of collapsed cases (except for the default case itself) did not include an un-guarded case
+        // when some of collapsed cases (except for the default case itself) did not include an unguarded case
         // we'll need to emit a labeldef for the default case
         var needDefault  = false
 
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchTranslation.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchTranslation.scala
index 6302e34..a2afb76 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/MatchTranslation.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchTranslation.scala
@@ -248,7 +248,7 @@ trait MatchTranslation {
       if (caseDefs forall treeInfo.isCatchCase) caseDefs
       else {
         val swatches = { // switch-catches
-          // SI-7459 must duplicate here as we haven't commited to switch emission, and just figuring out
+          // SI-7459 must duplicate here as we haven't committed to switch emission, and just figuring out
           //         if we can ends up mutating `caseDefs` down in the use of `substituteSymbols` in
           //         `TypedSubstitution#Substitution`. That is called indirectly by `emitTypeSwitch`.
           val bindersAndCases = caseDefs.map(_.duplicate) map { caseDef =>
@@ -504,14 +504,26 @@ trait MatchTranslation {
        */
       def treeMaker(binder: Symbol, binderKnownNonNull: Boolean, pos: Position): TreeMaker = {
         val paramAccessors = binder.constrParamAccessors
+        val numParams = paramAccessors.length
+        def paramAccessorAt(subPatIndex: Int) = paramAccessors(math.min(subPatIndex, numParams - 1))
         // binders corresponding to mutable fields should be stored (SI-5158, SI-6070)
         // make an exception for classes under the scala package as they should be well-behaved,
         // to optimize matching on List
+        val hasRepeated = paramAccessors.lastOption match {
+          case Some(x) => definitions.isRepeated(x)
+          case _ => false
+        }
         val mutableBinders = (
           if (!binder.info.typeSymbol.hasTransOwner(ScalaPackageClass) &&
-              (paramAccessors exists (_.isMutable)))
-            subPatBinders.zipWithIndex.collect{ case (binder, idx) if paramAccessors(idx).isMutable => binder }
-          else Nil
+              (paramAccessors exists (x => x.isMutable || definitions.isRepeated(x)))) {
+
+            subPatBinders.zipWithIndex.flatMap {
+              case (binder, idx) =>
+                val param = paramAccessorAt(idx)
+                if (param.isMutable || (definitions.isRepeated(param) && !aligner.isStar)) binder :: Nil
+                else Nil
+            }
+          } else Nil
         )
 
         // checks binder ne null before chaining to the next extractor
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala
index b703b5b..e0fcc05 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala
@@ -577,8 +577,6 @@ trait MatchTreeMaking extends MatchCodeGen with Debugging {
                 lengthMax3(casesNoSubstOnly) > 2
               }
               val requireSwitch = hasSwitchAnnotation && exceedsTwoCasesOrAlts
-              if (hasSwitchAnnotation && !requireSwitch)
-                reporter.warning(scrut.pos, "matches with two cases or fewer are emitted using if-then-else instead of switch")
               (suppression, requireSwitch)
             case _ =>
               (Suppression.NoSuppression, false)
@@ -644,7 +642,7 @@ trait MatchTreeMaking extends MatchCodeGen with Debugging {
       }
 
       // override def apply
-      // debug.patmat("before fixerupper: "+ xTree)
+      // debug.patmat("before fixerUpper: "+ xTree)
       // currentRun.trackerFactory.snapshot()
       // debug.patmat("after fixerupper")
       // currentRun.trackerFactory.snapshot()
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchWarnings.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchWarnings.scala
index 9e9372f..8beb183 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/MatchWarnings.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchWarnings.scala
@@ -40,7 +40,7 @@ trait MatchWarnings {
       }
     }
 
-    // Issue better warnings than "unreachable code" when people mis-use
+    // Issue better warnings than "unreachable code" when people misuse
     // variable patterns thinking they bind to existing identifiers.
     //
     // Possible TODO: more deeply nested variable patterns, like
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/PatternExpander.scala b/src/compiler/scala/tools/nsc/transform/patmat/PatternExpander.scala
index e84ccbf..1916050 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/PatternExpander.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/PatternExpander.scala
@@ -86,9 +86,25 @@ trait PatternExpander[Pattern, Type] {
    *  @param  fixed     The non-sequence types which are extracted
    *  @param  repeated  The sequence type which is extracted
    */
-  final case class Extractor(whole: Type, fixed: List[Type], repeated: Repeated) {
+  final case class Extractor(whole: Type, fixed: List[Type], repeated: Repeated, typeOfSinglePattern: Type) {
     require(whole != NoType, s"expandTypes($whole, $fixed, $repeated)")
 
+    /** A pattern with arity-1 that doesn't match the arity of the Product-like result of the `get` method,
+      * will match that result in its entirety. Example:
+      *
+      * {{{
+      * warning: there was one deprecation warning; re-run with -deprecation for details
+      * scala> object Extractor { def unapply(a: Any): Option[(Int, String)] = Some((1, "2")) }
+      * defined object Extractor
+      *
+      * scala> "" match { case Extractor(x: Int, y: String) => }
+      *
+      * scala> "" match { case Extractor(xy : (Int, String)) => }
+      * warning: there was one deprecation warning; re-run with -deprecation for details
+      * }}}
+      * */
+    def asSinglePattern: Extractor = copy(fixed = List(typeOfSinglePattern))
+
     def productArity = fixed.length
     def hasSeq       = repeated.exists
     def elementType  = repeated.elementType
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala b/src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala
index 2753baa..d4f4430 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala
@@ -43,8 +43,9 @@ trait ScalacPatternExpanders {
           orElse definitions.elementType(ArrayClass, seq)
       )
     }
-    def newExtractor(whole: Type, fixed: List[Type], repeated: Repeated): Extractor =
-      logResult(s"newExtractor($whole, $fixed, $repeated")(Extractor(whole, fixed, repeated))
+    def newExtractor(whole: Type, fixed: List[Type], repeated: Repeated, typeOfSinglePattern: Type): Extractor =
+      logResult(s"newExtractor($whole, $fixed, $repeated, $typeOfSinglePattern")(Extractor(whole, fixed, repeated, typeOfSinglePattern))
+    def newExtractor(whole: Type, fixed: List[Type], repeated: Repeated): Extractor = newExtractor(whole, fixed, repeated, tupleType(fixed))
 
     // Turn Seq[A] into Repeated(Seq[A], A, A*)
     def repeatedFromSeq(seqType: Type): Repeated = {
@@ -73,26 +74,27 @@ trait ScalacPatternExpanders {
      *  Unfortunately the MethodType does not carry the information of whether
      *  it was unapplySeq, so we have to funnel that information in separately.
      */
-    def unapplyMethodTypes(whole: Type, result: Type, isSeq: Boolean): Extractor = {
-      val expanded = (
-        if (result =:= BooleanTpe) Nil
-        else typeOfMemberNamedGet(result) match {
+    def unapplyMethodTypes(context: Context, whole: Type, result: Type, isSeq: Boolean): Extractor = {
+      if (result =:= BooleanTpe) newExtractor(whole, Nil, NoRepeated)
+      else {
+        val getResult = typeOfMemberNamedGet(result)
+        def noGetError() = {
+          val name = "unapply" + (if (isSeq) "Seq" else "")
+          context.error(context.tree.pos, s"The result type of an $name method must contain a member `get` to be used as an extractor pattern, no such member exists in ${result}")
+        }
+        val expanded = getResult match {
+          case global.NoType => noGetError(); Nil
           case rawGet if !hasSelectors(rawGet) => rawGet :: Nil
           case rawGet                          => typesOfSelectors(rawGet)
         }
-      )
-      expanded match {
-        case init :+ last if isSeq => newExtractor(whole, init, repeatedFromSeq(last))
-        case tps                   => newExtractor(whole, tps, NoRepeated)
+        expanded match {
+          case init :+ last if isSeq => newExtractor(whole, init, repeatedFromSeq(last), getResult)
+          case tps                   => newExtractor(whole, tps, NoRepeated, getResult)
+        }
       }
     }
   }
   object alignPatterns extends ScalacPatternExpander {
-    /** Converts a T => (A, B, C) extractor to a T => ((A, B, CC)) extractor.
-     */
-    def tupleExtractor(extractor: Extractor): Extractor =
-      extractor.copy(fixed = tupleType(extractor.fixed) :: Nil)
-
     private def validateAligned(context: Context, tree: Tree, aligned: Aligned): Aligned = {
       import aligned._
 
@@ -112,8 +114,10 @@ trait ScalacPatternExpanders {
         arityError("not enough")
       else if (elementArity > 0 && !isSeq)
         arityError("too many")
-      else if (settings.warnStarsAlign && isSeq && productArity > 0 && (elementArity > 0 || !isStar))
-        warn("A repeated case parameter or extracted sequence should be matched only by a sequence wildcard (_*).")
+      else if (settings.warnStarsAlign && isSeq && productArity > 0 && elementArity > 0) warn {
+        if (isStar) "Sequence wildcard (_*) does not align with repeated case parameter or extracted sequence; the result may be unexpected."
+        else "A repeated case parameter or extracted sequence is not matched by a sequence wildcard (_*), and may fail at runtime."
+      }
 
       aligned
     }
@@ -127,8 +131,8 @@ trait ScalacPatternExpanders {
       val isUnapply = sel.symbol.name == nme.unapply
 
       val extractor = sel.symbol.name match {
-        case nme.unapply    => unapplyMethodTypes(firstParamType(fn.tpe), sel.tpe, isSeq = false)
-        case nme.unapplySeq => unapplyMethodTypes(firstParamType(fn.tpe), sel.tpe, isSeq = true)
+        case nme.unapply    => unapplyMethodTypes(context, firstParamType(fn.tpe), sel.tpe, isSeq = false)
+        case nme.unapplySeq => unapplyMethodTypes(context, firstParamType(fn.tpe), sel.tpe, isSeq = true)
         case _              => applyMethodTypes(fn.tpe)
       }
 
@@ -140,12 +144,14 @@ trait ScalacPatternExpanders {
       def acceptMessage   = if (extractor.isErroneous) "" else s" to hold ${extractor.offeringString}"
       val requiresTupling = isUnapply && patterns.totalArity == 1 && productArity > 1
 
-      if (requiresTupling && effectivePatternArity(args) == 1) {
-        val sym = sel.symbol.owner
-        currentRun.reporting.deprecationWarning(sel.pos, sym, s"${sym} expects $productArity patterns$acceptMessage but crushing into $productArity-tuple to fit single pattern (SI-6675)")
-      }
-
-      val normalizedExtractor = if (requiresTupling) tupleExtractor(extractor) else extractor
+      val normalizedExtractor = if (requiresTupling) {
+        val tupled = extractor.asSinglePattern
+        if (effectivePatternArity(args) == 1 && isTupleType(extractor.typeOfSinglePattern)) {
+          val sym = sel.symbol.owner
+          currentRun.reporting.deprecationWarning(sel.pos, sym, s"${sym} expects $productArity patterns$acceptMessage but crushing into $productArity-tuple to fit single pattern (SI-6675)")
+        }
+        tupled
+      } else extractor
       validateAligned(context, fn, Aligned(patterns, normalizedExtractor))
     }
 
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/Solving.scala b/src/compiler/scala/tools/nsc/transform/patmat/Solving.scala
index 27217f0..9710c5c 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/Solving.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/Solving.scala
@@ -11,6 +11,7 @@ import scala.reflect.internal.util.Statistics
 import scala.language.postfixOps
 import scala.collection.mutable
 import scala.reflect.internal.util.Collections._
+import scala.reflect.internal.util.Position
 
 // a literal is a (possibly negated) variable
 class Lit(val v: Int) extends AnyVal {
@@ -64,7 +65,23 @@ trait Solving extends Logic {
       def size = symbols.size
     }
 
-    case class Solvable(cnf: Cnf, symbolMapping: SymbolMapping)
+    def cnfString(f: Array[Clause]): String
+
+    final case class Solvable(cnf: Cnf, symbolMapping: SymbolMapping) {
+      def ++(other: Solvable) = {
+        require(this.symbolMapping eq other.symbolMapping)
+        Solvable(cnf ++ other.cnf, symbolMapping)
+      }
+
+      override def toString: String = {
+        "Solvable\nLiterals:\n" +
+          (for {
+            (lit, sym) <- symbolMapping.symForVar.toSeq.sortBy(_._1)
+          } yield {
+            s"$lit -> $sym"
+          }).mkString("\n") + "Cnf:\n" + cnfString(cnf)
+      }
+    }
 
     trait CnfBuilder {
       private[this] val buff = ArrayBuffer[Clause]()
@@ -95,7 +112,11 @@ trait Solving extends Logic {
         }
       }
 
-      def buildCnf: Array[Clause] = buff.toArray
+      def buildCnf: Array[Clause] = {
+        val cnf = buff.toArray
+        buff.clear()
+        cnf
+      }
 
     }
 
@@ -130,20 +151,23 @@ trait Solving extends Logic {
 
       def apply(p: Prop): Solvable = {
 
-        def convert(p: Prop): Lit = {
+        def convert(p: Prop): Option[Lit] = {
           p match {
             case And(fv)  =>
-              and(fv.map(convert))
+              Some(and(fv.flatMap(convert)))
             case Or(fv)   =>
-              or(fv.map(convert))
+              Some(or(fv.flatMap(convert)))
             case Not(a)   =>
-              not(convert(a))
+              convert(a).map(not)
             case sym: Sym =>
-              convertSym(sym)
+              Some(convertSym(sym))
             case True     =>
-              constTrue
+              Some(constTrue)
             case False    =>
-              constFalse
+              Some(constFalse)
+            case AtMostOne(ops) =>
+              atMostOne(ops)
+              None
             case _: Eq    =>
               throw new MatchError(p)
           }
@@ -189,8 +213,57 @@ trait Solving extends Logic {
         // no need for auxiliary variable
         def not(a: Lit): Lit = -a
 
+        /**
+         * This encoding adds 3n-4 variables auxiliary variables
+         * to encode that at most 1 symbol can be set.
+         * See also "Towards an Optimal CNF Encoding of Boolean Cardinality Constraints"
+         * http://www.carstensinz.de/papers/CP-2005.pdf
+         */
+        def atMostOne(ops: List[Sym]) {
+          (ops: @unchecked) match {
+            case hd :: Nil  => convertSym(hd)
+            case x1 :: tail =>
+              // sequential counter: 3n-4 clauses
+              // pairwise encoding: n*(n-1)/2 clauses
+              // thus pays off only if n > 5
+              if (ops.lengthCompare(5) > 0) {
+
+                @inline
+                def /\(a: Lit, b: Lit) = addClauseProcessed(clause(a, b))
+
+                val (mid, xn :: Nil) = tail.splitAt(tail.size - 1)
+
+                // 1 <= x1,...,xn <==>
+                //
+                // (!x1 \/ s1) /\ (!xn \/ !sn-1) /\
+                //
+                //     /\
+                //    /  \ (!xi \/ si) /\ (!si-1 \/ si) /\ (!xi \/ !si-1)
+                //  1 < i < n
+                val s1 = newLiteral()
+                /\(-convertSym(x1), s1)
+                val snMinus = mid.foldLeft(s1) {
+                  case (siMinus, sym) =>
+                    val xi = convertSym(sym)
+                    val si = newLiteral()
+                    /\(-xi, si)
+                    /\(-siMinus, si)
+                    /\(-xi, -siMinus)
+                    si
+                }
+                /\(-convertSym(xn), -snMinus)
+              } else {
+                ops.map(convertSym).combinations(2).foreach {
+                  case a :: b :: Nil =>
+                    addClauseProcessed(clause(-a, -b))
+                  case _             =>
+                }
+              }
+          }
+        }
+
         // add intermediate variable since we want the formula to be SAT!
-        addClauseProcessed(clause(convert(p)))
+        addClauseProcessed(convert(p).toSet)
 
         Solvable(buildCnf, symbolMapping)
       }
@@ -244,19 +317,54 @@ trait Solving extends Logic {
 
     def eqFreePropToSolvable(p: Prop): Solvable = {
 
+      def doesFormulaExceedSize(p: Prop): Boolean = {
+        p match {
+          case And(ops) =>
+            if (ops.size > AnalysisBudget.maxFormulaSize) {
+              true
+            } else {
+              ops.exists(doesFormulaExceedSize)
+            }
+          case Or(ops)  =>
+            if (ops.size > AnalysisBudget.maxFormulaSize) {
+              true
+            } else {
+              ops.exists(doesFormulaExceedSize)
+            }
+          case Not(a)   => doesFormulaExceedSize(a)
+          case _        => false
+        }
+      }
+
+      val simplified = simplify(p)
+      if (doesFormulaExceedSize(simplified)) {
+        throw AnalysisBudget.formulaSizeExceeded
+      }
+
       // collect all variables since after simplification / CNF conversion
       // they could have been removed from the formula
       val symbolMapping = new SymbolMapping(gatherSymbols(p))
-
-      val simplified = simplify(p)
       val cnfExtractor = new AlreadyInCNF(symbolMapping)
+      val cnfTransformer = new TransformToCnf(symbolMapping)
+
+      def cnfFor(prop: Prop): Solvable = {
+        prop match {
+          case cnfExtractor.ToCnf(solvable) =>
+            // this is needed because t6942 would generate too many clauses with Tseitin
+            // already in CNF, just add clauses
+            solvable
+          case p                            =>
+            cnfTransformer.apply(p)
+        }
+      }
+
       simplified match {
-        case cnfExtractor.ToCnf(solvable) =>
-          // this is needed because t6942 would generate too many clauses with Tseitin
-          // already in CNF, just add clauses
-          solvable
-        case p                           =>
-          new TransformToCnf(symbolMapping).apply(p)
+        case And(props) =>
+          // SI-6942:
+          // CNF(P1 /\ ... /\ PN) == CNF(P1) ++ CNF(...) ++ CNF(PN)
+          props.map(cnfFor).reduce(_ ++ _)
+        case p          =>
+          cnfFor(p)
       }
     }
   }
@@ -288,7 +396,7 @@ trait Solving extends Logic {
     val NoTseitinModel: TseitinModel = null
 
     // returns all solutions, if any (TODO: better infinite recursion backstop -- detect fixpoint??)
-    def findAllModelsFor(solvable: Solvable): List[Solution] = {
+    def findAllModelsFor(solvable: Solvable, pos: Position): List[Solution] = {
       debug.patmat("find all models for\n"+ cnfString(solvable.cnf))
 
       // we must take all vars from non simplified formula
@@ -308,13 +416,12 @@ trait Solving extends Logic {
       final case class TseitinSolution(model: TseitinModel, unassigned: List[Int]) {
         def projectToSolution(symForVar: Map[Int, Sym]) = Solution(projectToModel(model, symForVar), unassigned map symForVar)
       }
+
       def findAllModels(clauses: Array[Clause],
                         models: List[TseitinSolution],
-                        recursionDepthAllowed: Int = global.settings.YpatmatExhaustdepth.value): List[TseitinSolution]=
+                        recursionDepthAllowed: Int = AnalysisBudget.maxDPLLdepth): List[TseitinSolution]=
         if (recursionDepthAllowed == 0) {
-          val maxDPLLdepth = global.settings.YpatmatExhaustdepth.value
-          reportWarning("(Exhaustivity analysis reached max recursion depth, not all missing cases are reported. " +
-              s"Please try with scalac -Ypatmat-exhaust-depth ${maxDPLLdepth * 2} or -Ypatmat-exhaust-depth off.)")
+          uncheckedWarning(pos, AnalysisBudget.recursionDepthReached)
           models
         } else {
           debug.patmat("find all models for\n" + cnfString(clauses))
diff --git a/src/compiler/scala/tools/nsc/typechecker/AnalyzerPlugins.scala b/src/compiler/scala/tools/nsc/typechecker/AnalyzerPlugins.scala
index 2c27bdb..9898cfd 100644
--- a/src/compiler/scala/tools/nsc/typechecker/AnalyzerPlugins.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/AnalyzerPlugins.scala
@@ -57,7 +57,7 @@ trait AnalyzerPlugins { self: Analyzer =>
      * `analyzer.transformed` hash map, indexed by the definition's rhs tree.
      *
      * NOTE: Invoking the type checker can lead to cyclic reference errors. For instance, if this
-     * method is called from the type completer of a recursive method, type checking the mehtod
+     * method is called from the type completer of a recursive method, type checking the method
      * rhs will invoke the same completer again. It might be possible to avoid this situation by
      * assigning `tpe` to `defTree.symbol` (untested) - the final type computed by this method
      * will then be assigned to the definition's symbol by monoTypeCompleter (in Namers).
@@ -65,7 +65,7 @@ trait AnalyzerPlugins { self: Analyzer =>
      * The hooks into `typeSig` allow analyzer plugins to add annotations to (or change the types
      * of) definition symbols. This cannot not be achieved by using `pluginsTyped`: this method
      * is only called during type checking, so changing the type of a symbol at this point is too
-     * late: references to the symbol might already be typed and therefore obtain the the original
+     * late: references to the symbol might already be typed and therefore obtain the original
      * type assigned during naming.
      *
      * @param defTree is the definition for which the type was computed. The different cases are
diff --git a/src/compiler/scala/tools/nsc/typechecker/Checkable.scala b/src/compiler/scala/tools/nsc/typechecker/Checkable.scala
index fc632e0..309b80f 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Checkable.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Checkable.scala
@@ -44,7 +44,7 @@ import scala.language.postfixOps
  *  which is essentially the intersection of X and |P|, where |P| is
  *  the erasure of P.  If XR <: P, then no warning is emitted.
  *
- *  We evaluate "X with conform to P" by checking `X <: P_wild, where
+ *  We evaluate "X with conform to P" by checking `X <: P_wild`, where
  *  P_wild is the result of substituting wildcard types in place of
  *  pattern type variables. This is intentionally stricter than
  *  (X matchesPattern P), see SI-8597 for motivating test cases.
diff --git a/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala b/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
index c80aaea..727f092 100644
--- a/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
@@ -550,23 +550,18 @@ trait ContextErrors {
       def ModuleUsingCompanionClassDefaultArgsErrror(tree: Tree) =
         NormalTypeError(tree, "module extending its companion class cannot use default constructor arguments")
 
-      def NotEnoughArgsError(tree: Tree, fun0: Tree, missing0: List[Symbol]) = {
-        def notEnoughArgumentsMsg(fun: Tree, missing: List[Symbol]) = {
-          val suffix = {
-            if (missing.isEmpty) ""
-            else {
-              val keep = missing take 3 map (_.name)
-              ".\nUnspecified value parameter%s %s".format(
-                if (missing.tail.isEmpty) "" else "s",
-                if ((missing drop 3).nonEmpty) (keep :+ "...").mkString(", ")
-                else keep.mkString("", ", ", ".")
-              )
-            }
+      def NotEnoughArgsError(tree: Tree, fun: Tree, missing: List[Symbol]) = {
+        val notEnoughArgumentsMsg = {
+          val suffix = if (missing.isEmpty) "" else {
+            val keep = missing take 3 map (_.name)
+            val ess  = if (missing.tail.isEmpty) "" else "s"
+            f".%nUnspecified value parameter$ess ${
+              keep.mkString("", ", ", if ((missing drop 3).nonEmpty) "..." else ".")
+            }"
           }
-
-          "not enough arguments for " + treeSymTypeMsg(fun) + suffix
+          s"not enough arguments for ${ treeSymTypeMsg(fun) }$suffix"
         }
-        NormalTypeError(tree, notEnoughArgumentsMsg(fun0, missing0))
+        NormalTypeError(tree, notEnoughArgumentsMsg)
       }
 
       //doTypedApply - patternMode
@@ -632,12 +627,16 @@ trait ContextErrors {
 
       //adapt
       def MissingArgsForMethodTpeError(tree: Tree, meth: Symbol) = {
+        val f = meth.name
+        val paf = s"$f(${ meth.asMethod.paramLists map (_ map (_ => "_") mkString ",") mkString ")(" })"
+        val advice = s"""
+          |Unapplied methods are only converted to functions when a function type is expected.
+          |You can make this conversion explicit by writing `$f _` or `$paf` instead of `$f`.""".stripMargin
         val message =
           if (meth.isMacro) MacroTooFewArgumentListsMessage
-          else "missing arguments for " + meth.fullLocationString + (
-            if (meth.isConstructor) ""
-            else ";\nfollow this method with `_' if you want to treat it as a partially applied function"
-          )
+          else s"""missing argument list for ${meth.fullLocationString}${
+            if (!meth.isConstructor) advice else ""
+          }"""
         issueNormalTypeError(tree, message)
         setError(tree)
       }
@@ -1191,7 +1190,7 @@ trait ContextErrors {
 
       def IllegalDependentMethTpeError(sym: Symbol)(context: Context) = {
         val errorAddendum =
-          ": parameter appears in the type of another parameter in the same section or an earlier one"
+          ": parameter may only be referenced in a subsequent parameter section"
         issueSymbolTypeError(sym,  "illegal dependent method type" + errorAddendum)(context)
       }
 
diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
index ca25e59..5ec16e8 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
@@ -167,14 +167,14 @@ trait Contexts { self: Analyzer =>
    *     afterwards errors are thrown. This is configured in `rootContext`. Additionally, more
    *     fine grained control is needed based on the kind of error; ambiguity errors are often
    *     suppressed during exploratory typing, such as determining whether `a == b` in an argument
-   *     position is an assignment or a named argument, when `Infererencer#isApplicableSafe` type checks
-   *     applications with and without an expected type, or whtn `Typer#tryTypedApply` tries to fit arguments to
+   *     position is an assignment or a named argument, when `Inferencer#isApplicableSafe` type checks
+   *     applications with and without an expected type, or when `Typer#tryTypedApply` tries to fit arguments to
    *     a function type with/without implicit views.
    *
-   *     When the error policies entails error/warning buffering, the mutable [[ReportBuffer]] records
+   *     When the error policies entail error/warning buffering, the mutable [[ReportBuffer]] records
    *     everything that is issued. It is important to note, that child Contexts created with `make`
    *     "inherit" the very same `ReportBuffer` instance, whereas children spawned through `makeSilent`
-   *     receive an separate, fresh buffer.
+   *     receive a separate, fresh buffer.
    *
    * @param tree  Tree associated with this context
    * @param owner The current owner
@@ -574,19 +574,23 @@ trait Contexts { self: Analyzer =>
     /** Issue/buffer/throw the given implicit ambiguity error according to the current mode for error reporting. */
     private[typechecker] def issueAmbiguousError(err: AbsAmbiguousTypeError) = reporter.issueAmbiguousError(err)(this)
     /** Issue/throw the given error message according to the current mode for error reporting. */
-    def error(pos: Position, msg: String)                                    = reporter.error(pos, msg)
+    def error(pos: Position, msg: String)                                    = reporter.error(fixPosition(pos), msg)
     /** Issue/throw the given error message according to the current mode for error reporting. */
-    def warning(pos: Position, msg: String)                                  = reporter.warning(pos, msg)
-    def echo(pos: Position, msg: String)                                     = reporter.echo(pos, msg)
+    def warning(pos: Position, msg: String)                                  = reporter.warning(fixPosition(pos), msg)
+    def echo(pos: Position, msg: String)                                     = reporter.echo(fixPosition(pos), msg)
+    def fixPosition(pos: Position): Position = pos match {
+      case NoPosition => nextEnclosing(_.tree.pos != NoPosition).tree.pos
+      case _ => pos
+    }
 
 
     def deprecationWarning(pos: Position, sym: Symbol, msg: String): Unit =
-      currentRun.reporting.deprecationWarning(pos, sym, msg)
+      currentRun.reporting.deprecationWarning(fixPosition(pos), sym, msg)
     def deprecationWarning(pos: Position, sym: Symbol): Unit =
-      currentRun.reporting.deprecationWarning(pos, sym) // TODO: allow this to escalate to an error, and implicit search will ignore deprecated implicits
+      currentRun.reporting.deprecationWarning(fixPosition(pos), sym) // TODO: allow this to escalate to an error, and implicit search will ignore deprecated implicits
 
     def featureWarning(pos: Position, featureName: String, featureDesc: String, featureTrait: Symbol, construct: => String = "", required: Boolean): Unit =
-      currentRun.reporting.featureWarning(pos, featureName, featureDesc, featureTrait, construct, required)
+      currentRun.reporting.featureWarning(fixPosition(pos), featureName, featureDesc, featureTrait, construct, required)
 
 
     // nextOuter determines which context is searched next for implicits
@@ -802,6 +806,12 @@ trait Contexts { self: Analyzer =>
         (e ne null) && (e.owner == scope) && (!settings.isScala212 || e.sym.exists)
       })
 
+    private def withQualifyingImplicitAlternatives(imp: ImportInfo, name: Name, pre: Type)(f: Symbol => Unit) =
+      for {
+        sym <- importedAccessibleSymbol(imp, name, requireExplicit = false, record = false).alternatives
+        if isQualifyingImplicit(name, sym, pre, imported = true)
+      } f(sym)
+
     private def collectImplicits(syms: Scope, pre: Type, imported: Boolean = false): List[ImplicitInfo] =
       for (sym <- syms.toList if isQualifyingImplicit(sym.name, sym, pre, imported)) yield
         new ImplicitInfo(sym.name, pre, sym)
@@ -811,7 +821,7 @@ trait Contexts { self: Analyzer =>
 
       val pre =
         if (qual.tpe.typeSymbol.isPackageClass)
-          // SI-6225 important if the imported symbol is inherited by the the package object.
+          // SI-6225 important if the imported symbol is inherited by the package object.
           singleType(qual.tpe, qual.tpe member nme.PACKAGE)
         else
           qual.tpe
@@ -819,13 +829,18 @@ trait Contexts { self: Analyzer =>
         case List() =>
           List()
         case List(ImportSelector(nme.WILDCARD, _, _, _)) =>
-          collectImplicits(pre.implicitMembers, pre, imported = true)
+          // Using pre.implicitMembers seems to exposes a problem with out-dated symbols in the IDE,
+          // see the example in https://www.assembla.com/spaces/scala-ide/tickets/1002552#/activity/ticket
+          // I haven't been able to boil that down the an automated test yet.
+          // Looking up implicit members in the package, rather than package object, here is at least
+          // consistent with what is done just below for named imports.
+          collectImplicits(qual.tpe.implicitMembers, pre, imported = true)
         case ImportSelector(from, _, to, _) :: sels1 =>
           var impls = collect(sels1) filter (info => info.name != from)
           if (to != nme.WILDCARD) {
-            for (sym <- importedAccessibleSymbol(imp, to).alternatives)
-              if (isQualifyingImplicit(to, sym, pre, imported = true))
-                impls = new ImplicitInfo(to, pre, sym) :: impls
+            withQualifyingImplicitAlternatives(imp, to, pre) { sym =>
+              impls = new ImplicitInfo(to, pre, sym) :: impls
+            }
           }
           impls
       }
@@ -949,11 +964,8 @@ trait Contexts { self: Analyzer =>
     /** The symbol with name `name` imported via the import in `imp`,
      *  if any such symbol is accessible from this context.
      */
-    def importedAccessibleSymbol(imp: ImportInfo, name: Name): Symbol =
-      importedAccessibleSymbol(imp, name, requireExplicit = false)
-
-    private def importedAccessibleSymbol(imp: ImportInfo, name: Name, requireExplicit: Boolean): Symbol =
-      imp.importedSymbol(name, requireExplicit) filter (s => isAccessible(s, imp.qual.tpe, superAccess = false))
+    private def importedAccessibleSymbol(imp: ImportInfo, name: Name, requireExplicit: Boolean, record: Boolean): Symbol =
+      imp.importedSymbol(name, requireExplicit, record) filter (s => isAccessible(s, imp.qual.tpe, superAccess = false))
 
     /** Is `sym` defined in package object of package `pkg`?
      *  Since sym may be defined in some parent of the package object,
@@ -1099,7 +1111,7 @@ trait Contexts { self: Analyzer =>
       def imp2Explicit   = imp2 isExplicitImport name
 
       def lookupImport(imp: ImportInfo, requireExplicit: Boolean) =
-        importedAccessibleSymbol(imp, name, requireExplicit) filter qualifies
+        importedAccessibleSymbol(imp, name, requireExplicit, record = true) filter qualifies
 
       // Java: A single-type-import declaration d in a compilation unit c of package p
       // that imports a type named n shadows, throughout c, the declarations of:
@@ -1108,10 +1120,10 @@ trait Contexts { self: Analyzer =>
       //
       // A type-import-on-demand declaration never causes any other declaration to be shadowed.
       //
-      // Scala: Bindings of different kinds have a precedence defined on them:
+      // Scala: Bindings of different kinds have a precedence defined on them:
       //
-      //  1) Definitions and declarations that are local, inherited, or made available by a
-      //     package clause in the same compilation unit where the definition occurs have
+      //  1) Definitions and declarations that are local, inherited, or made available by a
+      //     package clause in the same compilation unit where the definition occurs have
       //     highest precedence.
       //  2) Explicit imports have next highest precedence.
       def depthOk(imp: ImportInfo) = (
@@ -1239,7 +1251,7 @@ trait Contexts { self: Analyzer =>
     type Error = AbsTypeError
     type Warning = (Position, String)
 
-    def issue(err: AbsTypeError)(implicit context: Context): Unit = handleError(err.errPos, addDiagString(err.errMsg))
+    def issue(err: AbsTypeError)(implicit context: Context): Unit = handleError(context.fixPosition(err.errPos), addDiagString(err.errMsg))
 
     protected def handleError(pos: Position, msg: String): Unit
     protected def handleSuppressedAmbiguous(err: AbsAmbiguousTypeError): Unit = ()
@@ -1256,7 +1268,7 @@ trait Contexts { self: Analyzer =>
      *  - else, let this context reporter decide
      */
     final def issueAmbiguousError(err: AbsAmbiguousTypeError)(implicit context: Context): Unit =
-      if (context.ambiguousErrors) reporter.error(err.errPos, addDiagString(err.errMsg)) // force reporting... see TODO above
+      if (context.ambiguousErrors) reporter.error(context.fixPosition(err.errPos), addDiagString(err.errMsg)) // force reporting... see TODO above
       else handleSuppressedAmbiguous(err)
 
     @inline final def withFreshErrorBuffer[T](expr: => T): T = {
@@ -1413,7 +1425,7 @@ trait Contexts { self: Analyzer =>
 
     /** The symbol with name `name` imported from import clause `tree`.
      */
-    def importedSymbol(name: Name): Symbol = importedSymbol(name, requireExplicit = false)
+    def importedSymbol(name: Name): Symbol = importedSymbol(name, requireExplicit = false, record = true)
 
     private def recordUsage(sel: ImportSelector, result: Symbol) {
       def posstr = pos.source.file.name + ":" + posOf(sel).line
@@ -1423,7 +1435,7 @@ trait Contexts { self: Analyzer =>
     }
 
     /** If requireExplicit is true, wildcard imports are not considered. */
-    def importedSymbol(name: Name, requireExplicit: Boolean): Symbol = {
+    def importedSymbol(name: Name, requireExplicit: Boolean, record: Boolean): Symbol = {
       var result: Symbol = NoSymbol
       var renamed = false
       var selectors = tree.selectors
@@ -1440,7 +1452,7 @@ trait Contexts { self: Analyzer =>
         if (result == NoSymbol)
           selectors = selectors.tail
       }
-      if (settings.warnUnusedImport && selectors.nonEmpty && result != NoSymbol && pos != NoPosition)
+      if (record && settings.warnUnusedImport && selectors.nonEmpty && result != NoSymbol && pos != NoPosition)
         recordUsage(current, result)
 
       // Harden against the fallout from bugs like SI-6745
@@ -1537,7 +1549,7 @@ object ContextMode {
   final val TypeConstructorAllowed: ContextMode   = 1 << 16
 
   /** TODO: The "sticky modes" are EXPRmode, PATTERNmode, TYPEmode.
-   *  To mimick the sticky mode behavior, when captain stickyfingers
+   *  To mimic the sticky mode behavior, when captain stickyfingers
    *  comes around we need to propagate those modes but forget the other
    *  context modes which were once mode bits; those being so far the
    *  ones listed here.
diff --git a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala
index d3cd26f..509ce59 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala
@@ -110,10 +110,10 @@ trait Implicits {
    * Ignore their constr field! The list of type constraints returned along with each tree specifies the constraints that
    * must be met by the corresponding type parameter in `tpars` (for the returned implicit view to be valid).
    *
-   * @arg tp      from-type for the implicit conversion
-   * @arg context search implicits here
-   * @arg tpars   symbols that should be considered free type variables
-   *              (implicit search should not try to solve them, just track their constraints)
+   * @param tp      from-type for the implicit conversion
+   * @param context search implicits here
+   * @param tpars   symbols that should be considered free type variables
+   *                (implicit search should not try to solve them, just track their constraints)
    */
   def allViewsFrom(tp: Type, context: Context, tpars: List[Symbol]): List[(SearchResult, List[TypeConstraint])] = {
     // my untouchable typevars are better than yours (they can't be constrained by them)
@@ -276,7 +276,7 @@ trait Implicits {
   /** An extractor for types of the form ? { name: (? >: argtpe <: Any*)restp }
    */
   object HasMethodMatching {
-    val dummyMethod = NoSymbol.newTermSymbol("typer$dummy") setInfo NullaryMethodType(AnyTpe)
+    val dummyMethod = NoSymbol.newTermSymbol(TermName("typer$dummy")) setInfo NullaryMethodType(AnyTpe)
 
     def templateArgType(argtpe: Type) = new BoundedWildcardType(TypeBounds.lower(argtpe))
 
@@ -324,8 +324,10 @@ trait Implicits {
    */
   class ImplicitSearch(tree: Tree, pt: Type, isView: Boolean, context0: Context, pos0: Position = NoPosition) extends Typer(context0) with ImplicitsContextErrors {
     val searchId = implicitSearchId()
-    private def typingLog(what: String, msg: => String) =
-      typingStack.printTyping(tree, f"[search #$searchId] $what $msg")
+    private def typingLog(what: String, msg: => String) = {
+      if (printingOk(tree))
+        typingStack.printTyping(f"[search #$searchId] $what $msg")
+    }
 
     import infer._
     if (Statistics.canEnable) Statistics.incCounter(implicitSearchCount)
@@ -586,10 +588,10 @@ trait Implicits {
       if (Statistics.canEnable) Statistics.incCounter(matchingImplicits)
 
       // workaround for deficient context provided by ModelFactoryImplicitSupport#makeImplicitConstraints
-      val isScalaDoc = context.tree == EmptyTree
+      val isScaladoc = context.tree == EmptyTree
 
       val itree0 = atPos(pos.focus) {
-        if (isLocalToCallsite && !isScalaDoc) {
+        if (isLocalToCallsite && !isScaladoc) {
           // SI-4270 SI-5376 Always use an unattributed Ident for implicits in the local scope,
           // rather than an attributed Select, to detect shadowing.
           Ident(info.name)
@@ -626,7 +628,7 @@ trait Implicits {
               // for instance, if we have `class C[T]` and `implicit def conv[T: Numeric](c: C[T]) = ???`
               // then Scaladoc will give us something of type `C[T]`, and it would like to know
               // that `conv` is potentially available under such and such conditions
-              case tree if isImplicitMethodType(tree.tpe) && !isScalaDoc =>
+              case tree if isImplicitMethodType(tree.tpe) && !isScaladoc =>
                 applyImplicitArgs(tree)
               case tree => tree
             }
@@ -846,7 +848,7 @@ trait Implicits {
           errors.collectFirst { case err: DivergentImplicitTypeError => err } foreach saveDivergent
 
           if (search.isDivergent && divergentError.isEmpty) {
-            // Divergence triggered by `i` at this level of the implicit serach. We haven't
+            // Divergence triggered by `i` at this level of the implicit search. We haven't
             // seen divergence so far, we won't issue this error just yet, and instead temporarily
             // treat `i` as a failed candidate.
             saveDivergent(DivergentImplicitTypeError(tree, pt, i.sym))
@@ -893,7 +895,7 @@ trait Implicits {
               try improves(firstPending, alt)
               catch {
                 case e: CyclicReference =>
-                  debugwarn(s"Discarding $firstPending during implicit search due to cyclic reference.")
+                  devWarning(s"Discarding $firstPending during implicit search due to cyclic reference.")
                   true
               }
             )
@@ -918,7 +920,7 @@ trait Implicits {
 
       /** Returns all eligible ImplicitInfos and their SearchResults in a map.
        */
-      def findAll() = linkedMapFrom(eligible)(typedImplicit(_, ptChecked = false, isLocalToCallsite))
+      def findAll() = linkedMapFrom(eligible)(x => try typedImplicit(x, ptChecked = false, isLocalToCallsite) finally context.reporter.clearAll())
 
       /** Returns the SearchResult of the best match.
        */
@@ -985,7 +987,7 @@ trait Implicits {
       if (implicitInfoss.forall(_.isEmpty)) SearchFailure
       else new ImplicitComputation(implicitInfoss, isLocalToCallsite) findBest()
 
-    /** Produce an implicict info map, i.e. a map from the class symbols C of all parts of this type to
+    /** Produce an implicit info map, i.e. a map from the class symbols C of all parts of this type to
      *  the implicit infos in the companion objects of these class symbols C.
      * The parts of a type is the smallest set of types that contains
      *    - the type itself
@@ -1361,7 +1363,7 @@ trait Implicits {
         val succstart = if (stats) Statistics.startTimer(oftypeSucceedNanos) else null
 
         // SI-6667, never search companions after an ambiguous error in in-scope implicits
-        val wasAmbigious = result.isAmbiguousFailure
+        val wasAmbiguous = result.isAmbiguousFailure
 
         // TODO: encapsulate
         val previousErrs = context.reporter.errors
@@ -1371,7 +1373,7 @@ trait Implicits {
 
         // `materializeImplicit` does some preprocessing for `pt`
         // is it only meant for manifests/tags or we need to do the same for `implicitsOfExpectedType`?
-        if (result.isFailure && !wasAmbigious)
+        if (result.isFailure && !wasAmbiguous)
           result = searchImplicit(implicitsOfExpectedType, isLocalToCallsite = false)
 
         if (result.isFailure)
diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
index cf97474..9f7bdf7 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
@@ -376,7 +376,7 @@ trait Infer extends Checkable {
     }
     /** Overload which allocates fresh type vars.
      *  The other one exists because apparently inferExprInstance needs access to the typevars
-     *  after the call, and its wasteful to return a tuple and throw it away almost every time.
+     *  after the call, and it's wasteful to return a tuple and throw it away almost every time.
      */
     private def exprTypeArgs(tparams: List[Symbol], restpe: Type, pt: Type, useWeaklyCompatible: Boolean): List[Type] =
       exprTypeArgs(tparams map freshVar, tparams, restpe, pt, useWeaklyCompatible)
@@ -553,9 +553,8 @@ trait Infer extends Checkable {
       // ...or lower bound of a type param, since they're asking for it.
       def canWarnAboutAny = {
         val loBounds = tparams map (_.info.bounds.lo)
-        val hasAny = pt :: restpe :: formals ::: argtpes ::: loBounds exists (t =>
-          (t contains AnyClass) || (t contains AnyValClass)
-        )
+        def containsAny(t: Type) = (t contains AnyClass) || (t contains AnyValClass)
+        val hasAny = pt :: restpe :: formals ::: argtpes ::: loBounds exists (_.dealiasWidenChain exists containsAny)
         !hasAny
       }
       def argumentPosition(idx: Int): Position = context.tree match {
@@ -935,7 +934,7 @@ trait Infer extends Checkable {
       def infer_s = map3(tparams, tvars, targs)((tparam, tvar, targ) => s"$tparam=$tvar/$targ") mkString ","
       printTyping(tree, s"infer expr instance from pt=$pt, $infer_s")
 
-      // SI-7899 infering by-name types is unsound. The correct behaviour is conditional because the hole is
+      // SI-7899 inferring by-name types is unsound. The correct behaviour is conditional because the hole is
       //         exploited in Scalaz (Free.scala), as seen in: run/t7899-regression.
       def dropByNameIfStrict(tp: Type): Type = if (settings.inferByName) tp else dropByName(tp)
       def targsStrict = if (targs eq null) null else targs mapConserve dropByNameIfStrict
@@ -1118,7 +1117,7 @@ trait Infer extends Checkable {
 
     // this is quite nasty: it destructively changes the info of the syms of e.g., method type params
     // (see #3692, where the type param T's bounds were set to > : T <: T, so that parts looped)
-    // the changes are rolled back by restoreTypeBounds, but might be unintentially observed in the mean time
+    // the changes are rolled back by restoreTypeBounds, but might be unintentionally observed in the mean time
     def instantiateTypeVar(tvar: TypeVar) {
       val tparam                    = tvar.origin.typeSymbol
       val TypeBounds(lo0, hi0)      = tparam.info.bounds
@@ -1376,7 +1375,7 @@ trait Infer extends Checkable {
      *  Otherwise, if there is no best alternative, error.
      *
      *  @param argtpes0 contains the argument types. If an argument is named, as
-     *    "a = 3", the corresponding type is `NamedType("a", Int)'. If the name
+     *    "a = 3", the corresponding type is `NamedType("a", Int)`. If the name
      *    of some NamedType does not exist in an alternative's parameter names,
      *    the type is replaces by `Unit`, i.e. the argument is treated as an
      *    assignment expression.
diff --git a/src/compiler/scala/tools/nsc/typechecker/Macros.scala b/src/compiler/scala/tools/nsc/typechecker/Macros.scala
index da7b8b0..3ed128c 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Macros.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Macros.scala
@@ -3,13 +3,14 @@ package typechecker
 
 import java.lang.Math.min
 import symtab.Flags._
-import scala.tools.nsc.util._
+import scala.reflect.internal.util.ScalaClassLoader
 import scala.reflect.runtime.ReflectionUtils
 import scala.collection.mutable.ListBuffer
 import scala.reflect.ClassTag
 import scala.reflect.internal.util.Statistics
 import scala.reflect.macros.util._
 import scala.util.control.ControlThrowable
+import scala.reflect.internal.util.ListOfNil
 import scala.reflect.macros.runtime.{AbortMacroException, MacroRuntimes}
 import scala.reflect.runtime.{universe => ru}
 import scala.reflect.macros.compiler.DefaultMacroCompiler
@@ -54,6 +55,13 @@ trait Macros extends MacroRuntimes with Traces with Helpers {
 
   def globalSettings = global.settings
 
+  /** Obtains a `ClassLoader` instance used for macro expansion.
+   *
+   *  By default a new `ScalaClassLoader` is created using the classpath
+   *  from global and the classloader of self as parent.
+   *
+   *  Mirrors with runtime definitions (e.g. Repl) need to adjust this method.
+   */
   protected def findMacroClassLoader(): ClassLoader = {
     val classpath = global.classPath.asURLs
     macroLogVerbose("macro classloader: initializing from -cp: %s".format(classpath))
@@ -84,9 +92,9 @@ trait Macros extends MacroRuntimes with Traces with Helpers {
    */
   case class MacroImplBinding(
       // Is this macro impl a bundle (a trait extending *box.Macro) or a vanilla def?
-      val isBundle: Boolean,
+      isBundle: Boolean,
       // Is this macro impl blackbox (i.e. having blackbox.Context in its signature)?
-      val isBlackbox: Boolean,
+      isBlackbox: Boolean,
       // Java class name of the class that contains the macro implementation
       // is used to load the corresponding object with Java reflection
       className: String,
@@ -657,7 +665,7 @@ trait Macros extends MacroRuntimes with Traces with Helpers {
       //
       // Situation #2 requires measures to be taken. If we're in it, then noone's going to help us infer
       // the undetermined type params. Therefore we need to do something ourselves or otherwise this
-      // expandee will forever remaing not expanded (see SI-5692). A traditional way out of this conundrum
+      // expandee will forever remain not expanded (see SI-5692). A traditional way out of this conundrum
       // is to call `instantiate` and let the inferencer try to find the way out. It works for simple cases,
       // but sometimes, if the inferencer lacks information, it will be forced to approximate.
       //
diff --git a/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala b/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala
index 0aa62d7..f3856db 100644
--- a/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala
@@ -8,6 +8,7 @@ package typechecker
 import symtab.Flags._
 import scala.reflect.internal.util.StringOps.{ ojoin }
 import scala.reflect.ClassTag
+import scala.reflect.internal.util.ListOfNil
 import scala.reflect.runtime.{ universe => ru }
 import scala.language.higherKinds
 
@@ -384,7 +385,7 @@ trait MethodSynthesis {
       }
     }
     case class Getter(tree: ValDef) extends BaseGetter(tree) {
-      override def derivedSym = if (mods.isDeferred) basisSym else basisSym.getter(enclClass)
+      override def derivedSym = if (mods.isDeferred) basisSym else basisSym.getterIn(enclClass)
       private def derivedRhs  = if (mods.isDeferred) EmptyTree else fieldSelection
       private def derivedTpt = {
         // For existentials, don't specify a type for the getter, even one derived
@@ -435,7 +436,7 @@ trait MethodSynthesis {
           if (tree.symbol.owner.isTrait || hasUnitType(basisSym)) rhs1
           else gen.mkAssignAndReturn(basisSym, rhs1)
         )
-        derivedSym setPos tree.pos // cannot set it at createAndEnterSymbol because basisSym can possible stil have NoPosition
+        derivedSym setPos tree.pos // cannot set it at createAndEnterSymbol because basisSym can possibly still have NoPosition
         val ddefRes = DefDef(derivedSym, new ChangeOwnerAndModuleClassTraverser(basisSym, derivedSym)(body))
         // ValDef will have its position focused whereas DefDef will have original correct rangepos
         // ideally positions would be correct at the creation time but lazy vals are really a special case
@@ -451,7 +452,7 @@ trait MethodSynthesis {
       def flagsMask  = SetterFlags
       def flagsExtra = ACCESSOR
 
-      override def derivedSym = basisSym.setter(enclClass)
+      override def derivedSym = basisSym.setterIn(enclClass)
     }
     case class Field(tree: ValDef) extends DerivedFromValDef {
       def name       = tree.localName
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index 711cfba..4ad81b6 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -10,6 +10,7 @@ import scala.collection.mutable
 import scala.annotation.tailrec
 import symtab.Flags._
 import scala.language.postfixOps
+import scala.reflect.internal.util.ListOfNil
 
 /** This trait declares methods to create symbols and to enter them into scopes.
  *
@@ -144,8 +145,8 @@ trait Namers extends MethodSynthesis {
         // while Scala's enum constants live directly in the class.
         // We don't check for clazz.superClass == JavaEnumClass, because this causes a illegal
         // cyclic reference error. See the commit message for details.
-        if (context.unit.isJava) owner.companionClass.hasEnumFlag else owner.hasEnumFlag
-      vd.mods.hasAllFlags(ENUM | STABLE | STATIC) && ownerHasEnumFlag
+        if (context.unit.isJava) owner.companionClass.hasJavaEnumFlag else owner.hasJavaEnumFlag
+      vd.mods.hasAllFlags(JAVA_ENUM | STABLE | STATIC) && ownerHasEnumFlag
     }
 
     def setPrivateWithin[T <: Symbol](tree: Tree, sym: T, mods: Modifiers): T =
@@ -203,7 +204,7 @@ trait Namers extends MethodSynthesis {
     }
 
     // FIXME - this logic needs to be thoroughly explained
-    // and justified.  I know it's wrong with repect to package
+    // and justified.  I know it's wrong with respect to package
     // objects, but I think it's also wrong in other ways.
     protected def conflict(newS: Symbol, oldS: Symbol) = (
        (   !oldS.isSourceMethod
@@ -464,7 +465,7 @@ trait Namers extends MethodSynthesis {
     def enterModuleSymbol(tree : ModuleDef): Symbol = {
       var m: Symbol = context.scope lookupModule tree.name
       val moduleFlags = tree.mods.flags | MODULE
-      if (m.isModule && !m.isPackage && inCurrentScope(m) && (currentRun.canRedefine(m) || m.isSynthetic)) {
+      if (m.isModule && !m.hasPackageFlag && inCurrentScope(m) && (currentRun.canRedefine(m) || m.isSynthetic)) {
         // This code accounts for the way the package objects found in the classpath are opened up
         // early by the completer of the package itself. If the `packageobjects` phase then finds
         // the same package object in sources, we have to clean the slate and remove package object
@@ -487,7 +488,7 @@ trait Namers extends MethodSynthesis {
         m.moduleClass setFlag moduleClassFlags(moduleFlags)
         setPrivateWithin(tree, m.moduleClass)
       }
-      if (m.isTopLevel && !m.isPackage) {
+      if (m.isTopLevel && !m.hasPackageFlag) {
         m.moduleClass.associatedFile = contextFile
         currentRun.symSource(m) = m.moduleClass.sourceFile
         registerTopLevelSym(m)
@@ -844,7 +845,7 @@ trait Namers extends MethodSynthesis {
     private def widenIfNecessary(sym: Symbol, tpe: Type, pt: Type): Type = {
       val getter =
         if (sym.isValue && sym.owner.isClass && sym.isPrivate)
-          sym.getter(sym.owner)
+          sym.getterIn(sym.owner)
         else sym
       def isHidden(tp: Type): Boolean = tp match {
         case SingleType(pre, sym) =>
@@ -1105,7 +1106,7 @@ trait Namers extends MethodSynthesis {
        * As a first side effect, this method assigns a MethodType constructed using this
        * return type to `meth`. This allows omitting the result type for recursive methods.
        *
-       * As another side effect, this method also assigns paramter types from the overridden
+       * As another side effect, this method also assigns parameter types from the overridden
        * method to parameters of `meth` that have missing types (the parser accepts missing
        * parameter types under -Yinfer-argument-types).
        */
@@ -1124,7 +1125,7 @@ trait Namers extends MethodSynthesis {
             for (vparam <- vparams) {
               if (vparam.tpt.isEmpty) {
                 val overriddenParamTp = overriddenParams.head.tpe
-                // references to type parameteres in overriddenParamTp link to the type skolems, so the
+                // references to type parameters in overriddenParamTp link to the type skolems, so the
                 // assigned type is consistent with the other / existing parameter types in vparamSymss.
                 vparam.symbol setInfo overriddenParamTp
                 vparam.tpt defineType overriddenParamTp setPos vparam.pos.focus
@@ -1305,7 +1306,7 @@ trait Namers extends MethodSynthesis {
                   // by martin: the null case can happen in IDE; this is really an ugly hack on top of an ugly hack but it seems to work
                   case Some(cda) =>
                     if (cda.companionModuleClassNamer == null) {
-                      debugwarn(s"SI-6576 The companion module namer for $meth was unexpectedly null")
+                      devWarning(s"SI-6576 The companion module namer for $meth was unexpectedly null")
                       return
                     }
                     val p = (cda.classWithDefault, cda.companionModuleClassNamer)
diff --git a/src/compiler/scala/tools/nsc/typechecker/PatternTypers.scala b/src/compiler/scala/tools/nsc/typechecker/PatternTypers.scala
index fa4a764..f90e61f 100644
--- a/src/compiler/scala/tools/nsc/typechecker/PatternTypers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/PatternTypers.scala
@@ -79,7 +79,7 @@ trait PatternTypers {
       // do not update the symbol if the tree's symbol's type does not define an unapply member
       // (e.g. since it's some method that returns an object with an unapply member)
       val fun         = inPlaceAdHocOverloadingResolution(fun0)(hasUnapplyMember)
-      val caseClass   = fun.tpe.typeSymbol.linkedClassOfClass
+      val caseClass   = companionSymbolOf(fun.tpe.typeSymbol.sourceModule, context)
       val member      = unapplyMember(fun.tpe)
       def resultType  = (fun.tpe memberType member).finalResultType
       def isEmptyType = resultOfMatchingMethod(resultType, nme.isEmpty)()
@@ -268,7 +268,7 @@ trait PatternTypers {
 
       def freshArgType(tp: Type): Type = tp match {
         case MethodType(param :: _, _) => param.tpe
-        case PolyType(tparams, restpe) => createFromClonedSymbols(tparams, freshArgType(restpe))(polyType)
+        case PolyType(tparams, restpe) => createFromClonedSymbols(tparams, freshArgType(restpe))(genPolyType)
         case OverloadedType(_, _)      => OverloadedUnapplyError(fun) ; ErrorType
         case _                         => UnapplyWithSingleArgError(fun) ; ErrorType
       }
@@ -305,7 +305,7 @@ trait PatternTypers {
       // clearing the type is necessary so that ref will be stabilized; see bug 881
       val fun1 = typedPos(fun.pos)(Apply(Select(fun.clearType(), unapplyMethod), unapplyArgTree :: Nil))
 
-      def makeTypedUnApply() = {
+      def makeTypedUnapply() = {
         // the union of the expected type and the inferred type of the argument to unapply
         val glbType        = glb(ensureFullyDefined(pt) :: unapplyArg.tpe_* :: Nil)
         val wrapInTypeTest = canRemedy && !(fun1.symbol.owner isNonBottomSubClass ClassTagClass)
@@ -325,7 +325,7 @@ trait PatternTypers {
         if (isBlackbox(unapplyMethod)) duplErrorTree(BlackboxExtractorExpansion(tree))
         else duplErrorTree(WrongShapeExtractorExpansion(tree))
       } else
-        makeTypedUnApply()
+        makeTypedUnapply()
     }
 
     def wrapClassTagUnapply(uncheckedPattern: Tree, classTagExtractor: Tree, pt: Type): Tree = {
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index d2931ff..3b2e07b 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -421,7 +421,7 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
             overrideError("cannot be used here - classes can only override abstract types")
           } else if (other.isEffectivelyFinal) { // (1.2)
             overrideError("cannot override final member")
-          } else if (!other.isDeferredOrDefault && !other.hasFlag(DEFAULTMETHOD) && !member.isAnyOverride && !member.isSynthetic) { // (*)
+          } else if (!other.isDeferredOrJavaDefault && !other.hasFlag(JAVA_DEFAULTMETHOD) && !member.isAnyOverride && !member.isSynthetic) { // (*)
             // (*) Synthetic exclusion for (at least) default getters, fixes SI-5178. We cannot assign the OVERRIDE flag to
             // the default getter: one default getter might sometimes override, sometimes not. Example in comment on ticket.
               if (isNeitherInClass && !(other.owner isSubClass member.owner))
@@ -584,7 +584,7 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
             !other.isDeferred && other.isJavaDefined && !sym.enclClass.isSubClass(other.enclClass) && {
               // #3622: erasure operates on uncurried types --
               // note on passing sym in both cases: only sym.isType is relevant for uncurry.transformInfo
-              // !!! erasure.erasure(sym, uncurry.transformInfo(sym, tp)) gives erreneous of inaccessible type - check whether that's still the case!
+              // !!! erasure.erasure(sym, uncurry.transformInfo(sym, tp)) gives erroneous or inaccessible type - check whether that's still the case!
               def uncurryAndErase(tp: Type) = erasure.erasure(sym)(uncurry.transformInfo(sym, tp))
               val tp1 = uncurryAndErase(clazz.thisType.memberType(sym))
               val tp2 = uncurryAndErase(clazz.thisType.memberType(other))
@@ -604,7 +604,7 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
         def checkNoAbstractMembers(): Unit = {
           // Avoid spurious duplicates: first gather any missing members.
           def memberList = clazz.info.nonPrivateMembersAdmitting(VBRIDGE)
-          val (missing, rest) = memberList partition (m => m.isDeferredNotDefault && !ignoreDeferred(m))
+          val (missing, rest) = memberList partition (m => m.isDeferredNotJavaDefault && !ignoreDeferred(m))
           // Group missing members by the name of the underlying symbol,
           // to consolidate getters and setters.
           val grouped = missing groupBy (sym => analyzer.underlyingSymbol(sym).name)
@@ -718,7 +718,7 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
 
           // Check the remainder for invalid absoverride.
           for (member <- rest ; if (member.isAbstractOverride && member.isIncompleteIn(clazz))) {
-            val other = member.superSymbol(clazz)
+            val other = member.superSymbolIn(clazz)
             val explanation =
               if (other != NoSymbol) " and overrides incomplete superclass member " + infoString(other)
               else ", but no concrete implementation could be found in a base class"
@@ -1122,7 +1122,7 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
     }
     /** Sensibility check examines flavors of equals. */
     def checkSensible(pos: Position, fn: Tree, args: List[Tree]) = fn match {
-      case Select(qual, name @ (nme.EQ | nme.NE | nme.eq | nme.ne)) if args.length == 1 && isObjectOrAnyComparisonMethod(fn.symbol) =>
+      case Select(qual, name @ (nme.EQ | nme.NE | nme.eq | nme.ne)) if args.length == 1 && isObjectOrAnyComparisonMethod(fn.symbol) && !currentOwner.isSynthetic =>
         checkSensibleEquals(pos, qual, name, fn.symbol, args.head)
       case _ =>
     }
@@ -1134,13 +1134,13 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
           t hasSymbolWhich (_.accessedOrSelf == valOrDef.symbol)
         case _ => false
       }
-      val trivialInifiniteLoop = (
+      val trivialInfiniteLoop = (
         !valOrDef.isErroneous
      && !valOrDef.symbol.isValueParameter
      && valOrDef.symbol.paramss.isEmpty
      && callsSelf
       )
-      if (trivialInifiniteLoop)
+      if (trivialInfiniteLoop)
         reporter.warning(valOrDef.rhs.pos, s"${valOrDef.symbol.fullLocationString} does nothing other than call itself recursively")
     }
 
@@ -1182,11 +1182,23 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
     private def eliminateModuleDefs(moduleDef: Tree): List[Tree] = exitingRefchecks {
       val ModuleDef(_, _, impl) = moduleDef
       val module        = moduleDef.symbol
+      val moduleClass   = module.moduleClass
       val site          = module.owner
       val moduleName    = module.name.toTermName
       // The typer doesn't take kindly to seeing this ClassDef; we have to
       // set NoType so it will be ignored.
-      val cdef          = ClassDef(module.moduleClass, impl) setType NoType
+      val cdef          = ClassDef(moduleClass, impl) setType NoType
+
+      // This code is related to the fix of SI-9375, which stops adding `readResolve` methods to
+      // non-static (nested) modules. Before the fix, the method would cause the module accessor
+      // to become notPrivate. To prevent binary changes in the 2.11.x branch, we mimic that behavior.
+      // There is a bit of code duplication between here and SyntheticMethods. We cannot call
+      // makeNotPrivate already in SyntheticMethod: that is during type checking, and not all references
+      // are resolved yet, so we cannot rename a definition. This code doesn't exist in the 2.12.x branch.
+      def hasConcreteImpl(name: Name) = moduleClass.info.member(name).alternatives exists (m => !m.isDeferred)
+      val hadReadResolveBeforeSI9375 = moduleClass.isSerializable && !hasConcreteImpl(nme.readResolve)
+      if (hadReadResolveBeforeSI9375)
+        moduleClass.sourceModule.makeNotPrivate(moduleClass.sourceModule.owner)
 
       // Create the module var unless the immediate owner is a class and
       // the module var already exists there. See SI-5012, SI-6712.
@@ -1210,7 +1222,7 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
       }
       def matchingInnerObject() = {
         val newFlags = (module.flags | STABLE) & ~MODULE
-        val newInfo  = NullaryMethodType(module.moduleClass.tpe)
+        val newInfo  = NullaryMethodType(moduleClass.tpe)
         val accessor = site.newMethod(moduleName, module.pos, newFlags) setInfoAndEnter newInfo
 
         DefDef(accessor, Select(This(site), module)) :: Nil
@@ -1491,9 +1503,8 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
       }
     }
 
-    private def transformCaseApply(tree: Tree, ifNot: => Unit) = {
+    private def isSimpleCaseApply(tree: Tree): Boolean = {
       val sym = tree.symbol
-
       def isClassTypeAccessible(tree: Tree): Boolean = tree match {
         case TypeApply(fun, targs) =>
           isClassTypeAccessible(fun)
@@ -1501,30 +1512,26 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
           ( // SI-4859 `CaseClass1().InnerCaseClass2()` must not be rewritten to `new InnerCaseClass2()`;
             //          {expr; Outer}.Inner() must not be rewritten to `new Outer.Inner()`.
             treeInfo.isQualifierSafeToElide(module) &&
-            // SI-5626 Classes in refinement types cannot be constructed with `new`. In this case,
-            // the companion class is actually not a ClassSymbol, but a reference to an abstract type.
-            module.symbol.companionClass.isClass
-          )
+              // SI-5626 Classes in refinement types cannot be constructed with `new`. In this case,
+              // the companion class is actually not a ClassSymbol, but a reference to an abstract type.
+              module.symbol.companionClass.isClass
+            )
       }
 
-      val doTransform =
-        sym.isSourceMethod &&
+      sym.isSourceMethod &&
         sym.isCase &&
         sym.name == nme.apply &&
-        isClassTypeAccessible(tree)
+        isClassTypeAccessible(tree) &&
+        !tree.tpe.finalResultType.typeSymbol.primaryConstructor.isLessAccessibleThan(tree.symbol)
+    }
 
-      if (doTransform) {
-        tree foreach {
-          case i at Ident(_) =>
-            enterReference(i.pos, i.symbol) // SI-5390 need to `enterReference` for `a` in `a.B()`
-          case _ =>
-        }
-        toConstructor(tree.pos, tree.tpe)
-      }
-      else {
-        ifNot
-        tree
+    private def transformCaseApply(tree: Tree) = {
+      tree foreach {
+        case i at Ident(_) =>
+          enterReference(i.pos, i.symbol) // SI-5390 need to `enterReference` for `a` in `a.B()`
+        case _ =>
       }
+      toConstructor(tree.pos, tree.tpe)
     }
 
     private def transformApply(tree: Apply): Tree = tree match {
@@ -1564,12 +1571,24 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
         // term should have been eliminated by super accessors
         assert(!(qual.symbol.isTrait && sym.isTerm && mix == tpnme.EMPTY), (qual.symbol, sym, mix))
 
-      transformCaseApply(tree,
+      // Rewrite eligible calls to monomorphic case companion apply methods to the equivalent constructor call.
+      //
+      // Note: for generic case classes the rewrite needs to be handled at the enclosing `TypeApply` to transform
+      // `TypeApply(Select(C, apply), targs)` to `Select(New(C[targs]), <init>)`. In case such a `TypeApply`
+      // was deemed ineligible for transformation (e.g. the case constructor was private), the refchecks transform
+      // will recurse to this point with `Select(C, apply)`, which will have a type `[T](...)C[T]`.
+      //
+      // We don't need to perform the check on the Select node, and `!isHigherKinded will guard against this
+      // redundant (and previously buggy, SI-9546) consideration.
+      if (!tree.tpe.isHigherKinded && isSimpleCaseApply(tree)) {
+        transformCaseApply(tree)
+      } else {
         qual match {
           case Super(_, mix)  => checkSuper(mix)
           case _              =>
         }
-      )
+        tree
+      }
     }
     private def transformIf(tree: If): Tree = {
       val If(cond, thenpart, elsepart) = tree
@@ -1684,16 +1703,19 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
               case _ =>
             }
             if (skipBounds) {
-              tree.tpe = tree.tpe.map {
+              tree.setType(tree.tpe.map {
                 _.filterAnnotations(_.symbol != UncheckedBoundsClass)
-              }
+              })
             }
 
             tree
 
           case TypeApply(fn, args) =>
             checkBounds(tree, NoPrefix, NoSymbol, fn.tpe.typeParams, args map (_.tpe))
-            transformCaseApply(tree, ())
+            if (isSimpleCaseApply(tree))
+              transformCaseApply(tree)
+            else
+              tree
 
           case x @ Apply(_, _)  =>
             transformApply(x)
@@ -1712,12 +1734,11 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
 
           case Ident(name) =>
             checkUndesiredProperties(sym, tree.pos)
-            transformCaseApply(tree,
-              if (name != nme.WILDCARD && name != tpnme.WILDCARD_STAR) {
-                assert(sym != NoSymbol, "transformCaseApply: name = " + name.debugString + " tree = " + tree + " / " + tree.getClass) //debug
-                enterReference(tree.pos, sym)
-              }
-            )
+            if (name != nme.WILDCARD && name != tpnme.WILDCARD_STAR) {
+              assert(sym != NoSymbol, "transformCaseApply: name = " + name.debugString + " tree = " + tree + " / " + tree.getClass) //debug
+              enterReference(tree.pos, sym)
+            }
+            tree
 
           case x @ Select(_, _) =>
             transformSelect(x)
diff --git a/src/compiler/scala/tools/nsc/typechecker/StdAttachments.scala b/src/compiler/scala/tools/nsc/typechecker/StdAttachments.scala
index ea44b9d..92b0719 100644
--- a/src/compiler/scala/tools/nsc/typechecker/StdAttachments.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/StdAttachments.scala
@@ -132,7 +132,7 @@ trait StdAttachments {
   /** Marks the tree as a macro impl reference, which is a naked reference to a method.
    *
    *  This is necessary for typechecking macro impl references (see `DefaultMacroCompiler.defaultResolveMacroImpl`),
-   *  because otherwise typing a naked reference will result in the "follow this method with `_' if you want to
+   *  because otherwise typing a naked reference will result in the "follow this method with `_` if you want to
    *  treat it as a partially applied function" errors.
    *
    *  This mark suppresses adapt except for when the annottee is a macro application.
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
index db81eec..e0d96df 100644
--- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
@@ -322,7 +322,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT
             case Super(_, mix) =>
               if (sym.isValue && !sym.isMethod || sym.hasAccessorFlag) {
                 if (!settings.overrideVars)
-                  reporter.error(tree.pos, "super may be not be used on " + sym.accessedOrSelf)
+                  reporter.error(tree.pos, "super may not be used on " + sym.accessedOrSelf)
               } else if (isDisallowed(sym)) {
                 reporter.error(tree.pos, "super not allowed here: use this." + name.decode + " instead")
               }
diff --git a/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala b/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala
index d2046a1..1b3f066 100644
--- a/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala
@@ -322,6 +322,7 @@ trait SyntheticMethods extends ast.TreeDSL {
          clazz.isModuleClass
       && clazz.isSerializable
       && !hasConcreteImpl(nme.readResolve)
+      && clazz.isStatic
     )
 
     def synthesize(): List[Tree] = {
@@ -344,7 +345,7 @@ trait SyntheticMethods extends ast.TreeDSL {
               // Without a means to suppress this warning, I've thought better of it.
               if (settings.warnValueOverrides) {
                  (clazz.info nonPrivateMember m.name) filter (m => (m.owner != AnyClass) && (m.owner != clazz) && !m.isDeferred) andAlso { m =>
-                   currentUnit.warning(clazz.pos, s"Implementation of ${m.name} inherited from ${m.owner} overridden in $clazz to enforce value class semantics")
+                   typer.context.warning(clazz.pos, s"Implementation of ${m.name} inherited from ${m.owner} overridden in $clazz to enforce value class semantics")
                  }
                }
               true
diff --git a/src/compiler/scala/tools/nsc/typechecker/Tags.scala b/src/compiler/scala/tools/nsc/typechecker/Tags.scala
index 57dc74d..56127f4 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Tags.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Tags.scala
@@ -36,7 +36,7 @@ trait Tags {
      *  @param   allowMaterialization   If true (default) then the resolver is allowed to launch materialization macros when there's no class tag in scope.
      *                                  If false then materialization macros are prohibited from running.
      *
-     *  @returns Tree that represents an `scala.reflect.ClassTag` for `tp` if everything is okay.
+     *  @return  Tree that represents an `scala.reflect.ClassTag` for `tp` if everything is okay.
      *           EmptyTree if the result contains unresolved (i.e. not spliced) type parameters and abstract type members.
      *           EmptyTree if `allowMaterialization` is false, and there is no class tag in scope.
      */
@@ -57,7 +57,7 @@ trait Tags {
      *  @param   allowMaterialization   If true (default) then the resolver is allowed to launch materialization macros when there's no type tag in scope.
      *                                  If false then materialization macros are prohibited from running.
      *
-     *  @returns Tree that represents a `scala.reflect.TypeTag` for `tp` if everything is okay.
+     *  @return  Tree that represents a `scala.reflect.TypeTag` for `tp` if everything is okay.
      *           EmptyTree if `concrete` is true and the result contains unresolved (i.e. not spliced) type parameters and abstract type members.
      *           EmptyTree if `allowMaterialization` is false, and there is no array tag in scope.
      */
diff --git a/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala b/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala
index 0235658..e8db830 100644
--- a/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala
@@ -262,7 +262,14 @@ abstract class TreeCheckers extends Analyzer {
         checkedTyped(tree, mode, pt)
     )
     private def checkedTyped(tree: Tree, mode: Mode, pt: Type): Tree = {
-      val typed = wrap(tree)(super.typed(tree, mode, pt))
+      val typed = wrap(tree)(super.typed(tree.clearType(), mode, pt))
+
+      // Vlad: super.typed returns null for package defs, why is that?
+      if (typed eq null)
+        return tree
+
+      if (typed.tpe ne null)
+        assert(!typed.tpe.isErroneous, "Tree has erroneous type: " + typed)
 
       if (tree ne typed)
         treesDiffer(tree, typed)
@@ -300,8 +307,8 @@ abstract class TreeCheckers extends Analyzer {
                   checkSym(tree)
                   /* XXX: lots of syms show up here with accessed == NoSymbol. */
                   if (accessed != NoSymbol) {
-                    val agetter = accessed.getter(sym.owner)
-                    val asetter = accessed.setter(sym.owner)
+                    val agetter = accessed.getterIn(sym.owner)
+                    val asetter = accessed.setterIn(sym.owner)
 
                     assertFn(agetter == sym || asetter == sym,
                       sym + " is getter or setter, but accessed sym " + accessed + " shows " + agetter + " and " + asetter
@@ -311,7 +318,7 @@ abstract class TreeCheckers extends Analyzer {
             }
           case ValDef(_, _, _, _) =>
             if (sym.hasGetter && !sym.isOuterField && !sym.isOuterAccessor) {
-              assertFn(sym.getter(sym.owner) != NoSymbol, ownerstr(sym) + " has getter but cannot be found. " + sym.ownerChain)
+              assertFn(sym.getterIn(sym.owner) != NoSymbol, ownerstr(sym) + " has getter but cannot be found. " + sym.ownerChain)
             }
           case Apply(fn, args) =>
             if (args exists (_ == EmptyTree))
diff --git a/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala b/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala
index 0f90c6a..5f2643c 100644
--- a/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala
@@ -141,8 +141,8 @@ trait TypeDiagnostics {
     if (!member.hasAccessorFlag) member
     else if (!member.isDeferred) member.accessed
     else {
-      val getter = if (member.isSetter) member.getter(member.owner) else member
-      val flags  = if (getter.setter(member.owner) != NoSymbol) DEFERRED.toLong | MUTABLE else DEFERRED
+      val getter = if (member.isSetter) member.getterIn(member.owner) else member
+      val flags  = if (getter.setterIn(member.owner) != NoSymbol) DEFERRED.toLong | MUTABLE else DEFERRED
 
       getter.owner.newValue(getter.name.toTermName, getter.pos, flags) setInfo getter.tpe.resultType
     }
@@ -309,6 +309,7 @@ trait TypeDiagnostics {
     // save the name because it will be mutated until it has been
     // distinguished from the other types in the same error message
     private val savedName = sym.name
+    private var postQualifiedWith: List[Symbol] = Nil
     def restoreName()     = sym.name = savedName
     def modifyName(f: String => String) = sym setName newTypeName(f(sym.name.toString))
 
@@ -317,12 +318,12 @@ trait TypeDiagnostics {
      */
     def qualifyDefaultNamespaces() = {
       val intersect = Set(trueOwner, aliasOwner) intersect UnqualifiedOwners
-      if (intersect.nonEmpty) preQualify()
+      if (intersect.nonEmpty && tp.typeSymbolDirect.name == tp.typeSymbol.name) preQualify()
     }
 
     // functions to manipulate the name
     def preQualify()   = modifyName(trueOwner.fullName + "." + _)
-    def postQualify()  = modifyName(_ + "(in " + trueOwner + ")")
+    def postQualify()  = if (!(postQualifiedWith contains trueOwner)) { postQualifiedWith ::= trueOwner; modifyName(_ + "(in " + trueOwner + ")") }
     def typeQualify()  = if (sym.isTypeParameterOrSkolem) postQualify()
     def nameQualify()  = if (trueOwner.isPackageClass) preQualify() else postQualify()
 
@@ -439,7 +440,7 @@ trait TypeDiagnostics {
       context.warning(pos, "imported `%s' is permanently hidden by definition of %s".format(hidden, defn.fullLocationString))
 
     object checkUnused {
-      val ignoreNames = Set[TermName]("readResolve", "readObject", "writeObject", "writeReplace")
+      val ignoreNames: Set[TermName] = Set(TermName("readResolve"), TermName("readObject"), TermName("writeObject"), TermName("writeReplace"))
 
       class UnusedPrivates extends Traverser {
         val defnTrees = ListBuffer[MemberDef]()
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 3a85d16..6b73a53 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -14,7 +14,7 @@ package tools.nsc
 package typechecker
 
 import scala.collection.{mutable, immutable}
-import scala.reflect.internal.util.{ BatchSourceFile, Statistics, shortClassOfInstance }
+import scala.reflect.internal.util.{ BatchSourceFile, Statistics, shortClassOfInstance, ListOfNil }
 import mutable.ListBuffer
 import symtab.Flags._
 import Mode._
@@ -151,7 +151,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
           for(ar <- argResultsBuff)
             paramTp = paramTp.subst(ar.subst.from, ar.subst.to)
 
-          val res = if (paramFailed || (paramTp.isError && {paramFailed = true; true})) SearchFailure else inferImplicit(fun, paramTp, context.reportErrors, isView = false, context)
+          val res = if (paramFailed || (paramTp.isErroneous && {paramFailed = true; true})) SearchFailure else inferImplicit(fun, paramTp, context.reportErrors, isView = false, context)
           argResultsBuff += res
 
           if (res.isSuccess) {
@@ -245,7 +245,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
       case TypeRef(_, sym, _) if sym.isAliasType =>
         val tp0 = tp.dealias
         if (tp eq tp0) {
-          debugwarn(s"dropExistential did not progress dealiasing $tp, see SI-7126")
+          devWarning(s"dropExistential did not progress dealiasing $tp, see SI-7126")
           tp
         } else {
           val tp1 = dropExistential(tp0)
@@ -1039,11 +1039,11 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
           // to non-continuation types.
           if (tree.tpe <:< AnyTpe) pt.dealias match {
             case TypeRef(_, UnitClass, _) => // (12)
-              if (settings.warnValueDiscard)
+              if (!isPastTyper && settings.warnValueDiscard)
                 context.warning(tree.pos, "discarded non-Unit value")
               return typedPos(tree.pos, mode, pt)(Block(List(tree), Literal(Constant(()))))
             case TypeRef(_, sym, _) if isNumericValueClass(sym) && isNumericSubType(tree.tpe, pt) =>
-              if (settings.warnNumericWiden)
+              if (!isPastTyper && settings.warnNumericWiden)
                 context.warning(tree.pos, "implicit numeric widening")
               return typedPos(tree.pos, mode, pt)(Select(tree, "to" + sym.name))
             case _ =>
@@ -2044,7 +2044,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
           if (mexists(vparamss)(_.symbol == superArg.symbol)) {
             val alias = (
               superAcc.initialize.alias
-                orElse (superAcc getter superAcc.owner)
+                orElse (superAcc getterIn superAcc.owner)
                 filter (alias => superClazz.info.nonPrivateMember(alias.name) == alias)
             )
             if (alias.exists && !alias.accessed.isVariable && !isRepeatedParamType(alias.accessed.info)) {
@@ -2053,7 +2053,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
                 case acc                                           => acc
               }
               ownAcc match {
-                case acc: TermSymbol if !acc.isVariable =>
+                case acc: TermSymbol if !acc.isVariable && !isByNameParamType(acc.info) =>
                   debuglog(s"$acc has alias ${alias.fullLocationString}")
                   acc setAlias alias
                 case _ =>
@@ -2565,7 +2565,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
         val default = methodSym newValueParameter (newTermName("default"), tree.pos.focus, SYNTHETIC) setInfo functionType(List(A1.tpe), B1.tpe)
 
         val paramSyms = List(x, default)
-        methodSym setInfo polyType(List(A1, B1), MethodType(paramSyms, B1.tpe))
+        methodSym setInfo genPolyType(List(A1, B1), MethodType(paramSyms, B1.tpe))
 
         val methodBodyTyper = newTyper(context.makeNewScope(context.tree, methodSym))
         if (!paramSynthetic) methodBodyTyper.context.scope enter x
@@ -2725,7 +2725,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
      *
      * If 'T' is not fully defined, it is inferred by type checking
      * `apply$body` without a result type before type checking the block.
-     * The method's inferred result type is used instead of T`. [See test/files/pos/sammy_poly.scala]
+     * The method's inferred result type is used instead of `T`. [See test/files/pos/sammy_poly.scala]
      *
      * The `apply` method is identified by the argument `sam`; `S` corresponds to the argument `samClassTp`,
      * and `resPt` is derived from `samClassTp` -- it may be fully defined, or not...
@@ -2865,7 +2865,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
         ClassDef(Modifiers(FINAL), tpnme.ANON_FUN_NAME, tparams = Nil,
           gen.mkTemplate(
             parents    = TypeTree(samClassTpFullyDefined) :: serializableParentAddendum,
-            self       = emptyValDef,
+            self       = noSelfType,
             constrMods = NoMods,
             vparamss   = ListOfNil,
             body       = List(samDef),
@@ -2934,7 +2934,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
         var issuedMissingParameterTypeError = false
         foreach2(fun.vparams, argpts) { (vparam, argpt) =>
           if (vparam.tpt.isEmpty) {
-            vparam.tpt.tpe =
+            val vparamType =
               if (isFullyDefined(argpt)) argpt
               else {
                 fun match {
@@ -2953,6 +2953,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
                 issuedMissingParameterTypeError = true
                 ErrorType
               }
+            vparam.tpt.setType(vparamType)
             if (!vparam.tpt.pos.isDefined) vparam.tpt setPos vparam.pos.focus
           }
         }
@@ -3304,7 +3305,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
           // https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.3
           //
           // One can think of these methods as being infinitely overloaded. We create
-          // a ficticious new cloned method symbol for each call site that takes on a signature
+          // a fictitious new cloned method symbol for each call site that takes on a signature
           // governed by a) the argument types and b) the expected type
           val args1 = typedArgs(args, forArgMode(fun, mode))
           val pts = args1.map(_.tpe.deconst)
@@ -3387,7 +3388,6 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
               // defaults are needed. they are added to the argument list in named style as
               // calls to the default getters. Example:
               //  foo[Int](a)()  ==>  foo[Int](a)(b = foo$qual.foo$default$2[Int](a))
-              checkNotMacro()
 
               // SI-8111 transformNamedApplication eagerly shuffles around the application to preserve
               //         evaluation order. During this process, it calls `changeOwner` on symbols that
@@ -3434,6 +3434,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
                   duplErrTree
                 } else if (lencmp2 == 0) {
                   // useful when a default doesn't match parameter type, e.g. def f[T](x:T="a"); f[Int]()
+                  checkNotMacro()
                   context.diagUsedDefaults = true
                   doTypedApply(tree, if (blockIsEmpty) fun else fun1, allArgs, mode, pt)
                 } else {
@@ -3557,6 +3558,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
     def typedAnnotation(ann: Tree, mode: Mode = EXPRmode): AnnotationInfo = {
       var hasError: Boolean = false
       val pending = ListBuffer[AbsTypeError]()
+      def ErroneousAnnotation = new ErroneousAnnotation().setOriginal(ann)
 
       def finish(res: AnnotationInfo): AnnotationInfo = {
         if (hasError) {
@@ -4105,7 +4107,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
 
         def resultingTypeTree(tpe: Type) = {
           // we need symbol-ful originals for reification
-          // hence we go the extra mile to hand-craft tis guy
+          // hence we go the extra mile to hand-craft this guy
           val original = arg1 match {
             case tt @ TypeTree() if tt.original != null => Annotated(ann, tt.original)
             // this clause is needed to correctly compile stuff like "new C @D" or "@(inline @getter)"
@@ -4257,7 +4259,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
         // in the special (though common) case where the types are equal, it pays to pack before comparing
         // especially virtpatmat needs more aggressive unification of skolemized types
         // this breaks src/library/scala/collection/immutable/TrieIterator.scala
-        // annotated types need to be lubbed regardless (at least, continations break if you by pass them like this)
+        // annotated types need to be lubbed regardless (at least, continuations break if you bypass them like this)
         def samePackedTypes = (
              !isPastTyper
           && thenp1.tpe.annotations.isEmpty
@@ -4300,7 +4302,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
             val selector1 = atPos(tree.pos.focusStart) { if (arity == 1) ids.head else gen.mkTuple(ids) }
             // SI-8120 If we don't duplicate the cases, the original Match node will share trees with ones that
             //         receive symbols owned by this function. However if, after a silent mode session, we discard
-            //         this Function and try a different approach (e.g. applying a view to the reciever) we end up
+            //         this Function and try a different approach (e.g. applying a view to the receiver) we end up
             //         with orphaned symbols which blows up far down the pipeline (or can be detected with -Ycheck:typer).
             val body = treeCopy.Match(tree, selector1, (cases map duplicateAndKeepPositions).asInstanceOf[List[CaseDef]])
             typed1(atPos(tree.pos) { Function(params, body) }, mode, pt)
@@ -4365,7 +4367,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
         def narrowRhs(tp: Type) = { val sym = context.tree.symbol
           context.tree match {
             case ValDef(mods, _, _, Apply(Select(`tree`, _), _)) if !mods.isMutable && sym != null && sym != NoSymbol =>
-              val sym1 = if (sym.owner.isClass && sym.getter(sym.owner) != NoSymbol) sym.getter(sym.owner)
+              val sym1 = if (sym.owner.isClass && sym.getterIn(sym.owner) != NoSymbol) sym.getterIn(sym.owner)
                 else sym.lazyAccessorOrSelf
               val pre = if (sym1.owner.isClass) sym1.owner.thisType else NoPrefix
               intersectionType(List(tp, singleType(pre, sym1)))
@@ -4442,7 +4444,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
         def onError(typeErrors: Seq[AbsTypeError], warnings: Seq[(Position, String)]): Tree = {
           if (Statistics.canEnable) Statistics.stopTimer(failedApplyNanos, start)
 
-          // If the problem is with raw types, copnvert to existentials and try again.
+          // If the problem is with raw types, convert to existentials and try again.
           // See #4712 for a case where this situation arises,
           if ((fun.symbol ne null) && fun.symbol.isJavaDefined) {
             val newtpe = rawToExistential(fun.tpe)
@@ -4576,7 +4578,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
           typed1(atPos(tree.pos)(Block(stats, Apply(expr, args) setPos tree.pos.makeTransparent)), mode, pt)
         case Apply(fun, args) =>
           normalTypedApply(tree, fun, args) match {
-            case ArrayInstantiation(tree1)                                           => typed(tree1, mode, pt)
+            case ArrayInstantiation(tree1)                                           => if (tree1.isErrorTyped) tree1 else typed(tree1, mode, pt)
             case Apply(Select(fun, nme.apply), _) if treeInfo.isSuperConstrCall(fun) => TooManyArgumentListsForConstructor(tree) //SI-5696
             case tree1                                                               => tree1
           }
@@ -4880,10 +4882,11 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
             (// this -> Foo.this
             if (sym.isThisSym)
               typed1(This(sym.owner) setPos tree.pos, mode, pt)
-          // Inferring classOf type parameter from expected type.  Otherwise an
-          // actual call to the stubbed classOf method is generated, returning null.
-            else if (isPredefClassOf(sym) && pt.typeSymbol == ClassClass && pt.typeArgs.nonEmpty)
-            typedClassOf(tree, TypeTree(pt.typeArgs.head))
+            else if (isPredefClassOf(sym) && pt.typeSymbol == ClassClass && pt.typeArgs.nonEmpty) {
+              // Inferring classOf type parameter from expected type.  Otherwise an
+              // actual call to the stubbed classOf method is generated, returning null.
+              typedClassOf(tree, TypeTree(pt.typeArgs.head).setPos(tree.pos.focus))
+            }
           else {
               val pre1  = if (sym.isTopLevel) sym.owner.thisType else if (qual == EmptyTree) NoPrefix else qual.tpe
               val tree1 = if (qual == EmptyTree) tree else atPos(tree.pos)(Select(atPos(tree.pos.focusStart)(qual), name))
@@ -4986,7 +4989,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
               TypeTreeWithDeferredRefCheck(){ () =>
                 // wrap the tree and include the bounds check -- refchecks will perform this check (that the beta reduction was indeed allowed) and unwrap
                 // we can't simply use original in refchecks because it does not contains types
-                // (and the only typed trees we have have been mangled so they're not quite the original tree anymore)
+                // (and the only typed trees we have been mangled so they're not quite the original tree anymore)
                 checkBounds(result, tpt1.tpe.prefix, tpt1.symbol.owner, tpt1.symbol.typeParams, argtypes, "")
                 result // you only get to see the wrapped tree after running this check :-p
               } setType (result.tpe) setPos(result.pos)
@@ -5198,15 +5201,12 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
           def warn(message: String)         = context.warning(lit.pos, s"possible missing interpolator: $message")
           def suspiciousSym(name: TermName) = context.lookupSymbol(name, _ => true).symbol
           def suspiciousExpr                = InterpolatorCodeRegex findFirstIn s
-          def suspiciousIdents              = InterpolatorIdentRegex findAllIn s map (s => suspiciousSym(s drop 1))
+          def suspiciousIdents              = InterpolatorIdentRegex findAllIn s map (s => suspiciousSym(TermName(s drop 1)))
 
-          // heuristics - no warning on e.g. a string with only "$asInstanceOf"
-          if (s contains ' ') (
-            if (suspiciousExpr.nonEmpty)
-              warn("detected an interpolated expression") // "${...}"
-            else
-              suspiciousIdents find isPlausible foreach (sym => warn(s"detected interpolated identifier `$$${sym.name}`")) // "$id"
-          )
+          if (suspiciousExpr.nonEmpty)
+            warn("detected an interpolated expression") // "${...}"
+          else
+            suspiciousIdents find isPlausible foreach (sym => warn(s"detected interpolated identifier `$$${sym.name}`")) // "$id"
         }
         lit match {
           case Literal(Constant(s: String)) if !isRecognizablyNotForInterpolation => maybeWarn(s)
@@ -5384,8 +5384,8 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
       )
       def runTyper(): Tree = {
         if (retypingOk) {
-          tree.tpe = null
-          if (tree.hasSymbol) tree.symbol = NoSymbol
+          tree.setType(null)
+          if (tree.hasSymbolField) tree.symbol = NoSymbol
         }
         val alreadyTyped = tree.tpe ne null
         val shouldPrint = !alreadyTyped && !phase.erasedTypes
diff --git a/src/compiler/scala/tools/nsc/typechecker/TypersTracking.scala b/src/compiler/scala/tools/nsc/typechecker/TypersTracking.scala
index 550fd4e..37fbb73 100644
--- a/src/compiler/scala/tools/nsc/typechecker/TypersTracking.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/TypersTracking.scala
@@ -159,7 +159,7 @@ trait TypersTracking {
   // Some trees which are typed with mind-numbing frequency and
   // which add nothing by being printed. Did () type to Unit? Let's
   // gamble on yes.
-  private def printingOk(t: Tree) = printTypings && (settings.debug.value || !noPrint(t))
+  def printingOk(t: Tree) = printTypings && (settings.debug.value || !noPrint(t))
   def noPrintTyping(t: Tree) = (t.tpe ne null) || !printingOk(t)
   def noPrintAdapt(tree1: Tree, tree2: Tree) = !printingOk(tree1) || (
        (tree1.tpe == tree2.tpe)
diff --git a/src/compiler/scala/tools/nsc/typechecker/Unapplies.scala b/src/compiler/scala/tools/nsc/typechecker/Unapplies.scala
index fc1f45e..22fb072 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Unapplies.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Unapplies.scala
@@ -7,6 +7,7 @@ package scala.tools.nsc
 package typechecker
 
 import symtab.Flags._
+import scala.reflect.internal.util.ListOfNil
 
 /*
  *  @author  Martin Odersky
diff --git a/src/compiler/scala/tools/nsc/util/ClassPath.scala b/src/compiler/scala/tools/nsc/util/ClassPath.scala
index 8d4d077..2811520 100644
--- a/src/compiler/scala/tools/nsc/util/ClassPath.scala
+++ b/src/compiler/scala/tools/nsc/util/ClassPath.scala
@@ -22,7 +22,7 @@ import Jar.isJarOrZip
 
 /** <p>
  *    This module provides star expansion of '-classpath' option arguments, behaves the same as
- *    java, see [http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html]
+ *    java, see [[http://docs.oracle.com/javase/6/docs/technotes/tools/windows/classpath.html]]
  *  </p>
  *
  *  @author Stepan Koltsov
diff --git a/src/compiler/scala/tools/nsc/util/DocStrings.scala b/src/compiler/scala/tools/nsc/util/DocStrings.scala
old mode 100755
new mode 100644
index 3528168..501546b
--- a/src/compiler/scala/tools/nsc/util/DocStrings.scala
+++ b/src/compiler/scala/tools/nsc/util/DocStrings.scala
@@ -37,7 +37,7 @@ object DocStrings {
   /** Returns index of string `str` after `start` skipping longest
    *  sequence of space and tab characters, possibly also containing
    *  a single `*` character or the `/``**` sequence.
-   *  @pre  start == str.length || str(start) == `\n'
+   *  @pre  start == str.length || str(start) == `\n`
    */
   def skipLineLead(str: String, start: Int): Int =
     if (start == str.length) start
@@ -49,7 +49,7 @@ object DocStrings {
       else idx
     }
 
-  /** Skips to next occurrence of `\n' or to the position after the `/``**` sequence following index `start`.
+  /** Skips to next occurrence of `\n` or to the position after the `/``**` sequence following index `start`.
    */
   def skipToEol(str: String, start: Int): Int =
     if (start + 2 < str.length && (str charAt start) == '/' && (str charAt (start + 1)) == '*' && (str charAt (start + 2)) == '*') start + 3
@@ -184,7 +184,7 @@ object DocStrings {
         extractSectionTag(str, section) -> section
     }
 
-  /** Extract the section tag, treating the section tag as an indentifier */
+  /** Extract the section tag, treating the section tag as an identifier */
   def extractSectionTag(str: String, section: (Int, Int)): String =
     str.substring(section._1, skipTag(str, section._1))
 
diff --git a/src/compiler/scala/tools/reflect/ReflectGlobal.scala b/src/compiler/scala/tools/reflect/ReflectGlobal.scala
index ac63232..e30d1ed 100644
--- a/src/compiler/scala/tools/reflect/ReflectGlobal.scala
+++ b/src/compiler/scala/tools/reflect/ReflectGlobal.scala
@@ -1,9 +1,11 @@
 package scala.tools
 package reflect
 
+import scala.reflect.internal.util.ScalaClassLoader
 import scala.tools.nsc.Global
 import scala.tools.nsc.reporters.Reporter
 import scala.tools.nsc.Settings
+import scala.tools.nsc.typechecker.Analyzer
 
 /** A version of Global that uses reflection to get class
  *  infos, instead of reading class or source files.
@@ -11,6 +13,20 @@ import scala.tools.nsc.Settings
 class ReflectGlobal(currentSettings: Settings, reporter: Reporter, override val rootClassLoader: ClassLoader)
   extends Global(currentSettings, reporter) with scala.tools.reflect.ReflectSetup with scala.reflect.runtime.SymbolTable {
 
+  override lazy val analyzer = new {
+    val global: ReflectGlobal.this.type = ReflectGlobal.this
+  } with Analyzer {
+    /** Obtains the classLoader used for runtime macro expansion.
+     *
+     *  Macro expansion can use everything available in [[global.classPath]] or [[rootClassLoader]].
+     *  The [[rootClassLoader]] is used to obtain runtime defined macros.
+     */
+    override protected def findMacroClassLoader(): ClassLoader = {
+      val classpath = global.classPath.asURLs
+      ScalaClassLoader.fromURLs(classpath, rootClassLoader)
+    }
+  }
+
   override def transformedType(sym: Symbol) =
     postErasure.transformInfo(sym,
       erasure.transformInfo(sym,
diff --git a/src/compiler/scala/tools/reflect/ToolBoxFactory.scala b/src/compiler/scala/tools/reflect/ToolBoxFactory.scala
index 1643e00..47c88f2 100644
--- a/src/compiler/scala/tools/reflect/ToolBoxFactory.scala
+++ b/src/compiler/scala/tools/reflect/ToolBoxFactory.scala
@@ -7,7 +7,7 @@ import scala.tools.nsc.Global
 import scala.tools.nsc.reporters._
 import scala.tools.nsc.CompilerCommand
 import scala.tools.nsc.io.{AbstractFile, VirtualDirectory}
-import scala.tools.nsc.util.AbstractFileClassLoader
+import scala.reflect.internal.util.AbstractFileClassLoader
 import scala.reflect.internal.Flags._
 import scala.reflect.internal.util.{BatchSourceFile, NoSourceFile, NoFile}
 import java.lang.{Class => jClass}
diff --git a/src/eclipse/README.md b/src/eclipse/README.md
index 03c7403..fe2c109 100644
--- a/src/eclipse/README.md
+++ b/src/eclipse/README.md
@@ -1,13 +1,18 @@
 Eclipse project files
 =====================
 
-The following points describe how to get Scala to run in Eclipse. Please also take a look at the [excellent tutorial on scala-ide.org](http://scala-ide.org/docs/tutorials/scalac-trunk/index.html).
+For important details on building, debugging and file encodings, please see [the excellent tutorial on scala-ide.org](http://scala-ide.org/docs/tutorials/scalac-trunk/index.html).
 
-0. Import all projects into a [very recent version of Scala IDE for Eclipse](http://scala-ide.org/download/nightly.html) by choosing `File/Import Existing Projects`
-and navigate to `scala/src/eclipse`. Check all projects and click ok.
+The following points describe how to build Scala using Eclipse.
 
-0. You need to define a `path variable` inside Eclipse. Define `SCALA_BASEDIR` in 
-`Preferences/General/Workspace/Linked Resources`. The value should be the absolute 
+0. Download the [Scala IDE bundle](http://scala-ide.org/download/sdk.html). It comes preconfigured for optimal performance.
+
+0. Run `ant init` to download some necessary jars.
+
+0. Import the project (in `src/eclipse`) via `File` → `Import Existing Projects` and navigate to `scala/src/eclipse`. Check all projects and click ok.
+
+0. You need to define a `path variable` inside Eclipse. Define `SCALA_BASEDIR` in
+`Preferences/General/Workspace/Linked Resources`. The value should be the absolute
 path to your Scala checkout. All paths in the project files are relative to this one,
 so nothing will work before you do so.
 
@@ -29,7 +34,7 @@ JDK. The Scala library uses such APIs, so you'd see this error:
         Access restriction: The method compareAndSwapObject(Object, long, Object, Object)
         from the type Unsafe is not accessible due to restriction on required library.
 
-  You can *fix* it by allowing calls to restricted APIs in `Java/Compiler/Errors/Warnings/Deprecated and Restricted API` 
+  You can *fix* it by allowing calls to restricted APIs in `Java/Compiler/Errors/Warnings/Deprecated and Restricted API`
 settings.
 
 0. Project files are tracked by Git, so adding them to `.gitignore` won't prevent them
diff --git a/src/eclipse/asm/.classpath b/src/eclipse/asm/.classpath
deleted file mode 100644
index 03d9e97..0000000
--- a/src/eclipse/asm/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="asm-quick-bin"/>
-</classpath>
diff --git a/src/eclipse/asm/.project b/src/eclipse/asm/.project
deleted file mode 100644
index c905138..0000000
--- a/src/eclipse/asm/.project
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>asm</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-	<linkedResources>
-		<link>
-			<name>src</name>
-			<type>2</type>
-			<locationURI>SCALA_BASEDIR/src/asm</locationURI>
-		</link>
-		<link>
-			<name>asm-quick-bin</name>
-			<type>2</type>
-			<locationURI>SCALA_BASEDIR/build/asm/classes</locationURI>
-		</link>
-	</linkedResources>
-</projectDescription>
diff --git a/src/eclipse/interactive/.classpath b/src/eclipse/interactive/.classpath
index 9e773a3..565492b 100644
--- a/src/eclipse/interactive/.classpath
+++ b/src/eclipse/interactive/.classpath
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="interactive"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-asm/5.0.4-scala-3/scala-asm-5.0.4-scala-3.jar"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/scaladoc"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/scala-compiler"/>
diff --git a/src/eclipse/interactive/.gitignore b/src/eclipse/interactive/.gitignore
new file mode 100644
index 0000000..fe789dd
--- /dev/null
+++ b/src/eclipse/interactive/.gitignore
@@ -0,0 +1,2 @@
+# what appears to be a Scala IDE-generated file
+.cache-main
diff --git a/src/eclipse/partest/.classpath b/src/eclipse/partest/.classpath
index 7f28868..9e3a3c9 100644
--- a/src/eclipse/partest/.classpath
+++ b/src/eclipse/partest/.classpath
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="partest-extras"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/asm"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-asm/5.0.4-scala-3/scala-asm-5.0.4-scala-3.jar"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/repl"/>
 	<classpathentry kind="var" path="M2_REPO/com/googlecode/java-diff-utils/diffutils/1.3.0/diffutils-1.3.0.jar"/>
 	<classpathentry kind="var" path="M2_REPO/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-partest_2.11.0-M7/1.0.0-RC8/scala-partest_2.11.0-M7-1.0.0-RC8.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-partest_2.11/1.0.9/scala-partest_2.11-1.0.9.jar"/>
 	<classpathentry kind="var" path="SCALA_BASEDIR/lib/ant/ant.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/scala-compiler"/>
diff --git a/src/eclipse/partest/.gitignore b/src/eclipse/partest/.gitignore
new file mode 100644
index 0000000..fe789dd
--- /dev/null
+++ b/src/eclipse/partest/.gitignore
@@ -0,0 +1,2 @@
+# what appears to be a Scala IDE-generated file
+.cache-main
diff --git a/src/eclipse/reflect/.gitignore b/src/eclipse/reflect/.gitignore
new file mode 100644
index 0000000..fe789dd
--- /dev/null
+++ b/src/eclipse/reflect/.gitignore
@@ -0,0 +1,2 @@
+# what appears to be a Scala IDE-generated file
+.cache-main
diff --git a/src/eclipse/repl/.classpath b/src/eclipse/repl/.classpath
index 8ff9aab..56d83c0 100644
--- a/src/eclipse/repl/.classpath
+++ b/src/eclipse/repl/.classpath
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-  <classpathentry kind="src" path="repl"/>
-  <classpathentry combineaccessrules="false" kind="src" path="/asm"/>
-  <classpathentry kind="var" path="M2_REPO/jline/jline/2.12/jline-2.12.jar"/>
-  <!-- <classpathentry kind="var" path="SCALA_BASEDIR/build/deps/repl/jline-2.12.jar"/> -->
-  <classpathentry combineaccessrules="false" kind="src" path="/scala-compiler"/>
-  <classpathentry combineaccessrules="false" kind="src" path="/scala-library"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-  <classpathentry kind="output" path="build-quick-repl"/>
+	<classpathentry kind="src" path="repl"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-asm/5.0.4-scala-3/scala-asm-5.0.4-scala-3.jar"/>
+	<classpathentry kind="var" path="M2_REPO/jline/jline/2.12.1/jline-2.12.1.jar"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/scala-compiler"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/scala-library"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/interactive"/>
+	<classpathentry kind="output" path="build-quick-repl"/>
 </classpath>
diff --git a/src/eclipse/repl/.gitignore b/src/eclipse/repl/.gitignore
new file mode 100644
index 0000000..fe789dd
--- /dev/null
+++ b/src/eclipse/repl/.gitignore
@@ -0,0 +1,2 @@
+# what appears to be a Scala IDE-generated file
+.cache-main
diff --git a/src/eclipse/scala-compiler/.classpath b/src/eclipse/scala-compiler/.classpath
index e81cacc..6c9be61 100644
--- a/src/eclipse/scala-compiler/.classpath
+++ b/src/eclipse/scala-compiler/.classpath
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="compiler"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/asm"/>
 	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/reflect"/>
 	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/scala-library"/>
 	<classpathentry kind="var" path="SCALA_BASEDIR/lib/ant/ant.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-asm/5.0.4-scala-3/scala-asm-5.0.4-scala-3.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="output" path="build-quick-compiler"/>
 </classpath>
diff --git a/src/eclipse/scala-compiler/.gitignore b/src/eclipse/scala-compiler/.gitignore
new file mode 100644
index 0000000..fe789dd
--- /dev/null
+++ b/src/eclipse/scala-compiler/.gitignore
@@ -0,0 +1,2 @@
+# what appears to be a Scala IDE-generated file
+.cache-main
diff --git a/src/eclipse/scala-library/.gitignore b/src/eclipse/scala-library/.gitignore
new file mode 100644
index 0000000..fe789dd
--- /dev/null
+++ b/src/eclipse/scala-library/.gitignore
@@ -0,0 +1,2 @@
+# what appears to be a Scala IDE-generated file
+.cache-main
diff --git a/src/eclipse/scaladoc/.classpath b/src/eclipse/scaladoc/.classpath
index c8f0e89..568cf67 100644
--- a/src/eclipse/scaladoc/.classpath
+++ b/src/eclipse/scaladoc/.classpath
@@ -2,12 +2,12 @@
 <classpath>
 	<classpathentry kind="src" path="scaladoc"/>
 	<classpathentry kind="var" path="SCALA_BASEDIR/lib/ant/ant.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-asm/5.0.4-scala-3/scala-asm-5.0.4-scala-3.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/scala-compiler"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/scala-library"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/partest-extras"/>
-	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-xml_2.11.0-M7/1.0.0-RC7/scala-xml_2.11.0-M7-1.0.0-RC7.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-parser-combinators_2.11.0-M7/1.0.0-RC5/scala-parser-combinators_2.11.0-M7-1.0.0-RC5.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-partest_2.11.0-M7/1.0.0-RC8/scala-partest_2.11.0-M7-1.0.0-RC8.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-xml_2.11/1.0.4/scala-xml_2.11-1.0.4.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-parser-combinators_2.11/1.0.4/scala-parser-combinators_2.11-1.0.4.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-partest_2.11/1.0.9/scala-partest_2.11-1.0.9.jar"/>
 	<classpathentry kind="output" path="build-quick-scaladoc"/>
 </classpath>
diff --git a/src/eclipse/scaladoc/.gitignore b/src/eclipse/scaladoc/.gitignore
new file mode 100644
index 0000000..fe789dd
--- /dev/null
+++ b/src/eclipse/scaladoc/.gitignore
@@ -0,0 +1,2 @@
+# what appears to be a Scala IDE-generated file
+.cache-main
diff --git a/src/eclipse/scalap/.gitignore b/src/eclipse/scalap/.gitignore
new file mode 100644
index 0000000..fe789dd
--- /dev/null
+++ b/src/eclipse/scalap/.gitignore
@@ -0,0 +1,2 @@
+# what appears to be a Scala IDE-generated file
+.cache-main
diff --git a/src/eclipse/test-junit/.classpath b/src/eclipse/test-junit/.classpath
index 8a599bd..92c0b74 100644
--- a/src/eclipse/test-junit/.classpath
+++ b/src/eclipse/test-junit/.classpath
@@ -1,12 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="test-junit"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-asm/5.0.4-scala-3/scala-asm-5.0.4-scala-3.jar"/>
 	<classpathentry kind="var" path="SCALA_BASEDIR/lib/ant/ant.jar"/>
-	<classpathentry kind="var" path="M2_REPO/junit/junit/4.10/junit-4.10.jar"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/reflect"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/scala-library"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/scala-compiler"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/repl"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/partest-extras"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/scaladoc"/>
+	<classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-xml_2.11/1.0.4/scala-xml_2.11-1.0.4.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="output" path="build-test-junit"/>
 </classpath>
diff --git a/src/eclipse/test-junit/.gitignore b/src/eclipse/test-junit/.gitignore
new file mode 100644
index 0000000..fe789dd
--- /dev/null
+++ b/src/eclipse/test-junit/.gitignore
@@ -0,0 +1,2 @@
+# what appears to be a Scala IDE-generated file
+.cache-main
diff --git a/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java b/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java
index 19237c9..a7ef492 100644
--- a/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java
+++ b/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java
@@ -24,7 +24,7 @@ import java.util.Random;
  * {@code ThreadLocalRandom.current().nextX(...)} (where
  * {@code X} is {@code Int}, {@code Long}, etc).
  * When all usages are of this form, it is never possible to
- * accidently share a {@code ThreadLocalRandom} across multiple threads.
+ * accidentally share a {@code ThreadLocalRandom} across multiple threads.
  *
  * <p>This class also provides additional commonly used bounded random
  * generation methods.
diff --git a/src/intellij-14/README b/src/intellij-14/README
deleted file mode 100644
index 310a766..0000000
--- a/src/intellij-14/README
+++ /dev/null
@@ -1,12 +0,0 @@
-Use the latest IntelliJ IDEA release and install the Scala plugin from within the IDE.
-
-Compilation withing IDEA is performed in "-Dlocker.skip=1" mode: the sources are built
-directly using the STARR compiler.
-
-The following steps are required to use IntelliJ IDEA on Scala trunk
- - Run "ant init". This will download some JARs from to ./build/deps, which are
-   included in IntelliJ's classpath.
- - Run src/intellij-14/setup.sh
- - Open ./src/intellij-14/scala.ipr in IntelliJ
- - File, Project Settings, Project, SDK. Create an SDK entry named "1.6" containing the
-   Java 1.6 SDK
diff --git a/src/intellij-14/actors.iml.SAMPLE b/src/intellij-14/actors.iml.SAMPLE
deleted file mode 100644
index 3da7a5f..0000000
--- a/src/intellij-14/actors.iml.SAMPLE
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../actors">
-      <sourceFolder url="file://$MODULE_DIR$/../actors" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="forkjoin" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/asm.iml.SAMPLE b/src/intellij-14/asm.iml.SAMPLE
deleted file mode 100644
index 9b2fd58..0000000
--- a/src/intellij-14/asm.iml.SAMPLE
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../asm">
-      <sourceFolder url="file://$MODULE_DIR$/../asm/src" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/../asm" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/compiler.iml.SAMPLE b/src/intellij-14/compiler.iml.SAMPLE
deleted file mode 100644
index 858ca2f..0000000
--- a/src/intellij-14/compiler.iml.SAMPLE
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../compiler">
-      <sourceFolder url="file://$MODULE_DIR$/../compiler" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="asm" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="library" name="ant" level="project" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/diff.sh b/src/intellij-14/diff.sh
deleted file mode 100755
index 54f9248..0000000
--- a/src/intellij-14/diff.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-#
-# Diffs the SAMPLE files against the working project config.
-#
-export SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
-for f in "$SCRIPT_DIR"/*.{iml,ipr}; do
-	echo $f; diff -u $f.SAMPLE $f;
-done
diff --git a/src/intellij-14/forkjoin.iml.SAMPLE b/src/intellij-14/forkjoin.iml.SAMPLE
deleted file mode 100644
index 42507b2..0000000
--- a/src/intellij-14/forkjoin.iml.SAMPLE
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../forkjoin">
-      <sourceFolder url="file://$MODULE_DIR$/../forkjoin" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/interactive.iml.SAMPLE b/src/intellij-14/interactive.iml.SAMPLE
deleted file mode 100644
index db12a7d..0000000
--- a/src/intellij-14/interactive.iml.SAMPLE
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../interactive">
-      <sourceFolder url="file://$MODULE_DIR$/../interactive" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="scaladoc" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/library.iml.SAMPLE b/src/intellij-14/library.iml.SAMPLE
deleted file mode 100644
index 08cccba..0000000
--- a/src/intellij-14/library.iml.SAMPLE
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../library">
-      <sourceFolder url="file://$MODULE_DIR$/../library" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="forkjoin" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/manual.iml.SAMPLE b/src/intellij-14/manual.iml.SAMPLE
deleted file mode 100644
index 2e67076..0000000
--- a/src/intellij-14/manual.iml.SAMPLE
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../manual">
-      <sourceFolder url="file://$MODULE_DIR$/../manual" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="library" name="ant" level="project" />
-    <orderEntry type="library" name="scaladoc-deps" level="project" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/partest-extras.iml.SAMPLE b/src/intellij-14/partest-extras.iml.SAMPLE
deleted file mode 100644
index b3537a9..0000000
--- a/src/intellij-14/partest-extras.iml.SAMPLE
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../partest-extras">
-      <sourceFolder url="file://$MODULE_DIR$/../partest-extras" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="asm" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="repl" />
-    <orderEntry type="library" name="partest" level="project" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/partest-javaagent.iml.SAMPLE b/src/intellij-14/partest-javaagent.iml.SAMPLE
deleted file mode 100644
index 3a387aa..0000000
--- a/src/intellij-14/partest-javaagent.iml.SAMPLE
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../partest-javaagent">
-      <sourceFolder url="file://$MODULE_DIR$/../partest-javaagent" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="asm" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/reflect.iml.SAMPLE b/src/intellij-14/reflect.iml.SAMPLE
deleted file mode 100644
index 87da137..0000000
--- a/src/intellij-14/reflect.iml.SAMPLE
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../reflect">
-      <sourceFolder url="file://$MODULE_DIR$/../reflect" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/repl.iml.SAMPLE b/src/intellij-14/repl.iml.SAMPLE
deleted file mode 100644
index 5a7476b..0000000
--- a/src/intellij-14/repl.iml.SAMPLE
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../repl">
-      <sourceFolder url="file://$MODULE_DIR$/../repl" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="module" module-name="asm" />
-    <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="library" name="repl-deps" level="project" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/scala.iml.SAMPLE b/src/intellij-14/scala.iml.SAMPLE
deleted file mode 100644
index 9e8718d..0000000
--- a/src/intellij-14/scala.iml.SAMPLE
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../..">
-      <excludeFolder url="file://$MODULE_DIR$/../../build" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/scala.ipr.SAMPLE b/src/intellij-14/scala.ipr.SAMPLE
deleted file mode 100644
index 1e3d074..0000000
--- a/src/intellij-14/scala.ipr.SAMPLE
+++ /dev/null
@@ -1,261 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="CompilerConfiguration">
-    <option name="DEFAULT_COMPILER" value="Javac" />
-    <resourceExtensions />
-    <wildcardResourcePatterns>
-      <entry name="!?*.java" />
-      <entry name="!?*.form" />
-      <entry name="!?*.class" />
-      <entry name="!?*.groovy" />
-      <entry name="!?*.scala" />
-      <entry name="!?*.flex" />
-      <entry name="!?*.kt" />
-      <entry name="!?*.clj" />
-    </wildcardResourcePatterns>
-    <annotationProcessing>
-      <profile default="true" name="Default" enabled="false">
-        <processorPath useClasspath="true" />
-      </profile>
-    </annotationProcessing>
-  </component>
-  <component name="CopyrightManager" default="" />
-  <component name="DaemonCodeAnalyzer">
-    <disable_hints />
-  </component>
-  <component name="DependencyValidationManager">
-    <option name="SKIP_IMPORT_STATEMENTS" value="false" />
-  </component>
-  <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
-  <component name="EntryPointsManager">
-    <entry_points version="2.0" />
-  </component>
-  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
-    <OptionsSetting value="true" id="Add" />
-    <OptionsSetting value="true" id="Remove" />
-    <OptionsSetting value="true" id="Checkout" />
-    <OptionsSetting value="true" id="Update" />
-    <OptionsSetting value="true" id="Status" />
-    <OptionsSetting value="true" id="Edit" />
-    <ConfirmationsSetting value="0" id="Add" />
-    <ConfirmationsSetting value="0" id="Remove" />
-  </component>
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/actors.iml" filepath="$PROJECT_DIR$/actors.iml" />
-      <module fileurl="file://$PROJECT_DIR$/asm.iml" filepath="$PROJECT_DIR$/asm.iml" />
-      <module fileurl="file://$PROJECT_DIR$/compiler.iml" filepath="$PROJECT_DIR$/compiler.iml" />
-      <module fileurl="file://$PROJECT_DIR$/forkjoin.iml" filepath="$PROJECT_DIR$/forkjoin.iml" />
-      <module fileurl="file://$PROJECT_DIR$/interactive.iml" filepath="$PROJECT_DIR$/interactive.iml" />
-      <module fileurl="file://$PROJECT_DIR$/library.iml" filepath="$PROJECT_DIR$/library.iml" />
-      <module fileurl="file://$PROJECT_DIR$/manual.iml" filepath="$PROJECT_DIR$/manual.iml" />
-      <module fileurl="file://$PROJECT_DIR$/partest-extras.iml" filepath="$PROJECT_DIR$/partest-extras.iml" />
-      <module fileurl="file://$PROJECT_DIR$/partest-javaagent.iml" filepath="$PROJECT_DIR$/partest-javaagent.iml" />
-      <module fileurl="file://$PROJECT_DIR$/reflect.iml" filepath="$PROJECT_DIR$/reflect.iml" />
-      <module fileurl="file://$PROJECT_DIR$/repl.iml" filepath="$PROJECT_DIR$/repl.iml" />
-      <module fileurl="file://$PROJECT_DIR$/scala.iml" filepath="$PROJECT_DIR$/scala.iml" />
-      <module fileurl="file://$PROJECT_DIR$/scaladoc.iml" filepath="$PROJECT_DIR$/scaladoc.iml" />
-      <module fileurl="file://$PROJECT_DIR$/scalap.iml" filepath="$PROJECT_DIR$/scalap.iml" />
-      <module fileurl="file://$PROJECT_DIR$/test.iml" filepath="$PROJECT_DIR$/test.iml" />
-      <module fileurl="file://$PROJECT_DIR$/test-junit.iml" filepath="$PROJECT_DIR$/test-junit.iml" />
-    </modules>
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/../../out" />
-  </component>
-  <component name="PropertiesComponent">
-    <property name="GoToClass.includeLibraries" value="false" />
-    <property name="GoToClass.toSaveIncludeLibraries" value="false" />
-    <property name="GoToFile.includeJavaFiles" value="false" />
-    <property name="MemberChooser.sorted" value="false" />
-    <property name="MemberChooser.showClasses" value="true" />
-    <property name="MemberChooser.copyJavadoc" value="false" />
-    <property name="options.lastSelected" value="configurable.group.appearance" />
-    <property name="options.splitter.main.proportions" value="0.3" />
-    <property name="options.splitter.details.proportions" value="0.2" />
-    <property name="options.searchVisible" value="true" />
-  </component>
-  <component name="RunManager">
-    <configuration default="true" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" factoryName="Plugin">
-      <module name="" />
-      <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
-      <option name="PROGRAM_PARAMETERS" />
-      <method />
-    </configuration>
-    <configuration default="true" type="Remote" factoryName="Remote">
-      <option name="USE_SOCKET_TRANSPORT" value="true" />
-      <option name="SERVER_MODE" value="false" />
-      <option name="SHMEM_ADDRESS" value="javadebug" />
-      <option name="HOST" value="localhost" />
-      <option name="PORT" value="5005" />
-      <method />
-    </configuration>
-    <configuration default="true" type="Applet" factoryName="Applet">
-      <module name="" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="HTML_FILE_NAME" />
-      <option name="HTML_USED" value="false" />
-      <option name="WIDTH" value="400" />
-      <option name="HEIGHT" value="300" />
-      <option name="POLICY_FILE" value="$CARDEA_HOME$/bin/appletviewer.policy" />
-      <option name="VM_PARAMETERS" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <method />
-    </configuration>
-    <configuration default="true" type="TestNG" factoryName="TestNG">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <module name="" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="SUITE_NAME" />
-      <option name="PACKAGE_NAME" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="METHOD_NAME" />
-      <option name="GROUP_NAME" />
-      <option name="TEST_OBJECT" value="CLASS" />
-      <option name="VM_PARAMETERS" value="-ea" />
-      <option name="PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
-      <option name="OUTPUT_DIRECTORY" />
-      <option name="ANNOTATION_TYPE" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <option name="TEST_SEARCH_SCOPE">
-        <value defaultName="moduleWithDependencies" />
-      </option>
-      <option name="USE_DEFAULT_REPORTERS" value="false" />
-      <option name="PROPERTIES_FILE" />
-      <envs />
-      <properties />
-      <listeners />
-      <method />
-    </configuration>
-    <configuration default="true" type="Application" factoryName="Application">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="VM_PARAMETERS" />
-      <option name="PROGRAM_PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="ENABLE_SWING_INSPECTOR" value="false" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <module name="" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="JUnit" factoryName="JUnit">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <module name="" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PACKAGE_NAME" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="METHOD_NAME" />
-      <option name="TEST_OBJECT" value="class" />
-      <option name="VM_PARAMETERS" value="-ea" />
-      <option name="PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <option name="TEST_SEARCH_SCOPE">
-        <value defaultName="moduleWithDependencies" />
-      </option>
-      <envs />
-      <patterns />
-      <method />
-    </configuration>
-    <list size="0" />
-    <configuration name="<template>" type="WebApp" default="true" selected="false">
-      <Host>localhost</Host>
-      <Port>5050</Port>
-    </configuration>
-  </component>
-  <component name="ScalaCompilerConfiguration">
-    <parameters>
-      <parameter value="-sourcepath" />
-      <parameter value="$PROJECT_DIR$/../library" />
-    </parameters>
-  </component>
-  <component name="VcsContentAnnotationSettings">
-    <option name="myLimit" value="2678400000" />
-  </component>
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
-  </component>
-  <component name="VcsManagerConfiguration">
-    <option name="myTodoPanelSettings">
-      <TodoPanelSettings />
-    </option>
-  </component>
-  <component name="libraryTable">
-    <library name="ant">
-      <CLASSES>
-        <root url="jar://$PROJECT_DIR$/../../lib/ant/ant.jar!/" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-    </library>
-    <library name="junit">
-      <CLASSES>
-        <root url="file://$PROJECT_DIR$/../../build/deps/junit" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/junit" recursive="false" />
-    </library>
-    <library name="partest">
-      <CLASSES>
-        <root url="file://$PROJECT_DIR$/../../build/deps/partest" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/partest" recursive="false" />
-    </library>
-    <library name="repl-deps">
-      <CLASSES>
-        <root url="file://$PROJECT_DIR$/../../build/deps/repl" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/repl" recursive="false" />
-    </library>
-    <library name="scaladoc-deps">
-      <CLASSES>
-        <root url="file://$PROJECT_DIR$/../../build/deps/scaladoc" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/scaladoc" recursive="false" />
-    </library>
-    <library name="starr" type="Scala">
-      <properties>
-        <compiler-classpath>
-          <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-compiler-#scala-version#.jar" />
-          <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-library-#scala-version#.jar" />
-          <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-reflect-#scala-version#.jar" />
-        </compiler-classpath>
-      </properties>
-      <CLASSES>
-        <root url="jar://$PROJECT_DIR$/../../build/deps/starr/scala-library-#scala-version#.jar!/" />
-        <root url="jar://$PROJECT_DIR$/../../build/deps/starr/scala-reflect-#scala-version#.jar!/" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-    </library>
-    <library name="starr-no-deps" type="Scala">
-      <properties>
-        <compiler-classpath>
-          <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-compiler-#scala-version#.jar" />
-          <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-library-#scala-version#.jar" />
-          <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-reflect-#scala-version#.jar" />
-        </compiler-classpath>
-      </properties>
-      <CLASSES />
-      <JAVADOC />
-      <SOURCES />
-    </library>
-  </component>
-</project>
\ No newline at end of file
diff --git a/src/intellij-14/scaladoc.iml.SAMPLE b/src/intellij-14/scaladoc.iml.SAMPLE
deleted file mode 100644
index 5c7015a..0000000
--- a/src/intellij-14/scaladoc.iml.SAMPLE
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../scaladoc">
-      <sourceFolder url="file://$MODULE_DIR$/../scaladoc" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="library" name="scaladoc-deps" level="project" />
-    <orderEntry type="library" name="partest" level="project" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-    <orderEntry type="library" name="ant" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/scalap.iml.SAMPLE b/src/intellij-14/scalap.iml.SAMPLE
deleted file mode 100644
index e09b8d1..0000000
--- a/src/intellij-14/scalap.iml.SAMPLE
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../scalap">
-      <sourceFolder url="file://$MODULE_DIR$/../scalap" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/setup.sh b/src/intellij-14/setup.sh
deleted file mode 100755
index cf08898..0000000
--- a/src/intellij-14/setup.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-#
-# Generates IntelliJ IDEA project files based on the checked-in samples.
-#
-
-set -e
-export SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
-echo "About to delete .ipr and .iml files and replace with the .SAMPLE files. Press enter to continue or CTRL-C to cancel."
-read
-
-for f in "$SCRIPT_DIR"/*.SAMPLE; do
-  g=${f%.SAMPLE}
-  cp $f $g
-done
-
-SCALA_VERSION="`cat $SCRIPT_DIR/../../versions.properties | grep 'starr.version' | awk  '{split($0,a,"="); print a[2]}'`"
-sed "s/#scala-version#/$SCALA_VERSION/g" $SCRIPT_DIR/scala.ipr.SAMPLE > $SCRIPT_DIR/scala.ipr
\ No newline at end of file
diff --git a/src/intellij-14/test-junit.iml.SAMPLE b/src/intellij-14/test-junit.iml.SAMPLE
deleted file mode 100644
index 786f02e..0000000
--- a/src/intellij-14/test-junit.iml.SAMPLE
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../../test/junit">
-      <sourceFolder url="file://$MODULE_DIR$/../../test/junit" isTestSource="true" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" name="junit" level="project" />
-    <orderEntry type="library" name="scaladoc-deps" level="project" />
-    <orderEntry type="module" module-name="actors" />
-    <orderEntry type="module" module-name="asm" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="module" module-name="forkjoin" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="partest-extras" />
-    <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="repl" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/test.iml.SAMPLE b/src/intellij-14/test.iml.SAMPLE
deleted file mode 100644
index a384d72..0000000
--- a/src/intellij-14/test.iml.SAMPLE
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../../test">
-      <excludeFolder url="file://$MODULE_DIR$/../../test/junit" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="actors" />
-    <orderEntry type="module" module-name="asm" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="module" module-name="forkjoin" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="partest-extras" />
-    <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="repl" />
-    <orderEntry type="library" name="partest" level="project" />
-    <orderEntry type="library" name="scaladoc-deps" level="project" />
-    <orderEntry type="library" name="starr-no-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij-14/update.sh b/src/intellij-14/update.sh
deleted file mode 100755
index eb6fea7..0000000
--- a/src/intellij-14/update.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-#
-# Updates the .SAMPLE files with the current project files.
-#
-
-set -e
-export SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
-
-echo "About to create overwrite the .ipr.SAMPLE and .iml.SAMPLE files with the current project files. Press enter to continue or CTRL-C to cancel."
-read
-
-for f in "$SCRIPT_DIR"/*.{iml,ipr}; do
-  cp $f $f.SAMPLE
-done
-
-for f in "$SCRIPT_DIR"/*.SAMPLE; do
-  g=${f%.SAMPLE}
-  if [[ ! -f $g ]]; then
-    echo "Stale sample file, deleting $f"
-    rm $f
-  fi
-done
diff --git a/src/intellij/README b/src/intellij/README
deleted file mode 100644
index a39691f..0000000
--- a/src/intellij/README
+++ /dev/null
@@ -1,12 +0,0 @@
-Use the latest IntelliJ IDEA release and install the Scala plugin from within the IDE.
-
-Compilation withing IDEA is performed in "-Dlocker.skip=1" mode: the sources are built
-directly using the STARR compiler.
-
-The following steps are required to use IntelliJ IDEA on Scala trunk
- - Run "ant init". This will download some JARs from to ./build/deps, which are
-   included in IntelliJ's classpath.
- - Run src/intellij/setup.sh
- - Open ./src/intellij/scala-lang.ipr in IntelliJ
- - File, Project Settings, Project, SDK. Create an SDK entry named "1.6" containing the
-   java 1.6 SDK
diff --git a/src/intellij/README.md b/src/intellij/README.md
new file mode 100644
index 0000000..64e7b81
--- /dev/null
+++ b/src/intellij/README.md
@@ -0,0 +1,13 @@
+Use the latest IntelliJ IDEA release and install the Scala plugin from within the IDE.
+
+Compilation withing IDEA is performed in "-Dlocker.skip=1" mode: the sources are built
+directly using the STARR compiler.
+
+The following steps are required to use IntelliJ IDEA on Scala trunk
+ - Run `ant init`. This will download some JARs to `./build/deps`, which are included in IntelliJ's classpath.
+ - Run `./src/intellij/setup.sh`.
+ - Open `./src/intellij/scala.ipr` in IntelliJ.
+ - `File` → `Project Structure` → `Project` → `Project SDK`. Create an SDK entry named "1.6" containing the Java 1.6 SDK. (Or other SDK version; see "Requirements" in the repo's main README.)
+
+Compilation within IDEA is performed in `-Dlocker.skip=1` mode: the sources are built
+directly using the STARR compiler (which is downloaded from [the Central Repository](http://central.sonatype.org/), according to `starr.version` in `versions.properties`).
diff --git a/src/intellij/actors.iml.SAMPLE b/src/intellij/actors.iml.SAMPLE
index b15af8b..dfdf396 100644
--- a/src/intellij/actors.iml.SAMPLE
+++ b/src/intellij/actors.iml.SAMPLE
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="languageLevel" value="Scala 2.11" />
-        <option name="maximumHeapSize" value="1536" />
-        <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../actors">
@@ -20,6 +9,6 @@
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="library" />
     <orderEntry type="module" module-name="forkjoin" />
+    <orderEntry type="library" name="starr" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/asm.iml.SAMPLE b/src/intellij/asm.iml.SAMPLE
index ba9e7e8..9886154 100644
--- a/src/intellij/asm.iml.SAMPLE
+++ b/src/intellij/asm.iml.SAMPLE
@@ -8,5 +8,4 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/compiler.iml.SAMPLE b/src/intellij/compiler.iml.SAMPLE
index 5025300..0e12192 100644
--- a/src/intellij/compiler.iml.SAMPLE
+++ b/src/intellij/compiler.iml.SAMPLE
@@ -1,27 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="languageLevel" value="Scala 2.11" />
-        <option name="maximumHeapSize" value="1536" />
-        <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../compiler">
+      <sourceFolder url="file://$MODULE_DIR$/../compiler/src" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/../compiler" isTestSource="false" />
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="library" />
     <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="asm" />
+    <orderEntry type="library" name="starr" level="project" />
     <orderEntry type="library" name="ant" level="project" />
+    <orderEntry type="library" name="asm" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/forkjoin.iml.SAMPLE b/src/intellij/forkjoin.iml.SAMPLE
index be807cc..42507b2 100644
--- a/src/intellij/forkjoin.iml.SAMPLE
+++ b/src/intellij/forkjoin.iml.SAMPLE
@@ -8,5 +8,4 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/interactive.iml.SAMPLE b/src/intellij/interactive.iml.SAMPLE
index 8317802..267bd3f 100644
--- a/src/intellij/interactive.iml.SAMPLE
+++ b/src/intellij/interactive.iml.SAMPLE
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="languageLevel" value="Scala 2.11" />
-        <option name="maximumHeapSize" value="1536" />
-        <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../interactive">
@@ -18,10 +7,10 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="compiler" />
     <orderEntry type="module" module-name="library" />
     <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="module" module-name="scaladoc" />
+    <orderEntry type="library" name="starr" level="project" />
+    <orderEntry type="library" name="asm" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/library.iml.SAMPLE b/src/intellij/library.iml.SAMPLE
index 137ce6e..b03fef9 100644
--- a/src/intellij/library.iml.SAMPLE
+++ b/src/intellij/library.iml.SAMPLE
@@ -1,25 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="compilerOptions" value="-sourcepath $MODULE_DIR$/../library" />
-        <option name="languageLevel" value="Scala 2.11" />
-        <option name="maximumHeapSize" value="1536" />
-        <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../library">
+      <sourceFolder url="file://$MODULE_DIR$/../library/src" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/../library" isTestSource="false" />
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="forkjoin" />
+    <orderEntry type="library" name="starr" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/manual.iml.SAMPLE b/src/intellij/manual.iml.SAMPLE
index 8babde7..97bfb59 100644
--- a/src/intellij/manual.iml.SAMPLE
+++ b/src/intellij/manual.iml.SAMPLE
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="languageLevel" value="Scala 2.11" />
-        <option name="maximumHeapSize" value="1536" />
-        <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../manual">
@@ -19,8 +8,8 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="library" />
-    <orderEntry type="library" name="ant" level="project" />
     <orderEntry type="library" name="scaladoc-deps" level="project" />
+    <orderEntry type="library" name="ant" level="project" />
+    <orderEntry type="library" name="starr" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/partest-extras.iml.SAMPLE b/src/intellij/partest-extras.iml.SAMPLE
index c2ada43..1cd7121 100644
--- a/src/intellij/partest-extras.iml.SAMPLE
+++ b/src/intellij/partest-extras.iml.SAMPLE
@@ -1,14 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="languageLevel" value="Scala 2.11" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../partest-extras">
@@ -16,12 +7,12 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="asm" />
+    <orderEntry type="module" module-name="compiler" />
     <orderEntry type="module" module-name="library" />
     <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="compiler" />
     <orderEntry type="module" module-name="repl" />
     <orderEntry type="library" name="partest" level="project" />
+    <orderEntry type="library" name="starr" level="project" />
+    <orderEntry type="library" name="asm" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/partest-javaagent.iml.SAMPLE b/src/intellij/partest-javaagent.iml.SAMPLE
index e47e0f6..ffc540c 100644
--- a/src/intellij/partest-javaagent.iml.SAMPLE
+++ b/src/intellij/partest-javaagent.iml.SAMPLE
@@ -7,7 +7,6 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="asm" />
+    <orderEntry type="library" name="asm" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/reflect.iml.SAMPLE b/src/intellij/reflect.iml.SAMPLE
index d206304..c9b7130 100644
--- a/src/intellij/reflect.iml.SAMPLE
+++ b/src/intellij/reflect.iml.SAMPLE
@@ -1,17 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="compilerOptions" value="-sourcepath $MODULE_DIR$/../reflect" />
-        <option name="languageLevel" value="Scala 2.11" />
-        <option name="maximumHeapSize" value="1536" />
-        <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../reflect">
@@ -20,6 +8,6 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="library" />
+    <orderEntry type="library" name="starr" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/repl.iml.SAMPLE b/src/intellij/repl.iml.SAMPLE
index 83791f4..e827a2c 100644
--- a/src/intellij/repl.iml.SAMPLE
+++ b/src/intellij/repl.iml.SAMPLE
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="languageLevel" value="Scala 2.11" />
-        <option name="maximumHeapSize" value="1536" />
-        <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../repl">
@@ -18,10 +7,12 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="compiler" />
     <orderEntry type="module" module-name="library" />
     <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="compiler" />
+    <orderEntry type="module" module-name="interactive" />
+    <orderEntry type="library" name="starr" level="project" />
     <orderEntry type="library" name="repl-deps" level="project" />
+    <orderEntry type="library" name="asm" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/scala-build.iml.SAMPLE b/src/intellij/scala-build.iml.SAMPLE
new file mode 100644
index 0000000..0232e9e
--- /dev/null
+++ b/src/intellij/scala-build.iml.SAMPLE
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id="scalaz-build" external.linked.project.path="$MODULE_DIR$/../../project" external.root.project.path="$MODULE_DIR$/../.." external.system.id="SBT" sbt.imports="sbt._, Keys._, dsl._, _root_.com.typesafe.sbt.SbtPgp.autoImport._, _root_.sbt.plugins.IvyPlugin, _root_.sbt.plugins.JvmPlugin, _root_.sbt.plugins.CorePlugin, _root_.sbt.plugins.JUnitXmlReportPlugin, _root_.com.typesafe.sbt.SbtPgp" sbt.resolvers="https://repo1.maven.org/maven2/|maven|public, /Users [...]
+  <component name="NewModuleRootManager" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/../../project/target/idea-classes" />
+    <output-test url="file://$MODULE_DIR$/../../project/target/idea-test-classes" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$/../../project">
+      <sourceFolder url="file://$MODULE_DIR$/../../project" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/../../project/project/target" />
+      <excludeFolder url="file://$MODULE_DIR$/../../project/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module-library">
+      <library name="SBT: sbt-and-plugins">
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.3.2.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.pantsbuild/jarjar/jars/jarjar-1.6.0.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.apache.ant/ant/jars/ant-1.9.6.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.apache.ant/ant-launcher/jars/ant-launcher-1.9.6.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.ow2.asm/asm/jars/asm-5.0.4.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.ow2.asm/asm-commons/jars/asm-commons-5.0.4.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.ow2.asm/asm-tree/jars/asm-tree-5.0.4.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.apache.maven/maven-plugin-api/jars/maven-plugin-api-3.3.3.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.apache.maven/maven-model/jars/maven-model-3.3.3.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.codehaus.plexus/plexus-utils/jars/plexus-utils-3.0.20.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.apache.maven/maven-artifact/jars/maven-artifact-3.3.3.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.eclipse.sisu/org.eclipse.sisu.plexus/eclipse-plugins/org.eclipse.sisu.plexus-0.3.0.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/javax.enterprise/cdi-api/jars/cdi-api-1.0.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/javax.annotation/jsr250-api/jars/jsr250-api-1.0.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/javax.inject/javax.inject/jars/javax.inject-1.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.eclipse.sisu/org.eclipse.sisu.inject/eclipse-plugins/org.eclipse.sisu.inject-0.3.0.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.codehaus.plexus/plexus-component-annotations/jars/plexus-component-annotations-1.5.5.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.codehaus.plexus/plexus-classworlds/bundles/plexus-classworlds-2.5.2.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/biz.aQute.bnd/biz.aQute.bnd/jars/biz.aQute.bnd-2.4.1.jar!/" />
+          <root url="jar://$USER_HOME$/.sbt/boot/scala-2.10.5/lib/scala-library.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/sbt/jars/sbt-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/main/jars/main-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/actions/jars/actions-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/classpath/jars/classpath-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.sbt/boot/scala-2.10.5/lib/scala-compiler.jar!/" />
+          <root url="jar://$USER_HOME$/.sbt/boot/scala-2.10.5/lib/scala-reflect.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/interface/jars/interface-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/io/jars/io-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/control/jars/control-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/launcher-interface/jars/launcher-interface-1.0.0-M1.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/completion/jars/completion-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/collections/jars/collections-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/jline/jline/jars/jline-2.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/api/jars/api-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/compiler-integration/jars/compiler-integration-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/incremental-compiler/jars/incremental-compiler-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/logging/jars/logging-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/process/jars/process-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/relation/jars/relation-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/compile/jars/compile-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/classfile/jars/classfile-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/persist/jars/persist-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-tools.sbinary/sbinary_2.10/jars/sbinary_2.10-0.4.2.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/compiler-ivy-integration/jars/compiler-ivy-integration-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/ivy/jars/ivy-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/cross/jars/cross-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt.ivy/ivy/jars/ivy-2.3.0-sbt-c5d1b95fdcc1e1007740ffbecf4eb07abc51ec93.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/com.jcraft/jsch/jars/jsch-0.1.46.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/serialization_2.10/jars/serialization_2.10-0.1.1.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-lang.modules/scala-pickling_2.10/jars/scala-pickling_2.10-0.10.0.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scalamacros/quasiquotes_2.10/jars/quasiquotes_2.10-2.0.1.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.json4s/json4s-core_2.10/jars/json4s-core_2.10-3.2.10.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.json4s/json4s-ast_2.10/jars/json4s-ast_2.10-3.2.10.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/com.thoughtworks.paranamer/paranamer/jars/paranamer-2.6.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.spire-math/jawn-parser_2.10/jars/jawn-parser_2.10-0.6.0.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.spire-math/json4s-support_2.10/jars/json4s-support_2.10-0.6.0.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/run/jars/run-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/task-system/jars/task-system-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/tasks/jars/tasks-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/tracking/jars/tracking-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/cache/jars/cache-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/testing/jars/testing-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/test-agent/jars/test-agent-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/test-interface/jars/test-interface-1.0.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/main-settings/jars/main-settings-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/apply-macro/jars/apply-macro-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/command/jars/command-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/logic/jars/logic-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/compiler-interface/jars/compiler-interface-bin-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/compiler-interface/jars/compiler-interface-src-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/precompiled-2_8_2/jars/compiler-interface-bin-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/precompiled-2_9_2/jars/compiler-interface-bin-0.13.11.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/precompiled-2_9_3/jars/compiler-interface-bin-0.13.11.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES>
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/main/srcs/main-0.13.11-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-lang/scala-library/srcs/scala-library-2.10.5-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-lang/scala-reflect/srcs/scala-reflect-2.10.5-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-lang/scala-compiler/srcs/scala-compiler-2.10.5-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/actions/srcs/actions-0.13.11-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/sbt/srcs/sbt-0.13.11-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/run/srcs/run-0.13.11-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/test-interface/srcs/test-interface-1.0-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/testing/srcs/testing-0.13.11-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/tasks/srcs/tasks-0.13.11-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/ivy/srcs/ivy-0.13.11-sources.jar!/" />
+          <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-sbt/completion/srcs/completion-0.13.11-sources.jar!/" />
+        </SOURCES>
+      </library>
+    </orderEntry>
+  </component>
+</module>
diff --git a/src/intellij/scala-lang.ipr.SAMPLE b/src/intellij/scala-lang.ipr.SAMPLE
deleted file mode 100644
index 0cd3fda..0000000
--- a/src/intellij/scala-lang.ipr.SAMPLE
+++ /dev/null
@@ -1,287 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="CompilerConfiguration">
-    <option name="DEFAULT_COMPILER" value="Javac" />
-    <resourceExtensions>
-      <entry name=".+\.(properties|xml|html|dtd|tld)" />
-      <entry name=".+\.(gif|png|jpeg|jpg)" />
-    </resourceExtensions>
-    <wildcardResourcePatterns>
-      <entry name="?*.properties" />
-      <entry name="?*.xml" />
-      <entry name="?*.gif" />
-      <entry name="?*.png" />
-      <entry name="?*.jpeg" />
-      <entry name="?*.jpg" />
-      <entry name="?*.html" />
-      <entry name="?*.dtd" />
-      <entry name="?*.tld" />
-      <entry name="?*.ftl" />
-    </wildcardResourcePatterns>
-    <annotationProcessing>
-      <profile default="true" name="Default" enabled="false">
-        <processorPath useClasspath="true" />
-      </profile>
-    </annotationProcessing>
-  </component>
-  <component name="CopyrightManager" default="" />
-  <component name="DependencyValidationManager">
-    <option name="SKIP_IMPORT_STATEMENTS" value="false" />
-  </component>
-  <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
-  <component name="EntryPointsManager">
-    <entry_points version="2.0" />
-  </component>
-  <component name="HighlightingAdvisor">
-    <option name="SUGGEST_TYPE_AWARE_HIGHLIGHTING" value="false" />
-  </component>
-  <component name="InspectionProjectProfileManager">
-    <profiles>
-      <profile version="1.0" is_locked="false">
-        <option name="myName" value="Project Default" />
-        <option name="myLocal" value="false" />
-        <inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
-          <option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
-          <option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
-        </inspection_tool>
-        <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
-          <option name="processCode" value="true" />
-          <option name="processLiterals" value="true" />
-          <option name="processComments" value="true" />
-        </inspection_tool>
-        <inspection_tool class="UnitMethodIsParameterless" enabled="false" level="WARNING" enabled_by_default="false" />
-      </profile>
-    </profiles>
-    <option name="PROJECT_PROFILE" value="Project Default" />
-    <option name="USE_PROJECT_PROFILE" value="true" />
-    <version value="1.0" />
-  </component>
-  <component name="JavacSettings">
-    <option name="ADDITIONAL_OPTIONS_STRING" value="-source 1.6 -target 1.6" />
-  </component>
-  <component name="JavadocGenerationManager">
-    <option name="OUTPUT_DIRECTORY" />
-    <option name="OPTION_SCOPE" value="protected" />
-    <option name="OPTION_HIERARCHY" value="true" />
-    <option name="OPTION_NAVIGATOR" value="true" />
-    <option name="OPTION_INDEX" value="true" />
-    <option name="OPTION_SEPARATE_INDEX" value="true" />
-    <option name="OPTION_DOCUMENT_TAG_USE" value="false" />
-    <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false" />
-    <option name="OPTION_DOCUMENT_TAG_VERSION" value="false" />
-    <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="true" />
-    <option name="OPTION_DEPRECATED_LIST" value="true" />
-    <option name="OTHER_OPTIONS" value="" />
-    <option name="HEAP_SIZE" />
-    <option name="LOCALE" />
-    <option name="OPEN_IN_BROWSER" value="true" />
-  </component>
-  <component name="Palette2">
-    <group name="Swing">
-      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
-      </item>
-      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
-      </item>
-      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
-      </item>
-      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
-        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
-      </item>
-      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
-        <initial-values>
-          <property name="text" value="Button" />
-        </initial-values>
-      </item>
-      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
-        <initial-values>
-          <property name="text" value="RadioButton" />
-        </initial-values>
-      </item>
-      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
-        <initial-values>
-          <property name="text" value="CheckBox" />
-        </initial-values>
-      </item>
-      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
-        <initial-values>
-          <property name="text" value="Label" />
-        </initial-values>
-      </item>
-      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
-          <preferred-size width="150" height="-1" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
-          <preferred-size width="150" height="-1" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
-          <preferred-size width="150" height="-1" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
-      </item>
-      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
-          <preferred-size width="200" height="200" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
-          <preferred-size width="200" height="200" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
-      </item>
-      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
-      </item>
-      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
-      </item>
-      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
-      </item>
-      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
-          <preferred-size width="-1" height="20" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
-      </item>
-      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
-      </item>
-    </group>
-  </component>
-  <component name="ProjectDictionaryState">
-    <dictionary name="luc" />
-  </component>
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/actors.iml" filepath="$PROJECT_DIR$/actors.iml" />
-      <module fileurl="file://$PROJECT_DIR$/asm.iml" filepath="$PROJECT_DIR$/asm.iml" />
-      <module fileurl="file://$PROJECT_DIR$/compiler.iml" filepath="$PROJECT_DIR$/compiler.iml" />
-      <module fileurl="file://$PROJECT_DIR$/forkjoin.iml" filepath="$PROJECT_DIR$/forkjoin.iml" />
-      <module fileurl="file://$PROJECT_DIR$/interactive.iml" filepath="$PROJECT_DIR$/interactive.iml" />
-      <module fileurl="file://$PROJECT_DIR$/library.iml" filepath="$PROJECT_DIR$/library.iml" />
-      <module fileurl="file://$PROJECT_DIR$/manual.iml" filepath="$PROJECT_DIR$/manual.iml" />
-      <module fileurl="file://$PROJECT_DIR$/partest-extras.iml" filepath="$PROJECT_DIR$/partest-extras.iml" />
-      <module fileurl="file://$PROJECT_DIR$/partest-javaagent.iml" filepath="$PROJECT_DIR$/partest-javaagent.iml" />
-      <module fileurl="file://$PROJECT_DIR$/reflect.iml" filepath="$PROJECT_DIR$/reflect.iml" />
-      <module fileurl="file://$PROJECT_DIR$/repl.iml" filepath="$PROJECT_DIR$/repl.iml" />
-      <module fileurl="file://$PROJECT_DIR$/scala.iml" filepath="$PROJECT_DIR$/scala.iml" />
-      <module fileurl="file://$PROJECT_DIR$/scaladoc.iml" filepath="$PROJECT_DIR$/scaladoc.iml" />
-      <module fileurl="file://$PROJECT_DIR$/scalap.iml" filepath="$PROJECT_DIR$/scalap.iml" />
-      <module fileurl="file://$PROJECT_DIR$/test.iml" filepath="$PROJECT_DIR$/test.iml" />
-      <module fileurl="file://$PROJECT_DIR$/test-junit.iml" filepath="$PROJECT_DIR$/test-junit.iml" />
-      <module fileurl="file://$PROJECT_DIR$/test-osgi.iml" filepath="$PROJECT_DIR$/test-osgi.iml" />
-    </modules>
-  </component>
-  <component name="ProjectResources">
-    <default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/../../out" />
-  </component>
-  <component name="ScalacSettings">
-    <option name="COMPILER_LIBRARY_NAME" value="compiler-locker" />
-    <option name="COMPILER_LIBRARY_LEVEL" value="Project" />
-  </component>
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
-  </component>
-  <component name="libraryTable">
-    <library name="ant">
-      <CLASSES>
-        <root url="jar://$PROJECT_DIR$/../../lib/ant/ant.jar!/" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-    </library>
-    <library name="junit">
-      <CLASSES>
-        <root url="file://$PROJECT_DIR$/../../build/deps/junit" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/junit" recursive="false" />
-    </library>
-    <library name="partest">
-      <CLASSES>
-        <root url="file://$PROJECT_DIR$/../../build/deps/partest" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/partest" recursive="false" />
-    </library>
-    <library name="repl-deps">
-      <CLASSES>
-        <root url="file://$PROJECT_DIR$/../../build/deps/repl" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/repl" recursive="false" />
-    </library>
-    <library name="scaladoc-deps">
-      <CLASSES>
-        <root url="file://$PROJECT_DIR$/../../build/deps/scaladoc" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/scaladoc" recursive="false" />
-    </library>
-    <library name="starr">
-      <CLASSES>
-        <root url="file://$PROJECT_DIR$/../../build/deps/starr" />
-      </CLASSES>
-      <JAVADOC />
-      <SOURCES />
-      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/starr" recursive="false" />
-    </library>
-  </component>
-</project>
-
diff --git a/src/intellij/scala.iml.SAMPLE b/src/intellij/scala.iml.SAMPLE
index a4d8638..9e8718d 100644
--- a/src/intellij/scala.iml.SAMPLE
+++ b/src/intellij/scala.iml.SAMPLE
@@ -8,5 +8,4 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/scala.ipr.SAMPLE b/src/intellij/scala.ipr.SAMPLE
new file mode 100644
index 0000000..420f559
--- /dev/null
+++ b/src/intellij/scala.ipr.SAMPLE
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <option name="DEFAULT_COMPILER" value="Javac" />
+    <resourceExtensions />
+    <wildcardResourcePatterns>
+      <entry name="!?*.java" />
+      <entry name="!?*.form" />
+      <entry name="!?*.class" />
+      <entry name="!?*.groovy" />
+      <entry name="!?*.scala" />
+      <entry name="!?*.flex" />
+      <entry name="!?*.kt" />
+      <entry name="!?*.clj" />
+    </wildcardResourcePatterns>
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="false">
+        <processorPath useClasspath="true" />
+      </profile>
+    </annotationProcessing>
+  </component>
+  <component name="CopyrightManager" default="" />
+  <component name="EntryPointsManager">
+    <entry_points version="2.0" />
+  </component>
+  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
+    <OptionsSetting value="true" id="Add" />
+    <OptionsSetting value="true" id="Remove" />
+    <OptionsSetting value="true" id="Checkout" />
+    <OptionsSetting value="true" id="Update" />
+    <OptionsSetting value="true" id="Status" />
+    <OptionsSetting value="true" id="Edit" />
+    <ConfirmationsSetting value="0" id="Add" />
+    <ConfirmationsSetting value="0" id="Remove" />
+  </component>
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/actors.iml" filepath="$PROJECT_DIR$/actors.iml" />
+      <module fileurl="file://$PROJECT_DIR$/compiler.iml" filepath="$PROJECT_DIR$/compiler.iml" />
+      <module fileurl="file://$PROJECT_DIR$/forkjoin.iml" filepath="$PROJECT_DIR$/forkjoin.iml" />
+      <module fileurl="file://$PROJECT_DIR$/interactive.iml" filepath="$PROJECT_DIR$/interactive.iml" />
+      <module fileurl="file://$PROJECT_DIR$/library.iml" filepath="$PROJECT_DIR$/library.iml" />
+      <module fileurl="file://$PROJECT_DIR$/manual.iml" filepath="$PROJECT_DIR$/manual.iml" />
+      <module fileurl="file://$PROJECT_DIR$/partest-extras.iml" filepath="$PROJECT_DIR$/partest-extras.iml" />
+      <module fileurl="file://$PROJECT_DIR$/partest-javaagent.iml" filepath="$PROJECT_DIR$/partest-javaagent.iml" />
+      <module fileurl="file://$PROJECT_DIR$/reflect.iml" filepath="$PROJECT_DIR$/reflect.iml" />
+      <module fileurl="file://$PROJECT_DIR$/repl.iml" filepath="$PROJECT_DIR$/repl.iml" />
+      <module fileurl="file://$PROJECT_DIR$/scala.iml" filepath="$PROJECT_DIR$/scala.iml" />
+      <module fileurl="file://$PROJECT_DIR$/scala-build.iml" filepath="$PROJECT_DIR$/scala-build.iml" />
+      <module fileurl="file://$PROJECT_DIR$/scaladoc.iml" filepath="$PROJECT_DIR$/scaladoc.iml" />
+      <module fileurl="file://$PROJECT_DIR$/scalap.iml" filepath="$PROJECT_DIR$/scalap.iml" />
+      <module fileurl="file://$PROJECT_DIR$/test.iml" filepath="$PROJECT_DIR$/test.iml" />
+      <module fileurl="file://$PROJECT_DIR$/test-junit.iml" filepath="$PROJECT_DIR$/test-junit.iml" />
+    </modules>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/../../out" />
+  </component>
+  <component name="ScalaCompilerConfiguration">
+    <parameters>
+      <parameter value="-sourcepath" />
+      <parameter value="$PROJECT_DIR$/../library" />
+    </parameters>
+  </component>
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
+  </component>
+  <component name="libraryTable">
+    <library name="ant">
+      <CLASSES>
+        <root url="jar://$PROJECT_DIR$/../../lib/ant/ant.jar!/" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES />
+    </library>
+    <library name="asm">
+      <CLASSES>
+        <root url="file://$PROJECT_DIR$/../../build/deps/asm" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES />
+      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/asm" recursive="false" />
+    </library>
+    <library name="junit">
+      <CLASSES>
+        <root url="file://$PROJECT_DIR$/../../build/deps/junit" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES />
+      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/junit" recursive="false" />
+    </library>
+    <library name="partest">
+      <CLASSES>
+        <root url="file://$PROJECT_DIR$/../../build/deps/partest" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES />
+      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/partest" recursive="false" />
+    </library>
+    <library name="repl-deps">
+      <CLASSES>
+        <root url="file://$PROJECT_DIR$/../../build/deps/repl" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES />
+      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/repl" recursive="false" />
+    </library>
+    <library name="scaladoc-deps">
+      <CLASSES>
+        <root url="file://$PROJECT_DIR$/../../build/deps/scaladoc" />
+      </CLASSES>
+      <JAVADOC />
+      <SOURCES />
+      <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/scaladoc" recursive="false" />
+    </library>
+    <library name="starr" type="Scala">
+      <properties>
+        <compiler-classpath>
+          <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-compiler-#starr-version#.jar" />
+          <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-library-#starr-version#.jar" />
+          <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-reflect-#starr-version#.jar" />
+        </compiler-classpath>
+      </properties>
+      <CLASSES />
+      <JAVADOC />
+      <SOURCES />
+    </library>
+  </component>
+</project>
diff --git a/src/intellij/scaladoc.iml.SAMPLE b/src/intellij/scaladoc.iml.SAMPLE
index 8f9a0d8..6e6d98b 100644
--- a/src/intellij/scaladoc.iml.SAMPLE
+++ b/src/intellij/scaladoc.iml.SAMPLE
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="languageLevel" value="Scala 2.11" />
-        <option name="maximumHeapSize" value="1536" />
-        <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../scaladoc">
@@ -18,11 +7,13 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="compiler" />
     <orderEntry type="module" module-name="library" />
     <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="library" name="partest" level="project" />
+    <orderEntry type="library" name="starr" level="project" />
     <orderEntry type="library" name="scaladoc-deps" level="project" />
+    <orderEntry type="library" name="ant" level="project" />
+    <orderEntry type="library" name="partest" level="project" />
+    <orderEntry type="library" name="asm" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/scalap.iml.SAMPLE b/src/intellij/scalap.iml.SAMPLE
index 27ae451..665aac0 100644
--- a/src/intellij/scalap.iml.SAMPLE
+++ b/src/intellij/scalap.iml.SAMPLE
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="languageLevel" value="Scala 2.11" />
-        <option name="maximumHeapSize" value="1536" />
-        <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../scalap">
@@ -19,8 +8,8 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="reflect" />
     <orderEntry type="module" module-name="compiler" />
+    <orderEntry type="module" module-name="reflect" />
+    <orderEntry type="library" name="starr" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/setup.sh b/src/intellij/setup.sh
index ec30377..251f717 100755
--- a/src/intellij/setup.sh
+++ b/src/intellij/setup.sh
@@ -12,3 +12,6 @@ for f in "$SCRIPT_DIR"/*.SAMPLE; do
   g=${f%.SAMPLE}
   cp $f $g
 done
+
+STARR_VERSION="`cat $SCRIPT_DIR/../../versions.properties | grep 'starr.version' | awk  '{split($0,a,"="); print a[2]}'`"
+sed "s/#starr-version#/$STARR_VERSION/g" $SCRIPT_DIR/scala.ipr.SAMPLE > $SCRIPT_DIR/scala.ipr
diff --git a/src/intellij/test-junit.iml.SAMPLE b/src/intellij/test-junit.iml.SAMPLE
index bb51c30..86dc39c 100644
--- a/src/intellij/test-junit.iml.SAMPLE
+++ b/src/intellij/test-junit.iml.SAMPLE
@@ -1,13 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../../test/junit">
@@ -16,15 +8,16 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="actors" />
-    <orderEntry type="module" module-name="asm" />
     <orderEntry type="module" module-name="compiler" />
+    <orderEntry type="module" module-name="forkjoin" />
     <orderEntry type="module" module-name="library" />
+    <orderEntry type="module" module-name="partest-extras" />
     <orderEntry type="module" module-name="reflect" />
     <orderEntry type="module" module-name="repl" />
-    <orderEntry type="module" module-name="partest-extras" />
-    <orderEntry type="module" module-name="forkjoin" />
-    <orderEntry type="library" name="junit" level="project" />
+    <orderEntry type="module" module-name="scaladoc" />
     <orderEntry type="library" name="scaladoc-deps" level="project" />
+    <orderEntry type="library" name="junit" level="project" />
+    <orderEntry type="library" name="starr" level="project" />
+    <orderEntry type="library" name="asm" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/test-osgi.iml.SAMPLE b/src/intellij/test-osgi.iml.SAMPLE
deleted file mode 100644
index a589aaa..0000000
--- a/src/intellij/test-osgi.iml.SAMPLE
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../../test/osgi">
-      <sourceFolder url="file://$MODULE_DIR$/../../test/osgi/src" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="actors" />
-    <orderEntry type="module" module-name="asm" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="repl" />
-    <orderEntry type="module" module-name="partest-extras" />
-    <orderEntry type="module" module-name="forkjoin" />
-    <orderEntry type="library" name="junit" level="project" />
-    <orderEntry type="library" name="scaladoc-deps" level="project" />
-    <orderEntry type="library" name="scala-sdk" level="project" />
-    <orderEntry type="library" scope="PROVIDED" name="pax.exam-deps" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/src/intellij/test.iml.SAMPLE b/src/intellij/test.iml.SAMPLE
index cb4a856..5047967 100644
--- a/src/intellij/test.iml.SAMPLE
+++ b/src/intellij/test.iml.SAMPLE
@@ -1,14 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="scala" name="Scala">
-      <configuration>
-        <option name="compilerLibraryLevel" value="Project" />
-        <option name="compilerLibraryName" value="starr" />
-        <option name="languageLevel" value="Scala 2.11" />
-      </configuration>
-    </facet>
-  </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
     <content url="file://$MODULE_DIR$/../../test">
@@ -16,16 +7,16 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="library" />
-    <orderEntry type="module" module-name="reflect" />
-    <orderEntry type="module" module-name="compiler" />
-    <orderEntry type="module" module-name="repl" />
     <orderEntry type="module" module-name="actors" />
-    <orderEntry type="module" module-name="asm" />
+    <orderEntry type="module" module-name="compiler" />
     <orderEntry type="module" module-name="forkjoin" />
+    <orderEntry type="module" module-name="interactive" />
+    <orderEntry type="module" module-name="library" />
     <orderEntry type="module" module-name="partest-extras" />
-    <orderEntry type="library" name="scaladoc-deps" level="project" />
+    <orderEntry type="module" module-name="reflect" />
+    <orderEntry type="module" module-name="repl" />
     <orderEntry type="library" name="partest" level="project" />
+    <orderEntry type="library" name="scaladoc-deps" level="project" />
+    <orderEntry type="library" name="asm" level="project" />
   </component>
-</module>
-
+</module>
\ No newline at end of file
diff --git a/src/intellij/test/files/pos/virtpatmat_exhaust_big.scala b/src/intellij/test/files/pos/virtpatmat_exhaust_big.scala
deleted file mode 100644
index 41aef32..0000000
--- a/src/intellij/test/files/pos/virtpatmat_exhaust_big.scala
+++ /dev/null
@@ -1,34 +0,0 @@
-sealed abstract class Z
-object Z {
-   object     Z0    extends Z
-   case class Z1()  extends Z
-   object     Z2    extends Z
-   case class Z3()  extends Z
-   object     Z4    extends Z
-   case class Z5()  extends Z
-   object     Z6    extends Z
-   case class Z7()  extends Z
-   object     Z8    extends Z
-   case class Z9()  extends Z
-   object     Z10   extends Z
-   case class Z11() extends Z
-   object     Z12   extends Z
-   case class Z13() extends Z
-   object     Z14   extends Z
-   case class Z15() extends Z
-   object     Z16   extends Z
-   case class Z17() extends Z
-   object     Z18   extends Z
-   case class Z19() extends Z
-}
-
-// drop any case and it will report an error
-object Test {
-  import Z._
-  def foo(z: Z) = z match {
-    case Z0  | Z1()  | Z2  | Z3()  | Z4  | Z5()  | Z6  | Z7()  | Z8  | Z9() |
-         Z10 | Z11() | Z12 | Z13() | Z14 | Z15() | Z16 | Z17() | Z18 | Z19()
-         =>
-  }
-}
-- 
diff --git a/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala b/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala
index 2e4f6b0..586f011 100644
--- a/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala
+++ b/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala
@@ -268,10 +268,12 @@ trait CompilerControl { self: Global =>
   /** Info given for every member found by completion
    */
   abstract class Member {
+    def prefix: Type
     val sym: Symbol
     val tpe: Type
     val accessible: Boolean
     def implicitlyAdded = false
+    def symNameDropLocal: Name = sym.name.dropLocal
 
     private def accessible_s = if (accessible) "" else "[inaccessible] "
     def forceInfoString = {
@@ -288,6 +290,8 @@ trait CompilerControl { self: Global =>
     accessible: Boolean,
     inherited: Boolean,
     viaView: Symbol) extends Member {
+    // should be a case class parameter, but added as a var instead to preserve compatibility with the IDE
+    var prefix: Type = NoType
     override def implicitlyAdded = viaView != NoSymbol
   }
 
@@ -295,14 +299,17 @@ trait CompilerControl { self: Global =>
     sym: Symbol,
     tpe: Type,
     accessible: Boolean,
-    viaImport: Tree) extends Member
+    viaImport: Tree) extends Member {
+    // should be a case class parameter, but added as a var instead to preserve compatibility with the IDE
+    var prefix: Type = NoType
+  }
 
   // items that get sent to scheduler
 
   abstract class WorkItem extends (() => Unit) {
     val onCompilerThread = self.onCompilerThread
 
-    /** Raise a MissingReponse, if the work item carries a response. */
+    /** Raise a MissingResponse, if the work item carries a response. */
     def raiseMissing(): Unit
   }
 
diff --git a/src/interactive/scala/tools/nsc/interactive/Global.scala b/src/interactive/scala/tools/nsc/interactive/Global.scala
index 2d09435..27a02c4 100644
--- a/src/interactive/scala/tools/nsc/interactive/Global.scala
+++ b/src/interactive/scala/tools/nsc/interactive/Global.scala
@@ -19,6 +19,7 @@ import scala.annotation.{ elidable, tailrec }
 import scala.language.implicitConversions
 import scala.tools.nsc.typechecker.Typers
 import scala.util.control.Breaks._
+import scala.reflect.internal.Chars.isIdentifierStart
 
 /**
  * This trait allows the IDE to have an instance of the PC that
@@ -79,7 +80,7 @@ trait InteractiveAnalyzer extends Analyzer {
         val existingDerivedSym = owningInfo.decl(sym.name.toTermName).filter(sym => sym.isSynthetic && sym.isMethod)
         existingDerivedSym.alternatives foreach (owningInfo.decls.unlink)
         val defTree = tree match {
-          case dd: DocDef => dd.definition // See SI-9011, Scala IDE's presentation compiler incorporates ScalaDocGlobal with InterativeGlobal, so we have to unwrap DocDefs.
+          case dd: DocDef => dd.definition // See SI-9011, Scala IDE's presentation compiler incorporates ScaladocGlobal with InteractiveGlobal, so we have to unwrap DocDefs.
           case _ => tree
         }
         enterImplicitWrapper(defTree.asInstanceOf[ClassDef])
@@ -120,6 +121,7 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
 
   val debugIDE: Boolean = settings.YpresentationDebug.value
   val verboseIDE: Boolean = settings.YpresentationVerbose.value
+  private val anyThread: Boolean = settings.YpresentationAnyThread.value
 
   private def replayName = settings.YpresentationReplay.value
   private def logName = settings.YpresentationLog.value
@@ -315,7 +317,7 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
   private val NoResponse: Response[_] = new Response[Any]
 
   /** The response that is currently pending, i.e. the compiler
-   *  is working on providing an asnwer for it.
+   *  is working on providing an answer for it.
    */
   private var pendingResponse: Response[_] = NoResponse
 
@@ -532,7 +534,7 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
    */
   @elidable(elidable.WARNING)
   override def assertCorrectThread() {
-    assert(initializing || onCompilerThread,
+    assert(initializing || anyThread || onCompilerThread,
         "Race condition detected: You are running a presentation compiler method outside the PC thread.[phase: %s]".format(globalPhase) +
         " Please file a ticket with the current stack trace at https://www.assembla.com/spaces/scala-ide/support/tickets")
   }
@@ -661,7 +663,7 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
 
   /** Make sure unit is typechecked
    */
-  private def typeCheck(unit: RichCompilationUnit) {
+  private[scala] def typeCheck(unit: RichCompilationUnit) {
     debugLog("type checking: "+unit)
     parseAndEnter(unit)
     unit.status = PartiallyChecked
@@ -792,7 +794,7 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
   }
 
   /** A fully attributed tree located at position `pos` */
-  private[interactive] def typedTreeAt(pos: Position): Tree = getUnit(pos.source) match {
+  private[scala] def typedTreeAt(pos: Position): Tree = getUnit(pos.source) match {
     case None =>
       reloadSources(List(pos.source))
       try typedTreeAt(pos)
@@ -998,7 +1000,7 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
     def add(sym: Symbol, pre: Type, implicitlyAdded: Boolean)(toMember: (Symbol, Type) => M) {
       if ((sym.isGetter || sym.isSetter) && sym.accessed != NoSymbol) {
         add(sym.accessed, pre, implicitlyAdded)(toMember)
-      } else if (!sym.name.decodedName.containsName("$") && !sym.isSynthetic && sym.hasRawInfo) {
+      } else if (!sym.name.decodedName.containsName("$") && !sym.isError && !sym.isArtifact && sym.hasRawInfo) {
         val symtpe = pre.memberType(sym) onTypeError ErrorType
         matching(sym, symtpe, this(sym.name)) match {
           case Some(m) =>
@@ -1030,10 +1032,12 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
     def addScopeMember(sym: Symbol, pre: Type, viaImport: Tree) =
       locals.add(sym, pre, implicitlyAdded = false) { (s, st) =>
         // imported val and var are always marked as inaccessible, but they could be accessed through their getters. SI-7995
-        if (s.hasGetter)
+        val member = if (s.hasGetter)
           new ScopeMember(s, st, context.isAccessible(s.getter, pre, superAccess = false), viaImport)
         else
           new ScopeMember(s, st, context.isAccessible(s, pre, superAccess = false), viaImport)
+        member.prefix = pre
+        member
       }
     def localsToEnclosing() = {
       enclosing.addNonShadowed(locals)
@@ -1100,10 +1104,13 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
     def addTypeMember(sym: Symbol, pre: Type, inherited: Boolean, viaView: Symbol) = {
       val implicitlyAdded = viaView != NoSymbol
       members.add(sym, pre, implicitlyAdded) { (s, st) =>
-        new TypeMember(s, st,
+        val result = new TypeMember(s, st,
           context.isAccessible(if (s.hasGetter) s.getter(s.owner) else s, pre, superAccess && !implicitlyAdded),
           inherited,
           viaView)
+        result.prefix = pre
+        result
+
       }
     }
 
@@ -1147,6 +1154,112 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
     }
   }
 
+  sealed abstract class CompletionResult {
+    type M <: Member
+    def results: List[M]
+    /** The (possibly partial) name detected that precedes the cursor */
+    def name: Name
+    /** Cursor Offset - positionDelta == position of the start of the name */
+    def positionDelta: Int
+    def matchingResults(nameMatcher: (Name) => Name => Boolean = entered => candidate => candidate.startsWith(entered)): List[M] = {
+      val enteredName = if (name == nme.ERROR) nme.EMPTY else name
+      val matcher = nameMatcher(enteredName)
+      results filter { (member: Member) =>
+        val symbol = member.sym
+        def isStable = member.tpe.isStable || member.sym.isStable || member.sym.getterIn(member.sym.owner).isStable
+        def isJunk = symbol.name.isEmpty || !isIdentifierStart(member.sym.name.charAt(0)) // e.g. <byname>
+        !isJunk && member.accessible && !symbol.isConstructor && (name.isEmpty || matcher(member.sym.name) && (symbol.name.isTermName == name.isTermName || name.isTypeName && isStable))
+      }
+    }
+  }
+  object CompletionResult {
+    final case class ScopeMembers(positionDelta: Int, results: List[ScopeMember], name: Name) extends CompletionResult {
+      type M = ScopeMember
+    }
+    final case class TypeMembers(positionDelta: Int, qualifier: Tree, tree: Tree, results: List[TypeMember], name: Name) extends CompletionResult {
+      type M = TypeMember
+    }
+    case object NoResults extends CompletionResult {
+      override def results = Nil
+      override def name = nme.EMPTY
+      override def positionDelta = 0
+
+    }
+    private val CamelRegex = "([A-Z][^A-Z]*)".r
+    private def camelComponents(s: String): List[String] = {
+      CamelRegex.findAllIn("X" + s).toList match { case head :: tail => head.drop(1) :: tail; case Nil => Nil }
+    }
+    def camelMatch(entered: Name): Name => Boolean = {
+      val enteredS = entered.toString
+      val enteredLowercaseSet = enteredS.toLowerCase().toSet
+
+      (candidate: Name) => {
+        def candidateChunks = camelComponents(candidate.toString)
+        // Loosely based on IntelliJ's autocompletion: the user can just write everything in
+        // lowercase, as we'll let `isl` match `GenIndexedSeqLike` or `isLovely`.
+        def lenientMatch(entered: String, candidate: List[String], matchCount: Int): Boolean = {
+          candidate match {
+            case Nil => entered.isEmpty && matchCount > 0
+            case head :: tail =>
+              val enteredAlternatives = Set(entered, entered.capitalize)
+              head.inits.filter(_.length <= entered.length).exists(init =>
+                enteredAlternatives.exists(entered =>
+                  lenientMatch(entered.stripPrefix(init), tail, matchCount + (if (init.isEmpty) 0 else 1))
+                )
+              )
+          }
+        }
+        val containsAllEnteredChars = {
+          // Trying to rule out some candidates quickly before the more expensive `lenientMatch`
+          val candidateLowercaseSet = candidate.toString.toLowerCase().toSet
+          enteredLowercaseSet.diff(candidateLowercaseSet).isEmpty
+        }
+        containsAllEnteredChars && lenientMatch(enteredS, candidateChunks, 0)
+      }
+    }
+  }
+
+  final def completionsAt(pos: Position): CompletionResult = {
+    val focus1: Tree = typedTreeAt(pos)
+    def typeCompletions(tree: Tree, qual: Tree, nameStart: Int, name: Name): CompletionResult = {
+      val qualPos = qual.pos
+      val allTypeMembers = typeMembers(qualPos).toList.flatten
+      val positionDelta: Int = pos.start - nameStart
+      val subName: Name = name.newName(new String(pos.source.content, nameStart, pos.start - nameStart)).encodedName
+      CompletionResult.TypeMembers(positionDelta, qual, tree, allTypeMembers, subName)
+    }
+    focus1 match {
+      case imp at Import(i @ Ident(name), head :: Nil) if head.name == nme.ERROR =>
+        val allMembers = scopeMembers(pos)
+        val nameStart = i.pos.start
+        val positionDelta: Int = pos.start - nameStart
+        val subName = name.subName(0, pos.start - i.pos.start)
+        CompletionResult.ScopeMembers(positionDelta, allMembers, subName)
+      case imp at Import(qual, selectors) =>
+        selectors.reverseIterator.find(_.namePos <= pos.start) match {
+          case None => CompletionResult.NoResults
+          case Some(selector) =>
+            typeCompletions(imp, qual, selector.namePos, selector.name)
+        }
+      case sel at Select(qual, name) =>
+        val qualPos = qual.pos
+        def fallback = qualPos.end + 2
+        val source = pos.source
+        val nameStart: Int = (qualPos.end + 1 until focus1.pos.end).find(p =>
+          source.identifier(source.position(p)).exists(_.length > 0)
+        ).getOrElse(fallback)
+        typeCompletions(sel, qual, nameStart, name)
+      case Ident(name) =>
+        val allMembers = scopeMembers(pos)
+        val positionDelta: Int = pos.start - focus1.pos.start
+        val subName = name.subName(0, positionDelta)
+        CompletionResult.ScopeMembers(positionDelta, allMembers, subName)
+      case _ =>
+        CompletionResult.NoResults
+    }
+  }
+
+
   /** Implements CompilerControl.askLoadedTyped */
   private[interactive] def waitLoadedTyped(source: SourceFile, response: Response[Tree], keepLoaded: Boolean = false, onSameThread: Boolean = true) {
     getUnit(source) match {
diff --git a/src/interactive/scala/tools/nsc/interactive/Lexer.scala b/src/interactive/scala/tools/nsc/interactive/Lexer.scala
index 82e8de3..7daf24c 100644
--- a/src/interactive/scala/tools/nsc/interactive/Lexer.scala
+++ b/src/interactive/scala/tools/nsc/interactive/Lexer.scala
@@ -195,7 +195,7 @@ class Lexer(rd: Reader) {
       case 'n' => putAcceptString("null"); token = NullLit
       case '"' => getString()
       case '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' => getNumber()
-      case _ => error("unrecoginezed start of token: '"+ch+"'")
+      case _ => error("unrecognized start of token: '"+ch+"'")
     }
     //println("["+token+"]")
   }
diff --git a/src/library-aux/scala/Any.scala b/src/library-aux/scala/Any.scala
index 1c25989..e6ed467 100644
--- a/src/library-aux/scala/Any.scala
+++ b/src/library-aux/scala/Any.scala
@@ -27,7 +27,7 @@ package scala
  *     w.print()
  * }}}
  *
- * See the [[http://docs.scala-lang.org/sips/pending/value-classes.html value classes guide]] for more
+ * See the [[http://docs.scala-lang.org/overviews/core/value-classes.html Value Classes and Universal Traits]] for more
  * details on the interplay of universal traits and value classes.
  */
 abstract class Any {
@@ -38,7 +38,7 @@ abstract class Any {
    *  - It is reflexive: for any instance `x` of type `Any`, `x.equals(x)` should return `true`.
    *  - It is symmetric: for any instances `x` and `y` of type `Any`, `x.equals(y)` should return `true` if and
    *    only if `y.equals(x)` returns `true`.
-   *  - It is transitive: for any instances `x`, `y`, and `z` of type `AnyRef` if `x.equals(y)` returns `true` and
+   *  - It is transitive: for any instances `x`, `y`, and `z` of type `Any` if `x.equals(y)` returns `true` and
    *    `y.equals(z)` returns `true`, then `x.equals(z)` should return `true`.
    *
    *  If you override this method, you should verify that your implementation remains an equivalence relation.
diff --git a/src/library-aux/scala/AnyRef.scala b/src/library-aux/scala/AnyRef.scala
index 8c1862e..7217499 100644
--- a/src/library-aux/scala/AnyRef.scala
+++ b/src/library-aux/scala/AnyRef.scala
@@ -45,7 +45,7 @@ trait AnyRef extends Any {
    */
   def synchronized[T](body: => T): T
 
-  /** Tests whether the argument (`arg0`) is a reference to the receiver object (`this`).
+  /** Tests whether the argument (`that`) is a reference to the receiver object (`this`).
    *
    *  The `eq` method implements an [[http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation]] on
    *  non-null instances of `AnyRef`, and has three additional properties:
@@ -73,7 +73,7 @@ trait AnyRef extends Any {
 
   /** The expression `x == that` is equivalent to `if (x eq null) that eq null else x.equals(that)`.
    *
-   *  @param    arg0  the object to compare against this object for equality.
+   *  @param    that  the object to compare against this object for equality.
    *  @return         `true` if the receiver object is equivalent to the argument; `false` otherwise.
    */
   final def ==(that: Any): Boolean =
diff --git a/src/library/scala/AnyVal.scala b/src/library/scala/AnyVal.scala
index ff62948..e861860 100644
--- a/src/library/scala/AnyVal.scala
+++ b/src/library/scala/AnyVal.scala
@@ -48,9 +48,7 @@ package scala
  *
  * It's important to note that user-defined value classes are limited, and in some circumstances,
  * still must allocate a value class instance at runtime. These limitations and circumstances are
- * explained in greater detail in the [[http://docs.scala-lang.org/overviews/core/value-classes.html Value Classes Guide]]
- * as well as in [[http://docs.scala-lang.org/sips/pending/value-classes.html SIP-15: Value Classes]],
- * the Scala Improvement Proposal.
+ * explained in greater detail in the [[http://docs.scala-lang.org/overviews/core/value-classes.html Value Classes and Universal Traits]].
  */
 abstract class AnyVal extends Any {
   def getClass(): Class[_ <: AnyVal] = null
diff --git a/src/library/scala/Array.scala b/src/library/scala/Array.scala
index 6ab82d9..d89e9d2 100644
--- a/src/library/scala/Array.scala
+++ b/src/library/scala/Array.scala
@@ -483,7 +483,7 @@ object Array extends FallbackArrayBuilding {
  *
  *  @author Martin Odersky
  *  @version 1.0
- *  @see [[http://www.scala-lang.org/docu/files/ScalaReference.pdf Scala Language Specification]], for in-depth information on the transformations the Scala compiler makes on Arrays (Sections 6.6 and 6.15 respectively.)
+ *  @see [[http://www.scala-lang.org/files/archive/spec/2.11/ Scala Language Specification]], for in-depth information on the transformations the Scala compiler makes on Arrays (Sections 6.6 and 6.15 respectively.)
  *  @see [[http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html "Scala 2.8 Arrays"]] the Scala Improvement Document detailing arrays since Scala 2.8.
  *  @see [[http://docs.scala-lang.org/overviews/collections/arrays.html "The Scala 2.8 Collections' API"]] section on `Array` by Martin Odersky for more information.
  *  @define coll array
diff --git a/src/library/scala/Byte.scala b/src/library/scala/Byte.scala
index 413231c..fb66291 100644
--- a/src/library/scala/Byte.scala
+++ b/src/library/scala/Byte.scala
@@ -79,8 +79,8 @@ final abstract class Byte private extends AnyVal {
   */
   def >>>(x: Long): Int
   /**
-  * Returns this value bit-shifted left by the specified number of bits,
-  *         filling in the right bits with the same value as the left-most bit of this.
+  * Returns this value bit-shifted right by the specified number of bits,
+  *         filling in the left bits with the same value as the left-most bit of this.
   *         The effect of this is to retain the sign of the value.
   * @example {{{
   * -21 >> 3 == -3
@@ -90,8 +90,8 @@ final abstract class Byte private extends AnyVal {
   */
   def >>(x: Int): Int
   /**
-  * Returns this value bit-shifted left by the specified number of bits,
-  *         filling in the right bits with the same value as the left-most bit of this.
+  * Returns this value bit-shifted right by the specified number of bits,
+  *         filling in the left bits with the same value as the left-most bit of this.
   *         The effect of this is to retain the sign of the value.
   * @example {{{
   * -21 >> 3 == -3
diff --git a/src/library/scala/Char.scala b/src/library/scala/Char.scala
index ec2d48c..9f06503 100644
--- a/src/library/scala/Char.scala
+++ b/src/library/scala/Char.scala
@@ -79,8 +79,8 @@ final abstract class Char private extends AnyVal {
   */
   def >>>(x: Long): Int
   /**
-  * Returns this value bit-shifted left by the specified number of bits,
-  *         filling in the right bits with the same value as the left-most bit of this.
+  * Returns this value bit-shifted right by the specified number of bits,
+  *         filling in the left bits with the same value as the left-most bit of this.
   *         The effect of this is to retain the sign of the value.
   * @example {{{
   * -21 >> 3 == -3
@@ -90,8 +90,8 @@ final abstract class Char private extends AnyVal {
   */
   def >>(x: Int): Int
   /**
-  * Returns this value bit-shifted left by the specified number of bits,
-  *         filling in the right bits with the same value as the left-most bit of this.
+  * Returns this value bit-shifted right by the specified number of bits,
+  *         filling in the left bits with the same value as the left-most bit of this.
   *         The effect of this is to retain the sign of the value.
   * @example {{{
   * -21 >> 3 == -3
diff --git a/src/library/scala/Equals.scala b/src/library/scala/Equals.scala
index f2f9ead..e06557c 100644
--- a/src/library/scala/Equals.scala
+++ b/src/library/scala/Equals.scala
@@ -13,8 +13,9 @@ package scala
  */
 trait Equals extends Any {
   /** A method that should be called from every well-designed equals method
-   *  that is open to be overridden in a subclass. See Programming in Scala,
-   *  Chapter 28 for discussion and design.
+   *  that is open to be overridden in a subclass. See
+   *  [[http://www.artima.com/pins1ed/object-equality.html Programming in Scala,
+   *  Chapter 28]] for discussion and design.
    *
    *  @param    that    the value being probed for possible equality
    *  @return   true if this instance can possibly equal `that`, otherwise false
diff --git a/src/library/scala/Function0.scala b/src/library/scala/Function0.scala
index e13aaad..15d0f14 100644
--- a/src/library/scala/Function0.scala
+++ b/src/library/scala/Function0.scala
@@ -6,7 +6,7 @@
 **                          |/                                          **
 \*                                                                      */
 // GENERATED CODE: DO NOT EDIT.
-// genprod generated these sources at: Sun Sep 15 20:42:00 CEST 2013
+// genprod generated these sources at: Mon Jun 08 18:05:40 CEST 2015
 
 package scala
 
@@ -26,12 +26,6 @@ package scala
  *    assert(javaVersion() == anonfun0())
  * }
  *  }}}
- *
- *  Note that `Function1` does not define a total function, as might
- *  be suggested by the existence of [[scala.PartialFunction]]. The only
- *  distinction between `Function1` and `PartialFunction` is that the
- *  latter can specify inputs which it will not handle.
-
  */
 trait Function0[@specialized(Specializable.Primitives) +R] extends AnyRef { self =>
   /** Apply the body of this function to the arguments.
diff --git a/src/library/scala/Function1.scala b/src/library/scala/Function1.scala
index 620dcc1..572901c 100644
--- a/src/library/scala/Function1.scala
+++ b/src/library/scala/Function1.scala
@@ -25,11 +25,8 @@ package scala
  * }
  *  }}}
  *
- *  Note that `Function1` does not define a total function, as might
- *  be suggested by the existence of [[scala.PartialFunction]]. The only
- *  distinction between `Function1` and `PartialFunction` is that the
- *  latter can specify inputs which it will not handle.
-
+ *  Note that the difference between `Function1` and [[scala.PartialFunction]]
+ *  is that the latter can specify inputs which it will not handle.
  */
 @annotation.implicitNotFound(msg = "No implicit view available from ${T1} => ${R}.")
 trait Function1[@specialized(scala.Int, scala.Long, scala.Float, scala.Double) -T1, @specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) +R] extends AnyRef { self =>
diff --git a/src/library/scala/Function2.scala b/src/library/scala/Function2.scala
index 5690adb..e2c094e 100644
--- a/src/library/scala/Function2.scala
+++ b/src/library/scala/Function2.scala
@@ -25,12 +25,6 @@ package scala
  *    assert(max(0, 1) == anonfun2(0, 1))
  * }
  *  }}}
- *
- *  Note that `Function1` does not define a total function, as might
- *  be suggested by the existence of [[scala.PartialFunction]]. The only
- *  distinction between `Function1` and `PartialFunction` is that the
- *  latter can specify inputs which it will not handle.
-
  */
 trait Function2[@specialized(scala.Int, scala.Long, scala.Double) -T1, @specialized(scala.Int, scala.Long, scala.Double) -T2, @specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) +R] extends AnyRef { self =>
   /** Apply the body of this function to the arguments.
diff --git a/src/library/scala/Int.scala b/src/library/scala/Int.scala
index 72e5ebf..3bd3775 100644
--- a/src/library/scala/Int.scala
+++ b/src/library/scala/Int.scala
@@ -79,8 +79,8 @@ final abstract class Int private extends AnyVal {
   */
   def >>>(x: Long): Int
   /**
-  * Returns this value bit-shifted left by the specified number of bits,
-  *         filling in the right bits with the same value as the left-most bit of this.
+  * Returns this value bit-shifted right by the specified number of bits,
+  *         filling in the left bits with the same value as the left-most bit of this.
   *         The effect of this is to retain the sign of the value.
   * @example {{{
   * -21 >> 3 == -3
@@ -90,8 +90,8 @@ final abstract class Int private extends AnyVal {
   */
   def >>(x: Int): Int
   /**
-  * Returns this value bit-shifted left by the specified number of bits,
-  *         filling in the right bits with the same value as the left-most bit of this.
+  * Returns this value bit-shifted right by the specified number of bits,
+  *         filling in the left bits with the same value as the left-most bit of this.
   *         The effect of this is to retain the sign of the value.
   * @example {{{
   * -21 >> 3 == -3
diff --git a/src/library/scala/Long.scala b/src/library/scala/Long.scala
index 1bd0fe8..b27a666 100644
--- a/src/library/scala/Long.scala
+++ b/src/library/scala/Long.scala
@@ -79,8 +79,8 @@ final abstract class Long private extends AnyVal {
   */
   def >>>(x: Long): Long
   /**
-  * Returns this value bit-shifted left by the specified number of bits,
-  *         filling in the right bits with the same value as the left-most bit of this.
+  * Returns this value bit-shifted right by the specified number of bits,
+  *         filling in the left bits with the same value as the left-most bit of this.
   *         The effect of this is to retain the sign of the value.
   * @example {{{
   * -21 >> 3 == -3
@@ -90,8 +90,8 @@ final abstract class Long private extends AnyVal {
   */
   def >>(x: Int): Long
   /**
-  * Returns this value bit-shifted left by the specified number of bits,
-  *         filling in the right bits with the same value as the left-most bit of this.
+  * Returns this value bit-shifted right by the specified number of bits,
+  *         filling in the left bits with the same value as the left-most bit of this.
   *         The effect of this is to retain the sign of the value.
   * @example {{{
   * -21 >> 3 == -3
diff --git a/src/library/scala/Mutable.scala b/src/library/scala/Mutable.scala
index 8ef0424..43f98ee 100644
--- a/src/library/scala/Mutable.scala
+++ b/src/library/scala/Mutable.scala
@@ -11,7 +11,7 @@
 package scala
 
 /**
- * A marker trait for mutable datatructures such as mutable collections
+ * A marker trait for mutable data structures such as mutable collections
  *
  * @since 2.8
  */
diff --git a/src/library/scala/Option.scala b/src/library/scala/Option.scala
index f134f5c..7282fee 100644
--- a/src/library/scala/Option.scala
+++ b/src/library/scala/Option.scala
@@ -270,7 +270,7 @@ sealed abstract class Option[+A] extends Product with Serializable {
    *  // Returns None because the partial function doesn't cover the case.
    *  Some("ftp") collect {case "http" => "HTTP"}
    *
-   *  // Returns None because None is passed to the collect method.
+   *  // Returns None because the option is empty. There is no value to pass to the partial function.
    *  None collect {case value => value}
    *  }}}
    *
diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala
index bf77393..94cb331 100644
--- a/src/library/scala/Predef.scala
+++ b/src/library/scala/Predef.scala
@@ -35,9 +35,9 @@ import scala.io.StdIn
  *  === Assertions ===
  *
  *  A set of `assert` functions are provided for use as a way to document
- *  and dynamically check invariants in code. `assert` statements can be elided
- *  at runtime by providing the command line argument `-Xdisable-assertions` to
- *  the `scala` command.
+ *  and dynamically check invariants in code. Invocations of `assert` can be elided
+ *  at compile time by providing the command line option `-Xdisable-assertions`,
+ *  which raises `-Xelide-below` above `elidable.ASSERTION`, to the `scalac` command.
  *
  *  Variants of `assert` intended for use with static analysis tools are also
  *  provided: `assume`, `require` and `ensuring`. `require` and `ensuring` are
@@ -56,9 +56,9 @@ import scala.io.StdIn
  *  only contain natural numbers (i.e. non-negative), and that the result returned
  *  will also be natural. `require` is distinct from `assert` in that if the
  *  condition fails, then the caller of the function is to blame rather than a
- *  logical error having been made within `addNaturals` itself. `ensures` is a
+ *  logical error having been made within `addNaturals` itself. `ensuring` is a
  *  form of `assert` that declares the guarantee the function is providing with
- *  regards to it's return value.
+ *  regards to its return value.
  *
  *  === Implicit Conversions ===
  *  A number of commonly applied implicit conversions are also defined here, and
@@ -82,10 +82,15 @@ object Predef extends LowPriorityImplicits with DeprecatedPredef {
    */
   def classOf[T]: Class[T] = null // This is a stub method. The actual implementation is filled in by the compiler.
 
+  /** The `String` type in Scala has methods that come either from the underlying
+   *  Java String (see the documentation corresponding to your Java version, for
+   *  example [[http://docs.oracle.com/javase/8/docs/api/java/lang/String.html]]) or
+   *  are added implicitly through [[scala.collection.immutable.StringOps]].
+   */
   type String        = java.lang.String
   type Class[T]      = java.lang.Class[T]
 
-  // miscelleaneous -----------------------------------------------------
+  // miscellaneous -----------------------------------------------------
   scala.`package`                         // to force scala package object to be seen.
   scala.collection.immutable.List         // to force Nil, :: to be seen.
 
diff --git a/src/library/scala/Product1.scala b/src/library/scala/Product1.scala
index dbc34ba..e82300a 100644
--- a/src/library/scala/Product1.scala
+++ b/src/library/scala/Product1.scala
@@ -24,7 +24,7 @@ trait Product1[@specialized(Int, Long, Double) +T1] extends Any with Product {
   override def productArity = 1
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product10.scala b/src/library/scala/Product10.scala
index 70de79d..5fc4874 100644
--- a/src/library/scala/Product10.scala
+++ b/src/library/scala/Product10.scala
@@ -24,7 +24,7 @@ trait Product10[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10] extends Any w
   override def productArity = 10
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product11.scala b/src/library/scala/Product11.scala
index 1bb79ac..dcebc90 100644
--- a/src/library/scala/Product11.scala
+++ b/src/library/scala/Product11.scala
@@ -24,7 +24,7 @@ trait Product11[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11] extends
   override def productArity = 11
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product12.scala b/src/library/scala/Product12.scala
index d7e1e1b..2221170 100644
--- a/src/library/scala/Product12.scala
+++ b/src/library/scala/Product12.scala
@@ -24,7 +24,7 @@ trait Product12[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12] e
   override def productArity = 12
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product13.scala b/src/library/scala/Product13.scala
index 8571b45..e76f326 100644
--- a/src/library/scala/Product13.scala
+++ b/src/library/scala/Product13.scala
@@ -24,7 +24,7 @@ trait Product13[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +
   override def productArity = 13
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product14.scala b/src/library/scala/Product14.scala
index a2f5140..a076e2c 100644
--- a/src/library/scala/Product14.scala
+++ b/src/library/scala/Product14.scala
@@ -24,7 +24,7 @@ trait Product14[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +
   override def productArity = 14
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product15.scala b/src/library/scala/Product15.scala
index 1c6ad00..4568aff 100644
--- a/src/library/scala/Product15.scala
+++ b/src/library/scala/Product15.scala
@@ -24,7 +24,7 @@ trait Product15[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +
   override def productArity = 15
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product16.scala b/src/library/scala/Product16.scala
index f03b0b3..84dccb0 100644
--- a/src/library/scala/Product16.scala
+++ b/src/library/scala/Product16.scala
@@ -24,7 +24,7 @@ trait Product16[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +
   override def productArity = 16
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product17.scala b/src/library/scala/Product17.scala
index 72df1b4..0d50898 100644
--- a/src/library/scala/Product17.scala
+++ b/src/library/scala/Product17.scala
@@ -24,7 +24,7 @@ trait Product17[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +
   override def productArity = 17
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product18.scala b/src/library/scala/Product18.scala
index 0402f90..9b32265 100644
--- a/src/library/scala/Product18.scala
+++ b/src/library/scala/Product18.scala
@@ -24,7 +24,7 @@ trait Product18[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +
   override def productArity = 18
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product19.scala b/src/library/scala/Product19.scala
index b9770db..fe6b956 100644
--- a/src/library/scala/Product19.scala
+++ b/src/library/scala/Product19.scala
@@ -24,7 +24,7 @@ trait Product19[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +
   override def productArity = 19
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product2.scala b/src/library/scala/Product2.scala
index a43a4a2..091bcc8 100644
--- a/src/library/scala/Product2.scala
+++ b/src/library/scala/Product2.scala
@@ -24,7 +24,7 @@ trait Product2[@specialized(Int, Long, Double) +T1, @specialized(Int, Long, Doub
   override def productArity = 2
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product20.scala b/src/library/scala/Product20.scala
index 7b0df20..81315e3 100644
--- a/src/library/scala/Product20.scala
+++ b/src/library/scala/Product20.scala
@@ -24,7 +24,7 @@ trait Product20[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +
   override def productArity = 20
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product21.scala b/src/library/scala/Product21.scala
index f81347a..b5967c0 100644
--- a/src/library/scala/Product21.scala
+++ b/src/library/scala/Product21.scala
@@ -24,7 +24,7 @@ trait Product21[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +
   override def productArity = 21
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product22.scala b/src/library/scala/Product22.scala
index 7a25891..c7b9da5 100644
--- a/src/library/scala/Product22.scala
+++ b/src/library/scala/Product22.scala
@@ -24,7 +24,7 @@ trait Product22[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +
   override def productArity = 22
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product3.scala b/src/library/scala/Product3.scala
index 9976240..7154bf5 100644
--- a/src/library/scala/Product3.scala
+++ b/src/library/scala/Product3.scala
@@ -24,7 +24,7 @@ trait Product3[+T1, +T2, +T3] extends Any with Product {
   override def productArity = 3
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product4.scala b/src/library/scala/Product4.scala
index d6c1543..046f8c7 100644
--- a/src/library/scala/Product4.scala
+++ b/src/library/scala/Product4.scala
@@ -24,7 +24,7 @@ trait Product4[+T1, +T2, +T3, +T4] extends Any with Product {
   override def productArity = 4
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product5.scala b/src/library/scala/Product5.scala
index 5f1b11a..3e952c8 100644
--- a/src/library/scala/Product5.scala
+++ b/src/library/scala/Product5.scala
@@ -24,7 +24,7 @@ trait Product5[+T1, +T2, +T3, +T4, +T5] extends Any with Product {
   override def productArity = 5
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product6.scala b/src/library/scala/Product6.scala
index efd9408..010c687 100644
--- a/src/library/scala/Product6.scala
+++ b/src/library/scala/Product6.scala
@@ -24,7 +24,7 @@ trait Product6[+T1, +T2, +T3, +T4, +T5, +T6] extends Any with Product {
   override def productArity = 6
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product7.scala b/src/library/scala/Product7.scala
index fab0a99..24e5a5c 100644
--- a/src/library/scala/Product7.scala
+++ b/src/library/scala/Product7.scala
@@ -24,7 +24,7 @@ trait Product7[+T1, +T2, +T3, +T4, +T5, +T6, +T7] extends Any with Product {
   override def productArity = 7
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product8.scala b/src/library/scala/Product8.scala
index 41391f7..4a9f65b 100644
--- a/src/library/scala/Product8.scala
+++ b/src/library/scala/Product8.scala
@@ -24,7 +24,7 @@ trait Product8[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8] extends Any with Product
   override def productArity = 8
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Product9.scala b/src/library/scala/Product9.scala
index e22538e..9af11f7 100644
--- a/src/library/scala/Product9.scala
+++ b/src/library/scala/Product9.scala
@@ -24,7 +24,7 @@ trait Product9[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9] extends Any with Pro
   override def productArity = 9
 
   
-  /** Returns the n-th projection of this product if 0 < n <= productArity,
+  /** Returns the n-th projection of this product if 0 <= n < productArity,
    *  otherwise throws an `IndexOutOfBoundsException`.
    *
    *  @param n number of the projection to be returned
diff --git a/src/library/scala/Short.scala b/src/library/scala/Short.scala
index 36b9ec4..2cbbf3c 100644
--- a/src/library/scala/Short.scala
+++ b/src/library/scala/Short.scala
@@ -79,8 +79,8 @@ final abstract class Short private extends AnyVal {
   */
   def >>>(x: Long): Int
   /**
-  * Returns this value bit-shifted left by the specified number of bits,
-  *         filling in the right bits with the same value as the left-most bit of this.
+  * Returns this value bit-shifted right by the specified number of bits,
+  *         filling in the left bits with the same value as the left-most bit of this.
   *         The effect of this is to retain the sign of the value.
   * @example {{{
   * -21 >> 3 == -3
@@ -90,8 +90,8 @@ final abstract class Short private extends AnyVal {
   */
   def >>(x: Int): Int
   /**
-  * Returns this value bit-shifted left by the specified number of bits,
-  *         filling in the right bits with the same value as the left-most bit of this.
+  * Returns this value bit-shifted right by the specified number of bits,
+  *         filling in the left bits with the same value as the left-most bit of this.
   *         The effect of this is to retain the sign of the value.
   * @example {{{
   * -21 >> 3 == -3
diff --git a/src/library/scala/StringContext.scala b/src/library/scala/StringContext.scala
index e60fa2f..69533c1 100644
--- a/src/library/scala/StringContext.scala
+++ b/src/library/scala/StringContext.scala
@@ -173,7 +173,7 @@ object StringContext {
   /** An exception that is thrown if a string contains a backslash (`\`) character
    *  that does not start a valid escape sequence.
    *  @param  str   The offending string
-   *  @param  idx   The index of the offending backslash character in `str`.
+   *  @param  index   The index of the offending backslash character in `str`.
    */
   class InvalidEscapeException(str: String, @deprecatedName('idx) val index: Int) extends IllegalArgumentException(
     s"""invalid escape ${
diff --git a/src/library/scala/annotation/switch.scala b/src/library/scala/annotation/switch.scala
index 23e3923..00124cf 100644
--- a/src/library/scala/annotation/switch.scala
+++ b/src/library/scala/annotation/switch.scala
@@ -22,6 +22,9 @@ package scala.annotation
   }
 }}}
  *
+ *  Note: for pattern matches with one or two cases, the compiler generates jump instructions.
+ *  Annotating such a match with `@switch` does not issue any warning.
+ *
  *  @author   Paul Phillips
  *  @since    2.8
  */
diff --git a/src/library/scala/collection/BitSetLike.scala b/src/library/scala/collection/BitSetLike.scala
index 8a8af79..2936944 100644
--- a/src/library/scala/collection/BitSetLike.scala
+++ b/src/library/scala/collection/BitSetLike.scala
@@ -115,7 +115,7 @@ trait BitSetLike[+This <: BitSetLike[This] with SortedSet[Int]] extends SortedSe
       else Iterator.empty.next()
   }
 
-  override def foreach[B](f: Int => B) {
+  override def foreach[U](f: Int => U) {
     /* NOTE: while loops are significantly faster as of 2.11 and
        one major use case of bitsets is performance. Also, there
        is nothing to do when all bits are clear, so use that as
diff --git a/src/library/scala/collection/GenMapLike.scala b/src/library/scala/collection/GenMapLike.scala
index bce9740..2b39fa2 100644
--- a/src/library/scala/collection/GenMapLike.scala
+++ b/src/library/scala/collection/GenMapLike.scala
@@ -124,8 +124,7 @@ trait GenMapLike[A, +B, +Repr] extends GenIterableLike[(A, B), Repr] with Equals
           }
         }
       } catch {
-        case ex: ClassCastException =>
-          println("class cast "); false
+        case ex: ClassCastException => false
       }}
     case _ =>
       false
diff --git a/src/library/scala/collection/GenSeqLike.scala b/src/library/scala/collection/GenSeqLike.scala
index cf1de0c..be1da16 100644
--- a/src/library/scala/collection/GenSeqLike.scala
+++ b/src/library/scala/collection/GenSeqLike.scala
@@ -274,7 +274,8 @@ trait GenSeqLike[+A, +Repr] extends Any with GenIterableLike[A, Repr] with Equal
    *  @tparam B        the element type of the returned $coll.
    *  @tparam That     $thatinfo
    *  @param bf        $bfinfo
-   *  @return a new $coll` which is a copy of this $coll with the element at position `index` replaced by `elem`.
+   *  @return a new $coll which is a copy of this $coll with the element at position `index` replaced by `elem`.
+   *  @throws IndexOutOfBoundsException if `index` does not satisfy `0 <= index < length`.
    *
    *  @usecase def updated(index: Int, elem: A): $Coll[A]
    *    @inheritdoc
diff --git a/src/library/scala/collection/GenTraversableLike.scala b/src/library/scala/collection/GenTraversableLike.scala
index 8b9d3e7..d730996 100644
--- a/src/library/scala/collection/GenTraversableLike.scala
+++ b/src/library/scala/collection/GenTraversableLike.scala
@@ -158,18 +158,6 @@ trait GenTraversableLike[+A, +Repr] extends Any with GenTraversableOnce[A] with
   @migration("The behavior of `scanRight` has changed. The previous behavior can be reproduced with scanRight.reverse.", "2.9.0")
   def scanRight[B, That](z: B)(op: (A, B) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
 
-  /** Applies a function `f` to all elements of this $coll.
-   *
-   *  @param  f   the function that is applied for its side-effect to every element.
-   *              The result of function `f` is discarded.
-   *
-   *  @tparam  U  the type parameter describing the result of function `f`.
-   *              This result will always be ignored. Typically `U` is `Unit`,
-   *              but this is not necessary.
-   *
-   *  @usecase def foreach(f: A => Unit): Unit
-   *    @inheritdoc
-   */
   def foreach[U](f: A => U): Unit
 
   /** Builds a new collection by applying a function to all elements of this $coll.
@@ -269,16 +257,16 @@ trait GenTraversableLike[+A, +Repr] extends Any with GenTraversableOnce[A] with
    *    {{{
    *      scala> val a = List(1)
    *      a: List[Int] = List(1)
-   *      
+   *
    *      scala> val b = List(2)
    *      b: List[Int] = List(2)
-   *      
+   *
    *      scala> val c = a ++ b
    *      c: List[Int] = List(1, 2)
-   *      
+   *
    *      scala> val d = List('a')
    *      d: List[Char] = List(a)
-   *      
+   *
    *      scala> val e = c ++ d
    *      e: List[AnyVal] = List(1, 2, a)
    *    }}}
diff --git a/src/library/scala/collection/GenTraversableOnce.scala b/src/library/scala/collection/GenTraversableOnce.scala
index 8c7c754..4af2ca2 100644
--- a/src/library/scala/collection/GenTraversableOnce.scala
+++ b/src/library/scala/collection/GenTraversableOnce.scala
@@ -49,8 +49,41 @@ import scala.language.higherKinds
  */
 trait GenTraversableOnce[+A] extends Any {
 
+  /** Applies a function `f` to all elements of this $coll.
+    *
+    *  @param  f   the function that is applied for its side-effect to every element.
+    *              The result of function `f` is discarded.
+    *
+    *  @tparam  U  the type parameter describing the result of function `f`.
+    *              This result will always be ignored. Typically `U` is `Unit`,
+    *              but this is not necessary.
+    *
+    *  @usecase def foreach(f: A => Unit): Unit
+    *    @inheritdoc
+    *
+    *    Note: this method underlies the implementation of most other bulk operations.
+    *    It's important to implement this method in an efficient way.
+    *
+    */
   def foreach[U](f: A => U): Unit
 
+  /** Tests whether this $coll is known to have a finite size.
+    *  All strict collections are known to have finite size. For a non-strict
+    *  collection such as `Stream`, the predicate returns `'''true'''` if all
+    *  elements have been computed. It returns `'''false'''` if the stream is
+    *  not yet evaluated to the end. Non-empty Iterators usually return
+    *  `'''false'''` even if they were created from a collection with a known
+    *  finite size.
+    *
+    *  Note: many collection methods will not work on collections of infinite sizes.
+    *  The typical failure mode is an infinite loop. These methods always attempt a
+    *  traversal without checking first that `hasDefiniteSize` returns `'''true'''`.
+    *  However, checking `hasDefiniteSize` can provide an assurance that size is
+    *  well-defined and non-termination is not a concern.
+    *
+    *  @return  `'''true'''` if this collection is known to have finite size,
+    *           `'''false'''` otherwise.
+    */
   def hasDefiniteSize: Boolean
 
   def seq: TraversableOnce[A]
@@ -65,6 +98,9 @@ trait GenTraversableOnce[+A] extends Any {
 
   /** Tests whether the $coll is empty.
    *
+   *  Note: Implementations in subclasses that are not repeatedly traversable must take
+   *  care not to consume any elements when `isEmpty` is called.
+   *
    *  @return    `true` if the $coll contains no elements, `false` otherwise.
    */
   def isEmpty: Boolean
@@ -110,13 +146,14 @@ trait GenTraversableOnce[+A] extends Any {
    *  binary operator.
    *
    *  $undefinedorder
+   *  $willNotTerminateInf
    *
    *  @tparam A1     a type parameter for the binary operator, a supertype of `A`.
    *  @param z       a neutral element for the fold operation; may be added to the result
    *                 an arbitrary number of times, and must not change the result (e.g., `Nil` for list concatenation,
-   *                 0 for addition, or 1 for multiplication.)
-   *  @param op      a binary operator that must be associative
-   *  @return        the result of applying fold operator `op` between all the elements and `z`
+   *                 0 for addition, or 1 for multiplication).
+   *  @param op      a binary operator that must be associative.
+   *  @return        the result of applying the fold operator `op` between all the elements and `z`, or `z` if this $coll is empty.
    */
   def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1
 
@@ -205,6 +242,7 @@ trait GenTraversableOnce[+A] extends Any {
    *             op(...op(z, x_1), x_2, ..., x_n)
    *           }}}
    *           where `x,,1,,, ..., x,,n,,` are the elements of this $coll.
+   *           Returns `z` if this $coll is empty.
    */
   def foldLeft[B](z: B)(op: (B, A) => B): B
 
@@ -222,30 +260,32 @@ trait GenTraversableOnce[+A] extends Any {
    *             op(x_1, op(x_2, ... op(x_n, z)...))
    *           }}}
    *           where `x,,1,,, ..., x,,n,,` are the elements of this $coll.
+   *           Returns `z` if this $coll is empty.
    */
   def foldRight[B](z: B)(op: (A, B) => B): B
 
   /** Aggregates the results of applying an operator to subsequent elements.
    *
-   *  This is a more general form of `fold` and `reduce`. It has similar
-   *  semantics, but does not require the result to be a supertype of the
-   *  element type. It traverses the elements in different partitions
-   *  sequentially, using `seqop` to update the result, and then applies
-   *  `combop` to results from different partitions. The implementation of
-   *  this operation may operate on an arbitrary number of collection
-   *  partitions, so `combop` may be invoked an arbitrary number of times.
-   *
-   *  For example, one might want to process some elements and then produce
-   *  a `Set`. In this case, `seqop` would process an element and append it
-   *  to the list, while `combop` would concatenate two lists from different
-   *  partitions together. The initial value `z` would be an empty set.
+   *  This is a more general form of `fold` and `reduce`. It is similar to
+   *  `foldLeft` in that it doesn't require the result to be a supertype of the
+   *  element type. In addition, it allows parallel collections to be processed
+   *  in chunks, and then combines the intermediate results.
+   *
+   *  `aggregate` splits the $coll into partitions and processes each
+   *  partition by sequentially applying `seqop`, starting with `z` (like
+   *  `foldLeft`). Those intermediate results are then combined by using
+   *  `combop` (like `fold`). The implementation of this operation may operate
+   *  on an arbitrary number of collection partitions (even 1), so `combop` may
+   *  be invoked an arbitrary number of times (even 0).
+   *
+   *  As an example, consider summing up the integer values of a list of chars.
+   *  The initial value for the sum is 0. First, `seqop` transforms each input
+   *  character to an Int and adds it to the sum (of the partition). Then,
+   *  `combop` just needs to sum up the intermediate results of the partitions:
    *  {{{
-   *    pc.aggregate(Set[Int]())(_ += process(_), _ ++ _)
+   *    List('a', 'b', 'c').aggregate(0)({ (sum, ch) => sum + ch.toInt }, { (p1, p2) => p1 + p2 })
    *  }}}
    *
-   *  Another example is calculating geometric mean from a collection of doubles
-   *  (one would typically require big doubles for this).
-   *
    *  @tparam B        the type of accumulated results
    *  @param z         the initial value for the accumulated result of the partition - this
    *                   will typically be the neutral element for the `seqop` operator (e.g.
@@ -278,7 +318,7 @@ trait GenTraversableOnce[+A] extends Any {
    *
    *  @param  op    the binary operator.
    *  @tparam  B    the result type of the binary operator.
-   *  @return  an option value containing the result of `reduceLeft(op)` is this $coll is nonempty,
+   *  @return  an option value containing the result of `reduceLeft(op)` if this $coll is nonempty,
    *           `None` otherwise.
    */
   def reduceLeftOption[B >: A](op: (B, A) => B): Option[B]
@@ -290,7 +330,7 @@ trait GenTraversableOnce[+A] extends Any {
    *
    *  @param  op    the binary operator.
    *  @tparam  B    the result type of the binary operator.
-   *  @return  an option value containing the result of `reduceRight(op)` is this $coll is nonempty,
+   *  @return  an option value containing the result of `reduceRight(op)` if this $coll is nonempty,
    *           `None` otherwise.
    */
   def reduceRightOption[B >: A](op: (A, B) => B): Option[B]
@@ -393,28 +433,43 @@ trait GenTraversableOnce[+A] extends Any {
    */
   def minBy[B](f: A => B)(implicit cmp: Ordering[B]): A
 
-  def forall(pred: A => Boolean): Boolean
+  /** Tests whether a predicate holds for all elements of this $coll.
+   *
+   *  $mayNotTerminateInf
+   *
+   *  @param   p     the predicate used to test elements.
+   *  @return        `true` if this $coll is empty or the given predicate `p`
+   *                 holds for all elements of this $coll, otherwise `false`.
+   */
+  def forall(@deprecatedName('pred) p: A => Boolean): Boolean
 
-  def exists(pred: A => Boolean): Boolean
+  /** Tests whether a predicate holds for at least one element of this $coll.
+   *
+   *  $mayNotTerminateInf
+   *
+   *  @param   p     the predicate used to test elements.
+   *  @return        `true` if the given predicate `p` is satisfied by at least one element of this $coll, otherwise `false`
+   */
+  def exists(@deprecatedName('pred) p: A => Boolean): Boolean
 
   /** Finds the first element of the $coll satisfying a predicate, if any.
    *
    *  $mayNotTerminateInf
    *  $orderDependent
    *
-   *  @param pred    the predicate used to test elements.
+   *  @param p       the predicate used to test elements.
    *  @return        an option value containing the first element in the $coll
    *                 that satisfies `p`, or `None` if none exists.
    */
-  def find(pred: A => Boolean): Option[A]
+  def find(@deprecatedName('pred) p: A => Boolean): Option[A]
 
-  /** Copies values of this $coll to an array.
+  /** Copies the elements of this $coll to an array.
    *  Fills the given array `xs` with values of this $coll.
    *  Copying will stop once either the end of the current $coll is reached,
-   *  or the end of the array is reached.
+   *  or the end of the target array is reached.
    *
    *  @param  xs     the array to fill.
-   *  @tparam B      the type of the elements of the array.
+   *  @tparam B      the type of the elements of the target array.
    *
    *  @usecase def copyToArray(xs: Array[A]): Unit
    *    @inheritdoc
@@ -423,14 +478,14 @@ trait GenTraversableOnce[+A] extends Any {
    */
   def copyToArray[B >: A](xs: Array[B]): Unit
 
-  /** Copies values of this $coll to an array.
+  /** Copies the elements of this $coll to an array.
    *  Fills the given array `xs` with values of this $coll, beginning at index `start`.
    *  Copying will stop once either the end of the current $coll is reached,
-   *  or the end of the array is reached.
+   *  or the end of the target array is reached.
    *
    *  @param  xs     the array to fill.
    *  @param  start  the starting index.
-   *  @tparam B      the type of the elements of the array.
+   *  @tparam B      the type of the elements of the target array.
    *
    *  @usecase def copyToArray(xs: Array[A], start: Int): Unit
    *    @inheritdoc
@@ -439,6 +494,22 @@ trait GenTraversableOnce[+A] extends Any {
    */
   def copyToArray[B >: A](xs: Array[B], start: Int): Unit
 
+  /** Copies the elements of this $coll to an array.
+   *  Fills the given array `xs` with at most `len` elements of
+   *  this $coll, starting at position `start`.
+   *  Copying will stop once either the end of the current $coll is reached,
+   *  or the end of the target array is reached, or `len` elements have been copied.
+   *
+   *  @param  xs     the array to fill.
+   *  @param  start  the starting index.
+   *  @param  len    the maximal number of elements to copy.
+   *  @tparam B      the type of the elements of the target array.
+   *
+   *  @usecase def copyToArray(xs: Array[A], start: Int, len: Int): Unit
+   *    @inheritdoc
+   *
+   *    $willNotTerminateInf
+   */
   def copyToArray[B >: A](xs: Array[B], start: Int, len: Int): Unit
 
   /** Displays all elements of this $coll in a string using start, end, and
diff --git a/src/library/scala/collection/IndexedSeqOptimized.scala b/src/library/scala/collection/IndexedSeqOptimized.scala
old mode 100755
new mode 100644
diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala
index 0783bea..8d88b1c 100644
--- a/src/library/scala/collection/Iterator.scala
+++ b/src/library/scala/collection/Iterator.scala
@@ -10,7 +10,7 @@ package scala
 package collection
 
 import mutable.ArrayBuffer
-import scala.annotation.migration
+import scala.annotation.{tailrec, migration}
 import immutable.Stream
 import scala.collection.generic.CanBuildFrom
 import scala.annotation.unchecked.{ uncheckedVariance => uV }
@@ -168,8 +168,10 @@ object Iterator {
   private[scala] final class ConcatIterator[+A](private[this] var current: Iterator[A], initial: Vector[() => Iterator[A]]) extends Iterator[A] {
     @deprecated def this(initial: Vector[() => Iterator[A]]) = this(Iterator.empty, initial) // for binary compatibility
     private[this] var queue: Vector[() => Iterator[A]] = initial
+    private[this] var currentHasNextChecked = false
     // Advance current to the next non-empty iterator
     // current is set to null when all iterators are exhausted
+    @tailrec
     private[this] def advance(): Boolean = {
       if (queue.isEmpty) {
         current = null
@@ -178,20 +180,57 @@ object Iterator {
       else {
         current = queue.head()
         queue = queue.tail
-        current.hasNext || advance()
+        if (current.hasNext) {
+          currentHasNextChecked = true
+          true
+        } else advance()
       }
     }
-    def hasNext = (current ne null) && (current.hasNext || advance())
-    def next()  = if (hasNext) current.next else Iterator.empty.next
+    def hasNext =
+      if (currentHasNextChecked) true
+      else if (current eq null) false
+      else if (current.hasNext) {
+        currentHasNextChecked = true
+        true
+      } else advance()
+    def next()  =
+      if (hasNext) {
+        currentHasNextChecked = false
+        current.next()
+      } else Iterator.empty.next()
 
     override def ++[B >: A](that: => GenTraversableOnce[B]): Iterator[B] =
       new ConcatIterator(current, queue :+ (() => that.toIterator))
   }
 
   private[scala] final class JoinIterator[+A](lhs: Iterator[A], that: => GenTraversableOnce[A]) extends Iterator[A] {
+    private[this] var state = 0 // 0: lhs not checked, 1: lhs has next, 2: switched to rhs
     private[this] lazy val rhs: Iterator[A] = that.toIterator
-    def hasNext = lhs.hasNext || rhs.hasNext
-    def next    = if (lhs.hasNext) lhs.next else rhs.next
+    def hasNext = state match {
+      case 0 =>
+        if (lhs.hasNext) {
+          state = 1
+          true
+        } else {
+          state = 2
+          rhs.hasNext
+        }
+      case 1 => true
+      case _ => rhs.hasNext
+    }
+    def next() = state match {
+      case 0 =>
+        if (lhs.hasNext) lhs.next()
+        else {
+          state = 2
+          rhs.next()
+        }
+      case 1 =>
+        state = 0
+        lhs.next()
+      case _ =>
+        rhs.next()
+    }
 
     override def ++[B >: A](that: => GenTraversableOnce[B]) =
       new ConcatIterator(this, Vector(() => that.toIterator))
@@ -392,8 +431,16 @@ trait Iterator[+A] extends TraversableOnce[A] {
    */
   def flatMap[B](f: A => GenTraversableOnce[B]): Iterator[B] = new AbstractIterator[B] {
     private var cur: Iterator[B] = empty
-    def hasNext: Boolean =
-      cur.hasNext || self.hasNext && { cur = f(self.next()).toIterator; hasNext }
+    private def nextCur() { cur = f(self.next()).toIterator }
+    def hasNext: Boolean = {
+      // Equivalent to cur.hasNext || self.hasNext && { nextCur(); hasNext }
+      // but slightly shorter bytecode (better JVM inlining!)
+      while (!cur.hasNext) {
+        if (!self.hasNext) return false
+        nextCur()
+      }
+      true
+    }
     def next(): B = (if (hasNext) cur else empty).next()
   }
 
@@ -405,6 +452,7 @@ trait Iterator[+A] extends TraversableOnce[A] {
    *  @note    Reuse: $consumesAndProducesIterator
    */
   def filter(p: A => Boolean): Iterator[A] = new AbstractIterator[A] {
+    // TODO 2.12 - Make a full-fledged FilterImpl that will reverse sense of p
     private var hd: A = _
     private var hdDefined: Boolean = false
 
@@ -470,13 +518,27 @@ trait Iterator[+A] extends TraversableOnce[A] {
   *  @note     Reuse: $consumesAndProducesIterator
   */
   @migration("`collect` has changed. The previous behavior can be reproduced with `toSeq`.", "2.8.0")
-  def collect[B](pf: PartialFunction[A, B]): Iterator[B] = {
-    val self = buffered
-    new AbstractIterator[B] {
-      private def skip() = while (self.hasNext && !pf.isDefinedAt(self.head)) self.next()
-      def hasNext = { skip(); self.hasNext }
-      def next() = { skip(); pf(self.next()) }
+  def collect[B](pf: PartialFunction[A, B]): Iterator[B] = new AbstractIterator[B] {
+    // Manually buffer to avoid extra layer of wrapping with buffered
+    private[this] var hd: A = _
+    
+    // Little state machine to keep track of where we are
+    // Seek = 0; Found = 1; Empty = -1
+    // Not in vals because scalac won't make them static (@inline def only works with -optimize)
+    // BE REALLY CAREFUL TO KEEP COMMENTS AND NUMBERS IN SYNC!
+    private[this] var status = 0/*Seek*/
+    
+    def hasNext = {
+      while (status == 0/*Seek*/) {
+        if (self.hasNext) {
+          hd = self.next()
+          if (pf.isDefinedAt(hd)) status = 1/*Found*/
+        }
+        else status = -1/*Empty*/
+      }
+      status == 1/*Found*/
     }
+    def next() = if (hasNext) { status = 0/*Seek*/; pf(hd) } else Iterator.empty.next()
   }
 
   /** Produces a collection containing cumulative results of applying the
@@ -578,8 +640,6 @@ trait Iterator[+A] extends TraversableOnce[A] {
    *  @note    Reuse: $consumesOneAndProducesTwoIterators
    */
   def span(p: A => Boolean): (Iterator[A], Iterator[A]) = {
-    val self = buffered
-
     /*
      * Giving a name to following iterator (as opposed to trailing) because
      * anonymous class is represented as a structural type that trailing
@@ -587,32 +647,98 @@ trait Iterator[+A] extends TraversableOnce[A] {
      * handling of structural calls. It's not what's intended here.
      */
     class Leading extends AbstractIterator[A] {
-      val lookahead = new mutable.Queue[A]
-      def advance() = {
-        self.hasNext && p(self.head) && {
-          lookahead += self.next
-          true
-        }
+      var lookahead: mutable.Queue[A] = null
+      var hd: A = _
+      /* Status is kept with magic numbers
+       *   1 means next element is in hd and we're still reading into this iterator
+       *   0 means we're still reading but haven't found a next element
+       *   -1 means we are done reading into the iterator, so we must rely on lookahead
+       *   -2 means we are done but have saved hd for the other iterator to use as its first element
+       */
+      var status = 0
+      private def store(a: A) {
+        if (lookahead == null) lookahead = new mutable.Queue[A]
+        lookahead += a
       }
-      def finish() = {
-        while (advance()) ()
+      def hasNext = {
+        if (status < 0) (lookahead ne null) && lookahead.nonEmpty
+        else if (status > 0) true
+        else {
+          if (self.hasNext) {
+            hd = self.next()
+            status = if (p(hd)) 1 else -2
+          }
+          else status = -1
+          status > 0
+        }
       }
-      def hasNext = lookahead.nonEmpty || advance()
       def next() = {
-        if (lookahead.isEmpty)
-          advance()
-
-        lookahead.dequeue()
+        if (hasNext) {
+          if (status == 1) { status = 0; hd }
+          else lookahead.dequeue()
+        }
+        else empty.next()
+      }
+      def finish(): Boolean = {
+        if (status == -1) false
+        else if (status == -2) {
+          status = -1
+          true
+        }
+        else {
+          if (status == 1) store(hd)
+          while (self.hasNext) {
+            val a = self.next()
+            if (p(a)) store(a)
+            else {
+              hd = a
+              status = -1
+              return true
+            }
+          }
+          false
+        }
       }
     }
+    
     val leading = new Leading
+    
     val trailing = new AbstractIterator[A] {
-      private lazy val it = {
-        leading.finish()
-        self
+      private[this] var myLeading = leading
+      /* Status flags meanings:
+       *   -1 not yet accesssed
+       *   0 single element waiting in leading
+       *   1 defer to self
+       */
+      private[this] var status = -1
+      def hasNext = {
+        if (status > 0) self.hasNext
+        else {
+          if (status == 0) true
+          else if (myLeading.finish()) {
+            status = 0
+            true
+          }
+          else {
+            status = 1
+            myLeading = null
+            self.hasNext
+          }
+        }
+      }
+      def next() = {
+        if (hasNext) {
+          if (status > 0) self.next()
+          else {
+            status = 1
+            val ans = myLeading.hd
+            myLeading = null
+            ans
+          }
+        }
+        else Iterator.empty.next()
       }
-      def hasNext = it.hasNext
-      def next() = it.next()
+            
       override def toString = "unknown-if-empty iterator"
     }
 
@@ -626,18 +752,35 @@ trait Iterator[+A] extends TraversableOnce[A] {
    *  @return  an iterator consisting of the remaining elements
    *  @note    Reuse: $consumesAndProducesIterator
    */
-  def dropWhile(p: A => Boolean): Iterator[A] = {
-    val self = buffered
-    new AbstractIterator[A] {
-      var dropped = false
-      private def skip() =
-        if (!dropped) {
-          while (self.hasNext && p(self.head)) self.next()
-          dropped = true
+  def dropWhile(p: A => Boolean): Iterator[A] = new AbstractIterator[A] {
+    // Magic value: -1 = hasn't dropped, 0 = found first, 1 = defer to parent iterator
+    private[this] var status = -1
+    // Local buffering to avoid double-wrap with .buffered
+    private[this] var fst: A = _
+    def hasNext: Boolean =
+      if (status == 1) self.hasNext
+      else if (status == 0) true
+      else {
+        while (self.hasNext) {
+          val a = self.next()
+          if (!p(a)) {
+            fst = a
+            status = 0
+            return true
+          }
         }
-      def hasNext = { skip(); self.hasNext }
-      def next() = { skip(); self.next() }
-    }
+        status = 1
+        false
+      }
+    def next() = 
+      if (hasNext) {
+        if (status == 1) self.next()
+        else {
+          status = 1
+          fst
+        }
+      }
+      else Iterator.empty.next()
   }
 
   /** Creates an iterator formed from this iterator and another iterator
@@ -747,7 +890,7 @@ trait Iterator[+A] extends TraversableOnce[A] {
    *  @usecase def foreach(f: A => Unit): Unit
    *    @inheritdoc
    */
-  def foreach[U](f: A =>  U) { while (hasNext) f(next()) }
+  def foreach[U](f: A => U) { while (hasNext) f(next()) }
 
   /** Tests whether a predicate holds for all values produced by this iterator.
    *  $mayNotTerminateInf
@@ -785,7 +928,7 @@ trait Iterator[+A] extends TraversableOnce[A] {
    *               is equal (as determined by `==`) to `elem`, `false` otherwise.
    *  @note        Reuse: $consumesIterator
    */
-  def contains(elem: Any): Boolean = exists(_ == elem)
+  def contains(elem: Any): Boolean = exists(_ == elem)    // Note--this seems faster than manual inlining!
 
   /** Finds the first value produced by the iterator satisfying a
    *  predicate, if any.
@@ -797,12 +940,11 @@ trait Iterator[+A] extends TraversableOnce[A] {
    *  @note    Reuse: $consumesIterator
    */
   def find(p: A => Boolean): Option[A] = {
-    var res: Option[A] = None
-    while (res.isEmpty && hasNext) {
-      val e = next()
-      if (p(e)) res = Some(e)
+    while (hasNext) {
+      val a = next()
+      if (p(a)) return Some(a)
     }
-    res
+    None
   }
 
   /** Returns the index of the first produced value satisfying a predicate, or -1.
@@ -815,15 +957,11 @@ trait Iterator[+A] extends TraversableOnce[A] {
    */
   def indexWhere(p: A => Boolean): Int = {
     var i = 0
-    var found = false
-    while (!found && hasNext) {
-      if (p(next())) {
-        found = true
-      } else {
-        i += 1
-      }
+    while (hasNext) {
+      if (p(next())) return i
+      i += 1
     }
-    if (found) i else -1
+    -1
   }
 
   /** Returns the index of the first occurrence of the specified
@@ -837,15 +975,11 @@ trait Iterator[+A] extends TraversableOnce[A] {
    */
   def indexOf[B >: A](elem: B): Int = {
     var i = 0
-    var found = false
-    while (!found && hasNext) {
-      if (next() == elem) {
-        found = true
-      } else {
-        i += 1
-      }
+    while (hasNext) {
+      if (next() == elem) return i
+      i += 1
     }
-    if (found) i else -1
+    -1
   }
 
   /** Creates a buffered iterator from this iterator.
diff --git a/src/library/scala/collection/JavaConverters.scala b/src/library/scala/collection/JavaConverters.scala
old mode 100755
new mode 100644
index 875f6e1..86e86d4
--- a/src/library/scala/collection/JavaConverters.scala
+++ b/src/library/scala/collection/JavaConverters.scala
@@ -52,7 +52,10 @@ import convert._
  *  - `scala.collection.Set` => `java.util.Set`
  *  - `scala.collection.Map` => `java.util.Map`
  *
- *  @author Martin Odersky
+ *  The following one way conversion is provided via `asScala`:
+ *
+ *  - `java.util.Properties` => `scala.collection.mutable.Map`
+ *
  *  @since  2.8.1
  */
 object JavaConverters extends DecorateAsJava with DecorateAsScala
diff --git a/src/library/scala/collection/LinearSeqOptimized.scala b/src/library/scala/collection/LinearSeqOptimized.scala
old mode 100755
new mode 100644
index 9c336e8..b7af884
--- a/src/library/scala/collection/LinearSeqOptimized.scala
+++ b/src/library/scala/collection/LinearSeqOptimized.scala
@@ -67,7 +67,7 @@ trait LinearSeqOptimized[+A, +Repr <: LinearSeqOptimized[A, Repr]] extends Linea
   }
 
   override /*IterableLike*/
-  def foreach[B](f: A => B) {
+  def foreach[U](f: A => U) {
     var these = this
     while (!these.isEmpty) {
       f(these.head)
@@ -117,20 +117,20 @@ trait LinearSeqOptimized[+A, +Repr <: LinearSeqOptimized[A, Repr]] extends Linea
   }
 
   override /*TraversableLike*/
-  def foldLeft[B](z: B)(f: (B, A) => B): B = {
+  def foldLeft[B](z: B)(@deprecatedName('f) op: (B, A) => B): B = {
     var acc = z
     var these = this
     while (!these.isEmpty) {
-      acc = f(acc, these.head)
+      acc = op(acc, these.head)
       these = these.tail
     }
     acc
   }
 
   override /*IterableLike*/
-  def foldRight[B](z: B)(f: (A, B) => B): B =
+  def foldRight[B](z: B)(@deprecatedName('f) op: (A, B) => B): B =
     if (this.isEmpty) z
-    else f(head, tail.foldRight(z)(f))
+    else op(head, tail.foldRight(z)(op))
 
   override /*TraversableLike*/
   def reduceLeft[B >: A](f: (B, A) => B): B =
diff --git a/src/library/scala/collection/MapLike.scala b/src/library/scala/collection/MapLike.scala
index d133400..99ed673 100644
--- a/src/library/scala/collection/MapLike.scala
+++ b/src/library/scala/collection/MapLike.scala
@@ -171,7 +171,7 @@ self =>
     def + (elem: A): Set[A] = (Set[A]() ++ this + elem).asInstanceOf[Set[A]] // !!! concrete overrides abstract problem
     def - (elem: A): Set[A] = (Set[A]() ++ this - elem).asInstanceOf[Set[A]] // !!! concrete overrides abstract problem
     override def size = self.size
-    override def foreach[C](f: A => C) = self.keysIterator foreach f
+    override def foreach[U](f: A => U) = self.keysIterator foreach f
   }
 
   /** Creates an iterator for all keys.
@@ -203,7 +203,7 @@ self =>
   protected class DefaultValuesIterable extends AbstractIterable[B] with Iterable[B] with Serializable {
     def iterator = valuesIterator
     override def size = self.size
-    override def foreach[C](f: B => C) = self.valuesIterator foreach f
+    override def foreach[U](f: B => U) = self.valuesIterator foreach f
   }
 
   /** Creates an iterator for all values in this map.
@@ -228,7 +228,7 @@ self =>
     throw new NoSuchElementException("key not found: " + key)
 
   protected class FilteredKeys(p: A => Boolean) extends AbstractMap[A, B] with DefaultMap[A, B] {
-    override def foreach[C](f: ((A, B)) => C): Unit = for (kv <- self) if (p(kv._1)) f(kv)
+    override def foreach[U](f: ((A, B)) => U): Unit = for (kv <- self) if (p(kv._1)) f(kv)
     def iterator = self.iterator.filter(kv => p(kv._1))
     override def contains(key: A) = self.contains(key) && p(key)
     def get(key: A) = if (!p(key)) None else self.get(key)
@@ -242,7 +242,7 @@ self =>
   def filterKeys(p: A => Boolean): Map[A, B] = new FilteredKeys(p)
 
   protected class MappedValues[C](f: B => C) extends AbstractMap[A, C] with DefaultMap[A, C] {
-    override def foreach[D](g: ((A, C)) => D): Unit = for ((k, v) <- self) g((k, f(v)))
+    override def foreach[U](g: ((A, C)) => U): Unit = for ((k, v) <- self) g((k, f(v)))
     def iterator = for ((k, v) <- self.iterator) yield (k, f(v))
     override def size = self.size
     override def contains(key: A) = self.contains(key)
diff --git a/src/library/scala/collection/Searching.scala b/src/library/scala/collection/Searching.scala
index b68124b..25e8b5e 100644
--- a/src/library/scala/collection/Searching.scala
+++ b/src/library/scala/collection/Searching.scala
@@ -36,12 +36,12 @@ object Searching {
 
   class SearchImpl[A, Repr](val coll: SeqLike[A, Repr]) {
     /** Search the sorted sequence for a specific element. If the sequence is an
-      * `IndexedSeq`, a binary search is used. Otherwise, a linear search is used.
+      * `IndexedSeqLike`, a binary search is used. Otherwise, a linear search is used.
       *
       * The sequence should be sorted with the same `Ordering` before calling; otherwise,
       * the results are undefined.
       *
-      * @see [[scala.collection.IndexedSeq]]
+      * @see [[scala.collection.IndexedSeqLike]]
       * @see [[scala.math.Ordering]]
       * @see [[scala.collection.SeqLike]], method `sorted`
       *
@@ -54,18 +54,18 @@ object Searching {
       */
     final def search[B >: A](elem: B)(implicit ord: Ordering[B]): SearchResult =
       coll match {
-        case _: IndexedSeq[A] => binarySearch(elem, 0, coll.length)(ord)
+        case _: IndexedSeqLike[A, Repr] => binarySearch(elem, 0, coll.length)(ord)
         case _ => linearSearch(coll.view, elem, 0)(ord)
       }
 
     /** Search within an interval in the sorted sequence for a specific element. If the
-      * sequence is an IndexedSeq, a binary search is used. Otherwise, a linear search
+      * sequence is an `IndexedSeqLike`, a binary search is used. Otherwise, a linear search
       * is used.
       *
       * The sequence should be sorted with the same `Ordering` before calling; otherwise,
       * the results are undefined.
       *
-      * @see [[scala.collection.IndexedSeq]]
+      * @see [[scala.collection.IndexedSeqLike]]
       * @see [[scala.math.Ordering]]
       * @see [[scala.collection.SeqLike]], method `sorted`
       *
@@ -81,7 +81,7 @@ object Searching {
     final def search[B >: A](elem: B, from: Int, to: Int)
     (implicit ord: Ordering[B]): SearchResult =
       coll match {
-        case _: IndexedSeq[A] => binarySearch(elem, from, to)(ord)
+        case _: IndexedSeqLike[A, Repr] => binarySearch(elem, from, to)(ord)
         case _ => linearSearch(coll.view(from, to), elem, from)(ord)
       }
 
diff --git a/src/library/scala/collection/SeqLike.scala b/src/library/scala/collection/SeqLike.scala
index 329273d..b775480 100644
--- a/src/library/scala/collection/SeqLike.scala
+++ b/src/library/scala/collection/SeqLike.scala
@@ -413,7 +413,7 @@ trait SeqLike[+A, +Repr] extends Any with IterableLike[A, Repr] with GenSeqLike[
    *    @inheritdoc
    *
    *    Another way to express this
-   *    is that `xs union ys` computes the order-presevring multi-set union of `xs` and `ys`.
+   *    is that `xs union ys` computes the order-preserving multi-set union of `xs` and `ys`.
    *    `union` is hence a counter-part of `diff` and `intersect` which also work on multi-sets.
    *
    *    $willNotTerminateInf
@@ -447,9 +447,11 @@ trait SeqLike[+A, +Repr] extends Any with IterableLike[A, Repr] with GenSeqLike[
   def diff[B >: A](that: GenSeq[B]): Repr = {
     val occ = occCounts(that.seq)
     val b = newBuilder
-    for (x <- this)
-      if (occ(x) == 0) b += x
-      else occ(x) -= 1
+    for (x <- this) {
+      val ox = occ(x)  // Avoid multiple map lookups
+      if (ox == 0) b += x
+      else occ(x) = ox - 1
+    }
     b.result()
   }
 
@@ -476,11 +478,13 @@ trait SeqLike[+A, +Repr] extends Any with IterableLike[A, Repr] with GenSeqLike[
   def intersect[B >: A](that: GenSeq[B]): Repr = {
     val occ = occCounts(that.seq)
     val b = newBuilder
-    for (x <- this)
-      if (occ(x) > 0) {
+    for (x <- this) {
+      val ox = occ(x)  // Avoid multiple map lookups
+      if (ox > 0) {
         b += x
-        occ(x) -= 1
+        occ(x) = ox - 1
       }
+    }
     b.result()
   }
 
@@ -509,22 +513,35 @@ trait SeqLike[+A, +Repr] extends Any with IterableLike[A, Repr] with GenSeqLike[
 
   def patch[B >: A, That](from: Int, patch: GenSeq[B], replaced: Int)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
     val b = bf(repr)
-    val (prefix, rest) = this.splitAt(from)
-    b ++= toCollection(prefix)
+    var i = 0
+    val it = this.iterator
+    while (i < from && it.hasNext) {
+      b += it.next()
+      i += 1
+    }
     b ++= patch.seq
-    b ++= toCollection(rest).view drop replaced
+    i = replaced
+    while (i > 0 && it.hasNext) {
+      it.next()
+      i -= 1
+    }
+    while (it.hasNext) b += it.next()
     b.result()
   }
 
   def updated[B >: A, That](index: Int, elem: B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
     if (index < 0) throw new IndexOutOfBoundsException(index.toString)
     val b = bf(repr)
-    val (prefix, rest) = this.splitAt(index)
-    val restColl = toCollection(rest)
-    if (restColl.isEmpty) throw new IndexOutOfBoundsException(index.toString)
-    b ++= toCollection(prefix)
+    var i = 0
+    val it = this.iterator
+    while (i < index && it.hasNext) {
+      b += it.next()
+      i += 1
+    }
+    if (!it.hasNext) throw new IndexOutOfBoundsException(index.toString)
     b += elem
-    b ++= restColl.view.tail
+    it.next()
+    while (it.hasNext) b += it.next()
     b.result()
   }
 
@@ -544,8 +561,9 @@ trait SeqLike[+A, +Repr] extends Any with IterableLike[A, Repr] with GenSeqLike[
 
   def padTo[B >: A, That](len: Int, elem: B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
     val b = bf(repr)
-    b.sizeHint(length max len)
-    var diff = len - length
+    val L = length
+    b.sizeHint(math.max(L, len))
+    var diff = len - L
     b ++= thisCollection
     while (diff > 0) {
       b += elem
@@ -617,16 +635,23 @@ trait SeqLike[+A, +Repr] extends Any with IterableLike[A, Repr] with GenSeqLike[
    */
   def sorted[B >: A](implicit ord: Ordering[B]): Repr = {
     val len = this.length
-    val arr = new ArraySeq[A](len)
-    var i = 0
-    for (x <- this) {
-      arr(i) = x
-      i += 1
-    }
-    java.util.Arrays.sort(arr.array, ord.asInstanceOf[Ordering[Object]])
     val b = newBuilder
-    b.sizeHint(len)
-    for (x <- arr) b += x
+    if (len == 1) b ++= this
+    else if (len > 1) {
+      b.sizeHint(len)
+      val arr = new Array[AnyRef](len)  // Previously used ArraySeq for more compact but slower code
+      var i = 0
+      for (x <- this) {
+        arr(i) = x.asInstanceOf[AnyRef]
+        i += 1
+      }
+      java.util.Arrays.sort(arr, ord.asInstanceOf[Ordering[Object]])
+      i = 0
+      while (i < arr.length) {
+        b += arr(i).asInstanceOf[A]
+        i += 1
+      }
+    }
     b.result()
   }
 
diff --git a/src/library/scala/collection/Traversable.scala b/src/library/scala/collection/Traversable.scala
index a35750a..8145eaa 100644
--- a/src/library/scala/collection/Traversable.scala
+++ b/src/library/scala/collection/Traversable.scala
@@ -38,7 +38,7 @@ trait Traversable[+A] extends TraversableLike[A, Traversable[A]]
   override def remove(p: A => Boolean): Traversable[A]
   override def partition(p: A => Boolean): (Traversable[A], Traversable[A])
   override def groupBy[K](f: A => K): Map[K, Traversable[A]]
-  override def foreach[U](f: A =>  U): Unit
+  override def foreach[U](f: A => U): Unit
   override def forall(p: A => Boolean): Boolean
   override def exists(p: A => Boolean): Boolean
   override def count(p: A => Boolean): Int
diff --git a/src/library/scala/collection/TraversableLike.scala b/src/library/scala/collection/TraversableLike.scala
index 32d31f0..bbbc33b 100644
--- a/src/library/scala/collection/TraversableLike.scala
+++ b/src/library/scala/collection/TraversableLike.scala
@@ -54,7 +54,7 @@ import scala.language.higherKinds
  *  `HashMap` of objects. The traversal order for hash maps will
  *  depend on the hash codes of its elements, and these hash codes might
  *  differ from one run to the next. By contrast, a `LinkedHashMap`
- *  is ordered because it's `foreach` method visits elements in the
+ *  is ordered because its `foreach` method visits elements in the
  *  order they were inserted into the `HashMap`.
  *
  *  @author Martin Odersky
@@ -138,17 +138,6 @@ trait TraversableLike[+A, +Repr] extends Any
     result
   }
 
-  /** Tests whether this $coll is known to have a finite size.
-   *  All strict collections are known to have finite size. For a non-strict
-   *  collection such as `Stream`, the predicate returns `'''true'''` if all
-   *  elements have been computed. It returns `'''false'''` if the stream is
-   *  not yet evaluated to the end.
-   *
-   *  Note: many collection methods will not work on collections of infinite sizes.
-   *
-   *  @return  `'''true'''` if this collection is known to have finite size,
-   *           `'''false'''` otherwise.
-   */
   def hasDefiniteSize = true
 
   def ++[B >: A, That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
@@ -340,14 +329,6 @@ trait TraversableLike[+A, +Repr] extends Any
     b.result
   }
 
-  /** Tests whether a predicate holds for all elements of this $coll.
-   *
-   *  $mayNotTerminateInf
-   *
-   *  @param   p     the predicate used to test elements.
-   *  @return        `true`  if this $coll is empty, otherwise `true` if the given predicate `p`
-    *                holds for all elements of this $coll, otherwise `false`.
-   */
   def forall(p: A => Boolean): Boolean = {
     var result = true
     breakable {
@@ -357,7 +338,7 @@ trait TraversableLike[+A, +Repr] extends Any
     result
   }
 
-  /** Tests whether a predicate holds for some of the elements of this $coll.
+  /** Tests whether a predicate holds for at least one element of this $coll.
    *
    *  $mayNotTerminateInf
    *
@@ -374,15 +355,6 @@ trait TraversableLike[+A, +Repr] extends Any
     result
   }
 
-  /** Finds the first element of the $coll satisfying a predicate, if any.
-   *
-   *  $mayNotTerminateInf
-   *  $orderDependent
-   *
-   *  @param p    the predicate used to test elements.
-   *  @return     an option value containing the first element in the $coll
-   *              that satisfies `p`, or `None` if none exists.
-   */
   def find(p: A => Boolean): Option[A] = {
     var result: Option[A] = None
     breakable {
@@ -594,23 +566,6 @@ trait TraversableLike[+A, +Repr] extends Any
    */
   def inits: Iterator[Repr] = iterateUntilEmpty(_.init)
 
-  /** Copies elements of this $coll to an array.
-   *  Fills the given array `xs` with at most `len` elements of
-   *  this $coll, starting at position `start`.
-   *  Copying will stop once either the end of the current $coll is reached,
-   *  or the end of the array is reached, or `len` elements have been copied.
-   *
-   *  @param  xs     the array to fill.
-   *  @param  start  the starting index.
-   *  @param  len    the maximal number of elements to copy.
-   *  @tparam B      the type of the elements of the array.
-   *
-   *
-   *  @usecase def copyToArray(xs: Array[A], start: Int, len: Int): Unit
-   *    @inheritdoc
-   *
-   *    $willNotTerminateInf
-   */
   def copyToArray[B >: A](xs: Array[B], start: Int, len: Int) {
     var i = start
     val end = (start + len) min xs.length
@@ -625,7 +580,7 @@ trait TraversableLike[+A, +Repr] extends Any
 
   @deprecatedOverriding("Enforce contract of toTraversable that if it is Traversable it returns itself.", "2.11.0")
   def toTraversable: Traversable[A] = thisCollection
-  
+
   def toIterator: Iterator[A] = toStream.iterator
   def toStream: Stream[A] = toBuffer.toStream
   // Override to provide size hint.
diff --git a/src/library/scala/collection/TraversableOnce.scala b/src/library/scala/collection/TraversableOnce.scala
index 2eab580..75c0d82 100644
--- a/src/library/scala/collection/TraversableOnce.scala
+++ b/src/library/scala/collection/TraversableOnce.scala
@@ -38,9 +38,10 @@ import scala.reflect.ClassTag
  *  `Traversables`, such as folds, conversions, and other operations which
  *  traverse some or all of the elements and return a derived value.
  *  Directly subclassing `TraversableOnce` is not recommended - instead,
- *  consider declaring an `Iterator` with a `next` and `hasNext` method,
- *  creating an `Iterator` with one of the methods on the `Iterator` object,
- *  or declaring a subclass of `Traversable`.
+ *  consider declaring an `Iterator` with a `next` and `hasNext` method or
+ *  creating an `Iterator` with one of the methods on the `Iterator` object.
+ *  Consider declaring a subclass of `Traversable` instead if the elements
+ *  can be traversed repeatedly.
  *
  *  @define coll traversable or iterator
  *  @define orderDependent
@@ -61,7 +62,8 @@ import scala.reflect.ClassTag
 trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
   self =>
 
-  /** Self-documenting abstract methods. */
+  //TODO 2.12: Remove these methods. They are already defined in GenTraversableOnce
+  /* Self-documenting abstract methods. */
   def foreach[U](f: A => U): Unit
   def isEmpty: Boolean
   def hasDefiniteSize: Boolean
@@ -128,8 +130,21 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
    *  @example    `Seq("a", 1, 5L).collectFirst({ case x: Int => x*10 }) = Some(10)`
    */
   def collectFirst[B](pf: PartialFunction[A, B]): Option[B] = {
-    // make sure to use an iterator or `seq`
-    self.toIterator.foreach(pf.runWith(b => return Some(b)))
+    // TODO 2.12 -- move out alternate implementations into child classes
+    val i: Iterator[A] = self match {
+      case it: Iterator[A] => it
+      case _: GenIterable[_] => self.toIterator   // If it might be parallel, be sure to .seq or use iterator!
+      case _ =>                                   // Not parallel, not iterable--just traverse
+        self.foreach(pf.runWith(b => return Some(b)))
+        return None
+    }
+    // Presumably the fastest way to get in and out of a partial function is for a sentinel function to return itself
+    // (Tested to be lower-overhead than runWith.  Would be better yet to not need to (formally) allocate it--change in 2.12.)
+    val sentinel: Function1[A, Any] = new scala.runtime.AbstractFunction1[A, Any]{ def apply(a: A) = this }
+    while (i.hasNext) {
+      val x = pf.applyOrElse(i.next, sentinel)
+      if (x.asInstanceOf[AnyRef] ne sentinel) return Some(x.asInstanceOf[B])
+    }
     None
   }
 
@@ -321,10 +336,10 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
    * {{{
    *      scala> val a = List(1,2,3,4)
    *      a: List[Int] = List(1, 2, 3, 4)
-   *      
+   *
    *      scala> val b = new StringBuilder()
-   *      b: StringBuilder = 
-   *      
+   *      b: StringBuilder =
+   *
    *      scala> a.addString(b , "List(" , ", " , ")")
    *      res5: StringBuilder = List(1, 2, 3, 4)
    * }}}
@@ -363,7 +378,7 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
    * {{{
    *      scala> val a = List(1,2,3,4)
    *      a: List[Int] = List(1, 2, 3, 4)
-   *      
+   *
    *      scala> val b = new StringBuilder()
    *      b: StringBuilder =
    *
@@ -386,7 +401,7 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
    * {{{
    *      scala> val a = List(1,2,3,4)
    *      a: List[Int] = List(1, 2, 3, 4)
-   *      
+   *
    *      scala> val b = new StringBuilder()
    *      b: StringBuilder =
    *
diff --git a/src/library/scala/collection/TraversableProxyLike.scala b/src/library/scala/collection/TraversableProxyLike.scala
index 4399dbc..fa470ea 100644
--- a/src/library/scala/collection/TraversableProxyLike.scala
+++ b/src/library/scala/collection/TraversableProxyLike.scala
@@ -28,7 +28,7 @@ import scala.reflect.ClassTag
 trait TraversableProxyLike[+A, +Repr <: TraversableLike[A, Repr] with Traversable[A]] extends TraversableLike[A, Repr] with Proxy {
   def self: Repr
 
-  override def foreach[B](f: A => B): Unit = self.foreach(f)
+  override def foreach[U](f: A => U): Unit = self.foreach(f)
   override def isEmpty: Boolean = self.isEmpty
   override def nonEmpty: Boolean = self.nonEmpty
   override def size: Int = self.size
diff --git a/src/library/scala/collection/concurrent/Map.scala b/src/library/scala/collection/concurrent/Map.scala
index 2eea15b..cfb567a 100644
--- a/src/library/scala/collection/concurrent/Map.scala
+++ b/src/library/scala/collection/concurrent/Map.scala
@@ -49,7 +49,7 @@ trait Map[A, B] extends scala.collection.mutable.Map[A, B] {
   def putIfAbsent(k: A, v: B): Option[B]
 
   /**
-   * Removes the entry for the specified key if its currently mapped to the
+   * Removes the entry for the specified key if it's currently mapped to the
    * specified value.
    *
    * $atomicop
diff --git a/src/library/scala/collection/convert/DecorateAsJava.scala b/src/library/scala/collection/convert/DecorateAsJava.scala
index 6658b6f..e6aa5da 100644
--- a/src/library/scala/collection/convert/DecorateAsJava.scala
+++ b/src/library/scala/collection/convert/DecorateAsJava.scala
@@ -16,7 +16,7 @@ import WrapAsJava._
 import scala.language.implicitConversions
 
 
-/** A collection of decorators that allow to convert between
+/** A collection of decorators that allow converting between
  *  Scala and Java collections using `asScala` and `asJava` methods.
  *
  *  The following conversions are supported via `asJava`, `asScala`
@@ -38,8 +38,8 @@ import scala.language.implicitConversions
  *    val sl2 : scala.collection.mutable.Buffer[Int] = jl.asScala
  *    assert(sl eq sl2)
  *  }}}
- *  The following conversions also are supported, but the
- *  direction Scala to Java is done my a more specifically named method:
+ *  The following conversions are also supported, but the
+ *  direction from Scala to Java is done by the more specifically named methods:
  *  `asJavaCollection`, `asJavaEnumeration`, `asJavaDictionary`.
  *
  *  - `scala.collection.Iterable` <=> `java.util.Collection`
@@ -53,10 +53,12 @@ import scala.language.implicitConversions
  *  - `scala.collection.Set` => `java.util.Set`
  *  - `scala.collection.Map` => `java.util.Map`
  *
- *  @author Martin Odersky
+ *  The following one way conversion is provided via `asScala`:
+ *
+ *  - `java.util.Properties` => `scala.collection.mutable.Map`
+ *
  *  @since  2.8.1
  */
-
 trait DecorateAsJava {
   /**
    * Adds an `asJava` method that implicitly converts a Scala `Iterator` to a
diff --git a/src/library/scala/collection/convert/Wrappers.scala b/src/library/scala/collection/convert/Wrappers.scala
index 9f9732c..e829a02 100644
--- a/src/library/scala/collection/convert/Wrappers.scala
+++ b/src/library/scala/collection/convert/Wrappers.scala
@@ -265,17 +265,11 @@ private[collection] trait Wrappers {
     def +=(kv: (A, B)): this.type = { underlying.put(kv._1, kv._2); this }
     def -=(key: A): this.type = { underlying remove key; this }
 
-    override def put(k: A, v: B): Option[B] = {
-      val r = underlying.put(k, v)
-      if (r != null) Some(r) else None
-    }
+    override def put(k: A, v: B): Option[B] = Option(underlying.put(k, v))
 
     override def update(k: A, v: B) { underlying.put(k, v) }
 
-    override def remove(k: A): Option[B] = {
-      val r = underlying remove k
-      if (r != null) Some(r) else None
-    }
+    override def remove(k: A): Option[B] = Option(underlying remove k)
 
     def iterator: Iterator[(A, B)] = new AbstractIterator[(A, B)] {
       val ui = underlying.entrySet.iterator
@@ -326,25 +320,15 @@ private[collection] trait Wrappers {
     * are not guaranteed to be atomic.
     */
   case class JConcurrentMapWrapper[A, B](underlying: juc.ConcurrentMap[A, B]) extends mutable.AbstractMap[A, B] with JMapWrapperLike[A, B, JConcurrentMapWrapper[A, B]] with concurrent.Map[A, B] {
-    override def get(k: A) = {
-      val v = underlying get k
-      if (v != null) Some(v)
-      else None
-    }
+    override def get(k: A) = Option(underlying get k)
 
     override def empty = new JConcurrentMapWrapper(new juc.ConcurrentHashMap[A, B])
 
-    def putIfAbsent(k: A, v: B): Option[B] = {
-      val r = underlying.putIfAbsent(k, v)
-      if (r != null) Some(r) else None
-    }
+    def putIfAbsent(k: A, v: B): Option[B] = Option(underlying.putIfAbsent(k, v))
 
     def remove(k: A, v: B): Boolean = underlying.remove(k, v)
 
-    def replace(k: A, v: B): Option[B] = {
-      val prev = underlying.replace(k, v)
-      if (prev != null) Some(prev) else None
-    }
+    def replace(k: A, v: B): Option[B] = Option(underlying.replace(k, v))
 
     def replace(k: A, oldvalue: B, newvalue: B): Boolean =
       underlying.replace(k, oldvalue, newvalue)
@@ -380,25 +364,16 @@ private[collection] trait Wrappers {
   case class JDictionaryWrapper[A, B](underlying: ju.Dictionary[A, B]) extends mutable.AbstractMap[A, B] with mutable.Map[A, B] {
     override def size: Int = underlying.size
 
-    def get(k: A) = {
-      val v = underlying get k
-      if (v != null) Some(v) else None
-    }
+    def get(k: A) = Option(underlying get k)
 
     def +=(kv: (A, B)): this.type = { underlying.put(kv._1, kv._2); this }
     def -=(key: A): this.type = { underlying remove key; this }
 
-    override def put(k: A, v: B): Option[B] = {
-      val r = underlying.put(k, v)
-      if (r != null) Some(r) else None
-    }
+    override def put(k: A, v: B): Option[B] = Option(underlying.put(k, v))
 
     override def update(k: A, v: B) { underlying.put(k, v) }
 
-    override def remove(k: A): Option[B] = {
-      val r = underlying remove k
-      if (r != null) Some(r) else None
-    }
+    override def remove(k: A): Option[B] = Option(underlying remove k)
 
     def iterator = enumerationAsScalaIterator(underlying.keys) map (k => (k, underlying get k))
 
diff --git a/src/library/scala/collection/generic/FilterMonadic.scala b/src/library/scala/collection/generic/FilterMonadic.scala
old mode 100755
new mode 100644
diff --git a/src/library/scala/collection/generic/HasNewBuilder.scala b/src/library/scala/collection/generic/HasNewBuilder.scala
old mode 100755
new mode 100644
diff --git a/src/library/scala/collection/generic/MutableSortedSetFactory.scala b/src/library/scala/collection/generic/MutableSortedSetFactory.scala
index 0339a52..9bb12c2 100644
--- a/src/library/scala/collection/generic/MutableSortedSetFactory.scala
+++ b/src/library/scala/collection/generic/MutableSortedSetFactory.scala
@@ -24,7 +24,7 @@ abstract class MutableSortedSetFactory[CC[A] <: mutable.SortedSet[A] with Sorted
 
   /**
    * mutable.SetBuilder uses '+' which is not a primitive for anything extending mutable.SetLike,
-   * this causes serious perfomances issues since each time 'elems = elems + x'
+   * this causes serious performance issues since each time 'elems = elems + x'
    * is evaluated elems is cloned (which is O(n)).
    *
    * Fortunately GrowingBuilder comes to rescue.
diff --git a/src/library/scala/collection/generic/Sorted.scala b/src/library/scala/collection/generic/Sorted.scala
index a0b0e13..b2e63da 100644
--- a/src/library/scala/collection/generic/Sorted.scala
+++ b/src/library/scala/collection/generic/Sorted.scala
@@ -36,7 +36,7 @@ trait Sorted[K, +This <: Sorted[K, This]] {
   /** Creates a ranged projection of this collection. Any mutations in the
    *  ranged projection will update this collection and vice versa.
    *
-   *  Note: keys are not garuanteed to be consistent between this collection
+   *  Note: keys are not guaranteed to be consistent between this collection
    *  and the projection. This is the case for buffers where indexing is
    *  relative to the projection.
    *
diff --git a/src/library/scala/collection/generic/TraversableForwarder.scala b/src/library/scala/collection/generic/TraversableForwarder.scala
index 1d7974f..359ea40 100644
--- a/src/library/scala/collection/generic/TraversableForwarder.scala
+++ b/src/library/scala/collection/generic/TraversableForwarder.scala
@@ -32,7 +32,7 @@ trait TraversableForwarder[+A] extends Traversable[A] {
   /** The traversable object to which calls are forwarded. */
   protected def underlying: Traversable[A]
 
-  override def foreach[B](f: A => B): Unit = underlying foreach f
+  override def foreach[U](f: A => U): Unit = underlying foreach f
   override def isEmpty: Boolean = underlying.isEmpty
   override def nonEmpty: Boolean = underlying.nonEmpty
   override def size: Int = underlying.size
diff --git a/src/library/scala/collection/immutable/DefaultMap.scala b/src/library/scala/collection/immutable/DefaultMap.scala
old mode 100755
new mode 100644
diff --git a/src/library/scala/collection/immutable/HashMap.scala b/src/library/scala/collection/immutable/HashMap.scala
index 3b3e65e..92d915f 100644
--- a/src/library/scala/collection/immutable/HashMap.scala
+++ b/src/library/scala/collection/immutable/HashMap.scala
@@ -48,7 +48,7 @@ class HashMap[A, +B] extends AbstractMap[A, B]
 
   def iterator: Iterator[(A,B)] = Iterator.empty
 
-  override def foreach[U](f: ((A, B)) =>  U): Unit = { }
+  override def foreach[U](f: ((A, B)) => U): Unit = ()
 
   def get(key: A): Option[B] =
     get0(key, computeHash(key), 0)
@@ -422,7 +422,7 @@ object HashMap extends ImmutableMapFactory[HashMap] with BitOperations.Int {
       final override def getElem(cc: AnyRef): (A, B) = cc.asInstanceOf[HashMap1[A, B]].ensurePair
     }
 
-    override def foreach[U](f: ((A, B)) =>  U): Unit = {
+    override def foreach[U](f: ((A, B)) => U): Unit = {
       var i = 0
       while (i < elems.length) {
         elems(i).foreach(f)
diff --git a/src/library/scala/collection/immutable/HashSet.scala b/src/library/scala/collection/immutable/HashSet.scala
index f548eac..050e90b 100644
--- a/src/library/scala/collection/immutable/HashSet.scala
+++ b/src/library/scala/collection/immutable/HashSet.scala
@@ -53,7 +53,7 @@ class HashSet[A] extends AbstractSet[A]
 
   def iterator: Iterator[A] = Iterator.empty
 
-  override def foreach[U](f: A =>  U): Unit = { }
+  override def foreach[U](f: A => U): Unit = ()
 
   def contains(e: A): Boolean = get0(e, computeHash(e), 0)
 
@@ -162,13 +162,6 @@ class HashSet[A] extends AbstractSet[A]
   def - (e: A): HashSet[A] =
     nullToEmpty(removed0(e, computeHash(e), 0))
 
-  /** Returns this $coll as an immutable set.
-   *  
-   *  A new set will not be built; lazy collections will stay lazy.
-   */
-  @deprecatedOverriding("Immutable sets should do nothing on toSet but return themselves cast as a Set.", "2.11.0")
-  override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set[B]]
-
   override def filter(p: A => Boolean) = {
     val buffer = new Array[HashSet[A]](bufferSize(size))
     nullToEmpty(filter0(p, false, 0, buffer, 0))
@@ -201,6 +194,7 @@ class HashSet[A] extends AbstractSet[A]
 
   protected def writeReplace(): AnyRef = new HashSet.SerializationProxy(this)
 
+  override def toSet[B >: A]: Set[B] = this.asInstanceOf[HashSet[B]]
 }
 
 /** $factoryInfo
@@ -221,7 +215,7 @@ object HashSet extends ImmutableSetFactory[HashSet] {
 
   private object EmptyHashSet extends HashSet[Any] { }
   private[collection] def emptyInstance: HashSet[Any] = EmptyHashSet
-  
+
   // utility method to create a HashTrieSet from two leaf HashSets (HashSet1 or HashSetCollision1) with non-colliding hash code)
   private def makeHashTrieSet[A](hash0:Int, elem0:HashSet[A], hash1:Int, elem1:HashSet[A], level:Int) : HashTrieSet[A] = {
     val index0 = (hash0 >>> level) & 0x1f
@@ -972,7 +966,7 @@ object HashSet extends ImmutableSetFactory[HashSet] {
       final override def getElem(cc: AnyRef): A = cc.asInstanceOf[HashSet1[A]].key
     }
 
-    override def foreach[U](f: A =>  U): Unit = {
+    override def foreach[U](f: A => U): Unit = {
       var i = 0
       while (i < elems.length) {
         elems(i).foreach(f)
diff --git a/src/library/scala/collection/immutable/IntMap.scala b/src/library/scala/collection/immutable/IntMap.scala
index 8991d0b..c6bf6a7 100644
--- a/src/library/scala/collection/immutable/IntMap.scala
+++ b/src/library/scala/collection/immutable/IntMap.scala
@@ -146,7 +146,7 @@ private[immutable] class IntMapKeyIterator[V](it: IntMap[V]) extends IntMapItera
 import IntMap._
 
 /** Specialised immutable map structure for integer keys, based on
- *  <a href="http://citeseer.ist.psu.edu/okasaki98fast.html">Fast Mergeable Integer Maps</a>
+ *  [[http://ittc.ku.edu/~andygill/papers/IntMap98.pdf Fast Mergeable Integer Maps]]
  *  by Okasaki and Gill. Essentially a trie based on binary digits of the integers.
  *
  *  '''Note:''' This class is as of 2.8 largely superseded by HashMap.
@@ -184,7 +184,7 @@ sealed abstract class IntMap[+T] extends AbstractMap[Int, T]
   /**
    * Loops over the key, value pairs of the map in unsigned order of the keys.
    */
-  override final def foreach[U](f: ((Int, T)) =>  U): Unit = this match {
+  override final def foreach[U](f: ((Int, T)) => U): Unit = this match {
     case IntMap.Bin(_, _, left, right) => { left.foreach(f); right.foreach(f) }
     case IntMap.Tip(key, value) => f((key, value))
     case IntMap.Nil =>
diff --git a/src/library/scala/collection/immutable/List.scala b/src/library/scala/collection/immutable/List.scala
index 254f14f..75ddded 100644
--- a/src/library/scala/collection/immutable/List.scala
+++ b/src/library/scala/collection/immutable/List.scala
@@ -16,7 +16,7 @@ import scala.annotation.tailrec
 import java.io._
 
 /** A class for immutable linked lists representing ordered collections
- *  of elements of type.
+ *  of elements of type `A`.
  *
  *  This class comes with two implementing case classes `scala.Nil`
  *  and `scala.::` that implement the abstract members `isEmpty`,
@@ -25,6 +25,19 @@ import java.io._
  *  This class is optimal for last-in-first-out (LIFO), stack-like access patterns. If you need another access
  *  pattern, for example, random access or FIFO, consider using a collection more suited to this than `List`.
  *
+ *  ==Performance==
+ *  '''Time:''' `List` has `O(1)` prepend and head/tail access. Most other operations are `O(n)` on the number of elements in the list.
+ *  This includes the index-based lookup of elements, `length`, `append` and `reverse`.
+ *
+ *  '''Space:''' `List` implements '''structural sharing''' of the tail list. This means that many operations are either
+ *  zero- or constant-memory cost.
+ *  {{{
+ *  val mainList = List(3, 2, 1)
+ *  val with4 =    4 :: mainList  // re-uses mainList, costs one :: instance
+ *  val with42 =   42 :: mainList // also re-uses mainList, cost one :: instance
+ *  val shorter =  mainList.tail  // costs nothing as it uses the same 2::1::Nil instances as mainList
+ *  }}}
+ *
  *  @example {{{
  *  // Make a list via the companion object factory
  *  val days = List("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
@@ -41,19 +54,6 @@ import java.io._
  *  }
  *  }}}
  *
- *  ==Performance==
- *  '''Time:''' `List` has `O(1)` prepend and head/tail access. Most other operations are `O(n)` on the number of elements in the list.
- *  This includes the index-based lookup of elements, `length`, `append` and `reverse`.
- *
- *  '''Space:''' `List` implements '''structural sharing''' of the tail list. This means that many operations are either
- *  zero- or constant-memory cost.
- *  {{{
- *  val mainList = List(3, 2, 1)
- *  val with4 =    4 :: mainList  // re-uses mainList, costs one :: instance
- *  val with42 =   42 :: mainList // also re-uses mainList, cost one :: instance
- *  val shorter =  mainList.tail  // costs nothing as it uses the same 2::1::Nil instances as mainList
- *  }}}
- *
  *  @note The functional list is characterized by persistence and structural sharing, thus offering considerable
  *        performance and space consumption benefits in some scenarios if used correctly.
  *        However, note that objects having multiple references into the same functional list (that is,
@@ -462,6 +462,7 @@ object List extends SeqFactory[List] {
   private class SerializationProxy[A](@transient private var orig: List[A]) extends Serializable {
 
     private def writeObject(out: ObjectOutputStream) {
+      out.defaultWriteObject()
       var xs: List[A] = orig
       while (!xs.isEmpty) {
         out.writeObject(xs.head)
@@ -473,6 +474,7 @@ object List extends SeqFactory[List] {
     // Java serialization calls this before readResolve during de-serialization.
     // Read the whole list and store it in `orig`.
     private def readObject(in: ObjectInputStream) {
+      in.defaultReadObject()
       val builder = List.newBuilder[A]
       while (true) in.readObject match {
         case ListSerializeEnd =>
diff --git a/src/library/scala/collection/immutable/ListMap.scala b/src/library/scala/collection/immutable/ListMap.scala
index 7c40e84..1eedf93 100644
--- a/src/library/scala/collection/immutable/ListMap.scala
+++ b/src/library/scala/collection/immutable/ListMap.scala
@@ -32,7 +32,7 @@ object ListMap extends ImmutableMapFactory[ListMap] {
   private object EmptyListMap extends ListMap[Any, Nothing] { }
 }
 
-/** This class implements immutable maps using a list-based data structure.
+/** This class implements immutable maps using a list-based data structure, which preserves insertion order.
  *  Instances of `ListMap` represent empty maps; they can be either created by
  *  calling the constructor directly, or by applying the function `ListMap.empty`.
  *
diff --git a/src/library/scala/collection/immutable/ListSet.scala b/src/library/scala/collection/immutable/ListSet.scala
index a6e6fba..adc9754 100644
--- a/src/library/scala/collection/immutable/ListSet.scala
+++ b/src/library/scala/collection/immutable/ListSet.scala
@@ -138,13 +138,6 @@ class ListSet[A] extends AbstractSet[A]
 
   override def stringPrefix = "ListSet"
 
-  /** Returns this $coll as an immutable set.
-   *  
-   *  A new set will not be built; lazy collections will stay lazy.
-   */
-  @deprecatedOverriding("Immutable sets should do nothing on toSet but return themselves cast as a Set.", "2.11.0")
-  override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set[B]]
-
   /** Represents an entry in the `ListSet`.
    */
   protected class Node(override val head: A) extends ListSet[A] with Serializable {
@@ -186,4 +179,6 @@ class ListSet[A] extends AbstractSet[A]
 
     override def tail: ListSet[A] = self
   }
+  
+  override def toSet[B >: A]: Set[B] = this.asInstanceOf[ListSet[B]]
 }
diff --git a/src/library/scala/collection/immutable/LongMap.scala b/src/library/scala/collection/immutable/LongMap.scala
index 868c0c0..173d912 100644
--- a/src/library/scala/collection/immutable/LongMap.scala
+++ b/src/library/scala/collection/immutable/LongMap.scala
@@ -176,7 +176,7 @@ extends AbstractMap[Long, T]
   /**
    * Loops over the key, value pairs of the map in unsigned order of the keys.
    */
-  override final def foreach[U](f: ((Long, T)) =>  U): Unit = this match {
+  override final def foreach[U](f: ((Long, T)) => U): Unit = this match {
     case LongMap.Bin(_, _, left, right) => { left.foreach(f); right.foreach(f) }
     case LongMap.Tip(key, value) => f((key, value))
     case LongMap.Nil =>
diff --git a/src/library/scala/collection/immutable/Map.scala b/src/library/scala/collection/immutable/Map.scala
index 5178d5a..2c5b444 100644
--- a/src/library/scala/collection/immutable/Map.scala
+++ b/src/library/scala/collection/immutable/Map.scala
@@ -112,7 +112,7 @@ object Map extends ImmutableMapFactory[Map] {
     def + [B1 >: B](kv: (A, B1)): Map[A, B1] = updated(kv._1, kv._2)
     def - (key: A): Map[A, B] =
       if (key == key1) Map.empty else this
-    override def foreach[U](f: ((A, B)) =>  U): Unit = {
+    override def foreach[U](f: ((A, B)) => U): Unit = {
       f((key1, value1))
     }
   }
@@ -133,7 +133,7 @@ object Map extends ImmutableMapFactory[Map] {
       if (key == key1) new Map1(key2, value2)
       else if (key == key2) new Map1(key1, value1)
       else this
-    override def foreach[U](f: ((A, B)) =>  U): Unit = {
+    override def foreach[U](f: ((A, B)) => U): Unit = {
       f((key1, value1)); f((key2, value2))
     }
   }
@@ -157,7 +157,7 @@ object Map extends ImmutableMapFactory[Map] {
       else if (key == key2) new Map2(key1, value1, key3, value3)
       else if (key == key3) new Map2(key1, value1, key2, value2)
       else this
-    override def foreach[U](f: ((A, B)) =>  U): Unit = {
+    override def foreach[U](f: ((A, B)) => U): Unit = {
       f((key1, value1)); f((key2, value2)); f((key3, value3))
     }
   }
@@ -184,7 +184,7 @@ object Map extends ImmutableMapFactory[Map] {
       else if (key == key3) new Map3(key1, value1, key2, value2, key4, value4)
       else if (key == key4) new Map3(key1, value1, key2, value2, key3, value3)
       else this
-    override def foreach[U](f: ((A, B)) =>  U): Unit = {
+    override def foreach[U](f: ((A, B)) => U): Unit = {
       f((key1, value1)); f((key2, value2)); f((key3, value3)); f((key4, value4))
     }
   }
diff --git a/src/library/scala/collection/immutable/MapLike.scala b/src/library/scala/collection/immutable/MapLike.scala
index 94a5b79..bd5b9c9 100644
--- a/src/library/scala/collection/immutable/MapLike.scala
+++ b/src/library/scala/collection/immutable/MapLike.scala
@@ -113,6 +113,11 @@ self =>
     override def - (elem: A): immutable.Set[A] =
       if (this(elem)) immutable.Set[A]() ++ this - elem
       else this
+      
+    // ImmutableDefaultKeySet is only protected, so we won't warn on override.
+    // Someone could override in a way that makes widening not okay
+    // (e.g. by overriding +, though the version in this class is fine)
+    override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set[B]]
   }
 
   /** This function transforms all the values of mappings contained
diff --git a/src/library/scala/collection/immutable/NumericRange.scala b/src/library/scala/collection/immutable/NumericRange.scala
index f1ac161..11603a1 100644
--- a/src/library/scala/collection/immutable/NumericRange.scala
+++ b/src/library/scala/collection/immutable/NumericRange.scala
@@ -12,6 +12,9 @@ package immutable
 
 import mutable.{ Builder, ListBuffer }
 
+// TODO: Now the specialization exists there is no clear reason to have
+// separate classes for Range/NumericRange.  Investigate and consolidate.
+
 /** `NumericRange` is a more generic version of the
  *  `Range` class which works with arbitrary types.
  *  It must be supplied with an `Integral` implementation of the
@@ -28,9 +31,6 @@ import mutable.{ Builder, ListBuffer }
  *     assert(r1 sameElements r2.map(_ - veryBig))
  *  }}}
  *
- *  TODO: Now the specialization exists there is no clear reason to have
- *  separate classes for Range/NumericRange.  Investigate and consolidate.
- *
  *  @author  Paul Phillips
  *  @version 2.8
  *  @define Coll `NumericRange`
@@ -175,34 +175,68 @@ extends AbstractSeq[T] with IndexedSeq[T] with Serializable {
     catch { case _: ClassCastException => false }
 
   final override def sum[B >: T](implicit num: Numeric[B]): B = {
-    // arithmetic series formula  can be used for regular addition
-    if ((num eq scala.math.Numeric.IntIsIntegral)||
-        (num eq scala.math.Numeric.BigIntIsIntegral)||
-        (num eq scala.math.Numeric.ShortIsIntegral)||
-        (num eq scala.math.Numeric.ByteIsIntegral)||
-        (num eq scala.math.Numeric.CharIsIntegral)||
-        (num eq scala.math.Numeric.LongIsIntegral)||
-        (num eq scala.math.Numeric.FloatAsIfIntegral)||
-        (num eq scala.math.Numeric.BigDecimalIsFractional)||
-        (num eq scala.math.Numeric.DoubleAsIfIntegral)) {
-      val numAsIntegral = num.asInstanceOf[Integral[B]]
-      import numAsIntegral._
-      if (isEmpty) num fromInt 0
-      else if (numRangeElements == 1) head
-      else ((num fromInt numRangeElements) * (head + last) / (num fromInt 2))
-    } else {
-      // user provided custom Numeric, we cannot rely on arithmetic series formula
-      if (isEmpty) num.zero
+    if (isEmpty) num.zero
+    else if (numRangeElements == 1) head
+    else {
+      // If there is no overflow, use arithmetic series formula
+      //   a + ... (n terms total) ... + b = n*(a+b)/2
+      if ((num eq scala.math.Numeric.IntIsIntegral)||
+          (num eq scala.math.Numeric.ShortIsIntegral)||
+          (num eq scala.math.Numeric.ByteIsIntegral)||
+          (num eq scala.math.Numeric.CharIsIntegral)) {
+        // We can do math with no overflow in a Long--easy
+        val exact = (numRangeElements * ((num toLong head) + (num toInt last))) / 2
+        num fromInt exact.toInt
+      }
+      else if (num eq scala.math.Numeric.LongIsIntegral) {
+        // Uh-oh, might be overflow, so we have to divide before we overflow.
+        // Either numRangeElements or (head + last) must be even, so divide the even one before multiplying
+        val a = head.toLong
+        val b = last.toLong
+        val ans = 
+          if ((numRangeElements & 1) == 0) (numRangeElements / 2) * (a + b)
+          else numRangeElements * {
+            // Sum is even, but we might overflow it, so divide in pieces and add back remainder
+            val ha = a/2
+            val hb = b/2
+            ha + hb + ((a - 2*ha) + (b - 2*hb)) / 2
+          }
+        ans.asInstanceOf[B]
+      }
+      else if ((num eq scala.math.Numeric.FloatAsIfIntegral) ||
+               (num eq scala.math.Numeric.DoubleAsIfIntegral)) {
+        // Try to compute sum with reasonable accuracy, avoiding over/underflow
+        val numAsIntegral = num.asInstanceOf[Integral[B]]
+        import numAsIntegral._
+        val a = math.abs(head.toDouble)
+        val b = math.abs(last.toDouble)
+        val two = num fromInt 2
+        val nre = num fromInt numRangeElements
+        if (a > 1e38 || b > 1e38) nre * ((head / two) + (last / two))  // Compute in parts to avoid Infinity if possible
+        else (nre / two) * (head + last)    // Don't need to worry about infinity; this will be more accurate and avoid underflow
+      }
+      else if ((num eq scala.math.Numeric.BigIntIsIntegral) ||
+               (num eq scala.math.Numeric.BigDecimalIsFractional)) {
+        // No overflow, so we can use arithmetic series formula directly
+        // (not going to worry about running out of memory)
+        val numAsIntegral = num.asInstanceOf[Integral[B]]
+        import numAsIntegral._
+        ((num fromInt numRangeElements) * (head + last)) / (num fromInt 2)
+      }
       else {
-        var acc = num.zero
-        var i = head
-        var idx = 0
-        while(idx < length) {
-          acc = num.plus(acc, i)
-          i = i + step
-          idx = idx + 1
+        // User provided custom Numeric, so we cannot rely on arithmetic series formula (e.g. won't work on something like Z_6)
+        if (isEmpty) num.zero
+        else {
+          var acc = num.zero
+          var i = head
+          var idx = 0
+          while(idx < length) {
+            acc = num.plus(acc, i)
+            i = i + step
+            idx = idx + 1
+          }
+          acc
         }
-        acc
       }
     }
   }
@@ -266,7 +300,7 @@ object NumericRange {
       // Numbers may be big.
       val one = num.one
       val limit = num.fromInt(Int.MaxValue)
-      def check(t: T): T = 
+      def check(t: T): T =
         if (num.gt(t, limit)) throw new IllegalArgumentException("More than Int.MaxValue elements.")
         else t
       // If the range crosses zero, it might overflow when subtracted
diff --git a/src/library/scala/collection/immutable/PagedSeq.scala b/src/library/scala/collection/immutable/PagedSeq.scala
index f11217d..982c106 100644
--- a/src/library/scala/collection/immutable/PagedSeq.scala
+++ b/src/library/scala/collection/immutable/PagedSeq.scala
@@ -23,6 +23,7 @@ import scala.reflect.ClassTag
  * `fromIterator` and `fromIterable` provide generalised instances of `PagedSeq`
  *  @since 2.7
  */
+ at deprecated("This object will be moved to the scala-parser-combinators module", "2.11.8")
 object PagedSeq {
   final val UndeterminedEnd = Int.MaxValue
 
@@ -126,7 +127,7 @@ import PagedSeq._
  *  @define mayNotTerminateInf
  *  @define willNotTerminateInf
  */
- at deprecatedInheritance("The implementation details of paged sequences make inheriting from them unwise.", "2.11.0")
+ at deprecated("This class will be moved to the scala-parser-combinators module", "2.11.8")
 class PagedSeq[T: ClassTag] protected(
   more: (Array[T], Int, Int) => Int,
   first1: Page[T],
@@ -190,8 +191,8 @@ extends scala.collection.AbstractSeq[T]
     val e = if (_end == UndeterminedEnd) _end else start + _end
     var f = first1
     while (f.end <= s && !f.isLast) {
-      if (f.next eq null) f.addMore(more)
-      f = f.next
+      if (f.next eq null) f = f.addMore(more)
+      else f = f.next
     }
     // Warning -- not refining `more` means that slices can freely request and obtain
     // data outside of their slice.  This is part of the design of PagedSeq
diff --git a/src/library/scala/collection/immutable/Queue.scala b/src/library/scala/collection/immutable/Queue.scala
index 9826671..53af3ce 100644
--- a/src/library/scala/collection/immutable/Queue.scala
+++ b/src/library/scala/collection/immutable/Queue.scala
@@ -56,11 +56,12 @@ class Queue[+A] protected(protected val in: List[A], protected val out: List[A])
    *  @throws java.util.NoSuchElementException if the queue is too short.
    */
   override def apply(n: Int): A = {
-    val len = out.length
-    if (n < len) out.apply(n)
+    val olen = out.length
+    if (n < olen) out.apply(n)
     else {
-      val m = n - len
-      if (m < in.length) in.reverse.apply(m)
+      val m = n - olen
+      val ilen = in.length
+      if (m < ilen) in.apply(ilen - m - 1)
       else throw new NoSuchElementException("index out of range")
     }
   }
diff --git a/src/library/scala/collection/immutable/Range.scala b/src/library/scala/collection/immutable/Range.scala
index 3ae8a2c..ca6720d 100644
--- a/src/library/scala/collection/immutable/Range.scala
+++ b/src/library/scala/collection/immutable/Range.scala
@@ -153,19 +153,15 @@ extends scala.collection.AbstractSeq[Int]
   }
 
   @inline final override def foreach[@specialized(Unit) U](f: Int => U) {
-    validateMaxLength()
-    val isCommonCase = (start != Int.MinValue || end != Int.MinValue)
-    var i = start
-    var count = 0
-    val terminal = terminalElement
-    val step = this.step
-    while(
-      if(isCommonCase) { i != terminal }
-      else             { count < numRangeElements }
-    ) {
-      f(i)
-      count += 1
-      i += step
+    // Implementation chosen on the basis of favorable microbenchmarks
+    // Note--initialization catches step == 0 so we don't need to here
+    if (!isEmpty) {
+      var i = start
+      while (true) {
+        f(i)
+        if (i == lastElement) return
+        i += step
+      }
     }
   }
 
@@ -285,7 +281,7 @@ extends scala.collection.AbstractSeq[Int]
    */
   final override def splitAt(n: Int) = (take(n), drop(n))
 
-  /** Creates a new range consisting of the `length - n` last elements of the range.
+  /** Creates a new range consisting of the last `n` elements of the range.
    *
    *  $doesNotUseBuilders
    */
@@ -347,18 +343,19 @@ extends scala.collection.AbstractSeq[Int]
       // this is normal integer range with usual addition. arithmetic series formula can be used
       if (isEmpty) 0
       else if (numRangeElements == 1) head
-      else (numRangeElements.toLong * (head + last) / 2).toInt
+      else ((numRangeElements * (head.toLong + last)) / 2).toInt
     } else {
       // user provided custom Numeric, we cannot rely on arithmetic series formula
       if (isEmpty) num.toInt(num.zero)
       else {
         var acc = num.zero
         var i = head
-        while(i != terminalElement) {
+        while (true) {
           acc = num.plus(acc, i)
+          if (i == lastElement) return num.toInt(acc)
           i = i + step
         }
-        num.toInt(acc)
+        0 // Never hit this--just to satisfy compiler since it doesn't know while(true) has type Nothing
       }
     }
   }
diff --git a/src/library/scala/collection/immutable/RedBlackTree.scala b/src/library/scala/collection/immutable/RedBlackTree.scala
index 0dad106..afb4c9c 100644
--- a/src/library/scala/collection/immutable/RedBlackTree.scala
+++ b/src/library/scala/collection/immutable/RedBlackTree.scala
@@ -168,7 +168,8 @@ object RedBlackTree {
   }
 
   /* Based on Stefan Kahrs' Haskell version of Okasaki's Red&Black Trees
-   * http://www.cse.unsw.edu.au/~dons/data/RedBlackTree.html */
+   * Constructing Red-Black Trees, Ralf Hinze: http://www.cs.ox.ac.uk/ralf.hinze/publications/WAAAPL99b.ps.gz
+   * Red-Black Trees in a Functional Setting, Chris Okasaki: https://wiki.rice.edu/confluence/download/attachments/2761212/Okasaki-Red-Black.pdf */
   private[this] def del[A, B](tree: Tree[A, B], k: A)(implicit ordering: Ordering[A]): Tree[A, B] = if (tree eq null) null else {
     def balance(x: A, xv: B, tl: Tree[A, B], tr: Tree[A, B]) = if (isRedTree(tl)) {
       if (isRedTree(tr)) {
@@ -408,11 +409,11 @@ object RedBlackTree {
 
     def cons[B](x: B, xs: NList[B]): NList[B] = new NList(x, xs)
 
-    def foldLeft[A, B](xs: NList[A], z: B)(f: (B, A) => B): B = {
+    def foldLeft[A, B](xs: NList[A], z: B)(op: (B, A) => B): B = {
       var acc = z
       var these = xs
       while (these ne null) {
-        acc = f(acc, these.head)
+        acc = op(acc, these.head)
         these = these.tail
       }
       acc
diff --git a/src/library/scala/collection/immutable/Set.scala b/src/library/scala/collection/immutable/Set.scala
index 7725ad9..031e524 100644
--- a/src/library/scala/collection/immutable/Set.scala
+++ b/src/library/scala/collection/immutable/Set.scala
@@ -33,9 +33,24 @@ trait Set[A] extends Iterable[A]
                 with Parallelizable[A, ParSet[A]]
 {
   override def companion: GenericCompanion[Set] = Set
+
   
-  
-  override def toSet[B >: A]: Set[B] = to[({type l[a] = immutable.Set[B]})#l] // for bincompat; remove in dev
+  /** Returns this $coll as an immutable set, perhaps accepting a
+   *  wider range of elements.  Since it already is an
+   *  immutable set, it will only be rebuilt if the underlying structure
+   *  cannot be expanded to include arbitrary element types.
+   *  For instance, `BitSet` and `SortedSet` will be rebuilt, as
+   *  they require `Int` and sortable elements respectively.
+   *
+   *  When in doubt, the set will be rebuilt.  Rebuilt sets never
+   *  need to be rebuilt again.
+   */
+  override def toSet[B >: A]: Set[B] = {
+      // This way of building sets typically has the best benchmarks, surprisingly!
+    val sb = Set.newBuilder[B]
+    foreach(sb += _)
+    sb.result()
+  }
   
   override def seq: Set[A] = this
   protected override def parCombiner = ParSet.newCombiner[A] // if `immutable.SetLike` gets introduced, please move this there!
@@ -48,7 +63,7 @@ trait Set[A] extends Iterable[A]
 object Set extends ImmutableSetFactory[Set] {
   /** $setCanBuildFromInfo */
   implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Set[A]] = setCanBuildFrom[A]
-  
+
   /** An optimized representation for immutable empty sets */
   private object EmptySet extends AbstractSet[Any] with Set[Any] with Serializable {
     override def size: Int = 0
@@ -56,7 +71,7 @@ object Set extends ImmutableSetFactory[Set] {
     def + (elem: Any): Set[Any] = new Set1(elem)
     def - (elem: Any): Set[Any] = this
     def iterator: Iterator[Any] = Iterator.empty
-    override def foreach[U](f: Any =>  U): Unit = {}
+    override def foreach[U](f: Any => U): Unit = ()
     override def toSet[B >: Any]: Set[B] = this.asInstanceOf[Set[B]]
   }
   private[collection] def emptyInstance: Set[Any] = EmptySet
@@ -75,21 +90,23 @@ object Set extends ImmutableSetFactory[Set] {
       else this
     def iterator: Iterator[A] =
       Iterator(elem1)
-    override def foreach[U](f: A =>  U): Unit = {
+    override def foreach[U](f: A => U): Unit = {
       f(elem1)
     }
-    override def exists(f: A => Boolean): Boolean = {
-      f(elem1)
+    override def exists(@deprecatedName('f) p: A => Boolean): Boolean = {
+      p(elem1)
     }
-    override def forall(f: A => Boolean): Boolean = {
-      f(elem1)
+    override def forall(@deprecatedName('f) p: A => Boolean): Boolean = {
+      p(elem1)
     }
-    override def find(f: A => Boolean): Option[A] = {
-      if (f(elem1)) Some(elem1)
+    override def find(@deprecatedName('f) p: A => Boolean): Option[A] = {
+      if (p(elem1)) Some(elem1)
       else None
     }
-    @deprecatedOverriding("Immutable sets should do nothing on toSet but return themselves cast as a Set.", "2.11.0")
-    override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set[B]]
+    // Why is Set1 non-final?  Need to fix that!
+    @deprecatedOverriding("This immutable set should do nothing on toSet but cast itself to a Set with a wider element type.", "2.11.8")
+    override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set1[B]]
+
   }
 
   /** An optimized representation for immutable sets of size 2 */
@@ -107,22 +124,23 @@ object Set extends ImmutableSetFactory[Set] {
       else this
     def iterator: Iterator[A] =
       Iterator(elem1, elem2)
-    override def foreach[U](f: A =>  U): Unit = {
+    override def foreach[U](f: A => U): Unit = {
       f(elem1); f(elem2)
     }
-    override def exists(f: A => Boolean): Boolean = {
-      f(elem1) || f(elem2)
+    override def exists(@deprecatedName('f) p: A => Boolean): Boolean = {
+      p(elem1) || p(elem2)
     }
-    override def forall(f: A => Boolean): Boolean = {
-      f(elem1) && f(elem2)
+    override def forall(@deprecatedName('f) p: A => Boolean): Boolean = {
+      p(elem1) && p(elem2)
     }
-    override def find(f: A => Boolean): Option[A] = {
-      if (f(elem1)) Some(elem1)
-      else if (f(elem2)) Some(elem2)
+    override def find(@deprecatedName('f) p: A => Boolean): Option[A] = {
+      if (p(elem1)) Some(elem1)
+      else if (p(elem2)) Some(elem2)
       else None
     }
-    @deprecatedOverriding("Immutable sets should do nothing on toSet but return themselves cast as a Set.", "2.11.0")
-    override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set[B]]
+    // Why is Set2 non-final?  Need to fix that!
+    @deprecatedOverriding("This immutable set should do nothing on toSet but cast itself to a Set with a wider element type.", "2.11.8")
+    override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set2[B]]
   }
 
   /** An optimized representation for immutable sets of size 3 */
@@ -141,23 +159,24 @@ object Set extends ImmutableSetFactory[Set] {
       else this
     def iterator: Iterator[A] =
       Iterator(elem1, elem2, elem3)
-    override def foreach[U](f: A =>  U): Unit = {
+    override def foreach[U](f: A => U): Unit = {
       f(elem1); f(elem2); f(elem3)
     }
-    override def exists(f: A => Boolean): Boolean = {
-      f(elem1) || f(elem2) || f(elem3)
+    override def exists(@deprecatedName('f) p: A => Boolean): Boolean = {
+      p(elem1) || p(elem2) || p(elem3)
     }
-    override def forall(f: A => Boolean): Boolean = {
-      f(elem1) && f(elem2) && f(elem3)
+    override def forall(@deprecatedName('f) p: A => Boolean): Boolean = {
+      p(elem1) && p(elem2) && p(elem3)
     }
-    override def find(f: A => Boolean): Option[A] = {
-      if (f(elem1)) Some(elem1)
-      else if (f(elem2)) Some(elem2)
-      else if (f(elem3)) Some(elem3)
+    override def find(@deprecatedName('f) p: A => Boolean): Option[A] = {
+      if (p(elem1)) Some(elem1)
+      else if (p(elem2)) Some(elem2)
+      else if (p(elem3)) Some(elem3)
       else None
     }
-    @deprecatedOverriding("Immutable sets should do nothing on toSet but return themselves cast as a Set.", "2.11.0")
-    override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set[B]]
+    // Why is Set3 non-final?  Need to fix that!
+    @deprecatedOverriding("This immutable set should do nothing on toSet but cast itself to a Set with a wider element type.", "2.11.8")
+    override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set3[B]]
   }
 
   /** An optimized representation for immutable sets of size 4 */
@@ -177,24 +196,25 @@ object Set extends ImmutableSetFactory[Set] {
       else this
     def iterator: Iterator[A] =
       Iterator(elem1, elem2, elem3, elem4)
-    override def foreach[U](f: A =>  U): Unit = {
+    override def foreach[U](f: A => U): Unit = {
       f(elem1); f(elem2); f(elem3); f(elem4)
     }
-    override def exists(f: A => Boolean): Boolean = {
-      f(elem1) || f(elem2) || f(elem3) || f(elem4)
+    override def exists(@deprecatedName('f) p: A => Boolean): Boolean = {
+      p(elem1) || p(elem2) || p(elem3) || p(elem4)
     }
-    override def forall(f: A => Boolean): Boolean = {
-      f(elem1) && f(elem2) && f(elem3) && f(elem4)
+    override def forall(@deprecatedName('f) p: A => Boolean): Boolean = {
+      p(elem1) && p(elem2) && p(elem3) && p(elem4)
     }
-    override def find(f: A => Boolean): Option[A] = {
-      if (f(elem1)) Some(elem1)
-      else if (f(elem2)) Some(elem2)
-      else if (f(elem3)) Some(elem3)
-      else if (f(elem4)) Some(elem4)
+    override def find(@deprecatedName('f) p: A => Boolean): Option[A] = {
+      if (p(elem1)) Some(elem1)
+      else if (p(elem2)) Some(elem2)
+      else if (p(elem3)) Some(elem3)
+      else if (p(elem4)) Some(elem4)
       else None
     }
-    @deprecatedOverriding("Immutable sets should do nothing on toSet but return themselves cast as a Set.", "2.11.0")
-    override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set[B]]
+    // Why is Set4 non-final?  Need to fix that!
+    @deprecatedOverriding("This immutable set should do nothing on toSet but cast itself to a Set with a wider element type.", "2.11.8")
+    override def toSet[B >: A]: Set[B] = this.asInstanceOf[Set4[B]]
   }
 }
 
diff --git a/src/library/scala/collection/immutable/SortedMap.scala b/src/library/scala/collection/immutable/SortedMap.scala
index f149355..682788e 100644
--- a/src/library/scala/collection/immutable/SortedMap.scala
+++ b/src/library/scala/collection/immutable/SortedMap.scala
@@ -53,6 +53,12 @@ self =>
       val map = self.rangeImpl(from, until)
       new map.DefaultKeySortedSet
     }
+    override def toSet[C >: A]: Set[C] = {
+      // This way of building sets typically has the best benchmarks, surprisingly!
+      val sb = Set.newBuilder[C]
+      foreach(sb += _)
+      sb.result()
+    }
   }
 
   /** Add a key/value pair to this map.
diff --git a/src/library/scala/collection/immutable/Stream.scala b/src/library/scala/collection/immutable/Stream.scala
index 9ed5162..d3be809 100644
--- a/src/library/scala/collection/immutable/Stream.scala
+++ b/src/library/scala/collection/immutable/Stream.scala
@@ -153,7 +153,7 @@ import scala.language.implicitConversions
  *
  *  - The fact that `tail` works at all is of interest.  In the definition of
  *  `fibs` we have an initial `(0, 1, Stream(...))` so `tail` is deterministic.
- *  If we deinfed `fibs` such that only `0` were concretely known then the act
+ *  If we defined `fibs` such that only `0` were concretely known then the act
  *  of determining `tail` would require the evaluation of `tail` which would
  *  cause an infinite recursion and stack overflow.  If we define a definition
  *  where the tail is not initially computable then we're going to have an
@@ -176,9 +176,9 @@ import scala.language.implicitConversions
  *    loop(1, 1)
  *  }
  *  }}}
- * 
+ *
  *  Note that `mkString` forces evaluation of a `Stream`, but `addString` does
- *  not.  In both cases, a `Stream` that is or ends in a cycle 
+ *  not.  In both cases, a `Stream` that is or ends in a cycle
  *  (e.g. `lazy val s: Stream[Int] = 0 #:: s`) will convert additional trips
  *  through the cycle to `...`.  Additionally, `addString` will display an
  *  un-memoized tail as `?`.
@@ -360,7 +360,7 @@ self =>
    * `List(BigInt(12)) ++ fibs`.
    *
    * @tparam B The element type of the returned collection.'''That'''
-   * @param that The [[scala.collection.GenTraversableOnce]] the be contatenated
+   * @param that The [[scala.collection.GenTraversableOnce]] the be concatenated
    * to this `Stream`.
    * @return A new collection containing the result of concatenating `this` with
    * `that`.
@@ -508,8 +508,8 @@ self =>
    *
    * @example {{{
    * $naturalsEx
-   * naturalsFrom(1)  10 } filter { _ % 5 == 0 } take 10 mkString(", ")
-   * // produces
+   * naturalsFrom(1) filter { _ % 5 == 0 } take 10 mkString(", ")
+   * // produces "5, 10, 15, 20, 25, 30, 35, 40, 45, 50"
    * }}}
    */
   override def filter(p: A => Boolean): Stream[A] = {
@@ -566,7 +566,7 @@ self =>
       else super.flatMap(f)(bf)
     }
 
-    override def foreach[B](f: A => B) =
+    override def foreach[U](f: A => U) =
       for (x <- self)
         if (p(x)) f(x)
 
@@ -589,7 +589,7 @@ self =>
    *  unless the `f` throws an exception.
    */
   @tailrec
-  override final def foreach[B](f: A => B) {
+  override final def foreach[U](f: A => U) {
     if (!this.isEmpty) {
       f(head)
       tail.foreach(f)
@@ -743,16 +743,18 @@ self =>
           b append end
           return b
         }
-        if ((cursor ne scout) && scout.tailDefined) {
+        if (cursor ne scout) {
           cursor = scout
-          scout = scout.tail        
-          // Use 2x 1x iterator trick for cycle detection; slow iterator can add strings
-          while ((cursor ne scout) && scout.tailDefined) {
-            b append sep append cursor.head
-            n += 1
-            cursor = cursor.tail
+          if (scout.tailDefined) {
             scout = scout.tail
-            if (scout.tailDefined) scout = scout.tail
+            // Use 2x 1x iterator trick for cycle detection; slow iterator can add strings
+            while ((cursor ne scout) && scout.tailDefined) {
+              b append sep append cursor.head
+              n += 1
+              cursor = cursor.tail
+              scout = scout.tail
+              if (scout.tailDefined) scout = scout.tail
+            }
           }
         }
         if (!scout.tailDefined) {  // Not a cycle, scout hit an end
@@ -761,6 +763,9 @@ self =>
             n += 1
             cursor = cursor.tail
           }
+          if (cursor.nonEmpty) {
+            b append sep append cursor.head
+          }
         }
         else {
           // Cycle.
@@ -1175,11 +1180,17 @@ object Stream extends SeqFactory[Stream] {
    *  to streams.
    */
   class ConsWrapper[A](tl: => Stream[A]) {
+    /** Construct a stream consisting of a given first element followed by elements
+     *  from a lazily evaluated Stream.
+     */
     def #::(hd: A): Stream[A] = cons(hd, tl)
+    /** Construct a stream consisting of the concatenation of the given stream and
+     *  a lazily evaluated Stream.
+     */
     def #:::(prefix: Stream[A]): Stream[A] = prefix append tl
   }
 
-  /** A wrapper method that adds `#::` for cons and `#::: for concat as operations
+  /** A wrapper method that adds `#::` for cons and `#:::` for concat as operations
    *  to streams.
    */
   implicit def consWrapper[A](stream: => Stream[A]): ConsWrapper[A] =
diff --git a/src/library/scala/collection/immutable/StringLike.scala b/src/library/scala/collection/immutable/StringLike.scala
index 1ead894..1b52e40 100644
--- a/src/library/scala/collection/immutable/StringLike.scala
+++ b/src/library/scala/collection/immutable/StringLike.scala
@@ -217,8 +217,8 @@ self =>
         pos = thisString.indexOf(separator, prev)
       } while (pos != -1)
 
-      if (prev != thisString.size)
-        res += thisString.substring(prev, thisString.size)
+      if (prev != thisString.length)
+        res += thisString.substring(prev, thisString.length)
 
       val initialResult = res.result()
       pos = initialResult.length
diff --git a/src/library/scala/collection/immutable/StringOps.scala b/src/library/scala/collection/immutable/StringOps.scala
index 6737692..77333ba 100644
--- a/src/library/scala/collection/immutable/StringOps.scala
+++ b/src/library/scala/collection/immutable/StringOps.scala
@@ -12,10 +12,9 @@ package immutable
 
 import mutable.StringBuilder
 
-/**
- *  This class serves as a wrapper providing `String`s with all the operations
- *  found in indexed sequences. Where needed, instances of `String` object
- *  are implicitly converted into this class.
+/** This class serves as a wrapper providing [[scala.Predef.String]]s with all
+ *  the operations found in indexed sequences. Where needed, `String`s are
+ *  implicitly converted into instances of this class.
  *
  *  The difference between this class and `WrappedString` is that calling transformer
  *  methods such as `filter` and `map` will yield a `String` object, whereas a
diff --git a/src/library/scala/collection/immutable/TreeMap.scala b/src/library/scala/collection/immutable/TreeMap.scala
index 662075c..b845b76 100644
--- a/src/library/scala/collection/immutable/TreeMap.scala
+++ b/src/library/scala/collection/immutable/TreeMap.scala
@@ -200,5 +200,5 @@ class TreeMap[A, +B] private (tree: RB.Tree[A, B])(implicit val ordering: Orderi
   override def contains(key: A): Boolean = RB.contains(tree, key)
   override def isDefinedAt(key: A): Boolean = RB.contains(tree, key)
 
-  override def foreach[U](f : ((A,B)) =>  U) = RB.foreach(tree, f)
+  override def foreach[U](f : ((A,B)) => U) = RB.foreach(tree, f)
 }
diff --git a/src/library/scala/collection/immutable/TreeSet.scala b/src/library/scala/collection/immutable/TreeSet.scala
index 7378211..2800030 100644
--- a/src/library/scala/collection/immutable/TreeSet.scala
+++ b/src/library/scala/collection/immutable/TreeSet.scala
@@ -151,7 +151,7 @@ class TreeSet[A] private (tree: RB.Tree[A, Unit])(implicit val ordering: Orderin
   def iterator: Iterator[A] = RB.keysIterator(tree)
   override def keysIteratorFrom(start: A): Iterator[A] = RB.keysIterator(tree, Some(start))
 
-  override def foreach[U](f: A =>  U) = RB.foreachKey(tree, f)
+  override def foreach[U](f: A => U) = RB.foreachKey(tree, f)
 
   override def rangeImpl(from: Option[A], until: Option[A]): TreeSet[A] = newSet(RB.rangeImpl(tree, from, until))
   override def range(from: A, until: A): TreeSet[A] = newSet(RB.range(tree, from, until))
diff --git a/src/library/scala/collection/immutable/Vector.scala b/src/library/scala/collection/immutable/Vector.scala
index 47a623a..5a9734a 100644
--- a/src/library/scala/collection/immutable/Vector.scala
+++ b/src/library/scala/collection/immutable/Vector.scala
@@ -132,25 +132,31 @@ override def companion: GenericCompanion[Vector] = Vector
       throw new IndexOutOfBoundsException(index.toString)
   }
 
-
+  // If we have a default builder, there are faster ways to perform some operations
+  @inline private[this] def isDefaultCBF[A, B, That](bf: CanBuildFrom[Vector[A], B, That]): Boolean =
+    (bf eq IndexedSeq.ReusableCBF) || (bf eq collection.immutable.Seq.ReusableCBF) || (bf eq collection.Seq.ReusableCBF)
+    
   // SeqLike api
 
   override def updated[B >: A, That](index: Int, elem: B)(implicit bf: CanBuildFrom[Vector[A], B, That]): That =
-    if (bf eq IndexedSeq.ReusableCBF) updateAt(index, elem).asInstanceOf[That] // just ignore bf
+    if (isDefaultCBF[A, B, That](bf))
+      updateAt(index, elem).asInstanceOf[That] // ignore bf--it will just give a Vector, and slowly
     else super.updated(index, elem)(bf)
 
   override def +:[B >: A, That](elem: B)(implicit bf: CanBuildFrom[Vector[A], B, That]): That =
-    if (bf eq IndexedSeq.ReusableCBF) appendFront(elem).asInstanceOf[That] // just ignore bf
+    if (isDefaultCBF[A, B, That](bf))
+      appendFront(elem).asInstanceOf[That] // ignore bf--it will just give a Vector, and slowly
     else super.+:(elem)(bf)
 
   override def :+[B >: A, That](elem: B)(implicit bf: CanBuildFrom[Vector[A], B, That]): That =
-    if (bf eq IndexedSeq.ReusableCBF) appendBack(elem).asInstanceOf[That] // just ignore bf
+    if (isDefaultCBF(bf))
+      appendBack(elem).asInstanceOf[That] // ignore bf--it will just give a Vector, and slowly
     else super.:+(elem)(bf)
 
   override def take(n: Int): Vector[A] = {
     if (n <= 0)
       Vector.empty
-    else if (startIndex + n < endIndex)
+    else if (startIndex < endIndex - n)
       dropBack0(startIndex + n)
     else
       this
@@ -159,7 +165,7 @@ override def companion: GenericCompanion[Vector] = Vector
   override def drop(n: Int): Vector[A] = {
     if (n <= 0)
       this
-    else if (startIndex + n < endIndex)
+    else if (startIndex < endIndex - n)
       dropFront0(startIndex + n)
     else
       Vector.empty
@@ -211,7 +217,8 @@ override def companion: GenericCompanion[Vector] = Vector
 
   // concat (suboptimal but avoids worst performance gotchas)
   override def ++[B >: A, That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Vector[A], B, That]): That = {
-    if (bf eq IndexedSeq.ReusableCBF) {
+    if (isDefaultCBF(bf)) {
+      // We are sure we will create a Vector, so let's do it efficiently
       import Vector.{Log2ConcatFaster, TinyAppendFaster}
       if (that.isEmpty) this.asInstanceOf[That]
       else {
@@ -944,8 +951,6 @@ private[immutable] trait VectorPointer[T] {
     // STUFF BELOW USED BY APPEND / UPDATE
 
     private[immutable] final def copyOf(a: Array[AnyRef]) = {
-      //println("copy")
-      if (a eq null) println ("NULL")
       val b = new Array[AnyRef](a.length)
       Platform.arraycopy(a, 0, b, 0, a.length)
       b
@@ -1149,8 +1154,6 @@ private[immutable] trait VectorPointer[T] {
         if (depth == 3) {
           display3 = new Array(32)
           display3((oldIndex >> 15) & 31) = display2
-          display2 = new Array(32)
-          display1 = new Array(32)
           depth +=1
         }
         display2 = display3((newIndex >> 15) & 31).asInstanceOf[Array[AnyRef]]
@@ -1163,9 +1166,6 @@ private[immutable] trait VectorPointer[T] {
         if (depth == 4) {
           display4 = new Array(32)
           display4((oldIndex >> 20) & 31) = display3
-          display3 = new Array(32)
-          display2 = new Array(32)
-          display1 = new Array(32)
           depth +=1
         }
         display3 = display4((newIndex >> 20) & 31).asInstanceOf[Array[AnyRef]]
@@ -1180,13 +1180,9 @@ private[immutable] trait VectorPointer[T] {
         if (depth == 5) {
           display5 = new Array(32)
           display5((oldIndex >>  25) & 31) = display4
-          display4 = new Array(32)
-          display3 = new Array(32)
-          display2 = new Array(32)
-          display1 = new Array(32)
           depth +=1
         }
-        display4 = display5((newIndex >> 20) & 31).asInstanceOf[Array[AnyRef]]
+        display4 = display5((newIndex >> 25) & 31).asInstanceOf[Array[AnyRef]]
         if (display4 == null) display4 = new Array(32)
         display3 = display4((newIndex >> 20) & 31).asInstanceOf[Array[AnyRef]]
         if (display3 == null) display3 = new Array(32)
diff --git a/src/library/scala/collection/mutable/AVLTree.scala b/src/library/scala/collection/mutable/AVLTree.scala
index cc2acb7..b63d0aa 100644
--- a/src/library/scala/collection/mutable/AVLTree.scala
+++ b/src/library/scala/collection/mutable/AVLTree.scala
@@ -27,7 +27,7 @@ private[mutable] sealed trait AVLTree[+A] extends Serializable {
 
   /**
    * Returns a new tree containing the given element.
-   * Thows an IllegalArgumentException if element is already present.
+   * Throws an IllegalArgumentException if element is already present.
    *
    */
   def insert[B >: A](value: B, ordering: Ordering[B]): AVLTree[B] = Node(value, Leaf, Leaf)
@@ -95,7 +95,7 @@ private case class Node[A](data: A, left: AVLTree[A], right: AVLTree[A]) extends
 
   /**
    * Returns a new tree containing the given element.
-   * Thows an IllegalArgumentException if element is already present.
+   * Throws an IllegalArgumentException if element is already present.
    *
    */
   override def insert[B >: A](value: B, ordering: Ordering[B]) = {
diff --git a/src/library/scala/collection/mutable/AnyRefMap.scala b/src/library/scala/collection/mutable/AnyRefMap.scala
index fccc9d8..369d596 100644
--- a/src/library/scala/collection/mutable/AnyRefMap.scala
+++ b/src/library/scala/collection/mutable/AnyRefMap.scala
@@ -5,23 +5,23 @@ package mutable
 import generic.CanBuildFrom
 
 /** This class implements mutable maps with `AnyRef` keys based on a hash table with open addressing.
- * 
- *  Basic map operations on single entries, including `contains` and `get`, 
+ *
+ *  Basic map operations on single entries, including `contains` and `get`,
  *  are typically significantly faster with `AnyRefMap` than [[HashMap]].
  *  Note that numbers and characters are not handled specially in AnyRefMap;
  *  only plain `equals` and `hashCode` are used in comparisons.
- * 
+ *
  *  Methods that traverse or regenerate the map, including `foreach` and `map`,
  *  are not in general faster than with `HashMap`.  The methods `foreachKey`,
  *  `foreachValue`, `mapValuesNow`, and `transformValues` are, however, faster
  *  than alternative ways to achieve the same functionality.
- * 
+ *
  *  Maps with open addressing may become less efficient at lookup after
  *  repeated addition/removal of elements.  Although `AnyRefMap` makes a
  *  decent attempt to remain efficient regardless,  calling `repack`
  *  on a map that will no longer have elements removed but will be
  *  used heavily may save both time and storage space.
- * 
+ *
  *  This map is not intended to contain more than 2^29^ entries (approximately
  *  500 million).  The maximum capacity is 2^30^, but performance will degrade
  *  rapidly as 2^30^ is approached.
@@ -34,50 +34,50 @@ extends AbstractMap[K, V]
 {
   import AnyRefMap._
   def this() = this(AnyRefMap.exceptionDefault, 16, true)
-  
+
   /** Creates a new `AnyRefMap` that returns default values according to a supplied key-value mapping. */
   def this(defaultEntry: K => V) = this(defaultEntry, 16, true)
 
   /** Creates a new `AnyRefMap` with an initial buffer of specified size.
-   * 
+   *
    *  An `AnyRefMap` can typically contain half as many elements as its buffer size
    *  before it requires resizing.
    */
   def this(initialBufferSize: Int) = this(AnyRefMap.exceptionDefault, initialBufferSize, true)
-  
+
   /** Creates a new `AnyRefMap` with specified default values and initial buffer size. */
   def this(defaultEntry: K => V, initialBufferSize: Int) = this(defaultEntry, initialBufferSize, true)
-  
+
   private[this] var mask = 0
   private[this] var _size = 0
   private[this] var _vacant = 0
   private[this] var _hashes: Array[Int] = null
   private[this] var _keys: Array[AnyRef] = null
   private[this] var _values: Array[AnyRef] = null
-    
+
   if (initBlank) defaultInitialize(initialBufferSize)
-  
+
   private[this] def defaultInitialize(n: Int) {
-    mask = 
+    mask =
       if (n<0) 0x7
       else (((1 << (32 - java.lang.Integer.numberOfLeadingZeros(n-1))) - 1) & 0x3FFFFFFF) | 0x7
     _hashes = new Array[Int](mask+1)
     _keys = new Array[AnyRef](mask+1)
     _values = new Array[AnyRef](mask+1)
   }
-  
+
   private[collection] def initializeTo(
     m: Int, sz: Int, vc: Int, hz: Array[Int], kz: Array[AnyRef], vz: Array[AnyRef]
   ) {
     mask = m; _size = sz; _vacant = vc; _hashes = hz; _keys = kz; _values = vz
   }
-  
+
   override def size: Int = _size
   override def empty: AnyRefMap[K,V] = new AnyRefMap(defaultEntry)
-  
-  private def imbalanced: Boolean = 
+
+  private def imbalanced: Boolean =
     (_size + _vacant) > 0.5*mask || _vacant > _size
-  
+
   private def hashOf(key: K): Int = {
     if (key eq null) 0x41081989
     else {
@@ -88,7 +88,7 @@ extends AbstractMap[K, V]
       if (j==0) 0x41081989 else j & 0x7FFFFFFF
     }
   }
-  
+
   private def seekEntry(h: Int, k: AnyRef): Int = {
     var e = h & mask
     var x = 0
@@ -100,7 +100,7 @@ extends AbstractMap[K, V]
     }
     e | MissingBit
   }
-  
+
   private def seekEntryOrOpen(h: Int, k: AnyRef): Int = {
     var e = h & mask
     var x = 0
@@ -114,19 +114,19 @@ extends AbstractMap[K, V]
     }
     if (o >= 0) o | MissVacant else e | MissingBit
   }
-  
+
   override def contains(key: K): Boolean = seekEntry(hashOf(key), key) >= 0
-  
+
   override def get(key: K): Option[V] = {
     val i = seekEntry(hashOf(key), key)
     if (i < 0) None else Some(_values(i).asInstanceOf[V])
   }
-  
+
   override def getOrElse[V1 >: V](key: K, default: => V1): V1 = {
     val i = seekEntry(hashOf(key), key)
     if (i < 0) default else _values(i).asInstanceOf[V]
   }
-  
+
   override def getOrElseUpdate(key: K, defaultValue: => V): V = {
     val h = hashOf(key)
     var i = seekEntryOrOpen(h, key)
@@ -154,10 +154,10 @@ extends AbstractMap[K, V]
     }
     else _values(i).asInstanceOf[V]
   }
-  
+
   /** Retrieves the value associated with a key, or the default for that type if none exists
    *  (null for AnyRef, 0 for floats and integers).
-   * 
+   *
    *  Note: this is the fastest way to retrieve a value that may or
    *  may not exist, if the default null/zero is acceptable.  For key/value
    *  pairs that do exist, `apply` (i.e. `map(key)`) is equally fast.
@@ -166,22 +166,22 @@ extends AbstractMap[K, V]
     val i = seekEntry(hashOf(key), key)
     (if (i < 0) null else _values(i)).asInstanceOf[V]
   }
-  
-  /** Retrieves the value associated with a key. 
+
+  /** Retrieves the value associated with a key.
    *  If the key does not exist in the map, the `defaultEntry` for that key
-   *  will be returned instead; an exception will be thrown if no 
+   *  will be returned instead; an exception will be thrown if no
    *  `defaultEntry` was supplied.
    */
   override def apply(key: K): V = {
     val i = seekEntry(hashOf(key), key)
     if (i < 0) defaultEntry(key) else _values(i).asInstanceOf[V]
   }
-  
+
   /** Defers to defaultEntry to find a default value for the key.  Throws an
    *  exception if no other default behavior was specified.
    */
   override def default(key: K) = defaultEntry(key)
-  
+
   private def repack(newMask: Int) {
     val oh = _hashes
     val ok = _keys
@@ -205,9 +205,9 @@ extends AbstractMap[K, V]
       i += 1
     }
   }
-  
+
   /** Repacks the contents of this `AnyRefMap` for maximum efficiency of lookup.
-   * 
+   *
    *  For maps that undergo a complex creation process with both addition and
    *  removal of keys, and then are used heavily with no further removal of
    *  elements, calling `repack` after the end of the creation can result in
@@ -220,7 +220,7 @@ extends AbstractMap[K, V]
     while (m > 8 && 8*_size < m) m = m >>> 1
     repack(m)
   }
-  
+
   override def put(key: K, value: V): Option[V] = {
     val h = hashOf(key)
     val k = key
@@ -243,9 +243,9 @@ extends AbstractMap[K, V]
       ans
     }
   }
-  
+
   /** Updates the map to include a new key-value pair.
-   * 
+   *
    *  This is the fastest way to add an entry to an `AnyRefMap`.
    */
   override def update(key: K, value: V): Unit = {
@@ -267,12 +267,12 @@ extends AbstractMap[K, V]
       _values(i) = value.asInstanceOf[AnyRef]
     }
   }
-  
+
   /** Adds a new key/value pair to this map and returns the map. */
   def +=(key: K, value: V): this.type = { update(key, value); this }
 
   def +=(kv: (K, V)): this.type = { update(kv._1, kv._2); this }
-  
+
   def -=(key: K): this.type = {
     val i = seekEntry(hashOf(key), key)
     if (i >= 0) {
@@ -284,14 +284,14 @@ extends AbstractMap[K, V]
     }
     this
   }
-  
+
   def iterator: Iterator[(K, V)] = new Iterator[(K, V)] {
     private[this] val hz = _hashes
     private[this] val kz = _keys
     private[this] val vz = _values
-    
+
     private[this] var index = 0
-    
+
     def hasNext: Boolean = index<hz.length && {
       var h = hz(index)
       while (h+h == 0) {
@@ -301,7 +301,7 @@ extends AbstractMap[K, V]
       }
       true
     }
-    
+
     def next: (K, V) = {
       if (hasNext) {
         val ans = (kz(index).asInstanceOf[K], vz(index).asInstanceOf[V])
@@ -311,8 +311,8 @@ extends AbstractMap[K, V]
       else throw new NoSuchElementException("next")
     }
   }
-  
-  override def foreach[A](f: ((K,V)) => A) {
+
+  override def foreach[U](f: ((K,V)) => U) {
     var i = 0
     var e = _size
     while (e > 0) {
@@ -325,7 +325,7 @@ extends AbstractMap[K, V]
       else return
     }
   }
-    
+
   override def clone(): AnyRefMap[K, V] = {
     val hz = java.util.Arrays.copyOf(_hashes, _hashes.length)
     val kz = java.util.Arrays.copyOf(_keys, _keys.length)
@@ -334,7 +334,7 @@ extends AbstractMap[K, V]
     arm.initializeTo(mask, _size, _vacant, hz, kz,  vz)
     arm
   }
-  
+
   private[this] def foreachElement[A,B](elems: Array[AnyRef], f: A => B) {
     var i,j = 0
     while (i < _hashes.length & j < _size) {
@@ -346,13 +346,13 @@ extends AbstractMap[K, V]
       i += 1
     }
   }
-  
+
   /** Applies a function to all keys of this map. */
   def foreachKey[A](f: K => A) { foreachElement[K,A](_keys, f) }
 
   /** Applies a function to all values of this map. */
   def foreachValue[A](f: V => A) { foreachElement[V,A](_values, f) }
-  
+
   /** Creates a new `AnyRefMap` with different values.
    *  Unlike `mapValues`, this method generates a new
    *  collection immediately.
@@ -374,8 +374,8 @@ extends AbstractMap[K, V]
     arm.initializeTo(mask, _size, _vacant, hz, kz, vz)
     arm
   }
-  
-  /** Applies a transformation function to all values stored in this map. 
+
+  /** Applies a transformation function to all values stored in this map.
    *  Note: the default, if any,  is not transformed.
    */
   def transformValues(f: V => V): this.type = {
@@ -398,15 +398,15 @@ object AnyRefMap {
   private final val MissingBit = 0x80000000
   private final val VacantBit  = 0x40000000
   private final val MissVacant = 0xC0000000
-  
+
   private val exceptionDefault = (k: Any) => throw new NoSuchElementException(if (k == null) "(null)" else k.toString)
-  
+
   implicit def canBuildFrom[K <: AnyRef, V, J <: AnyRef, U]: CanBuildFrom[AnyRefMap[K,V], (J, U), AnyRefMap[J,U]] =
     new CanBuildFrom[AnyRefMap[K,V], (J, U), AnyRefMap[J,U]] {
       def apply(from: AnyRefMap[K,V]): AnyRefMapBuilder[J, U] = apply()
       def apply(): AnyRefMapBuilder[J, U] = new AnyRefMapBuilder[J, U]
     }
-  
+
   final class AnyRefMapBuilder[K <: AnyRef, V] extends Builder[(K, V), AnyRefMap[K, V]] {
     private[collection] var elems: AnyRefMap[K, V] = new AnyRefMap[K, V]
     def +=(entry: (K, V)): this.type = {
@@ -425,14 +425,14 @@ object AnyRefMap {
     if (arm.size < (sz>>3)) arm.repack()
     arm
   }
-  
+
   /** Creates a new empty `AnyRefMap`. */
   def empty[K <: AnyRef, V]: AnyRefMap[K, V] = new AnyRefMap[K, V]
-  
+
   /** Creates a new empty `AnyRefMap` with the supplied default */
   def withDefault[K <: AnyRef, V](default: K => V): AnyRefMap[K, V] = new AnyRefMap[K, V](default)
-  
-  /** Creates a new `AnyRefMap` from arrays of keys and values. 
+
+  /** Creates a new `AnyRefMap` from arrays of keys and values.
    *  Equivalent to but more efficient than `AnyRefMap((keys zip values): _*)`.
    */
   def fromZip[K <: AnyRef, V](keys: Array[K], values: Array[V]): AnyRefMap[K, V] = {
@@ -443,8 +443,8 @@ object AnyRefMap {
     if (arm.size < (sz>>3)) arm.repack()
     arm
   }
-  
-  /** Creates a new `AnyRefMap` from keys and values. 
+
+  /** Creates a new `AnyRefMap` from keys and values.
    *  Equivalent to but more efficient than `AnyRefMap((keys zip values): _*)`.
    */
   def fromZip[K <: AnyRef, V](keys: Iterable[K], values: Iterable[V]): AnyRefMap[K, V] = {
diff --git a/src/library/scala/collection/mutable/ArraySeq.scala b/src/library/scala/collection/mutable/ArraySeq.scala
index 577a838..ddb4862 100644
--- a/src/library/scala/collection/mutable/ArraySeq.scala
+++ b/src/library/scala/collection/mutable/ArraySeq.scala
@@ -68,7 +68,7 @@ extends AbstractSeq[A]
     array(idx) = elem.asInstanceOf[AnyRef]
   }
 
-  override def foreach[U](f: A =>  U) {
+  override def foreach[U](f: A => U) {
     var i = 0
     while (i < length) {
       f(array(i).asInstanceOf[A])
diff --git a/src/library/scala/collection/mutable/ArrayStack.scala b/src/library/scala/collection/mutable/ArrayStack.scala
index fec2da8..8ff128c 100644
--- a/src/library/scala/collection/mutable/ArrayStack.scala
+++ b/src/library/scala/collection/mutable/ArrayStack.scala
@@ -233,7 +233,7 @@ extends AbstractSeq[T]
     }
   }
 
-  override def foreach[U](f: T =>  U) {
+  override def foreach[U](f: T => U) {
     var currentIndex = index
     while (currentIndex > 0) {
       currentIndex -= 1
diff --git a/src/library/scala/collection/mutable/HashMap.scala b/src/library/scala/collection/mutable/HashMap.scala
index 6fca75f..eab4202 100644
--- a/src/library/scala/collection/mutable/HashMap.scala
+++ b/src/library/scala/collection/mutable/HashMap.scala
@@ -96,16 +96,16 @@ extends AbstractMap[A, B]
 
   def iterator = entriesIterator map (e => ((e.key, e.value)))
 
-  override def foreach[C](f: ((A, B)) => C): Unit = foreachEntry(e => f((e.key, e.value)))
+  override def foreach[U](f: ((A, B)) => U): Unit = foreachEntry(e => f((e.key, e.value)))
 
   /* Override to avoid tuple allocation in foreach */
   override def keySet: scala.collection.Set[A] = new DefaultKeySet {
-    override def foreach[C](f: A => C) = foreachEntry(e => f(e.key))
+    override def foreach[U](f: A => U) = foreachEntry(e => f(e.key))
   }
 
   /* Override to avoid tuple allocation in foreach */
   override def values: scala.collection.Iterable[B] = new DefaultValuesIterable {
-    override def foreach[C](f: B => C) = foreachEntry(e => f(e.value))
+    override def foreach[U](f: B => U) = foreachEntry(e => f(e.value))
   }
 
   /* Override to avoid tuple allocation */
diff --git a/src/library/scala/collection/mutable/HashSet.scala b/src/library/scala/collection/mutable/HashSet.scala
index 886fee5..3a16e4e 100644
--- a/src/library/scala/collection/mutable/HashSet.scala
+++ b/src/library/scala/collection/mutable/HashSet.scala
@@ -70,7 +70,7 @@ extends AbstractSet[A]
 
   override def iterator: Iterator[A] = super[FlatHashTable].iterator
 
-  override def foreach[U](f: A =>  U) {
+  override def foreach[U](f: A => U) {
     var i = 0
     val len = table.length
     while (i < len) {
diff --git a/src/library/scala/collection/mutable/HashTable.scala b/src/library/scala/collection/mutable/HashTable.scala
index 65d9c35..b48a32f 100644
--- a/src/library/scala/collection/mutable/HashTable.scala
+++ b/src/library/scala/collection/mutable/HashTable.scala
@@ -449,7 +449,7 @@ private[collection] object HashTable {
       // h
 
       /* OLD VERSION
-       * quick, but bad for sequence 0-10000 - little enthropy in higher bits
+       * quick, but bad for sequence 0-10000 - little entropy in higher bits
        * since 2003 */
       // var h: Int = hcode + ~(hcode << 9)
       // h = h ^ (h >>> 14)
diff --git a/src/library/scala/collection/mutable/ImmutableSetAdaptor.scala b/src/library/scala/collection/mutable/ImmutableSetAdaptor.scala
index 730b222..d7eec70 100644
--- a/src/library/scala/collection/mutable/ImmutableSetAdaptor.scala
+++ b/src/library/scala/collection/mutable/ImmutableSetAdaptor.scala
@@ -32,7 +32,7 @@ extends AbstractSet[A]
 
   def contains(elem: A): Boolean = set.contains(elem)
 
-  override def foreach[U](f: A =>  U): Unit = set.foreach(f)
+  override def foreach[U](f: A => U): Unit = set.foreach(f)
 
   override def exists(p: A => Boolean): Boolean = set.exists(p)
 
diff --git a/src/library/scala/collection/mutable/IndexedSeqOptimized.scala b/src/library/scala/collection/mutable/IndexedSeqOptimized.scala
old mode 100755
new mode 100644
diff --git a/src/library/scala/collection/mutable/LinkedListLike.scala b/src/library/scala/collection/mutable/LinkedListLike.scala
index a9d385b..d0748b8 100644
--- a/src/library/scala/collection/mutable/LinkedListLike.scala
+++ b/src/library/scala/collection/mutable/LinkedListLike.scala
@@ -172,7 +172,7 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq
     }
   }
 
-  override def foreach[B](f: A => B) {
+  override def foreach[U](f: A => U) {
     var these = this
     while (these.nonEmpty) {
       f(these.elem)
diff --git a/src/library/scala/collection/mutable/ListBuffer.scala b/src/library/scala/collection/mutable/ListBuffer.scala
index 8faaf97..f9bab40 100644
--- a/src/library/scala/collection/mutable/ListBuffer.scala
+++ b/src/library/scala/collection/mutable/ListBuffer.scala
@@ -15,7 +15,7 @@ import immutable.{List, Nil, ::}
 import java.io._
 import scala.annotation.migration
 
-/** A `Buffer` implementation back up by a list. It provides constant time
+/** A `Buffer` implementation backed by a list. It provides constant time
  *  prepend and append. Most other operations are linear.
  *
  *  @author  Matthias Zenger
diff --git a/src/library/scala/collection/mutable/ListMap.scala b/src/library/scala/collection/mutable/ListMap.scala
index 2ea5b1f..e963af4 100644
--- a/src/library/scala/collection/mutable/ListMap.scala
+++ b/src/library/scala/collection/mutable/ListMap.scala
@@ -15,7 +15,7 @@ package mutable
 import generic._
 import annotation.tailrec
 
-/** A simple mutable map backed by a list.
+/** A simple mutable map backed by a list, so it preserves insertion order.
  *
  *  @tparam A    the type of the keys contained in this list map.
  *  @tparam B    the type of the values assigned to keys in this list map.
diff --git a/src/library/scala/collection/mutable/LongMap.scala b/src/library/scala/collection/mutable/LongMap.scala
index c124f35..198e34b 100644
--- a/src/library/scala/collection/mutable/LongMap.scala
+++ b/src/library/scala/collection/mutable/LongMap.scala
@@ -5,20 +5,20 @@ package mutable
 import generic.CanBuildFrom
 
 /** This class implements mutable maps with `Long` keys based on a hash table with open addressing.
- * 
- *  Basic map operations on single entries, including `contains` and `get`, 
+ *
+ *  Basic map operations on single entries, including `contains` and `get`,
  *  are typically substantially faster with `LongMap` than [[HashMap]].  Methods
  *  that act on the whole map,  including `foreach` and `map` are not in
  *  general expected to be faster than with a generic map, save for those
  *  that take particular advantage of the internal structure of the map:
  *  `foreachKey`, `foreachValue`, `mapValuesNow`, and `transformValues`.
- * 
+ *
  *  Maps with open addressing may become less efficient at lookup after
  *  repeated addition/removal of elements.  Although `LongMap` makes a
  *  decent attempt to remain efficient regardless,  calling `repack`
  *  on a map that will no longer have elements removed but will be
  *  used heavily may save both time and storage space.
- * 
+ *
  *  This map is not intended to contain more than 2^29 entries (approximately
  *  500 million).  The maximum capacity is 2^30, but performance will degrade
  *  rapidly as 2^30 is approached.
@@ -33,20 +33,20 @@ extends AbstractMap[Long, V]
   import LongMap._
 
   def this() = this(LongMap.exceptionDefault, 16, true)
-  
+
   /** Creates a new `LongMap` that returns default values according to a supplied key-value mapping. */
   def this(defaultEntry: Long => V) = this(defaultEntry, 16, true)
-  
+
   /** Creates a new `LongMap` with an initial buffer of specified size.
-   * 
+   *
    *  A LongMap can typically contain half as many elements as its buffer size
    *  before it requires resizing.
    */
   def this(initialBufferSize: Int) = this(LongMap.exceptionDefault, initialBufferSize, true)
-  
+
   /** Creates a new `LongMap` with specified default values and initial buffer size. */
   def this(defaultEntry: Long => V,  initialBufferSize: Int) = this(defaultEntry,  initialBufferSize,  true)
-  
+
   private[this] var mask = 0
   private[this] var extraKeys: Int = 0
   private[this] var zeroValue: AnyRef = null
@@ -55,43 +55,43 @@ extends AbstractMap[Long, V]
   private[this] var _vacant = 0
   private[this] var _keys: Array[Long] = null
   private[this] var _values: Array[AnyRef] = null
-    
+
   if (initBlank) defaultInitialize(initialBufferSize)
-  
+
   private[this] def defaultInitialize(n: Int) = {
-    mask = 
+    mask =
       if (n<0) 0x7
       else (((1 << (32 - java.lang.Integer.numberOfLeadingZeros(n-1))) - 1) & 0x3FFFFFFF) | 0x7
     _keys = new Array[Long](mask+1)
     _values = new Array[AnyRef](mask+1)
   }
-  
+
   private[collection] def initializeTo(
     m: Int, ek: Int, zv: AnyRef, mv: AnyRef, sz: Int, vc: Int, kz: Array[Long], vz: Array[AnyRef]
   ) {
     mask = m; extraKeys = ek; zeroValue = zv; minValue = mv; _size = sz; _vacant = vc; _keys = kz; _values = vz
   }
-  
+
   override def size: Int = _size + (extraKeys+1)/2
   override def empty: LongMap[V] = new LongMap()
-  
-  private def imbalanced: Boolean = 
+
+  private def imbalanced: Boolean =
     (_size + _vacant) > 0.5*mask || _vacant > _size
-  
+
   private def toIndex(k: Long): Int = {
     // Part of the MurmurHash3 32 bit finalizer
     val h = ((k ^ (k >>> 32)) & 0xFFFFFFFFL).toInt
     val x = (h ^ (h >>> 16)) * 0x85EBCA6B
     (x ^ (x >>> 13)) & mask
   }
-  
+
   private def seekEmpty(k: Long): Int = {
     var e = toIndex(k)
     var x = 0
     while (_keys(e) != 0) { x += 1; e = (e + 2*(x+1)*x - 3) & mask }
     e
   }
-  
+
   private def seekEntry(k: Long): Int = {
     var e = toIndex(k)
     var x = 0
@@ -99,7 +99,7 @@ extends AbstractMap[Long, V]
     while ({ q = _keys(e); if (q==k) return e; q != 0}) { x += 1; e = (e + 2*(x+1)*x - 3) & mask }
     e | MissingBit
   }
-  
+
   private def seekEntryOrOpen(k: Long): Int = {
     var e = toIndex(k)
     var x = 0
@@ -116,12 +116,12 @@ extends AbstractMap[Long, V]
     }
     o
   }
-  
+
   override def contains(key: Long): Boolean = {
     if (key == -key) (((key>>>63).toInt+1) & extraKeys) != 0
     else seekEntry(key) >= 0
   }
-  
+
   override def get(key: Long): Option[V] = {
     if (key == -key) {
       if ((((key>>>63).toInt+1) & extraKeys) == 0) None
@@ -133,7 +133,7 @@ extends AbstractMap[Long, V]
       if (i < 0) None else Some(_values(i).asInstanceOf[V])
     }
   }
-  
+
   override def getOrElse[V1 >: V](key: Long, default: => V1): V1 = {
     if (key == -key) {
       if ((((key>>>63).toInt+1) & extraKeys) == 0) default
@@ -145,7 +145,7 @@ extends AbstractMap[Long, V]
       if (i < 0) default else _values(i).asInstanceOf[V1]
     }
   }
-  
+
   override def getOrElseUpdate(key: Long, defaultValue: => V): V = {
     if (key == -key) {
       val kbits = (key>>>63).toInt + 1
@@ -185,10 +185,10 @@ extends AbstractMap[Long, V]
       else _values(i).asInstanceOf[V]
     }
   }
-  
+
   /** Retrieves the value associated with a key, or the default for that type if none exists
    *  (null for AnyRef, 0 for floats and integers).
-   * 
+   *
    *  Note: this is the fastest way to retrieve a value that may or
    *  may not exist, if the default null/zero is acceptable.  For key/value
    *  pairs that do exist,  `apply` (i.e. `map(key)`) is equally fast.
@@ -204,8 +204,8 @@ extends AbstractMap[Long, V]
       if (i < 0) null.asInstanceOf[V] else _values(i).asInstanceOf[V]
     }
   }
-  
-  /** Retrieves the value associated with a key. 
+
+  /** Retrieves the value associated with a key.
    *  If the key does not exist in the map, the `defaultEntry` for that key
    *  will be returned instead.
    */
@@ -220,12 +220,12 @@ extends AbstractMap[Long, V]
       if (i < 0) defaultEntry(key) else _values(i).asInstanceOf[V]
     }
   }
-  
+
   /** The user-supplied default value for the key.  Throws an exception
    *  if no other default behavior was specified.
    */
   override def default(key: Long) = defaultEntry(key)
-  
+
   private def repack(newMask: Int) {
     val ok = _keys
     val ov = _values
@@ -244,9 +244,9 @@ extends AbstractMap[Long, V]
       i += 1
     }
   }
-  
+
   /** Repacks the contents of this `LongMap` for maximum efficiency of lookup.
-   * 
+   *
    *  For maps that undergo a complex creation process with both addition and
    *  removal of keys, and then are used heavily with no further removal of
    *  elements, calling `repack` after the end of the creation can result in
@@ -259,7 +259,7 @@ extends AbstractMap[Long, V]
     while (m > 8 && 8*_size < m) m = m >>> 1
     repack(m)
   }
-  
+
   override def put(key: Long, value: V): Option[V] = {
     if (key == -key) {
       if (key == 0) {
@@ -294,9 +294,9 @@ extends AbstractMap[Long, V]
       }
     }
   }
-  
+
   /** Updates the map to include a new key-value pair.
-   * 
+   *
    *  This is the fastest way to add an entry to a `LongMap`.
    */
   override def update(key: Long, value: V): Unit = {
@@ -326,12 +326,12 @@ extends AbstractMap[Long, V]
       }
     }
   }
-  
+
   /** Adds a new key/value pair to this map and returns the map. */
   def +=(key: Long, value: V): this.type = { update(key, value); this }
-  
+
   def +=(kv: (Long, V)): this.type = { update(kv._1, kv._2); this }
-  
+
   def -=(key: Long): this.type = {
     if (key == -key) {
       if (key == 0L) {
@@ -354,22 +354,22 @@ extends AbstractMap[Long, V]
     }
     this
   }
-  
+
   def iterator: Iterator[(Long, V)] = new Iterator[(Long, V)] {
     private[this] val kz = _keys
     private[this] val vz = _values
-    
-    private[this] var nextPair: (Long, V) = 
+
+    private[this] var nextPair: (Long, V) =
       if (extraKeys==0) null
       else if ((extraKeys&1)==1) (0L, zeroValue.asInstanceOf[V])
       else (Long.MinValue, minValue.asInstanceOf[V])
 
-    private[this] var anotherPair: (Long, V) = 
+    private[this] var anotherPair: (Long, V) =
       if (extraKeys==3) (Long.MinValue, minValue.asInstanceOf[V])
       else null
-        
+
     private[this] var index = 0
-    
+
     def hasNext: Boolean = nextPair != null || (index < kz.length && {
       var q = kz(index)
       while (q == -q) {
@@ -392,8 +392,8 @@ extends AbstractMap[Long, V]
       ans
     }
   }
-  
-  override def foreach[A](f: ((Long,V)) => A) {
+
+  override def foreach[U](f: ((Long,V)) => U) {
     if ((extraKeys & 1) == 1) f((0L, zeroValue.asInstanceOf[V]))
     if ((extraKeys & 2) == 2) f((Long.MinValue, minValue.asInstanceOf[V]))
     var i,j = 0
@@ -406,7 +406,7 @@ extends AbstractMap[Long, V]
       i += 1
     }
   }
-  
+
   override def clone(): LongMap[V] = {
     val kz = java.util.Arrays.copyOf(_keys, _keys.length)
     val vz = java.util.Arrays.copyOf(_values,  _values.length)
@@ -414,7 +414,7 @@ extends AbstractMap[Long, V]
     lm.initializeTo(mask, extraKeys, zeroValue, minValue, _size, _vacant, kz,  vz)
     lm
   }
-  
+
   /** Applies a function to all keys of this map. */
   def foreachKey[A](f: Long => A) {
     if ((extraKeys & 1) == 1) f(0L)
@@ -444,7 +444,7 @@ extends AbstractMap[Long, V]
       i += 1
     }
   }
-  
+
   /** Creates a new `LongMap` with different values.
    *  Unlike `mapValues`, this method generates a new
    *  collection immediately.
@@ -467,8 +467,8 @@ extends AbstractMap[Long, V]
     lm.initializeTo(mask, extraKeys, zv, mv, _size, _vacant, kz, vz)
     lm
   }
-  
-  /** Applies a transformation function to all values stored in this map. 
+
+  /** Applies a transformation function to all values stored in this map.
    *  Note: the default, if any,  is not transformed.
    */
   def transformValues(f: V => V): this.type = {
@@ -492,15 +492,15 @@ object LongMap {
   private final val MissingBit = 0x80000000
   private final val VacantBit  = 0x40000000
   private final val MissVacant = 0xC0000000
-  
+
   private val exceptionDefault: Long => Nothing = (k: Long) => throw new NoSuchElementException(k.toString)
-  
-  implicit def canBuildFrom[V, U]: CanBuildFrom[LongMap[V], (Long, U), LongMap[U]] = 
+
+  implicit def canBuildFrom[V, U]: CanBuildFrom[LongMap[V], (Long, U), LongMap[U]] =
     new CanBuildFrom[LongMap[V], (Long, U), LongMap[U]] {
       def apply(from: LongMap[V]): LongMapBuilder[U] = apply()
       def apply(): LongMapBuilder[U] = new LongMapBuilder[U]
     }
-  
+
   final class LongMapBuilder[V] extends Builder[(Long, V), LongMap[V]] {
     private[collection] var elems: LongMap[V] = new LongMap[V]
     def +=(entry: (Long, V)): this.type = {
@@ -519,14 +519,14 @@ object LongMap {
     if (lm.size < (sz>>3)) lm.repack()
     lm
   }
-  
+
   /** Creates a new empty `LongMap`. */
   def empty[V]: LongMap[V] = new LongMap[V]
-  
+
   /** Creates a new empty `LongMap` with the supplied default */
   def withDefault[V](default: Long => V): LongMap[V] = new LongMap[V](default)
-  
-  /** Creates a new `LongMap` from arrays of keys and values. 
+
+  /** Creates a new `LongMap` from arrays of keys and values.
    *  Equivalent to but more efficient than `LongMap((keys zip values): _*)`.
    */
   def fromZip[V](keys: Array[Long], values: Array[V]): LongMap[V] = {
@@ -537,8 +537,8 @@ object LongMap {
     if (lm.size < (sz>>3)) lm.repack()
     lm
   }
-  
-  /** Creates a new `LongMap` from keys and values. 
+
+  /** Creates a new `LongMap` from keys and values.
    *  Equivalent to but more efficient than `LongMap((keys zip values): _*)`.
    */
   def fromZip[V](keys: Iterable[Long], values: Iterable[V]): LongMap[V] = {
diff --git a/src/library/scala/collection/mutable/OpenHashMap.scala b/src/library/scala/collection/mutable/OpenHashMap.scala
index 24f5761..5f8f5b9 100644
--- a/src/library/scala/collection/mutable/OpenHashMap.scala
+++ b/src/library/scala/collection/mutable/OpenHashMap.scala
@@ -81,6 +81,9 @@ extends AbstractMap[Key, Value]
     h ^ (h >>> 7) ^ (h >>> 4)
   }
 
+  /** Increase the size of the table.
+    * Copy only the occupied slots, effectively eliminating the deleted slots.
+    */
   private[this] def growTable() = {
     val oldSize = mask + 1
     val newSize = 4 * oldSize
@@ -92,8 +95,18 @@ extends AbstractMap[Key, Value]
     deleted = 0
   }
 
+  /** Return the index of the first slot in the hash table (in probe order)
+    * that either is empty, or is or was last occupied by the given key.
+    */
   private[this] def findIndex(key: Key) : Int = findIndex(key, hashOf(key))
 
+  /** Return the index of the first slot in the hash table (in probe order)
+    * that either is empty, or is or was last occupied by the given key.
+    * 
+    * This method is an optimization for when the hash value is in hand.
+    * 
+    * @param hash hash value for `key`
+    */
   private[this] def findIndex(key: Key, hash: Int): Int = {
     var j = hash
 
@@ -136,7 +149,11 @@ extends AbstractMap[Key, Value]
       None
     } else {
       val res = entry.value
-      if (entry.value == None) { size += 1; modCount += 1 }
+      if (entry.value == None) {
+        size += 1
+        deleted -= 1
+        modCount += 1
+      }
       entry.value = Some(value)
       res
     }
diff --git a/src/library/scala/collection/mutable/PriorityQueue.scala b/src/library/scala/collection/mutable/PriorityQueue.scala
index d3c4161..2562f60 100644
--- a/src/library/scala/collection/mutable/PriorityQueue.scala
+++ b/src/library/scala/collection/mutable/PriorityQueue.scala
@@ -18,8 +18,19 @@ import generic._
  *
  *  Only the `dequeue` and `dequeueAll` methods will return methods in priority
  *  order (while removing elements from the heap).  Standard collection methods
- *  including `drop` and `iterator` will remove or traverse the heap in whichever
- *  order seems most convenient.
+ *  including `drop`, `iterator`, and `toString` will remove or traverse the heap
+ *  in whichever order seems most convenient.
+ *
+ *  Therefore, printing a `PriorityQueue` will not reveal the priority order of
+ *  the elements, though the highest-priority element will be printed first.  To
+ *  print the elements in order, one must duplicate the `PriorityQueue` (by using
+ *  `clone`, for instance) and then dequeue them:
+ *
+ *  @example {{{
+ *  val pq = collection.mutable.PriorityQueue(1, 2, 5, 3, 7)
+ *  println(pq)                  // elements probably not in order
+ *  println(pq.clone.dequeueAll) // prints Vector(7, 5, 3, 2, 1)
+ *  }}}
  *
  *  @tparam A    type of the elements in this priority queue.
  *  @param ord   implicit ordering used to compare the elements of type `A`.
diff --git a/src/library/scala/collection/mutable/Queue.scala b/src/library/scala/collection/mutable/Queue.scala
index 03d387a..ad60173 100644
--- a/src/library/scala/collection/mutable/Queue.scala
+++ b/src/library/scala/collection/mutable/Queue.scala
@@ -21,7 +21,7 @@ import generic._
  *  @author  Martin Odersky
  *  @version 2.8
  *  @since   1
- *  @see [[http://docs.scala-lang.org/overviews/collections/concrete-mutable-collection-classes.html#mutable_queues "Scala's Collection Library overview"]]
+ *  @see [[http://docs.scala-lang.org/overviews/collections/concrete-mutable-collection-classes.html#queues "Scala's Collection Library overview"]]
  *  section on `Queues` for more information.
  *
  *  @define Coll `mutable.Queue`
diff --git a/src/library/scala/collection/mutable/SetLike.scala b/src/library/scala/collection/mutable/SetLike.scala
index 81a71ad..01075a2 100644
--- a/src/library/scala/collection/mutable/SetLike.scala
+++ b/src/library/scala/collection/mutable/SetLike.scala
@@ -129,7 +129,9 @@ trait SetLike[A, +This <: SetLike[A, This] with Set[A]]
   /** Removes all elements from the set. After this operation is completed,
    *  the set will be empty.
    */
-  def clear() { foreach(-=) }
+  def clear(): Unit =
+    for (elem <- this.toList)
+      this -= elem
 
   override def clone(): This = empty ++= repr.seq
 
diff --git a/src/library/scala/collection/mutable/SynchronizedSet.scala b/src/library/scala/collection/mutable/SynchronizedSet.scala
index 60e2e79..dd842f2 100644
--- a/src/library/scala/collection/mutable/SynchronizedSet.scala
+++ b/src/library/scala/collection/mutable/SynchronizedSet.scala
@@ -78,7 +78,7 @@ trait SynchronizedSet[A] extends Set[A] {
     super.subsetOf(that)
   }
 
-  override def foreach[U](f: A =>  U) = synchronized {
+  override def foreach[U](f: A => U) = synchronized {
     super.foreach(f)
   }
 
diff --git a/src/library/scala/collection/mutable/UnrolledBuffer.scala b/src/library/scala/collection/mutable/UnrolledBuffer.scala
index 693c47d..2212486 100644
--- a/src/library/scala/collection/mutable/UnrolledBuffer.scala
+++ b/src/library/scala/collection/mutable/UnrolledBuffer.scala
@@ -85,7 +85,7 @@ extends scala.collection.mutable.AbstractBuffer[T]
 
   def classTagCompanion = UnrolledBuffer
 
-  /** Concatenates the targer unrolled buffer to this unrolled buffer.
+  /** Concatenates the target unrolled buffer to this unrolled buffer.
    *
    *  The specified buffer `that` is cleared after this operation. This is
    *  an O(1) operation.
@@ -208,7 +208,7 @@ object UnrolledBuffer extends ClassTagTraversableFactory[UnrolledBuffer] {
   def newBuilder[T](implicit t: ClassTag[T]): Builder[T, UnrolledBuffer[T]] = new UnrolledBuffer[T]
 
   val waterline = 50
-  val waterlineDelim = 100
+  val waterlineDelim = 100    // TODO -- fix this name!  It's a denominator, not a delimiter.  (But it's part of the API so we can't just change it.)
   private[collection] val unrolledlength = 32
 
   /** Unrolled buffer node.
@@ -319,13 +319,15 @@ object UnrolledBuffer extends ClassTagTraversableFactory[UnrolledBuffer] {
 	for (elem <- t) curr = curr append elem
 	curr.next = newnextnode
 
-	// try to merge the last node of this with the newnextnode
+	// try to merge the last node of this with the newnextnode and fix tail pointer if needed
 	if (curr.tryMergeWithNext()) buffer.lastPtr = curr
+	else if (newnextnode.next eq null) buffer.lastPtr = newnextnode
       }
-      else if (idx == size) {
+      else if (idx == size || (next eq null)) {
 	var curr = this
 	for (elem <- t) curr = curr append elem
-      } else insertAll(idx - size, t, buffer)
+      }
+      else next.insertAll(idx - size, t, buffer)
     }
     private def nullout(from: Int, until: Int) {
       var idx = from
@@ -344,7 +346,7 @@ object UnrolledBuffer extends ClassTagTraversableFactory[UnrolledBuffer] {
       tryMergeWithNext()
     }
 
-    override def toString = array.take(size).mkString("Unrolled[" + array.length + "](", ", ", ")") + " -> " + (if (next ne null) next.toString else "")
+    override def toString = array.take(size).mkString("Unrolled@%08x".format(System.identityHashCode(this)) + "[" + size + "/" + array.length + "](", ", ", ")") + " -> " + (if (next ne null) next.toString else "")
   }
 
 }
diff --git a/src/library/scala/collection/mutable/WrappedArray.scala b/src/library/scala/collection/mutable/WrappedArray.scala
index 53fca9f..8740bda 100644
--- a/src/library/scala/collection/mutable/WrappedArray.scala
+++ b/src/library/scala/collection/mutable/WrappedArray.scala
@@ -93,7 +93,7 @@ object WrappedArray {
   def empty[T <: AnyRef]: WrappedArray[T] = EmptyWrappedArray.asInstanceOf[WrappedArray[T]]
 
   // If make is called explicitly we use whatever we're given, even if it's
-  // empty.  This may be unnecesssary (if WrappedArray is to honor the collections
+  // empty.  This may be unnecessary (if WrappedArray is to honor the collections
   // contract all empty ones must be equal, so discriminating based on the reference
   // equality of an empty array should not come up) but we may as well be
   // conservative since wrapRefArray contributes most of the unnecessary allocations.
diff --git a/src/library/scala/collection/package.scala b/src/library/scala/collection/package.scala
index 6a2b6de..856f901 100644
--- a/src/library/scala/collection/package.scala
+++ b/src/library/scala/collection/package.scala
@@ -13,8 +13,11 @@ package scala
  *
  * == Guide ==
  *
- * A detailed guide for the collections library is available
+ * A detailed guide for using the collections library is available
  * at [[http://docs.scala-lang.org/overviews/collections/introduction.html]].
+ * Developers looking to extend the collections library can find a description
+ * of its architecture at
+ * [[http://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html]].
  *
  * == Using Collections ==
  *
@@ -31,24 +34,25 @@ package scala
  * array: Array[Int] = Array(1, 2, 3, 4, 5, 6)
  *
  * scala> array map { _.toString }
- * res0: Array[java.lang.String] = Array(1, 2, 3, 4, 5, 6)
+ * res0: Array[String] = Array(1, 2, 3, 4, 5, 6)
  *
  * scala> val list = List(1,2,3,4,5,6)
  * list: List[Int] = List(1, 2, 3, 4, 5, 6)
  *
  * scala> list map { _.toString }
- * res1: List[java.lang.String] = List(1, 2, 3, 4, 5, 6)
+ * res1: List[String] = List(1, 2, 3, 4, 5, 6)
  *
  * }}}
  *
  * == Creating Collections ==
  *
- * The most common way to create a collection is to use the companion objects as factories.
- * Of these, the three most common
- * are [[scala.collection.Seq]], [[scala.collection.immutable.Set]], and [[scala.collection.immutable.Map]].  Their
- * companion objects are all available
- * as type aliases the either the [[scala]] package or in `scala.Predef`, and can be used
- * like so:
+ * The most common way to create a collection is to use its companion object as
+ * a factory. The three most commonly used collections are
+ * [[scala.collection.Seq]], [[scala.collection.immutable.Set]], and
+ * [[scala.collection.immutable.Map]].
+ * They can be used directly as shown below since their companion objects are
+ * all available as type aliases in either the [[scala]] package or in
+ * `scala.Predef`. New collections are created like this:
  * {{{
  * scala> val seq = Seq(1,2,3,4,1)
  * seq: Seq[Int] = List(1, 2, 3, 4, 1)
@@ -56,12 +60,12 @@ package scala
  * scala> val set = Set(1,2,3,4,1)
  * set: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)
  *
- * scala> val map = Map(1 -> "one",2 -> "two", 3 -> "three",2 -> "too")
- * map: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,too), (3,three))
+ * scala> val map = Map(1 -> "one", 2 -> "two", 3 -> "three", 2 -> "too")
+ * map: scala.collection.immutable.Map[Int,String] = Map(1 -> one, 2 -> too, 3 -> three)
  * }}}
  *
- * It is also typical to use the [[scala.collection.immutable]] collections over those
- * in [[scala.collection.mutable]]; The types aliased in
+ * It is also typical to prefer the [[scala.collection.immutable]] collections
+ * over those in [[scala.collection.mutable]]; the types aliased in
  * the `scala.Predef` object are the immutable versions.
  *
  * Also note that the collections library was carefully designed to include several implementations of
@@ -69,11 +73,18 @@ package scala
  * characteristics which are described
  * in [[http://docs.scala-lang.org/overviews/collections/performance-characteristics.html the guide]].
  *
+ * The concrete parallel collections also have specific performance characteristics which are
+ * described in [[http://docs.scala-lang.org/overviews/parallel-collections/concrete-parallel-collections.html#performance-characteristics the parallel collections guide]]
+ *
  * === Converting between Java Collections ===
  *
- * The `JavaConversions` object provides implicit defs that will allow mostly seamless integration
- * between Java Collections-based APIs and the Scala collections library.
+ * The [[scala.collection.JavaConversions]] object provides implicit defs that
+ * will allow mostly seamless integration between APIs using Java Collections
+ * and the Scala collections library.
  *
+ * Alternatively the [[scala.collection.JavaConverters]] object provides a collection
+ * of decorators that allow converting between Scala and Java collections using `asScala`
+ * and `asJava` methods.
  */
 package object collection {
   import scala.collection.generic.CanBuildFrom
diff --git a/src/library/scala/collection/parallel/ParIterableLike.scala b/src/library/scala/collection/parallel/ParIterableLike.scala
index 016255d..8c9b959 100644
--- a/src/library/scala/collection/parallel/ParIterableLike.scala
+++ b/src/library/scala/collection/parallel/ParIterableLike.scala
@@ -520,22 +520,22 @@ self: ParIterableLike[T, Repr, Sequential] =>
    *
    *  $abortsignalling
    *
-   *  @param pred    a predicate used to test elements
+   *  @param p       a predicate used to test elements
    *  @return        true if `p` holds for all elements, false otherwise
    */
-  def forall(pred: T => Boolean): Boolean = {
-    tasksupport.executeAndWaitResult(new Forall(pred, splitter assign new DefaultSignalling with VolatileAbort))
+  def forall(@deprecatedName('pred) p: T => Boolean): Boolean = {
+    tasksupport.executeAndWaitResult(new Forall(p, splitter assign new DefaultSignalling with VolatileAbort))
   }
 
   /** Tests whether a predicate holds for some element of this $coll.
    *
    *  $abortsignalling
    *
-   *  @param pred    a predicate used to test elements
+   *  @param p       a predicate used to test elements
    *  @return        true if `p` holds for some element, false otherwise
    */
-  def exists(pred: T => Boolean): Boolean = {
-    tasksupport.executeAndWaitResult(new Exists(pred, splitter assign new DefaultSignalling with VolatileAbort))
+  def exists(@deprecatedName('pred) p: T => Boolean): Boolean = {
+    tasksupport.executeAndWaitResult(new Exists(p, splitter assign new DefaultSignalling with VolatileAbort))
   }
 
   /** Finds some element in the collection for which the predicate holds, if such
@@ -546,11 +546,11 @@ self: ParIterableLike[T, Repr, Sequential] =>
    *
    *  $abortsignalling
    *
-   *  @param pred     predicate used to test the elements
+   *  @param p        predicate used to test the elements
    *  @return         an option value with the element if such an element exists, or `None` otherwise
    */
-  def find(pred: T => Boolean): Option[T] = {
-    tasksupport.executeAndWaitResult(new Find(pred, splitter assign new DefaultSignalling with VolatileAbort))
+  def find(@deprecatedName('pred) p: T => Boolean): Option[T] = {
+    tasksupport.executeAndWaitResult(new Find(p, splitter assign new DefaultSignalling with VolatileAbort))
   }
 
   /** Creates a combiner factory. Each combiner factory instance is used
@@ -1499,5 +1499,4 @@ self: ParIterableLike[T, Repr, Sequential] =>
       append(s)
     }
   })
-
 }
diff --git a/src/library/scala/collection/parallel/ParMapLike.scala b/src/library/scala/collection/parallel/ParMapLike.scala
index ee1334b..0a671fb 100644
--- a/src/library/scala/collection/parallel/ParMapLike.scala
+++ b/src/library/scala/collection/parallel/ParMapLike.scala
@@ -99,14 +99,14 @@ self =>
     def - (elem: K): ParSet[K] =
       (ParSet[K]() ++ this - elem).asInstanceOf[ParSet[K]] // !!! concrete overrides abstract problem
     override def size = self.size
-    override def foreach[S](f: K => S) = for ((k, v) <- self) f(k)
+    override def foreach[U](f: K => U) = for ((k, v) <- self) f(k)
     override def seq = self.seq.keySet
   }
 
   protected class DefaultValuesIterable extends ParIterable[V] {
     def splitter = valuesIterator(self.splitter)
     override def size = self.size
-    override def foreach[S](f: V => S) = for ((k, v) <- self) f(v)
+    override def foreach[U](f: V => U) = for ((k, v) <- self) f(v)
     def seq = self.seq.values
   }
 
@@ -118,7 +118,7 @@ self =>
 
   def filterKeys(p: K => Boolean): ParMap[K, V] = new ParMap[K, V] {
     lazy val filtered = self.filter(kv => p(kv._1))
-    override def foreach[S](f: ((K, V)) => S): Unit = for (kv <- self) if (p(kv._1)) f(kv)
+    override def foreach[U](f: ((K, V)) => U): Unit = for (kv <- self) if (p(kv._1)) f(kv)
     def splitter = filtered.splitter
     override def contains(key: K) = self.contains(key) && p(key)
     def get(key: K) = if (!p(key)) None else self.get(key)
@@ -129,7 +129,7 @@ self =>
   }
 
   def mapValues[S](f: V => S): ParMap[K, S] = new ParMap[K, S] {
-    override def foreach[Q](g: ((K, S)) => Q): Unit = for ((k, v) <- self) g((k, f(v)))
+    override def foreach[U](g: ((K, S)) => U): Unit = for ((k, v) <- self) g((k, f(v)))
     def splitter = self.splitter.map(kv => (kv._1, f(kv._2)))
     override def size = self.size
     override def contains(key: K) = self.contains(key)
diff --git a/src/library/scala/collection/readme-if-you-want-to-add-something.txt b/src/library/scala/collection/readme-if-you-want-to-add-something.txt
old mode 100755
new mode 100644
diff --git a/src/library/scala/compat/Platform.scala b/src/library/scala/compat/Platform.scala
index 4c82d6e..42dfcbf 100644
--- a/src/library/scala/compat/Platform.scala
+++ b/src/library/scala/compat/Platform.scala
@@ -41,7 +41,7 @@ object Platform {
     * @throws java.lang.ArrayStoreException If either `src` or `dest` are not of type
     *                [java.lang.Array]; or if the element type of `src` is not
     *                compatible with that of `dest`.
-    * @throws java.lang.IndexOutOfBoundsException If either srcPos` or `destPos` are
+    * @throws java.lang.IndexOutOfBoundsException If either `srcPos` or `destPos` are
     *                outside of the bounds of their respective arrays; or if `length`
     *                is negative; or if there are less than `length` elements available
     *                after `srcPos` or `destPos` in `src` and `dest` respectively.
diff --git a/src/library/scala/concurrent/Future.scala b/src/library/scala/concurrent/Future.scala
index 9146463..ebc1e76 100644
--- a/src/library/scala/concurrent/Future.scala
+++ b/src/library/scala/concurrent/Future.scala
@@ -43,6 +43,8 @@ import scala.reflect.ClassTag
  *
  *  @author  Philipp Haller, Heather Miller, Aleksandar Prokopec, Viktor Klang
  *
+ *  @see [[http://docs.scala-lang.org/overviews/core/futures.html Futures and Promises]]
+ *
  *  @define multipleCallbacks
  *  Multiple callbacks may be registered; there is no guarantee that they will be
  *  executed in a particular order.
@@ -497,7 +499,7 @@ object Future {
   def sequence[A, M[X] <: TraversableOnce[X]](in: M[Future[A]])(implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]], executor: ExecutionContext): Future[M[A]] = {
     in.foldLeft(successful(cbf(in))) {
       (fr, fa) => for (r <- fr; a <- fa) yield (r += a)
-    } map (_.result())
+    }.map(_.result())(InternalCallbackExecutor)
   }
 
   /** Returns a new `Future` to the result of the first future in the list that is completed.
diff --git a/src/library/scala/concurrent/JavaConversions.scala b/src/library/scala/concurrent/JavaConversions.scala
index 3d0597c..91e55d3 100644
--- a/src/library/scala/concurrent/JavaConversions.scala
+++ b/src/library/scala/concurrent/JavaConversions.scala
@@ -11,7 +11,7 @@ package scala.concurrent
 import java.util.concurrent.{ExecutorService, Executor}
 import scala.language.implicitConversions
 
-/** The `JavaConversions` object provides implicit converstions supporting
+/** The `JavaConversions` object provides implicit conversions supporting
  *  interoperability between Scala and Java concurrency classes.
  *
  *  @author Philipp Haller
diff --git a/src/library/scala/concurrent/SyncVar.scala b/src/library/scala/concurrent/SyncVar.scala
index 9634f6d..1ee27b0 100644
--- a/src/library/scala/concurrent/SyncVar.scala
+++ b/src/library/scala/concurrent/SyncVar.scala
@@ -40,7 +40,7 @@ class SyncVar[A] {
     wait(timeout)
     val elapsed = System.nanoTime() - start
     // nanoTime should be monotonic, but it's not possible to rely on that.
-    // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6458294.
+    // See http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6458294.
     if (elapsed < 0) 0 else TimeUnit.NANOSECONDS.toMillis(elapsed)
   }
 
diff --git a/src/library/scala/concurrent/duration/Duration.scala b/src/library/scala/concurrent/duration/Duration.scala
index 2eded9f..e68a897 100644
--- a/src/library/scala/concurrent/duration/Duration.scala
+++ b/src/library/scala/concurrent/duration/Duration.scala
@@ -94,7 +94,7 @@ object Duration {
     timeUnitLabels flatMap { case (unit, names) => expandLabels(names) map (_ -> unit) } toMap
 
   /**
-   * Extract length and time unit out of a string, where the format must match the description for [[Duration$.apply(String):Duration apply(String)]].
+   * Extract length and time unit out of a string, where the format must match the description for [[Duration$.apply(s:String)* apply(String)]].
    * The extractor will not match for malformed strings or non-finite durations.
    */
   def unapply(s: String): Option[(Long, TimeUnit)] =
@@ -182,6 +182,7 @@ object Duration {
     def compare(other: Duration) = if (other eq this) 0 else 1
     def unary_- : Duration = this
     def toUnit(unit: TimeUnit): Double = Double.NaN
+    private def readResolve(): AnyRef = Undefined      // Instructs deserialization to use this same instance
   }
 
   sealed abstract class Infinite extends Duration {
@@ -230,7 +231,7 @@ object Duration {
    * but itself. This value closely corresponds to Double.PositiveInfinity,
    * matching its semantics in arithmetic operations.
    */
-  val Inf: Infinite = new Infinite {
+  val Inf: Infinite = new Infinite  {
     override def toString = "Duration.Inf"
     def compare(other: Duration) = other match {
       case x if x eq Undefined => -1 // Undefined != Undefined
@@ -239,6 +240,7 @@ object Duration {
     }
     def unary_- : Duration = MinusInf
     def toUnit(unit: TimeUnit): Double = Double.PositiveInfinity
+    private def readResolve(): AnyRef = Inf            // Instructs deserialization to use this same instance
   }
 
   /**
@@ -251,6 +253,7 @@ object Duration {
     def compare(other: Duration) = if (other eq this) 0 else -1
     def unary_- : Duration = Inf
     def toUnit(unit: TimeUnit): Double = Double.NegativeInfinity
+    private def readResolve(): AnyRef = MinusInf    // Instructs deserialization to use this same instance
   }
 
   // Java Factories
@@ -352,7 +355,7 @@ object Duration {
  *  - isomorphic to `java.lang.Double` when it comes to infinite or undefined values
  *
  * The conversion between Duration and Double is done using [[Duration.toUnit]] (with unit NANOSECONDS)
- * and [[Duration$.fromNanos(Double):Duration Duration.fromNanos(Double)]].
+ * and [[Duration$.fromNanos(nanos:Double)* Duration.fromNanos(Double)]]
  *
  * <h2>Ordering</h2>
  *
diff --git a/src/library/scala/concurrent/impl/AbstractPromise.java b/src/library/scala/concurrent/impl/AbstractPromise.java
index b8165b6..c2520a1 100644
--- a/src/library/scala/concurrent/impl/AbstractPromise.java
+++ b/src/library/scala/concurrent/impl/AbstractPromise.java
@@ -1,6 +1,6 @@
 /*                     __                                               *\
 **     ________ ___   / /  ___     Scala API                            **
-**    / __/ __// _ | / /  / _ |    (c) 2003-2013, LAMP/EPFL             **
+**    / __/ __// _ | / /  / _ |    (c) 2003-2015, LAMP/EPFL             **
 **  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
 ** /____/\___/_/ |_/____/_/ | |                                         **
 **                          |/                                          **
@@ -8,33 +8,10 @@
 
 package scala.concurrent.impl;
 
+import java.util.concurrent.atomic.AtomicReference;
 
-import scala.concurrent.util.Unsafe;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
-
-
-
-abstract class AbstractPromise {
-    private volatile Object _ref;
-
-    final static long _refoffset;
-
-    static {
-	try {
-	    _refoffset = Unsafe.instance.objectFieldOffset(AbstractPromise.class.getDeclaredField("_ref"));
-	} catch (Throwable t) {
-	    throw new ExceptionInInitializerError(t);
-	}
-    }
-
-    protected final boolean updateState(Object oldState, Object newState) {
-	return Unsafe.instance.compareAndSwapObject(this, _refoffset, oldState, newState);
-    }
-
-    protected final Object getState() {
-	return _ref;
-    }
-
-    protected final static AtomicReferenceFieldUpdater<AbstractPromise, Object> updater =
-	AtomicReferenceFieldUpdater.newUpdater(AbstractPromise.class, Object.class, "_ref");
-}
\ No newline at end of file
+ at Deprecated // Since 2.11.8. Extend java.util.concurrent.atomic.AtomicReference instead.
+abstract class AbstractPromise extends AtomicReference<Object> {
+  protected final boolean updateState(Object oldState, Object newState) { return compareAndSet(oldState, newState); }
+  protected final Object getState() { return get(); }
+}
diff --git a/src/library/scala/io/Codec.scala b/src/library/scala/io/Codec.scala
index 60f9919..7cb7858 100644
--- a/src/library/scala/io/Codec.scala
+++ b/src/library/scala/io/Codec.scala
@@ -21,8 +21,8 @@ import scala.language.implicitConversions
 // XML: optional encoding parameter.
 //   <?xml version="1.0" encoding="ISO8859-1" ?>
 //
-// MacRoman vs. UTF-8: see http://jira.codehaus.org/browse/JRUBY-3576
-// -Dfile.encoding: see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4375816
+// MacRoman vs. UTF-8: see http://osdir.com/ml/lang-jruby-devel/2009-04/msg00071.html
+// -Dfile.encoding: see http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4375816
 
 /** A class for character encoding/decoding preferences.
  *
diff --git a/src/library/scala/math/BigDecimal.scala b/src/library/scala/math/BigDecimal.scala
index cf95f94..bb337e7 100644
--- a/src/library/scala/math/BigDecimal.scala
+++ b/src/library/scala/math/BigDecimal.scala
@@ -49,7 +49,7 @@ object BigDecimal {
   
   /** Constructs a `BigDecimal` using the decimal text representation of `Double` value `d`, rounding if necessary. */
   def decimal(d: Double, mc: MathContext): BigDecimal =
-    new BigDecimal(new BigDec(java.lang.Double.toString(d), mc))
+    new BigDecimal(new BigDec(java.lang.Double.toString(d), mc), mc)
 
   /** Constructs a `BigDecimal` using the decimal text representation of `Double` value `d`. */
   def decimal(d: Double): BigDecimal = decimal(d, defaultMathContext)
@@ -59,7 +59,7 @@ object BigDecimal {
    *  `0.1 != 0.1f`.
    */
   def decimal(f: Float, mc: MathContext): BigDecimal =
-    new BigDecimal(new BigDec(java.lang.Float.toString(f), mc))
+    new BigDecimal(new BigDec(java.lang.Float.toString(f), mc), mc)
 
   /** Constructs a `BigDecimal` using the decimal text representation of `Float` value `f`.
    *  Note that `BigDecimal.decimal(0.1f) != 0.1f` since equality agrees with the `Double` representation, and
@@ -124,7 +124,7 @@ object BigDecimal {
    */
   def exact(s: String): BigDecimal = exact(new BigDec(s))
   
-  /** Constructs a 'BigDecimal` that exactly represents the number
+  /** Constructs a `BigDecimal` that exactly represents the number
    *  specified in base 10 in a character array.
    */
  def exact(cs: Array[Char]): BigDecimal = exact(new BigDec(cs))
@@ -431,7 +431,7 @@ extends ScalaNumber with ScalaNumericConversions with Serializable {
    *  with unequal `hashCode`s.  These hash codes agree with `BigInt`
    *  for whole numbers up ~4934 digits (the range of IEEE 128 bit floating
    *  point).  Beyond this, hash codes will disagree; this prevents the
-   *  explicit represention of the `BigInt` form for `BigDecimal` values
+   *  explicit representation of the `BigInt` form for `BigDecimal` values
    *  with large exponents.
    */
   override def hashCode(): Int = {
diff --git a/src/library/scala/math/Numeric.scala b/src/library/scala/math/Numeric.scala
index eafbf96..9245798 100644
--- a/src/library/scala/math/Numeric.scala
+++ b/src/library/scala/math/Numeric.scala
@@ -134,7 +134,7 @@ object Numeric {
     def div(x: Float, y: Float): Float = x / y
   }
   trait FloatAsIfIntegral extends FloatIsConflicted with Integral[Float] {
-    def quot(x: Float, y: Float): Float = (BigDecimal(x) / BigDecimal(y)).floatValue
+    def quot(x: Float, y: Float): Float = (BigDecimal(x) quot BigDecimal(y)).floatValue
     def rem(x: Float, y: Float): Float = (BigDecimal(x) remainder BigDecimal(y)).floatValue
   }
   implicit object FloatIsFractional extends FloatIsFractional with Ordering.FloatOrdering
@@ -158,7 +158,7 @@ object Numeric {
     def div(x: Double, y: Double): Double = x / y
   }
   trait DoubleAsIfIntegral extends DoubleIsConflicted with Integral[Double] {
-    def quot(x: Double, y: Double): Double = (BigDecimal(x) / BigDecimal(y)).doubleValue
+    def quot(x: Double, y: Double): Double = (BigDecimal(x) quot BigDecimal(y)).doubleValue
     def rem(x: Double, y: Double): Double = (BigDecimal(x) remainder BigDecimal(y)).doubleValue
   }
 
@@ -178,7 +178,7 @@ object Numeric {
     def div(x: BigDecimal, y: BigDecimal): BigDecimal = x / y
   }
   trait BigDecimalAsIfIntegral extends BigDecimalIsConflicted with Integral[BigDecimal] {
-    def quot(x: BigDecimal, y: BigDecimal): BigDecimal = x / y
+    def quot(x: BigDecimal, y: BigDecimal): BigDecimal = x quot y
     def rem(x: BigDecimal, y: BigDecimal): BigDecimal = x remainder y
   }
 
diff --git a/src/library/scala/math/package.scala b/src/library/scala/math/package.scala
index 58ece8a..a759793 100644
--- a/src/library/scala/math/package.scala
+++ b/src/library/scala/math/package.scala
@@ -58,7 +58,19 @@ package object math {
    *          logarithms.
    */
   def exp(x: Double): Double = java.lang.Math.exp(x)
+
+  /** Returns the natural logarithm of a `double` value.
+   *
+   *  @param  x the number to take the natural logarithm of
+   *  @return the value `logₑ(x)` where `e` is Eulers number
+   */
   def log(x: Double): Double = java.lang.Math.log(x)
+  
+  /** Returns the square root of a `double` value.
+   * 
+   * @param  x the number to take the square root of
+   * @return the value √x
+   */
   def sqrt(x: Double): Double = java.lang.Math.sqrt(x)
   def IEEEremainder(x: Double, y: Double): Double = java.lang.Math.IEEEremainder(x, y)
 
diff --git a/src/library/scala/ref/WeakReference.scala b/src/library/scala/ref/WeakReference.scala
index 6ee40ae..9dcc0bb 100644
--- a/src/library/scala/ref/WeakReference.scala
+++ b/src/library/scala/ref/WeakReference.scala
@@ -28,10 +28,7 @@ object WeakReference {
   def apply[T <: AnyRef](value: T) = new WeakReference(value)
 
   /** Optionally returns the referenced value, or `None` if that value no longer exists */
-  def unapply[T <: AnyRef](wr: WeakReference[T]): Option[T] = {
-    val x = wr.underlying.get
-    if (x != null) Some(x) else None
-  }
+  def unapply[T <: AnyRef](wr: WeakReference[T]): Option[T] = Option(wr.underlying.get)
 }
 
 /**
diff --git a/src/library/scala/reflect/ClassManifestDeprecatedApis.scala b/src/library/scala/reflect/ClassManifestDeprecatedApis.scala
index ca7a3cd..82ec872 100644
--- a/src/library/scala/reflect/ClassManifestDeprecatedApis.scala
+++ b/src/library/scala/reflect/ClassManifestDeprecatedApis.scala
@@ -218,7 +218,7 @@ object ClassManifestFactory {
   /** ClassManifest for the abstract type `prefix # name`. `upperBound` is not
     * strictly necessary as it could be obtained by reflection. It was
     * added so that erasure can be calculated without reflection.
-    * todo: remove after next boostrap
+    * todo: remove after next bootstrap
     */
   def abstractType[T](prefix: OptManifest[_], name: String, upperbound: ClassManifest[_], args: OptManifest[_]*): ClassManifest[T] =
     new ClassManifest[T] {
@@ -239,4 +239,4 @@ private class ClassTypeManifest[T](
     (if (prefix.isEmpty) "" else prefix.get.toString+"#") +
     (if (runtimeClass.isArray) "Array" else runtimeClass.getName) +
     argString
-}
\ No newline at end of file
+}
diff --git a/src/library/scala/reflect/Manifest.scala b/src/library/scala/reflect/Manifest.scala
index 2f7643b..e099853 100644
--- a/src/library/scala/reflect/Manifest.scala
+++ b/src/library/scala/reflect/Manifest.scala
@@ -157,6 +157,9 @@ object ManifestFactory {
     override def newArray(len: Int): Array[Unit] = new Array[Unit](len)
     override def newWrappedArray(len: Int): WrappedArray[Unit] = new WrappedArray.ofUnit(new Array[Unit](len))
     override def newArrayBuilder(): ArrayBuilder[Unit] = new ArrayBuilder.ofUnit()
+    override protected def arrayClass[T](tp: Class[_]): Class[Array[T]] =
+      if (tp eq runtimeClass) classOf[Array[scala.runtime.BoxedUnit]].asInstanceOf[Class[Array[T]]]
+      else super.arrayClass(tp)
     private def readResolve(): Any = Manifest.Unit
   }
 
@@ -248,7 +251,7 @@ object ManifestFactory {
   def arrayType[T](arg: Manifest[_]): Manifest[Array[T]] =
     arg.asInstanceOf[Manifest[T]].arrayManifest
 
-  /** Manifest for the abstract type `prefix # name'. `upperBound` is not
+  /** Manifest for the abstract type `prefix # name`. `upperBound` is not
     * strictly necessary as it could be obtained by reflection. It was
     * added so that erasure can be calculated without reflection. */
   def abstractType[T](prefix: Manifest[_], name: String, upperBound: Predef.Class[_], args: Manifest[_]*): Manifest[T] =
@@ -269,7 +272,7 @@ object ManifestFactory {
         (if (upperBound eq Nothing) "" else " <: "+upperBound)
     }
 
-  /** Manifest for the intersection type `parents_0 with ... with parents_n'. */
+  /** Manifest for the intersection type `parents_0 with ... with parents_n`. */
   def intersectionType[T](parents: Manifest[_]*): Manifest[T] =
     new Manifest[T] {
       def runtimeClass = parents.head.runtimeClass
diff --git a/src/library/scala/reflect/NameTransformer.scala b/src/library/scala/reflect/NameTransformer.scala
old mode 100755
new mode 100644
diff --git a/src/library/scala/reflect/ScalaLongSignature.java b/src/library/scala/reflect/ScalaLongSignature.java
index 5b6d78f..94cf504 100644
--- a/src/library/scala/reflect/ScalaLongSignature.java
+++ b/src/library/scala/reflect/ScalaLongSignature.java
@@ -8,5 +8,5 @@ import java.lang.annotation.Target;
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
 public @interface ScalaLongSignature {
-    public String[] bytes();
+    String[] bytes();
 }
diff --git a/src/library/scala/reflect/ScalaSignature.java b/src/library/scala/reflect/ScalaSignature.java
index a8af554..217ae8e 100644
--- a/src/library/scala/reflect/ScalaSignature.java
+++ b/src/library/scala/reflect/ScalaSignature.java
@@ -8,5 +8,5 @@ import java.lang.annotation.Target;
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
 public @interface ScalaSignature {
-    public String bytes();
+    String bytes();
 }
diff --git a/src/library/scala/runtime/BoxesRunTime.java b/src/library/scala/runtime/BoxesRunTime.java
index 82a3b00..9cb1dee 100644
--- a/src/library/scala/runtime/BoxesRunTime.java
+++ b/src/library/scala/runtime/BoxesRunTime.java
@@ -28,7 +28,7 @@ import scala.math.ScalaNumber;
   * @version 2.0 */
 public final class BoxesRunTime
 {
-    private static final int CHAR = 0, BYTE = 1, SHORT = 2, INT = 3, LONG = 4, FLOAT = 5, DOUBLE = 6, OTHER = 7;
+    private static final int CHAR = 0, /* BYTE = 1, SHORT = 2, */ INT = 3, LONG = 4, FLOAT = 5, DOUBLE = 6, OTHER = 7;
 
     /** We don't need to return BYTE and SHORT, as everything which might
      *  care widens to INT.
@@ -43,10 +43,6 @@ public final class BoxesRunTime
         return OTHER;
     }
 
-    private static String boxDescription(Object a) {
-      return "" + a.getClass().getSimpleName() + "(" + a + ")";
-    }
-
 /* BOXING ... BOXING ... BOXING ... BOXING ... BOXING ... BOXING ... BOXING ... BOXING */
 
     public static java.lang.Boolean boxToBoolean(boolean b) {
diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala
index 18fcbf8..20f067f 100644
--- a/src/library/scala/runtime/ScalaRunTime.scala
+++ b/src/library/scala/runtime/ScalaRunTime.scala
@@ -155,7 +155,7 @@ object ScalaRunTime {
     arr
   }
 
-  // Java bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4071957
+  // Java bug: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4071957
   // More background at ticket #2318.
   def ensureAccessible(m: JMethod): JMethod = scala.reflect.ensureAccessible(m)
 
diff --git a/src/library/scala/runtime/TraitSetter.java b/src/library/scala/runtime/TraitSetter.java
old mode 100755
new mode 100644
diff --git a/src/library/scala/runtime/Tuple2Zipped.scala b/src/library/scala/runtime/Tuple2Zipped.scala
index 512c4fb..4109f5c 100644
--- a/src/library/scala/runtime/Tuple2Zipped.scala
+++ b/src/library/scala/runtime/Tuple2Zipped.scala
@@ -84,12 +84,12 @@ final class Tuple2Zipped[El1, Repr1, El2, Repr2](val colls: (TraversableLike[El1
     (b1.result(), b2.result())
   }
 
-  def exists(f: (El1, El2) => Boolean): Boolean = {
+  def exists(@deprecatedName('f) p: (El1, El2) => Boolean): Boolean = {
     val elems2 = colls._2.iterator
 
     for (el1 <- colls._1) {
       if (elems2.hasNext) {
-        if (f(el1, elems2.next()))
+        if (p(el1, elems2.next()))
           return true
       }
       else return false
@@ -97,8 +97,8 @@ final class Tuple2Zipped[El1, Repr1, El2, Repr2](val colls: (TraversableLike[El1
     false
   }
 
-  def forall(f: (El1, El2) => Boolean): Boolean =
-    !exists((x, y) => !f(x, y))
+  def forall(@deprecatedName('f) p: (El1, El2) => Boolean): Boolean =
+    !exists((x, y) => !p(x, y))
 
   def foreach[U](f: (El1, El2) => U): Unit = {
     val elems2 = colls._2.iterator
diff --git a/src/library/scala/runtime/Tuple3Zipped.scala b/src/library/scala/runtime/Tuple3Zipped.scala
index ffd44ac..cde7699 100644
--- a/src/library/scala/runtime/Tuple3Zipped.scala
+++ b/src/library/scala/runtime/Tuple3Zipped.scala
@@ -90,13 +90,13 @@ final class Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3](val colls: (Travers
     result
   }
 
-  def exists(f: (El1, El2, El3) => Boolean): Boolean = {
+  def exists(@deprecatedName('f) p: (El1, El2, El3) => Boolean): Boolean = {
     val elems2 = colls._2.iterator
     val elems3 = colls._3.iterator
 
     for (el1 <- colls._1) {
       if (elems2.hasNext && elems3.hasNext) {
-        if (f(el1, elems2.next(), elems3.next()))
+        if (p(el1, elems2.next(), elems3.next()))
           return true
       }
       else return false
@@ -104,8 +104,8 @@ final class Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3](val colls: (Travers
     false
   }
 
-  def forall(f: (El1, El2, El3) => Boolean): Boolean =
-    !exists((x, y, z) => !f(x, y, z))
+  def forall(@deprecatedName('f) p: (El1, El2, El3) => Boolean): Boolean =
+    !exists((x, y, z) => !p(x, y, z))
 
   def foreach[U](f: (El1, El2, El3) => U): Unit = {
     val elems2 = colls._2.iterator
diff --git a/src/library/scala/runtime/VolatileBooleanRef.java b/src/library/scala/runtime/VolatileBooleanRef.java
old mode 100755
new mode 100644
diff --git a/src/library/scala/runtime/VolatileByteRef.java b/src/library/scala/runtime/VolatileByteRef.java
old mode 100755
new mode 100644
diff --git a/src/library/scala/runtime/VolatileCharRef.java b/src/library/scala/runtime/VolatileCharRef.java
old mode 100755
new mode 100644
diff --git a/src/library/scala/runtime/VolatileDoubleRef.java b/src/library/scala/runtime/VolatileDoubleRef.java
old mode 100755
new mode 100644
diff --git a/src/library/scala/runtime/VolatileFloatRef.java b/src/library/scala/runtime/VolatileFloatRef.java
old mode 100755
new mode 100644
diff --git a/src/library/scala/runtime/VolatileIntRef.java b/src/library/scala/runtime/VolatileIntRef.java
old mode 100755
new mode 100644
diff --git a/src/library/scala/runtime/VolatileLongRef.java b/src/library/scala/runtime/VolatileLongRef.java
old mode 100755
new mode 100644
diff --git a/src/library/scala/runtime/VolatileObjectRef.java b/src/library/scala/runtime/VolatileObjectRef.java
old mode 100755
new mode 100644
diff --git a/src/library/scala/runtime/VolatileShortRef.java b/src/library/scala/runtime/VolatileShortRef.java
old mode 100755
new mode 100644
diff --git a/src/library/scala/sys/BooleanProp.scala b/src/library/scala/sys/BooleanProp.scala
index 74b0a90..b0008b4 100644
--- a/src/library/scala/sys/BooleanProp.scala
+++ b/src/library/scala/sys/BooleanProp.scala
@@ -50,6 +50,7 @@ object BooleanProp {
     def get: String = "" + value
     val clear, enable, disable, toggle = ()
     def option = if (isSet) Some(value) else None
+    //def or[T1 >: Boolean](alt: => T1): T1 = if (value) true else alt
 
     protected def zero = false
   }
@@ -63,12 +64,13 @@ object BooleanProp {
   def valueIsTrue[T](key: String): BooleanProp = new BooleanPropImpl(key, _.toLowerCase == "true")
 
   /** As an alternative, this method creates a BooleanProp which is true
-   *  if the key exists in the map.  This way -Dfoo.bar is enough to be
-   *  considered true.
+   *  if the key exists in the map and is not assigned a value other than "true",
+   *  compared case-insensitively, or the empty string.  This way -Dmy.property
+   *  results in a true-valued property, but -Dmy.property=false does not.
    *
    *  @return   A BooleanProp with a liberal truth policy
    */
-  def keyExists[T](key: String): BooleanProp = new BooleanPropImpl(key, _ => true)
+  def keyExists[T](key: String): BooleanProp = new BooleanPropImpl(key, s => s == "" || s.equalsIgnoreCase("true"))
 
   /** A constant true or false property which ignores all method calls.
    */
diff --git a/src/library/scala/sys/Prop.scala b/src/library/scala/sys/Prop.scala
index 17ae8cb..52a3d89 100644
--- a/src/library/scala/sys/Prop.scala
+++ b/src/library/scala/sys/Prop.scala
@@ -58,6 +58,10 @@ trait Prop[+T] {
    */
   def option: Option[T]
 
+  // Do not open until 2.12.
+  //** This value if the property is set, an alternative value otherwise. */
+  //def or[T1 >: T](alt: => T1): T1
+
   /** Removes the property from the underlying map.
    */
   def clear(): Unit
diff --git a/src/library/scala/sys/process/BasicIO.scala b/src/library/scala/sys/process/BasicIO.scala
index b31bbf0..066b2f5 100644
--- a/src/library/scala/sys/process/BasicIO.scala
+++ b/src/library/scala/sys/process/BasicIO.scala
@@ -203,7 +203,7 @@ object BasicIO {
   /** Returns a `ProcessIO` connected to stdout and stderr, and, optionally, stdin. */
   def standard(connectInput: Boolean): ProcessIO = standard(input(connectInput))
 
-  /** Retruns a `ProcessIO` connected to stdout, stderr and the provided `in` */
+  /** Returns a `ProcessIO` connected to stdout, stderr and the provided `in` */
   def standard(in: OutputStream => Unit): ProcessIO = new ProcessIO(in, toStdOut, toStdErr)
 
   /** Send all the input from the stream to stderr, and closes the input stream
diff --git a/src/library/scala/sys/process/Process.scala b/src/library/scala/sys/process/Process.scala
index dcd06c8..06b9967 100644
--- a/src/library/scala/sys/process/Process.scala
+++ b/src/library/scala/sys/process/Process.scala
@@ -68,7 +68,7 @@ trait ProcessCreation {
   /** Creates a [[scala.sys.process.ProcessBuilder]] with working dir set to `File` and extra
     * environment variables.
     *
-    * @example {{{ apply("java", new java.ioFile("/opt/app"), "CLASSPATH" -> "library.jar") }}}
+    * @example {{{ apply("java", new java.io.File("/opt/app"), "CLASSPATH" -> "library.jar") }}}
     */
   def apply(command: String, cwd: File, extraEnv: (String, String)*): ProcessBuilder =
     apply(command, Some(cwd), extraEnv: _*)
@@ -76,7 +76,7 @@ trait ProcessCreation {
   /** Creates a [[scala.sys.process.ProcessBuilder]] with working dir set to `File` and extra
     * environment variables.
     *
-    * @example {{{ apply("java" :: javaArgs, new java.ioFile("/opt/app"), "CLASSPATH" -> "library.jar") }}}
+    * @example {{{ apply("java" :: javaArgs, new java.io.File("/opt/app"), "CLASSPATH" -> "library.jar") }}}
     */
   def apply(command: Seq[String], cwd: File, extraEnv: (String, String)*): ProcessBuilder =
     apply(command, Some(cwd), extraEnv: _*)
@@ -155,8 +155,8 @@ trait ProcessCreation {
     * import java.net.URL
     * import java.io.File
     *
-    * val spde = new URL("http://technically.us/spde/About")
-    * val dispatch = new URL("http://databinder.net/dispatch/About")
+    * val spde = new URL("http://technically.us/spde.html")
+    * val dispatch = new URL("http://dispatch.databinder.net/Dispatch.html")
     * val build = new File("project/build.properties")
     * cat(spde, dispatch, build) #| "grep -i scala" !
     * }}}
diff --git a/src/library/scala/sys/process/ProcessLogger.scala b/src/library/scala/sys/process/ProcessLogger.scala
index ae34722..6072894 100644
--- a/src/library/scala/sys/process/ProcessLogger.scala
+++ b/src/library/scala/sys/process/ProcessLogger.scala
@@ -88,7 +88,7 @@ object ProcessLogger {
   /** Creates a [[scala.sys.process.ProcessLogger]] that sends all output to the corresponding
    *  function.
    *
-   *  @param fout  This function will receive standard outpout.
+   *  @param fout  This function will receive standard output.
    *
    *  @param ferr  This function will receive standard error.
    */
diff --git a/src/library/scala/sys/process/package.scala b/src/library/scala/sys/process/package.scala
index b1976ad..445c3ae 100644
--- a/src/library/scala/sys/process/package.scala
+++ b/src/library/scala/sys/process/package.scala
@@ -157,7 +157,8 @@ package scala.sys {
     *     while(input.read() != -1) count += 1
     *     input.close()
     *   }
-    *   cat ! new ProcessIO(_.close(), byteCounter, _.close())
+    *   val p = cat run new ProcessIO(_.close(), byteCounter, _.close())
+    *   p.exitValue()
     *   count
     * }
     *
diff --git a/src/library/scala/util/Either.scala b/src/library/scala/util/Either.scala
index e196d40..32b7ec4 100644
--- a/src/library/scala/util/Either.scala
+++ b/src/library/scala/util/Either.scala
@@ -329,8 +329,8 @@ object Either {
      * }}}
      *
      */
-    def forall(f: A => Boolean) = e match {
-      case Left(a) => f(a)
+    def forall(@deprecatedName('f) p: A => Boolean) = e match {
+      case Left(a) => p(a)
       case Right(_) => true
     }
 
@@ -345,8 +345,8 @@ object Either {
      * }}}
      *
      */
-    def exists(f: A => Boolean) = e match {
-      case Left(a) => f(a)
+    def exists(@deprecatedName('f) p: A => Boolean) = e match {
+      case Left(a) => p(a)
       case Right(_) => false
     }
 
@@ -507,9 +507,9 @@ object Either {
      * Left(12).right.exists(_ > 10)   // false
      * }}}
      */
-    def exists(f: B => Boolean) = e match {
+    def exists(@deprecatedName('f) p: B => Boolean) = e match {
       case Left(_) => false
-      case Right(b) => f(b)
+      case Right(b) => p(b)
     }
 
     /**
diff --git a/src/library/scala/util/MurmurHash.scala b/src/library/scala/util/MurmurHash.scala
index e05fe08..1b6db5d 100644
--- a/src/library/scala/util/MurmurHash.scala
+++ b/src/library/scala/util/MurmurHash.scala
@@ -10,7 +10,7 @@ package scala
 package util
 
 /** An implementation of Austin Appleby's MurmurHash 3.0 algorithm
- *  (32 bit version); reference: http://code.google.com/p/smhasher
+ *  (32 bit version); reference: https://github.com/aappleby/smhasher
  *
  *  This is the hash used by collections and case classes (including
  *  tuples).
diff --git a/src/library/scala/util/Properties.scala b/src/library/scala/util/Properties.scala
index 367488f..7ea597e 100644
--- a/src/library/scala/util/Properties.scala
+++ b/src/library/scala/util/Properties.scala
@@ -1,6 +1,6 @@
 /*                     __                                               *\
 **     ________ ___   / /  ___     Scala API                            **
-**    / __/ __// _ | / /  / _ |    (c) 2006-2013, LAMP/EPFL             **
+**    / __/ __// _ | / /  / _ |    (c) 2006-2015, LAMP/EPFL             **
 **  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
 ** /____/\___/_/ |_/____/_/ | |                                         **
 **                          |/                                          **
@@ -105,7 +105,7 @@ private[scala] trait PropertiesTrait {
    *  or "version (unknown)" if it cannot be determined.
    */
   val versionString         = "version " + scalaPropOrElse("version.number", "(unknown)")
-  val copyrightString       = scalaPropOrElse("copyright.string", "Copyright 2002-2013, LAMP/EPFL")
+  val copyrightString       = scalaPropOrElse("copyright.string", "Copyright 2002-2016, LAMP/EPFL")
 
   /** This is the encoding to use reading in source files, overridden with -encoding.
    *  Note that it uses "prop" i.e. looks in the scala jar, not the system properties.
diff --git a/src/library/scala/util/Sorting.scala b/src/library/scala/util/Sorting.scala
index 2e021ad..b4f965f 100644
--- a/src/library/scala/util/Sorting.scala
+++ b/src/library/scala/util/Sorting.scala
@@ -1,6 +1,6 @@
 /*                     __                                               *\
 **     ________ ___   / /  ___     Scala API                            **
-**    / __/ __// _ | / /  / _ |    (c) 2006-2009, Ross Judson           **
+**    / __/ __// _ | / /  / _ |    (c) 2006-2015, LAMP/EPFL             **
 **  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
 ** /____/\___/_/ |_/____/_/ | |                                         **
 **                          |/                                          **
@@ -9,518 +9,276 @@
 package scala
 package util
 
-import scala.reflect.{ ClassTag, classTag }
-import scala.math.{ Ordering, max, min }
+import scala.reflect.ClassTag
+import scala.math.Ordering
 
-/** The Sorting object provides functions that can sort various kinds of
-  * objects. You can provide a comparison function, or you can request a sort
-  * of items that are viewable as [[scala.math.Ordered]]. Some sorts that
-  * operate directly on a subset of value types are also provided. These
-  * implementations are derived from those in the Sun JDK.
+/** The `Sorting` object provides convenience wrappers for `java.util.Arrays.sort`.
+  * Methods that defer to `java.util.Arrays.sort` say that they do or under what
+  * conditions that they do.
   *
-  * Note that stability doesn't matter for value types, so use the `quickSort`
-  * variants for those. `stableSort` is intended to be used with
-  * objects when the prior ordering should be preserved, where possible.
+  * `Sorting` also implements a general-purpose quicksort and stable (merge) sort
+  * for those cases where `java.util.Arrays.sort` could only be used at the cost
+  * of a large memory penalty.  If performance rather than memory usage is the
+  * primary concern, one may wish to find alternate strategies to use
+  * `java.util.Arrays.sort` directly e.g. by boxing primitives to use
+  * a custom ordering on them.
+  *
+  * `Sorting` provides methods where you can provide a comparison function, or
+  * can request a sort of items that are [[scala.math.Ordered]] or that
+  * otherwise have an implicit or explicit [[scala.math.Ordering]].
+  *
+  * Note also that high-performance non-default sorts for numeric types
+  * are not provided.  If this is required, it is advisable to investigate
+  * other libraries that cover this use case.
   *
   * @author  Ross Judson
-  * @version 1.0
+  * @author  Adriaan Moors
+  * @author  Rex Kerr
+  * @version 1.1
   */
 object Sorting {
-  /** Quickly sort an array of Doubles. */
-  def quickSort(a: Array[Double]) { sort1(a, 0, a.length) }
-
-  /** Quickly sort an array of items with an implicit Ordering. */
-  def quickSort[K: Ordering](a: Array[K]) { sort1(a, 0, a.length) }
-
-  /** Quickly sort an array of Ints. */
-  def quickSort(a: Array[Int]) { sort1(a, 0, a.length) }
-
-  /** Quickly sort an array of Floats. */
-  def quickSort(a: Array[Float]) { sort1(a, 0, a.length) }
-
-  /** Sort an array of K where K is Ordered, preserving the existing order
-    * where the values are equal. */
-  def stableSort[K: ClassTag: Ordering](a: Array[K]) {
-    stableSort(a, 0, a.length-1, new Array[K](a.length), Ordering[K].lt _)
-  }
+  /** Sort an array of Doubles using `java.util.Arrays.sort`. */
+  def quickSort(a: Array[Double]): Unit = java.util.Arrays.sort(a)
 
-  /** Sorts an array of `K` given an ordering function `f`.
-   *  `f` should return `true` iff its first parameter is strictly less than its second parameter.
-   */
-  def stableSort[K: ClassTag](a: Array[K], f: (K, K) => Boolean) {
-    stableSort(a, 0, a.length-1, new Array[K](a.length), f)
-  }
+  /** Sort an array of Ints using `java.util.Arrays.sort`. */
+  def quickSort(a: Array[Int]): Unit    = java.util.Arrays.sort(a)
 
-  /** Sorts an arbitrary sequence into an array, given a comparison function
-   *  that should return `true` iff parameter one is strictly less than parameter two.
-   *
-   *  @param  a the sequence to be sorted.
-   *  @param  f the comparison function.
-   *  @return the sorted sequence of items.
-   */
-  def stableSort[K: ClassTag](a: Seq[K], f: (K, K) => Boolean): Array[K] = {
-    val ret = a.toArray
-    stableSort(ret, f)
-    ret
-  }
+  /** Sort an array of Floats using `java.util.Arrays.sort`. */
+  def quickSort(a: Array[Float]): Unit  = java.util.Arrays.sort(a)
+  
+  private final val qsortThreshold = 16
 
-  /** Sorts an arbitrary sequence of items that are viewable as ordered. */
-  def stableSort[K: ClassTag: Ordering](a: Seq[K]): Array[K] =
-    stableSort(a, Ordering[K].lt _)
-
-  /** Stably sorts a sequence of items given an extraction function that will
-   *  return an ordered key from an item.
-   *
-   *  @param  a the sequence to be sorted.
-   *  @param  f the comparison function.
-   *  @return the sorted sequence of items.
-   */
-  def stableSort[K: ClassTag, M: Ordering](a: Seq[K], f: K => M): Array[K] =
-    stableSort(a)(implicitly[ClassTag[K]], Ordering[M] on f)
-
-  private def sort1[K: Ordering](x: Array[K], off: Int, len: Int) {
-    val ord = Ordering[K]
-    import ord._
-
-    def swap(a: Int, b: Int) {
-      val t = x(a)
-      x(a) = x(b)
-      x(b) = t
-    }
-    def vecswap(_a: Int, _b: Int, n: Int) {
-      var a = _a
-      var b = _b
-      var i = 0
-      while (i < n) {
-        swap(a, b)
-        i += 1
-        a += 1
-        b += 1
-      }
-    }
-    def med3(a: Int, b: Int, c: Int) = {
-      if (x(a) < x(b)) {
-        if (x(b) < x(c)) b else if (x(a) < x(c)) c else a
-      } else {
-        if (x(b) > x(c)) b else if (x(a) > x(c)) c else a
-      }
-    }
-    def sort2(off: Int, len: Int) {
-      // Insertion sort on smallest arrays
-      if (len < 7) {
-        var i = off
-        while (i < len + off) {
-          var j = i
-          while (j > off && x(j-1) > x(j)) {
-            swap(j, j-1)
-            j -= 1
+  /** Sort array `a` with quicksort, using the Ordering on its elements.
+    * This algorithm sorts in place, so no additional memory is used aside from
+    * what might be required to box individual elements during comparison.
+    */
+  def quickSort[K: Ordering](a: Array[K]): Unit = {
+    // Must have iN >= i0 or math will fail.  Also, i0 >= 0.
+    def inner(a: Array[K], i0: Int, iN: Int, ord: Ordering[K]): Unit = {
+      if (iN - i0 < qsortThreshold) insertionSort(a, i0, iN, ord)
+      else {
+        var iK = (i0 + iN) >>> 1    // Unsigned div by 2
+        // Find index of median of first, central, and last elements
+        var pL = 
+          if (ord.compare(a(i0), a(iN - 1)) <= 0)
+            if (ord.compare(a(i0), a(iK)) < 0)
+              if (ord.compare(a(iN - 1), a(iK)) < 0) iN - 1 else iK
+            else i0
+          else
+            if (ord.compare(a(i0), a(iK)) < 0) i0
+            else
+              if (ord.compare(a(iN - 1), a(iK)) <= 0) iN - 1
+              else iK
+        val pivot = a(pL)
+        // pL is the start of the pivot block; move it into the middle if needed
+        if (pL != iK) { a(pL) = a(iK); a(iK) = pivot; pL = iK }
+        // Elements equal to the pivot will be in range pL until pR
+        var pR = pL + 1
+        // Items known to be less than pivot are below iA (range i0 until iA)
+        var iA = i0
+        // Items known to be greater than pivot are at or above iB (range iB until iN)
+        var iB = iN
+        // Scan through everything in the buffer before the pivot(s)
+        while (pL - iA > 0) {
+          val current = a(iA)
+          ord.compare(current, pivot) match {
+            case 0 =>
+              // Swap current out with pivot block
+              a(iA) = a(pL - 1)
+              a(pL - 1) = current
+              pL -= 1
+            case x if x < 0 =>
+              // Already in place.  Just update indices.
+              iA += 1
+            case _ if iB > pR =>
+              // Wrong side.  There's room on the other side, so swap
+              a(iA) = a(iB - 1)
+              a(iB - 1) = current
+              iB -= 1
+            case _ =>
+              // Wrong side and there is no room.  Swap by rotating pivot block.
+              a(iA) = a(pL - 1)
+              a(pL - 1) = a(pR - 1)
+              a(pR - 1) = current
+              pL -= 1
+              pR -= 1
+              iB -= 1
           }
-          i += 1
         }
-      } else {
-        // Choose a partition element, v
-        var m = off + (len >> 1)        // Small arrays, middle element
-        if (len > 7) {
-          var l = off
-          var n = off + len - 1
-          if (len > 40) {        // Big arrays, pseudomedian of 9
-            val s = len / 8
-            l = med3(l, l+s, l+2*s)
-            m = med3(m-s, m, m+s)
-            n = med3(n-2*s, n-s, n)
+        // Get anything remaining in buffer after the pivot(s)
+        while (iB - pR > 0) {
+          val current = a(iB - 1)
+          ord.compare(current, pivot) match {
+            case 0 =>
+              // Swap current out with pivot block
+              a(iB - 1) = a(pR)
+              a(pR) = current
+              pR += 1
+            case x if x > 0 =>
+              // Already in place.  Just update indices.
+              iB -= 1
+            case _ =>
+              // Wrong side and we already know there is no room.  Swap by rotating pivot block.
+              a(iB - 1) = a(pR)
+              a(pR) = a(pL)
+              a(pL) = current
+              iA += 1
+              pL += 1
+              pR += 1
           }
-          m = med3(l, m, n) // Mid-size, med of 3
         }
-        val v = x(m)
-
-        // Establish Invariant: v* (<v)* (>v)* v*
-        var a = off
-        var b = a
-        var c = off + len - 1
-        var d = c
-        var done = false
-        while (!done) {
-          while (b <= c && x(b) <= v) {
-            if (x(b) equiv v) {
-              swap(a, b)
-              a += 1
-            }
-            b += 1
-          }
-          while (c >= b && x(c) >= v) {
-            if (x(c) equiv v) {
-              swap(c, d)
-              d -= 1
-            }
-            c -= 1
-          }
-          if (b > c) {
-            done = true
-          } else {
-            swap(b, c)
-            c -= 1
-            b += 1
-          }
+        // Use tail recursion on large half (Sedgewick's method) so we don't blow up the stack if pivots are poorly chosen
+        if (iA - i0 < iN - iB) {
+          inner(a, i0, iA, ord)  // True recursion
+          inner(a, iB, iN, ord)  // Should be tail recursion
+        }
+        else {
+          inner(a, iB, iN, ord)  // True recursion
+          inner(a, i0, iA, ord)  // Should be tail recursion
         }
-
-        // Swap partition elements back to middle
-        val n = off + len
-        var s = math.min(a-off, b-a)
-        vecswap(off, b-s, s)
-        s = math.min(d-c, n-d-1)
-        vecswap(b,   n-s, s)
-
-        // Recursively sort non-partition-elements
-        s = b - a
-        if (s > 1)
-          sort2(off, s)
-        s = d - c
-        if (s > 1)
-          sort2(n-s, s)
       }
     }
-    sort2(off, len)
+    inner(a, 0, a.length, implicitly[Ordering[K]])
   }
-
-  private def sort1(x: Array[Int], off: Int, len: Int) {
-    def swap(a: Int, b: Int) {
-      val t = x(a)
-      x(a) = x(b)
-      x(b) = t
+  
+  private final val mergeThreshold = 32
+  
+  // Ordering[T] might be slow especially for boxed primitives, so use binary search variant of insertion sort
+  // Caller must pass iN >= i0 or math will fail.  Also, i0 >= 0.
+  private def insertionSort[@specialized T](a: Array[T], i0: Int, iN: Int, ord: Ordering[T]): Unit = {
+    val n = iN - i0
+    if (n < 2) return
+    if (ord.compare(a(i0), a(i0+1)) > 0) {
+      val temp = a(i0)
+      a(i0) = a(i0+1)
+      a(i0+1) = temp
     }
-    def vecswap(_a: Int, _b: Int, n: Int) {
-      var a = _a
-      var b = _b
-      var i = 0
-      while (i < n) {
-        swap(a, b)
-        i += 1
-        a += 1
-        b += 1
-      }
-    }
-    def med3(a: Int, b: Int, c: Int) = {
-      if (x(a) < x(b)) {
-        if (x(b) < x(c)) b else if (x(a) < x(c)) c else a
-      } else {
-        if (x(b) > x(c)) b else if (x(a) > x(c)) c else a
-      }
-    }
-    def sort2(off: Int, len: Int) {
-      // Insertion sort on smallest arrays
-      if (len < 7) {
-        var i = off
-        while (i < len + off) {
-          var j = i
-          while (j>off && x(j-1) > x(j)) {
-            swap(j, j-1)
-            j -= 1
-          }
-          i += 1
+    var m = 2
+    while (m < n) {
+      // Speed up already-sorted case by checking last element first
+      val next = a(i0 + m)
+      if (ord.compare(next, a(i0+m-1)) < 0) {
+        var iA = i0
+        var iB = i0 + m - 1
+        while (iB - iA > 1) {
+          val ix = (iA + iB) >>> 1    // Use bit shift to get unsigned div by 2
+          if (ord.compare(next, a(ix)) < 0) iB = ix
+          else iA = ix
         }
-      } else {
-        // Choose a partition element, v
-        var m = off + (len >> 1)        // Small arrays, middle element
-        if (len > 7) {
-          var l = off
-          var n = off + len - 1
-          if (len > 40) {        // Big arrays, pseudomedian of 9
-            val s = len / 8
-            l = med3(l, l+s, l+2*s)
-            m = med3(m-s, m, m+s)
-            n = med3(n-2*s, n-s, n)
-          }
-          m = med3(l, m, n) // Mid-size, med of 3
-        }
-        val v = x(m)
-
-        // Establish Invariant: v* (<v)* (>v)* v*
-        var a = off
-        var b = a
-        var c = off + len - 1
-        var d = c
-        var done = false
-        while (!done) {
-          while (b <= c && x(b) <= v) {
-            if (x(b) == v) {
-              swap(a, b)
-              a += 1
-            }
-            b += 1
-          }
-          while (c >= b && x(c) >= v) {
-            if (x(c) == v) {
-              swap(c, d)
-              d -= 1
-            }
-            c -= 1
-          }
-          if (b > c) {
-            done = true
-          } else {
-            swap(b, c)
-            c -= 1
-            b += 1
-          }
+        val ix = iA + (if (ord.compare(next, a(iA)) < 0) 0 else 1)
+        var i = i0 + m
+        while (i > ix) {
+          a(i) = a(i-1)
+          i -= 1
         }
-
-        // Swap partition elements back to middle
-        val n = off + len
-        var s = math.min(a-off, b-a)
-        vecswap(off, b-s, s)
-        s = math.min(d-c, n-d-1)
-        vecswap(b,   n-s, s)
-
-        // Recursively sort non-partition-elements
-        s = b - a
-        if (s > 1)
-          sort2(off, s)
-        s = d - c
-        if (s > 1)
-          sort2(n-s, s)
+        a(ix) = next
       }
+      m += 1
     }
-    sort2(off, len)
   }
-
-  private def sort1(x: Array[Double], off: Int, len: Int) {
-    def swap(a: Int, b: Int) {
-      val t = x(a)
-      x(a) = x(b)
-      x(b) = t
+  
+  // Caller is required to pass iN >= i0, else math will fail.  Also, i0 >= 0.
+  private def mergeSort[@specialized T: ClassTag](a: Array[T], i0: Int, iN: Int, ord: Ordering[T], scratch: Array[T] = null): Unit = {
+    if (iN - i0 < mergeThreshold) insertionSort(a, i0, iN, ord)
+    else {
+      val iK = (i0 + iN) >>> 1   // Bit shift equivalent to unsigned math, no overflow
+      val sc = if (scratch eq null) new Array[T](iK - i0) else scratch
+      mergeSort(a, i0, iK, ord, sc)
+      mergeSort(a, iK, iN, ord, sc)
+      mergeSorted(a, i0, iK, iN, ord, sc)
     }
-    def vecswap(_a: Int, _b: Int, n: Int) {
-      var a = _a
-      var b = _b
-      var i = 0
-      while (i < n) {
-        swap(a, b)
+  }
+  
+  // Must have 0 <= i0 < iK < iN
+  private def mergeSorted[@specialized T](a: Array[T], i0: Int, iK: Int, iN: Int, ord: Ordering[T], scratch: Array[T]): Unit = {
+    // Check to make sure we're not already in order
+    if (ord.compare(a(iK-1), a(iK)) > 0) {
+      var i = i0
+      val jN = iK - i0
+      var j = 0
+      while (i < iK) {
+        scratch (j) = a(i)
         i += 1
-        a += 1
-        b += 1
-      }
-    }
-    def med3(a: Int, b: Int, c: Int) = {
-      val ab = x(a) compare x(b)
-      val bc = x(b) compare x(c)
-      val ac = x(a) compare x(c)
-      if (ab < 0) {
-        if (bc < 0) b else if (ac < 0) c else a
-      } else {
-        if (bc > 0) b else if (ac > 0) c else a
+        j += 1
       }
-    }
-    def sort2(off: Int, len: Int) {
-      // Insertion sort on smallest arrays
-      if (len < 7) {
-        var i = off
-        while (i < len + off) {
-          var j = i
-          while (j > off && (x(j-1) compare x(j)) > 0) {
-            swap(j, j-1)
-            j -= 1
-          }
-          i += 1
-        }
-      } else {
-        // Choose a partition element, v
-        var m = off + (len >> 1)        // Small arrays, middle element
-        if (len > 7) {
-          var l = off
-          var n = off + len - 1
-          if (len > 40) {        // Big arrays, pseudomedian of 9
-            val s = len / 8
-            l = med3(l, l+s, l+2*s)
-            m = med3(m-s, m, m+s)
-            n = med3(n-2*s, n-s, n)
-          }
-          m = med3(l, m, n) // Mid-size, med of 3
-        }
-        val v = x(m)
-
-        // Establish Invariant: v* (<v)* (>v)* v*
-        var a = off
-        var b = a
-        var c = off + len - 1
-        var d = c
-        var done = false
-        while (!done) {
-          var bv = x(b) compare v
-          while (b <= c && bv <= 0) {
-            if (bv == 0) {
-              swap(a, b)
-              a += 1
-            }
-            b += 1
-            if (b <= c) bv = x(b) compare v
-          }
-          var cv = x(c) compare v
-          while (c >= b && cv >= 0) {
-            if (cv == 0) {
-              swap(c, d)
-              d -= 1
-            }
-            c -= 1
-            if (c >= b) cv = x(c) compare v
-          }
-          if (b > c) {
-            done = true
-          } else {
-            swap(b, c)
-            c -= 1
-            b += 1
-          }
-        }
-
-        // Swap partition elements back to middle
-        val n = off + len
-        var s = math.min(a-off, b-a)
-        vecswap(off, b-s, s)
-        s = math.min(d-c, n-d-1)
-        vecswap(b,   n-s, s)
-
-        // Recursively sort non-partition-elements
-        s = b - a
-        if (s > 1)
-          sort2(off, s)
-        s = d - c
-        if (s > 1)
-          sort2(n-s, s)
+      var k = i0
+      j = 0
+      while (i < iN && j < jN) {
+        if (ord.compare(a(i), scratch(j)) < 0) { a(k) = a(i); i += 1 }
+        else { a(k) = scratch(j); j += 1 }
+        k += 1
       }
+      while (j < jN) { a(k) = scratch(j); j += 1; k += 1 }
+      // Don't need to finish a(i) because it's already in place, k = i
     }
-    sort2(off, len)
   }
-
-  private def sort1(x: Array[Float], off: Int, len: Int) {
-    def swap(a: Int, b: Int) {
-      val t = x(a)
-      x(a) = x(b)
-      x(b) = t
+  
+  // Why would you even do this?
+  private def booleanSort(a: Array[Boolean]): Unit = {
+    var i = 0
+    var n = 0
+    while (i < a.length) {
+      if (!a(i)) n += 1
+      i += 1
     }
-    def vecswap(_a: Int, _b: Int, n: Int) {
-      var a = _a
-      var b = _b
-      var i = 0
-      while (i < n) {
-        swap(a, b)
-        i += 1
-        a += 1
-        b += 1
-      }
+    i = 0
+    while (i < n) {
+      a(i) = false
+      i += 1
     }
-    def med3(a: Int, b: Int, c: Int) = {
-      val ab = x(a) compare x(b)
-      val bc = x(b) compare x(c)
-      val ac = x(a) compare x(c)
-      if (ab < 0) {
-        if (bc < 0) b else if (ac < 0) c else a
-      } else {
-        if (bc > 0) b else if (ac > 0) c else a
-      }
+    while (i < a.length) {
+      a(i) = true
+      i += 1
     }
-    def sort2(off: Int, len: Int) {
-      // Insertion sort on smallest arrays
-      if (len < 7) {
-        var i = off
-        while (i < len + off) {
-          var j = i
-          while (j > off && (x(j-1) compare x(j)) > 0) {
-            swap(j, j-1)
-            j -= 1
-          }
-          i += 1
-        }
-      } else {
-        // Choose a partition element, v
-        var m = off + (len >> 1)        // Small arrays, middle element
-        if (len > 7) {
-          var l = off
-          var n = off + len - 1
-          if (len > 40) {        // Big arrays, pseudomedian of 9
-            val s = len / 8
-            l = med3(l, l+s, l+2*s)
-            m = med3(m-s, m, m+s)
-            n = med3(n-2*s, n-s, n)
-          }
-          m = med3(l, m, n) // Mid-size, med of 3
-        }
-        val v = x(m)
+  }
 
-        // Establish Invariant: v* (<v)* (>v)* v*
-        var a = off
-        var b = a
-        var c = off + len - 1
-        var d = c
-        var done = false
-        while (!done) {
-          var bv = x(b) compare v
-          while (b <= c && bv <= 0) {
-            if (bv == 0) {
-              swap(a, b)
-              a += 1
-            }
-            b += 1
-            if (b <= c) bv = x(b) compare v
-          }
-          var cv = x(c) compare v
-          while (c >= b && cv >= 0) {
-            if (cv == 0) {
-              swap(c, d)
-              d -= 1
-            }
-            c -= 1
-            if (c >= b) cv = x(c) compare v
-          }
-          if (b > c) {
-            done = true
-          } else {
-            swap(b, c)
-            c -= 1
-            b += 1
-          }
-        }
+  // TODO: add upper bound: T <: AnyRef, propagate to callers below (not binary compatible)
+  // Maybe also rename all these methods to `sort`.
+  @inline private def sort[T](a: Array[T], ord: Ordering[T]): Unit = a match {
+    case _: Array[AnyRef]  => 
+      // Note that runtime matches are covariant, so could actually be any Array[T] s.t. T is not primitive (even boxed value classes)
+      if (a.length > 1 && (ord eq null)) throw new NullPointerException("Ordering")
+      java.util.Arrays.sort(a, ord)
+    case a: Array[Int]     => if (ord eq Ordering.Int) java.util.Arrays.sort(a) else mergeSort[Int](a, 0, a.length, ord)
+    case a: Array[Double]  => mergeSort[Double](a, 0, a.length, ord)  // Because not all NaNs are identical, stability is meaningful!
+    case a: Array[Long]    => if (ord eq Ordering.Long) java.util.Arrays.sort(a) else mergeSort[Long](a, 0, a.length, ord)
+    case a: Array[Float]   => mergeSort[Float](a, 0, a.length, ord)   // Because not all NaNs are identical, stability is meaningful!
+    case a: Array[Char]    => if (ord eq Ordering.Char) java.util.Arrays.sort(a) else mergeSort[Char](a, 0, a.length, ord)
+    case a: Array[Byte]    => if (ord eq Ordering.Byte) java.util.Arrays.sort(a) else mergeSort[Byte](a, 0, a.length, ord)
+    case a: Array[Short]   => if (ord eq Ordering.Short) java.util.Arrays.sort(a) else mergeSort[Short](a, 0, a.length, ord)
+    case a: Array[Boolean] => if (ord eq Ordering.Boolean) booleanSort(a) else mergeSort[Boolean](a, 0, a.length, ord)
+    // Array[Unit] is matched as an Array[AnyRef] due to covariance in runtime matching.  Not worth catching it as a special case.
+    case null => throw new NullPointerException
+  }
 
-        // Swap partition elements back to middle
-        val n = off + len
-        var s = math.min(a-off, b-a)
-        vecswap(off, b-s, s)
-        s = math.min(d-c, n-d-1)
-        vecswap(b,   n-s, s)
+  // TODO: remove unnecessary ClassTag (not binary compatible)
+  /** Sort array `a` using the Ordering on its elements, preserving the original ordering where possible.  Uses `java.util.Arrays.sort` unless `K` is a primitive type. */
+  def stableSort[K: ClassTag: Ordering](a: Array[K]): Unit = sort(a, Ordering[K])
 
-        // Recursively sort non-partition-elements
-        s = b - a
-        if (s > 1)
-          sort2(off, s)
-        s = d - c
-        if (s > 1)
-          sort2(n-s, s)
-      }
-    }
-    sort2(off, len)
+  // TODO: Remove unnecessary ClassTag (not binary compatible)
+  // TODO: make this fast for primitive K (could be specialized if it didn't go through Ordering)
+  /** Sort array `a` using function `f` that computes the less-than relation for each element.  Uses `java.util.Arrays.sort` unless `K` is a primitive type. */
+  def stableSort[K: ClassTag](a: Array[K], f: (K, K) => Boolean): Unit = sort(a, Ordering fromLessThan f)
+
+  /** A sorted Array, using the Ordering for the elements in the sequence `a`.  Uses `java.util.Arrays.sort` unless `K` is a primitive type. */
+  def stableSort[K: ClassTag: Ordering](a: Seq[K]): Array[K] = {
+    val ret = a.toArray
+    sort(ret, Ordering[K])
+    ret
   }
 
-  private def stableSort[K : ClassTag](a: Array[K], lo: Int, hi: Int, scratch: Array[K], f: (K,K) => Boolean) {
-    if (lo < hi) {
-      val mid = (lo+hi) / 2
-      stableSort(a, lo, mid, scratch, f)
-      stableSort(a, mid+1, hi, scratch, f)
-      var k, t_lo = lo
-      var t_hi = mid + 1
-      while (k <= hi) {
-        if ((t_lo <= mid) && ((t_hi > hi) || (!f(a(t_hi), a(t_lo))))) {
-          scratch(k) = a(t_lo)
-          t_lo += 1
-        } else {
-          scratch(k) = a(t_hi)
-          t_hi += 1
-        }
-        k += 1
-      }
-      k = lo
-      while (k <= hi) {
-        a(k) = scratch(k)
-        k += 1
-      }
-    }
+  // TODO: make this fast for primitive K (could be specialized if it didn't go through Ordering)
+  /** A sorted Array, given a function `f` that computes the less-than relation for each item in the sequence `a`.  Uses `java.util.Arrays.sort` unless `K` is a primitive type. */
+  def stableSort[K: ClassTag](a: Seq[K], f: (K, K) => Boolean): Array[K] = {
+    val ret = a.toArray
+    sort(ret, Ordering fromLessThan f)
+    ret
+  }
+
+  /** A sorted Array, given an extraction function `f` that returns an ordered key for each item in the sequence `a`.  Uses `java.util.Arrays.sort` unless `K` is a primitive type. */
+  def stableSort[K: ClassTag, M: Ordering](a: Seq[K], f: K => M): Array[K] = {
+    val ret = a.toArray
+    sort(ret, Ordering[M] on f)
+    ret
   }
 }
diff --git a/src/library/scala/util/Try.scala b/src/library/scala/util/Try.scala
index b0cf122..b0eae74 100644
--- a/src/library/scala/util/Try.scala
+++ b/src/library/scala/util/Try.scala
@@ -24,11 +24,12 @@ import scala.language.implicitConversions
  *
  * Example:
  * {{{
+ *   import scala.io.StdIn
  *   import scala.util.{Try, Success, Failure}
  *
  *   def divide: Try[Int] = {
- *     val dividend = Try(Console.readLine("Enter an Int that you'd like to divide:\n").toInt)
- *     val divisor = Try(Console.readLine("Enter an Int that you'd like to divide by:\n").toInt)
+ *     val dividend = Try(StdIn.readLine("Enter an Int that you'd like to divide:\n").toInt)
+ *     val divisor = Try(StdIn.readLine("Enter an Int that you'd like to divide by:\n").toInt)
  *     val problem = dividend.flatMap(x => divisor.map(y => x/y))
  *     problem match {
  *       case Success(v) =>
@@ -47,7 +48,7 @@ import scala.language.implicitConversions
  * catching exceptions along the way. The `flatMap` and `map` combinators in the above example each essentially
  * pass off either their successfully completed value, wrapped in the `Success` type for it to be further operated
  * upon by the next combinator in the chain, or the exception wrapped in the `Failure` type usually to be simply
- * passed on down the chain. Combinators such as `rescue` and `recover` are designed to provide some type of
+ * passed on down the chain. Combinators such as `recover` and `recoverWith` are designed to provide some type of
  * default behavior in the case of failure.
  *
  * ''Note'': only non-fatal exceptions are caught by the combinators on `Try` (see [[scala.util.control.NonFatal]]).
@@ -164,8 +165,8 @@ sealed abstract class Try[+T] {
   def flatten[U](implicit ev: T <:< Try[U]): Try[U]
 
   /**
-   * Completes this `Try` with an exception wrapped in a `Success`. The exception is either the exception that the
-   * `Try` failed with (if a `Failure`) or an `UnsupportedOperationException`.
+   * Inverts this `Try`. If this is a `Failure`, returns its exception wrapped in a `Success`.
+   * If this is a `Success`, returns a `Failure` containing an `UnsupportedOperationException`.
    */
   def failed: Try[Throwable]
 
diff --git a/src/library/scala/util/control/Exception.scala b/src/library/scala/util/control/Exception.scala
index be6d03a..24c297a 100644
--- a/src/library/scala/util/control/Exception.scala
+++ b/src/library/scala/util/control/Exception.scala
@@ -105,7 +105,7 @@ object Exception {
         case x if rethrow(x)        => throw x
         case x if pf isDefinedAt x  => pf(x)
       }
-      finally fin map (_.invoke())
+      finally fin foreach (_.invoke())
 
     /* Create an empty Try container with this Catch and the supplied `Finally`. */
     def andFinally(body: => Unit): Catch[T] = fin match {
@@ -155,7 +155,7 @@ object Exception {
   /** A `Catch` object which catches everything. */
   final def allCatch[T]: Catch[T] = new Catch(allCatcher[T]) withDesc "<everything>"
 
-  /** A `Catch` object witch catches non-fatal exceptions. */
+  /** A `Catch` object which catches non-fatal exceptions. */
   final def nonFatalCatch[T]: Catch[T] = new Catch(nonFatalCatcher[T]) withDesc "<non-fatal>"
 
   /** Creates a `Catch` object which will catch any of the supplied exceptions.
diff --git a/src/library/scala/util/hashing/MurmurHash3.scala b/src/library/scala/util/hashing/MurmurHash3.scala
index 1bfaeb2..6a56910 100644
--- a/src/library/scala/util/hashing/MurmurHash3.scala
+++ b/src/library/scala/util/hashing/MurmurHash3.scala
@@ -191,9 +191,9 @@ private[hashing] class MurmurHash3 {
  * This is based on the earlier MurmurHash3 code by Rex Kerr, but the
  * MurmurHash3 algorithm was since changed by its creator Austin Appleby
  * to remedy some weaknesses and improve performance. This represents the
- * latest and supposedly final version of the algortihm (revision 136).
+ * latest and supposedly final version of the algorithm (revision 136).
  *
- * @see [[http://code.google.com/p/smhasher]]
+ * @see [[https://github.com/aappleby/smhasher]]
  */
 object MurmurHash3 extends MurmurHash3 {
   final val arraySeed       = 0x3c074a61
diff --git a/src/library/scala/util/matching/Regex.scala b/src/library/scala/util/matching/Regex.scala
index 5c4e706..6d3d015 100644
--- a/src/library/scala/util/matching/Regex.scala
+++ b/src/library/scala/util/matching/Regex.scala
@@ -477,7 +477,7 @@ class Regex private[matching](val pattern: Pattern, groupNames: String*) extends
   /**
    * Replaces some of the matches using a replacer function that returns an [[scala.Option]].
    * The replacer function takes a [[scala.util.matching.Regex.Match]] so that extra
-   * information can be btained from the match. For example:
+   * information can be obtained from the match. For example:
    *
    * {{{
    * import scala.util.matching.Regex._
diff --git a/src/manual/scala/man1/Command.scala b/src/manual/scala/man1/Command.scala
index 8f811f9..13e2175 100644
--- a/src/manual/scala/man1/Command.scala
+++ b/src/manual/scala/man1/Command.scala
@@ -42,7 +42,7 @@ trait Command {
   def authors = Section("AUTHOR",
 
     "Written by Martin Odersky and other members of the " &
-    Link("Scala team", "http://www.scala-lang.org/node/89") & ".")
+    Link("Scala team", "http://www.scala-lang.org/news/2014/01/22/10-years-of-scala.html") & ".")
 
   def copyright = Section("COPYRIGHT",
 
diff --git a/src/manual/scala/man1/fsc.scala b/src/manual/scala/man1/fsc.scala
index f2f8feb..c7399da 100644
--- a/src/manual/scala/man1/fsc.scala
+++ b/src/manual/scala/man1/fsc.scala
@@ -126,11 +126,7 @@ object fsc extends Command {
 
           "With Java 1.5 (or newer) one may for example configure the " &
           "memory usage of the JVM as follows: " &
-          Mono("JAVA_OPTS=\"-Xmx512M -Xms16M -Xss16M\""),
-
-          "With " & Link("GNU Java", "http://gcc.gnu.org/java/") & " one " &
-          "may configure the memory usage of the GIJ as follows: " &
-          Mono("JAVA_OPTS=\"--mx512m --ms16m\"")
+          Mono("JAVA_OPTS=\"-Xmx512M -Xms16M -Xss16M\"")
         ))))
 
   val exitStatus = Section("EXIT STATUS",
diff --git a/src/manual/scala/man1/scala.scala b/src/manual/scala/man1/scala.scala
index 92d9c59..9f97dd5 100644
--- a/src/manual/scala/man1/scala.scala
+++ b/src/manual/scala/man1/scala.scala
@@ -65,6 +65,10 @@ object scala extends Command {
         "Do not use the " & MBold("fsc") & " offline compiler."),
 
       Definition(
+        CmdOption("nc"),
+        "Same as " & Mono("-nocompdaemon") & "."),
+
+      Definition(
         CmdOptionBound("D", "property=value"),
         "Set a Java system property.  If no value is specified, " &
         "then the property is set to the empty string."),
@@ -135,6 +139,11 @@ object scala extends Command {
     "line.  Headers can be used to make stand-alone script files, as shown " &
     "in the examples below.",
 
+    "When running a script or using " & Mono("-e") & ", an already running " &
+    "compilation daemon (fsc) is used, or a new one started on demand.  The " &
+    Mono("-nocompdaemon") & " or " & Mono("-nc") & " option can be used to " &
+    "prevent this.",
+
     "If " & Mono("scala") & " is run from an sbaz(1) directory, " &
     "then it will add to its classpath any jars installed in the " &
     "lib directory of the sbaz directory.  Additionally, if no " &
@@ -175,11 +184,7 @@ object scala extends Command {
 
           "With Java 1.5 (or newer) one may for example configure the " &
           "memory usage of the JVM as follows: " &
-          Mono("JAVA_OPTS=\"-Xmx512M -Xms16M -Xss16M\""),
-
-          "With " & Link("GNU Java", "http://gcc.gnu.org/java/") & " one " &
-          "may configure the memory usage of the GIJ as follows: " &
-          Mono("JAVA_OPTS=\"--mx512m --ms16m\"")
+          Mono("JAVA_OPTS=\"-Xmx512M -Xms16M -Xss16M\"")
         ))))
 
   val examples = Section("EXAMPLES",
diff --git a/src/manual/scala/man1/scalac.scala b/src/manual/scala/man1/scalac.scala
index 3954ed5..a20c1ac 100644
--- a/src/manual/scala/man1/scalac.scala
+++ b/src/manual/scala/man1/scalac.scala
@@ -5,10 +5,6 @@
 
 package scala.man1
 
-/**
- *  @author Stephane Micheloud
- *  @version 1.0
- */
 object scalac extends Command {
   import _root_.scala.tools.docutil.ManPage._
 
@@ -77,7 +73,7 @@ object scalac extends Command {
           SeqPara(
             "Specify where to find user class files (on Unix-based systems " &
             "a colon-separated list of paths, on Windows-based systems, a " &
-            "semicolon-separate list of paths). This does not override the " &
+            "semicolon-separated list of paths). This does not override the " &
             "built-in (" & Mono("\"boot\"") & ") search path.",
             "The default class path is the current directory. Setting the " &
             Mono("CLASSPATH") & " variable or using the " & Mono("-classpath") & " " &
@@ -152,11 +148,12 @@ object scalac extends Command {
           CmdOption("sourcepath", Argument("path")),
           "Specify location(s) of source files."),
         Definition(
-          CmdOptionBound("target:", "{jvm-1.5,jvm-1.6,jvm-1.7}"),
-	  SeqPara(
+          CmdOptionBound("target:", "{jvm-1.5,jvm-1.6,jvm-1.7,jvm-1.8}"),
+          SeqPara(
             Mono("\"jvm-1.5\"") & " target JVM 1.5 (deprecated),",
             Mono("\"jvm-1.6\"") & " target JVM 1.6 (default),",
-            Mono("\"jvm-1.7\"") & " target JVM 1.7,")),
+            Mono("\"jvm-1.7\"") & " target JVM 1.7,",
+            Mono("\"jvm-1.8\"") & " target JVM 1.8,")),
         Definition(
           CmdOption("toolcp", Argument("path")),
           "Add to the runner classpath."),
@@ -195,7 +192,7 @@ object scalac extends Command {
         Definition(
           CmdOption("Xcheckinit"),
           "Wrap field accessors to throw an exception on uninitialized access."),
-	Definition(
+        Definition(
           CmdOption("Xdev"),
           "Enable warnings for developers working on the Scala compiler"),
         Definition(
@@ -211,7 +208,7 @@ object scalac extends Command {
         Definition(
           CmdOption("Xfatal-warnings"),
           "Fail the compilation if there are any warnings."),
-	Definition(
+        Definition(
           CmdOption("Xfull-lubs"),
           "Retain pre 2.10 behavior of less aggressive truncation of least upper bounds."),
         Definition(
@@ -223,25 +220,25 @@ object scalac extends Command {
         Definition(
           CmdOption("Xlint"),
           "Enable recommended additional warnings."),
-	Definition(
+        Definition(
           CmdOption("Xlog-free-terms"),
           "Print a message when reification creates a free term."),
-	Definition(
+        Definition(
           CmdOption("Xlog-free-types"),
           "Print a message when reification resorts to generating a free type."),
-	Definition(
+        Definition(
           CmdOption("Xlog-implicit-conversions"),
           "Print a message whenever an implicit conversion is inserted."),
         Definition(
           CmdOption("Xlog-implicits"),
           "Show more detail on why some implicits are not applicable."),
-	Definition(
+        Definition(
           CmdOption("Xlog-reflective-calls"),
           "Print a message when a reflective method call is generated."),
-	Definition(
+        Definition(
           CmdOptionBound("Xmacro-settings:", Argument("option")),
           "Custom settings for macros."),
-	Definition(
+        Definition(
           CmdOption("Xmain-class", Argument("path")),
           "Class for manifest's Main-Class entry (only useful with -d <jar>)."),
         Definition(
@@ -253,7 +250,7 @@ object scalac extends Command {
         Definition(
           CmdOption("Xno-forwarders"),
           "Do not generate static forwarders in mirror classes."),
-	Definition(
+        Definition(
           CmdOption("Xno-patmat-analysis"),
           "Don't perform exhaustivity/unreachability analysis. Also, ignore " & MItalic("@switch") & " annotation."),
         Definition(
@@ -311,16 +308,21 @@ object scalac extends Command {
         Definition(
           CmdOptionBound("Xsource:", Argument("version")),
           "Treat compiler input as Scala source for the specified version, see SI-8126."),
-	Definition(
+        Definition(
           CmdOption("Xsource-reader", Argument("classname")),
           "Specify a custom method for reading source files."),
-	Definition(
+        Definition(
           CmdOption("Xstrict-inference"),
           "Don't infer known-unsound types."),
         Definition(
           CmdOption("Xverify"),
           "Verify generic signatures in generated bytecode (asm backend only)."),
         Definition(
+          CmdOptionBound("Xxml:", "{coalescing}"),
+          SeqPara(
+            "Configure XML parsing.",
+            Mono("\"coalescing\"") & " convert PCData to Text and coalesce sibling nodes (default in 2.11).")),
+        Definition(
           CmdOption("Y"),
           "Print a synopsis of private options.")
       )
@@ -334,34 +336,34 @@ object scalac extends Command {
         Definition(
           MItalic("namer"),
           "resolve names, attach symbols to named trees"),
-	Definition(
+        Definition(
           MItalic("packageobjects"),
           "load package objects"),
-	Definition(
+        Definition(
           MItalic("typer"),
           "the meat and potatoes: type the trees"),
         Definition(
           MItalic("patmat"),
           "translate match expressions"),
-	Definition(
+        Definition(
           MItalic("superaccessors"),
           "add super accessors in traits and nested classes"),
-	Definition(
+        Definition(
           MItalic("extmethods"),
           "add extension methods for inline classes"),
-	Definition(
+        Definition(
           MItalic("pickler"),
           "serialize symbol tables"),
         Definition(
           MItalic("refchecks"),
           "reference/override checking, translate nested objects"),
-	Definition(
+        Definition(
           MItalic("selectiveanf"),
           "ANF pre-transform for " & MItalic("@cps") & " (CPS plugin)"),
-	Definition(
+        Definition(
           MItalic("selectivecps"),
           MItalic("@cps") & "-driven transform of selectiveanf assignments (CPS plugin)"),
-	Definition(
+        Definition(
           MItalic("uncurry"),
           "uncurry, translate function values to anonymous classes"),
         Definition(
@@ -449,11 +451,7 @@ object scalac extends Command {
 
           "With Java 1.5 (or newer) one may for example configure the " &
           "memory usage of the JVM as follows: " &
-          Mono("JAVA_OPTS=\"-Xmx512M -Xms16M -Xss16M\""),
-
-          "With " & Link("GNU Java", "http://gcc.gnu.org/java/") & " one " &
-          "may configure the memory usage of the GIJ as follows: " &
-          Mono("JAVA_OPTS=\"--mx512m --ms16m\"")
+          Mono("JAVA_OPTS=\"-Xmx512M -Xms16M -Xss16M\"")
         ))))
 
   val examples = Section("EXAMPLES",
diff --git a/src/manual/scala/tools/docutil/ManMaker.scala b/src/manual/scala/tools/docutil/ManMaker.scala
index 47b861a..4b8bfc6 100644
--- a/src/manual/scala/tools/docutil/ManMaker.scala
+++ b/src/manual/scala/tools/docutil/ManMaker.scala
@@ -18,7 +18,7 @@ class ManMaker extends Task {
   /** The directory to put html pages in */
   private var htmlout: Option[File] = None
 
-  /** The directory to put man pags in */
+  /** The directory to put man pages in */
   private var manout: Option[File] = None
 
 
@@ -57,3 +57,13 @@ class ManMaker extends Task {
     })
   }
 }
+
+/** Command line runner for ManMaker which is called from the sbt build. */
+object ManMaker extends App {
+  val Array(commands, htmlout, manout) = args
+  val mm = new ManMaker
+  mm.setCommand(commands)
+  mm.setHtmlout(new File(htmlout))
+  mm.setManout(new File(manout))
+  mm.execute()
+}
diff --git a/src/partest-extras/scala/tools/partest/ASMConverters.scala b/src/partest-extras/scala/tools/partest/ASMConverters.scala
index 67a4e8a..b4c6864 100644
--- a/src/partest-extras/scala/tools/partest/ASMConverters.scala
+++ b/src/partest-extras/scala/tools/partest/ASMConverters.scala
@@ -58,21 +58,24 @@ object ASMConverters {
 
   case class Method(instructions: List[Instruction], handlers: List[ExceptionHandler], localVars: List[LocalVariable])
 
-  case class Field       (opcode: Int, owner: String, name: String, desc: String)               extends Instruction
-  case class Incr        (opcode: Int, `var`: Int, incr: Int)                                   extends Instruction
-  case class Op          (opcode: Int)                                                          extends Instruction
-  case class IntOp       (opcode: Int, operand: Int)                                            extends Instruction
-  case class Jump        (opcode: Int, label: Label)                                            extends Instruction
-  case class Ldc         (opcode: Int, cst: Any)                                                extends Instruction
-  case class LookupSwitch(opcode: Int, dflt: Label, keys: List[Int], labels: List[Label])       extends Instruction
-  case class TableSwitch (opcode: Int, min: Int, max: Int, dflt: Label, labels: List[Label])    extends Instruction
-  case class Invoke      (opcode: Int, owner: String, name: String, desc: String, itf: Boolean) extends Instruction
-  case class NewArray    (opcode: Int, desc: String, dims: Int)                                 extends Instruction
-  case class TypeOp      (opcode: Int, desc: String)                                            extends Instruction
-  case class VarOp       (opcode: Int, `var`: Int)                                              extends Instruction
-  case class Label       (offset: Int)                                                          extends Instruction { def opcode: Int = -1 }
-  case class FrameEntry  (`type`: Int, local: List[Any], stack: List[Any])                      extends Instruction { def opcode: Int = -1 }
-  case class LineNumber  (line: Int, start: Label)                                              extends Instruction { def opcode: Int = -1 }
+  case class Field        (opcode: Int, owner: String, name: String, desc: String)                            extends Instruction
+  case class Incr         (opcode: Int, `var`: Int, incr: Int)                                                extends Instruction
+  case class Op           (opcode: Int)                                                                       extends Instruction
+  case class IntOp        (opcode: Int, operand: Int)                                                         extends Instruction
+  case class Jump         (opcode: Int, label: Label)                                                         extends Instruction
+  case class Ldc          (opcode: Int, cst: Any)                                                             extends Instruction
+  case class LookupSwitch (opcode: Int, dflt: Label, keys: List[Int], labels: List[Label])                    extends Instruction
+  case class TableSwitch  (opcode: Int, min: Int, max: Int, dflt: Label, labels: List[Label])                 extends Instruction
+  case class Invoke       (opcode: Int, owner: String, name: String, desc: String, itf: Boolean)              extends Instruction
+  case class InvokeDynamic(opcode: Int, name: String, desc: String, bsm: MethodHandle, bsmArgs: List[AnyRef]) extends Instruction
+  case class NewArray     (opcode: Int, desc: String, dims: Int)                                              extends Instruction
+  case class TypeOp       (opcode: Int, desc: String)                                                         extends Instruction
+  case class VarOp        (opcode: Int, `var`: Int)                                                           extends Instruction
+  case class Label        (offset: Int)                                                                       extends Instruction { def opcode: Int = -1 }
+  case class FrameEntry   (`type`: Int, local: List[Any], stack: List[Any])                                   extends Instruction { def opcode: Int = -1 }
+  case class LineNumber   (line: Int, start: Label)                                                           extends Instruction { def opcode: Int = -1 }
+
+  case class MethodHandle(tag: Int, owner: String, name: String, desc: String)
 
   case class ExceptionHandler(start: Label, end: Label, handler: Label, desc: Option[String])
   case class LocalVariable(name: String, desc: String, signature: Option[String], start: Label, end: Label, index: Int)
@@ -89,7 +92,7 @@ object ASMConverters {
 
     private def lst[T](xs: java.util.List[T]): List[T] = if (xs == null) Nil else xs.asScala.toList
 
-    // Heterogenous List[Any] is used in FrameNode: type information about locals / stack values
+    // Heterogeneous List[Any] is used in FrameNode: type information about locals / stack values
     // are stored in a List[Any] (Integer, String or LabelNode), see Javadoc of MethodNode#visitFrame.
     // Opcodes (eg Opcodes.INTEGER) and Reference types (eg "java/lang/Object") are returned unchanged,
     // LabelNodes are mapped to their LabelEntry.
@@ -111,6 +114,7 @@ object ASMConverters {
       case i: t.LookupSwitchInsnNode   => LookupSwitch (op(i), applyLabel(i.dflt), lst(i.keys) map (x => x: Int), lst(i.labels) map applyLabel)
       case i: t.TableSwitchInsnNode    => TableSwitch  (op(i), i.min, i.max, applyLabel(i.dflt), lst(i.labels) map applyLabel)
       case i: t.MethodInsnNode         => Invoke       (op(i), i.owner, i.name, i.desc, i.itf)
+      case i: t.InvokeDynamicInsnNode  => InvokeDynamic(op(i), i.name, i.desc, convertMethodHandle(i.bsm), convertBsmArgs(i.bsmArgs))
       case i: t.MultiANewArrayInsnNode => NewArray     (op(i), i.desc, i.dims)
       case i: t.TypeInsnNode           => TypeOp       (op(i), i.desc)
       case i: t.VarInsnNode            => VarOp        (op(i), i.`var`)
@@ -119,6 +123,13 @@ object ASMConverters {
       case i: t.LineNumberNode         => LineNumber   (i.line, applyLabel(i.start))
     }
 
+    private def convertBsmArgs(a: Array[Object]): List[Object] = a.map({
+      case h: asm.Handle => convertMethodHandle(h)
+      case _ => a // can be: Class, method Type, primitive constant
+    })(collection.breakOut)
+
+    private def convertMethodHandle(h: asm.Handle): MethodHandle = MethodHandle(h.getTag, h.getOwner, h.getName, h.getDesc)
+
     private def convertHandlers(method: t.MethodNode): List[ExceptionHandler] = {
       method.tryCatchBlocks.asScala.map(h => ExceptionHandler(applyLabel(h.start), applyLabel(h.end), applyLabel(h.handler), Option(h.`type`)))(collection.breakOut)
     }
@@ -131,7 +142,7 @@ object ASMConverters {
   import collection.mutable.{Map => MMap}
 
   /**
-   * Bytecode is equal modula local variable numbering and label numbering.
+   * Bytecode is equal modulo local variable numbering and label numbering.
    */
   def equivalentBytecode(as: List[Instruction], bs: List[Instruction], varMap: MMap[Int, Int] = MMap(), labelMap: MMap[Int, Int] = MMap()): Boolean = {
     def same(v1: Int, v2: Int, m: MMap[Int, Int]) = {
@@ -197,21 +208,28 @@ object ASMConverters {
     case x => x.asInstanceOf[Object]
   }
 
+  def unconvertMethodHandle(h: MethodHandle): asm.Handle = new asm.Handle(h.tag, h.owner, h.name, h.desc)
+  def unconvertBsmArgs(a: List[Object]): Array[Object] = a.map({
+    case h: MethodHandle => unconvertMethodHandle(h)
+    case o => o
+  })(collection.breakOut)
+
   private def visitMethod(method: t.MethodNode, instruction: Instruction, asmLabel: Map[Label, asm.Label]): Unit = instruction match {
-    case Field(op, owner, name, desc)            => method.visitFieldInsn(op, owner, name, desc)
-    case Incr(op, vr, incr)                      => method.visitIincInsn(vr, incr)
-    case Op(op)                                  => method.visitInsn(op)
-    case IntOp(op, operand)                      => method.visitIntInsn(op, operand)
-    case Jump(op, label)                         => method.visitJumpInsn(op, asmLabel(label))
-    case Ldc(op, cst)                            => method.visitLdcInsn(cst)
-    case LookupSwitch(op, dflt, keys, labels)    => method.visitLookupSwitchInsn(asmLabel(dflt), keys.toArray, (labels map asmLabel).toArray)
-    case TableSwitch(op, min, max, dflt, labels) => method.visitTableSwitchInsn(min, max, asmLabel(dflt), (labels map asmLabel).toArray: _*)
-    case Invoke(op, owner, name, desc, itf)      => method.visitMethodInsn(op, owner, name, desc, itf)
-    case NewArray(op, desc, dims)                => method.visitMultiANewArrayInsn(desc, dims)
-    case TypeOp(op, desc)                        => method.visitTypeInsn(op, desc)
-    case VarOp(op, vr)                           => method.visitVarInsn(op, vr)
-    case l: Label                                => method.visitLabel(asmLabel(l))
-    case FrameEntry(tp, local, stack)            => method.visitFrame(tp, local.length, frameTypesToAsm(local, asmLabel).toArray, stack.length, frameTypesToAsm(stack, asmLabel).toArray)
-    case LineNumber(line, start)                 => method.visitLineNumber(line, asmLabel(start))
+    case Field(op, owner, name, desc)                => method.visitFieldInsn(op, owner, name, desc)
+    case Incr(op, vr, incr)                          => method.visitIincInsn(vr, incr)
+    case Op(op)                                      => method.visitInsn(op)
+    case IntOp(op, operand)                          => method.visitIntInsn(op, operand)
+    case Jump(op, label)                             => method.visitJumpInsn(op, asmLabel(label))
+    case Ldc(op, cst)                                => method.visitLdcInsn(cst)
+    case LookupSwitch(op, dflt, keys, labels)        => method.visitLookupSwitchInsn(asmLabel(dflt), keys.toArray, (labels map asmLabel).toArray)
+    case TableSwitch(op, min, max, dflt, labels)     => method.visitTableSwitchInsn(min, max, asmLabel(dflt), (labels map asmLabel).toArray: _*)
+    case Invoke(op, owner, name, desc, itf)          => method.visitMethodInsn(op, owner, name, desc, itf)
+    case InvokeDynamic(op, name, desc, bsm, bsmArgs) => method.visitInvokeDynamicInsn(name, desc, unconvertMethodHandle(bsm), unconvertBsmArgs(bsmArgs))
+    case NewArray(op, desc, dims)                    => method.visitMultiANewArrayInsn(desc, dims)
+    case TypeOp(op, desc)                            => method.visitTypeInsn(op, desc)
+    case VarOp(op, vr)                               => method.visitVarInsn(op, vr)
+    case l: Label                                    => method.visitLabel(asmLabel(l))
+    case FrameEntry(tp, local, stack)                => method.visitFrame(tp, local.length, frameTypesToAsm(local, asmLabel).toArray, stack.length, frameTypesToAsm(stack, asmLabel).toArray)
+    case LineNumber(line, start)                     => method.visitLineNumber(line, asmLabel(start))
   }
 }
diff --git a/src/partest-extras/scala/tools/partest/IcodeComparison.scala b/src/partest-extras/scala/tools/partest/IcodeComparison.scala
index 7122703..1430db8 100644
--- a/src/partest-extras/scala/tools/partest/IcodeComparison.scala
+++ b/src/partest-extras/scala/tools/partest/IcodeComparison.scala
@@ -48,8 +48,13 @@ abstract class IcodeComparison extends DirectTest {
     compile("-d" :: testOutput.path :: arg0 :: args.toList : _*)
     val icodeFiles = testOutput.files.toList filter (_ hasExtension "icode")
 
-    try     icodeFiles sortBy (_.name) flatMap (f => f.lines.toList)
-    finally icodeFiles foreach (f => f.delete())
+    // Some methods in scala.reflect.io.File leak an InputStream, leaving the underlying file open.
+    // Windows won't delete an open file, but we must ensure the files get deleted, since the logic
+    // here depends on it (collectIcode will be called multiple times, and we can't allow crosstalk
+    // between calls).  So we are careful to use `slurp` which does call `close`, and careful to
+    // check that `delete` returns true indicating successful deletion.
+    try     icodeFiles sortBy (_.name) flatMap (f => f.slurp().lines.toList)
+    finally icodeFiles foreach (f => require(f.delete()))
   }
 
   /** Collect icode at the default phase, `printIcodeAfterPhase`. */
diff --git a/src/partest-extras/scala/tools/partest/ParserTest.scala b/src/partest-extras/scala/tools/partest/ParserTest.scala
new file mode 100644
index 0000000..e4c92e3
--- /dev/null
+++ b/src/partest-extras/scala/tools/partest/ParserTest.scala
@@ -0,0 +1,21 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2014 LAMP/EPFL
+ */
+
+package scala.tools.partest
+
+/** A class for testing parser output.
+ *  Just supply the `code` and update the check file.
+ */
+abstract class ParserTest extends DirectTest {
+
+  override def extraSettings: String = "-usejavacp -Ystop-after:parser -Xprint:parser"
+
+  override def show(): Unit = {
+    // redirect err to out, for logging
+    val prevErr = System.err
+    System.setErr(System.out)
+    compile()
+    System.setErr(prevErr)
+  }
+}
diff --git a/src/partest-extras/scala/tools/partest/ReplTest.scala b/src/partest-extras/scala/tools/partest/ReplTest.scala
index a728e8b..20dfe0e 100644
--- a/src/partest-extras/scala/tools/partest/ReplTest.scala
+++ b/src/partest-extras/scala/tools/partest/ReplTest.scala
@@ -6,8 +6,10 @@
 package scala.tools.partest
 
 import scala.tools.nsc.Settings
-import scala.tools.nsc.interpreter.ILoop
+import scala.tools.nsc.interpreter.{ ILoop, replProps }
 import java.lang.reflect.{ Method => JMethod, Field => JField }
+import scala.util.matching.Regex
+import scala.util.matching.Regex.Match
 
 /** A class for testing repl code.
  *  It filters the line of output that mentions a version number.
@@ -18,27 +20,33 @@ abstract class ReplTest extends DirectTest {
   // final because we need to enforce the existence of a couple settings.
   final override def settings: Settings = {
     val s = super.settings
-    // s.Yreplsync.value = true
     s.Xnojline.value = true
     transformSettings(s)
   }
+  def normalize(s: String) = s
+  /** True for SessionTest to preserve session text. */
+  def inSession: Boolean = false
+  /** True to preserve welcome header, eliding version number. */
   def welcoming: Boolean = false
-  lazy val welcome = "(Welcome to Scala) version .*".r
-  def normalize(s: String) = s match {
-    case welcome(w) => w
-    case s          => s
-  }
-  def unwelcoming(s: String) = s match {
-    case welcome(w) => false
-    case _          => true
-  }
+  lazy val header = replProps.welcome
   def eval() = {
     val s = settings
     log("eval(): settings = " + s)
-    //ILoop.runForTranscript(code, s).lines drop 1  // not always first line
-    val lines = ILoop.runForTranscript(code, s).lines
-    if (welcoming) lines map normalize
-    else lines filter unwelcoming
+    val lines = ILoop.runForTranscript(code, s, inSession = inSession).lines
+    (if (welcoming) {
+      val welcome = "(Welcome to Scala).*".r
+      //val welcome = Regex.quote(header.lines.next).r
+      //val version = "(.*version).*".r   // version on separate line?
+      //var inHead  = false
+      lines map {
+        //case s @ welcome()        => inHead = true  ; s
+        //case version(s) if inHead => inHead = false ; s
+        case welcome(s) => s
+        case s          => s
+      }
+    } else {
+      lines drop header.lines.size
+    }) map normalize
   }
   def show() = eval() foreach println
 }
@@ -57,15 +65,34 @@ abstract class SessionTest extends ReplTest  {
   /** Session transcript, as a triple-quoted, multiline, marginalized string. */
   def session: String
 
-  /** Expected output, as an iterator. */
-  def expected = session.stripMargin.lines
+  /** Expected output, as an iterator, optionally marginally stripped. */
+  def expected = if (stripMargins) session.stripMargin.lines else session.lines
+
+  /** Override with false if we should not strip margins because of leading continuation lines. */
+  def stripMargins: Boolean = true
+
+  /** Analogous to stripMargins, don't mangle continuation lines on echo. */
+  override def inSession: Boolean = true
 
   /** Code is the command list culled from the session (or the expected session output).
-   *  Would be nicer if code were lazy lines.
+   *  Would be nicer if code were lazy lines so you could generate arbitrarily long text.
+   *  Retain user input: prompt lines and continuations, without the prefix; or pasted text plus ctl-D.
    */
-  override final def code = expected filter (_ startsWith prompt) map (_ drop prompt.length) mkString "\n"
+  import SessionTest._
+  lazy val pasted = input(prompt)
+  override final def code = pasted findAllMatchIn (expected mkString ("", "\n", "\n")) map {
+    case pasted(null, null, prompted) =>
+      def continued(m: Match): Option[String] = m match {
+        case margin(text) => Some(text)
+        case _            => None
+      }
+      margin.replaceSomeIn(prompted, continued)
+    case pasted(cmd, pasted, null) =>
+      cmd + pasted + "\u0004"
+  } mkString
 
-  final def prompt = "scala> "
+  // Just the last line of the interactive prompt
+  def prompt = "scala> "
 
   /** Default test is to compare expected and actual output and emit the diff on a failed comparison. */
   override def show() = {
@@ -75,3 +102,9 @@ abstract class SessionTest extends ReplTest  {
     if (evaled != wanted) Console print nest.FileManager.compareContents(wanted, evaled, "expected", "actual")
   }
 }
+object SessionTest {
+  // \R for line break is Java 8, \v for vertical space might suffice
+  def input(prompt: String) = s"""(?m)^$prompt(:pa.*\u000A)// Entering paste mode.*\u000A\u000A((?:.*\u000A)*)\u000A// Exiting paste mode.*\u000A|^scala> (.*\u000A(?:\\s*\\| .*\u000A)*)""".r
+
+  val margin = """(?m)^\s*\| (.*)$""".r
+}
diff --git a/src/reflect/scala/reflect/api/Constants.scala b/src/reflect/scala/reflect/api/Constants.scala
index fbcf7f3..4cc2cb8 100644
--- a/src/reflect/scala/reflect/api/Constants.scala
+++ b/src/reflect/scala/reflect/api/Constants.scala
@@ -95,7 +95,7 @@ trait Constants {
    *  broken down or evaluated, such as "true", "0", "classOf[List]". Such values become parts of the Scala abstract
    *  syntax tree representing the program. The constants
    *  correspond to section 6.24 "Constant Expressions" of the
-   *  [[http://www.scala-lang.org/docu/files/ScalaReference.pdf Scala language specification]].
+   *  [[http://www.scala-lang.org/files/archive/spec/2.11/ Scala Language Specification]].
    *
    *  Such constants are used to represent literals in abstract syntax trees (the [[scala.reflect.api.Trees#Literal]] node)
    *  and literal arguments for Java class file annotations (the [[scala.reflect.api.Annotations#LiteralArgument]] class).
diff --git a/src/reflect/scala/reflect/api/FlagSets.scala b/src/reflect/scala/reflect/api/FlagSets.scala
index bcad84a..d3294da 100644
--- a/src/reflect/scala/reflect/api/FlagSets.scala
+++ b/src/reflect/scala/reflect/api/FlagSets.scala
@@ -48,7 +48,7 @@ import scala.language.implicitConversions
  * ''Of Note:'' This part of the Reflection API is being considered as a candidate for redesign. It is
  * quite possible that in future releases of the reflection API, flag sets could be replaced with something else.
  *
- * For more details about `FlagSet`s and other aspects of Scala reflection, see the
+ * For more details about `FlagSet`s and other aspects of Scala reflection, see the
  * [[http://docs.scala-lang.org/overviews/reflection/overview.html Reflection Guide]]
  *
  * @group ReflectionAPI
diff --git a/src/reflect/scala/reflect/api/Internals.scala b/src/reflect/scala/reflect/api/Internals.scala
index 577cd09..f57d7ef 100644
--- a/src/reflect/scala/reflect/api/Internals.scala
+++ b/src/reflect/scala/reflect/api/Internals.scala
@@ -114,7 +114,7 @@ trait Internals { self: Universe =>
     def substituteTypes(tree: Tree, from: List[Symbol], to: List[Type]): Tree
 
     /** Substitute given tree `to` for occurrences of nodes that represent
-     *  `C.this`, where `C` referes to the given class `clazz`.
+     *  `C.this`, where `C` refers to the given class `clazz`.
      */
     def substituteThis(tree: Tree, clazz: Symbol, to: Tree): Tree
 
@@ -939,7 +939,7 @@ trait Internals { self: Universe =>
 
   /** Marks underlying reference to id as boxed.
    *
-   *  <b>Precondition:<\b> id must refer to a captured variable
+   *  <b>Precondition:</b> id must refer to a captured variable
    *  A reference such marked will refer to the boxed entity, no dereferencing
    *  with `.elem` is done on it.
    *  This tree node can be emitted by macros such as reify that call referenceCapturedVariable.
diff --git a/src/reflect/scala/reflect/api/Names.scala b/src/reflect/scala/reflect/api/Names.scala
index 472da60..cc01225 100644
--- a/src/reflect/scala/reflect/api/Names.scala
+++ b/src/reflect/scala/reflect/api/Names.scala
@@ -30,15 +30,15 @@ import scala.language.implicitConversions
  */
 trait Names {
   /** An implicit conversion from String to TermName.
-   *  Enables an alternative notation `"map": TermName` as opposed to `TermName("map")`.
-   *  @group Names
+   * Enables an alternative notation `"map": TermName` as opposed to `TermName("map")`.
+   * @group Names
    */
   @deprecated("Use explicit `TermName(s)` instead", "2.11.0")
   implicit def stringToTermName(s: String): TermName = TermName(s)
 
   /** An implicit conversion from String to TypeName.
-   *  Enables an alternative notation `"List": TypeName` as opposed to `TypeName("List")`.
-   *  @group Names
+   * Enables an alternative notation `"List": TypeName` as opposed to `TypeName("List")`.
+   * @group Names
    */
   @deprecated("Use explicit `TypeName(s)` instead", "2.11.0")
   implicit def stringToTypeName(s: String): TypeName = TypeName(s)
diff --git a/src/reflect/scala/reflect/api/Printers.scala b/src/reflect/scala/reflect/api/Printers.scala
index 01b9759..c0abc51 100644
--- a/src/reflect/scala/reflect/api/Printers.scala
+++ b/src/reflect/scala/reflect/api/Printers.scala
@@ -130,7 +130,7 @@ import java.io.{ PrintWriter, StringWriter }
  *      TermName("y")#2541#GET))
  * }}}
  *
- * For more details about `Printer`s and other aspects of Scala reflection, see the
+ * For more details about `Printer`s and other aspects of Scala reflection, see the
  * [[http://docs.scala-lang.org/overviews/reflection/overview.html Reflection Guide]]
  *
  *  @group ReflectionAPI
diff --git a/src/reflect/scala/reflect/api/Quasiquotes.scala b/src/reflect/scala/reflect/api/Quasiquotes.scala
index eaae05b..554b43a 100644
--- a/src/reflect/scala/reflect/api/Quasiquotes.scala
+++ b/src/reflect/scala/reflect/api/Quasiquotes.scala
@@ -3,7 +3,7 @@ package api
 
 trait Quasiquotes { self: Universe =>
 
-  /** Implicit class that introduces `q`, `tq`, `cq,` `p` and `fq` string interpolators
+  /** Implicit class that introduces `q`, `tq`, `cq,` `pq` and `fq` string interpolators
    *  that are also known as quasiquotes. With their help you can easily manipulate
    *  Scala reflection ASTs.
    *
diff --git a/src/reflect/scala/reflect/api/StandardLiftables.scala b/src/reflect/scala/reflect/api/StandardLiftables.scala
index 66ac62c..ebf15e4 100644
--- a/src/reflect/scala/reflect/api/StandardLiftables.scala
+++ b/src/reflect/scala/reflect/api/StandardLiftables.scala
@@ -230,6 +230,6 @@ trait StandardLiftables { self: Universe =>
     val Symbol     = TermName("Symbol")
     val util       = TermName("util")
     val Vector     = TermName("Vector")
-    val WILDCARD   = self.nme.WILDCARD
+    val WILDCARD   = self.termNames.WILDCARD
   }
 }
diff --git a/src/reflect/scala/reflect/api/Trees.scala b/src/reflect/scala/reflect/api/Trees.scala
index 9ecd87c..a43195d 100644
--- a/src/reflect/scala/reflect/api/Trees.scala
+++ b/src/reflect/scala/reflect/api/Trees.scala
@@ -143,7 +143,7 @@ trait Trees { self: Universe =>
     /** Find all subtrees matching predicate `p`. Same as `withFilter` */
     def filter(f: Tree => Boolean): List[Tree]
 
-    /** Apply `pf' to each subtree on which the function is defined and collect the results.
+    /** Apply `pf` to each subtree on which the function is defined and collect the results.
      */
     def collect[T](pf: PartialFunction[Tree, T]): List[T]
 
@@ -2661,7 +2661,7 @@ trait Trees { self: Universe =>
    *  @group Traversal
    */
   abstract class ModifiersExtractor {
-    def apply(): Modifiers = Modifiers(NoFlags, tpnme.EMPTY, List())
+    def apply(): Modifiers = Modifiers(NoFlags, typeNames.EMPTY, List())
     def apply(flags: FlagSet, privateWithin: Name, annotations: List[Tree]): Modifiers
     def unapply(mods: Modifiers): Option[(FlagSet, Name, List[Tree])]
   }
@@ -2674,7 +2674,7 @@ trait Trees { self: Universe =>
   /** The factory for `Modifiers` instances.
    *  @group Traversal
    */
-  def Modifiers(flags: FlagSet): Modifiers = Modifiers(flags, tpnme.EMPTY)
+  def Modifiers(flags: FlagSet): Modifiers = Modifiers(flags, typeNames.EMPTY)
 
   /** An empty `Modifiers` object: no flags, empty visibility annotation and no Scala annotations.
    *  @group Traversal
diff --git a/src/reflect/scala/reflect/api/TypeTags.scala b/src/reflect/scala/reflect/api/TypeTags.scala
index 7db375c..bc239ca 100644
--- a/src/reflect/scala/reflect/api/TypeTags.scala
+++ b/src/reflect/scala/reflect/api/TypeTags.scala
@@ -53,7 +53,7 @@ import java.io.ObjectStreamException
  * Each of these methods constructs a `TypeTag[T]` or `ClassTag[T]` for the given
  * type argument `T`.
  *
- * === #2 Using an implicit parameter of type `TypeTag[T]`, `ClassTag[T]`, or `WeakTypeTag[T]
+ * === #2 Using an implicit parameter of type `TypeTag[T]`, `ClassTag[T]`, or `WeakTypeTag[T]`
  *
  * For example:
  * {{{
diff --git a/src/reflect/scala/reflect/api/Types.scala b/src/reflect/scala/reflect/api/Types.scala
index f6995dd..f9b49f1 100644
--- a/src/reflect/scala/reflect/api/Types.scala
+++ b/src/reflect/scala/reflect/api/Types.scala
@@ -469,7 +469,7 @@ trait Types {
     def unapply(tpe: SingleType): Option[(Type, Symbol)]
 
     /** @see [[InternalApi.singleType]] */
-    @deprecated("Use `ClassSymbol.thisPrefix` or `internal.singleType` instead")
+    @deprecated("Use `ClassSymbol.thisPrefix` or `internal.singleType` instead", "2.11.0")
     def apply(pre: Type, sym: Symbol)(implicit token: CompatToken): Type = internal.singleType(pre, sym)
   }
 
@@ -588,7 +588,7 @@ trait Types {
   /** An extractor class to create and pattern match with syntax `TypeRef(pre, sym, args)`
    *  Here, `pre` is the prefix of the type reference, `sym` is the symbol
    *  referred to by the type reference, and `args` is a possible empty list of
-   *  type argumenrts.
+   *  type arguments.
    *  @group Extractors
    */
   abstract class TypeRefExtractor {
diff --git a/src/reflect/scala/reflect/internal/AnnotationCheckers.scala b/src/reflect/scala/reflect/internal/AnnotationCheckers.scala
index 74310e1..1ba014d 100644
--- a/src/reflect/scala/reflect/internal/AnnotationCheckers.scala
+++ b/src/reflect/scala/reflect/internal/AnnotationCheckers.scala
@@ -60,7 +60,7 @@ trait AnnotationCheckers {
      * mode (see method adapt in trait Typers).
      *
      * An implementation cannot rely on canAdaptAnnotations being called before. If the implementing
-     * class cannot do the adaptiong, it should return the tree unchanged.
+     * class cannot do the adapting, it should return the tree unchanged.
      */
     @deprecated("Create an AnalyzerPlugin and use adaptAnnotations", "2.10.1")
     def adaptAnnotations(tree: Tree, mode: Mode, pt: Type): Tree = tree
diff --git a/src/reflect/scala/reflect/internal/AnnotationInfos.scala b/src/reflect/scala/reflect/internal/AnnotationInfos.scala
index 6863cdf..b923541 100644
--- a/src/reflect/scala/reflect/internal/AnnotationInfos.scala
+++ b/src/reflect/scala/reflect/internal/AnnotationInfos.scala
@@ -404,7 +404,7 @@ trait AnnotationInfos extends api.Annotations { self: SymbolTable =>
 
   object UnmappableAnnotation extends CompleteAnnotationInfo(NoType, Nil, Nil)
 
-  object ErroneousAnnotation extends CompleteAnnotationInfo(ErrorType, Nil, Nil)
+  class ErroneousAnnotation() extends CompleteAnnotationInfo(ErrorType, Nil, Nil)
 
   /** Extracts symbol of thrown exception from AnnotationInfo.
     *
diff --git a/src/reflect/scala/reflect/internal/ClassfileConstants.scala b/src/reflect/scala/reflect/internal/ClassfileConstants.scala
index e0a6757..a4223c1 100644
--- a/src/reflect/scala/reflect/internal/ClassfileConstants.scala
+++ b/src/reflect/scala/reflect/internal/ClassfileConstants.scala
@@ -14,7 +14,7 @@ object ClassfileConstants {
   final val JAVA_MAJOR_VERSION = 45
   final val JAVA_MINOR_VERSION = 3
 
-  /** (see http://java.sun.com/docs/books/jvms/second_edition/jvms-clarify.html)
+  /** (see http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.1)
    *
    *  If the `ACC_INTERFACE` flag is set, the `ACC_ABSTRACT` flag must also
    *  be set (ch. 2.13.1).
@@ -344,10 +344,13 @@ object ClassfileConstants {
       case JAVA_ACC_STATIC     => STATIC
       case JAVA_ACC_ABSTRACT   => if (isAnnotation) 0L else if (isClass) ABSTRACT else DEFERRED
       case JAVA_ACC_INTERFACE  => if (isAnnotation) 0L else TRAIT | INTERFACE | ABSTRACT
+      case JAVA_ACC_ENUM       => JAVA_ENUM
+      case JAVA_ACC_ANNOTATION => JAVA_ANNOTATION
       case _                   => 0L
     }
-    private def translateFlags(jflags: Int, baseFlags: Long, isAnnotation: Boolean, isClass: Boolean): Long = {
-      def translateFlag0(jflags: Int): Long = translateFlag(jflags, isAnnotation, isClass)
+    private def translateFlags(jflags: Int, baseFlags: Long, isClass: Boolean): Long = {
+      val isAnnot = isAnnotation(jflags)
+      def translateFlag0(jflags: Int): Long = translateFlag(jflags, isAnnot, isClass)
       var res: Long = JAVA | baseFlags
       /* fast, elegant, maintainable, pick any two... */
       res |= translateFlag0(jflags & JAVA_ACC_PRIVATE)
@@ -357,17 +360,19 @@ object ClassfileConstants {
       res |= translateFlag0(jflags & JAVA_ACC_STATIC)
       res |= translateFlag0(jflags & JAVA_ACC_ABSTRACT)
       res |= translateFlag0(jflags & JAVA_ACC_INTERFACE)
+      res |= translateFlag0(jflags & JAVA_ACC_ENUM)
+      res |= translateFlag0(jflags & JAVA_ACC_ANNOTATION)
       res
     }
 
     def classFlags(jflags: Int): Long = {
-      translateFlags(jflags, 0, isAnnotation(jflags), isClass = true)
+      translateFlags(jflags, 0, isClass = true)
     }
     def fieldFlags(jflags: Int): Long = {
-      translateFlags(jflags, if ((jflags & JAVA_ACC_FINAL) == 0) MUTABLE else 0 , isAnnotation(jflags), isClass = false)
+      translateFlags(jflags, if ((jflags & JAVA_ACC_FINAL) == 0) MUTABLE else 0 , isClass = false)
     }
     def methodFlags(jflags: Int): Long = {
-      translateFlags(jflags, if ((jflags & JAVA_ACC_BRIDGE) != 0) BRIDGE | ARTIFACT else 0, isAnnotation(jflags), isClass = false)
+      translateFlags(jflags, if ((jflags & JAVA_ACC_BRIDGE) != 0) BRIDGE | ARTIFACT else 0, isClass = false)
     }
   }
   object FlagTranslation extends FlagTranslation { }
diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala
index 9f4ec3e..0bdf5b4 100644
--- a/src/reflect/scala/reflect/internal/Definitions.scala
+++ b/src/reflect/scala/reflect/internal/Definitions.scala
@@ -103,7 +103,7 @@ trait Definitions extends api.StandardDefinitions {
     def isNumericValueClass(sym: Symbol) = ScalaNumericValueClasses contains sym
 
     def isGetClass(sym: Symbol) = (
-         sym.name == nme.getClass_ // this condition is for performance only, this is called from `Typer#stabliize`.
+         sym.name == nme.getClass_ // this condition is for performance only, this is called from `Typer#stabilize`.
       && getClassMethods(sym)
     )
 
@@ -156,11 +156,11 @@ trait Definitions extends api.StandardDefinitions {
 
     // It becomes tricky to create dedicated objects for other symbols because
     // of initialization order issues.
-    lazy val JavaLangPackage      = getPackage("java.lang")
+    lazy val JavaLangPackage      = getPackage(TermName("java.lang"))
     lazy val JavaLangPackageClass = JavaLangPackage.moduleClass.asClass
-    lazy val ScalaPackage         = getPackage("scala")
+    lazy val ScalaPackage         = getPackage(TermName("scala"))
     lazy val ScalaPackageClass    = ScalaPackage.moduleClass.asClass
-    lazy val RuntimePackage       = getPackage("scala.runtime")
+    lazy val RuntimePackage       = getPackage(TermName("scala.runtime"))
     lazy val RuntimePackageClass  = RuntimePackage.moduleClass.asClass
 
     def javaTypeToValueClass(jtype: Class[_]): Symbol = jtype match {
@@ -369,6 +369,8 @@ trait Definitions extends api.StandardDefinitions {
     lazy val JavaEnumClass         = requiredClass[java.lang.Enum[_]]
     lazy val RemoteInterfaceClass  = requiredClass[java.rmi.Remote]
     lazy val RemoteExceptionClass  = requiredClass[java.rmi.RemoteException]
+    lazy val JavaUtilMap           = requiredClass[java.util.Map[_, _]]
+    lazy val JavaUtilHashMap       = requiredClass[java.util.HashMap[_, _]]
 
     lazy val ByNameParamClass       = specialPolyClass(tpnme.BYNAME_PARAM_CLASS_NAME, COVARIANT)(_ => AnyTpe)
     lazy val JavaRepeatedParamClass = specialPolyClass(tpnme.JAVA_REPEATED_PARAM_CLASS_NAME, COVARIANT)(tparam => arrayType(tparam.tpe))
@@ -453,7 +455,7 @@ trait Definitions extends api.StandardDefinitions {
 
     // XML
     lazy val ScalaXmlTopScope = getModuleIfDefined("scala.xml.TopScope")
-    lazy val ScalaXmlPackage  = getPackageIfDefined("scala.xml")
+    lazy val ScalaXmlPackage  = getPackageIfDefined(TermName("scala.xml"))
 
     // scala.reflect
     lazy val ReflectPackage              = requiredModule[scala.reflect.`package`.type]
@@ -514,6 +516,7 @@ trait Definitions extends api.StandardDefinitions {
     lazy val ScalaSignatureAnnotation = requiredClass[scala.reflect.ScalaSignature]
     lazy val ScalaLongSignatureAnnotation = requiredClass[scala.reflect.ScalaLongSignature]
 
+    lazy val LambdaMetaFactory = getClassIfDefined("java.lang.invoke.LambdaMetafactory")
     lazy val MethodHandle = getClassIfDefined("java.lang.invoke.MethodHandle")
 
     // Option classes
@@ -812,7 +815,7 @@ trait Definitions extends api.StandardDefinitions {
         // must filter out "universal" members (getClass is deferred for some reason)
         val deferredMembers = (
           tp membersBasedOnFlags (excludedFlags = BridgeAndPrivateFlags, requiredFlags = METHOD)
-          filter (mem => mem.isDeferredNotDefault && !isUniversalMember(mem)) // TODO: test
+          filter (mem => mem.isDeferredNotJavaDefault && !isUniversalMember(mem)) // TODO: test
         )
 
         // if there is only one, it's monomorphic and has a single argument list
@@ -936,7 +939,7 @@ trait Definitions extends api.StandardDefinitions {
     // TODO these aren't final! They are now overridden in AnyRef/Object. Prior to the fix
     //      for SI-8129, they were actually *overloaded* by the members in AnyRef/Object.
     //      We should unfinalize these, override in AnyValClass, and make the overrides final.
-    //      Refchecks never actually looks at these, so its just for consistency.
+    //      Refchecks never actually looks at these, so it's just for consistency.
     lazy val Any_==       = enterNewMethod(AnyClass, nme.EQ, AnyTpe :: Nil, BooleanTpe, FINAL)
     lazy val Any_!=       = enterNewMethod(AnyClass, nme.NE, AnyTpe :: Nil, BooleanTpe, FINAL)
 
@@ -1148,7 +1151,7 @@ trait Definitions extends api.StandardDefinitions {
       // Trying to allow for deprecated locations
       sym.isAliasType && isMetaAnnotation(sym.info.typeSymbol)
     )
-    lazy val metaAnnotations: Set[Symbol] = getPackage("scala.annotation.meta").info.members filter (_ isSubClass StaticAnnotationClass) toSet
+    lazy val metaAnnotations: Set[Symbol] = getPackage(TermName("scala.annotation.meta")).info.members filter (_ isSubClass StaticAnnotationClass) toSet
 
     // According to the scala.annotation.meta package object:
     // * By default, annotations on (`val`-, `var`- or plain) constructor parameters
@@ -1462,7 +1465,7 @@ trait Definitions extends api.StandardDefinitions {
       )
       lazy val TagSymbols = TagMaterializers.keySet
       lazy val Predef_conforms     = (getMemberIfDefined(PredefModule, nme.conforms)
-                               orElse getMemberMethod(PredefModule, "conforms": TermName)) // TODO: predicate on -Xsource:2.10 (for now, needed for transition from M8 -> RC1)
+                               orElse getMemberMethod(PredefModule, TermName("conforms"))) // TODO: predicate on -Xsource:2.10 (for now, needed for transition from M8 -> RC1)
       lazy val Predef_classOf      = getMemberMethod(PredefModule, nme.classOf)
       lazy val Predef_implicitly   = getMemberMethod(PredefModule, nme.implicitly)
       lazy val Predef_wrapRefArray = getMemberMethod(PredefModule, nme.wrapRefArray)
@@ -1513,6 +1516,9 @@ trait Definitions extends api.StandardDefinitions {
 
       def isPolymorphicSignature(sym: Symbol) = PolySigMethods(sym)
       private lazy val PolySigMethods: Set[Symbol] = Set[Symbol](MethodHandle.info.decl(sn.Invoke), MethodHandle.info.decl(sn.InvokeExact)).filter(_.exists)
+
+      lazy val Scala_Java8_CompatPackage = rootMirror.getPackageIfDefined("scala.compat.java8")
+      lazy val Scala_Java8_CompatPackage_JFunction = (0 to MaxFunctionArity).toArray map (i => getMemberIfDefined(Scala_Java8_CompatPackage.moduleClass, TypeName("JFunction" + i)))
     }
   }
 }
diff --git a/src/reflect/scala/reflect/internal/ExistentialsAndSkolems.scala b/src/reflect/scala/reflect/internal/ExistentialsAndSkolems.scala
index 0eeca4a..3e18f88 100644
--- a/src/reflect/scala/reflect/internal/ExistentialsAndSkolems.scala
+++ b/src/reflect/scala/reflect/internal/ExistentialsAndSkolems.scala
@@ -110,7 +110,7 @@ trait ExistentialsAndSkolems {
   /**
    * Compute an existential type from hidden symbols `hidden` and type `tp`.
    * @param hidden   The symbols that will be existentially abstracted
-   * @param hidden   The original type
+   * @param tp       The original type
    * @param rawOwner The owner for Java raw types.
    */
   final def packSymbols(hidden: List[Symbol], tp: Type, rawOwner: Symbol = NoSymbol): Type =
diff --git a/src/reflect/scala/reflect/internal/FlagSets.scala b/src/reflect/scala/reflect/internal/FlagSets.scala
index ef9c778..b652163 100644
--- a/src/reflect/scala/reflect/internal/FlagSets.scala
+++ b/src/reflect/scala/reflect/internal/FlagSets.scala
@@ -42,7 +42,7 @@ trait FlagSets extends api.FlagSets { self: SymbolTable =>
     val DEFAULTPARAM  : FlagSet = Flags.DEFAULTPARAM
     val PRESUPER      : FlagSet = Flags.PRESUPER
     val DEFAULTINIT   : FlagSet = Flags.DEFAULTINIT
-    val ENUM          : FlagSet = Flags.ENUM
+    val ENUM          : FlagSet = Flags.JAVA_ENUM
     val PARAMACCESSOR : FlagSet = Flags.PARAMACCESSOR
     val CASEACCESSOR  : FlagSet = Flags.CASEACCESSOR
     val SYNTHETIC     : FlagSet = Flags.SYNTHETIC
diff --git a/src/reflect/scala/reflect/internal/Flags.scala b/src/reflect/scala/reflect/internal/Flags.scala
index 1707061..754b96a 100644
--- a/src/reflect/scala/reflect/internal/Flags.scala
+++ b/src/reflect/scala/reflect/internal/Flags.scala
@@ -15,65 +15,65 @@ import scala.collection.{ mutable, immutable }
 //
 // Generated by mkFlagsTable() at Thu Feb 02 20:31:52 PST 2012
 //
-//  0:     PROTECTED/M
-//  1:      OVERRIDE/M
-//  2:       PRIVATE/M
-//  3:      ABSTRACT/M
-//  4:      DEFERRED/M
-//  5:         FINAL/M
-//  6:          METHOD
-//  7:     INTERFACE/M
-//  8:          MODULE
-//  9:      IMPLICIT/M
-// 10:        SEALED/M
-// 11:          CASE/M
-// 12:       MUTABLE/M
-// 13:         PARAM/M
-// 14:         PACKAGE
-// 15:         MACRO/M
-// 16:   BYNAMEPARAM/M      CAPTURED COVARIANT/M
-// 17: CONTRAVARIANT/M INCONSTRUCTOR       LABEL
-// 18:   ABSOVERRIDE/M
-// 19:         LOCAL/M
-// 20:          JAVA/M
-// 21:       SYNTHETIC
-// 22:          STABLE
-// 23:        STATIC/M
-// 24:  CASEACCESSOR/M
-// 25:  DEFAULTPARAM/M       TRAIT/M
-// 26:          BRIDGE
-// 27:        ACCESSOR
-// 28:   SUPERACCESSOR
-// 29: PARAMACCESSOR/M
-// 30:       MODULEVAR
-// 31:          LAZY/M
-// 32:        IS_ERROR
-// 33:      OVERLOADED
-// 34:          LIFTED
-// 35:     EXISTENTIAL       MIXEDIN
-// 36:    EXPANDEDNAME
-// 37:       IMPLCLASS    PRESUPER/M
-// 38:      TRANS_FLAG
-// 39:          LOCKED
-// 40:     SPECIALIZED
-// 41:   DEFAULTINIT/M
-// 42:         VBRIDGE
-// 43:         VARARGS
-// 44:    TRIEDCOOKING
-// 45:  SYNCHRONIZED/M
-// 46:        ARTIFACT
-// 47: DEFAULTMETHOD/M
-// 48:            ENUM
-// 49:
+//  0:          PROTECTED/M
+//  1:           OVERRIDE/M
+//  2:            PRIVATE/M
+//  3:           ABSTRACT/M
+//  4:           DEFERRED/M
+//  5:              FINAL/M
+//  6:               METHOD
+//  7:          INTERFACE/M
+//  8:               MODULE
+//  9:           IMPLICIT/M
+// 10:             SEALED/M
+// 11:               CASE/M
+// 12:            MUTABLE/M
+// 13:              PARAM/M
+// 14:              PACKAGE
+// 15:              MACRO/M
+// 16:        BYNAMEPARAM/M      CAPTURED COVARIANT/M
+// 17:      CONTRAVARIANT/M INCONSTRUCTOR       LABEL
+// 18:        ABSOVERRIDE/M
+// 19:              LOCAL/M
+// 20:               JAVA/M
+// 21:            SYNTHETIC
+// 22:               STABLE
+// 23:             STATIC/M
+// 24:       CASEACCESSOR/M
+// 25:       DEFAULTPARAM/M       TRAIT/M
+// 26:               BRIDGE
+// 27:             ACCESSOR
+// 28:        SUPERACCESSOR
+// 29:      PARAMACCESSOR/M
+// 30:            MODULEVAR
+// 31:               LAZY/M
+// 32:             IS_ERROR
+// 33:           OVERLOADED
+// 34:               LIFTED
+// 35:          EXISTENTIAL       MIXEDIN
+// 36:         EXPANDEDNAME
+// 37:            IMPLCLASS    PRESUPER/M
+// 38:           TRANS_FLAG
+// 39:               LOCKED
+// 40:          SPECIALIZED
+// 41:        DEFAULTINIT/M
+// 42:              VBRIDGE
+// 43:              VARARGS
+// 44:         TRIEDCOOKING
+// 45:       SYNCHRONIZED/M
+// 46:             ARTIFACT
+// 47: JAVA_DEFAULTMETHOD/M
+// 48:            JAVA_ENUM
+// 49:      JAVA_ANNOTATION
 // 50:
-// 51:    lateDEFERRED
-// 52:       lateFINAL
-// 53:      lateMETHOD
-// 54:   lateINTERFACE
-// 55:      lateMODULE
-// 56:    notPROTECTED
-// 57:     notOVERRIDE
-// 58:      notPRIVATE
+// 51:         lateDEFERRED
+// 52:            lateFINAL
+// 53:           lateMETHOD
+// 54:        lateINTERFACE
+// 55:           lateMODULE
+// 56:         notPROTECTED
+// 57:          notOVERRIDE
+// 58:           notPRIVATE
 // 59:
 // 60:
 // 61:
@@ -119,8 +119,9 @@ class ModifierFlags {
   final val DEFAULTINIT   = 1L << 41      // symbol is initialized to the default value: used by -Xcheckinit
   final val ARTIFACT      = 1L << 46      // symbol should be ignored when typechecking; will be marked ACC_SYNTHETIC in bytecode
                                           // to see which symbols are marked as ARTIFACT, see scaladocs for FlagValues.ARTIFACT
-  final val DEFAULTMETHOD = 1L << 47      // symbol is a java default method
-  final val ENUM          = 1L << 48      // symbol is an enum
+  final val JAVA_DEFAULTMETHOD = 1L << 47     // symbol is a java default method
+  final val JAVA_ENUM          = 1L << 48     // symbol is a java enum
+  final val JAVA_ANNOTATION    = 1L << 49     // symbol is a java annotation
 
   // Overridden.
   def flagToString(flag: Long): String = ""
@@ -172,12 +173,28 @@ class Flags extends ModifierFlags {
   final val SYNCHRONIZED  = 1L << 45      // symbol is a method which should be marked ACC_SYNCHRONIZED
 
   // ------- shift definitions -------------------------------------------------------
+  //
+  // Flags from 1L to (1L << 50) are normal flags.
+  //
+  // The flags DEFERRED (1L << 4) to MODULE (1L << 8) have a `late` counterpart. Late flags change
+  // their counterpart from 0 to 1 after a specific phase (see below). The first late flag
+  // (lateDEFERRED) is at (1L << 51), i.e., late flags are shifted by 47. The last one is (1L << 55).
+  //
+  // The flags PROTECTED (1L) to PRIVATE (1L << 2) have a `not` counterpart. Negated flags change
+  // their counterpart from 1 to 0 after a specific phase (see below). They are shifted by 56, i.e.,
+  // the first negated flag (notPROTECTED) is at (1L << 56), the last at (1L << 58).
+  //
+  // Late and negative flags are only enabled after certain phases, implemented by the phaseNewFlags
+  // method of the SubComponent, so they implement a bit of a flag history.
+  //
+  // The flags (1L << 59) to (1L << 63) are currently unused. If added to the InitialFlags mask,
+  // they could be used as normal flags.
 
-  final val InitialFlags  = 0x0001FFFFFFFFFFFFL // flags that are enabled from phase 1.
-  final val LateFlags     = 0x00FE000000000000L // flags that override flags in 0x1FC.
-  final val AntiFlags     = 0x7F00000000000000L // flags that cancel flags in 0x07F
-  final val LateShift     = 47L
-  final val AntiShift     = 56L
+  final val InitialFlags  = 0x0007FFFFFFFFFFFFL // normal flags, enabled from the first phase: 1L to (1L << 50)
+  final val LateFlags     = 0x00F8000000000000L // flags that override flags in (1L << 4) to (1L << 8): DEFERRED, FINAL, INTERFACE, METHOD, MODULE
+  final val AntiFlags     = 0x0700000000000000L // flags that cancel flags in 1L to (1L << 2): PROTECTED, OVERRIDE, PRIVATE
+  final val LateShift     = 47
+  final val AntiShift     = 56
 
   // Flags which sketchily share the same slot
   // 16:   BYNAMEPARAM/M      CAPTURED COVARIANT/M
@@ -243,7 +260,7 @@ class Flags extends ModifierFlags {
    */
   final val ExplicitFlags =
     PRIVATE | PROTECTED | ABSTRACT | FINAL | SEALED |
-    OVERRIDE | CASE | IMPLICIT | ABSOVERRIDE | LAZY | DEFAULTMETHOD
+    OVERRIDE | CASE | IMPLICIT | ABSOVERRIDE | LAZY | JAVA_DEFAULTMETHOD
 
   /** The two bridge flags */
   final val BridgeFlags = BRIDGE | VBRIDGE
@@ -434,9 +451,9 @@ class Flags extends ModifierFlags {
     case        TRIEDCOOKING => "<triedcooking>"                      // (1L << 44)
     case        SYNCHRONIZED => "<synchronized>"                      // (1L << 45)
     case            ARTIFACT => "<artifact>"                          // (1L << 46)
-    case       DEFAULTMETHOD => "<defaultmethod>"                     // (1L << 47)
-    case                ENUM => "<enum>"                              // (1L << 48)
-    case    0x2000000000000L => ""                                    // (1L << 49)
+    case  JAVA_DEFAULTMETHOD => "<defaultmethod>"                     // (1L << 47)
+    case           JAVA_ENUM => "<enum>"                              // (1L << 48)
+    case     JAVA_ANNOTATION => "<annotation>"                        // (1L << 49)
     case    0x4000000000000L => ""                                    // (1L << 50)
     case      `lateDEFERRED` => "<latedeferred>"                      // (1L << 51)
     case         `lateFINAL` => "<latefinal>"                         // (1L << 52)
diff --git a/src/reflect/scala/reflect/internal/HasFlags.scala b/src/reflect/scala/reflect/internal/HasFlags.scala
index aa8f4c5..5162b15 100644
--- a/src/reflect/scala/reflect/internal/HasFlags.scala
+++ b/src/reflect/scala/reflect/internal/HasFlags.scala
@@ -79,49 +79,50 @@ trait HasFlags {
 
   // Tests which come through cleanly: both Symbol and Modifiers use these
   // identically, testing for a single flag.
-  def hasAbstractFlag    = hasFlag(ABSTRACT)
-  def hasAccessorFlag    = hasFlag(ACCESSOR)
-  def hasDefault         = hasFlag(DEFAULTPARAM) && hasFlag(METHOD | PARAM) // Second condition disambiguates with TRAIT
-  def hasEnumFlag        = hasFlag(ENUM)
+  def hasAbstractFlag       = hasFlag(ABSTRACT)
+  def hasAccessorFlag       = hasFlag(ACCESSOR)
+  def hasDefault            = hasFlag(DEFAULTPARAM) && hasFlag(METHOD | PARAM) // Second condition disambiguates with TRAIT
+  def hasJavaEnumFlag       = hasFlag(JAVA_ENUM)
+  def hasJavaAnnotationFlag = hasFlag(JAVA_ANNOTATION)
   @deprecated("Use isLocalToThis instead", "2.11.0")
-  def hasLocalFlag       = hasFlag(LOCAL)
-  def isLocalToThis      = hasFlag(LOCAL)
-  def hasModuleFlag      = hasFlag(MODULE)
-  def hasPackageFlag     = hasFlag(PACKAGE)
-  def hasStableFlag      = hasFlag(STABLE)
-  def hasStaticFlag      = hasFlag(STATIC)
-  def isAbstractOverride = hasFlag(ABSOVERRIDE)
-  def isAnyOverride      = hasFlag(OVERRIDE | ABSOVERRIDE)
-  def isCase             = hasFlag(CASE)
-  def isCaseAccessor     = hasFlag(CASEACCESSOR)
-  def isDeferred         = hasFlag(DEFERRED)
-  def isFinal            = hasFlag(FINAL)
-  def isArtifact         = hasFlag(ARTIFACT)
-  def isImplicit         = hasFlag(IMPLICIT)
-  def isInterface        = hasFlag(INTERFACE)
-  def isJavaDefined      = hasFlag(JAVA)
-  def isLabel            = hasAllFlags(LABEL | METHOD) && !hasAccessorFlag
-  def isLazy             = hasFlag(LAZY)
-  def isLifted           = hasFlag(LIFTED)
-  def isMacro            = hasFlag(MACRO)
-  def isMutable          = hasFlag(MUTABLE)
-  def isOverride         = hasFlag(OVERRIDE)
-  def isParamAccessor    = hasFlag(PARAMACCESSOR)
-  def isPrivate          = hasFlag(PRIVATE)
+  def hasLocalFlag          = hasFlag(LOCAL)
+  def isLocalToThis         = hasFlag(LOCAL)
+  def hasModuleFlag         = hasFlag(MODULE)
+  def hasPackageFlag        = hasFlag(PACKAGE)
+  def hasStableFlag         = hasFlag(STABLE)
+  def hasStaticFlag         = hasFlag(STATIC)
+  def isAbstractOverride    = hasFlag(ABSOVERRIDE)
+  def isAnyOverride         = hasFlag(OVERRIDE | ABSOVERRIDE)
+  def isCase                = hasFlag(CASE)
+  def isCaseAccessor        = hasFlag(CASEACCESSOR)
+  def isDeferred            = hasFlag(DEFERRED)
+  def isFinal               = hasFlag(FINAL)
+  def isArtifact            = hasFlag(ARTIFACT)
+  def isImplicit            = hasFlag(IMPLICIT)
+  def isInterface           = hasFlag(INTERFACE)
+  def isJavaDefined         = hasFlag(JAVA)
+  def isLabel               = hasAllFlags(LABEL | METHOD) && !hasAccessorFlag
+  def isLazy                = hasFlag(LAZY)
+  def isLifted              = hasFlag(LIFTED)
+  def isMacro               = hasFlag(MACRO)
+  def isMutable             = hasFlag(MUTABLE)
+  def isOverride            = hasFlag(OVERRIDE)
+  def isParamAccessor       = hasFlag(PARAMACCESSOR)
+  def isPrivate             = hasFlag(PRIVATE)
   @deprecated ("Use `hasPackageFlag` instead", "2.11.0")
-  def isPackage          = hasFlag(PACKAGE)
-  def isPrivateLocal     = hasAllFlags(PrivateLocal)
-  def isProtected        = hasFlag(PROTECTED)
-  def isProtectedLocal   = hasAllFlags(ProtectedLocal)
-  def isPublic           = hasNoFlags(PRIVATE | PROTECTED) && !hasAccessBoundary
-  def isSealed           = hasFlag(SEALED)
-  def isSpecialized      = hasFlag(SPECIALIZED)
-  def isSuperAccessor    = hasFlag(SUPERACCESSOR)
-  def isSynthetic        = hasFlag(SYNTHETIC)
-  def isTrait            = hasFlag(TRAIT) && !hasFlag(PARAM)
-
-  def isDeferredOrDefault  = hasFlag(DEFERRED | DEFAULTMETHOD)
-  def isDeferredNotDefault = isDeferred && !hasFlag(DEFAULTMETHOD)
+  def isPackage             = hasFlag(PACKAGE)
+  def isPrivateLocal        = hasAllFlags(PrivateLocal)
+  def isProtected           = hasFlag(PROTECTED)
+  def isProtectedLocal      = hasAllFlags(ProtectedLocal)
+  def isPublic              = hasNoFlags(PRIVATE | PROTECTED) && !hasAccessBoundary
+  def isSealed              = hasFlag(SEALED)
+  def isSpecialized         = hasFlag(SPECIALIZED)
+  def isSuperAccessor       = hasFlag(SUPERACCESSOR)
+  def isSynthetic           = hasFlag(SYNTHETIC)
+  def isTrait               = hasFlag(TRAIT) && !hasFlag(PARAM)
+
+  def isDeferredOrJavaDefault  = hasFlag(DEFERRED | JAVA_DEFAULTMETHOD)
+  def isDeferredNotJavaDefault = isDeferred && !hasFlag(JAVA_DEFAULTMETHOD)
 
   def flagBitsToString(bits: Long): String = {
     // Fast path for common case
diff --git a/src/reflect/scala/reflect/internal/Importers.scala b/src/reflect/scala/reflect/internal/Importers.scala
index dc4ad25..494f62a 100644
--- a/src/reflect/scala/reflect/internal/Importers.scala
+++ b/src/reflect/scala/reflect/internal/Importers.scala
@@ -301,7 +301,7 @@ trait Importers { to: SymbolTable =>
           case (their: from.TypeTree, my: to.TypeTree) =>
             if (their.wasEmpty) my.defineType(importType(their.tpe)) else my.setType(importType(their.tpe))
           case (_, _) =>
-            my.tpe = importType(their.tpe)
+            my.setType(importType(their.tpe))
         }
       }
     }
diff --git a/src/reflect/scala/reflect/internal/Kinds.scala b/src/reflect/scala/reflect/internal/Kinds.scala
index 8ae201f..902ba9f 100644
--- a/src/reflect/scala/reflect/internal/Kinds.scala
+++ b/src/reflect/scala/reflect/internal/Kinds.scala
@@ -237,7 +237,7 @@ trait Kinds {
    *
    * Proper types are represented using ProperTypeKind.
    *
-   * Type constructors are reprented using TypeConKind.
+   * Type constructors are represented using TypeConKind.
    */
   abstract class Kind {
     import Kind.StringState
diff --git a/src/reflect/scala/reflect/internal/Positions.scala b/src/reflect/scala/reflect/internal/Positions.scala
index 4d0e31b..15d68bc 100644
--- a/src/reflect/scala/reflect/internal/Positions.scala
+++ b/src/reflect/scala/reflect/internal/Positions.scala
@@ -252,7 +252,14 @@ trait Positions extends api.Positions { self: SymbolTable =>
             super.traverse(t)
           } else t match {
             case mdef: MemberDef =>
-              traverseTrees(mdef.mods.annotations)
+              val annTrees = mdef.mods.annotations match {
+                case Nil if mdef.symbol != null =>
+                  // After typechecking, annotations are mvoed from the modifiers
+                  // to the annotation on the symbol of the anotatee.
+                  mdef.symbol.annotations.map(_.original)
+                case anns => anns
+              }
+              traverseTrees(annTrees)
             case _ =>
           }
       }
diff --git a/src/reflect/scala/reflect/internal/Printers.scala b/src/reflect/scala/reflect/internal/Printers.scala
index 98b2c48..b44c402 100644
--- a/src/reflect/scala/reflect/internal/Printers.scala
+++ b/src/reflect/scala/reflect/internal/Printers.scala
@@ -1006,7 +1006,7 @@ trait Printers extends api.Printers { self: SymbolTable =>
           printSuper(st, printedName(qual), checkSymbol = false)
 
         case th @ This(qual) =>
-          if (tree.hasExistingSymbol && tree.symbol.isPackage) print(tree.symbol.fullName)
+          if (tree.hasExistingSymbol && tree.symbol.hasPackageFlag) print(tree.symbol.fullName)
           else printThis(th, printedName(qual))
 
         // remove this prefix from constructor invocation in typechecked trees: this.this -> this
@@ -1023,7 +1023,7 @@ trait Printers extends api.Printers { self: SymbolTable =>
             }) && (tr match { // check that Select contains package
               case Select(q, _) => checkRootPackage(q)
               case _: Ident | _: This => val sym = tr.symbol
-                tr.hasExistingSymbol && sym.isPackage && sym.name != nme.ROOTPKG
+                tr.hasExistingSymbol && sym.hasPackageFlag && sym.name != nme.ROOTPKG
               case _ => false
             })
 
diff --git a/src/reflect/scala/reflect/internal/ReificationSupport.scala b/src/reflect/scala/reflect/internal/ReificationSupport.scala
index c418321..d393a84 100644
--- a/src/reflect/scala/reflect/internal/ReificationSupport.scala
+++ b/src/reflect/scala/reflect/internal/ReificationSupport.scala
@@ -292,7 +292,7 @@ trait ReificationSupport { self: SymbolTable =>
           if (ctorMods.isTrait)
             result(ctorMods, Nil, edefs, body)
           else {
-            // undo conversion from (implicit ... ) to ()(implicit ... ) when its the only parameter section
+            // undo conversion from (implicit ... ) to ()(implicit ... ) when it's the only parameter section
             val vparamssRestoredImplicits = ctorVparamss match {
               case Nil :: (tail @ ((head :: _) :: _)) if head.mods.isImplicit => tail
               case other => other
@@ -802,7 +802,7 @@ trait ReificationSupport { self: SymbolTable =>
       require(enums.nonEmpty, "enumerators can't be empty")
       enums.head match {
         case SyntacticValFrom(_, _) =>
-        case t => throw new IllegalArgumentException(s"$t is not a valid fist enumerator of for loop")
+        case t => throw new IllegalArgumentException(s"$t is not a valid first enumerator of for loop")
       }
       enums.tail.foreach {
         case SyntacticValEq(_, _) | SyntacticValFrom(_, _) | SyntacticFilter(_) =>
diff --git a/src/reflect/scala/reflect/internal/StdNames.scala b/src/reflect/scala/reflect/internal/StdNames.scala
index c0562b0..52558d9 100644
--- a/src/reflect/scala/reflect/internal/StdNames.scala
+++ b/src/reflect/scala/reflect/internal/StdNames.scala
@@ -870,7 +870,7 @@ trait StdNames {
     val toFloat: NameType  = "toFloat"
     val toDouble: NameType = "toDouble"
 
-    // primitive operation methods for structual types mostly
+    // primitive operation methods for structural types mostly
     // overlap with the above, but not for these two.
     val toCharacter: NameType = "toCharacter"
     val toInteger: NameType   = "toInteger"
@@ -1167,6 +1167,8 @@ trait StdNames {
     final val Invoke: TermName           = newTermName("invoke")
     final val InvokeExact: TermName      = newTermName("invokeExact")
 
+    final val AltMetafactory: TermName      = newTermName("altMetafactory")
+
     val Boxed = immutable.Map[TypeName, TypeName](
       tpnme.Boolean -> BoxedBoolean,
       tpnme.Byte    -> BoxedByte,
diff --git a/src/reflect/scala/reflect/internal/SymbolPairs.scala b/src/reflect/scala/reflect/internal/SymbolPairs.scala
index 4763e77..a52d2d8 100644
--- a/src/reflect/scala/reflect/internal/SymbolPairs.scala
+++ b/src/reflect/scala/reflect/internal/SymbolPairs.scala
@@ -217,7 +217,7 @@ abstract class SymbolPairs {
       bs(nshifted) |= nmask
     }
 
-    /** Implements `bs1 * bs2 * {0..n} != 0.
+    /** Implements `bs1 * bs2 * {0..n} != 0`.
      *  Used in hasCommonParentAsSubclass */
     private def intersectionContainsElementLeq(bs1: BitSet, bs2: BitSet, n: Int): Boolean = {
       val nshifted = n >> 5
diff --git a/src/reflect/scala/reflect/internal/SymbolTable.scala b/src/reflect/scala/reflect/internal/SymbolTable.scala
index 01e4cdf..ef63078 100644
--- a/src/reflect/scala/reflect/internal/SymbolTable.scala
+++ b/src/reflect/scala/reflect/internal/SymbolTable.scala
@@ -355,6 +355,14 @@ abstract class SymbolTable extends macros.Universe
       cache
     }
 
+    /**
+     * Removes a cache from the per-run caches. This is useful for testing: it allows running the
+     * compiler and then inspect the state of a cache.
+     */
+    def unrecordCache[T <: Clearable](cache: T): Unit = {
+      caches = caches.filterNot(_.get eq cache)
+    }
+
     def clearAll() = {
       debuglog("Clearing " + caches.size + " caches.")
       caches foreach (ref => Option(ref.get).foreach(_.clear))
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index d23a102..3b9ee90 100644
--- a/src/reflect/scala/reflect/internal/Symbols.scala
+++ b/src/reflect/scala/reflect/internal/Symbols.scala
@@ -56,7 +56,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
     new FreeTypeSymbol(name, origin) initFlags flags
 
   /**
-   * This map stores the original owner the the first time the owner of a symbol is re-assigned.
+   * This map stores the original owner the first time the owner of a symbol is re-assigned.
    * The original owner of a symbol is needed in some places in the backend. Ideally, owners should
    * be versioned like the type history.
    */
@@ -155,11 +155,11 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
     def toTypeConstructor: Type = typeConstructor
     def setAnnotations(annots: AnnotationInfo*): this.type = { setAnnotations(annots.toList); this }
 
-    def getter: Symbol = getter(owner)
-    def setter: Symbol = setter(owner)
+    def getter: Symbol = getterIn(owner)
+    def setter: Symbol = setterIn(owner)
 
     def companion: Symbol = {
-      if (isModule && !isPackage) companionSymbol
+      if (isModule && !hasPackageFlag) companionSymbol
       else if (isModuleClass && !isPackageClass) sourceModule.companionSymbol
       else if (isClass && !isModuleClass && !isPackageClass) companionSymbol
       else NoSymbol
@@ -495,11 +495,24 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
      *  failure to the point when that name is used for something, which is
      *  often to the point of never.
      */
-    def newStubSymbol(name: Name, missingMessage: String): Symbol = name match {
-      case n: TypeName  => new StubClassSymbol(this, n, missingMessage)
+    def newStubSymbol(name: Name, missingMessage: String, isPackage: Boolean = false): Symbol = name match {
+      case n: TypeName  => if (isPackage) new StubPackageClassSymbol(this, n, missingMessage) else new StubClassSymbol(this, n, missingMessage)
       case _            => new StubTermSymbol(this, name.toTermName, missingMessage)
     }
 
+    /** Given a field, construct a term symbol that represents the source construct that gave rise the field */
+    def sugaredSymbolOrSelf = {
+      val getter = getterIn(owner)
+      if (getter == NoSymbol) {
+        this
+      } else {
+        val result = owner.newValue(getter.name.toTermName, newFlags = getter.flags & ~Flags.METHOD).setPrivateWithin(getter.privateWithin).setInfo(getter.info.resultType)
+        val setter = setterIn(owner)
+        if (setter != NoSymbol) result.setFlag(Flags.MUTABLE)
+        result
+      }
+    }
+
 // ----- locking and unlocking ------------------------------------------------------
 
     // True if the symbol is unlocked.
@@ -732,7 +745,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
     final def flags: Long = {
       if (Statistics.hotEnabled) Statistics.incCounter(flagsCount)
       val fs = _rawflags & phase.flagMask
-      (fs | ((fs & LateFlags) >>> LateShift)) & ~(fs >>> AntiShift)
+      (fs | ((fs & LateFlags) >>> LateShift)) & ~((fs & AntiFlags) >>> AntiShift)
     }
     def flags_=(fs: Long) = _rawflags = fs
     def rawflags_=(x: Long) { _rawflags = x }
@@ -794,6 +807,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
 
     final def isAnonymousFunction = isSynthetic && (name containsName tpnme.ANON_FUN_NAME)
     final def isDelambdafyFunction = isSynthetic && (name containsName tpnme.DELAMBDAFY_LAMBDA_CLASS_NAME)
+    final def isDelambdafyTarget  = isArtifact && isMethod && (name containsName tpnme.ANON_FUN_NAME)
     final def isDefinedInPackage  = effectiveOwner.isPackageClass
     final def needsFlatClasses    = phase.flatClasses && rawowner != NoSymbol && !rawowner.isPackageClass
 
@@ -986,7 +1000,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
           || isLocalToBlock
          )
     )
-    /** Is this symbol effectively final or a concrete term member of sealed class whose childred do not override it */
+    /** Is this symbol effectively final or a concrete term member of sealed class whose children do not override it */
     final def isEffectivelyFinalOrNotOverridden: Boolean = isEffectivelyFinal || (isTerm && !isDeferred && isNotOverridden)
 
     /** Is this symbol owned by a package? */
@@ -1047,7 +1061,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
     final def isIncompleteIn(base: Symbol): Boolean =
       this.isDeferred ||
       (this hasFlag ABSOVERRIDE) && {
-        val supersym = superSymbol(base)
+        val supersym = superSymbolIn(base)
         supersym == NoSymbol || supersym.isIncompleteIn(base)
       }
 
@@ -1152,7 +1166,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
      *    phase check (if after flatten) in the (overridden) method "def owner" in
      *    ModuleSymbol / ClassSymbol. The `rawowner` field is not modified.
      *  - Owners are also changed in other situations, for example when moving trees into a new
-     *    lexical context, e.g. in the named/default arguments tranformation, or when translating
+     *    lexical context, e.g. in the named/default arguments transformation, or when translating
      *    extension method definitions.
      *
      * In general when seeking the owner of a symbol, one should call `owner`.
@@ -1242,8 +1256,9 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
     /** These should be moved somewhere like JavaPlatform.
      */
     def javaSimpleName: Name = addModuleSuffix(simpleName.dropLocal)
-    def javaBinaryName: Name = addModuleSuffix(fullNameInternal('/'))
-    def javaClassName: String  = addModuleSuffix(fullNameInternal('.')).toString
+    def javaBinaryName: Name = name.newName(javaBinaryNameString)
+    def javaBinaryNameString: String = fullName('/', moduleSuffix)
+    def javaClassName: String  = fullName('.', moduleSuffix)
 
     /** The encoded full path name of this symbol, where outer names and inner names
      *  are separated by `separator` characters.
@@ -1251,18 +1266,29 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
      *  Never adds id.
      *  Drops package objects.
      */
-    final def fullName(separator: Char): String = fullNameAsName(separator).toString
-
-    /** Doesn't drop package objects, for those situations (e.g. classloading)
-     *  where the true path is needed.
-     */
-    private def fullNameInternal(separator: Char): Name = (
-      if (isRoot || isRootPackage || this == NoSymbol) name
-      else if (owner.isEffectiveRoot) name
-      else effectiveOwner.enclClass.fullNameAsName(separator) append (separator, name)
-    )
+    final def fullName(separator: Char): String = fullName(separator, "")
+
+    private def fullName(separator: Char, suffix: CharSequence): String = {
+      var b: java.lang.StringBuffer = null
+      def loop(size: Int, sym: Symbol): Unit = {
+        val symName = sym.name
+        val nSize = symName.length - (if (symName.endsWith(nme.LOCAL_SUFFIX_STRING)) 1 else 0)
+        if (sym.isRoot || sym.isRootPackage || sym == NoSymbol || sym.owner.isEffectiveRoot) {
+          val capacity = size + nSize
+          b = new java.lang.StringBuffer(capacity)
+          b.append(chrs, symName.start, nSize)
+        } else {
+          loop(size + nSize + 1, sym.effectiveOwner.enclClass)
+          b.append(separator)
+          b.append(chrs, symName.start, nSize)
+        }
+      }
+      loop(suffix.length(), this)
+      b.append(suffix)
+      b.toString
+    }
 
-    def fullNameAsName(separator: Char): Name = fullNameInternal(separator).dropLocal
+    def fullNameAsName(separator: Char): Name = name.newName(fullName(separator, ""))
 
     /** The encoded full path name of this symbol, where outer names and inner names
      *  are separated by periods.
@@ -2060,7 +2086,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
      */
     final def outerClass: Symbol =
       if (this == NoSymbol) {
-        // ideally we shouldn't get here, but its better to harden against this than suffer the infinite loop in SI-9133
+        // ideally we shouldn't get here, but it's better to harden against this than suffer the infinite loop in SI-9133
         devWarningDumpStack("NoSymbol.outerClass", 15)
         NoSymbol
       } else if (owner.isClass) owner
@@ -2112,7 +2138,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
     /** The package class containing this symbol, or NoSymbol if there
      *  is not one.
      *  TODO: formulate as enclosingSuchThat, after making sure
-     *        we can start with current symbol rather than onwner.
+     *        we can start with current symbol rather than owner.
      *  TODO: Also harmonize with enclClass, enclMethod etc.
      */
     def enclosingPackageClass: Symbol = {
@@ -2375,13 +2401,13 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
         Nil
     )
 
+    @deprecated("Use `superSymbolIn` instead", "2.11.0")
+    final def superSymbol(base: Symbol): Symbol = superSymbolIn(base)
+
     /** The symbol accessed by a super in the definition of this symbol when
      *  seen from class `base`. This symbol is always concrete.
      *  pre: `this.owner` is in the base class sequence of `base`.
      */
-    @deprecated("Use `superSymbolIn` instead", "2.11.0")
-    final def superSymbol(base: Symbol): Symbol = superSymbolIn(base)
-
     final def superSymbolIn(base: Symbol): Symbol = {
       var bcs = base.info.baseClasses dropWhile (owner != _) drop 1
       var sym: Symbol = NoSymbol
@@ -2393,12 +2419,10 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
       sym
     }
 
-    /** The getter of this value or setter definition in class `base`, or NoSymbol if
-     *  none exists.
-     */
     @deprecated("Use `getterIn` instead", "2.11.0")
     final def getter(base: Symbol): Symbol = getterIn(base)
 
+    /** The getter of this value or setter definition in class `base`, or NoSymbol if none exists. */
     final def getterIn(base: Symbol): Symbol =
       base.info decl getterName filter (_.hasAccessorFlag)
 
@@ -2406,11 +2430,11 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
     def setterName: TermName = name.setterName
     def localName: TermName  = name.localName
 
-    /** The setter of this value or getter definition, or NoSymbol if none exists */
     @deprecated("Use `setterIn` instead", "2.11.0")
     final def setter(base: Symbol, hasExpandedName: Boolean = needsExpandedSetterName): Symbol =
       setterIn(base, hasExpandedName)
 
+    /** The setter of this value or getter definition, or NoSymbol if none exists. */
     final def setterIn(base: Symbol, hasExpandedName: Boolean = needsExpandedSetterName): Symbol =
       base.info decl setterNameInBase(base, hasExpandedName) filter (_.hasAccessorFlag)
 
@@ -2538,7 +2562,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
         else if (isInstanceOf[FreeTermSymbol]) ("free term", "free term", "FTE")
         else if (isInstanceOf[FreeTypeSymbol]) ("free type", "free type", "FTY")
         else if (isPackageClass) ("package class", "package", "PKC")
-        else if (isPackage) ("package", "package", "PK")
+        else if (hasPackageFlag) ("package", "package", "PK")
         else if (isPackageObject) ("package object", "package", "PKO")
         else if (isPackageObjectClass) ("package object class", "package", "PKOC")
         else if (isAnonymousClass) ("anonymous class", "anonymous class", "AC")
@@ -2822,7 +2846,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
     override def outerSource: Symbol =
       // SI-6888 Approximate the name to workaround the deficiencies in `nme.originalName`
       //         in the face of classes named '$'. SI-2806 remains open to address the deeper problem.
-      if (originalName endsWith (nme.OUTER)) initialize.referenced
+      if (unexpandedName endsWith (nme.OUTER)) initialize.referenced
       else NoSymbol
 
     def setModuleClass(clazz: Symbol): TermSymbol = {
@@ -2852,8 +2876,8 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
           accessed.expandName(base)
         }
         else if (hasGetter) {
-          getter(owner).expandName(base)
-          setter(owner).expandName(base)
+          getterIn(owner).expandName(base)
+          setterIn(owner).expandName(base)
         }
         name = nme.expandedName(name.toTermName, base)
       }
@@ -3470,6 +3494,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
     override def companionSymbol = fail(NoSymbol)
   }
   class StubClassSymbol(owner0: Symbol, name0: TypeName, val missingMessage: String) extends ClassSymbol(owner0, owner0.pos, name0) with StubSymbol
+  class StubPackageClassSymbol(owner0: Symbol, name0: TypeName, val missingMessage: String) extends PackageClassSymbol(owner0, owner0.pos, name0) with StubSymbol
   class StubTermSymbol(owner0: Symbol, name0: TermName, val missingMessage: String) extends TermSymbol(owner0, owner0.pos, name0) with StubSymbol
 
   trait FreeSymbol extends Symbol {
diff --git a/src/reflect/scala/reflect/internal/TreeGen.scala b/src/reflect/scala/reflect/internal/TreeGen.scala
index b3e11a8..201b727 100644
--- a/src/reflect/scala/reflect/internal/TreeGen.scala
+++ b/src/reflect/scala/reflect/internal/TreeGen.scala
@@ -362,10 +362,10 @@ abstract class TreeGen {
         if (body forall treeInfo.isInterfaceMember) None
         else Some(
           atPos(wrappingPos(superPos, lvdefs)) (
-            DefDef(NoMods, nme.MIXIN_CONSTRUCTOR, Nil, ListOfNil, TypeTree(), Block(lvdefs, Literal(Constant())))))
+            DefDef(NoMods, nme.MIXIN_CONSTRUCTOR, Nil, ListOfNil, TypeTree(), Block(lvdefs, Literal(Constant(()))))))
       }
       else {
-        // convert (implicit ... ) to ()(implicit ... ) if its the only parameter section
+        // convert (implicit ... ) to ()(implicit ... ) if it's the only parameter section
         if (vparamss1.isEmpty || !vparamss1.head.isEmpty && vparamss1.head.head.mods.isImplicit)
           vparamss1 = List() :: vparamss1
         val superCall = pendingSuperCall // we can't know in advance which of the parents will end up as a superclass
@@ -376,7 +376,7 @@ abstract class TreeGen {
                                          // therefore here we emit a dummy which gets populated when the template is named and typechecked
         Some(
           atPos(wrappingPos(superPos, lvdefs ::: vparamss1.flatten).makeTransparent) (
-            DefDef(constrMods, nme.CONSTRUCTOR, List(), vparamss1, TypeTree(), Block(lvdefs ::: List(superCall), Literal(Constant())))))
+            DefDef(constrMods, nme.CONSTRUCTOR, List(), vparamss1, TypeTree(), Block(lvdefs ::: List(superCall), Literal(Constant(()))))))
       }
     }
     constr foreach (ensureNonOverlapping(_, parents ::: gvdefs, focus = false))
@@ -594,13 +594,12 @@ abstract class TreeGen {
   *        TupleN(x_1, ..., x_N)
   *      } ...)
   *
-  *    If any of the P_i are variable patterns, the corresponding `x_i @ P_i' is not generated
+  *    If any of the P_i are variable patterns, the corresponding `x_i @ P_i` is not generated
   *    and the variable constituting P_i is used instead of x_i
   *
-  *  @param mapName      The name to be used for maps (either map or foreach)
-  *  @param flatMapName  The name to be used for flatMaps (either flatMap or foreach)
   *  @param enums        The enumerators in the for expression
-  *  @param body          The body of the for expression
+  *  @param sugarBody    The body of the for expression
+  *  @param fresh        A source of new names
   */
   def mkFor(enums: List[Tree], sugarBody: Tree)(implicit fresh: FreshNameCreator): Tree = {
     val (mapName, flatMapName, body) = sugarBody match {
diff --git a/src/reflect/scala/reflect/internal/Trees.scala b/src/reflect/scala/reflect/internal/Trees.scala
index fd918b8..bbd9df0 100644
--- a/src/reflect/scala/reflect/internal/Trees.scala
+++ b/src/reflect/scala/reflect/internal/Trees.scala
@@ -87,7 +87,7 @@ trait Trees extends api.Trees {
 
     private[scala] def copyAttrs(tree: Tree): this.type = {
       rawatt = tree.rawatt
-      tpe = tree.tpe
+      setType(tree.tpe)
       if (hasSymbolField) symbol = tree.symbol
       this
     }
@@ -1418,7 +1418,7 @@ trait Trees extends api.Trees {
                            transformTypeDefs(tparams), transform(rhs))
         }
       case LabelDef(name, params, rhs) =>
-        treeCopy.LabelDef(tree, name, transformIdents(params), transform(rhs)) //bq: Martin, once, atOwner(...) works, also change `LamdaLifter.proxy'
+        treeCopy.LabelDef(tree, name, transformIdents(params), transform(rhs)) //bq: Martin, once, atOwner(...) works, also change `LambdaLifter.proxy'
       case PackageDef(pid, stats) =>
         treeCopy.PackageDef(
           tree, transform(pid).asInstanceOf[RefTree],
@@ -1601,7 +1601,7 @@ trait Trees extends api.Trees {
           case _          =>
             // no special handling is required for Function or Import nodes here.
             // as they don't have interesting infos attached to their symbols.
-            // Subsitution of the referenced symbol of Return nodes is handled
+            // Substitution of the referenced symbol of Return nodes is handled
             // in .ChangeOwnerTraverser
         }
         tree match {
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala
index 8f114ca..9697e16 100644
--- a/src/reflect/scala/reflect/internal/Types.scala
+++ b/src/reflect/scala/reflect/internal/Types.scala
@@ -209,7 +209,7 @@ trait Types
 
   case object UnmappableTree extends TermTree {
     override def toString = "<unmappable>"
-    super.tpe_=(NoType)
+    super.setType(NoType)
     override def tpe_=(t: Type) = if (t != NoType) {
       throw new UnsupportedOperationException("tpe_=("+t+") inapplicable for <empty>")
     }
@@ -247,7 +247,7 @@ trait Types
 
     def companion = {
       val sym = typeSymbolDirect
-      if (sym.isModule && !sym.isPackage) sym.companionSymbol.tpe
+      if (sym.isModule && !sym.hasPackageFlag) sym.companionSymbol.tpe
       else if (sym.isModuleClass && !sym.isPackageClass) sym.sourceModule.companionSymbol.tpe
       else if (sym.isClass && !sym.isModuleClass && !sym.isPackageClass) sym.companionSymbol.info
       else NoType
@@ -732,7 +732,7 @@ trait Types
      *
      * `SubstThisAndSymMap` performs a breadth-first map over this type, which meant that
      * symbol substitution occurred before `ThisType` substitution. Consequently, in substitution
-     * of a `SingleType(ThisType(`from`), sym), symbols were rebound to `from` rather than `to`.
+     * of a `SingleType(ThisType(from), sym)`, symbols were rebound to `from` rather than `to`.
      */
     def substThisAndSym(from: Symbol, to: Type, symsFrom: List[Symbol], symsTo: List[Symbol]): Type =
       if (symsFrom eq symsTo) substThis(from, to)
@@ -756,7 +756,7 @@ trait Types
     /** Apply `f` to each part of this type */
     def foreach(f: Type => Unit) { new ForEachTypeTraverser(f).traverse(this) }
 
-    /** Apply `pf' to each part of this type on which the function is defined */
+    /** Apply `pf` to each part of this type on which the function is defined */
     def collect[T](pf: PartialFunction[Type, T]): List[T] = new CollectTypeCollector(pf).collect(this)
 
     /** Apply `f` to each part of this type; children get mapped before their parents */
@@ -918,7 +918,7 @@ trait Types
     def prefixString = trimPrefix(toString) + "#"
 
    /** Convert toString avoiding infinite recursions by cutting off
-     *  after `maxTostringRecursions` recursion levels. Uses `safeToString`
+     *  after `maxToStringRecursions` recursion levels. Uses `safeToString`
      *  to produce a string on each level.
      */
     override final def toString: String = {
@@ -1489,7 +1489,7 @@ trait Types
           } finally {
             if (Statistics.canEnable) Statistics.popTimer(typeOpsStack, start)
           }
-          // [Martin] suppressing memo-ization solves the problem with "same type after erasure" errors
+          // [Martin] suppressing memoization solves the problem with "same type after erasure" errors
           // when compiling with
           // scalac scala.collection.IterableViewLike.scala scala.collection.IterableLike.scala
           // I have not yet figured out precisely why this is the case.
@@ -2045,7 +2045,7 @@ trait Types
     /** SI-3731, SI-8177: when prefix is changed to `newPre`, maintain consistency of prefix and sym
      *  (where the symbol refers to a declaration "embedded" in the prefix).
      *
-     *  @returns newSym so that `newPre` binds `sym.name` to `newSym`,
+     *  @return newSym so that `newPre` binds `sym.name` to `newSym`,
      *                  to remain consistent with `pre` previously binding `sym.name` to `sym`.
      *
      *  `newSym` and `sym` are conceptually the same symbols, but some change to our `prefix`
@@ -2510,6 +2510,9 @@ trait Types
     override def baseType(clazz: Symbol): Type = resultType.baseType(clazz)
     override def narrow: Type = resultType.narrow
 
+    // SI-9475: PolyTypes with dependent method types are still dependent
+    override def isDependentMethodType = resultType.isDependentMethodType
+
     /** @M: typeDefSig wraps a TypeBounds in a PolyType
      *  to represent a higher-kinded type parameter
      *  wrap lo&hi in polytypes to bind variables
@@ -2588,7 +2591,7 @@ trait Types
      * based on the bounds of the type parameters of the quantified type
      * In Scala syntax, given a java-defined class C[T <: String], the existential type C[_]
      * is improved to C[_ <: String] before skolemization, which captures (get it?) what Java does:
-     * enter the type paramers' bounds into the context when checking subtyping/type equality of existential types
+     * enter the type parameters' bounds into the context when checking subtyping/type equality of existential types
      *
      * Also tried doing this once during class file parsing or when creating the existential type,
      * but that causes cyclic errors because it happens too early.
@@ -3658,7 +3661,7 @@ trait Types
       // JZ: We used to register this as a perRunCache so it would be cleared eagerly at
       // the end of the compilation run. But, that facility didn't actually clear this map (SI-8129)!
       // When i fixed that bug, run/tpeCache-tyconCache.scala started failing. Why was that?
-      // I've removed the registration for now. I don't think its particularly harmful anymore
+      // I've removed the registration for now. I don't think it's particularly harmful anymore
       // as a) this is now a weak set, and b) it is discarded completely before the next run.
       uniqueRunId = currentRunId
     }
@@ -4263,7 +4266,7 @@ trait Types
       matchesType(res1, res2.substSym(tparams2, tparams1), alwaysMatchSimple)
     (tp1, tp2) match {
       case (MethodType(params1, res1), MethodType(params2, res2)) =>
-        params1.length == params2.length && // useful pre-secreening optimization
+        params1.length == params2.length && // useful pre-screening optimization
         matchingParams(params1, params2, tp1.isInstanceOf[JavaMethodType], tp2.isInstanceOf[JavaMethodType]) &&
         matchesType(res1, res2, alwaysMatchSimple) &&
         tp1.isImplicit == tp2.isImplicit
@@ -4535,7 +4538,7 @@ trait Types
 
   /** Adds the @uncheckedBound annotation if the given `tp` has type arguments */
   final def uncheckedBounds(tp: Type): Type = {
-    if (tp.typeArgs.isEmpty || UncheckedBoundsClass == NoSymbol) tp // second condition for backwards compatibilty with older scala-reflect.jar
+    if (tp.typeArgs.isEmpty || UncheckedBoundsClass == NoSymbol) tp // second condition for backwards compatibility with older scala-reflect.jar
     else tp.withAnnotation(AnnotationInfo marker UncheckedBoundsClass.tpe)
   }
 
diff --git a/src/reflect/scala/reflect/internal/Variances.scala b/src/reflect/scala/reflect/internal/Variances.scala
index ef22df3..af04f47 100644
--- a/src/reflect/scala/reflect/internal/Variances.scala
+++ b/src/reflect/scala/reflect/internal/Variances.scala
@@ -122,15 +122,21 @@ trait Variances {
        *  same is true of the parameters (ValDefs) unless we are inside a
        *  refinement, in which case they are checked from here.
        */
-      def apply(tp: Type): Type = tp match {
-        case _ if isUncheckedVariance(tp)                    => tp
-        case _ if resultTypeOnly(tp)                         => this(tp.resultType)
-        case TypeRef(_, sym, _) if sym.isAliasType           => this(tp.normalize)
-        case TypeRef(_, sym, _) if !sym.variance.isInvariant => checkVarianceOfSymbol(sym) ; mapOver(tp)
-        case RefinedType(_, _)                               => withinRefinement(mapOver(tp))
-        case ClassInfoType(parents, _, _)                    => parents foreach this ; tp
-        case mt @ MethodType(_, result)                      => flipped(mt.paramTypes foreach this) ; this(result)
-        case _                                               => mapOver(tp)
+      def apply(tp: Type): Type = {
+        tp match {
+          case _ if isUncheckedVariance(tp)                    =>
+          case _ if resultTypeOnly(tp)                         => this(tp.resultType)
+          case TypeRef(_, sym, _) if sym.isAliasType           => this(tp.normalize)
+          case TypeRef(_, sym, _) if !sym.variance.isInvariant => checkVarianceOfSymbol(sym) ; mapOver(tp)
+          case RefinedType(_, _)                               => withinRefinement(mapOver(tp))
+          case ClassInfoType(parents, _, _)                    => parents foreach this
+          case mt @ MethodType(_, result)                      => flipped(mt.paramTypes foreach this) ; this(result)
+          case _                                               => mapOver(tp)
+        }
+        // We're using TypeMap here for type traversal only. To avoid wasteful symbol
+        // cloning during the recursion, it is important to return the input `tp`, rather
+        // than the result of the pattern match above, which normalizes types.
+        tp
       }
       def validateDefinition(base: Symbol) {
         val saved = this.base
diff --git a/src/reflect/scala/reflect/internal/pickling/UnPickler.scala b/src/reflect/scala/reflect/internal/pickling/UnPickler.scala
index 1fc7aeb..a9020a3 100644
--- a/src/reflect/scala/reflect/internal/pickling/UnPickler.scala
+++ b/src/reflect/scala/reflect/internal/pickling/UnPickler.scala
@@ -168,7 +168,7 @@ abstract class UnPickler {
     }
 
     /** If entry at `i` is undefined, define it by performing
-     *  operation `op` with `readIndex at start of i'th
+     *  operation `op` with `readIndex` at start of i'th
      *  entry. Restore `readIndex` afterwards.
      */
     protected def at[T <: AnyRef](i: Int, op: () => T): T = {
@@ -244,7 +244,7 @@ abstract class UnPickler {
 
           (module map { case (group, art) =>
             s"""\n(NOTE: It looks like the $art module is missing; try adding a dependency on "$group" : "$art".
-               |       See http://docs.scala-lang.org/overviews/core/scala-2.11.html for more information.)""".stripMargin
+               |       See http://docs.scala-lang.org/overviews/ for more information.)""".stripMargin
            } getOrElse "")
         }
 
@@ -398,7 +398,7 @@ abstract class UnPickler {
         val sym = readSymbolRef() match {
           case stub: StubSymbol if !stub.isClass =>
             // SI-8502 This allows us to create a stub for a unpickled reference to `missingPackage.Foo`.
-            stub.owner.newStubSymbol(stub.name.toTypeName, stub.missingMessage)
+            stub.owner.newStubSymbol(stub.name.toTypeName, stub.missingMessage, isPackage = true)
           case sym => sym
         }
         ThisType(sym)
diff --git a/src/reflect/scala/reflect/internal/tpe/FindMembers.scala b/src/reflect/scala/reflect/internal/tpe/FindMembers.scala
index 42b1394..83a5d23 100644
--- a/src/reflect/scala/reflect/internal/tpe/FindMembers.scala
+++ b/src/reflect/scala/reflect/internal/tpe/FindMembers.scala
@@ -155,7 +155,7 @@ trait FindMembers {
         && (    (member.owner eq other.owner)                         // same owner, therefore overload
              || (member.flags & PRIVATE) != 0                         // (unqualified) private members never participate in overriding
              || (other.flags & PRIVATE) != 0                          // ... as overrider or overridee.
-             || !(memberTypeLow(member) matches memberTypeHi(other))  // do the member types match? If so, its an override. Otherwise it's an overload.
+             || !(memberTypeLow(member) matches memberTypeHi(other))  // do the member types match? If so, it's an override. Otherwise it's an overload.
            )
       )
 
diff --git a/src/reflect/scala/reflect/internal/tpe/TypeConstraints.scala b/src/reflect/scala/reflect/internal/tpe/TypeConstraints.scala
index f790992..e321a07 100644
--- a/src/reflect/scala/reflect/internal/tpe/TypeConstraints.scala
+++ b/src/reflect/scala/reflect/internal/tpe/TypeConstraints.scala
@@ -99,7 +99,7 @@ private[internal] trait TypeConstraints {
       // a lower bound despite the fact that Nothing is always a lower bound.  My current
       // supposition is that the side-effecting type constraint accumulation mechanism
       // depends on these subtype tests being performed to make forward progress when
-      // there are mutally recursive type vars.
+      // there are mutually recursive type vars.
       // See pos/t6367 and pos/t6499 for the competing test cases.
       val mustConsider = tp.typeSymbol match {
         case NothingClass => true
diff --git a/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala b/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala
index c705ca7..804360b 100644
--- a/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala
+++ b/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala
@@ -343,7 +343,7 @@ private[internal] trait TypeMaps {
     object rawToExistentialInJava extends TypeMap {
       def apply(tp: Type): Type = tp match {
         // any symbol that occurs in a java sig, not just java symbols
-        // see http://lampsvn.epfl.ch/trac/scala/ticket/2454#comment:14
+        // see https://issues.scala-lang.org/browse/SI-2454?focusedCommentId=46618
         case TypeRef(pre, sym, List()) if !sym.typeParams.isEmpty =>
           val eparams = typeParamsToExistentials(sym, sym.typeParams)
           existentialAbstraction(eparams, TypeRef(pre, sym, eparams map (_.tpe)))
@@ -561,7 +561,7 @@ private[internal] trait TypeMaps {
                |  tparams  ${rhsSym.typeParams map own_s mkString ", "}
                |"""
 
-        if (argIndex < 0)
+        if (!rhsArgs.isDefinedAt(argIndex))
           abort(s"Something is wrong: cannot find $lhs in applied type $rhs\n" + explain)
         else {
           val targ   = rhsArgs(argIndex)
@@ -736,7 +736,7 @@ private[internal] trait TypeMaps {
           substFor(sym)
         case ClassInfoType(parents, decls, sym) =>
           val parents1 = parents mapConserve this
-          // We don't touch decls here; they will be touched when an enclosing TreeSubstitutor
+          // We don't touch decls here; they will be touched when an enclosing TreeSubstituter
           // transforms the tree that defines them.
           if (parents1 eq parents) tp
           else ClassInfoType(parents1, decls, sym)
@@ -998,10 +998,20 @@ private[internal] trait TypeMaps {
   class ContainsCollector(sym: Symbol) extends TypeCollector(false) {
     def traverse(tp: Type) {
       if (!result) {
-        tp.normalize match {
-          case TypeRef(_, sym1, _) if (sym == sym1) => result = true
-          case SingleType(_, sym1) if (sym == sym1) => result = true
-          case _ => mapOver(tp)
+        tp match {
+          case _: ExistentialType =>
+            // ExistentialType#normalize internally calls contains, which leads to exponential performance
+            // for types like: `A[_ <: B[_ <: ... ]]`. Example: pos/existential-contains.scala.
+            //
+            // We can just map over the components and wait until we see the underlying type before we call
+            // normalize.
+            mapOver(tp)
+          case _ =>
+            tp.normalize match {
+              case TypeRef(_, sym1, _) if (sym == sym1) => result = true
+              case SingleType(_, sym1) if (sym == sym1) => result = true
+              case _ => mapOver(tp)
+            }
         }
       }
     }
diff --git a/src/reflect/scala/reflect/internal/transform/Erasure.scala b/src/reflect/scala/reflect/internal/transform/Erasure.scala
index d5b5967..01e28e5 100644
--- a/src/reflect/scala/reflect/internal/transform/Erasure.scala
+++ b/src/reflect/scala/reflect/internal/transform/Erasure.scala
@@ -90,7 +90,7 @@ trait Erasure {
     }
   }
 
-  /** Does this vakue class have an underlying type that's a type parameter of
+  /** Does this value class have an underlying type that's a type parameter of
    *  the class itself?
    *  This method needs to be called at a phase no later than erasurephase
    */
@@ -254,6 +254,8 @@ trait Erasure {
     def mergeParents(parents: List[Type]): Type =
       if (parents.isEmpty) ObjectTpe
       else parents.head
+
+    override protected def eraseDerivedValueClassRef(tref: TypeRef): Type = eraseNormalClassRef(tref)
   }
 
   object scalaErasure extends ScalaErasureMap
diff --git a/src/reflect/scala/reflect/internal/transform/UnCurry.scala b/src/reflect/scala/reflect/internal/transform/UnCurry.scala
index abea8be..85e3ac6 100644
--- a/src/reflect/scala/reflect/internal/transform/UnCurry.scala
+++ b/src/reflect/scala/reflect/internal/transform/UnCurry.scala
@@ -40,19 +40,27 @@ trait UnCurry {
           apply(MethodType(h.cloneSymbol.resetFlag(IMPLICIT) :: t, restpe))
         case NullaryMethodType(restpe) =>
           apply(MethodType(List(), restpe))
-        case TypeRef(pre, ByNameParamClass, arg :: Nil) =>
-          apply(functionType(List(), arg))
-        case TypeRef(pre, RepeatedParamClass, arg :: Nil) =>
-          apply(seqType(arg))
-        case TypeRef(pre, JavaRepeatedParamClass, arg :: Nil) =>
-          apply(arrayType(
-            if (isUnboundedGeneric(arg)) ObjectTpe else arg))
+        case DesugaredParameterType(desugaredTpe) =>
+          apply(desugaredTpe)
         case _ =>
           expandAlias(mapOver(tp))
       }
     }
   }
 
+  object DesugaredParameterType {
+    def unapply(tpe: Type): Option[Type] = tpe match {
+      case TypeRef(pre, ByNameParamClass, arg :: Nil) =>
+        Some(functionType(List(), arg))
+      case TypeRef(pre, RepeatedParamClass, arg :: Nil) =>
+        Some(seqType(arg))
+      case TypeRef(pre, JavaRepeatedParamClass, arg :: Nil) =>
+        Some(arrayType(if (isUnboundedGeneric(arg)) ObjectTpe else arg))
+      case _ =>
+        None
+      }
+  }
+
   private val uncurryType = new TypeMap {
     def apply(tp0: Type): Type = {
       val tp = expandAlias(tp0)
diff --git a/src/reflect/scala/reflect/internal/util/AbstractFileClassLoader.scala b/src/reflect/scala/reflect/internal/util/AbstractFileClassLoader.scala
index 30dcbc2..5cbdb92 100644
--- a/src/reflect/scala/reflect/internal/util/AbstractFileClassLoader.scala
+++ b/src/reflect/scala/reflect/internal/util/AbstractFileClassLoader.scala
@@ -12,7 +12,7 @@ import java.security.cert.Certificate
 import java.security.{ ProtectionDomain, CodeSource }
 import java.util.{ Collections => JCollections, Enumeration => JEnumeration }
 
-/** A class loader that loads files from a {@link scala.tools.nsc.io.AbstractFile}.
+/** A class loader that loads files from a [[scala.reflect.io.AbstractFile]].
  *
  *  @author Lex Spoon
  */
diff --git a/src/reflect/scala/reflect/internal/util/StripMarginInterpolator.scala b/src/reflect/scala/reflect/internal/util/StripMarginInterpolator.scala
index e622e78..35858cd 100644
--- a/src/reflect/scala/reflect/internal/util/StripMarginInterpolator.scala
+++ b/src/reflect/scala/reflect/internal/util/StripMarginInterpolator.scala
@@ -13,7 +13,7 @@ trait StripMarginInterpolator {
    * The margin of each line is defined by whitespace leading up to a '|' character.
    * This margin is stripped '''before''' the arguments are interpolated into to string.
    *
-   * String escape sequences are '''not''' processed; this interpolater is designed to
+   * String escape sequences are '''not''' processed; this interpolator is designed to
    * be used with triple quoted Strings.
    *
    * {{{
diff --git a/src/reflect/scala/reflect/internal/util/WeakHashSet.scala b/src/reflect/scala/reflect/internal/util/WeakHashSet.scala
index 3a7a762..83d2a34 100644
--- a/src/reflect/scala/reflect/internal/util/WeakHashSet.scala
+++ b/src/reflect/scala/reflect/internal/util/WeakHashSet.scala
@@ -41,7 +41,7 @@ final class WeakHashSet[A <: AnyRef](val initialCapacity: Int, val loadFactor: D
    * power of two equal to or greater than the specified initial capacity
    */
   private def computeCapacity = {
-    if (initialCapacity < 0) throw new IllegalArgumentException("initial capacity cannot be less than 0");
+    if (initialCapacity < 0) throw new IllegalArgumentException("initial capacity cannot be less than 0")
     var candidate = 1
     while (candidate < initialCapacity) {
       candidate  *= 2
@@ -372,13 +372,13 @@ final class WeakHashSet[A <: AnyRef](val initialCapacity: Int, val loadFactor: D
      * Number of buckets that hold collisions. Useful for diagnosing performance issues.
      */
     def collisionBucketsCount: Int =
-      (table filter (entry => entry != null && entry.tail != null)).size
+      (table count (entry => entry != null && entry.tail != null))
 
     /**
      * Number of buckets that are occupied in this hash table.
      */
     def fullBucketsCount: Int =
-      (table filter (entry => entry != null)).size
+      (table count (entry => entry != null))
 
     /**
      *  Number of buckets in the table
diff --git a/src/reflect/scala/reflect/io/Streamable.scala b/src/reflect/scala/reflect/io/Streamable.scala
index aa47947..99a14d1 100644
--- a/src/reflect/scala/reflect/io/Streamable.scala
+++ b/src/reflect/scala/reflect/io/Streamable.scala
@@ -27,6 +27,10 @@ object Streamable {
    *  efficient method implementations.
    *
    *  ''Note:  This library is considered experimental and should not be used unless you know what you are doing.''
+   *
+   *  Note that this code was not written with resource management in mind.
+   *  Several methods (such as `chars` and `lines`) create InputStreams they
+   *  don't close
    */
   trait Bytes {
     def inputStream(): InputStream
@@ -82,9 +86,13 @@ object Streamable {
      */
     def creationCodec: Codec = implicitly[Codec]
 
+    /** Caller is responsible for closing the returned BufferedSource. */
     def chars(codec: Codec): BufferedSource = Source.fromInputStream(inputStream())(codec)
 
+    /** Beware! Leaks an InputStream which will not be closed until it gets finalized. */
     def lines(): Iterator[String] = lines(creationCodec)
+
+    /** Beware! Leaks an InputStream which will not be closed until it gets finalized. */
     def lines(codec: Codec): Iterator[String] = chars(codec).getLines()
 
     /** Obtains an InputStreamReader wrapped around a FileInputStream.
diff --git a/src/reflect/scala/reflect/macros/Attachments.scala b/src/reflect/scala/reflect/macros/Attachments.scala
index b5c3406..0b5360c 100644
--- a/src/reflect/scala/reflect/macros/Attachments.scala
+++ b/src/reflect/scala/reflect/macros/Attachments.scala
@@ -39,7 +39,7 @@ abstract class Attachments { self =>
 
   /** An underlying payload of the given class type `T`. */
   def get[T: ClassTag]: Option[T] =
-    (all filter matchesTag[T]).headOption.asInstanceOf[Option[T]]
+    (all find matchesTag[T]).asInstanceOf[Option[T]]
 
   /** Check underlying payload contains an instance of type `T`. */
   def contains[T: ClassTag]: Boolean =
diff --git a/src/reflect/scala/reflect/macros/FrontEnds.scala b/src/reflect/scala/reflect/macros/FrontEnds.scala
index a770f32..8ad4138 100644
--- a/src/reflect/scala/reflect/macros/FrontEnds.scala
+++ b/src/reflect/scala/reflect/macros/FrontEnds.scala
@@ -12,7 +12,7 @@ package macros
 trait FrontEnds {
   self: blackbox.Context =>
 
-  /** For sending a message which should not be labeled as a warning/error,
+  /** For sending a message which should not be labelled as a warning/error,
    *  but also shouldn't require -verbose to be visible.
    *  Use `enclosingPosition` if you're in doubt what position to pass to `pos`.
    */
diff --git a/src/reflect/scala/reflect/macros/blackbox/Context.scala b/src/reflect/scala/reflect/macros/blackbox/Context.scala
index 2f9c512..ce28b59 100644
--- a/src/reflect/scala/reflect/macros/blackbox/Context.scala
+++ b/src/reflect/scala/reflect/macros/blackbox/Context.scala
@@ -29,7 +29,7 @@ package blackbox
  *  which means that its expansion will be upcast to its return type, enforcing faithfullness of that macro to its
  *  type signature. Whitebox macros, i.e. the ones defined with `whitebox.Context`, aren't bound by this restriction,
  *  which enables a number of important use cases, but they are also going to enjoy less support than blackbox macros,
- *  so choose wisely. See the [[http://docs.scala-lang.org/overviews/macros.html Macros Guide]] for more information.
+ *  so choose wisely. See the [[http://docs.scala-lang.org/overviews/macros/overview.html Macros Guide]] for more information.
  *
  *  @see `scala.reflect.macros.whitebox.Context`
  */
diff --git a/src/reflect/scala/reflect/macros/package.scala b/src/reflect/scala/reflect/macros/package.scala
index cc7111d..b63d419 100644
--- a/src/reflect/scala/reflect/macros/package.scala
+++ b/src/reflect/scala/reflect/macros/package.scala
@@ -10,14 +10,14 @@ package reflect
  *  Within these functions the programmer has access to compiler APIs.
  *  For example, it is possible to generate, analyze and typecheck code.
  *
- *  See the [[http://docs.scala-lang.org/overviews/macros.html Macros Guide]] on how to get started with Scala macros.
+ *  See the [[http://docs.scala-lang.org/overviews/macros/overview.html Macros Guide]] on how to get started with Scala macros.
  */
 package object macros {
   /** The Scala macros context.
    *
    *  In Scala 2.11, macros that were once the one are split into blackbox and whitebox macros,
    *  with the former being better supported and the latter being more powerful. You can read about
-   *  the details of the split and the associated trade-offs in the [[http://docs.scala-lang.org/overviews/macros.html Macros Guide]].
+   *  the details of the split and the associated trade-offs in the [[http://docs.scala-lang.org/overviews/macros/overview.html Macros Guide]].
    *
    *  `scala.reflect.macros.Context` follows this tendency and turns into `scala.reflect.macros.blackbox.Context`
    *  and `scala.reflect.macros.whitebox.Context`. The original `Context` is left in place for compatibility reasons,
diff --git a/src/reflect/scala/reflect/macros/whitebox/Context.scala b/src/reflect/scala/reflect/macros/whitebox/Context.scala
index bd48df4..272991c 100644
--- a/src/reflect/scala/reflect/macros/whitebox/Context.scala
+++ b/src/reflect/scala/reflect/macros/whitebox/Context.scala
@@ -29,7 +29,7 @@ package whitebox
  *  gaining the ability to refine the type of its expansion beyond its official return type, which enables a number of important use cases.
  *  Blackbox macros, i.e. the ones defined with `blackbox.Context`, can't do that, so they are less powerful.
  *  However blackbox macros are also going to enjoy better support than whitebox macros, so choose wisely.
- *  See the [[http://docs.scala-lang.org/overviews/macros.html Macros Guide]] for more information.
+ *  See the [[http://docs.scala-lang.org/overviews/macros/overview.html Macros Guide]] for more information.
  *
  *  @see `scala.reflect.macros.blackbox.Context`
  */
diff --git a/src/reflect/scala/reflect/runtime/JavaMirrors.scala b/src/reflect/scala/reflect/runtime/JavaMirrors.scala
index 1c751fb..5044251 100644
--- a/src/reflect/scala/reflect/runtime/JavaMirrors.scala
+++ b/src/reflect/scala/reflect/runtime/JavaMirrors.scala
@@ -124,9 +124,9 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
     private def ErrorArrayConstructor(sym: Symbol, owner: Symbol) = abort(s"Cannot instantiate arrays with mirrors. Consider using `scala.reflect.ClassTag(<class of element>).newArray(<length>)` instead")
     private def ErrorFree(member: Symbol, freeType: Symbol)       = abort(s"cannot reflect ${member.kindString} ${member.name}, because it's a member of a weak type ${freeType.name}")
     private def ErrorNonExistentField(sym: Symbol)                = abort(
-      sm"""Scala field ${sym.name} isn't represented as a Java field, neither it has a Java accessor method
-          |note that private parameters of class constructors don't get mapped onto fields and/or accessors,
-          |unless they are used outside of their declaring constructors.""")
+      sm"""Scala field ${sym.name} of ${sym.owner} isn't represented as a Java field, nor does it have a
+          |Java accessor method. One common reason for this is that it may be a private class parameter
+          |not used outside the primary constructor.""")
 
     /** Helper functions for extracting typed values from a (Class[_], Any)
      *  representing an annotation argument.
@@ -142,7 +142,7 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
       object ConstantArg {
         def enumToSymbol(enum: Enum[_]): Symbol = {
           val staticPartOfEnum = classToScala(enum.getClass).companionSymbol
-          staticPartOfEnum.info.declaration(enum.name: TermName)
+          staticPartOfEnum.info.declaration(TermName(enum.name))
         }
 
         def unapply(schemaAndValue: (jClass[_], Any)): Option[Any] = schemaAndValue match {
@@ -172,7 +172,7 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
       // currently I'm simply sorting the methods to guarantee stability of the output
       override lazy val assocs: List[(Name, ClassfileAnnotArg)] = (
         jann.annotationType.getDeclaredMethods.sortBy(_.getName).toList map (m =>
-          (m.getName: TermName) -> toAnnotArg(m.getReturnType -> m.invoke(jann))
+          TermName(m.getName) -> toAnnotArg(m.getReturnType -> m.invoke(jann))
         )
       )
     }
@@ -428,9 +428,12 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
         var i = 0
         while (i < args1.length) {
           val arg = args(i)
-          if (i >= paramCount) args1(i) = arg // don't transform varargs
-          else if (isByName(i)) args1(i) = () => arg // don't transform by-name value class params
-          else if (isDerivedValueClass(i)) args1(i) = paramUnboxers(i).invoke(arg)
+          args1(i) = (
+            if (i >= paramCount)             arg                           // don't transform varargs
+            else if (isByName(i))            () => arg                     // don't transform by-name value class params
+            else if (isDerivedValueClass(i)) paramUnboxers(i).invoke(arg)  // do get the underlying value
+            else                             arg                           // don't molest anything else
+          )
           i += 1
         }
         jinvoke(args1)
@@ -588,6 +591,7 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
       // don't use classOf[scala.reflect.ScalaSignature] here, because it will use getClass.getClassLoader, not mirror's classLoader
       // don't use asInstanceOf either because of the same reason (lol, I cannot believe I fell for it)
       // don't use structural types to simplify reflective invocations because of the same reason
+      // TODO SI-9296 duplicated code, refactor
       def loadAnnotation(name: String): Option[java.lang.annotation.Annotation] =
         tryJavaClass(name) flatMap { annotClass =>
           val anns = jclazz.getAnnotations
@@ -751,6 +755,7 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
           val ifaces = jclazz.getGenericInterfaces.toList map typeToScala
           val isAnnotation = JavaAccFlags(jclazz).isAnnotation
           if (isAnnotation) AnnotationClass.tpe :: ClassfileAnnotationClass.tpe :: ifaces
+          else if (jclazz.isInterface) ObjectTpe :: ifaces // interfaces have Object as superclass in the classfile (see jvm spec), but getGenericSuperclass seems to return null
           else (if (jsuperclazz == null) AnyTpe else typeToScala(jsuperclazz)) :: ifaces
         } finally {
           parentsLevel -= 1
@@ -937,7 +942,7 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
       val ownerModule: ModuleSymbol =
         if (split > 0) packageNameToScala(fullname take split) else this.RootPackage
       val owner = ownerModule.moduleClass
-      val name = (fullname: TermName) drop split + 1
+      val name = TermName(fullname) drop split + 1
       val opkg = owner.info decl name
       if (opkg.hasPackageFlag)
         opkg.asModule
@@ -988,7 +993,7 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
               if (name.startsWith(nme.NAME_JOIN_STRING)) coreLookup(name drop 1) else NoSymbol
             }
           if (nme.isModuleName(simpleName))
-            coreLookup(nme.stripModuleSuffix(simpleName).toTermName) map (_.moduleClass)
+            coreLookup(simpleName.dropModule.toTermName) map (_.moduleClass)
           else
             coreLookup(simpleName)
         }
@@ -1180,6 +1185,7 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
       constr setInfo GenPolyType(tparams, MethodType(clazz.newSyntheticValueParams(paramtpes), clazz.tpe))
       propagatePackageBoundary(jconstr.javaFlags, constr)
       copyAnnotations(constr, jconstr)
+      if (jconstr.javaFlags.isVarargs) constr modifyInfo arrayToRepeated
       markAllCompleted(constr)
       constr
     }
@@ -1282,16 +1288,12 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
       jclazz getDeclaredConstructor (effectiveParamClasses: _*)
     }
 
-    private def jArrayClass(elemClazz: jClass[_]): jClass[_] = {
-      jArray.newInstance(elemClazz, 0).getClass
-    }
-
     /** The Java class that corresponds to given Scala type.
      *  Pre: Scala type is already transformed to Java level.
      */
     def typeToJavaClass(tpe: Type): jClass[_] = tpe match {
       case ExistentialType(_, rtpe)                  => typeToJavaClass(rtpe)
-      case TypeRef(_, ArrayClass, List(elemtpe))     => jArrayClass(typeToJavaClass(elemtpe))
+      case TypeRef(_, ArrayClass, List(elemtpe))     => ScalaRunTime.arrayClass(typeToJavaClass(elemtpe))
       case TypeRef(_, sym: ClassSymbol, _)           => classToJava(sym.asClass)
       case tpe @ TypeRef(_, sym: AliasTypeSymbol, _) => typeToJavaClass(tpe.dealias)
       case SingleType(_, sym: ModuleSymbol)          => classToJava(sym.moduleClass.asClass)
diff --git a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala
index 1c0aa7c..7725e4a 100644
--- a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala
+++ b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala
@@ -106,7 +106,6 @@ trait JavaUniverseForce { self: runtime.JavaUniverse  =>
     this.AnnotationInfo
     this.Annotation
     this.UnmappableAnnotation
-    this.ErroneousAnnotation
     this.ThrownException
     this.typeNames
     this.tpnme
@@ -255,6 +254,8 @@ trait JavaUniverseForce { self: runtime.JavaUniverse  =>
     definitions.JavaEnumClass
     definitions.RemoteInterfaceClass
     definitions.RemoteExceptionClass
+    definitions.JavaUtilMap
+    definitions.JavaUtilHashMap
     definitions.ByNameParamClass
     definitions.JavaRepeatedParamClass
     definitions.RepeatedParamClass
@@ -310,6 +311,7 @@ trait JavaUniverseForce { self: runtime.JavaUniverse  =>
     definitions.QuasiquoteClass_api_unapply
     definitions.ScalaSignatureAnnotation
     definitions.ScalaLongSignatureAnnotation
+    definitions.LambdaMetaFactory
     definitions.MethodHandle
     definitions.OptionClass
     definitions.OptionModule
@@ -441,7 +443,7 @@ trait JavaUniverseForce { self: runtime.JavaUniverse  =>
     definitions.ScalaValueClassesNoUnit
     definitions.ScalaValueClasses
 
-
+    uncurry.DesugaredParameterType
     erasure.GenericArray
     erasure.scalaErasure
     erasure.specialScalaErasure
diff --git a/src/reflect/scala/reflect/runtime/ReflectionUtils.scala b/src/reflect/scala/reflect/runtime/ReflectionUtils.scala
index a4bd698..a278ed3 100644
--- a/src/reflect/scala/reflect/runtime/ReflectionUtils.scala
+++ b/src/reflect/scala/reflect/runtime/ReflectionUtils.scala
@@ -72,7 +72,7 @@ object ReflectionUtils {
     def singletonAccessor(clazz: Class[_]): Option[Method] =
       if (clazz == null) None
       else {
-        val declaredAccessor = clazz.getDeclaredMethods.filter(_.getName == accessorName).headOption
+        val declaredAccessor = clazz.getDeclaredMethods.find(_.getName == accessorName)
         declaredAccessor orElse singletonAccessor(clazz.getSuperclass)
       }
 
@@ -92,7 +92,7 @@ object ReflectionUtils {
   }
 
   class EnclosedIn[T](enclosure: jClass[_] => T) {
-    def unapply(jclazz: jClass[_]): Option[T] = if (enclosure(jclazz) != null) Some(enclosure(jclazz)) else None
+    def unapply(jclazz: jClass[_]): Option[T] = Option(enclosure(jclazz))
   }
 
   object EnclosedInMethod extends EnclosedIn(_.getEnclosingMethod)
diff --git a/src/reflect/scala/reflect/runtime/SymbolLoaders.scala b/src/reflect/scala/reflect/runtime/SymbolLoaders.scala
index 50ea8d9..9ce6331 100644
--- a/src/reflect/scala/reflect/runtime/SymbolLoaders.scala
+++ b/src/reflect/scala/reflect/runtime/SymbolLoaders.scala
@@ -107,7 +107,8 @@ private[reflect] trait SymbolLoaders { self: SymbolTable =>
       if (isCompilerUniverse) super.enter(sym)
       else {
         val existing = super.lookupEntry(sym.name)
-        assert(existing == null || existing.sym.isMethod, s"pkgClass = $pkgClass, sym = $sym, existing = $existing")
+        def eitherIsMethod(sym1: Symbol, sym2: Symbol) = sym1.isMethod || sym2.isMethod
+        assert(existing == null || eitherIsMethod(existing.sym, sym), s"pkgClass = $pkgClass, sym = $sym, existing = $existing")
         super.enter(sym)
       }
     }
diff --git a/src/reflect/scala/reflect/runtime/SymbolTable.scala b/src/reflect/scala/reflect/runtime/SymbolTable.scala
index 092bbd7..eee2118 100644
--- a/src/reflect/scala/reflect/runtime/SymbolTable.scala
+++ b/src/reflect/scala/reflect/runtime/SymbolTable.scala
@@ -3,7 +3,7 @@ package reflect
 package runtime
 
 /**
- *  This symbol table trait fills in the definitions so that class information is obtained by refection.
+ *  This symbol table trait fills in the definitions so that class information is obtained by reflection.
  *  It can be used either from a reflexive universe (class scala.reflect.runtime.JavaUniverse), or else from
  *  a runtime compiler that uses reflection to get a class information (class scala.tools.reflect.ReflectGlobal)
  */
diff --git a/src/reflect/scala/reflect/runtime/SynchronizedOps.scala b/src/reflect/scala/reflect/runtime/SynchronizedOps.scala
index 4a8585d..f0d96e0 100644
--- a/src/reflect/scala/reflect/runtime/SynchronizedOps.scala
+++ b/src/reflect/scala/reflect/runtime/SynchronizedOps.scala
@@ -15,7 +15,7 @@ private[reflect] trait SynchronizedOps extends internal.SymbolTable
 
   override protected def newBaseTypeSeq(parents: List[Type], elems: Array[Type]) =
     // only need to synchronize BaseTypeSeqs if they contain refined types
-    if (elems.filter(_.isInstanceOf[RefinedType]).nonEmpty) new BaseTypeSeq(parents, elems) with SynchronizedBaseTypeSeq
+    if (elems.exists(_.isInstanceOf[RefinedType])) new BaseTypeSeq(parents, elems) with SynchronizedBaseTypeSeq
     else new BaseTypeSeq(parents, elems)
 
   trait SynchronizedBaseTypeSeq extends BaseTypeSeq {
@@ -31,7 +31,7 @@ private[reflect] trait SynchronizedOps extends internal.SymbolTable
 
     override def lateMap(f: Type => Type): BaseTypeSeq =
       // only need to synchronize BaseTypeSeqs if they contain refined types
-      if (map(f).toList.filter(_.isInstanceOf[RefinedType]).nonEmpty) new MappedBaseTypeSeq(this, f) with SynchronizedBaseTypeSeq
+      if (map(f).toList.exists(_.isInstanceOf[RefinedType])) new MappedBaseTypeSeq(this, f) with SynchronizedBaseTypeSeq
       else new MappedBaseTypeSeq(this, f)
   }
 
diff --git a/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala b/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala
index 9bcf85d..1d02cc7 100644
--- a/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala
+++ b/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala
@@ -82,9 +82,9 @@ private[reflect] trait SynchronizedTypes extends internal.Types { self: SymbolTa
   override def toStringSubjects = _toStringSubjects.get
 
   /* The idea of caches is as follows.
-   * When in reflexive mode, a cache is either null, or one sentinal
+   * When in reflexive mode, a cache is either null, or one sentinel
    * value representing undefined or the final defined
-   * value. Hence, we can ask in non-synchronized ode whether the cache field
+   * value. Hence, we can ask in non-synchronized mode whether the cache field
    * is non null and different from the sentinel (if a sentinel exists).
    * If that's true, the cache value is current.
    * Otherwise we arrive in one of the defined... methods listed below
diff --git a/src/reflect/scala/reflect/runtime/TwoWayCache.scala b/src/reflect/scala/reflect/runtime/TwoWayCache.scala
index d0fc3da..6c1ca5b 100644
--- a/src/reflect/scala/reflect/runtime/TwoWayCache.scala
+++ b/src/reflect/scala/reflect/runtime/TwoWayCache.scala
@@ -26,8 +26,7 @@ private[runtime] class TwoWayCache[J, S] {
   private object SomeRef {
     def unapply[T](optRef: Option[WeakReference[T]]): Option[T] =
       if (optRef.nonEmpty) {
-        val result = optRef.get.get
-        if (result != null) Some(result) else None
+        Option(optRef.get.get)
       } else None
   }
 
diff --git a/src/reflect/scala/reflect/runtime/TwoWayCaches.scala b/src/reflect/scala/reflect/runtime/TwoWayCaches.scala
index 6e2890e..6ce0c0a 100644
--- a/src/reflect/scala/reflect/runtime/TwoWayCaches.scala
+++ b/src/reflect/scala/reflect/runtime/TwoWayCaches.scala
@@ -26,8 +26,7 @@ private[runtime] trait TwoWayCaches { self: SymbolTable =>
     private object SomeRef {
       def unapply[T](optRef: Option[WeakReference[T]]): Option[T] =
         if (optRef.nonEmpty) {
-          val result = optRef.get.get
-          if (result != null) Some(result) else None
+          Option(optRef.get.get)
         } else None
     }
 
diff --git a/src/reflect/scala/reflect/runtime/package.scala b/src/reflect/scala/reflect/runtime/package.scala
index e240bed..77eb610 100644
--- a/src/reflect/scala/reflect/runtime/package.scala
+++ b/src/reflect/scala/reflect/runtime/package.scala
@@ -30,9 +30,9 @@ package runtime {
       import c.universe._
       val runtimeClass = c.reifyEnclosingRuntimeClass
       if (runtimeClass.isEmpty) c.abort(c.enclosingPosition, "call site does not have an enclosing class")
-      val scalaPackage = Select(Ident(newTermName("_root_")), newTermName("scala"))
-      val runtimeUniverse = Select(Select(Select(scalaPackage, newTermName("reflect")), newTermName("runtime")), newTermName("universe"))
-      val currentMirror = Apply(Select(runtimeUniverse, newTermName("runtimeMirror")), List(Select(runtimeClass, newTermName("getClassLoader"))))
+      val scalaPackage = Select(Ident(TermName("_root_")), TermName("scala"))
+      val runtimeUniverse = Select(Select(Select(scalaPackage, TermName("reflect")), TermName("runtime")), TermName("universe"))
+      val currentMirror = Apply(Select(runtimeUniverse, TermName("runtimeMirror")), List(Select(runtimeClass, TermName("getClassLoader"))))
       c.Expr[Nothing](currentMirror)(c.WeakTypeTag.Nothing)
     }
   }
diff --git a/src/repl-jline/scala/tools/nsc/interpreter/jline/FileBackedHistory.scala b/src/repl-jline/scala/tools/nsc/interpreter/jline/FileBackedHistory.scala
new file mode 100644
index 0000000..53a06ca
--- /dev/null
+++ b/src/repl-jline/scala/tools/nsc/interpreter/jline/FileBackedHistory.scala
@@ -0,0 +1,93 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2015 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc.interpreter.jline
+
+import _root_.jline.console.history.PersistentHistory
+
+import scala.tools.nsc.interpreter
+import scala.reflect.io.{ File, Path }
+import scala.tools.nsc.Properties.{ propOrNone, userHome }
+
+/** TODO: file locking.
+  */
+trait FileBackedHistory extends JLineHistory with PersistentHistory {
+  def maxSize: Int
+
+  protected lazy val historyFile: File = FileBackedHistory.defaultFile
+  private var isPersistent = true
+
+  locally {
+    load()
+  }
+
+  def withoutSaving[T](op: => T): T = {
+    val saved = isPersistent
+    isPersistent = false
+    try op
+    finally isPersistent = saved
+  }
+
+  def addLineToFile(item: CharSequence): Unit = {
+    if (isPersistent)
+      append(item + "\n")
+  }
+
+  /** Overwrites the history file with the current memory. */
+  protected def sync(): Unit = {
+    val lines = asStrings map (_ + "\n")
+    historyFile.writeAll(lines: _*)
+  }
+
+  /** Append one or more lines to the history file. */
+  protected def append(lines: String*): Unit = {
+    historyFile.appendAll(lines: _*)
+  }
+
+  def load(): Unit = {
+    if (!historyFile.canRead)
+      historyFile.createFile()
+
+    val lines: IndexedSeq[String] = {
+      try historyFile.lines().toIndexedSeq
+      catch {
+        // It seems that control characters in the history file combined
+        // with the default codec can lead to nio spewing exceptions.  Rather
+        // than abandon hope we'll try to read it as ISO-8859-1
+        case _: Exception =>
+          try historyFile.lines("ISO-8859-1").toIndexedSeq
+          catch {
+            case _: Exception => Vector()
+          }
+      }
+    }
+
+    interpreter.repldbg("Loading " + lines.size + " into history.")
+
+    // avoid writing to the history file
+    withoutSaving(lines takeRight maxSize foreach add)
+    // truncate the history file if it's too big.
+    if (lines.size > maxSize) {
+      interpreter.repldbg("File exceeds maximum size: truncating to " + maxSize + " entries.")
+      sync()
+    }
+    moveToEnd()
+  }
+
+  def flush(): Unit = ()
+
+  def purge(): Unit = historyFile.truncate()
+}
+
+object FileBackedHistory {
+  //   val ContinuationChar = '\003'
+  //   val ContinuationNL: String = Array('\003', '\n').mkString
+
+  final val defaultFileName = ".scala_history"
+
+  def defaultFile: File = File(
+    propOrNone("scala.shell.histfile") map (Path.apply) getOrElse (Path(userHome) / defaultFileName)
+  )
+}
diff --git a/src/repl-jline/scala/tools/nsc/interpreter/jline/JLineDelimiter.scala b/src/repl-jline/scala/tools/nsc/interpreter/jline/JLineDelimiter.scala
new file mode 100644
index 0000000..89e8494
--- /dev/null
+++ b/src/repl-jline/scala/tools/nsc/interpreter/jline/JLineDelimiter.scala
@@ -0,0 +1,25 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc.interpreter.jline
+
+import scala.tools.nsc.interpreter
+
+import _root_.jline.console.completer.ArgumentCompleter.{ ArgumentDelimiter, ArgumentList }
+
+// implements a jline interface
+class JLineDelimiter extends ArgumentDelimiter {
+  def toJLine(args: List[String], cursor: Int): ArgumentList = args match {
+    case Nil => new ArgumentList(new Array[String](0), 0, 0, cursor)
+    case xs => new ArgumentList(xs.toArray, xs.size - 1, xs.last.length, cursor)
+  }
+
+  def delimit(buffer: CharSequence, cursor: Int) = {
+    val p = interpreter.Parsed(buffer.toString, cursor)
+    toJLine(p.args, cursor)
+  }
+
+  def isDelimiter(buffer: CharSequence, cursor: Int) = interpreter.Parsed(buffer.toString, cursor).isDelimiter
+}
diff --git a/src/repl-jline/scala/tools/nsc/interpreter/jline/JLineHistory.scala b/src/repl-jline/scala/tools/nsc/interpreter/jline/JLineHistory.scala
new file mode 100644
index 0000000..3bc2592
--- /dev/null
+++ b/src/repl-jline/scala/tools/nsc/interpreter/jline/JLineHistory.scala
@@ -0,0 +1,77 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc.interpreter.jline
+
+import java.util.{Iterator => JIterator, ListIterator => JListIterator}
+
+import _root_.jline.{console => jconsole}
+import jconsole.history.History.{Entry => JEntry}
+import jconsole.history.{History => JHistory}
+
+import scala.tools.nsc.interpreter
+import scala.tools.nsc.interpreter.session.{History, SimpleHistory}
+
+
+/** A straight scalafication of the jline interface which mixes
+ *  in the sparse jline-independent one too.
+ */
+trait JLineHistory extends JHistory with History {
+  def size: Int
+  def isEmpty: Boolean
+  def index: Int
+  def clear(): Unit
+  def get(index: Int): CharSequence
+  def add(line: CharSequence): Unit
+  def replace(item: CharSequence): Unit
+
+  def entries(index: Int): JListIterator[JEntry]
+  def entries(): JListIterator[JEntry]
+  def iterator: JIterator[JEntry]
+
+  def current(): CharSequence
+  def previous(): Boolean
+  def next(): Boolean
+  def moveToFirst(): Boolean
+  def moveToLast(): Boolean
+  def moveTo(index: Int): Boolean
+  def moveToEnd(): Unit
+
+  override def historicize(text: String): Boolean = {
+    text.lines foreach add
+    moveToEnd()
+    true
+  }
+}
+
+object JLineHistory {
+  class JLineFileHistory extends SimpleHistory with FileBackedHistory {
+    override def add(item: CharSequence): Unit = {
+      if (!isEmpty && last == item)
+        interpreter.repldbg("Ignoring duplicate entry '" + item + "'")
+      else {
+        super.add(item)
+        addLineToFile(item)
+      }
+    }
+    override def toString = "History(size = " + size + ", index = " + index + ")"
+
+    import scala.collection.JavaConverters._
+
+    override def asStrings(from: Int, to: Int): List[String] =
+      entries(from).asScala.take(to - from).map(_.value.toString).toList
+
+    case class Entry(index: Int, value: CharSequence) extends JEntry {
+      override def toString = value.toString
+    }
+
+    private def toEntries(): Seq[JEntry] = buf.zipWithIndex map { case (x, i) => Entry(i, x)}
+    def entries(idx: Int): JListIterator[JEntry] = toEntries().asJava.listIterator(idx)
+    def entries(): JListIterator[JEntry] = toEntries().asJava.listIterator()
+    def iterator: JIterator[JEntry] = toEntries().iterator.asJava
+  }
+
+  def apply(): History = try new JLineFileHistory catch { case x: Exception => new SimpleHistory() }
+}
diff --git a/src/repl-jline/scala/tools/nsc/interpreter/jline/JLineReader.scala b/src/repl-jline/scala/tools/nsc/interpreter/jline/JLineReader.scala
new file mode 100644
index 0000000..b5db4c2
--- /dev/null
+++ b/src/repl-jline/scala/tools/nsc/interpreter/jline/JLineReader.scala
@@ -0,0 +1,169 @@
+/** NSC -- new Scala compiler
+  *
+  * Copyright 2005-2015 LAMP/EPFL
+  * @author Stepan Koltsov
+  * @author Adriaan Moors
+  */
+
+package scala.tools.nsc.interpreter.jline
+
+import java.util.{Collection => JCollection, List => JList}
+
+import _root_.jline.{console => jconsole}
+import jline.console.ConsoleReader
+import jline.console.completer.{CompletionHandler, Completer, ArgumentCompleter}
+import jconsole.history.{History => JHistory}
+
+
+import scala.tools.nsc.interpreter
+import scala.tools.nsc.interpreter.{Completion, JLineCompletion, NoCompletion}
+import scala.tools.nsc.interpreter.Completion.Candidates
+import scala.tools.nsc.interpreter.session.History
+
+/**
+ * Reads from the console using JLine.
+ *
+ * Eagerly instantiates all relevant JLine classes, so that we can detect linkage errors on `new JLineReader` and retry.
+ */
+class InteractiveReader(completer: () => Completion) extends interpreter.InteractiveReader {
+  val interactive = true
+
+  val history: History = new JLineHistory.JLineFileHistory()
+
+  private val consoleReader = {
+    val reader = new JLineConsoleReader()
+
+    reader setPaginationEnabled interpreter.`package`.isPaged
+
+    // ASAP
+    reader setExpandEvents false
+
+    reader setHistory history.asInstanceOf[JHistory]
+
+    reader
+  }
+
+  private[this] var _completion: Completion = interpreter.NoCompletion
+  def completion: Completion = _completion
+
+  override def postInit() = {
+    _completion = completer()
+
+    consoleReader.initCompletion(completion)
+  }
+
+  def reset()                     = consoleReader.getTerminal().reset()
+  def redrawLine()                = consoleReader.redrawLineAndFlush()
+  def readOneLine(prompt: String) = consoleReader.readLine(prompt)
+  def readOneKey(prompt: String)  = consoleReader.readOneKey(prompt)
+}
+
+// implements a jline interface
+private class JLineConsoleReader extends jconsole.ConsoleReader with interpreter.VariColumnTabulator {
+  val isAcross   = interpreter.`package`.isAcross
+  val marginSize = 3
+
+  def width  = getTerminal.getWidth()
+  def height = getTerminal.getHeight()
+
+  private def morePrompt = "--More--"
+
+  private def emulateMore(): Int = {
+    val key = readOneKey(morePrompt)
+    try key match {
+      case '\r' | '\n' => 1
+      case 'q' => -1
+      case _ => height - 1
+    }
+    finally {
+      eraseLine()
+      // TODO: still not quite managing to erase --More-- and get
+      // back to a scala prompt without another keypress.
+      if (key == 'q') {
+        putString(getPrompt())
+        redrawLine()
+        flush()
+      }
+    }
+  }
+
+  override def printColumns(items: JCollection[_ <: CharSequence]): Unit = {
+    import scala.tools.nsc.interpreter.javaCharSeqCollectionToScala
+    printColumns_(items: List[String])
+  }
+
+  private def printColumns_(items: List[String]): Unit = if (items exists (_ != "")) {
+    val grouped = tabulate(items)
+    var linesLeft = if (isPaginationEnabled()) height - 1 else Int.MaxValue
+    grouped foreach { xs =>
+      println(xs.mkString)
+      linesLeft -= 1
+      if (linesLeft <= 0) {
+        linesLeft = emulateMore()
+        if (linesLeft < 0)
+          return
+      }
+    }
+  }
+
+  def readOneKey(prompt: String) = {
+    this.print(prompt)
+    this.flush()
+    this.readCharacter()
+  }
+
+  def eraseLine() = resetPromptLine("", "", 0)
+
+  def redrawLineAndFlush(): Unit = {
+    flush(); drawLine(); flush()
+  }
+
+  // A hook for running code after the repl is done initializing.
+  def initCompletion(completion: Completion): Unit = {
+    this setBellEnabled false
+
+    // adapt the JLine completion interface
+    def completer =
+      new Completer {
+        val tc = completion.completer()
+        def complete(_buf: String, cursor: Int, candidates: JList[CharSequence]): Int = {
+          val buf = if (_buf == null) "" else _buf
+          val Candidates(newCursor, newCandidates) = tc.complete(buf, cursor)
+          newCandidates foreach (candidates add _)
+          newCursor
+        }
+      }
+
+    // a last bit of nastiness: parsing help depending on the flavor of completer (fixme)
+    completion match {
+      case _: JLineCompletion =>
+        val jlineCompleter = new ArgumentCompleter(new JLineDelimiter, completer)
+        jlineCompleter setStrict false
+        this addCompleter jlineCompleter
+      case NoCompletion       => ()
+      case _                  => this addCompleter completer
+    }
+
+    // This is a workaround for https://github.com/jline/jline2/issues/208
+    // and should not be necessary once we upgrade to JLine 2.13.1
+    ///
+    // Test by:
+    // scala> {" ".char}<LEFT><TAB>
+    //
+    // And checking we don't get an extra } on the line.
+    ///
+    val handler = getCompletionHandler
+    setCompletionHandler(new CompletionHandler {
+      override def complete(consoleReader: ConsoleReader, list: JList[CharSequence], i: Int): Boolean = {
+        try {
+          handler.complete(consoleReader, list, i)
+        } finally if (getCursorBuffer.cursor != getCursorBuffer.length()) {
+          print(" ")
+          getCursorBuffer.write(' ')
+          backspace()
+        }
+      }
+    })
+    setAutoprintThreshold(400) // max completion candidates without warning
+  }
+}
diff --git a/src/repl/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala b/src/repl/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala
deleted file mode 100644
index d8efcda..0000000
--- a/src/repl/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala
+++ /dev/null
@@ -1,160 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import jline.console.{ ConsoleReader, CursorBuffer }
-
-trait ConsoleReaderHelper { _: ConsoleReader with Tabulator =>
-  def isAcross: Boolean
-
-  def terminal    = getTerminal()
-  def width       = terminal.getWidth()
-  def height      = terminal.getHeight()
-
-  def readOneKey(prompt: String): Int
-  def eraseLine(): Unit
-
-  val marginSize = 3
-
-  private def morePrompt = "--More--"
-  private def emulateMore(): Int = {
-    val key = readOneKey(morePrompt)
-    try key match {
-      case '\r' | '\n'  => 1
-      case 'q'          => -1
-      case _            => height - 1
-    }
-    finally {
-      eraseLine()
-      // TODO: still not quite managing to erase --More-- and get
-      // back to a scala prompt without another keypress.
-      if (key == 'q') {
-        putString(getPrompt())
-        redrawLine()
-        flush()
-      }
-    }
-  }
-
-  override def printColumns(items: JCollection[_ <: CharSequence]): Unit =
-    printColumns_(items: List[String])
-
-  private def printColumns_(items: List[String]): Unit = if (items exists (_ != "")) {
-    val grouped = tabulate(items)
-    var linesLeft  = if (isPaginationEnabled()) height - 1 else Int.MaxValue
-    grouped foreach { xs =>
-      println(xs.mkString)
-      linesLeft -= 1
-      if (linesLeft <= 0) {
-        linesLeft = emulateMore()
-        if (linesLeft < 0)
-          return
-      }
-    }
-  }
-}
-
-trait Tabulator {
-  def isAcross: Boolean
-  def width: Int
-  def marginSize: Int
-
-  protected def fits(items: Seq[String], width: Int): Boolean = (
-    (items map (_.length)).sum + (items.length - 1) * marginSize < width
-  )
-  def tabulate(items: Seq[String]): Seq[Seq[String]] = (
-    if (fits(items, width)) Seq(Seq(items mkString " " * marginSize))
-    else printMultiLineColumns(items)
-  )
-  protected def columnize(ss: Seq[String]): Seq[Seq[String]] = ss map (s => Seq(s))
-  protected def printMultiLineColumns(items: Seq[String]): Seq[Seq[String]] = {
-    import SimpleMath._
-    val longest     = (items map (_.length)).max
-    val columnWidth = longest + marginSize
-    val maxcols = (
-      if (columnWidth >= width) 1
-      else 1 max (width / columnWidth)   // make sure it doesn't divide to 0
-    )
-    val nrows       = items.size /% maxcols
-    val ncols       = items.size /% nrows
-    val groupSize   = ncols
-    val padded      = items map (s"%-${columnWidth}s" format _)
-    val xwise       = isAcross || ncols >= items.length
-    val grouped: Seq[Seq[String]]    =
-      if (groupSize == 1) columnize(items)
-      else if (xwise) (padded grouped groupSize).toSeq
-      else {
-        val h       = 1 max padded.size /% groupSize
-        val cols    = (padded grouped h).toList
-        for (i <- 0 until h) yield
-          for (j <- 0 until groupSize) yield
-            if (i < cols(j).size) cols(j)(i) else ""
-      }
-    grouped
-  }
-}
-
-/** Adjust the column width and number of columns to minimize the row count. */
-trait VariColumnTabulator extends Tabulator {
-  override protected def printMultiLineColumns(items: Seq[String]): Seq[Seq[String]] = {
-    import SimpleMath._
-    val longest  = (items map (_.length)).max
-    val shortest = (items map (_.length)).min
-    val fattest  = longest + marginSize
-    val skinny   = shortest + marginSize
-
-    // given ncols, calculate nrows and a list of column widths, or none if not possible
-    // if ncols > items.size, then columnWidths.size == items.size
-    def layout(ncols: Int): Option[(Int, Seq[Int], Seq[Seq[String]])] = {
-      val nrows = items.size /% ncols
-      val xwise = isAcross || ncols >= items.length
-      def maxima(sss: Seq[Seq[String]]) =
-        (0 until (ncols min items.size)) map (i => (sss map (ss => ss(i).length)).max)
-      def resulting(rows: Seq[Seq[String]]) = {
-        val columnWidths = maxima(rows) map (_ + marginSize)
-        val linelen      = columnWidths.sum
-        if (linelen <= width) Some((nrows, columnWidths, rows))
-        else None
-      }
-      if (ncols == 1) resulting(columnize(items))
-      else if (xwise) resulting((items grouped ncols).toSeq)
-      else {
-        val cols = (items grouped nrows).toList
-        val rows = for (i <- 0 until nrows) yield
-          for (j <- 0 until ncols) yield
-            if (j < cols.size && i < cols(j).size) cols(j)(i) else ""
-        resulting(rows)
-      }
-    }
-
-    if (fattest >= width) {
-      columnize(items)
-    } else {
-      // if every col is widest, we have at least this many cols
-      val mincols = 1 max (width / fattest)
-      // if every other col is skinniest, we have at most this many cols
-      val maxcols = 1 + ((width - fattest) / skinny)
-      val possibles = (mincols to maxcols).map(n => layout(n)).flatten
-      val minrows = (possibles map (_._1)).min
-
-      // select the min ncols that results in minrows
-      val (_, columnWidths, sss) = (possibles find (_._1 == minrows)).get
-
-      // format to column width
-      sss map (ss => ss.zipWithIndex map {
-        case (s, i) => s"%-${columnWidths(i)}s" format s
-      })
-    }
-  }
-}
-
-private[interpreter] object SimpleMath {
-  implicit class DivRem(private val i: Int) extends AnyVal {
-    /** i/n + if (i % n != 0) 1 else 0 */
-    def /%(n: Int): Int = (i + n - 1) / n
-  }
-}
diff --git a/src/repl/scala/tools/nsc/interpreter/Delimited.scala b/src/repl/scala/tools/nsc/interpreter/Delimited.scala
deleted file mode 100644
index b7f06f1..0000000
--- a/src/repl/scala/tools/nsc/interpreter/Delimited.scala
+++ /dev/null
@@ -1,41 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import jline.console.completer.ArgumentCompleter.{ ArgumentDelimiter, ArgumentList }
-
-class JLineDelimiter extends ArgumentDelimiter {
-  def toJLine(args: List[String], cursor: Int) = args match {
-    case Nil    => new ArgumentList(new Array[String](0), 0, 0, cursor)
-    case xs     => new ArgumentList(xs.toArray, xs.size - 1, xs.last.length, cursor)
-  }
-
-  def delimit(buffer: CharSequence, cursor: Int) = {
-    val p = Parsed(buffer.toString, cursor)
-    toJLine(p.args, cursor)
-  }
-  def isDelimiter(buffer: CharSequence, cursor: Int) = Parsed(buffer.toString, cursor).isDelimiter
-}
-
-trait Delimited {
-  self: Parsed =>
-
-  def delimited: Char => Boolean
-  def escapeChars: List[Char] = List('\\')
-
-  /** Break String into args based on delimiting function.
-   */
-  protected def toArgs(s: String): List[String] =
-    if (s == "") Nil
-    else (s indexWhere isDelimiterChar) match {
-      case -1   => List(s)
-      case idx  => (s take idx) :: toArgs(s drop (idx + 1))
-    }
-
-  def isDelimiterChar(ch: Char) = delimited(ch)
-  def isEscapeChar(ch: Char): Boolean = escapeChars contains ch
-}
diff --git a/src/repl/scala/tools/nsc/interpreter/Formatting.scala b/src/repl/scala/tools/nsc/interpreter/Formatting.scala
index 43e653e..4a95487 100644
--- a/src/repl/scala/tools/nsc/interpreter/Formatting.scala
+++ b/src/repl/scala/tools/nsc/interpreter/Formatting.scala
@@ -8,28 +8,28 @@ package interpreter
 
 import util.stringFromWriter
 
-trait Formatting {
-  def prompt: String
+class Formatting(indent: Int) {
 
-  def spaces(code: String): String = {
+  private val indentation = " " * indent
+
+  private def indenting(code: String): Boolean = {
     /** Heuristic to avoid indenting and thereby corrupting """-strings and XML literals. */
     val tokens = List("\"\"\"", "</", "/>")
     val noIndent = (code contains "\n") && (tokens exists code.contains)
 
-    if (noIndent) ""
-    else prompt drop 1 map (_ => ' ')
+    !noIndent
   }
   /** Indent some code by the width of the scala> prompt.
    *  This way, compiler error messages read better.
    */
-  def indentCode(code: String) = {
-    val indent = spaces(code)
-    stringFromWriter(str =>
-      for (line <- code.lines) {
-        str print indent
-        str print (line + "\n")
-        str.flush()
-      }
-    )
-  }
+  def indentCode(code: String) = stringFromWriter(str =>
+    for (line <- code.lines) {
+      if (indenting(code)) str print indentation
+      str println line
+      str.flush()
+    }
+  )
+}
+object Formatting {
+  def forPrompt(prompt: String) = new Formatting(prompt.lines.toList.last.length)
 }
diff --git a/src/repl/scala/tools/nsc/interpreter/ILoop.scala b/src/repl/scala/tools/nsc/interpreter/ILoop.scala
index 4d71e0e..adac438 100644
--- a/src/repl/scala/tools/nsc/interpreter/ILoop.scala
+++ b/src/repl/scala/tools/nsc/interpreter/ILoop.scala
@@ -1,8 +1,7 @@
 /* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
+ * Copyright 2005-2015 LAMP/EPFL
  * @author Alexander Spoon
  */
-
 package scala
 package tools.nsc
 package interpreter
@@ -24,7 +23,9 @@ import io.AbstractFile
 import scala.collection.generic.Clearable
 import scala.concurrent.{ ExecutionContext, Await, Future, future }
 import ExecutionContext.Implicits._
-import java.io.{ BufferedReader, FileReader }
+import java.io.{ BufferedReader, FileReader, StringReader }
+
+import scala.util.{ Try, Success, Failure }
 
 /** The Scala interactive shell.  It provides a read-eval-print loop
  *  around the Interpreter class.
@@ -54,13 +55,9 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
 
   private var globalFuture: Future[Boolean] = _
 
-  /** Print a welcome message */
-  def printWelcome() {
-    echo(s"""
-      |Welcome to Scala $versionString ($javaVmName, Java $javaVersion).
-      |Type in expressions to have them evaluated.
-      |Type :help for more information.""".trim.stripMargin
-    )
+  /** Print a welcome message! */
+  def printWelcome(): Unit = {
+    Option(replProps.welcome) filter (!_.isEmpty) foreach echo
     replinfo("[info] started at " + new java.util.Date)
   }
 
@@ -109,11 +106,6 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
   }
 
   class ILoopInterpreter extends IMain(settings, out) {
-    outer =>
-
-    override lazy val formatting = new Formatting {
-      def prompt = ILoop.this.prompt
-    }
     override protected def parentClassLoader =
       settings.explicitParentLoader.getOrElse( classOf[ILoop].getClassLoader )
   }
@@ -197,10 +189,8 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
       echo("%d %s".format(index + offset, line))
   }
 
-  private val currentPrompt = Properties.shellPromptString
-
   /** Prompt to print when awaiting input */
-  def prompt = currentPrompt
+  def prompt = replProps.prompt
 
   import LoopCommand.{ cmd, nullary }
 
@@ -410,14 +400,8 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
   }
 
   private def readOneLine() = {
-    import scala.io.AnsiColor.{ MAGENTA, RESET }
     out.flush()
-    in readLine (
-      if (replProps.colorOk)
-        MAGENTA + prompt + RESET
-      else
-        prompt
-    )
+    in readLine prompt
   }
 
   /** The main read-eval-print loop for the repl.  It calls
@@ -503,10 +487,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
       val errless = intp compileSources new BatchSourceFile("<pastie>", s"object pastel {\n$code\n}")
       if (errless) echo("The compiler reports no errors.")
     }
-    def historicize(text: String) = history match {
-      case jlh: JLineHistory => text.lines foreach jlh.add ; jlh.moveToEnd() ; true
-      case _ => false
-    }
+
     def edit(text: String): Result = editor match {
       case Some(ed) =>
         val tmp = File.makeTemp()
@@ -522,7 +503,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
                   val res = intp interpret edited
                   if (res == IR.Incomplete) diagnose(edited)
                   else {
-                    historicize(edited)
+                    history.historicize(edited)
                     Result(lineToRecord = Some(edited), keepRunning = true)
                   }
                 case None => echo("Can't read edited text. Did you delete it?")
@@ -533,7 +514,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
           tmp.delete()
         }
       case None =>
-        if (historicize(text)) echo("Placing text in recent history.")
+        if (history.historicize(text)) echo("Placing text in recent history.")
         else echo(f"No EDITOR defined and you can't change history, echoing your text:%n$text")
     }
 
@@ -565,10 +546,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
         }
       import scala.collection.JavaConverters._
       val index = (start - 1) max 0
-      val text = history match {
-        case jlh: JLineHistory => jlh.entries(index).asScala.take(len) map (_.value) mkString "\n"
-        case _ => history.asStrings.slice(index, index + len) mkString "\n"
-      }
+      val text = history.asStrings(index, index + len) mkString "\n"
       edit(text)
     } catch {
       case _: NumberFormatException => echo(s"Bad range '$what'")
@@ -679,12 +657,9 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
     unleashAndSetPhase()
     asyncEcho(isDuringInit, power.banner)
   }
-  private def unleashAndSetPhase() {
-    if (isReplPower) {
-      power.unleash()
-      // Set the phase to "typer"
-      intp beSilentDuring phaseCommand("typer")
-    }
+  private def unleashAndSetPhase() = if (isReplPower) {
+    power.unleash()
+    intp beSilentDuring phaseCommand("typer") // Set the phase to "typer"
   }
 
   def asyncEcho(async: Boolean, msg: => String) {
@@ -693,9 +668,8 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
   }
 
   def verbosity() = {
-    val old = intp.printResults
-    intp.printResults = !old
-    echo("Switched " + (if (old) "off" else "on") + " result printing.")
+    intp.printResults = !intp.printResults
+    replinfo(s"Result printing is ${ if (intp.printResults) "on" else "off" }.")
   }
 
   /** Run one command submitted by the user.  Two values are returned:
@@ -720,25 +694,37 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
     Iterator continually in.readLine("") takeWhile (x => x != null && cond(x))
   }
 
+  /* :paste -raw file
+   * or
+   * :paste < EOF
+   *   your code
+   * EOF
+   * :paste <~ EOF
+   *   ~your code
+   * EOF
+   */
   def pasteCommand(arg: String): Result = {
     var shouldReplay: Option[String] = None
     def result = Result(keepRunning = true, shouldReplay)
-    val (raw, file) =
-      if (arg.isEmpty) (false, None)
+    val (raw, file, margin) =
+      if (arg.isEmpty) (false, None, None)
       else {
-        val r = """(-raw)?(\s+)?([^\-]\S*)?""".r
-        arg match {
-          case r(flag, sep, name) =>
-            if (flag != null && name != null && sep == null)
-              echo(s"""I assume you mean "$flag $name"?""")
-            (flag != null, Option(name))
-          case _ =>
-            echo("usage: :paste -raw file")
-            return result
+        def maybeRaw(ss: List[String]) = if (ss.nonEmpty && ss.head == "-raw") (true, ss.tail) else (false, ss)
+        def maybeHere(ss: List[String]) =
+          if (ss.nonEmpty && ss.head.startsWith("<")) (ss.head.dropWhile(_ == '<'), ss.tail)
+          else (null, ss)
+
+        val (raw0, ss0) = maybeRaw(words(arg))
+        val (margin0, ss1) = maybeHere(ss0)
+        val file0 = ss1 match {
+          case Nil      => null
+          case x :: Nil => x
+          case _        => echo("usage: :paste [-raw] file | < EOF") ; return result
         }
+        (raw0, Option(file0), Option(margin0))
       }
-    val code = file match {
-      case Some(name) =>
+    val code = (file, margin) match {
+      case (Some(name), None) =>
         withFile(name) { f =>
           shouldReplay = Some(s":paste $arg")
           val s = f.slurp.trim
@@ -746,9 +732,16 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
           else echo(s"Pasting file $f...")
           s
         } getOrElse ""
-      case None =>
-        echo("// Entering paste mode (ctrl-D to finish)\n")
-        val text = (readWhile(_ => true) mkString "\n").trim
+      case (eof, _) =>
+        echo(s"// Entering paste mode (${ eof getOrElse "ctrl-D" } to finish)\n")
+        val delimiter = eof orElse replProps.pasteDelimiter.option
+        val input = readWhile(s => delimiter.isEmpty || delimiter.get != s) mkString "\n"
+        val text = (
+          margin filter (_.nonEmpty) map {
+            case "-" => input.lines map (_.trim) mkString "\n"
+            case m   => input stripMargin m.head   // ignore excess chars in "<<||"
+          } getOrElse input
+        ).trim
         if (text.isEmpty) echo("\n// Nothing pasted, nothing gained.\n")
         else echo("\n// Exiting paste mode, now interpreting.\n")
         text
@@ -773,22 +766,16 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
     result
   }
 
-  private object paste extends Pasted {
-    val ContinueString = "     | "
-    val PromptString   = "scala> "
-
-    def interpret(line: String): Unit = {
-      echo(line.trim)
-      intp interpret line
-      echo("")
-    }
+  private object paste extends Pasted(prompt) {
+    def interpret(line: String) = intp interpret line
+    def echo(message: String)   = ILoop.this echo message
+  }
 
-    def transcript(start: String) = {
-      echo("\n// Detected repl transcript paste: ctrl-D to finish.\n")
-      apply(Iterator(start) ++ readWhile(_.trim != PromptString.trim))
-    }
+  private object invocation {
+    def unapply(line: String): Boolean = Completion.looksLikeInvocation(line)
   }
-  import paste.{ ContinueString, PromptString }
+
+  private val lineComment = """\s*//.*""".r   // all comment
 
   /** Interpret expressions starting with the first line.
     * Read lines until a complete compilation unit is available
@@ -796,57 +783,50 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
     * read, go ahead and interpret it.  Return the full string
     * to be recorded for replay, if any.
     */
-  def interpretStartingWith(code: String): Option[String] = {
+  final def interpretStartingWith(code: String): Option[String] = {
     // signal completion non-completion input has been received
     in.completion.resetVerbosity()
 
-    def reallyInterpret = {
-      val reallyResult = intp.interpret(code)
-      (reallyResult, reallyResult match {
-        case IR.Error       => None
-        case IR.Success     => Some(code)
-        case IR.Incomplete  =>
-          if (in.interactive && code.endsWith("\n\n")) {
-            echo("You typed two blank lines.  Starting a new command.")
-            None
-          }
-          else in.readLine(ContinueString) match {
-            case null =>
-              // we know compilation is going to fail since we're at EOF and the
-              // parser thinks the input is still incomplete, but since this is
-              // a file being read non-interactively we want to fail.  So we send
-              // it straight to the compiler for the nice error message.
-              intp.compileString(code)
-              None
-
-            case line => interpretStartingWith(code + "\n" + line)
-          }
-      })
-    }
-
-    /** Here we place ourselves between the user and the interpreter and examine
-     *  the input they are ostensibly submitting.  We intervene in several cases:
+    /* Here we place ourselves between the user and the interpreter and examine
+     * the input they are ostensibly submitting.  We intervene in several cases:
      *
-     *  1) If the line starts with "scala> " it is assumed to be an interpreter paste.
-     *  2) If the line starts with "." (but not ".." or "./") it is treated as an invocation
-     *     on the previous result.
-     *  3) If the Completion object's execute returns Some(_), we inject that value
-     *     and avoid the interpreter, as it's likely not valid scala code.
+     * 1) If the line starts with "scala> " it is assumed to be an interpreter paste.
+     * 2) If the line starts with "." (but not ".." or "./") it is treated as an invocation
+     *    on the previous result.
+     * 3) If the Completion object's execute returns Some(_), we inject that value
+     *    and avoid the interpreter, as it's likely not valid scala code.
      */
-    if (code == "") None
-    else if (!paste.running && code.trim.startsWith(PromptString)) {
-      paste.transcript(code)
-      None
-    }
-    else if (Completion.looksLikeInvocation(code) && intp.mostRecentVar != "") {
-      interpretStartingWith(intp.mostRecentVar + code)
-    }
-    else if (code.trim startsWith "//") {
-      // line comment, do nothing
-      None
+    code match {
+      case ""                                       => None
+      case lineComment()                            => None                 // line comment, do nothing
+      case paste() if !paste.running                => paste.transcript(Iterator(code) ++ readWhile(!paste.isPromptOnly(_))) match {
+                                                         case Some(s) => interpretStartingWith(s)
+                                                         case _       => None
+                                                       }
+      case invocation() if intp.mostRecentVar != "" => interpretStartingWith(intp.mostRecentVar + code)
+      case _                                        => intp.interpret(code) match {
+        case IR.Error      => None
+        case IR.Success    => Some(code)
+        case IR.Incomplete if in.interactive && code.endsWith("\n\n") =>
+          echo("You typed two blank lines.  Starting a new command.")
+          None
+        case IR.Incomplete =>
+          val saved = intp.partialInput
+          intp.partialInput = code + "\n"
+          try {
+            in.readLine(paste.ContinuePrompt) match {
+              case null =>
+                // we know compilation is going to fail since we're at EOF and the
+                // parser thinks the input is still incomplete, but since this is
+                // a file being read non-interactively we want to fail.  So we send
+                // it straight to the compiler for the nice error message.
+                intp.compileString(code)
+                None
+              case line => interpretStartingWith(s"$code\n$line")
+            }
+          } finally intp.partialInput = saved
+      }
     }
-    else
-      reallyInterpret._2
   }
 
   // runs :load `file` on any files passed via -i
@@ -861,21 +841,47 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
     case _ =>
   }
 
-  /** Tries to create a JLineReader, falling back to SimpleReader:
-   *  unless settings or properties are such that it should start
-   *  with SimpleReader.
+  /** Tries to create a JLineReader, falling back to SimpleReader,
+   *  unless settings or properties are such that it should start with SimpleReader.
+   *  The constructor of the InteractiveReader must take a Completion strategy,
+   *  supplied as a `() => Completion`; the Completion object provides a concrete Completer.
    */
   def chooseReader(settings: Settings): InteractiveReader = {
-    if (settings.Xnojline || Properties.isEmacsShell)
-      SimpleReader()
-    else try new JLineReader(
-      if (settings.noCompletion) NoCompletion
-      else new JLineCompletion(intp)
-    )
-    catch {
-      case ex @ (_: Exception | _: NoClassDefFoundError) =>
-        echo(f"Failed to created JLineReader: ${ex}%nFalling back to SimpleReader.")
-        SimpleReader()
+    if (settings.Xnojline || Properties.isEmacsShell) SimpleReader()
+    else {
+      type Completer = () => Completion
+      type ReaderMaker = Completer => InteractiveReader
+
+      def instantiater(className: String): ReaderMaker = completer => {
+        if (settings.debug) Console.println(s"Trying to instantiate an InteractiveReader from $className")
+        Class.forName(className).getConstructor(classOf[Completer]).
+          newInstance(completer).
+          asInstanceOf[InteractiveReader]
+      }
+
+      def mkReader(maker: ReaderMaker) = maker { () =>
+        settings.completion.value match {
+          case _ if settings.noCompletion => NoCompletion
+          case "none"   => NoCompletion
+          case "adhoc"  => new JLineCompletion(intp) // JLineCompletion is a misnomer; it's not tied to jline
+          case "pc" | _ => new PresentationCompilerCompleter(intp)
+        }
+      }
+
+      def internalClass(kind: String) = s"scala.tools.nsc.interpreter.$kind.InteractiveReader"
+      val readerClasses = sys.props.get("scala.repl.reader").toStream ++ Stream(internalClass("jline"), internalClass("jline_embedded"))
+      val readers = readerClasses map (cls => Try { mkReader(instantiater(cls)) })
+
+      val reader = (readers collect { case Success(reader) => reader } headOption) getOrElse SimpleReader()
+
+      if (settings.debug) {
+        val readerDiags = (readerClasses, readers).zipped map {
+          case (cls, Failure(e)) => s"  - $cls --> \n\t" + scala.tools.nsc.util.stackTraceString(e) + "\n"
+          case (cls, Success(_)) => s"  - $cls OK"
+        }
+        Console.println(s"All InteractiveReaders tried: ${readerDiags.mkString("\n","\n","\n")}")
+      }
+      reader
     }
   }
 
@@ -896,10 +902,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
       asyncMessage(power.banner)
     }
     // SI-7418 Now, and only now, can we enable TAB completion.
-    in match {
-      case x: JLineReader => x.consoleReader.postInit
-      case _              =>
-    }
+    in.postInit()
   }
 
   // start an interpreter with the given settings
@@ -937,25 +940,31 @@ object ILoop {
   // Designed primarily for use by test code: take a String with a
   // bunch of code, and prints out a transcript of what it would look
   // like if you'd just typed it into the repl.
-  def runForTranscript(code: String, settings: Settings): String = {
+  def runForTranscript(code: String, settings: Settings, inSession: Boolean = false): String = {
     import java.io.{ BufferedReader, StringReader, OutputStreamWriter }
 
     stringFromStream { ostream =>
       Console.withOut(ostream) {
         val output = new JPrintWriter(new OutputStreamWriter(ostream), true) {
-          override def write(str: String) = {
-            // completely skip continuation lines
-            if (str forall (ch => ch.isWhitespace || ch == '|')) ()
+          // skip margin prefix for continuation lines, unless preserving session text for test
+          // should test for repl.paste.ContinueString or replProps.continueText.contains(ch)
+          override def write(str: String) =
+            if (!inSession && (str forall (ch => ch.isWhitespace || ch == '|'))) ()
             else super.write(str)
-          }
         }
         val input = new BufferedReader(new StringReader(code.trim + "\n")) {
           override def readLine(): String = {
-            val s = super.readLine()
-            // helping out by printing the line being interpreted.
-            if (s != null)
+            mark(1)    // default buffer is 8k
+            val c = read()
+            if (c == -1 || c == 4) {
+              null
+            } else {
+              reset()
+              val s = super.readLine()
+              // helping out by printing the line being interpreted.
               output.println(s)
-            s
+              s
+            }
           }
         }
         val repl = new ILoop(input, output)
diff --git a/src/repl/scala/tools/nsc/interpreter/IMain.scala b/src/repl/scala/tools/nsc/interpreter/IMain.scala
index 0347622..ef6ab40 100644
--- a/src/repl/scala/tools/nsc/interpreter/IMain.scala
+++ b/src/repl/scala/tools/nsc/interpreter/IMain.scala
@@ -15,10 +15,13 @@ import scala.concurrent.{ Future, ExecutionContext }
 import scala.reflect.runtime.{ universe => ru }
 import scala.reflect.{ ClassTag, classTag }
 import scala.reflect.internal.util.{ BatchSourceFile, SourceFile }
+import scala.tools.nsc.interactive
+import scala.tools.nsc.reporters.StoreReporter
+import scala.tools.nsc.util.ClassPath.DefaultJavaContext
 import scala.tools.util.PathResolverFactory
 import scala.tools.nsc.io.AbstractFile
 import scala.tools.nsc.typechecker.{ TypeStrings, StructuredTypeStrings }
-import scala.tools.nsc.util.{ ScalaClassLoader, stringFromReader, stringFromWriter, StackTraceOps, ClassPath, MergedClassPath }
+import scala.tools.nsc.util._
 import ScalaClassLoader.URLClassLoader
 import scala.tools.nsc.util.Exceptional.unwrap
 import scala.tools.nsc.backend.JavaPlatform
@@ -58,7 +61,7 @@ import java.io.File
  *  @author Moez A. Abdel-Gawad
  *  @author Lex Spoon
  */
-class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Settings, protected val out: JPrintWriter) extends AbstractScriptEngine with Compilable with Imports {
+class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Settings, protected val out: JPrintWriter) extends AbstractScriptEngine with Compilable with Imports with PresentationCompilation {
   imain =>
 
   setBindings(createBindings, ScriptContext.ENGINE_SCOPE)
@@ -69,12 +72,15 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
   // Used in a test case.
   def showDirectory() = replOutput.show(out)
 
+  lazy val isClassBased: Boolean = settings.Yreplclassbased.value
+
   private[nsc] var printResults               = true      // whether to print result lines
   private[nsc] var totalSilence               = false     // whether to print anything
   private var _initializeComplete             = false     // compiler is initialized
   private var _isInitialized: Future[Boolean] = null      // set up initialization future
   private var bindExceptions                  = true      // whether to bind the lastException variable
   private var _executionWrapper               = ""        // code to be wrapped around all lines
+  var partialInput: String = ""                           // code accumulated in multi-line REPL input
 
   /** We're going to go to some trouble to initialize the compiler asynchronously.
    *  It's critical that nothing call into it until it's been initialized or we will
@@ -110,12 +116,11 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
   def this(factory: ScriptEngineFactory) = this(factory, new Settings())
   def this() = this(new Settings())
 
-  lazy val formatting: Formatting = new Formatting {
-    val prompt = Properties.shellPromptString
-  }
+  // the expanded prompt but without color escapes and without leading newline, for purposes of indenting
+  lazy val formatting = Formatting.forPrompt(replProps.promptText)
   lazy val reporter: ReplReporter = new ReplReporter(this)
 
-  import formatting._
+  import formatting.indentCode
   import reporter.{ printMessage, printUntruncatedMessage }
 
   // This exists mostly because using the reporter too early leads to deadlock.
@@ -132,7 +137,6 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
     }
     catch AbstractOrMissingHandler()
   }
-  private def tquoted(s: String) = "\"\"\"" + s + "\"\"\""
   private val logScope = scala.sys.props contains "scala.repl.scope"
   private def scopelog(msg: String) = if (logScope) Console.err.println(msg)
 
@@ -309,9 +313,15 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
     def shift[T](op: => T): T = exitingFlatten(op)
   }
 
-  def originalPath(name: String): String = originalPath(name: TermName)
-  def originalPath(name: Name): String   = typerOp path name
-  def originalPath(sym: Symbol): String  = typerOp path sym
+  def originalPath(name: String): String = originalPath(TermName(name))
+  def originalPath(name: Name): String   = translateOriginalPath(typerOp path name)
+  def originalPath(sym: Symbol): String  = translateOriginalPath(typerOp path sym)
+  /** For class based repl mode we use an .INSTANCE accessor. */
+  val readInstanceName = if(isClassBased) ".INSTANCE" else ""
+  def translateOriginalPath(p: String): String = {
+    val readName = java.util.regex.Matcher.quoteReplacement(sessionNames.read)
+    p.replaceFirst(readName, readName + readInstanceName)
+  }
   def flatPath(sym: Symbol): String      = flatOp shift sym.javaClassName
 
   def translatePath(path: String) = {
@@ -440,7 +450,7 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
 
   /** Build a request from the user. `trees` is `line` after being parsed.
    */
-  private def buildRequest(line: String, trees: List[Tree]): Request = {
+  private[interpreter] def buildRequest(line: String, trees: List[Tree]): Request = {
     executingRequest = new Request(line, trees)
     executingRequest
   }
@@ -459,11 +469,12 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
     pos
   }
 
-  private def requestFromLine(line: String, synthetic: Boolean): Either[IR.Result, Request] = {
-    val content = indentCode(line)
-    val trees = parse(content) match {
-      case parse.Incomplete     => return Left(IR.Incomplete)
-      case parse.Error          => return Left(IR.Error)
+  private[interpreter] def requestFromLine(line: String, synthetic: Boolean): Either[IR.Result, Request] = {
+    val content = line
+
+    val trees: List[global.Tree] = parse(content) match {
+      case parse.Incomplete(_)     => return Left(IR.Incomplete)
+      case parse.Error(_)          => return Left(IR.Error)
       case parse.Success(trees) => trees
     }
     repltrace(
@@ -758,11 +769,13 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
     // object and we can do that much less wrapping.
     def packageDecl = "package " + packageName
 
+    def pathToInstance(name: String)   = packageName + "." + name + readInstanceName
     def pathTo(name: String)   = packageName + "." + name
     def packaged(code: String) = packageDecl + "\n\n" + code
 
-    def readPath  = pathTo(readName)
-    def evalPath  = pathTo(evalName)
+    def readPathInstance  = pathToInstance(readName)
+    def readPath = pathTo(readName)
+    def evalPath = pathTo(evalName)
 
     def call(name: String, args: Any*): AnyRef = {
       val m = evalMethod(name)
@@ -802,7 +815,8 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
     /** The innermost object inside the wrapper, found by
       * following accessPath into the outer one.
       */
-    def resolvePathToSymbol(accessPath: String): Symbol = {
+    def resolvePathToSymbol(fullAccessPath: String): Symbol = {
+      val accessPath = fullAccessPath.stripPrefix(readPath)
       val readRoot = readRootPath(readPath) // the outermost wrapper
       (accessPath split '.').foldLeft(readRoot: Symbol) {
         case (sym, "")    => sym
@@ -845,11 +859,10 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
   }
 
   /** One line of code submitted by the user for interpretation */
-  class Request(val line: String, val trees: List[Tree]) {
+  class Request(val line: String, val trees: List[Tree], generousImports: Boolean = false) {
     def defines    = defHandlers flatMap (_.definedSymbols)
     def imports    = importedSymbols
     def value      = Some(handlers.last) filter (h => h.definesValue) map (h => definedSymbols(h.definesTerm.get)) getOrElse NoSymbol
-
     val lineRep = new ReadEvalPrint()
 
     private var _originalLine: String = null
@@ -858,6 +871,11 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
 
     /** handlers for each tree in this request */
     val handlers: List[MemberHandler] = trees map (memberHandlers chooseHandler _)
+    val definesClass = handlers.exists {
+      case _: ClassHandler => true
+      case _ => false
+    }
+
     def defHandlers = handlers collect { case x: MemberDefHandler => x }
 
     /** list of names used by this expression */
@@ -874,14 +892,14 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
     /** Code to import bound names from previous lines - accessPath is code to
       * append to objectName to access anything bound by request.
       */
-    lazy val ComputedImports(importsPreamble, importsTrailer, accessPath) =
-      exitingTyper(importsCode(referencedNames.toSet, ObjectSourceCode))
+    lazy val ComputedImports(headerPreamble, importsPreamble, importsTrailer, accessPath) =
+      exitingTyper(importsCode(referencedNames.toSet, ObjectSourceCode, definesClass, generousImports))
 
     /** the line of code to compute */
     def toCompute = line
 
     /** The path of the value that contains the user code. */
-    def fullAccessPath = s"${lineRep.readPath}$accessPath"
+    def fullAccessPath = s"${lineRep.readPathInstance}$accessPath"
 
     /** The path of the given member of the wrapping instance. */
     def fullPath(vname: String) = s"$fullAccessPath.`$vname`"
@@ -891,13 +909,18 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
       def path = originalPath("$intp")
       def envLines = {
         if (!isReplPower) Nil // power mode only for now
-        else List("def %s = %s".format("$line", tquoted(originalLine)), "def %s = Nil".format("$trees"))
+        else {
+          val escapedLine = Constant(originalLine).escapedStringValue
+          List(s"""def $$line = $escapedLine """, """def $trees = _root_.scala.Nil""")
+        }
       }
       def preamble = s"""
-        |$preambleHeader
-        |%s%s%s
-      """.stripMargin.format(lineRep.readName, envLines.map("  " + _ + ";\n").mkString,
-        importsPreamble, indentCode(toCompute))
+        |$headerPreamble
+        |${preambleHeader format lineRep.readName}
+        |${envLines mkString ("  ", ";\n  ", ";\n")}
+        |$importsPreamble
+        |${indentCode(toCompute)}""".stripMargin
+      def preambleLength = preamble.length - toCompute.length - 1
 
       val generate = (m: MemberHandler) => m extraCodeToEvaluate Request.this
 
@@ -911,7 +934,7 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
       def postwrap: String
     }
 
-    private class ObjectBasedWrapper extends Wrapper {
+    class ObjectBasedWrapper extends Wrapper {
       def preambleHeader = "object %s {"
 
       def postamble = importsTrailer + "\n}"
@@ -919,13 +942,16 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
       def postwrap = "}\n"
     }
 
-    private class ClassBasedWrapper extends Wrapper {
-      def preambleHeader = "class %s extends Serializable {"
+    class ClassBasedWrapper extends Wrapper {
+      def preambleHeader = "class %s extends Serializable { "
 
       /** Adds an object that instantiates the outer wrapping class. */
-      def postamble  = s"""$importsTrailer
+      def postamble  = s"""
+                          |$importsTrailer
+                          |}
+                          |object ${lineRep.readName} {
+                          |   val INSTANCE = new ${lineRep.readName}();
                           |}
-                          |object ${lineRep.readName} extends ${lineRep.readName}
                           |""".stripMargin
 
       import nme.{ INTERPRETER_IMPORT_WRAPPER => iw }
@@ -934,8 +960,8 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
       def postwrap = s"}\nval $iw = new $iw\n"
     }
 
-    private lazy val ObjectSourceCode: Wrapper =
-      if (settings.Yreplclassbased) new ClassBasedWrapper else new ObjectBasedWrapper
+    private[interpreter] lazy val ObjectSourceCode: Wrapper =
+      if (isClassBased) new ClassBasedWrapper else new ObjectBasedWrapper
 
     private object ResultObjectSourceCode extends IMain.CodeAssembler[MemberHandler] {
       /** We only want to generate this code when the result
@@ -994,7 +1020,8 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
       }
     }
 
-    lazy val resultSymbol = lineRep.resolvePathToSymbol(accessPath)
+    lazy val resultSymbol = lineRep.resolvePathToSymbol(fullAccessPath)
+
     def applyToResultMember[T](name: Name, f: Symbol => T) = exitingTyper(f(resultSymbol.info.nonPrivateDecl(name)))
 
     /* typeOf lookup with encoding */
@@ -1106,8 +1133,8 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
   def tryTwice(op: => Symbol): Symbol = exitingTyper(op) orElse exitingFlatten(op)
 
   def symbolOfIdent(id: String): Symbol  = symbolOfType(id) orElse symbolOfTerm(id)
-  def symbolOfType(id: String): Symbol   = tryTwice(replScope lookup (id: TypeName))
-  def symbolOfTerm(id: String): Symbol   = tryTwice(replScope lookup (id: TermName))
+  def symbolOfType(id: String): Symbol   = tryTwice(replScope lookup TypeName(id))
+  def symbolOfTerm(id: String): Symbol   = tryTwice(replScope lookup TermName(id))
   def symbolOfName(id: Name): Symbol     = replScope lookup id
 
   def runtimeClassAndTypeOfTerm(id: String): Option[(JClass, Type)] = {
@@ -1148,20 +1175,22 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
 
   /** Parse a line into and return parsing result (error, incomplete or success with list of trees) */
   object parse {
-    abstract sealed class Result
-    case object Error extends Result
-    case object Incomplete extends Result
+    abstract sealed class Result { def trees: List[Tree] }
+    case class Error(trees: List[Tree]) extends Result
+    case class Incomplete(trees: List[Tree]) extends Result
     case class Success(trees: List[Tree]) extends Result
 
     def apply(line: String): Result = debugging(s"""parse("$line")""")  {
       var isIncomplete = false
-      currentRun.parsing.withIncompleteHandler((_, _) => isIncomplete = true) {
+      def parse = {
         reporter.reset()
         val trees = newUnitParser(line).parseStats()
-        if (reporter.hasErrors) Error
-        else if (isIncomplete) Incomplete
+        if (reporter.hasErrors) Error(trees)
+        else if (isIncomplete) Incomplete(trees)
         else Success(trees)
       }
+      currentRun.parsing.withIncompleteHandler((_, _) => isIncomplete = true) {parse}
+
     }
   }
 
@@ -1244,6 +1273,8 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
 /** Utility methods for the Interpreter. */
 object IMain {
   import java.util.Arrays.{ asList => asJavaList }
+  /** Dummy identifier fragement inserted at the cursor before presentation compilation. Needed to support completion of `global.def<TAB>` */
+  val DummyCursorFragment = "_CURSOR_"
 
   class Factory extends ScriptEngineFactory {
     @BeanProperty
@@ -1341,3 +1372,4 @@ object IMain {
     def stripImpl(str: String): String = naming.unmangle(str)
   }
 }
+
diff --git a/src/repl/scala/tools/nsc/interpreter/Imports.scala b/src/repl/scala/tools/nsc/interpreter/Imports.scala
index 5244858..5742c1d 100644
--- a/src/repl/scala/tools/nsc/interpreter/Imports.scala
+++ b/src/repl/scala/tools/nsc/interpreter/Imports.scala
@@ -70,7 +70,10 @@ trait Imports {
 
   /** Compute imports that allow definitions from previous
    *  requests to be visible in a new request.  Returns
-   *  three pieces of related code:
+   *  three or four pieces of related code:
+   *
+   *  0. Header code fragment that should go at the beginning
+   *  of the compilation unit, specifically, import Predef.
    *
    *  1. An initial code fragment that should go before
    *  the code of the new request.
@@ -91,28 +94,36 @@ trait Imports {
    * (3) It imports multiple same-named implicits, but only the
    * last one imported is actually usable.
    */
-  case class ComputedImports(prepend: String, append: String, access: String)
-  protected def importsCode(wanted: Set[Name], wrapper: Request#Wrapper): ComputedImports = {
+  case class ComputedImports(header: String, prepend: String, append: String, access: String)
+
+  protected def importsCode(wanted: Set[Name], wrapper: Request#Wrapper, definesClass: Boolean, generousImports: Boolean): ComputedImports = {
+    val header, code, trailingBraces, accessPath = new StringBuilder
+    val currentImps = mutable.HashSet[Name]()
+    var predefEscapes = false      // only emit predef import header if name not resolved in history, loosely
+
     /** Narrow down the list of requests from which imports
      *  should be taken.  Removes requests which cannot contribute
      *  useful imports for the specified set of wanted names.
      */
-    case class ReqAndHandler(req: Request, handler: MemberHandler) { }
+    case class ReqAndHandler(req: Request, handler: MemberHandler)
 
     def reqsToUse: List[ReqAndHandler] = {
       /** Loop through a list of MemberHandlers and select which ones to keep.
-        * 'wanted' is the set of names that need to be imported.
+       *  'wanted' is the set of names that need to be imported.
        */
       def select(reqs: List[ReqAndHandler], wanted: Set[Name]): List[ReqAndHandler] = {
         // Single symbol imports might be implicits! See bug #1752.  Rather than
         // try to finesse this, we will mimic all imports for now.
         def keepHandler(handler: MemberHandler) = handler match {
-          case _: ImportHandler => true
-          case x                => x.definesImplicit || (x.definedNames exists wanted)
+          // While defining classes in class based mode - implicits are not needed.
+          case h: ImportHandler if isClassBased && definesClass => h.importedNames.exists(x => wanted.contains(x))
+          case _: ImportHandler     => true
+          case x if generousImports => x.definesImplicit || (x.definedNames exists (d => wanted.exists(w => d.startsWith(w))))
+          case x                    => x.definesImplicit || (x.definedNames exists wanted)
         }
 
         reqs match {
-          case Nil                                    => Nil
+          case Nil                                    => predefEscapes = wanted contains PredefModule.name ; Nil
           case rh :: rest if !keepHandler(rh.handler) => select(rest, wanted)
           case rh :: rest                             =>
             import rh.handler._
@@ -125,9 +136,6 @@ trait Imports {
       select(allReqAndHandlers reverseMap { case (r, h) => ReqAndHandler(r, h) }, wanted).reverse
     }
 
-    val code, trailingBraces, accessPath = new StringBuilder
-    val currentImps = mutable.HashSet[Name]()
-
     // add code for a new object to hold some imports
     def addWrapper() {
       import nme.{ INTERPRETER_IMPORT_WRAPPER => iw }
@@ -144,10 +152,19 @@ trait Imports {
       try op finally addWrapper()
     }
 
+    // imports from Predef are relocated to the template header to allow hiding.
+    def checkHeader(h: ImportHandler) = h.referencedNames contains PredefModule.name
+
     // loop through previous requests, adding imports for each one
     wrapBeforeAndAfter {
+      // Reusing a single temporary value when import from a line with multiple definitions.
+      val tempValLines = mutable.Set[Int]()
       for (ReqAndHandler(req, handler) <- reqsToUse) {
+        val objName = req.lineRep.readPathInstance
         handler match {
+          case h: ImportHandler if checkHeader(h) =>
+            header.clear()
+            header append f"${h.member}%n"
           // If the user entered an import, then just use it; add an import wrapping
           // level if the import might conflict with some other import
           case x: ImportHandler if x.importsWildcard =>
@@ -157,6 +174,23 @@ trait Imports {
             code append (x.member + "\n")
             currentImps ++= x.importedNames
 
+          case x if isClassBased =>
+            for (imv <- x.definedNames) {
+              if (!currentImps.contains(imv)) {
+                x match {
+                  case _: ClassHandler =>
+                    code.append("import " + objName + req.accessPath + ".`" + imv + "`\n")
+                  case _ =>
+                    val valName = req.lineRep.packageName + req.lineRep.readName
+                    if (!tempValLines.contains(req.lineRep.lineId)) {
+                      code.append(s"val $valName = $objName\n")
+                      tempValLines += req.lineRep.lineId
+                    }
+                    code.append(s"import $valName${req.accessPath}.`$imv`;\n")
+                }
+                currentImps += imv
+              }
+            }
           // For other requests, import each defined name.
           // import them explicitly instead of with _, so that
           // ambiguity errors will not be generated. Also, quote
@@ -172,7 +206,8 @@ trait Imports {
       }
     }
 
-    ComputedImports(code.toString, trailingBraces.toString, accessPath.toString)
+    val computedHeader = if (predefEscapes) header.toString else ""
+    ComputedImports(computedHeader, code.toString, trailingBraces.toString, accessPath.toString)
   }
 
   private def allReqAndHandlers =
diff --git a/src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala b/src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala
index ed69d44..71753a3 100644
--- a/src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala
+++ b/src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala
@@ -13,6 +13,8 @@ import Properties.isMac
 
 /** Reads lines from an input stream */
 trait InteractiveReader {
+  def postInit(): Unit = {}
+
   val interactive: Boolean
 
   def reset(): Unit
diff --git a/src/repl/scala/tools/nsc/interpreter/JLineCompletion.scala b/src/repl/scala/tools/nsc/interpreter/JLineCompletion.scala
index c1122d4..c2ccfc8 100644
--- a/src/repl/scala/tools/nsc/interpreter/JLineCompletion.scala
+++ b/src/repl/scala/tools/nsc/interpreter/JLineCompletion.scala
@@ -9,9 +9,11 @@ package interpreter
 import Completion._
 import scala.collection.mutable.ListBuffer
 import scala.reflect.internal.util.StringOps.longestCommonPrefix
+import scala.tools.nsc.interactive.Global
 
 // REPL completor - queries supplied interpreter for valid
 // completions based on current contents of buffer.
+// TODO: change class name to reflect it's not specific to jline (nor does it depend on it)
 class JLineCompletion(val intp: IMain) extends Completion with CompletionOutput {
   val global: intp.global.type = intp.global
   import global._
@@ -173,7 +175,7 @@ class JLineCompletion(val intp: IMain) extends Completion with CompletionOutput
         case Some((clazz, runtimeType)) =>
           val sym = intp.symbolOfTerm(id)
           if (sym.isStable) {
-            val param = new NamedParam.Untyped(id, intp valueOfTerm id getOrElse null)
+            val param = new NamedParam.Untyped(id, intp valueOfTerm id orNull)
             Some(TypeMemberCompletion(tpe, runtimeType, param))
           }
           else default
@@ -295,7 +297,6 @@ class JLineCompletion(val intp: IMain) extends Completion with CompletionOutput
     override def complete(buf: String, cursor: Int): Candidates = {
       verbosity = if (isConsecutiveTabs(buf, cursor)) verbosity + 1 else 0
       repldbg(f"%ncomplete($buf, $cursor%d) last = ($lastBuf, $lastCursor%d), verbosity: $verbosity")
-
       // we don't try lower priority completions unless higher ones return no results.
       def tryCompletion(p: Parsed, completionFunction: Parsed => List[String]): Option[Candidates] = {
         val winners = completionFunction(p)
diff --git a/src/repl/scala/tools/nsc/interpreter/JLineReader.scala b/src/repl/scala/tools/nsc/interpreter/JLineReader.scala
deleted file mode 100644
index b6e834a..0000000
--- a/src/repl/scala/tools/nsc/interpreter/JLineReader.scala
+++ /dev/null
@@ -1,75 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Stepan Koltsov
- */
-
-package scala.tools.nsc
-package interpreter
-
-import jline.console.ConsoleReader
-import jline.console.completer._
-import session._
-import Completion._
-
-/**
- *  Reads from the console using JLine.
- */
-class JLineReader(_completion: => Completion) extends InteractiveReader {
-  val interactive = true
-  val consoleReader = new JLineConsoleReader()
-
-  lazy val completion = _completion
-  lazy val history: JLineHistory = JLineHistory()
-
-  private def term = consoleReader.getTerminal()
-  def reset() = term.reset()
-
-  def scalaToJline(tc: ScalaCompleter): Completer = new Completer {
-    def complete(_buf: String, cursor: Int, candidates: JList[CharSequence]): Int = {
-      val buf   = if (_buf == null) "" else _buf
-      val Candidates(newCursor, newCandidates) = tc.complete(buf, cursor)
-      newCandidates foreach (candidates add _)
-      newCursor
-    }
-  }
-
-  class JLineConsoleReader extends ConsoleReader with ConsoleReaderHelper with VariColumnTabulator {
-    val isAcross = interpreter.`package`.isAcross
-
-    this setPaginationEnabled interpreter.`package`.isPaged
-
-    // ASAP
-    this setExpandEvents false
-
-    // working around protected/trait/java insufficiencies.
-    def goBack(num: Int): Unit = back(num)
-    if ((history: History) ne NoHistory)
-      this setHistory history
-
-    def readOneKey(prompt: String) = {
-      this.print(prompt)
-      this.flush()
-      this.readCharacter()
-    }
-    def eraseLine() = consoleReader.resetPromptLine("", "", 0)
-    def redrawLineAndFlush(): Unit = { flush() ; drawLine() ; flush() }
-
-    // A hook for running code after the repl is done initializing.
-    lazy val postInit: Unit = {
-      this setBellEnabled false
-
-      if (completion ne NoCompletion) {
-        val argCompletor: ArgumentCompleter =
-          new ArgumentCompleter(new JLineDelimiter, scalaToJline(completion.completer()))
-        argCompletor setStrict false
-
-        this addCompleter argCompletor
-        this setAutoprintThreshold 400 // max completion candidates without warning
-      }
-    }
-  }
-
-  def redrawLine() = consoleReader.redrawLineAndFlush()
-  def readOneLine(prompt: String) = consoleReader readLine prompt
-  def readOneKey(prompt: String)  = consoleReader readOneKey prompt
-}
diff --git a/src/repl/scala/tools/nsc/interpreter/JavapClass.scala b/src/repl/scala/tools/nsc/interpreter/JavapClass.scala
index c80b94b..9ad9479 100644
--- a/src/repl/scala/tools/nsc/interpreter/JavapClass.scala
+++ b/src/repl/scala/tools/nsc/interpreter/JavapClass.scala
@@ -8,6 +8,7 @@ package tools.nsc
 package interpreter
 
 import java.lang.{ ClassLoader => JavaClassLoader, Iterable => JIterable }
+import scala.tools.asm.Opcodes
 import scala.tools.nsc.util.ScalaClassLoader
 import java.io.{ ByteArrayInputStream, CharArrayWriter, FileNotFoundException, PrintWriter, StringWriter, Writer }
 import java.util.{ Locale }
@@ -599,11 +600,11 @@ object JavapClass {
     def parents: List[ClassLoader] = parentsOf(loader)
     /* all file locations */
     def locations = {
-      def alldirs = parents flatMap (_ match {
+      def alldirs = parents flatMap {
         case ucl: ScalaClassLoader.URLClassLoader => ucl.classPathURLs
         case jcl: java.net.URLClassLoader         => jcl.getURLs
         case _ => Nil
-      })
+      }
       val dirs = for (d <- alldirs; if d.getProtocol == "file") yield Path(new JFile(d.toURI))
       dirs
     }
@@ -746,44 +747,31 @@ object JavapClass {
       // on second thought, we don't care about lambda method classes, just the impl methods
       val rev =
       res flatMap {
-        case x @ closure(_, "lambda", _, _) => labdaMethod(x, target)
-          //target.member flatMap (_ => labdaMethod(x, target)) getOrElse s"${target.name}#$$anonfun"
+        case x @ closure(_, "lambda", _, _) => lambdaMethod(x, target)
+          //target.member flatMap (_ => lambdaMethod(x, target)) getOrElse s"${target.name}#$$anonfun"
         case x                              => Some(x)
       }
       rev
     }
     // given C$lambda$$g$n for member g and n in 1..N, find the C.accessor$x
     // and the C.$anonfun$x it forwards to.
-    def labdaMethod(lambda: String, target: Target): Option[String] = {
+    def lambdaMethod(lambda: String, target: Target): Option[String] = {
       import scala.tools.asm.ClassReader
       import scala.tools.asm.Opcodes.INVOKESTATIC
       import scala.tools.asm.tree.{ ClassNode, MethodInsnNode }
-      // the accessor methods invoked statically by the apply of the given closure class
-      def accesses(s: String): Seq[(String, String)] = {
-        val accessor = """accessor\$\d+""".r
+      def callees(s: String): List[(String, String)] = {
         loader classReader s withMethods { ms =>
-          ms filter (_.name == "apply") flatMap (_.instructions.toArray.collect {
-            case i: MethodInsnNode if i.getOpcode == INVOKESTATIC && when(i.name) { case accessor(_*) => true } => (i.owner, i.name)
-          })
+          val nonBridgeApplyMethods = ms filter (_.name == "apply") filter (n => (n.access & Opcodes.ACC_BRIDGE) == 0)
+          val instructions = nonBridgeApplyMethods flatMap (_.instructions.toArray)
+          instructions.collect {
+            case i: MethodInsnNode => (i.owner, i.name)
+          }.toList
         }
       }
-      // get the k.$anonfun for the accessor k.m
-      def anonOf(k: String, m: String): String = {
-        val res = 
-          loader classReader k withMethods { ms =>
-            ms filter (_.name == m) flatMap (_.instructions.toArray.collect {
-              case i: MethodInsnNode if i.getOpcode == INVOKESTATIC && i.name.startsWith("$anonfun") => i.name
-            })
-          }
-        assert(res.size == 1)
-        res.head
-      }
-      // the lambdas invoke accessors that call the anonfuns of interest. Filter k on the k#$anonfuns.
-      val ack = accesses(lambda)
-      assert(ack.size == 1)  // There can be only one.
-      ack.head match {
-        case (k, _) if target.isModule && !(k endsWith "$") => None
-        case (k, m)                                         => Some(s"${k}#${anonOf(k, m)}")
+      callees(lambda) match {
+        case (k, _) :: Nil if target.isModule && !(k endsWith "$") => None
+        case (k, m) :: _ => Some(s"${k}#${m}")
+        case _ => None
       }
     }
     /** Translate the supplied targets to patterns for anonfuns.
diff --git a/src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala b/src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala
index bcba7b6..4e45f6d 100644
--- a/src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala
+++ b/src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala
@@ -35,7 +35,16 @@ trait MemberHandlers {
         // XXX this is obviously inadequate but it's going to require some effort
         // to get right.
         if (name.toString startsWith "x$") ()
-        else importVars += name
+        else {
+          importVars += name
+          // Needed to import `xxx` during line 2 of:
+          //   scala> val xxx = ""
+          //   scala> def foo: x<TAB>
+          if (name.endsWith(IMain.DummyCursorFragment)) {
+            val stripped = name.stripSuffix(IMain.DummyCursorFragment)
+            importVars += stripped
+          }
+        }
       case _        => super.traverse(ast)
     }
   }
diff --git a/src/repl/scala/tools/nsc/interpreter/Parsed.scala b/src/repl/scala/tools/nsc/interpreter/Parsed.scala
index 672a6fd..5e58d3a 100644
--- a/src/repl/scala/tools/nsc/interpreter/Parsed.scala
+++ b/src/repl/scala/tools/nsc/interpreter/Parsed.scala
@@ -8,6 +8,25 @@ package interpreter
 
 import util.returning
 
+trait Delimited {
+  self: Parsed =>
+
+  def delimited: Char => Boolean
+  def escapeChars: List[Char] = List('\\')
+
+  /** Break String into args based on delimiting function.
+   */
+  protected def toArgs(s: String): List[String] =
+    if (s == "") Nil
+    else (s indexWhere isDelimiterChar) match {
+      case -1   => List(s)
+      case idx  => (s take idx) :: toArgs(s drop (idx + 1))
+    }
+
+  def isDelimiterChar(ch: Char) = delimited(ch)
+  def isEscapeChar(ch: Char): Boolean = escapeChars contains ch
+}
+
 /** One instance of a command buffer.
  */
 class Parsed private (
diff --git a/src/repl/scala/tools/nsc/interpreter/Pasted.scala b/src/repl/scala/tools/nsc/interpreter/Pasted.scala
index f5db3d9..3a7eda1 100644
--- a/src/repl/scala/tools/nsc/interpreter/Pasted.scala
+++ b/src/repl/scala/tools/nsc/interpreter/Pasted.scala
@@ -15,18 +15,32 @@ package interpreter
  *  a transcript should itself be pasteable and should achieve
  *  the same result.
  */
-abstract class Pasted {
-  def ContinueString: String
-  def PromptString: String
-  def interpret(line: String): Unit
+abstract class Pasted(prompt: String) {
+  def interpret(line: String): IR.Result
+  def echo(message: String): Unit
 
-  def matchesPrompt(line: String) = matchesString(line, PromptString)
+  val PromptString    = prompt.lines.toList.last
+  val AltPromptString = "scala> "
+  val ContinuePrompt  = replProps.continuePrompt
+  val ContinueString  = replProps.continueText     // "     | "
+  val anyPrompt = {
+    import scala.util.matching.Regex.quote
+    s"""\\s*(?:${quote(PromptString.trim)}|${quote(AltPromptString.trim)})\\s*""".r
+  }
+
+  def isPrompted(line: String)   = matchesPrompt(line)
+  def isPromptOnly(line: String) = line match { case anyPrompt() => true ; case _ => false }
+
+  private val testBoth = PromptString != AltPromptString
+  private val spacey   = " \t".toSet
+
+  def matchesPrompt(line: String) = matchesString(line, PromptString) || testBoth && matchesString(line, AltPromptString)
   def matchesContinue(line: String) = matchesString(line, ContinueString)
   def running = isRunning
 
   private def matchesString(line: String, target: String): Boolean = (
     (line startsWith target) ||
-    (line.nonEmpty && " \t".toSet(line.head) && matchesString(line.tail, target))
+    (line.nonEmpty && spacey(line.head) && matchesString(line.tail, target))
   )
   private def stripString(line: String, target: String) = line indexOf target match {
     case -1   => line
@@ -39,7 +53,9 @@ abstract class Pasted {
 
   private class PasteAnalyzer(val lines: List[String]) {
     val referenced = lines flatMap (resReference findAllIn _.trim.stripPrefix("res")) toSet
-    val cmds       = lines reduceLeft append split PromptString filterNot (_.trim == "") toList
+    val ActualPromptString = lines find matchesPrompt map (s =>
+      if (matchesString(s, PromptString)) PromptString else AltPromptString) getOrElse PromptString
+    val cmds       = lines reduceLeft append split ActualPromptString filterNot (_.trim == "") toList
 
     /** If it's a prompt or continuation line, strip the formatting bits and
      *  assemble the code.  Otherwise ship it off to be analyzed for res references
@@ -67,10 +83,10 @@ abstract class Pasted {
      */
     def fixResRefs(code: String, line: String) = line match {
       case resCreation(resName) if referenced(resName) =>
-        code.lastIndexOf(PromptString) match {
+        code.lastIndexOf(ActualPromptString) match {
           case -1   => code
           case idx  =>
-            val (str1, str2) = code splitAt (idx + PromptString.length)
+            val (str1, str2) = code splitAt (idx + ActualPromptString.length)
             str2 match {
               case resAssign(`resName`) => code
               case _                    => "%sval %s = { %s }".format(str1, resName, str2)
@@ -79,13 +95,26 @@ abstract class Pasted {
       case _ => code
     }
 
-    def run() {
-      println("// Replaying %d commands from transcript.\n" format cmds.size)
-      cmds foreach { cmd =>
-        print(PromptString)
-        interpret(cmd)
-      }
+    def interpreted(line: String) = {
+      echo(line.trim)
+      val res = interpret(line)
+      if (res != IR.Incomplete) echo("")
+      res
     }
+    def incompletely(cmd: String) = {
+      print(ActualPromptString)
+      interpreted(cmd) == IR.Incomplete
+    }
+    def run(): Option[String] = {
+      echo(s"// Replaying ${cmds.size} commands from transcript.\n")
+      cmds find incompletely
+    }
+  }
+
+  // Run transcript and return incomplete line if any.
+  def transcript(lines: TraversableOnce[String]): Option[String] = {
+    echo("\n// Detected repl transcript. Paste more, or ctrl-D to finish.\n")
+    apply(lines)
   }
 
   /** Commands start on lines beginning with "scala>" and each successive
@@ -93,9 +122,10 @@ abstract class Pasted {
    *  Everything else is discarded.  When the end of the transcript is spotted,
    *  all the commands are replayed.
    */
-  def apply(lines: TraversableOnce[String]) = {
+  def apply(lines: TraversableOnce[String]): Option[String] = {
     isRunning = true
-    try new PasteAnalyzer(lines.toList) run()
+    try new PasteAnalyzer(lines.toList).run()
     finally isRunning = false
   }
+  def unapply(line: String): Boolean = isPrompted(line)
 }
diff --git a/src/repl/scala/tools/nsc/interpreter/Power.scala b/src/repl/scala/tools/nsc/interpreter/Power.scala
index 8d8140b..a14a60d 100644
--- a/src/repl/scala/tools/nsc/interpreter/Power.scala
+++ b/src/repl/scala/tools/nsc/interpreter/Power.scala
@@ -113,10 +113,13 @@ class Power[ReplValsImpl <: ReplVals : ru.TypeTag: ClassTag](val intp: IMain, re
     }
   }
 
-  private def customBanner = replProps.powerBanner.option flatMap (f => io.File(f).safeSlurp())
+  private def customBanner = replProps.powerBanner.option flatMap {
+    case f if f.getName == "classic" => Some(classic)
+    case f => io.File(f).safeSlurp()
+  }
   private def customInit   = replProps.powerInitCode.option flatMap (f => io.File(f).safeSlurp())
 
-  def banner = customBanner getOrElse """
+  def classic = """
     |** Power User mode enabled - BEEP WHIR GYVE **
     |** :phase has been set to 'typer'.          **
     |** scala.tools.nsc._ has been imported      **
@@ -124,28 +127,30 @@ class Power[ReplValsImpl <: ReplVals : ru.TypeTag: ClassTag](val intp: IMain, re
     |** Try  :help, :vals, power.<tab>           **
   """.stripMargin.trim
 
-  private def initImports = List(
-    "scala.tools.nsc._",
-    "scala.collection.JavaConverters._",
-    "intp.global.{ error => _, _ }",
-    "definitions.{ getClass => _, _ }",
-    "power.rutil._",
-    "replImplicits._",
-    "treedsl.CODE._"
-  )
-
-  def init = customInit match {
-    case Some(x)  => x
-    case _        => initImports.mkString("import ", ", ", "")
-  }
+  def banner = customBanner getOrElse """
+    |Power mode enabled. :phase is at typer.
+    |import scala.tools.nsc._, intp.global._, definitions._
+    |Try :help or completions for vals._ and power._
+  """.stripMargin.trim
+
+  private def initImports =
+  """scala.tools.nsc._
+    |scala.collection.JavaConverters._
+    |intp.global.{ error => _, _ }
+    |definitions.{ getClass => _, _ }
+    |power.rutil._
+    |replImplicits._
+    |treedsl.CODE._""".stripMargin.lines
+
+  def init = customInit getOrElse initImports.mkString("import ", ", ", "")
 
-  /** Starts up power mode and runs whatever is in init.
+  /** Quietly starts up power mode and runs whatever is in init.
    */
   def unleash(): Unit = beQuietDuring {
     // First we create the ReplVals instance and bind it to $r
     intp.bind("$r", replVals)
     // Then we import everything from $r.
-    intp interpret ("import " + intp.originalPath("$r") + "._")
+    intp interpret s"import ${ intp.originalPath("$r") }._"
     // And whatever else there is to do.
     init.lines foreach (intp interpret _)
   }
diff --git a/src/repl/scala/tools/nsc/interpreter/PresentationCompilation.scala b/src/repl/scala/tools/nsc/interpreter/PresentationCompilation.scala
new file mode 100644
index 0000000..3a2177a
--- /dev/null
+++ b/src/repl/scala/tools/nsc/interpreter/PresentationCompilation.scala
@@ -0,0 +1,110 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2015 LAMP/EPFL
+ * @author Martin Odersky
+ */
+package scala.tools.nsc.interpreter
+
+import scala.reflect.internal.util.RangePosition
+import scala.tools.nsc.backend.JavaPlatform
+import scala.tools.nsc.{interactive, Settings}
+import scala.tools.nsc.io._
+import scala.tools.nsc.reporters.StoreReporter
+import scala.tools.nsc.util.ClassPath.DefaultJavaContext
+import scala.tools.nsc.util.{DirectoryClassPath, MergedClassPath}
+
+trait PresentationCompilation {
+  self: IMain =>
+
+  /** Typecheck a line of REPL input, suitably wrapped with "interpreter wrapper" objects/classes, with the
+    * presentation compiler. The result of this method gives access to the typechecked tree and to autocompletion
+    * suggestions.
+    *
+    * The caller is responsible for calling [[PresentationCompileResult#cleanup]] to dispose of the compiler instance.
+    */
+  private[scala] def presentationCompile(line: String): Either[IR.Result, PresentationCompileResult] = {
+    if (global == null) Left(IR.Error)
+    else {
+      // special case for:
+      //
+      // scala> 1
+      // scala> .toInt
+      //
+      // and for multi-line input.
+      val line1 = partialInput + (if (Completion.looksLikeInvocation(line)) { self.mostRecentVar + line } else line)
+      val compiler = newPresentationCompiler()
+      val trees = compiler.newUnitParser(line1).parseStats()
+      val importer = global.mkImporter(compiler)
+      val request = new Request(line1, trees map (t => importer.importTree(t)), generousImports = true)
+      val wrappedCode: String = request.ObjectSourceCode(request.handlers)
+      val unit = compiler.newCompilationUnit(wrappedCode)
+      import compiler._
+      val richUnit = new RichCompilationUnit(unit.source)
+      unitOfFile(richUnit.source.file) = richUnit
+      enteringTyper(typeCheck(richUnit))
+      val result = PresentationCompileResult(compiler)(richUnit, request.ObjectSourceCode.preambleLength + line1.length - line.length)
+      Right(result)
+    }
+  }
+
+  /** Create an instance of the presentation compiler with a classpath comprising the REPL's configured classpath
+    * and the classes output by previously compiled REPL lines.
+    *
+    * You may directly interact with this compiler from any thread, although you must not access it concurrently
+    * from multiple threads.
+    *
+    * You may downcast the `reporter` to `StoreReporter` to access type errors.
+    */
+  def newPresentationCompiler(): interactive.Global = {
+    val replOutClasspath: DirectoryClassPath = new DirectoryClassPath(replOutput.dir, DefaultJavaContext)
+    val mergedClasspath = new MergedClassPath[AbstractFile](replOutClasspath :: global.platform.classPath :: Nil, DefaultJavaContext)
+    def copySettings: Settings = {
+      val s = new Settings(_ => () /* ignores "bad option -nc" errors, etc */)
+      s.processArguments(global.settings.recreateArgs, processAll = false)
+      s.YpresentationAnyThread.value = true
+      s
+    }
+    val storeReporter: StoreReporter = new StoreReporter
+    val interactiveGlobal = new interactive.Global(copySettings, storeReporter) { self =>
+      override lazy val platform: ThisPlatform = new JavaPlatform {
+        val global: self.type = self
+
+        override def classPath: PlatformClassPath = mergedClasspath
+      }
+    }
+    new interactiveGlobal.TyperRun()
+    interactiveGlobal
+  }
+
+  abstract class PresentationCompileResult {
+    val compiler: scala.tools.nsc.interactive.Global
+    def unit: compiler.RichCompilationUnit
+    /** The length of synthetic code the precedes the user writtn code */
+    def preambleLength: Int
+    def cleanup(): Unit = {
+      compiler.askShutdown()
+    }
+    import compiler.CompletionResult
+
+    def completionsAt(cursor: Int): CompletionResult = {
+      val pos = unit.source.position(preambleLength + cursor)
+      compiler.completionsAt(pos)
+    }
+    def typedTreeAt(code: String, selectionStart: Int, selectionEnd: Int): compiler.Tree = {
+      val start = selectionStart + preambleLength
+      val end   = selectionEnd + preambleLength
+      val pos   = new RangePosition(unit.source, start, start, end)
+      compiler.typedTreeAt(pos)
+    }
+  }
+
+  object PresentationCompileResult {
+    def apply(compiler0: interactive.Global)(unit0: compiler0.RichCompilationUnit, preambleLength0: Int) = new PresentationCompileResult {
+
+      override val compiler = compiler0
+
+      override def unit = unit0.asInstanceOf[compiler.RichCompilationUnit]
+
+      override def preambleLength = preambleLength0
+    }
+  }
+}
diff --git a/src/repl/scala/tools/nsc/interpreter/PresentationCompilerCompleter.scala b/src/repl/scala/tools/nsc/interpreter/PresentationCompilerCompleter.scala
new file mode 100644
index 0000000..4b0330a
--- /dev/null
+++ b/src/repl/scala/tools/nsc/interpreter/PresentationCompilerCompleter.scala
@@ -0,0 +1,139 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Martin Odersky
+ */
+package scala.tools.nsc.interpreter
+
+import scala.reflect.internal.Flags
+import scala.reflect.internal.util.StringOps
+import scala.tools.nsc.interpreter.Completion.{ScalaCompleter, Candidates}
+import scala.util.control.NonFatal
+
+class PresentationCompilerCompleter(intp: IMain) extends Completion with ScalaCompleter {
+  import PresentationCompilerCompleter._
+  import intp.{PresentationCompileResult => Result}
+
+  private type Handler = Result => Candidates
+
+  private var lastRequest = NoRequest
+  private var tabCount = 0
+  private var lastCommonPrefixCompletion: Option[String] = None
+
+  def resetVerbosity(): Unit = { tabCount = 0 ; lastRequest = NoRequest }
+  def completer(): ScalaCompleter = this
+
+  // A convenience for testing
+  def complete(before: String, after: String = ""): Candidates = complete(before + after, before.length)
+  override def complete(buf: String, cursor: Int): Candidates = {
+    val request = Request(buf, cursor)
+    if (request == lastRequest)
+      tabCount += 1
+    else {
+      tabCount = 0
+      lastRequest = request
+    }
+
+    // secret handshakes
+    val slashPrint  = """.*// *print *""".r
+    val slashTypeAt = """.*// *typeAt *(\d+) *(\d+) *""".r
+    val Cursor = IMain.DummyCursorFragment + " "
+
+    def print(result: Result) = {
+      val offset = result.preambleLength
+      val pos1 = result.unit.source.position(offset).withEnd(offset + buf.length)
+      import result.compiler._
+      val tree = new Locator(pos1) locateIn result.unit.body match {
+        case Template(_, _, constructor :: (rest :+ last)) => if (rest.isEmpty) last else Block(rest, last)
+        case t => t
+      }
+      val printed = showCode(tree) + " // : " + tree.tpe.safeToString
+      Candidates(cursor, "" :: printed :: Nil)
+    }
+    def typeAt(result: Result, start: Int, end: Int) = {
+      val tpString = result.compiler.exitingTyper(result.typedTreeAt(buf, start, end).tpe.toString)
+      Candidates(cursor, "" :: tpString :: Nil)
+    }
+    def candidates(result: Result): Candidates = {
+      import result.compiler._
+      import CompletionResult._
+      def defStringCandidates(matching: List[Member], name: Name): Candidates = {
+        val defStrings = for {
+          member <- matching
+          if member.symNameDropLocal == name
+          sym <- member.sym.alternatives
+          sugared = sym.sugaredSymbolOrSelf
+        } yield {
+            val tp = member.prefix memberType sym
+            sugared.defStringSeenAs(tp)
+          }
+        Candidates(cursor, "" :: defStrings.distinct)
+      }
+      val found = result.completionsAt(cursor) match {
+        case NoResults => Completion.NoCandidates
+        case r =>
+          def shouldHide(m: Member): Boolean = {
+            val isUniversal = definitions.isUniversalMember(m.sym)
+            def viaUniversalExtensionMethod = m match {
+              case t: TypeMember if t.implicitlyAdded && t.viaView.info.params.head.info.bounds.isEmptyBounds => true
+              case _ => false
+            }
+            (
+                 isUniversal && nme.isReplWrapperName(m.prefix.typeSymbol.name)
+              || isUniversal && tabCount == 0 && r.name.isEmpty
+              || viaUniversalExtensionMethod && tabCount == 0 && r.name.isEmpty
+            )
+          }
+
+          val matching = r.matchingResults().filterNot(shouldHide)
+          val tabAfterCommonPrefixCompletion = lastCommonPrefixCompletion.contains(buf.substring(0, cursor)) && matching.exists(_.symNameDropLocal == r.name)
+          val doubleTab = tabCount > 0 && matching.forall(_.symNameDropLocal == r.name)
+          if (tabAfterCommonPrefixCompletion || doubleTab) defStringCandidates(matching, r.name)
+          else if (matching.isEmpty) {
+            // Lenient matching based on camel case and on eliding JavaBean "get" / "is" boilerplate
+            val camelMatches: List[Member] = r.matchingResults(CompletionResult.camelMatch(_)).filterNot(shouldHide)
+            val memberCompletions = camelMatches.map(_.symNameDropLocal.decoded).distinct.sorted
+            def allowCompletion = (
+                 (memberCompletions.size == 1)
+              || CompletionResult.camelMatch(r.name)(r.name.newName(StringOps.longestCommonPrefix(memberCompletions)))
+            )
+            if (memberCompletions.isEmpty) Completion.NoCandidates
+            else if (allowCompletion) Candidates(cursor - r.positionDelta, memberCompletions)
+            else Candidates(cursor, "" :: memberCompletions)
+          } else if (matching.nonEmpty && matching.forall(_.symNameDropLocal == r.name))
+            Completion.NoCandidates // don't offer completion if the only option has been fully typed already
+          else {
+            // regular completion
+            val memberCompletions: List[String] = matching.map(_.symNameDropLocal.decoded).distinct.sorted
+            Candidates(cursor - r.positionDelta, memberCompletions)
+          }
+      }
+      lastCommonPrefixCompletion =
+        if (found != Completion.NoCandidates && buf.length >= found.cursor)
+          Some(buf.substring(0, found.cursor) + StringOps.longestCommonPrefix(found.candidates))
+        else
+          None
+      found
+    }
+    val buf1 = buf.patch(cursor, Cursor, 0)
+    try {
+      intp.presentationCompile(buf1) match {
+        case Left(_) => Completion.NoCandidates
+        case Right(result) => try {
+          buf match {
+            case slashPrint() if cursor == buf.length => print(result)
+            case slashTypeAt(start, end) if cursor == buf.length => typeAt(result, start.toInt, end.toInt)
+            case _ => candidates(result)
+          }
+        } finally result.cleanup()
+      }
+    } catch {
+      case NonFatal(e) =>
+        if (isReplDebug) e.printStackTrace()
+        Completion.NoCandidates
+    }
+  }
+}
+object PresentationCompilerCompleter {
+  private case class Request(line: String, cursor: Int)
+  private val NoRequest = Request("", -1)
+}
diff --git a/src/repl/scala/tools/nsc/interpreter/ReplProps.scala b/src/repl/scala/tools/nsc/interpreter/ReplProps.scala
index 8c4faf7..f3115d9 100644
--- a/src/repl/scala/tools/nsc/interpreter/ReplProps.scala
+++ b/src/repl/scala/tools/nsc/interpreter/ReplProps.scala
@@ -6,12 +6,15 @@
 package scala.tools.nsc
 package interpreter
 
+import Properties.{ javaVersion, javaVmName, shellPromptString, shellWelcomeString,
+                    versionString, versionNumberString }
 import scala.sys._
 import Prop._
+import java.util.{ Formattable, FormattableFlags, Formatter }
 
 class ReplProps {
   private def bool(name: String) = BooleanProp.keyExists(name)
-  private def int(name: String) = IntProp(name)
+  private def int(name: String)  = Prop[Int](name)
 
   // This property is used in TypeDebugging. Let's recycle it.
   val colorOk = bool("scala.color")
@@ -21,6 +24,48 @@ class ReplProps {
   val trace = bool("scala.repl.trace")
   val power = bool("scala.repl.power")
 
+  def enversion(s: String) = {
+    import FormattableFlags._
+    val v = new Formattable {
+      override def formatTo(formatter: Formatter, flags: Int, width: Int, precision: Int) = {
+        val version = if ((flags & ALTERNATE) != 0) versionNumberString else versionString
+        val left    = if ((flags & LEFT_JUSTIFY) != 0) "-" else ""
+        val w       = if (width >= 0) s"$width" else ""
+        val p       = if (precision >= 0) s".$precision" else ""
+        val fmt     = s"%${left}${w}${p}s"
+        formatter.format(fmt, version)
+      }
+    }
+    s.format(v, javaVersion, javaVmName)
+  }
+  def encolor(s: String)   = {
+    import scala.io.AnsiColor.{ MAGENTA, RESET }
+    if (colorOk) s"$MAGENTA$s$RESET" else s
+  }
+
+  // Handy system prop for shell prompt, or else pick it up from compiler.properties
+  val promptString = Prop[String]("scala.repl.prompt").option getOrElse (if (info) "%nscala %#s> " else shellPromptString)
+  val promptText   = enversion(promptString)
+  val prompt       = encolor(promptText)
+
+  // Prompt for continued input, will be right-adjusted to width of the primary prompt
+  val continueString = Prop[String]("scala.repl.continue").option getOrElse "| "
+  val continueText   = {
+    val text   = enversion(continueString)
+    val margin = promptText.lines.toList.last.length - text.length
+    if (margin > 0) " " * margin + text else text
+  }
+  val continuePrompt = encolor(continueText)
+
+  // Next time.
+  //def welcome = enversion(Prop[String]("scala.repl.welcome") or shellWelcomeString)
+  def welcome = enversion {
+    val p = Prop[String]("scala.repl.welcome")
+    if (p.isSet) p.get else shellWelcomeString
+  }
+
+  val pasteDelimiter = Prop[String]("scala.repl.here")
+
   /** CSV of paged,across to enable pagination or `-x` style
    *  columns, "across" instead of down the column.  Since
    *  pagination turns off columnar output, these flags are
diff --git a/src/repl/scala/tools/nsc/interpreter/Tabulators.scala b/src/repl/scala/tools/nsc/interpreter/Tabulators.scala
new file mode 100644
index 0000000..75bec16
--- /dev/null
+++ b/src/repl/scala/tools/nsc/interpreter/Tabulators.scala
@@ -0,0 +1,112 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc.interpreter
+
+trait Tabulator {
+  def isAcross: Boolean
+  def width: Int
+  def marginSize: Int
+
+  protected def fits(items: Seq[String], width: Int): Boolean = (
+    (items map (_.length)).sum + (items.length - 1) * marginSize < width
+  )
+  def tabulate(items: Seq[String]): Seq[Seq[String]] = (
+    if (fits(items, width)) Seq(Seq(items mkString " " * marginSize))
+    else printMultiLineColumns(items)
+  )
+  protected def columnize(ss: Seq[String]): Seq[Seq[String]] = ss map (s => Seq(s))
+  protected def printMultiLineColumns(items: Seq[String]): Seq[Seq[String]] = {
+    import scala.tools.nsc.interpreter.SimpleMath._
+    val longest     = (items map (_.length)).max
+    val columnWidth = longest + marginSize
+    val maxcols = (
+      if (columnWidth >= width) 1
+      else 1 max (width / columnWidth)   // make sure it doesn't divide to 0
+    )
+    val nrows       = items.size /% maxcols
+    val ncols       = items.size /% nrows
+    val groupSize   = ncols
+    val padded      = items map (s"%-${columnWidth}s" format _)
+    val xwise       = isAcross || ncols >= items.length
+    val grouped: Seq[Seq[String]]    =
+      if (groupSize == 1) columnize(items)
+      else if (xwise) (padded grouped groupSize).toSeq
+      else {
+        val h       = 1 max padded.size /% groupSize
+        val cols    = (padded grouped h).toList
+        for (i <- 0 until h) yield
+          for (j <- 0 until groupSize) yield
+            if (i < cols(j).size) cols(j)(i) else ""
+      }
+    grouped
+  }
+}
+
+/** Adjust the column width and number of columns to minimize the row count. */
+trait VariColumnTabulator extends Tabulator {
+  override protected def printMultiLineColumns(items: Seq[String]): Seq[Seq[String]] = {
+    import scala.tools.nsc.interpreter.SimpleMath._
+    val longest  = (items map (_.length)).max
+    val shortest = (items map (_.length)).min
+    val fattest  = longest + marginSize
+    val skinny   = shortest + marginSize
+
+    // given ncols, calculate nrows and a list of column widths, or none if not possible
+    // if ncols > items.size, then columnWidths.size == items.size
+    def layout(ncols: Int): Option[(Int, Seq[Int], Seq[Seq[String]])] = {
+      val nrows = items.size /% ncols
+      val xwise = isAcross || ncols >= items.length
+      // max width item in each column
+      def maxima(rows: Seq[Seq[String]]) =
+        (0 until (ncols min items.size)) map { col =>
+          val widths = for (r <- rows if r.size > col) yield r(col).length
+          widths.max
+        }
+      def resulting(rows: Seq[Seq[String]]) = {
+        val columnWidths = maxima(rows) map (_ + marginSize)
+        val linelen      = columnWidths.sum
+        if (linelen <= width) Some((nrows, columnWidths, rows))
+        else None
+      }
+      if (ncols == 1) resulting(columnize(items))
+      else if (xwise) resulting((items grouped ncols).toSeq)
+      else {
+        val cols = (items grouped nrows).toList
+        val rows =
+          for (i <- 0 until nrows) yield
+            for (j <- 0 until ncols) yield
+              if (j < cols.size && i < cols(j).size) cols(j)(i) else ""
+        resulting(rows)
+      }
+    }
+
+    if (fattest >= width) {
+      columnize(items)
+    } else {
+      // if every col is widest, we have at least this many cols
+      val mincols = 1 max (width / fattest)
+      // if every other col is skinniest, we have at most this many cols
+      val maxcols = 1 + ((width - fattest) / skinny)
+      val possibles = (mincols to maxcols).map(n => layout(n)).flatten
+      val minrows = (possibles map (_._1)).min
+
+      // select the min ncols that results in minrows
+      val (_, columnWidths, sss) = (possibles find (_._1 == minrows)).get
+
+      // format to column width
+      sss map (ss => ss.zipWithIndex map {
+        case (s, i) => s"%-${columnWidths(i)}s" format s
+      })
+    }
+  }
+}
+
+private[interpreter] object SimpleMath {
+  implicit class DivRem(private val i: Int) extends AnyVal {
+    /** i/n + if (i % n != 0) 1 else 0 */
+    def /%(n: Int): Int = (i + n - 1) / n
+  }
+}
diff --git a/src/repl/scala/tools/nsc/interpreter/session/FileBackedHistory.scala b/src/repl/scala/tools/nsc/interpreter/session/FileBackedHistory.scala
deleted file mode 100644
index dddfb1b..0000000
--- a/src/repl/scala/tools/nsc/interpreter/session/FileBackedHistory.scala
+++ /dev/null
@@ -1,84 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-package session
-
-import scala.tools.nsc.io._
-import FileBackedHistory._
-
-/** TODO: file locking.
- */
-trait FileBackedHistory extends JLineHistory with JPersistentHistory {
-  def maxSize: Int
-  protected lazy val historyFile: File = defaultFile
-  private var isPersistent = true
-
-  locally {
-    load()
-  }
-
-  def withoutSaving[T](op: => T): T = {
-    val saved = isPersistent
-    isPersistent = false
-    try op
-    finally isPersistent = saved
-  }
-  def addLineToFile(item: CharSequence): Unit = {
-    if (isPersistent)
-      append(item + "\n")
-  }
-
-  /** Overwrites the history file with the current memory. */
-  protected def sync(): Unit = {
-    val lines = asStrings map (_ + "\n")
-    historyFile.writeAll(lines: _*)
-  }
-  /** Append one or more lines to the history file. */
-  protected def append(lines: String*): Unit = {
-    historyFile.appendAll(lines: _*)
-  }
-
-  def load(): Unit = {
-    if (!historyFile.canRead)
-      historyFile.createFile()
-
-    val lines: IndexedSeq[String] = {
-      try historyFile.lines().toIndexedSeq
-      catch {
-        // It seems that control characters in the history file combined
-        // with the default codec can lead to nio spewing exceptions.  Rather
-        // than abandon hope we'll try to read it as ISO-8859-1
-        case _: Exception =>
-          try historyFile.lines("ISO-8859-1").toIndexedSeq
-          catch { case _: Exception => Vector() }
-      }
-    }
-
-    repldbg("Loading " + lines.size + " into history.")
-
-    // avoid writing to the history file
-    withoutSaving(lines takeRight maxSize foreach add)
-    // truncate the history file if it's too big.
-    if (lines.size > maxSize) {
-      repldbg("File exceeds maximum size: truncating to " + maxSize + " entries.")
-      sync()
-    }
-    moveToEnd()
-  }
-
-  def flush(): Unit = ()
-  def purge(): Unit = historyFile.truncate()
-}
-
-object FileBackedHistory {
-  //   val ContinuationChar = '\003'
-  //   val ContinuationNL: String = Array('\003', '\n').mkString
-  import Properties.userHome
-
-  def defaultFileName = ".scala_history"
-  def defaultFile: File = File(Path(userHome) / defaultFileName)
-}
diff --git a/src/repl/scala/tools/nsc/interpreter/session/History.scala b/src/repl/scala/tools/nsc/interpreter/session/History.scala
index 794d41a..2028a13 100644
--- a/src/repl/scala/tools/nsc/interpreter/session/History.scala
+++ b/src/repl/scala/tools/nsc/interpreter/session/History.scala
@@ -11,7 +11,10 @@ package session
  *  reference to the jline classes.  Very sparse right now.
  */
 trait History {
+  def historicize(text: String): Boolean = false
+
   def asStrings: List[String]
+  def asStrings(from: Int, to: Int): List[String] = asStrings.slice(from, to)
   def index: Int
   def size: Int
 }
diff --git a/src/repl/scala/tools/nsc/interpreter/session/JLineHistory.scala b/src/repl/scala/tools/nsc/interpreter/session/JLineHistory.scala
deleted file mode 100644
index 18e0ee7..0000000
--- a/src/repl/scala/tools/nsc/interpreter/session/JLineHistory.scala
+++ /dev/null
@@ -1,49 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-package session
-
-/** A straight scalification of the jline interface which mixes
- *  in the sparse jline-independent one too.
- */
-trait JLineHistory extends JHistory with History {
-  def size: Int
-  def isEmpty: Boolean
-  def index: Int
-  def clear(): Unit
-  def get(index: Int): CharSequence
-  def add(line: CharSequence): Unit
-  def replace(item: CharSequence): Unit
-
-  def entries(index: Int): JListIterator[JEntry]
-  def entries(): JListIterator[JEntry]
-  def iterator: JIterator[JEntry]
-
-  def current(): CharSequence
-  def previous(): Boolean
-  def next(): Boolean
-  def moveToFirst(): Boolean
-  def moveToLast(): Boolean
-  def moveTo(index: Int): Boolean
-  def moveToEnd(): Unit
-}
-
-object JLineHistory {
-  class JLineFileHistory extends SimpleHistory with FileBackedHistory {
-    override def add(item: CharSequence): Unit = {
-      if (!isEmpty && last == item)
-        repldbg("Ignoring duplicate entry '" + item + "'")
-      else {
-        super.add(item)
-        addLineToFile(item)
-      }
-    }
-    override def toString = "History(size = " + size + ", index = " + index + ")"
-  }
-
-  def apply(): JLineHistory = try new JLineFileHistory catch { case x: Exception => new SimpleHistory() }
-}
diff --git a/src/repl/scala/tools/nsc/interpreter/session/SimpleHistory.scala b/src/repl/scala/tools/nsc/interpreter/session/SimpleHistory.scala
index 7c49b91..504d0d3 100644
--- a/src/repl/scala/tools/nsc/interpreter/session/SimpleHistory.scala
+++ b/src/repl/scala/tools/nsc/interpreter/session/SimpleHistory.scala
@@ -10,10 +10,9 @@ package session
 import scala.collection.mutable.{ Buffer, ListBuffer }
 import scala.collection.JavaConverters._
 
-class SimpleHistory extends JLineHistory {
+class SimpleHistory extends History {
   private var _index: Int = 0
-  private val buf: Buffer[String] = new ListBuffer[String]
-  private def toEntries(): Seq[JEntry] = buf.zipWithIndex map { case (x, i) => Entry(i, x) }
+  protected val buf: Buffer[String] = new ListBuffer[String]
   private def setTo(num: Int)          = { _index = num ; true }
   private def minusOne                 = { _index -= 1 ; true }
   private def plusOne                  = { _index += 1 ; true }
@@ -25,10 +24,6 @@ class SimpleHistory extends JLineHistory {
     ""
   }
 
-  case class Entry(index: Int, value: CharSequence) extends JEntry {
-    override def toString = value
-  }
-
   def maxSize: Int = 2500
   def last = if (isEmpty) fail("last") else buf.last
 
@@ -42,9 +37,6 @@ class SimpleHistory extends JLineHistory {
     buf trimEnd 1
     add(item)
   }
-  def entries(idx: Int): JListIterator[JEntry] = toEntries().asJava.listIterator(idx)
-  def entries(): JListIterator[JEntry]         = toEntries().asJava.listIterator()
-  def iterator: JIterator[JEntry]              = toEntries().iterator.asJava
 
   def remove(idx: Int): CharSequence        = buf remove idx
   def removeFirst(): CharSequence           = buf remove 0
diff --git a/src/repl/scala/tools/nsc/interpreter/session/package.scala b/src/repl/scala/tools/nsc/interpreter/session/package.scala
index a3d7312..06e7f62 100644
--- a/src/repl/scala/tools/nsc/interpreter/session/package.scala
+++ b/src/repl/scala/tools/nsc/interpreter/session/package.scala
@@ -14,10 +14,5 @@ package object session {
   type JIterator[T]       = java.util.Iterator[T]
   type JListIterator[T]   = java.util.ListIterator[T]
 
-  type JEntry             = jline.console.history.History.Entry
-  type JHistory           = jline.console.history.History
-  type JMemoryHistory     = jline.console.history.MemoryHistory
-  type JPersistentHistory = jline.console.history.PersistentHistory
-
   private[interpreter] implicit def charSequenceFix(x: CharSequence): String = x.toString
 }
diff --git a/src/scaladoc/scala/tools/nsc/doc/Index.scala b/src/scaladoc/scala/tools/nsc/doc/Index.scala
index 84545e9..a11ca38 100644
--- a/src/scaladoc/scala/tools/nsc/doc/Index.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/Index.scala
@@ -11,4 +11,6 @@ trait Index {
   type SymbolMap = SortedMap[String, SortedSet[model.MemberEntity]]
 
   def firstLetterIndex: Map[Char, SymbolMap]
+
+  def hasDeprecatedMembers: Boolean
 }
diff --git a/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala b/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala
index cbf8ff2..8ea8c4d 100644
--- a/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala
@@ -125,9 +125,9 @@ abstract class ScaladocSyntaxAnalyzer[G <: Global](val global: G) extends Syntax
       } else if (in.ch == '*') {
         docBuffer = null
         in.next
-        val scalaDoc = ("/**", "*/")
+        val scaladoc = ("/**", "*/")
         if (in.ch == '*')
-          docBuffer = new StringBuilder(scalaDoc._1)
+          docBuffer = new StringBuilder(scaladoc._1)
         do {
           do {
             if (in.ch != '*' && in.ch != SU) {
diff --git a/src/scaladoc/scala/tools/nsc/doc/Settings.scala b/src/scaladoc/scala/tools/nsc/doc/Settings.scala
index 44683f1..9679a13 100644
--- a/src/scaladoc/scala/tools/nsc/doc/Settings.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/Settings.scala
@@ -25,7 +25,7 @@ class Settings(error: String => Unit, val printMsg: String => Unit = println(_))
   )
 
   /** A setting that defines the overall title of the documentation, typically the name of the library being
-    * documented. ''Note:'' This setting is currently not used. */
+    * documented. */
   val doctitle = StringSetting (
     "-doc-title",
     "title",
@@ -34,7 +34,7 @@ class Settings(error: String => Unit, val printMsg: String => Unit = println(_))
   )
 
   /** A setting that defines the overall version number of the documentation, typically the version of the library being
-    * documented. ''Note:'' This setting is currently not used. */
+    * documented. */
   val docversion = StringSetting (
     "-doc-version",
     "version",
@@ -45,7 +45,7 @@ class Settings(error: String => Unit, val printMsg: String => Unit = println(_))
   val docfooter = StringSetting (
     "-doc-footer",
     "footer",
-    "A footer on every ScalaDoc page, by default the EPFL/Typesafe copyright notice. Can be overridden with a custom footer.",
+    "A footer on every Scaladoc page, by default the EPFL/Lightbend copyright notice. Can be overridden with a custom footer.",
     ""
   )
 
@@ -143,7 +143,7 @@ class Settings(error: String => Unit, val printMsg: String => Unit = println(_))
     "dot" // by default, just pick up the system-wide dot
   )
 
-  /** The maxium nuber of normal classes to show in the diagram */
+  /** The maximum number of normal classes to show in the diagram */
   val docDiagramsMaxNormalClasses = IntSetting(
     "-diagrams-max-classes",
     "The maximum number of superclasses or subclasses to show in a diagram",
@@ -152,7 +152,7 @@ class Settings(error: String => Unit, val printMsg: String => Unit = println(_))
     _ => None
   )
 
-  /** The maxium nuber of implcit classes to show in the diagram */
+  /** The maximum number of implicit classes to show in the diagram */
   val docDiagramsMaxImplicitClasses = IntSetting(
     "-diagrams-max-implicits",
     "The maximum number of implicitly converted classes to show in a diagram",
@@ -212,9 +212,10 @@ class Settings(error: String => Unit, val printMsg: String => Unit = println(_))
   // For improved help output.
   def scaladocSpecific = Set[Settings#Setting](
     docformat, doctitle, docfooter, docversion, docUncompilable, docsourceurl, docgenerator, docRootContent, useStupidTypes,
+    docExternalDoc,
     docAuthor, docDiagrams, docDiagramsDebug, docDiagramsDotPath,
     docDiagramsDotTimeout, docDiagramsDotRestart,
-    docImplicits, docImplicitsDebug, docImplicitsShowAll, docImplicitsHide,
+    docImplicits, docImplicitsDebug, docImplicitsShowAll, docImplicitsHide, docImplicitsSoundShadowing,
     docDiagramsMaxNormalClasses, docDiagramsMaxImplicitClasses,
     docNoPrefixes, docNoLinkWarnings, docRawOutput, docSkipPackages,
     docExpandAllTypes, docGroups
@@ -275,24 +276,36 @@ class Settings(error: String => Unit, val printMsg: String => Unit = println(_))
       ("scala.reflect.ClassManifest"            -> ((tparam: String) => tparam + " is accompanied by a ClassManifest, which is a runtime representation of its type that survives erasure")) +
       ("scala.reflect.OptManifest"              -> ((tparam: String) => tparam + " is accompanied by an OptManifest, which can be either a runtime representation of its type or the NoManifest, which means the runtime type is not available")) +
       ("scala.reflect.ClassTag"                 -> ((tparam: String) => tparam + " is accompanied by a ClassTag, which is a runtime representation of its type that survives erasure")) +
-      ("scala.reflect.api.TypeTags.WeakTypeTag" -> ((tparam: String) => tparam + " is accompanied by an WeakTypeTag, which is a runtime representation of its type that survives erasure")) +
+      ("scala.reflect.api.TypeTags.WeakTypeTag" -> ((tparam: String) => tparam + " is accompanied by a WeakTypeTag, which is a runtime representation of its type that survives erasure")) +
       ("scala.reflect.api.TypeTags.TypeTag"     -> ((tparam: String) => tparam + " is accompanied by a TypeTag, which is a runtime representation of its type that survives erasure"))
 
+    private val excludedClassnamePatterns = Set(
+      """^scala.Tuple.*""",
+      """^scala.Product.*""",
+      """^scala.Function.*""",
+      """^scala.runtime.AbstractFunction.*"""
+    ) map (_.r)
+
+    private val notExcludedClasses = Set(
+      "scala.Tuple1",
+      "scala.Tuple2",
+      "scala.Product",
+      "scala.Product1",
+      "scala.Product2",
+      "scala.Function",
+      "scala.Function1",
+      "scala.Function2",
+      "scala.runtime.AbstractFunction0",
+      "scala.runtime.AbstractFunction1",
+      "scala.runtime.AbstractFunction2"
+    )
+
     /**
      * Set of classes to exclude from index and diagrams
      * TODO: Should be configurable
      */
     def isExcluded(qname: String) = {
-      ( ( qname.startsWith("scala.Tuple") || qname.startsWith("scala.Product") ||
-         qname.startsWith("scala.Function") || qname.startsWith("scala.runtime.AbstractFunction")
-       ) && !(
-        qname == "scala.Tuple1" || qname == "scala.Tuple2" ||
-        qname == "scala.Product" || qname == "scala.Product1" || qname == "scala.Product2" ||
-        qname == "scala.Function" || qname == "scala.Function1" || qname == "scala.Function2" ||
-        qname == "scala.runtime.AbstractFunction0" || qname == "scala.runtime.AbstractFunction1" ||
-        qname == "scala.runtime.AbstractFunction2"
-      )
-     )
+      excludedClassnamePatterns.exists(_.findFirstMatchIn(qname).isDefined) && !notExcludedClasses(qname)
     }
 
     /** Common conversion targets that affect any class in Scala */
diff --git a/src/scaladoc/scala/tools/nsc/doc/base/CommentFactoryBase.scala b/src/scaladoc/scala/tools/nsc/doc/base/CommentFactoryBase.scala
old mode 100755
new mode 100644
index d31b877..f1c9663
--- a/src/scaladoc/scala/tools/nsc/doc/base/CommentFactoryBase.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/base/CommentFactoryBase.scala
@@ -48,7 +48,7 @@ trait CommentFactoryBase { this: MemberLookupBase =>
     groupNames0:     Map[String,Body] = Map.empty,
     groupPrio0:      Map[String,Body] = Map.empty
   ) : Comment = new Comment{
-    val body           = if(body0 isDefined) body0.get else Body(Seq.empty)
+    val body           = body0 getOrElse Body(Seq.empty)
     val authors        = authors0
     val see            = see0
     val result         = result0
@@ -83,13 +83,9 @@ trait CommentFactoryBase { this: MemberLookupBase =>
     }
     val groupNames     = groupNames0 flatMap {
       case (group, body) =>
-        try {
-          body match {
-            case Body(List(Paragraph(Chain(List(Summary(Text(name))))))) if (!name.trim.contains("\n")) => List(group -> (name.trim))
-            case _                                                       => List()
-          }
-        } catch {
-          case _: java.lang.NumberFormatException => List()
+        body match {
+          case Body(List(Paragraph(Chain(List(Summary(Text(name))))))) if (!name.trim.contains("\n")) => List(group -> (name.trim))
+          case _                                                       => List()
         }
     }
 
@@ -165,11 +161,11 @@ trait CommentFactoryBase { this: MemberLookupBase =>
   private val SymbolTagRegex =
     new Regex("""\s*@(param|tparam|throws|groupdesc|groupname|groupprio)\s+(\S*)\s*(.*)""")
 
-  /** The start of a scaladoc code block */
+  /** The start of a Scaladoc code block */
   private val CodeBlockStartRegex =
     new Regex("""(.*?)((?:\{\{\{)|(?:\u000E<pre(?: [^>]*)?>\u000E))(.*)""")
 
-  /** The end of a scaladoc code block */
+  /** The end of a Scaladoc code block */
   private val CodeBlockEndRegex =
     new Regex("""(.*?)((?:\}\}\})|(?:\u000E</pre>\u000E))(.*)""")
 
@@ -183,6 +179,8 @@ trait CommentFactoryBase { this: MemberLookupBase =>
   private final case class SimpleTagKey(name: String) extends TagKey
   private final case class SymbolTagKey(name: String, symbol: String) extends TagKey
 
+  private val TrailingWhitespaceRegex = """\s+$""".r
+
   /** Parses a raw comment string into a `Comment` object.
     * @param comment The expanded comment string (including start and end markers) to be parsed.
     * @param src     The raw comment source string.
@@ -192,8 +190,8 @@ trait CommentFactoryBase { this: MemberLookupBase =>
       * start and end markers, line start markers  and unnecessary whitespace. */
     def clean(comment: String): List[String] = {
       def cleanLine(line: String): String = {
-        //replaceAll removes trailing whitespaces
-        line.replaceAll("""\s+$""", "") match {
+        // Remove trailing whitespaces
+        TrailingWhitespaceRegex.replaceAllIn(line, "") match {
           case CleanCommentLine(ctl) => ctl
           case tl => tl
         }
@@ -281,13 +279,16 @@ trait CommentFactoryBase { this: MemberLookupBase =>
         parse0(docBody, tags + (key -> value), Some(key), ls, inCodeBlock)
 
       case line :: ls if (lastTagKey.isDefined) =>
-        val key = lastTagKey.get
-        val value =
-          ((tags get key): @unchecked) match {
-            case Some(b :: bs) => (b + endOfLine + line) :: bs
-            case None => oops("lastTagKey set when no tag exists for key")
-          }
-        parse0(docBody, tags + (key -> value), lastTagKey, ls, inCodeBlock)
+        val newtags = if (!line.isEmpty) {
+          val key = lastTagKey.get
+          val value =
+            ((tags get key): @unchecked) match {
+              case Some(b :: bs) => (b + endOfLine + line) :: bs
+              case None => oops("lastTagKey set when no tag exists for key")
+            }
+          tags + (key -> value)
+        } else tags
+        parse0(docBody, newtags, lastTagKey, ls, inCodeBlock)
 
       case line :: ls =>
         if (docBody.length > 0) docBody append endOfLine
@@ -315,23 +316,23 @@ trait CommentFactoryBase { this: MemberLookupBase =>
         val bodyTags: mutable.Map[TagKey, List[Body]] =
           mutable.Map(tagsWithoutDiagram mapValues {tag => tag map (parseWikiAtSymbol(_, pos, site))} toSeq: _*)
 
-        def oneTag(key: SimpleTagKey): Option[Body] =
+        def oneTag(key: SimpleTagKey, filterEmpty: Boolean = true): Option[Body] =
           ((bodyTags remove key): @unchecked) match {
-            case Some(r :: rs) =>
-              if (!rs.isEmpty) reporter.warning(pos, "Only one '@" + key.name + "' tag is allowed")
+            case Some(r :: rs) if !(filterEmpty && r.blocks.isEmpty) =>
+              if (!rs.isEmpty) reporter.warning(pos, s"Only one '@${key.name}' tag is allowed")
               Some(r)
-            case None => None
+            case _ => None
           }
 
         def allTags(key: SimpleTagKey): List[Body] =
-          (bodyTags remove key) getOrElse Nil
+          (bodyTags remove key).getOrElse(Nil).filterNot(_.blocks.isEmpty)
 
-        def allSymsOneTag(key: TagKey): Map[String, Body] = {
+        def allSymsOneTag(key: TagKey, filterEmpty: Boolean = true): Map[String, Body] = {
           val keys: Seq[SymbolTagKey] =
             bodyTags.keys.toSeq flatMap {
               case stk: SymbolTagKey if (stk.name == key.name) => Some(stk)
               case stk: SimpleTagKey if (stk.name == key.name) =>
-                reporter.warning(pos, "Tag '@" + stk.name + "' must be followed by a symbol name")
+                reporter.warning(pos, s"Tag '@${stk.name}' must be followed by a symbol name")
                 None
               case _ => None
             }
@@ -339,14 +340,14 @@ trait CommentFactoryBase { this: MemberLookupBase =>
             for (key <- keys) yield {
               val bs = (bodyTags remove key).get
               if (bs.length > 1)
-                reporter.warning(pos, "Only one '@" + key.name + "' tag for symbol " + key.symbol + " is allowed")
+                reporter.warning(pos, s"Only one '@${key.name}' tag for symbol ${key.symbol} is allowed")
               (key.symbol, bs.head)
             }
-          Map.empty[String, Body] ++ pairs
+          Map.empty[String, Body] ++ (if (filterEmpty) pairs.filterNot(_._2.blocks.isEmpty) else pairs)
         }
 
         def linkedExceptions: Map[String, Body] = {
-          val m = allSymsOneTag(SimpleTagKey("throws"))
+          val m = allSymsOneTag(SimpleTagKey("throws"), filterEmpty = false)
 
           m.map { case (name,body) =>
             val link = memberLookup(pos, name, site)
@@ -372,7 +373,7 @@ trait CommentFactoryBase { this: MemberLookupBase =>
           version0        = oneTag(SimpleTagKey("version")),
           since0          = oneTag(SimpleTagKey("since")),
           todo0           = allTags(SimpleTagKey("todo")),
-          deprecated0     = oneTag(SimpleTagKey("deprecated")),
+          deprecated0     = oneTag(SimpleTagKey("deprecated"), filterEmpty = false),
           note0           = allTags(SimpleTagKey("note")),
           example0        = allTags(SimpleTagKey("example")),
           constructor0    = oneTag(SimpleTagKey("constructor")),
@@ -386,7 +387,7 @@ trait CommentFactoryBase { this: MemberLookupBase =>
         )
 
         for ((key, _) <- bodyTags)
-          reporter.warning(pos, "Tag '@" + key.name + "' is not recognised")
+          reporter.warning(pos, s"Tag '@${key.name}' is not recognised")
 
         com
 
@@ -421,7 +422,7 @@ trait CommentFactoryBase { this: MemberLookupBase =>
 
     /* BLOCKS */
 
-    /** {{{ block ::= code | title | hrule | para }}} */
+    /** {{{ block ::= code | title | hrule | listBlock | para }}} */
     def block(): Block = {
       if (checkSkipInitWhitespace("{{{"))
         code()
@@ -456,7 +457,7 @@ trait CommentFactoryBase { this: MemberLookupBase =>
       *      nLine ::= nSpc listStyle para '\n'
       * }}}
       * Where n and m stand for the number of spaces. When `m > n`, a new list is nested. */
-    def listBlock: Block = {
+    def listBlock(): Block = {
 
       /** Consumes one list item block and returns it, or None if the block is
         * not a list or a different list. */
diff --git a/src/scaladoc/scala/tools/nsc/doc/base/LinkTo.scala b/src/scaladoc/scala/tools/nsc/doc/base/LinkTo.scala
old mode 100755
new mode 100644
diff --git a/src/scaladoc/scala/tools/nsc/doc/base/MemberLookupBase.scala b/src/scaladoc/scala/tools/nsc/doc/base/MemberLookupBase.scala
old mode 100755
new mode 100644
index cc217d2..839598a
--- a/src/scaladoc/scala/tools/nsc/doc/base/MemberLookupBase.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/base/MemberLookupBase.scala
@@ -114,7 +114,7 @@ trait MemberLookupBase {
     // Maintaining compatibility with previous links is a bit tricky here:
     // we have a preference for term names for all terms except for the last, where we prefer a class:
     // How to do this:
-    //  - at each step we do a DFS search with the prefered strategy
+    //  - at each step we do a DFS search with the preferred strategy
     //  - if the search doesn't return any members, we backtrack on the last decision
     //     * we look for terms with the last member's name
     //     * we look for types with the same name, all the way up
diff --git a/src/scaladoc/scala/tools/nsc/doc/base/comment/Body.scala b/src/scaladoc/scala/tools/nsc/doc/base/comment/Body.scala
old mode 100755
new mode 100644
diff --git a/src/scaladoc/scala/tools/nsc/doc/base/comment/Comment.scala b/src/scaladoc/scala/tools/nsc/doc/base/comment/Comment.scala
index a3d05ae..e5eb68d 100644
--- a/src/scaladoc/scala/tools/nsc/doc/base/comment/Comment.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/base/comment/Comment.scala
@@ -93,7 +93,7 @@ abstract class Comment {
   def todo: List[Body]
 
   /** Whether the entity is deprecated. Using the `@deprecated` Scala attribute
-    * is prefereable to using this Scaladoc tag. */
+    * is preferable to using this Scaladoc tag. */
   def deprecated: Option[Body]
 
   /** An additional note concerning the contract of the entity. */
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/HtmlFactory.scala b/src/scaladoc/scala/tools/nsc/doc/html/HtmlFactory.scala
index 61ab18d..8313d84 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/HtmlFactory.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/html/HtmlFactory.scala
@@ -123,6 +123,8 @@ class HtmlFactory(val universe: doc.Universe, index: doc.Index) {
 
     new page.Index(universe, index) writeFor this
     new page.IndexScript(universe, index) writeFor this
+    if (index.hasDeprecatedMembers)
+      new page.DeprecatedIndex(universe, index) writeFor this
     try {
       writeTemplates(_ writeFor this)
       for (letter <- index.firstLetterIndex) {
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala b/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala
index ce75749..6cdd99c 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala
@@ -59,6 +59,7 @@ abstract class HtmlPage extends Page { thisPage =>
     writeFile(site) { (w: Writer) =>
       w.write(doctype.toString + "\n")
       w.write(xml.Xhtml.toXhtml(html))
+      w.write('\n')
     }
 
     if (site.universe.settings.docRawOutput)
@@ -206,25 +207,42 @@ abstract class HtmlPage extends Page { thisPage =>
     case tpl :: tpls => templateToHtml(tpl) ++ sep ++ templatesToHtml(tpls, sep)
   }
 
-  /** Returns the _big image name corresponding to the DocTemplate Entity (upper left icon) */
-  def docEntityKindToBigImage(ety: DocTemplateEntity) =
-    if (ety.isTrait && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None) "trait_to_object_big.png"
-    else if (ety.isTrait) "trait_big.png"
-    else if (ety.isClass && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None) "class_to_object_big.png"
-    else if (ety.isClass) "class_big.png"
-    else if ((ety.isAbstractType || ety.isAliasType) && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None) "type_to_object_big.png"
-    else if ((ety.isAbstractType || ety.isAliasType)) "type_big.png"
-    else if (ety.isObject && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None && ety.companion.get.isClass) "object_to_class_big.png"
-    else if (ety.isObject && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None && ety.companion.get.isTrait) "object_to_trait_big.png"
-    else if (ety.isObject && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None && (ety.companion.get.isAbstractType || ety.companion.get.isAliasType)) "object_to_trait_big.png"
-    else if (ety.isObject) "object_big.png"
-    else if (ety.isPackage) "package_big.png"
-    else "class_big.png"  // FIXME: an entity *should* fall into one of the above categories, but AnyRef is somehow not
+  object Image extends Enumeration {
+    val Trait, Class, Type, Object, Package = Value
+  }
+
+  /** Returns the _big image name and the alt attribute
+   *  corresponding to the DocTemplate Entity (upper left icon) */
+  def docEntityKindToBigImage(ety: DocTemplateEntity) = {
+    def entityToImage(e: DocTemplateEntity) =
+      if (e.isTrait)                              Image.Trait
+      else if (e.isClass)                         Image.Class
+      else if (e.isAbstractType || e.isAliasType) Image.Type
+      else if (e.isObject)                        Image.Object
+      else if (e.isPackage)                       Image.Package
+      else {
+        // FIXME: an entity *should* fall into one of the above categories,
+        // but AnyRef is somehow not
+        Image.Class
+      }
+
+    val image = entityToImage(ety)
+    val companionImage = ety.companion filter {
+      e => e.visibility.isPublic && ! e.inSource.isEmpty
+    } map { entityToImage }
+
+    (image, companionImage) match {
+      case (from, Some(to)) =>
+        ((from + "_to_" + to + "_big.png").toLowerCase, from + "/" + to)
+      case (from, None) =>
+        ((from + "_big.png").toLowerCase, from.toString)
+    }
+  }
 
   def permalink(template: Entity, isSelf: Boolean = true): Elem =
     <span class="permalink">
       <a href={ memberToUrl(template, isSelf) } title="Permalink" target="_top">
-        <img src={ relativeLinkTo(List("permalink.png", "lib")) } />
+        <img src={ relativeLinkTo(List("permalink.png", "lib")) } alt="Permalink" />
       </a>
     </span>
 	
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/SyntaxHigh.scala b/src/scaladoc/scala/tools/nsc/doc/html/SyntaxHigh.scala
index 9101485..9ab3999 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/SyntaxHigh.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/html/SyntaxHigh.scala
@@ -52,7 +52,7 @@ private[html] object SyntaxHigh {
     "Triple", "TypeTag", "Unit")
 
   def apply(data: String): NodeSeq = {
-    val buf = data.getBytes
+    val buf = data.toCharArray
     val out = new StringBuilder
 
     def compare(offset: Int, key: String): Int = {
@@ -60,7 +60,7 @@ private[html] object SyntaxHigh {
       var j = 0
       val l = key.length
       while (i < buf.length && j < l) {
-        val bch = buf(i).toChar
+        val bch = buf(i)
         val kch = key charAt j
         if (bch < kch) return -1
         else if (bch > kch) return 1
@@ -94,13 +94,13 @@ private[html] object SyntaxHigh {
       def line(i: Int): Int =
         if (i == buf.length || buf(i) == '\n') i
         else {
-          out append buf(i).toChar
+          out append buf(i)
           line(i+1)
         }
       var level = 0
       def multiline(i: Int, star: Boolean): Int = {
         if (i == buf.length) return i
-        val ch = buf(i).toChar
+        val ch = buf(i)
         out append ch
         ch match {
           case '*' =>
@@ -127,7 +127,7 @@ private[html] object SyntaxHigh {
         if (i == buf.length) i
         else if (i > j+6) { out setLength 0; j }
         else {
-          val ch = buf(i).toChar
+          val ch = buf(i)
           out append ch
           ch match {
             case '\\' =>
@@ -148,7 +148,7 @@ private[html] object SyntaxHigh {
       val out = new StringBuilder("\"")
       def strlit0(i: Int, bslash: Boolean): Int = {
         if (i == buf.length) return i
-        val ch = buf(i).toChar
+        val ch = buf(i)
         out append ch
         ch match {
           case '\\' =>
@@ -167,7 +167,7 @@ private[html] object SyntaxHigh {
       val out = new StringBuilder
       def intg(i: Int): Int = {
         if (i == buf.length) return i
-        val ch = buf(i).toChar
+        val ch = buf(i)
         ch match {
           case '.' =>
             out append ch
@@ -181,7 +181,7 @@ private[html] object SyntaxHigh {
       }
       def frac(i: Int): Int = {
         if (i == buf.length) return i
-        val ch = buf(i).toChar
+        val ch = buf(i)
         ch match {
           case 'e' | 'E' =>
             out append ch
@@ -195,7 +195,7 @@ private[html] object SyntaxHigh {
       }
       def expo(i: Int, signed: Boolean): Int = {
         if (i == buf.length) return i
-        val ch = buf(i).toChar
+        val ch = buf(i)
         ch match {
           case '+' | '-' if !signed =>
             out append ch
@@ -222,7 +222,7 @@ private[html] object SyntaxHigh {
         case '&' =>
           parse("&", i+1)
         case '<' if i+1 < buf.length =>
-          val ch = buf(i+1).toChar
+          val ch = buf(i+1)
           if (ch == '-' || ch == ':' || ch == '%')
             parse("<span class=\"kw\"><"+ch+"</span>", i+2)
           else
@@ -236,19 +236,19 @@ private[html] object SyntaxHigh {
           if (i+1 < buf.length && buf(i+1) == '>')
             parse("<span class=\"kw\">=></span>", i+2)
           else
-            parse(buf(i).toChar.toString, i+1)
+            parse(buf(i).toString, i+1)
         case '/' =>
           if (i+1 < buf.length && (buf(i+1) == '/' || buf(i+1) == '*')) {
             val c = comment(i+1)
             parse("<span class=\"cmt\">"+c+"</span>", i+c.length)
           } else
-            parse(buf(i).toChar.toString, i+1)
+            parse(buf(i).toString, i+1)
         case '\'' =>
           val s = charlit(i+1)
           if (s.length > 0)
             parse("<span class=\"lit\">"+s+"</span>", i+s.length)
           else
-            parse(buf(i).toChar.toString, i+1)
+            parse(buf(i).toString, i+1)
         case '"' =>
           val s = strlit(i+1)
           parse("<span class=\"lit\">"+s+"</span>", i+s.length)
@@ -257,9 +257,9 @@ private[html] object SyntaxHigh {
           if (k >= 0)
             parse("<span class=\"ano\">@"+annotations(k)+"</span>", i+annotations(k).length+1)
           else
-            parse(buf(i).toChar.toString, i+1)
+            parse(buf(i).toString, i+1)
         case _ =>
-          if (i == 0 || (i >= 1 && !Character.isJavaIdentifierPart(buf(i-1).toChar))) {
+          if (i == 0 || (i >= 1 && !Character.isJavaIdentifierPart(buf(i-1)))) {
             if (Character.isDigit(buf(i).toInt) ||
                 (buf(i) == '.' && i + 1 < buf.length && Character.isDigit(buf(i+1).toInt))) {
               val s = numlit(i)
@@ -273,11 +273,11 @@ private[html] object SyntaxHigh {
                 if (k >= 0)
                   parse("<span class=\"std\">"+standards(k)+"</span>", i+standards(k).length)
                 else
-                  parse(buf(i).toChar.toString, i+1)
+                  parse(buf(i).toString, i+1)
               }
             }
           } else
-            parse(buf(i).toChar.toString, i+1)
+            parse(buf(i).toString, i+1)
       }
     }
 
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/DeprecatedIndex.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/DeprecatedIndex.scala
new file mode 100644
index 0000000..f257153
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/DeprecatedIndex.scala
@@ -0,0 +1,58 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ */
+
+package scala
+package tools
+package nsc
+package doc
+package html
+package page
+
+import doc.model._
+
+class DeprecatedIndex(universe: Universe, index: doc.Index) extends HtmlPage {
+
+  def path = List("deprecated-list.html")
+
+  def title = {
+    val s = universe.settings
+    ( if (!s.doctitle.isDefault) s.doctitle.value else "" ) +
+    ( if (!s.docversion.isDefault) (" " + s.docversion.value) else "" )
+  }
+
+  def headers =
+    <xml:group>
+      <link href={ relativeLinkTo(List("ref-index.css", "lib")) }  media="screen" type="text/css" rel="stylesheet"/>
+      <script type="text/javascript" src={ relativeLinkTo{List("jquery.js", "lib")} }></script>
+    </xml:group>
+
+
+  private def entry(name: String, methods: Iterable[MemberEntity]) = {
+    val occurrences = methods.filter(_.deprecation.isDefined).map(method =>
+      templateToHtml(method.inDefinitionTemplates.head)
+    ).toList.distinct
+
+    <div class="entry">
+      <div class="name">{ name }</div>
+      <div class="occurrences">{
+        for (owner <- occurrences) yield owner ++ scala.xml.Text(" ")
+      }</div>
+    </div>
+  }
+
+  def deprecatedEntries = {
+    val available =  ('_' +: ('a' to 'z')).flatMap(index.firstLetterIndex.get)
+
+    for (group <- available;
+         value <- group if value._2.find(_.deprecation.isDefined).isDefined)
+       yield value
+  }
+
+  def body =
+    <body>{
+      for(value <- deprecatedEntries) yield
+        entry(value._1, value._2.view)
+    }</body>
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/Index.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/Index.scala
index ce3a5eb..6bfe480 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/page/Index.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/Index.scala
@@ -61,12 +61,17 @@ class Index(universe: doc.Universe, val index: doc.Index) extends HtmlPage {
       }
     }
 
+  def deprecated: NodeSeq = if (index.hasDeprecatedMembers)
+      <a target="template" href="deprecated-list.html">deprecated</a>
+    else
+      <span>deprecated</span>
+
   def browser =
     <div id="browser" class="ui-layout-west">
       <div class="ui-west-center">
       <div id="filter">
           <div id="textfilter"></div>
-          <div id="letters">{ letters }</div>
+          <div id="letters">{ letters } – { deprecated }</div>
       </div>
       <div class="pack" id="tpl">{
         def packageElem(pack: model.Package): NodeSeq = {
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/ReferenceIndex.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/ReferenceIndex.scala
old mode 100755
new mode 100644
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala
deleted file mode 100644
index 3714575..0000000
--- a/src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala
+++ /dev/null
@@ -1,127 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2007-2013 LAMP/EPFL
- * @author  David Bernard, Manohar Jonnalagedda
- */
-
-package scala.tools.nsc
-package doc
-package html
-package page
-
-import scala.xml.NodeSeq
-import java.io.File
-
-class Source(sourceFile: File) extends HtmlPage {
-
-  val path = List("source.html")
-
-  val title = "Scaladoc: page source"
-
-  val headers =
-    NodeSeq.Empty
-
-  val body =
-    <body>
-      <h1>Page source is not implemented yet</h1>
-    </body>
-
-    /*
-
-
-    def readTextFromSrcDir(subPath: String) :Option[String] = {
-      readTextFromFile(new File(sourceDir, subPath))
-    }
-
-    def readTextFromFile(f : File) :Option[String] = {
-      if (f.exists) {
-        Some(Source.fromFile(f)(Codec.default).getLines().mkString(""))
-      } else {
-        None
-      }
-    }
-
-
-    def writeTextToFile(f : File, txt : String, header: Option[String], footer: Option[String]) {
-      val out = new FileOutputStream(f)
-      try {
-        val enc = "UTF-8"
-        header.foreach(s => out.write(s.getBytes(enc)))
-        out.write(txt.getBytes(enc))
-        footer.foreach(s => out.write(s.getBytes(enc)))
-      } finally {
-        try {
-          out.close()
-        } catch {
-          case _ => //ignore
-        }
-      }
-    }
-
-    trait SourceHtmlizer {
-      def scalaToHtml(src :File) : Option[File]
-    }
-
-    lazy val sourceHtmlizer : SourceHtmlizer = {
-      if (cfg.htmlizeSource) {
-        new SourceHtmlizer {
-
-          val inDir: File = cfg.sourcedir
-          val outDir: File = cfg.outputdir
-
-          private def relativize(uri: URI, from: URI) = linkHelper.relativize(uri, from).getOrElse("__notFound__" + uri.getPath)
-
-          def header(dest: URI) = Some("""
-          <html>
-          <head>
-            <link href='""" + relativize(new URI("site:/_highlighter/SyntaxHighlighter.css"), dest) + """' rel='stylesheet' type='text/css'/>
-            <script language='javascript' src='""" + relativize(new URI("site:/_highlighter/shAll.js"), dest) + """'></script>
-          </head>
-          <body>
-            <pre name="code" class="scala" style="width:100%">
-        """)
-
-          def footer(dest: URI) = Some("""</pre>
-            <script language='javascript'>
-              dp.SyntaxHighlighter.ClipboardSwf = '""" + relativize(new URI("site:/_highlighter/clipboard.swf"), dest) + """';
-              dp.SyntaxHighlighter.HighlightAll('code');
-            </script>
-          </body>
-          </html>
-        """)
-
-          //TODO: escape the source code
-          def scalaToHtml(src :File) = {
-            val dest = new File(outDir, fileHelper.relativePathUnderDir(src, inDir) + ".html")
-            if (!dest.exists || dest.lastModified < src.lastModified) {
-
-              //we need to verify whether the directory we are trying to write to has already been created or not
-              if(!dest.getParentFile.exists) dest.getParentFile.mkdirs
-
-              val uri = linkHelper.uriFor(dest).get
-              var txt = fileHelper.readTextFromFile(src).getOrElse("")
-              txt = txt.replace("<", "<")
-              fileHelper.writeTextToFile(dest, txt, header(uri), footer(uri))
-            }
-            Some(dest)
-          }
-
-          def copyResources() {
-            val loader = this.getClass().getClassLoader()
-            val buf = new Array[Byte](1024)
-            def copyResource(name: String) = fileHelper.copyResource("/scala/tools/nsc/doc/html/resource/", name, outDir, loader, buf)
-            copyResource("_highlighter/clipboard.swf")
-            copyResource("_highlighter/shAll.js")
-            copyResource("_highlighter/SyntaxHighlighter.css")
-          }
-
-          copyResources()
-        }
-      } else {
-        new SourceHtmlizer {
-          def scalaToHtml(src :File) = None
-        }
-      }
-    }
-    */
-
-}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/Template.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/Template.scala
index e10c54a..f70bac8 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/page/Template.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/Template.scala
@@ -103,11 +103,13 @@ class Template(universe: doc.Universe, generator: DiagramGenerator, tpl: DocTemp
     <body class={ if (tpl.isType) "type" else "value" }>
       <div id="definition">
         {
+          val (src, alt) = docEntityKindToBigImage(tpl)
+
           tpl.companion match {
             case Some(companion) if (companion.visibility.isPublic && companion.inSource != None) =>
-              <a href={relativeLinkTo(companion)} title={docEntityKindToCompanionTitle(tpl)}><img src={ relativeLinkTo(List(docEntityKindToBigImage(tpl), "lib")) }/></a>
+              <a href={relativeLinkTo(companion)} title={docEntityKindToCompanionTitle(tpl)}><img alt={alt} src={ relativeLinkTo(List(src, "lib")) }/></a>
             case _ =>
-              <img src={ relativeLinkTo(List(docEntityKindToBigImage(tpl), "lib")) }/>
+              <img alt={alt} src={ relativeLinkTo(List(src, "lib")) }/>
         }}
         { owner }
         <h1>{ displayName }</h1>{
@@ -137,7 +139,7 @@ class Template(universe: doc.Universe, generator: DiagramGenerator, tpl: DocTemp
                   if (tpl.linearizationTemplates.isEmpty && tpl.conversions.isEmpty)
                     NodeSeq.Empty
                   else
-                    <li class="inherit out"><span>By inheritance</span></li>
+                    <li class="inherit out"><span>By Inheritance</span></li>
                 }
               </ol>
             </div>
@@ -173,9 +175,8 @@ class Template(universe: doc.Universe, generator: DiagramGenerator, tpl: DocTemp
             <span class="filtertype"></span>
             <ol>
               <li class="hideall out"><span>Hide All</span></li>
-              <li class="showall in"><span>Show all</span></li>
+              <li class="showall in"><span>Show All</span></li>
             </ol>
-            <a href="http://docs.scala-lang.org/overviews/scaladoc/usage.html#members" target="_blank">Learn more about member selection</a>
           </div>
         }
         {
@@ -279,7 +280,7 @@ class Template(universe: doc.Universe, generator: DiagramGenerator, tpl: DocTemp
 
       {
         if (Set("epfl", "EPFL").contains(tpl.universe.settings.docfooter.value))
-          <div id="footer">Scala programming documentation. Copyright (c) 2003-2013 <a href="http://www.epfl.ch" target="_top">EPFL</a>, with contributions from <a href="http://typesafe.com" target="_top">Typesafe</a>.</div>
+          <div id="footer">Scala programming documentation. Copyright (c) 2003-2016 <a href="http://www.epfl.ch" target="_top">EPFL</a>, with contributions from <a href="http://www.lightbend.com" target="_top">Lightbend</a>.</div>
         else
           <div id="footer"> { tpl.universe.settings.docfooter.value } </div>
       }
@@ -675,7 +676,6 @@ class Template(universe: doc.Universe, generator: DiagramGenerator, tpl: DocTemp
             if (diagramSvg != NodeSeq.Empty) {
               <div class="toggleContainer block diagram-container" id={ id + "-container"}>
                 <span class="toggle diagram-link">{ description }</span>
-                <a href="http://docs.scala-lang.org/overviews/scaladoc/usage.html#diagrams" target="_blank" class="diagram-help">Learn more about scaladoc diagrams</a>
                 <div class="diagram" id={ id }>{
                   diagramSvg
                 }</div>
@@ -781,7 +781,7 @@ class Template(universe: doc.Universe, generator: DiagramGenerator, tpl: DocTemp
           if (isReduced) NodeSeq.Empty else {
             def paramsToHtml(vlsss: List[List[ValueParam]]): NodeSeq = {
               def param0(vl: ValueParam): NodeSeq =
-                // notice the }{ in the next lines, they are necessary to avoid an undesired withspace in output
+                // notice the }{ in the next lines, they are necessary to avoid an undesired whitespace in output
                 <span name={ vl.name }>{
                   Text(vl.name)
                 }{ Text(": ") ++ typeToHtml(vl.resultType, hasLinks) }{
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala
index ab8e9e2..12c609a 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala
@@ -36,7 +36,7 @@ object DiagramStats {
   private[this] val filterTrack = new TimeTracker("diagrams model filtering")
   private[this] val modelTrack = new TimeTracker("diagrams model generation")
   private[this] val dotGenTrack = new TimeTracker("dot diagram generation")
-  private[this] val dotRunTrack = new TimeTracker("dot process runnning")
+  private[this] val dotRunTrack = new TimeTracker("dot process running")
   private[this] val svgTrack = new TimeTracker("svg processing")
   private[this] var brokenImages = 0
   private[this] var fixedImages = 0
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala
index b541cf7..320a8e2 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala
@@ -383,7 +383,7 @@ class DotDiagramGenerator(settings: doc.Settings, dotRunner: DotRunner) extends
       if (dotId.count(_ == '|') == 1) {
         val Array(klass, id) = dotId.toString.split("\\|")
         /* Sometimes dot "forgets" to add the image -- that's very annoying, but it seems pretty random, and simple
-         * tests like excute 20K times and diff the output don't trigger the bug -- so it's up to us to place the image
+         * tests like execute 20K times and diff the output don't trigger the bug -- so it's up to us to place the image
          * back in the node */
         val kind = getKind(klass)
         if (kind != "")
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala
index 4bed106..9287bfb 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala
@@ -18,16 +18,16 @@ import model._
 /** This class takes care of running the graphviz dot utility */
 class DotRunner(settings: doc.Settings) {
 
-  private[this] var dotRestarts = 0
+  private[this] var dotAttempts = 0
   private[this] var dotProcess: DotProcess  = null
 
   def feedToDot(dotInput: String, template: DocTemplateEntity): String = {
 
     if (dotProcess == null) {
-      if (dotRestarts < settings.docDiagramsDotRestart.value) {
-        if (dotRestarts != 0)
+      if (dotAttempts < settings.docDiagramsDotRestart.value + 1) {
+        if (dotAttempts > 0)
           settings.printMsg("Graphviz will be restarted...\n")
-        dotRestarts += 1
+        dotAttempts += 1
         dotProcess = new DotProcess(settings)
       } else
         return null
@@ -41,7 +41,7 @@ class DotRunner(settings: doc.Settings) {
     if (result == null) {
       dotProcess.cleanup()
       dotProcess = null
-      if (dotRestarts == settings.docDiagramsDotRestart.value) {
+      if (dotAttempts == 1 + settings.docDiagramsDotRestart.value) {
         settings.printMsg("\n")
         settings.printMsg("**********************************************************************")
         settings.printMsg("Diagrams will be disabled for this run because the graphviz dot tool")
@@ -145,7 +145,7 @@ class DotProcess(settings: doc.Settings) {
         // we shouldn't just sit there for 50s not reporting anything, no?
         settings.printMsg("Graphviz dot encountered an error when generating the diagram for:")
         settings.printMsg(templateName)
-        settings.printMsg("These are usually spurious errors, but if you notice a persistant error on")
+        settings.printMsg("These are usually spurious errors, but if you notice a persistent error on")
         settings.printMsg("a diagram, please use the " + settings.docDiagramsDebug.name + " flag and report a bug with the output.")
       }
     }
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js
index 3d9cf8d..cf81f7f 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js
@@ -412,7 +412,17 @@ function textFilter() {
     var query = $("#textfilter input").attr("value") || '';
     var queryRegExp = compilePattern(query);
 
-    if ((typeof textFilter.lastQuery === "undefined") || (textFilter.lastQuery !== query)) {
+    // if we are filtering on types, then we have to display types
+    // ("display packages only" is not possible when filtering)
+    if (query !== "") {
+        kindFilter("all");
+    }
+
+    // Three things trigger a reload of the left pane list:
+    // typeof textFilter.lastQuery === "undefined" <-- first load, there is nothing yet in the left pane
+    // textFilter.lastQuery !== query              <-- the filter text has changed
+    // focusFilterState != null                    <-- a package has been "focused"
+    if ((typeof textFilter.lastQuery === "undefined") || (textFilter.lastQuery !== query) || (focusFilterState != null)) {
 
         textFilter.lastQuery = query;
 
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js
index 4dd4867..d5e008d 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js
@@ -752,7 +752,7 @@ $.layout.defaults = {
  *	PANE-SPECIFIC SETTINGS
  *	- options listed below MUST be specified per-pane - they CANNOT be set under 'panes'
  *	- all options under the 'panes' key can also be set specifically for any pane
- *	- most options under the 'panes' key apply only to 'border-panes' - NOT the the center-pane
+ *	- most options under the 'panes' key apply only to 'border-panes' - NOT the center-pane
  */
 ,	north: {
 		paneSelector:			".ui-layout-north"
@@ -921,7 +921,7 @@ $.layout.backwardCompatibility = {
 			$.extend(true, opts.panes, opts.defaults);
 			delete opts.defaults;
 		}
-		// rename options in the the options.panes key
+		// rename options in the options.panes key
 		if (opts.panes) ren( opts.panes );
 		// rename options inside *each pane key*, eg: options.west
 		$.each($.layout.config.allPanes, function (i, pane) {
@@ -5483,4 +5483,4 @@ $.layout.onReady.push( $.layout.browserZoom._init );
 
 
 
-})( jQuery );
\ No newline at end of file
+})( jQuery );
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js
index c1a6a9a..e69de29 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js
@@ -1,1265 +0,0 @@
-/*!
- * Modernizr v2.5.3
- * www.modernizr.com
- *
- * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton
- * Available under the BSD and MIT licenses: www.modernizr.com/license/
- */
-
-/*
- * Modernizr tests which native CSS3 and HTML5 features are available in
- * the current UA and makes the results available to you in two ways:
- * as properties on a global Modernizr object, and as classes on the
- * <html> element. This information allows you to progressively enhance
- * your pages with a granular level of control over the experience.
- *
- * Modernizr has an optional (not included) conditional resource loader
- * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).
- * To get a build that includes Modernizr.load(), as well as choosing
- * which tests to include, go to www.modernizr.com/download/
- *
- * Authors        Faruk Ates, Paul Irish, Alex Sexton
- * Contributors   Ryan Seddon, Ben Alman
- */
-
-window.Modernizr = (function( window, document, undefined ) {
-
-    var version = '2.5.3',
-
-    Modernizr = {},
-    
-    // option for enabling the HTML classes to be added
-    enableClasses = true,
-
-    docElement = document.documentElement,
-
-    /**
-     * Create our "modernizr" element that we do most feature tests on.
-     */
-    mod = 'modernizr',
-    modElem = document.createElement(mod),
-    mStyle = modElem.style,
-
-    /**
-     * Create the input element for various Web Forms feature tests.
-     */
-    inputElem = document.createElement('input'),
-
-    smile = ':)',
-
-    toString = {}.toString,
-
-    // List of property values to set for css tests. See ticket #21
-    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
-
-    // Following spec is to expose vendor-specific style properties as:
-    //   elem.style.WebkitBorderRadius
-    // and the following would be incorrect:
-    //   elem.style.webkitBorderRadius
-
-    // Webkit ghosts their properties in lowercase but Opera & Moz do not.
-    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+
-    //   erik.eae.net/archives/2008/03/10/21.48.10/
-
-    // More here: github.com/Modernizr/Modernizr/issues/issue/21
-    omPrefixes = 'Webkit Moz O ms',
-
-    cssomPrefixes = omPrefixes.split(' '),
-
-    domPrefixes = omPrefixes.toLowerCase().split(' '),
-
-    ns = {'svg': 'http://www.w3.org/2000/svg'},
-
-    tests = {},
-    inputs = {},
-    attrs = {},
-
-    classes = [],
-
-    slice = classes.slice,
-
-    featureName, // used in testing loop
-
-
-    // Inject element with style element and some CSS rules
-    injectElementWithStyles = function( rule, callback, nodes, testnames ) {
-
-      var style, ret, node,
-          div = document.createElement('div'),
-          // After page load injecting a fake body doesn't work so check if body exists
-          body = document.body, 
-          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.
-          fakeBody = body ? body : document.createElement('body');
-
-      if ( parseInt(nodes, 10) ) {
-          // In order not to give false positives we create a node for each test
-          // This also allows the method to scale for unspecified uses
-          while ( nodes-- ) {
-              node = document.createElement('div');
-              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
-              div.appendChild(node);
-          }
-      }
-
-      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed
-      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element
-      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.
-      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx
-      // Documents served as xml will throw if using ­ so use xml friendly encoded version. See issue #277
-      style = ['­','<style>', rule, '</style>'].join('');
-      div.id = mod;
-      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.
-      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270
-      fakeBody.innerHTML += style;
-      fakeBody.appendChild(div);
-      if(!body){
-          //avoid crashing IE8, if background image is used
-          fakeBody.style.background = "";
-          docElement.appendChild(fakeBody);
-      }
-
-      ret = callback(div, rule);
-      // If this is done after page load we don't want to remove the body so check if body exists
-      !body ? fakeBody.parentNode.removeChild(fakeBody) : div.parentNode.removeChild(div);
-
-      return !!ret;
-
-    },
-
-
-    // adapted from matchMedia polyfill
-    // by Scott Jehl and Paul Irish
-    // gist.github.com/786768
-    testMediaQuery = function( mq ) {
-
-      var matchMedia = window.matchMedia || window.msMatchMedia;
-      if ( matchMedia ) {
-        return matchMedia(mq).matches;
-      }
-
-      var bool;
-
-      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {
-        bool = (window.getComputedStyle ?
-                  getComputedStyle(node, null) :
-                  node.currentStyle)['position'] == 'absolute';
-      });
-
-      return bool;
-
-     },
-
-
-    /**
-      * isEventSupported determines if a given element supports the given event
-      * function from yura.thinkweb2.com/isEventSupported/
-      */
-    isEventSupported = (function() {
-
-      var TAGNAMES = {
-        'select': 'input', 'change': 'input',
-        'submit': 'form', 'reset': 'form',
-        'error': 'img', 'load': 'img', 'abort': 'img'
-      };
-
-      function isEventSupported( eventName, element ) {
-
-        element = element || document.createElement(TAGNAMES[eventName] || 'div');
-        eventName = 'on' + eventName;
-
-        // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
-        var isSupported = eventName in element;
-
-        if ( !isSupported ) {
-          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
-          if ( !element.setAttribute ) {
-            element = document.createElement('div');
-          }
-          if ( element.setAttribute && element.removeAttribute ) {
-            element.setAttribute(eventName, '');
-            isSupported = is(element[eventName], 'function');
-
-            // If property was created, "remove it" (by setting value to `undefined`)
-            if ( !is(element[eventName], 'undefined') ) {
-              element[eventName] = undefined;
-            }
-            element.removeAttribute(eventName);
-          }
-        }
-
-        element = null;
-        return isSupported;
-      }
-      return isEventSupported;
-    })();
-
-    // hasOwnProperty shim by kangax needed for Safari 2.0 support
-    var _hasOwnProperty = ({}).hasOwnProperty, hasOwnProperty;
-    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {
-      hasOwnProperty = function (object, property) {
-        return _hasOwnProperty.call(object, property);
-      };
-    }
-    else {
-      hasOwnProperty = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */
-        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));
-      };
-    }
-
-    // Taken from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js
-    // ES-5 15.3.4.5
-    // http://es5.github.com/#x15.3.4.5
-
-    if (!Function.prototype.bind) {
-      
-      Function.prototype.bind = function bind(that) {
-        
-        var target = this;
-        
-        if (typeof target != "function") {
-            throw new TypeError();
-        }
-        
-        var args = slice.call(arguments, 1),
-            bound = function () {
-
-            if (this instanceof bound) {
-              
-              var F = function(){};
-              F.prototype = target.prototype;
-              var self = new F;
-
-              var result = target.apply(
-                  self,
-                  args.concat(slice.call(arguments))
-              );
-              if (Object(result) === result) {
-                  return result;
-              }
-              return self;
-
-            } else {
-              
-              return target.apply(
-                  that,
-                  args.concat(slice.call(arguments))
-              );
-
-            }
-
-        };
-        
-        return bound;
-      };
-    }
-
-    /**
-     * setCss applies given styles to the Modernizr DOM node.
-     */
-    function setCss( str ) {
-        mStyle.cssText = str;
-    }
-
-    /**
-     * setCssAll extrapolates all vendor-specific css strings.
-     */
-    function setCssAll( str1, str2 ) {
-        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
-    }
-
-    /**
-     * is returns a boolean for if typeof obj is exactly type.
-     */
-    function is( obj, type ) {
-        return typeof obj === type;
-    }
-
-    /**
-     * contains returns a boolean for if substr is found within str.
-     */
-    function contains( str, substr ) {
-        return !!~('' + str).indexOf(substr);
-    }
-
-    /**
-     * testProps is a generic CSS / DOM property test; if a browser supports
-     *   a certain property, it won't return undefined for it.
-     *   A supported CSS property returns empty string when its not yet set.
-     */
-    function testProps( props, prefixed ) {
-        for ( var i in props ) {
-            if ( mStyle[ props[i] ] !== undefined ) {
-                return prefixed == 'pfx' ? props[i] : true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * testDOMProps is a generic DOM property test; if a browser supports
-     *   a certain property, it won't return undefined for it.
-     */
-    function testDOMProps( props, obj, elem ) {
-        for ( var i in props ) {
-            var item = obj[props[i]];
-            if ( item !== undefined) {
-
-                // return the property name as a string
-                if (elem === false) return props[i];
-
-                // let's bind a function
-                if (is(item, 'function')){
-                  // default to autobind unless override
-                  return item.bind(elem || obj);
-                }
-                
-                // return the unbound function or obj or value
-                return item;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * testPropsAll tests a list of DOM properties we want to check against.
-     *   We specify literally ALL possible (known and/or likely) properties on
-     *   the element including the non-vendor prefixed one, for forward-
-     *   compatibility.
-     */
-    function testPropsAll( prop, prefixed, elem ) {
-
-        var ucProp  = prop.charAt(0).toUpperCase() + prop.substr(1),
-            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
-
-        // did they call .prefixed('boxSizing') or are we just testing a prop?
-        if(is(prefixed, "string") || is(prefixed, "undefined")) {
-          return testProps(props, prefixed);
-
-        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])
-        } else {
-          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
-          return testDOMProps(props, prefixed, elem);
-        }
-    }
-
-    /**
-     * testBundle tests a list of CSS features that require element and style injection.
-     *   By bundling them together we can reduce the need to touch the DOM multiple times.
-     */
-    /*>>testBundle*/
-    var testBundle = (function( styles, tests ) {
-        var style = styles.join(''),
-            len = tests.length;
-
-        injectElementWithStyles(style, function( node, rule ) {
-            var style = document.styleSheets[document.styleSheets.length - 1],
-                // IE8 will bork if you create a custom build that excludes both fontface and generatedcontent tests.
-                // So we check for cssRules and that there is a rule available
-                // More here: github.com/Modernizr/Modernizr/issues/288 & github.com/Modernizr/Modernizr/issues/293
-                cssText = style ? (style.cssRules && style.cssRules[0] ? style.cssRules[0].cssText : style.cssText || '') : '',
-                children = node.childNodes, hash = {};
-
-            while ( len-- ) {
-                hash[children[len].id] = children[len];
-            }
-
-             /*>>touch*/          Modernizr['touch'] = ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch || (hash['touch'] && hash['touch'].offsetTop) === 9; /*>>touch*/
-            /*>>csstransforms3d*/ Modernizr['csstransforms3d'] = (hash['csstransforms3d'] && hash['csstransforms3d'].offsetLeft) === 9 && hash['csstransforms3d'].offsetHeight === 3;          /*>>csstransforms3d*/
-            /*>>generatedcontent*/Modernizr['generatedcontent'] = (hash['generatedcontent'] && hash['generatedcontent'].offsetHeight) >= 1;       /*>>generatedcontent*/
-            /*>>fontface*/        Modernizr['fontface'] = /src/i.test(cssText) &&
-                                                                  cssText.indexOf(rule.split(' ')[0]) === 0;        /*>>fontface*/
-        }, len, tests);
-
-    })([
-        // Pass in styles to be injected into document
-        /*>>fontface*/        '@font-face {font-family:"font";src:url("https://")}'         /*>>fontface*/
-        
-        /*>>touch*/           ,['@media (',prefixes.join('touch-enabled),('),mod,')',
-                                '{#touch{top:9px;position:absolute}}'].join('')           /*>>touch*/
-                                
-        /*>>csstransforms3d*/ ,['@media (',prefixes.join('transform-3d),('),mod,')',
-                                '{#csstransforms3d{left:9px;position:absolute;height:3px;}}'].join('')/*>>csstransforms3d*/
-                                
-        /*>>generatedcontent*/,['#generatedcontent:after{content:"',smile,'";visibility:hidden}'].join('')  /*>>generatedcontent*/
-    ],
-      [
-        /*>>fontface*/        'fontface'          /*>>fontface*/
-        /*>>touch*/           ,'touch'            /*>>touch*/
-        /*>>csstransforms3d*/ ,'csstransforms3d'  /*>>csstransforms3d*/
-        /*>>generatedcontent*/,'generatedcontent' /*>>generatedcontent*/
-        
-    ]);/*>>testBundle*/
-
-
-    /**
-     * Tests
-     * -----
-     */
-
-    // The *new* flexbox
-    // dev.w3.org/csswg/css3-flexbox
-
-    tests['flexbox'] = function() {
-      return testPropsAll('flexOrder');
-    };
-
-    // The *old* flexbox
-    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/
-
-    tests['flexbox-legacy'] = function() {
-        return testPropsAll('boxDirection');
-    };
-
-    // On the S60 and BB Storm, getContext exists, but always returns undefined
-    // so we actually have to call getContext() to verify
-    // github.com/Modernizr/Modernizr/issues/issue/97/
-
-    tests['canvas'] = function() {
-        var elem = document.createElement('canvas');
-        return !!(elem.getContext && elem.getContext('2d'));
-    };
-
-    tests['canvastext'] = function() {
-        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));
-    };
-
-    // this test initiates a new webgl context. 
-    // webk.it/70117 is tracking a legit feature detect proposal
-    
-    tests['webgl'] = function() {
-        try {
-            var canvas = document.createElement('canvas'),
-                ret;
-            ret = !!(window.WebGLRenderingContext && (canvas.getContext('experimental-webgl') || canvas.getContext('webgl')));
-            canvas = undefined;
-        } catch (e){
-            ret = false;
-        }
-        return ret;
-    };
-
-    /*
-     * The Modernizr.touch test only indicates if the browser supports
-     *    touch events, which does not necessarily reflect a touchscreen
-     *    device, as evidenced by tablets running Windows 7 or, alas,
-     *    the Palm Pre / WebOS (touch) phones.
-     *
-     * Additionally, Chrome (desktop) used to lie about its support on this,
-     *    but that has since been rectified: crbug.com/36415
-     *
-     * We also test for Firefox 4 Multitouch Support.
-     *
-     * For more info, see: modernizr.github.com/Modernizr/touch.html
-     */
-
-    tests['touch'] = function() {
-        return Modernizr['touch'];
-    };
-
-    /**
-     * geolocation tests for the new Geolocation API specification.
-     *   This test is a standards compliant-only test; for more complete
-     *   testing, including a Google Gears fallback, please see:
-     *   code.google.com/p/geo-location-javascript/
-     * or view a fallback solution using google's geo API:
-     *   gist.github.com/366184
-     */
-    tests['geolocation'] = function() {
-        return !!navigator.geolocation;
-    };
-
-    // Per 1.6:
-    // This used to be Modernizr.crosswindowmessaging but the longer
-    // name has been deprecated in favor of a shorter and property-matching one.
-    // The old API is still available in 1.6, but as of 2.0 will throw a warning,
-    // and in the first release thereafter disappear entirely.
-    tests['postmessage'] = function() {
-      return !!window.postMessage;
-    };
-
-
-    // Chrome incognito mode used to throw an exception when using openDatabase 
-    // It doesn't anymore.
-    tests['websqldatabase'] = function() {
-      return !!window.openDatabase;
-    };
-
-    // Vendors had inconsistent prefixing with the experimental Indexed DB:
-    // - Webkit's implementation is accessible through webkitIndexedDB
-    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB
-    // For speed, we don't test the legacy (and beta-only) indexedDB
-    tests['indexedDB'] = function() {
-      return !!testPropsAll("indexedDB",window);
-    };
-
-    // documentMode logic from YUI to filter out IE8 Compat Mode
-    //   which false positives.
-    tests['hashchange'] = function() {
-      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);
-    };
-
-    // Per 1.6:
-    // This used to be Modernizr.historymanagement but the longer
-    // name has been deprecated in favor of a shorter and property-matching one.
-    // The old API is still available in 1.6, but as of 2.0 will throw a warning,
-    // and in the first release thereafter disappear entirely.
-    tests['history'] = function() {
-      return !!(window.history && history.pushState);
-    };
-
-    tests['draganddrop'] = function() {
-        var div = document.createElement('div');
-        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);
-    };
-
-    // FIXME: Once FF10 is sunsetted, we can drop prefixed MozWebSocket
-    // bugzil.la/695635
-    tests['websockets'] = function() {
-        for ( var i = -1, len = cssomPrefixes.length; ++i < len; ){
-          if ( window[cssomPrefixes[i] + 'WebSocket'] ){
-            return true;
-          }
-        }
-        return 'WebSocket' in window;
-    };
-
-
-    // css-tricks.com/rgba-browser-support/
-    tests['rgba'] = function() {
-        // Set an rgba() color and check the returned value
-
-        setCss('background-color:rgba(150,255,150,.5)');
-
-        return contains(mStyle.backgroundColor, 'rgba');
-    };
-
-    tests['hsla'] = function() {
-        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,
-        //   except IE9 who retains it as hsla
-
-        setCss('background-color:hsla(120,40%,100%,.5)');
-
-        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');
-    };
-
-    tests['multiplebgs'] = function() {
-        // Setting multiple images AND a color on the background shorthand property
-        //  and then querying the style.background property value for the number of
-        //  occurrences of "url(" is a reliable method for detecting ACTUAL support for this!
-
-        setCss('background:url(https://),url(https://),red url(https://)');
-
-        // If the UA supports multiple backgrounds, there should be three occurrences
-        //   of the string "url(" in the return value for elemStyle.background
-
-        return /(url\s*\(.*?){3}/.test(mStyle.background);
-    };
-
-
-    // In testing support for a given CSS property, it's legit to test:
-    //    `elem.style[styleName] !== undefined`
-    // If the property is supported it will return an empty string,
-    // if unsupported it will return undefined.
-
-    // We'll take advantage of this quick test and skip setting a style
-    // on our modernizr element, but instead just testing undefined vs
-    // empty string.
-
-
-    tests['backgroundsize'] = function() {
-        return testPropsAll('backgroundSize');
-    };
-
-    tests['borderimage'] = function() {
-        return testPropsAll('borderImage');
-    };
-
-
-    // Super comprehensive table about all the unique implementations of
-    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance
-
-    tests['borderradius'] = function() {
-        return testPropsAll('borderRadius');
-    };
-
-    // WebOS unfortunately false positives on this test.
-    tests['boxshadow'] = function() {
-        return testPropsAll('boxShadow');
-    };
-
-    // FF3.0 will false positive on this test
-    tests['textshadow'] = function() {
-        return document.createElement('div').style.textShadow === '';
-    };
-
-
-    tests['opacity'] = function() {
-        // Browsers that actually have CSS Opacity implemented have done so
-        //  according to spec, which means their return values are within the
-        //  range of [0.0,1.0] - including the leading zero.
-
-        setCssAll('opacity:.55');
-
-        // The non-literal . in this regex is intentional:
-        //   German Chrome returns this value as 0,55
-        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632
-        return /^0.55$/.test(mStyle.opacity);
-    };
-
-
-    // Note, Android < 4 will pass this test, but can only animate 
-    //   a single property at a time
-    //   daneden.me/2011/12/putting-up-with-androids-bullshit/
-    tests['cssanimations'] = function() {
-        return testPropsAll('animationName');
-    };
-
-
-    tests['csscolumns'] = function() {
-        return testPropsAll('columnCount');
-    };
-
-
-    tests['cssgradients'] = function() {
-        /**
-         * For CSS Gradients syntax, please see:
-         * webkit.org/blog/175/introducing-css-gradients/
-         * developer.mozilla.org/en/CSS/-moz-linear-gradient
-         * developer.mozilla.org/en/CSS/-moz-radial-gradient
-         * dev.w3.org/csswg/css3-images/#gradients-
-         */
-
-        var str1 = 'background-image:',
-            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',
-            str3 = 'linear-gradient(left top,#9f9, white);';
-
-        setCss(
-             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)
-              (str1 + '-webkit- '.split(' ').join(str2 + str1) 
-             // standard syntax             // trailing 'background-image:' 
-              + prefixes.join(str3 + str1)).slice(0, -str1.length)
-        );
-
-        return contains(mStyle.backgroundImage, 'gradient');
-    };
-
-
-    tests['cssreflections'] = function() {
-        return testPropsAll('boxReflect');
-    };
-
-
-    tests['csstransforms'] = function() {
-        return !!testPropsAll('transform');
-    };
-
-
-    tests['csstransforms3d'] = function() {
-
-        var ret = !!testPropsAll('perspective');
-
-        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.
-        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in
-        //   some conditions. As a result, Webkit typically recognizes the syntax but
-        //   will sometimes throw a false positive, thus we must do a more thorough check:
-        if ( ret && 'webkitPerspective' in docElement.style ) {
-
-          // Webkit allows this media query to succeed only if the feature is enabled.
-          // `@media (transform-3d),(-o-transform-3d),(-moz-transform-3d),(-ms-transform-3d),(-webkit-transform-3d),(modernizr){ ... }`
-          ret = Modernizr['csstransforms3d'];
-        }
-        return ret;
-    };
-
-
-    tests['csstransitions'] = function() {
-        return testPropsAll('transition');
-    };
-
-
-    /*>>fontface*/
-    // @font-face detection routine by Diego Perini
-    // javascript.nwbox.com/CSSSupport/
-
-    // false positives in WebOS: github.com/Modernizr/Modernizr/issues/342
-    tests['fontface'] = function() {
-        return Modernizr['fontface'];
-    };
-    /*>>fontface*/
-
-    // CSS generated content detection
-    tests['generatedcontent'] = function() {
-        return Modernizr['generatedcontent'];
-    };
-
-
-
-    // These tests evaluate support of the video/audio elements, as well as
-    // testing what types of content they support.
-    //
-    // We're using the Boolean constructor here, so that we can extend the value
-    // e.g.  Modernizr.video     // true
-    //       Modernizr.video.ogg // 'probably'
-    //
-    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845
-    //                     thx to NielsLeenheer and zcorpan
-
-    // Note: in some older browsers, "no" was a return value instead of empty string.
-    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2
-    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5
-
-    tests['video'] = function() {
-        var elem = document.createElement('video'),
-            bool = false;
-            
-        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224
-        try {
-            if ( bool = !!elem.canPlayType ) {
-                bool      = new Boolean(bool);
-                bool.ogg  = elem.canPlayType('video/ogg; codecs="theora"')      .replace(/^no$/,'');
-
-                bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,'');
-
-                bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,'');
-            }
-            
-        } catch(e) { }
-        
-        return bool;
-    };
-
-    tests['audio'] = function() {
-        var elem = document.createElement('audio'),
-            bool = false;
-
-        try { 
-            if ( bool = !!elem.canPlayType ) {
-                bool      = new Boolean(bool);
-                bool.ogg  = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,'');
-                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');
-
-                // Mimetypes accepted:
-                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
-                //   bit.ly/iphoneoscodecs
-                bool.wav  = elem.canPlayType('audio/wav; codecs="1"')     .replace(/^no$/,'');
-                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            || 
-                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');
-            }
-        } catch(e) { }
-        
-        return bool;
-    };
-
-
-    // In FF4, if disabled, window.localStorage should === null.
-
-    // Normally, we could not test that directly and need to do a
-    //   `('localStorage' in window) && ` test first because otherwise Firefox will
-    //   throw bugzil.la/365772 if cookies are disabled
-
-    // Also in iOS5 Private Browsing mode, attepting to use localStorage.setItem
-    // will throw the exception:
-    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.
-    // Peculiarly, getItem and removeItem calls do not throw.
-
-    // Because we are forced to try/catch this, we'll go aggressive.
-
-    // Just FWIW: IE8 Compat mode supports these features completely:
-    //   www.quirksmode.org/dom/html5.html
-    // But IE8 doesn't support either with local files
-
-    tests['localstorage'] = function() {
-        try {
-            localStorage.setItem(mod, mod);
-            localStorage.removeItem(mod);
-            return true;
-        } catch(e) {
-            return false;
-        }
-    };
-
-    tests['sessionstorage'] = function() {
-        try {
-            sessionStorage.setItem(mod, mod);
-            sessionStorage.removeItem(mod);
-            return true;
-        } catch(e) {
-            return false;
-        }
-    };
-
-
-    tests['webworkers'] = function() {
-        return !!window.Worker;
-    };
-
-
-    tests['applicationcache'] = function() {
-        return !!window.applicationCache;
-    };
-
-
-    // Thanks to Erik Dahlstrom
-    tests['svg'] = function() {
-        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;
-    };
-
-    // specifically for SVG inline in HTML, not within XHTML
-    // test page: paulirish.com/demo/inline-svg
-    tests['inlinesvg'] = function() {
-      var div = document.createElement('div');
-      div.innerHTML = '<svg/>';
-      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;
-    };
-
-    // SVG SMIL animation
-    tests['smil'] = function() {
-        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));
-    };
-
-    // This test is only for clip paths in SVG proper, not clip paths on HTML content
-    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg
-
-    // However read the comments to dig into applying SVG clippaths to HTML content here:
-    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491
-    tests['svgclippaths'] = function() {
-        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));
-    };
-
-    // input features and input types go directly onto the ret object, bypassing the tests loop.
-    // Hold this guy to execute in a moment.
-    function webforms() {
-        // Run through HTML5's new input attributes to see if the UA understands any.
-        // We're using f which is the <input> element created early on
-        // Mike Taylr has created a comprehensive resource for testing these attributes
-        //   when applied to all input types:
-        //   miketaylr.com/code/input-type-attr.html
-        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
-        
-        // Only input placeholder is tested while textarea's placeholder is not. 
-        // Currently Safari 4 and Opera 11 have support only for the input placeholder
-        // Both tests are available in feature-detects/forms-placeholder.js
-        Modernizr['input'] = (function( props ) {
-            for ( var i = 0, len = props.length; i < len; i++ ) {
-                attrs[ props[i] ] = !!(props[i] in inputElem);
-            }
-            if (attrs.list){
-              // safari false positive's on datalist: webk.it/74252
-              // see also github.com/Modernizr/Modernizr/issues/146
-              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);
-            }
-            return attrs;
-        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));
-
-        // Run through HTML5's new input types to see if the UA understands any.
-        //   This is put behind the tests runloop because it doesn't return a
-        //   true/false like all the other tests; instead, it returns an object
-        //   containing each input type with its corresponding true/false value
-
-        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/
-        Modernizr['inputtypes'] = (function(props) {
-
-            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {
-
-                inputElem.setAttribute('type', inputElemType = props[i]);
-                bool = inputElem.type !== 'text';
-
-                // We first check to see if the type we give it sticks..
-                // If the type does, we feed it a textual value, which shouldn't be valid.
-                // If the value doesn't stick, we know there's input sanitization which infers a custom UI
-                if ( bool ) {
-
-                    inputElem.value         = smile;
-                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';
-
-                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {
-
-                      docElement.appendChild(inputElem);
-                      defaultView = document.defaultView;
-
-                      // Safari 2-4 allows the smiley as a value, despite making a slider
-                      bool =  defaultView.getComputedStyle &&
-                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&
-                              // Mobile android web browser has false positive, so must
-                              // check the height to see if the widget is actually there.
-                              (inputElem.offsetHeight !== 0);
-
-                      docElement.removeChild(inputElem);
-
-                    } else if ( /^(search|tel)$/.test(inputElemType) ){
-                      // Spec doesnt define any special parsing or detectable UI
-                      //   behaviors so we pass these through as true
-
-                      // Interestingly, opera fails the earlier test, so it doesn't
-                      //  even make it here.
-
-                    } else if ( /^(url|email)$/.test(inputElemType) ) {
-                      // Real url and email support comes with prebaked validation.
-                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;
-
-                    } else if ( /^color$/.test(inputElemType) ) {
-                        // chuck into DOM and force reflow for Opera bug in 11.00
-                        // github.com/Modernizr/Modernizr/issues#issue/159
-                        docElement.appendChild(inputElem);
-                        docElement.offsetWidth;
-                        bool = inputElem.value != smile;
-                        docElement.removeChild(inputElem);
-
-                    } else {
-                      // If the upgraded input compontent rejects the :) text, we got a winner
-                      bool = inputElem.value != smile;
-                    }
-                }
-
-                inputs[ props[i] ] = !!bool;
-            }
-            return inputs;
-        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));
-    }
-
-
-    // End of test definitions
-    // -----------------------
-
-
-
-    // Run through all tests and detect their support in the current UA.
-    // todo: hypothetically we could be doing an array of tests and use a basic loop here.
-    for ( var feature in tests ) {
-        if ( hasOwnProperty(tests, feature) ) {
-            // run the test, throw the return value into the Modernizr,
-            //   then based on that boolean, define an appropriate className
-            //   and push it into an array of classes we'll join later.
-            featureName  = feature.toLowerCase();
-            Modernizr[featureName] = tests[feature]();
-
-            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
-        }
-    }
-
-    // input tests need to run.
-    Modernizr.input || webforms();
-
-
-    /**
-     * addTest allows the user to define their own feature tests
-     * the result will be added onto the Modernizr object,
-     * as well as an appropriate className set on the html element
-     *
-     * @param feature - String naming the feature
-     * @param test - Function returning true if feature is supported, false if not
-     */
-     Modernizr.addTest = function ( feature, test ) {
-       if ( typeof feature == 'object' ) {
-         for ( var key in feature ) {
-           if ( hasOwnProperty( feature, key ) ) {
-             Modernizr.addTest( key, feature[ key ] );
-           }
-         }
-       } else {
-
-         feature = feature.toLowerCase();
-
-         if ( Modernizr[feature] !== undefined ) {
-           // we're going to quit if you're trying to overwrite an existing test
-           // if we were to allow it, we'd do this:
-           //   var re = new RegExp("\\b(no-)?" + feature + "\\b");
-           //   docElement.className = docElement.className.replace( re, '' );
-           // but, no rly, stuff 'em.
-           return Modernizr;
-         }
-
-         test = typeof test == 'function' ? test() : test;
-
-         docElement.className += ' ' + (test ? '' : 'no-') + feature;
-         Modernizr[feature] = test;
-
-       }
-
-       return Modernizr; // allow chaining.
-     };
-
-
-    // Reset modElem.cssText to nothing to reduce memory footprint.
-    setCss('');
-    modElem = inputElem = null;
-
-    //>>BEGIN IEPP
-    // Enable HTML 5 elements for styling in IE & add HTML5 css
-    /*! HTML5 Shiv v3.4 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */
-    ;(function(window, document) {
-    
-      /** Preset options */
-      var options = window.html5 || {};
-    
-      /** Used to skip problem elements */
-      var reSkip = /^<|^(?:button|form|map|select|textarea)$/i;
-    
-      /** Detect whether the browser supports default html5 styles */
-      var supportsHtml5Styles;
-    
-      /** Detect whether the browser supports unknown elements */
-      var supportsUnknownElements;
-    
-      (function() {
-        var a = document.createElement('a');
-    
-        a.innerHTML = '<xyz></xyz>';
-    
-        //if the hidden property is implemented we can assume, that the browser supports HTML5 Styles
-        supportsHtml5Styles = ('hidden' in a);
-        supportsUnknownElements = a.childNodes.length == 1 || (function() {
-          // assign a false positive if unable to shiv
-          try {
-            (document.createElement)('a');
-          } catch(e) {
-            return true;
-          }
-          var frag = document.createDocumentFragment();
-          return (
-            typeof frag.cloneNode == 'undefined' ||
-            typeof frag.createDocumentFragment == 'undefined' ||
-            typeof frag.createElement == 'undefined'
-          );
-        }());
-    
-      }());
-    
-      /*--------------------------------------------------------------------------*/
-    
-      /**
-       * Creates a style sheet with the given CSS text and adds it to the document.
-       * @private
-       * @param {Document} ownerDocument The document.
-       * @param {String} cssText The CSS text.
-       * @returns {StyleSheet} The style element.
-       */
-      function addStyleSheet(ownerDocument, cssText) {
-        var p = ownerDocument.createElement('p'),
-            parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
-    
-        p.innerHTML = 'x<style>' + cssText + '</style>';
-        return parent.insertBefore(p.lastChild, parent.firstChild);
-      }
-    
-      /**
-       * Returns the value of `html5.elements` as an array.
-       * @private
-       * @returns {Array} An array of shived element node names.
-       */
-      function getElements() {
-        var elements = html5.elements;
-        return typeof elements == 'string' ? elements.split(' ') : elements;
-      }
-    
-      /**
-       * Shivs the `createElement` and `createDocumentFragment` methods of the document.
-       * @private
-       * @param {Document|DocumentFragment} ownerDocument The document.
-       */
-      function shivMethods(ownerDocument) {
-        var cache = {},
-            docCreateElement = ownerDocument.createElement,
-            docCreateFragment = ownerDocument.createDocumentFragment,
-            frag = docCreateFragment();
-    
-        ownerDocument.createElement = function(nodeName) {
-          // Avoid adding some elements to fragments in IE < 9 because
-          // * Attributes like `name` or `type` cannot be set/changed once an element
-          //   is inserted into a document/fragment
-          // * Link elements with `src` attributes that are inaccessible, as with
-          //   a 403 response, will cause the tab/window to crash
-          // * Script elements appended to fragments will execute when their `src`
-          //   or `text` property is set
-          var node = (cache[nodeName] || (cache[nodeName] = docCreateElement(nodeName))).cloneNode();
-          return html5.shivMethods && node.canHaveChildren && !reSkip.test(nodeName) ? frag.appendChild(node) : node;
-        };
-    
-        ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
-          'var n=f.cloneNode(),c=n.createElement;' +
-          'h.shivMethods&&(' +
-            // unroll the `createElement` calls
-            getElements().join().replace(/\w+/g, function(nodeName) {
-              cache[nodeName] = docCreateElement(nodeName);
-              frag.createElement(nodeName);
-              return 'c("' + nodeName + '")';
-            }) +
-          ');return n}'
-        )(html5, frag);
-      }
-    
-      /*--------------------------------------------------------------------------*/
-    
-      /**
-       * Shivs the given document.
-       * @memberOf html5
-       * @param {Document} ownerDocument The document to shiv.
-       * @returns {Document} The shived document.
-       */
-      function shivDocument(ownerDocument) {
-        var shived;
-        if (ownerDocument.documentShived) {
-          return ownerDocument;
-        }
-        if (html5.shivCSS && !supportsHtml5Styles) {
-          shived = !!addStyleSheet(ownerDocument,
-            // corrects block display not defined in IE6/7/8/9
-            'article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +
-            // corrects audio display not defined in IE6/7/8/9
-            'audio{display:none}' +
-            // corrects canvas and video display not defined in IE6/7/8/9
-            'canvas,video{display:inline-block;*display:inline;*zoom:1}' +
-            // corrects 'hidden' attribute and audio[controls] display not present in IE7/8/9
-            '[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}' +
-            // adds styling not present in IE6/7/8/9
-            'mark{background:#FF0;color:#000}'
-          );
-        }
-        if (!supportsUnknownElements) {
-          shived = !shivMethods(ownerDocument);
-        }
-        if (shived) {
-          ownerDocument.documentShived = shived;
-        }
-        return ownerDocument;
-      }
-    
-      /*--------------------------------------------------------------------------*/
-    
-      /**
-       * The `html5` object is exposed so that more elements can be shived and
-       * existing shiving can be detected on iframes.
-       * @type Object
-       * @example
-       *
-       * // options can be changed before the script is included
-       * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
-       */
-      var html5 = {
-    
-        /**
-         * An array or space separated string of node names of the elements to shiv.
-         * @memberOf html5
-         * @type Array|String
-         */
-        'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',
-    
-        /**
-         * A flag to indicate that the HTML5 style sheet should be inserted.
-         * @memberOf html5
-         * @type Boolean
-         */
-        'shivCSS': !(options.shivCSS === false),
-    
-        /**
-         * A flag to indicate that the document's `createElement` and `createDocumentFragment`
-         * methods should be overwritten.
-         * @memberOf html5
-         * @type Boolean
-         */
-        'shivMethods': !(options.shivMethods === false),
-    
-        /**
-         * A string to describe the type of `html5` object ("default" or "default print").
-         * @memberOf html5
-         * @type String
-         */
-        'type': 'default',
-    
-        // shivs the document according to the specified `html5` object options
-        'shivDocument': shivDocument
-      };
-    
-      /*--------------------------------------------------------------------------*/
-    
-      // expose html5
-      window.html5 = html5;
-    
-      // shiv the document
-      shivDocument(document);
-    
-    }(this, document));
-
-    //>>END IEPP
-
-    // Assign private properties to the return object with prefix
-    Modernizr._version      = version;
-
-    // expose these for the plugin API. Look in the source for how to join() them against your input
-    Modernizr._prefixes     = prefixes;
-    Modernizr._domPrefixes  = domPrefixes;
-    Modernizr._cssomPrefixes  = cssomPrefixes;
-    
-    // Modernizr.mq tests a given media query, live against the current state of the window
-    // A few important notes:
-    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false
-    //   * A max-width or orientation query will be evaluated against the current state, which may change later.
-    //   * You must specify values. Eg. If you are testing support for the min-width media query use: 
-    //       Modernizr.mq('(min-width:0)')
-    // usage:
-    // Modernizr.mq('only screen and (max-width:768)')
-    Modernizr.mq            = testMediaQuery;   
-    
-    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on
-    // Modernizr.hasEvent('gesturestart', elem)
-    Modernizr.hasEvent      = isEventSupported; 
-
-    // Modernizr.testProp() investigates whether a given style property is recognized
-    // Note that the property names must be provided in the camelCase variant.
-    // Modernizr.testProp('pointerEvents')
-    Modernizr.testProp      = function(prop){
-        return testProps([prop]);
-    };        
-
-    // Modernizr.testAllProps() investigates whether a given style property,
-    //   or any of its vendor-prefixed variants, is recognized
-    // Note that the property names must be provided in the camelCase variant.
-    // Modernizr.testAllProps('boxSizing')    
-    Modernizr.testAllProps  = testPropsAll;     
-
-
-    
-    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards
-    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })
-    Modernizr.testStyles    = injectElementWithStyles; 
-
-
-    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input
-    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'
-    
-    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.
-    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:
-    //
-    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');
-    
-    // If you're trying to ascertain which transition end event to bind to, you might do something like...
-    // 
-    //     var transEndEventNames = {
-    //       'WebkitTransition' : 'webkitTransitionEnd',
-    //       'MozTransition'    : 'transitionend',
-    //       'OTransition'      : 'oTransitionEnd',
-    //       'msTransition'     : 'MsTransitionEnd',
-    //       'transition'       : 'transitionend'
-    //     },
-    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];
-    
-    Modernizr.prefixed      = function(prop, obj, elem){
-      if(!obj) {
-        return testPropsAll(prop, 'pfx');
-      } else {
-        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'
-        return testPropsAll(prop, obj, elem);
-      }
-    };
-
-
-
-    // Remove "no-js" class from <html> element, if it exists:
-    docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') +
-                            
-                            // Add the new classes to the <html> element.
-                            (enableClasses ? ' js ' + classes.join(' ') : '');
-
-    return Modernizr;
-
-})(this, this.document);
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ref-index.css b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ref-index.css
old mode 100755
new mode 100644
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.css b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.css
index e129e6c..e84d7c1 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.css
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.css
@@ -210,6 +210,7 @@ dl.attributes > dd {
   display: block;
   padding-left: 10em;
   margin-bottom: 5px;
+  min-height: 15px;
 }
 
 #template .values > h3 {
@@ -669,6 +670,7 @@ div.fullcomment dl.paramcmts > dd {
   padding-left: 10px;
   margin-bottom: 5px;
   margin-left: 70px;
+  min-height: 15px;
 }
 
 /* Members filter tool */
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.js
index 1ebcb67..798a2d4 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.js
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.js
@@ -179,7 +179,7 @@ $(document).ready(function(){
 
         filter();
     });
-    $("#visbl > ol > li.public").click(function() {
+    $("#order > ol > li.alpha").click(function() {
         if ($(this).hasClass("out")) {
             orderAlpha();
         }
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/CommentFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/CommentFactory.scala
index fe157c1..66ce213 100644
--- a/src/scaladoc/scala/tools/nsc/doc/model/CommentFactory.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/model/CommentFactory.scala
@@ -31,7 +31,7 @@ trait CommentFactory extends base.CommentFactoryBase {
       defineComment(sym, linkTarget, inTpl)
     })
 
-  /** A comment is usualy created by the parser, however for some special
+  /** A comment is usually created by the parser, however for some special
     * cases we have to give some `inTpl` comments (parent class for example)
     * to the comment of the symbol.
     * This function manages some of those cases : Param accessor and Primary constructor */
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/Entity.scala b/src/scaladoc/scala/tools/nsc/doc/model/Entity.scala
index 7fe8903..d55c51b 100644
--- a/src/scaladoc/scala/tools/nsc/doc/model/Entity.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/model/Entity.scala
@@ -183,7 +183,7 @@ trait MemberEntity extends Entity {
   /** Indicates whether the member is inherited by implicit conversion */
   def isImplicitlyInherited: Boolean
 
-  /** Indicates whether there is another member with the same name in the template that will take precendence */
+  /** Indicates whether there is another member with the same name in the template that will take precedence */
   def isShadowedImplicit: Boolean
 
   /** Indicates whether there are other implicitly inherited members that have similar signatures (and thus they all
@@ -298,7 +298,7 @@ trait DocTemplateEntity extends MemberTemplateEntity {
   /** The shadowing information for the implicitly added members */
   def implicitsShadowing: Map[MemberEntity, ImplicitMemberShadowing]
 
-  /** Classes that can be implcitly converted to this class */
+  /** Classes that can be implicitly converted to this class */
   def incomingImplicitlyConvertedClasses: List[(DocTemplateEntity, ImplicitConversion)]
 
   /** Classes to which this class can be implicitly converted to
@@ -484,10 +484,10 @@ trait ImplicitConversion {
   /** The entity for the method that performed the conversion, if it's documented (or just its name, otherwise) */
   def convertorMethod: Either[MemberEntity, String]
 
-  /** A short name of the convertion */
+  /** A short name of the conversion */
   def conversionShortName: String
 
-  /** A qualified name uniquely identifying the convertion (currently: the conversion method's qualified name) */
+  /** A qualified name uniquely identifying the conversion (currently: the conversion method's qualified name) */
   def conversionQualifiedName: String
 
   /** The entity that performed the conversion */
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala
old mode 100755
new mode 100644
index 643a089..ad53dc6
--- a/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala
@@ -14,10 +14,12 @@ object IndexModelFactory {
 
   def makeIndex(universe: Universe): Index = new Index {
 
-    lazy val firstLetterIndex: Map[Char, SymbolMap] = {
+    lazy val (firstLetterIndex, hasDeprecatedMembers): (Map[Char, SymbolMap], Boolean) = {
 
       object result extends mutable.HashMap[Char,SymbolMap] {
 
+        var deprecated = false
+
         /* symbol name ordering */
         implicit def orderingMap = math.Ordering.String
 
@@ -32,6 +34,8 @@ object IndexModelFactory {
           val members = letter.get(d.name).getOrElse {
             SortedSet.empty[MemberEntity](Ordering.by { _.toString })
           } + d
+          if (!deprecated && members.find(_.deprecation.isDefined).isDefined)
+            deprecated = true
           this(firstLetter) = letter + (d.name -> members)
         }
       }
@@ -50,7 +54,7 @@ object IndexModelFactory {
 
       gather(universe.rootPackage)
 
-      result.toMap
+      (result.toMap, result.deprecated)
     }
   }
 }
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/ModelFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactory.scala
index 03d71f1..8ae31ce 100644
--- a/src/scaladoc/scala/tools/nsc/doc/model/ModelFactory.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactory.scala
@@ -478,7 +478,7 @@ class ModelFactory(val global: Global, val settings: doc.Settings) {
     override lazy val comment = {
       def nonRootTemplate(sym: Symbol): Option[DocTemplateImpl] =
         if (sym eq RootPackage) None else findTemplateMaybe(sym)
-      /* Variable precendence order for implicitly added members: Take the variable defifinitions from ...
+      /* Variable precedence order for implicitly added members: Take the variable definitions from ...
        * 1. the target of the implicit conversion
        * 2. the definition template (owner)
        * 3. the current template
@@ -994,7 +994,7 @@ class ModelFactory(val global: Global, val settings: doc.Settings) {
     // pruning modules that shouldn't be documented
     // Why Symbol.isInitialized? Well, because we need to avoid exploring all the space available to scaladoc
     // from the classpath -- scaladoc is a hog, it will explore everything starting from the root package unless we
-    // somehow prune the tree. And isInitialized is a good heuristic for prunning -- if the package was not explored
+    // somehow prune the tree. And isInitialized is a good heuristic for pruning -- if the package was not explored
     // during typer and refchecks, it's not necessary for the current application and there's no need to explore it.
     (!sym.isModule || sym.moduleClass.isInitialized) &&
     // documenting only public and protected members
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala
index f984b45..db39d05 100644
--- a/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala
@@ -90,8 +90,12 @@ trait ModelFactoryImplicitSupport {
     else {
       val context: global.analyzer.Context = global.analyzer.rootContext(NoCompilationUnit)
 
-      val results = global.analyzer.allViewsFrom(sym.tpe_*, context, sym.typeParams)
+      val results = global.analyzer.allViewsFrom(sym.tpe_*, context, sym.typeParams) ++
+        global.analyzer.allViewsFrom(byNameType(sym.tpe_*), context, sym.typeParams)
       var conversions = results.flatMap(result => makeImplicitConversion(sym, result._1, result._2, context, inTpl))
+      //debug(results.mkString("All views\n  ", "\n  ", "\n"))
+      //debug(conversions.mkString("Conversions\n  ", "\n  ", "\n"))
+
       // also keep empty conversions, so they appear in diagrams
       // conversions = conversions.filter(!_.members.isEmpty)
 
@@ -193,7 +197,7 @@ trait ModelFactoryImplicitSupport {
         List(new ImplicitConversionImpl(sym, result.tree.symbol, toType, constraints, inTpl))
       } catch {
         case i: ImplicitNotFound =>
-          //println("  Eliminating: " + toType)
+          //debug(s"  Eliminating: $toType")
           Nil
       }
     }
@@ -396,7 +400,7 @@ trait ModelFactoryImplicitSupport {
 
     def isHiddenConversion = settings.hiddenImplicits(conversionQualifiedName)
 
-    override def toString = "Implcit conversion from " + sym.tpe + " to " + toType + " done by " + convSym
+    override def toString = "Implicit conversion from " + sym.tpe + " to " + toType + " done by " + convSym
   }
 
   /* ========================= HELPER METHODS ========================== */
@@ -475,7 +479,7 @@ trait ModelFactoryImplicitSupport {
     }
 
   /**
-   *  Make implicits explicit - Not used curently
+   *  Make implicits explicit - Not used currently
    */
   // object implicitToExplicit extends TypeMap {
   //   def apply(tp: Type): Type = mapOver(tp) match {
@@ -557,7 +561,7 @@ trait ModelFactoryImplicitSupport {
    *
    * The trick here is that the resultType does not matter - the condition for removal it that paramss have the same
    * structure (A => B => C may not override (A, B) => C) and that all the types involved are
-   * of the implcit conversion's member are subtypes of the parent members' parameters */
+   * of the implicit conversion's member are subtypes of the parent members' parameters */
   def isDistinguishableFrom(t1: Type, t2: Type): Boolean = {
     // Vlad: I tried using matches but it's not exactly what we need:
     // (p: AnyRef)AnyRef matches ((t: String)AnyRef returns false -- but we want that to be true
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala
index 2b7e250..8834bc3 100644
--- a/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala
@@ -112,7 +112,7 @@ trait ModelFactoryTypeSupport {
           def needsPrefix: Boolean = {
             if ((owner != bSym.owner || preSym.isRefinementClass) && (normalizeTemplate(owner) != inTpl.sym))
               return true
-            // don't get tricked into prefixng method type params and existentials:
+            // don't get tricked into prefixing method type params and existentials:
             // I tried several tricks BUT adding the method for which I'm creating the type => that simply won't scale,
             // as ValueParams are independent of their parent member, and I really don't want to add this information to
             // all terms, as we're already over the allowed memory footprint
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/TreeFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/TreeFactory.scala
old mode 100755
new mode 100644
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/diagram/Diagram.scala b/src/scaladoc/scala/tools/nsc/doc/model/diagram/Diagram.scala
index 1846f37..e15963b 100644
--- a/src/scaladoc/scala/tools/nsc/doc/model/diagram/Diagram.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/model/diagram/Diagram.scala
@@ -99,7 +99,7 @@ case class NormalNode(tpe: TypeEntity, tpl: Option[TemplateEntity])(val tooltip:
 
 /** A class or trait the thisnode can be converted to by an implicit conversion
  *  TODO: I think it makes more sense to use the tpe links to templates instead of the TemplateEntity for implicit nodes
- *  since some implicit conversions convert the class to complex types that cannot be represented as a single tmeplate
+ *  since some implicit conversions convert the class to complex types that cannot be represented as a single template
  */
 case class ImplicitNode(tpe: TypeEntity, tpl: Option[TemplateEntity])(val tooltip: Option[String] = None) extends Node { override def isImplicitNode = true }
 
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala
index 87d7ece..86900f2 100644
--- a/src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala
@@ -51,7 +51,7 @@ trait DiagramFactory extends DiagramDirectiveParser {
             case p: (TemplateEntity, TypeEntity) if !classExcluded(p._1) => NormalNode(p._2, Some(p._1))()
           }.reverse
 
-        // incoming implcit conversions
+        // incoming implicit conversions
         lazy val incomingImplicitNodes = tpl.incomingImplicitlyConvertedClasses.map {
           case (incomingTpl, conv) =>
             ImplicitNode(makeType(incomingTpl.sym.tpe, tpl), Some(incomingTpl))(implicitTooltip(from=incomingTpl, to=tpl, conv=conv))
@@ -248,7 +248,7 @@ trait DiagramFactory extends DiagramDirectiveParser {
                 case _ => Nil
               })
 
-            // Only show the the non-isolated nodes
+            // Only show the non-isolated nodes
             // TODO: Decide if we really want to hide package members, I'm not sure that's a good idea (!!!)
             // TODO: Does .distinct cause any stability issues?
             val sourceNodes = edges.map(_._1)
diff --git a/src/scalap/decoder.properties b/src/scalap/decoder.properties
index 961c60f..9bb8d13 100644
--- a/src/scalap/decoder.properties
+++ b/src/scalap/decoder.properties
@@ -1,2 +1,2 @@
 version.number=2.0.1
-copyright.string=(c) 2002-2013 LAMP/EPFL
+copyright.string=(c) 2002-2016 LAMP/EPFL
diff --git a/src/scalap/scala/tools/scalap/CodeWriter.scala b/src/scalap/scala/tools/scalap/CodeWriter.scala
index 1680500..07aba0b 100644
--- a/src/scalap/scala/tools/scalap/CodeWriter.scala
+++ b/src/scalap/scala/tools/scalap/CodeWriter.scala
@@ -35,7 +35,7 @@ class CodeWriter(writer: Writer) {
   def setIndentWidth(width: Int): CodeWriter =
     setIndentString(List.fill(width)(' ').mkString)
 
-  def getIndentString = step;
+  def getIndentString = step
 
   def setIndentString(step: String): CodeWriter = {
     this.step = step
diff --git a/src/scalap/scala/tools/scalap/Decode.scala b/src/scalap/scala/tools/scalap/Decode.scala
index 76ce3f4..310d611 100644
--- a/src/scalap/scala/tools/scalap/Decode.scala
+++ b/src/scalap/scala/tools/scalap/Decode.scala
@@ -49,7 +49,7 @@ object Decode {
     import classFile._
 
     classFile annotation SCALA_SIG_ANNOTATION map { case Annotation(_, els) =>
-      val bytesElem = els find (x => constant(x.elementNameIndex) == BYTES_VALUE) getOrElse null
+      val bytesElem = els find (x => constant(x.elementNameIndex) == BYTES_VALUE) orNull
       val _bytes    = bytesElem.elementValue match { case ConstValueIndex(x) => constantWrapped(x) }
       val bytes     = _bytes.asInstanceOf[StringBytesPair].bytes
       val length    = ByteCodecs.decode(bytes)
diff --git a/src/scalap/scala/tools/scalap/JavaWriter.scala b/src/scalap/scala/tools/scalap/JavaWriter.scala
index 772cf6e..75e2637 100644
--- a/src/scalap/scala/tools/scalap/JavaWriter.scala
+++ b/src/scalap/scala/tools/scalap/JavaWriter.scala
@@ -164,7 +164,7 @@ class JavaWriter(classfile: Classfile, writer: Writer) extends CodeWriter(writer
   }
 
   def printClass() {
-    val pck = getPackage(cf.classname);
+    val pck = getPackage(cf.classname)
     if (pck.length() > 0)
       println("package " + pck + ";")
     print(flagsToStr(true, cf.flags))
@@ -175,14 +175,14 @@ class JavaWriter(classfile: Classfile, writer: Writer) extends CodeWriter(writer
         printClassHeader;
       case Some(cf.Attribute(_, data)) =>
         val mp = new MetaParser(getName(
-          ((data(0) & 0xff) << 8) + (data(1) & 0xff)).trim());
+          ((data(0) & 0xff) << 8) + (data(1) & 0xff)).trim())
         mp.parse match {
           case None => printClassHeader;
           case Some(str) =>
             if (isInterface(cf.flags))
-              print("trait " + getSimpleClassName(cf.classname) + str);
+              print("trait " + getSimpleClassName(cf.classname) + str)
             else
-              print("class " + getSimpleClassName(cf.classname) + str);
+              print("class " + getSimpleClassName(cf.classname) + str)
         }
     }
     var statics: List[cf.Member] = Nil
diff --git a/src/scalap/scala/tools/scalap/Main.scala b/src/scalap/scala/tools/scalap/Main.scala
index 7c554d1..3d2bfd7 100644
--- a/src/scalap/scala/tools/scalap/Main.scala
+++ b/src/scalap/scala/tools/scalap/Main.scala
@@ -28,6 +28,7 @@ import scalax.rules.scalasig._
 class Main {
   val SCALA_SIG            = "ScalaSig"
   val SCALA_SIG_ANNOTATION = "Lscala/reflect/ScalaSignature;"
+  val SCALA_LONG_SIG_ANNOTATION = "Lscala/reflect/ScalaLongSignature;"
   val BYTES_VALUE          = "bytes"
 
   val versionMsg = "Scala classfile decoder %s -- %s\n".format(Properties.versionString, Properties.copyrightString)
diff --git a/src/scalap/scala/tools/scalap/MetaParser.scala b/src/scalap/scala/tools/scalap/MetaParser.scala
index 1ebf862..b9dab0a 100644
--- a/src/scalap/scala/tools/scalap/MetaParser.scala
+++ b/src/scalap/scala/tools/scalap/MetaParser.scala
@@ -64,7 +64,7 @@ class MetaParser(meta: String) {
         case _: Exception => None
       }
     } else
-      None;
+      None
 
   protected def parseMetaClass: String = {
     nextToken
@@ -100,7 +100,7 @@ class MetaParser(meta: String) {
         parseType
       } while (token == "with")
     }
-    res.toString();
+    res.toString()
   }
 
   protected def parseMetaMethod: String = {
@@ -113,10 +113,10 @@ class MetaParser(meta: String) {
         var loop = true
         res.append("[")
         while (loop) {
-          res.append(token.substring(1));
-          nextToken;
+          res.append(token.substring(1))
+          nextToken
           if (token == "<") {
-            nextToken;
+            nextToken
             res.append(" <: ")
             parseType
           }
@@ -133,16 +133,16 @@ class MetaParser(meta: String) {
     if (token == "(") {
       do {
         if (token == ",") {
-          nextToken;
+          nextToken
           if (token != ")")
             res.append(", ")
         } else {
-          nextToken;
+          nextToken
           res.append("(")
         }
         if (token != ")") {
           if (token == "def") {
-            nextToken;
+            nextToken
             res.append("def ")
           }
           parseType
diff --git a/src/scalap/scala/tools/scalap/scalax/rules/Result.scala b/src/scalap/scala/tools/scalap/scalax/rules/Result.scala
index f37340e..b6f650b 100644
--- a/src/scalap/scala/tools/scalap/scalax/rules/Result.scala
+++ b/src/scalap/scala/tools/scalap/scalax/rules/Result.scala
@@ -12,7 +12,7 @@
 
 package scala.tools.scalap
 package scalax
-package rules;
+package rules
 
 /** Represents the combined value of two rules applied in sequence.
  *
diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ClassFileParser.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ClassFileParser.scala
index cfd7500..eed76c3 100644
--- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ClassFileParser.scala
+++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ClassFileParser.scala
@@ -114,6 +114,9 @@ object ClassFileParser extends ByteCodeReader {
   val methodRef = memberRef("Method")
   val interfaceMethodRef = memberRef("InterfaceMethod")
   val nameAndType = u2 ~ u2 ^^ add1 { case name ~ descriptor => pool => "NameAndType: " + pool(name) + ", " + pool(descriptor) }
+  val methodHandle = u1 ~ u2 ^^ add1 { case referenceKind ~ referenceIndex => pool => "MethodHandle: " + referenceKind + ", " + pool(referenceIndex) }
+  val methodType = u2 ^^ add1 { case descriptorIndex => pool => "MethodType: " + pool(descriptorIndex) }
+  val invokeDynamic = u2 ~ u2 ^^ add1 { case bootstrapMethodAttrIndex ~ nameAndTypeIndex => pool => "InvokeDynamic: " + "bootstrapMethodAttrIndex = " + bootstrapMethodAttrIndex + ", " + pool(nameAndTypeIndex) }
 
   val constantPoolEntry = u1 >> {
     case 1 => utf8String
@@ -127,6 +130,9 @@ object ClassFileParser extends ByteCodeReader {
     case 10 => methodRef
     case 11 => interfaceMethodRef
     case 12 => nameAndType
+    case 15 => methodHandle
+    case 16 => methodType
+    case 18 => invokeDynamic
   }
 
   val interfaces = u2 >> u2.times
diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala
index e307632..c36fdd0 100644
--- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala
+++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala
@@ -14,20 +14,32 @@ package scalasig
 import scala.language.postfixOps
 import scala.language.implicitConversions
 
-import ClassFileParser.{ ConstValueIndex, Annotation }
+import ClassFileParser._
 import scala.reflect.internal.pickling.ByteCodecs
 
 object ScalaSigParser {
-  import Main.{ SCALA_SIG, SCALA_SIG_ANNOTATION, BYTES_VALUE }
+  import Main.{ BYTES_VALUE, SCALA_LONG_SIG_ANNOTATION, SCALA_SIG, SCALA_SIG_ANNOTATION }
 
+  // TODO SI-9296 duplicated code, refactor
   def scalaSigFromAnnotation(classFile: ClassFile): Option[ScalaSig] = {
     import classFile._
 
-    classFile.annotation(SCALA_SIG_ANNOTATION) map {
+    def getBytes(bytesElem: AnnotationElement): Array[Byte] = bytesElem.elementValue match {
+      case ConstValueIndex(index) => bytesForIndex(index)
+      case ArrayValue(signatureParts) => mergedLongSignatureBytes(signatureParts)
+    }
+
+    def mergedLongSignatureBytes(signatureParts: Seq[ElementValue]): Array[Byte] = signatureParts.flatMap {
+      case ConstValueIndex(index) => bytesForIndex(index)
+    }(collection.breakOut)
+
+    def bytesForIndex(index: Int) = constantWrapped(index).asInstanceOf[StringBytesPair].bytes
+
+    classFile.annotation(SCALA_SIG_ANNOTATION)
+      .orElse(classFile.annotation(SCALA_LONG_SIG_ANNOTATION)).map {
       case Annotation(_, elements) =>
         val bytesElem = elements.find(elem => constant(elem.elementNameIndex) == BYTES_VALUE).get
-        val bytes = ((bytesElem.elementValue match {case ConstValueIndex(index) => constantWrapped(index)})
-                .asInstanceOf[StringBytesPair].bytes)
+        val bytes = getBytes(bytesElem)
         val length = ByteCodecs.decode(bytes)
 
         ScalaSigAttributeParsers.parse(ByteCode(bytes.take(length)))
diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala
index dd17c39..3bfb82a 100644
--- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala
+++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala
@@ -91,7 +91,7 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) {
 
   def printWithIndent(level: Int, s: String) {
     def indent() {for (i <- 1 to level) print("  ")}
-    indent;
+    indent
     print(s)
   }
 
@@ -208,7 +208,7 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) {
       mt.resultType match {
         case mt: MethodType => printMethodType(mt, printResult)({})
         case x => if (printResult) {
-          print(": ");
+          print(": ")
           printType(x)
         }
       }
@@ -374,7 +374,7 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) {
       }
       case AnnotatedWithSelfType(typeRef, symbol, attribTreeRefs) => toString(typeRef, sep)
       case ExistentialType(typeRef, symbols) => {
-        val refs = symbols.map(toString _).filter(!_.startsWith("_")).map("type " + _)
+        val refs = symbols.map(toString).filter(!_.startsWith("_")).map("type " + _)
         toString(typeRef, sep) + (if (refs.size > 0) refs.mkString(" forSome {", "; ", "}") else "")
       }
       case _ => sep + t.toString
diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Coder.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Coder.scala
index 9cc1f4a..04e3708 100644
--- a/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Coder.scala
+++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Coder.scala
@@ -16,7 +16,7 @@ class SeqCoder(words: List[String]) {
       '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL", 
       '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ")
       
-  /** Invert the mnemnonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */
+  /** Invert the mnemonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */
   private val charCode: Map[Char, Char] = 
     for ((digit, letters) <- m; letter <- letters) yield letter -> digit
     
@@ -63,7 +63,7 @@ class ParCoder(words: List[String]) {
       '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL", 
       '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ")
       
-  /** Invert the mnemnonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */
+  /** Invert the mnemonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */
   private val charCode: Map[Char, Char] = 
     for ((digit, letters) <- m; letter <- letters) yield letter -> digit
     
diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/SequentialOps.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/SequentialOps.scala
index ba32036..9300851 100644
--- a/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/SequentialOps.scala
+++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/SequentialOps.scala
@@ -425,7 +425,7 @@ trait SequentialOps[T] {
   }
   
   def sequentialDiff(sq: Seq[T], sz: Int) = {
-    val occmap = occurences(sq)
+    val occmap = occurrences(sq)
     val b = new collection.mutable.ArrayBuffer[T]
     
     var i = 0
@@ -442,7 +442,7 @@ trait SequentialOps[T] {
   }
   
   def sequentialIntersect(sq: Seq[T], sz: Int) = {
-    val occmap = occurences(sq)
+    val occmap = occurrences(sq)
     val b = new collection.mutable.ArrayBuffer[T]
     
     var i = 0
@@ -461,7 +461,7 @@ trait SequentialOps[T] {
     res
   }
   
-  private def occurences(sq: Seq[T]) = {
+  private def occurrences(sq: Seq[T]) = {
     val occmap = new collection.mutable.HashMap[T, Int] { override def default(k: T) = 0 }
     for (elem <- sq.iterator) occmap(elem) += 1
     occmap
diff --git a/test/disabled/coder/Coder.scala b/test/disabled/coder/Coder.scala
index 4e29c2a..62b99e0 100644
--- a/test/disabled/coder/Coder.scala
+++ b/test/disabled/coder/Coder.scala
@@ -10,7 +10,7 @@ class SeqCoder(words: List[String]) {
       '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL", 
       '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ")
       
-  /** Invert the mnemnonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */
+  /** Invert the mnemonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */
   private val charCode: Map[Char, Char] = 
     for ((digit, letters) <- m; letter <- letters) yield letter -> digit
     
@@ -65,7 +65,7 @@ class ParCoder(words: List[String]) {
       '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL", 
       '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ")
       
-  /** Invert the mnemnonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */
+  /** Invert the mnemonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */
   private val charCode: Map[Char, Char] = 
     for ((digit, letters) <- m; letter <- letters) yield letter -> digit
     
diff --git a/test/disabled/pos/spec-List.scala b/test/disabled/pos/spec-List.scala
index b31e035..6bed08a 100644
--- a/test/disabled/pos/spec-List.scala
+++ b/test/disabled/pos/spec-List.scala
@@ -438,7 +438,7 @@ case object Nil extends List[Nothing] {
     throw new NoSuchElementException("head of empty list")
   override def tail: List[Nothing] =
     throw new NoSuchElementException("tail of empty list")
-  // Removal of equals method here might lead to an infinite recusion similar to IntMap.equals.
+  // Removal of equals method here might lead to an infinite recursion similar to IntMap.equals.
   override def equals(that: Any) = that match {
     case that1: Seq[_] => that1.isEmpty
     case _ => false
diff --git a/test/disabled/pos/t1545.scala b/test/disabled/pos/t1545.scala
old mode 100755
new mode 100644
diff --git a/test/disabled/presentation/akka/src/akka/actor/ActorRef.scala b/test/disabled/presentation/akka/src/akka/actor/ActorRef.scala
index da0b630..97bb710 100644
--- a/test/disabled/presentation/akka/src/akka/actor/ActorRef.scala
+++ b/test/disabled/presentation/akka/src/akka/actor/ActorRef.scala
@@ -1384,7 +1384,7 @@ trait ScalaActorRef extends ActorRefShared { ref: ActorRef =>
       "\n\tYou have probably: " +
       "\n\t\t1. Sent a message to an Actor from an instance that is NOT an Actor." +
       "\n\t\t2. Invoked a method on an TypedActor from an instance NOT an TypedActor." +
-      "\n\tElse you might want to use 'reply_?' which returns Boolean(true) if succes and Boolean(false) if no sender in scope")
+      "\n\tElse you might want to use 'reply_?' which returns Boolean(true) if success and Boolean(false) if no sender in scope")
 
   /**
    * Use <code>reply_?(..)</code> to reply with a message to the original sender of the message currently
diff --git a/test/disabled/presentation/akka/src/akka/actor/Supervisor.scala b/test/disabled/presentation/akka/src/akka/actor/Supervisor.scala
index 4a1309f..bec3c83 100644
--- a/test/disabled/presentation/akka/src/akka/actor/Supervisor.scala
+++ b/test/disabled/presentation/akka/src/akka/actor/Supervisor.scala
@@ -95,7 +95,7 @@ case class SupervisorFactory(val config: SupervisorConfig) {
  * wire the children together using 'link', 'spawnLink' etc. and set the 'trapExit' flag in the
  * children that should trap error signals and trigger restart.
  * <p/>
- * See the ScalaDoc for the SupervisorFactory for an example on how to declaratively wire up children.
+ * See the Scaladoc for the SupervisorFactory for an example on how to declaratively wire up children.
  *
  * @author <a href="http://jonasboner.com">Jonas Bonér</a>
  */
diff --git a/test/disabled/presentation/timeofday/src/timeofday.scala b/test/disabled/presentation/timeofday/src/timeofday.scala
index d635509..c8dc7cf 100644
--- a/test/disabled/presentation/timeofday/src/timeofday.scala
+++ b/test/disabled/presentation/timeofday/src/timeofday.scala
@@ -2,7 +2,7 @@ object timeofday {
   class DateError extends Exception
 
   /** Simulating properties in Scala 
-   *  (example 4.2.1 in ScalaReference.pdf) 
+   *  (example 4.2.1 in the Scala Language Specification)
    */
   class TimeOfDayVar {
     private var h, m, s: Int = 0
@@ -32,4 +32,4 @@ object timeofday {
     d.hours = 8; d./*!*/minutes = 30; d.seconds = 0
     d.hours/*#*/ = 25 // throws a DateError exception
   }
-}
\ No newline at end of file
+}
diff --git a/test/disabled/run/coder2/Coder2.scala b/test/disabled/run/coder2/Coder2.scala
index 43b2e9b..c1ec70b 100644
--- a/test/disabled/run/coder2/Coder2.scala
+++ b/test/disabled/run/coder2/Coder2.scala
@@ -10,7 +10,7 @@ class SeqCoder(words: List[String]) {
       '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL", 
       '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ")
       
-  /** Invert the mnemnonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */
+  /** Invert the mnemonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */
   private val charCode: Map[Char, Char] = 
     for ((digit, letters) <- m; letter <- letters) yield letter -> digit
     
diff --git a/test/files/bench/equality/eq.scala b/test/files/bench/equality/eq.scala
old mode 100755
new mode 100644
diff --git a/test/files/bench/equality/eqeq.scala b/test/files/bench/equality/eqeq.scala
old mode 100755
new mode 100644
diff --git a/test/files/filters b/test/files/filters
index 51a7507..e91ca0e 100644
--- a/test/files/filters
+++ b/test/files/filters
@@ -1,6 +1,7 @@
 #
 #Java HotSpot(TM) 64-Bit Server VM warning: Failed to reserve shared memory (errno = 28).
 Java HotSpot\(TM\) .* warning:
+OpenJDK .* warning:
 # Hotspot receiving VM options through the $_JAVA_OPTIONS
 # env variable outputs them on stderr
 Picked up _JAVA_OPTIONS:
diff --git a/test/files/instrumented/inline-in-constructors.flags b/test/files/instrumented/inline-in-constructors.flags
index 068318e..d1ebc4c 100644
--- a/test/files/instrumented/inline-in-constructors.flags
+++ b/test/files/instrumented/inline-in-constructors.flags
@@ -1 +1 @@
--optimise -Ydelambdafy:inline
+-optimise -Ydelambdafy:inline -Ybackend:GenASM
diff --git a/test/files/jvm/bytecode-test-example/Test.scala b/test/files/jvm/bytecode-test-example/Test.scala
index d668059..0da54d5 100644
--- a/test/files/jvm/bytecode-test-example/Test.scala
+++ b/test/files/jvm/bytecode-test-example/Test.scala
@@ -17,7 +17,7 @@ object Test extends BytecodeTest {
   def countNullChecks(insnList: InsnList): Int = {
     /** Is given instruction a null check?
      *  NOTE
-     *   This will detect direct null compparsion as in
+     *   This will detect direct null comparison as in
      *    if (x == null) ...
      *   and not indirect as in
      *     val foo = null
diff --git a/test/files/jvm/constant-optimization/Foo_1.flags b/test/files/jvm/constant-optimization/Foo_1.flags
index 86f52af..67a1dbe 100644
--- a/test/files/jvm/constant-optimization/Foo_1.flags
+++ b/test/files/jvm/constant-optimization/Foo_1.flags
@@ -1 +1 @@
--Ynooptimise -Yconst-opt
\ No newline at end of file
+-Ynooptimise -Yconst-opt -Ybackend:GenASM
\ No newline at end of file
diff --git a/test/files/jvm/inner.scala b/test/files/jvm/inner.scala
index c05e803..dc01b12 100644
--- a/test/files/jvm/inner.scala
+++ b/test/files/jvm/inner.scala
@@ -77,7 +77,7 @@ object Scalatest {
   def java(cname: String) =
     exec(javacmd, "-cp", classpath, cname)
 
-  /** Execute cmd, wait for the process to end and pipe it's output to stdout */
+  /** Execute cmd, wait for the process to end and pipe its output to stdout */
   private def exec(args: String*) {
     val proc = Runtime.getRuntime().exec(args.toArray)
     val inp = new BufferedReader(new InputStreamReader(proc.getInputStream))
diff --git a/test/files/jvm/innerClassAttribute.check b/test/files/jvm/innerClassAttribute.check
index bb532e4..41448f3 100644
--- a/test/files/jvm/innerClassAttribute.check
+++ b/test/files/jvm/innerClassAttribute.check
@@ -14,27 +14,27 @@ A19 / null / null
 A19 / null / null
 A19 / null / null
 -- A20 --
-A20$$anonfun$6 / null / null / 17
+A20$$anonfun$4 / null / null / 17
 fun1: attribute for itself and the two child closures `() => ()` and `() => () => 1`
-A20$$anonfun$6 / null / null / 17
-A20$$anonfun$6$$anonfun$apply$1 / null / null / 17
-A20$$anonfun$6$$anonfun$apply$3 / null / null / 17
+A20$$anonfun$4 / null / null / 17
+A20$$anonfun$4$$anonfun$apply$1 / null / null / 17
+A20$$anonfun$4$$anonfun$apply$2 / null / null / 17
 fun2 () => (): itself and the outer closure
-A20$$anonfun$6 / null / null / 17
-A20$$anonfun$6$$anonfun$apply$1 / null / null / 17
+A20$$anonfun$4 / null / null / 17
+A20$$anonfun$4$$anonfun$apply$1 / null / null / 17
 fun3 () => () => (): itself, the outer closure and its child closure
-A20$$anonfun$6 / null / null / 17
-A20$$anonfun$6$$anonfun$apply$3 / null / null / 17
-A20$$anonfun$6$$anonfun$apply$3$$anonfun$apply$2 / null / null / 17
+A20$$anonfun$4 / null / null / 17
+A20$$anonfun$4$$anonfun$apply$2 / null / null / 17
+A20$$anonfun$4$$anonfun$apply$2$$anonfun$apply$3 / null / null / 17
 fun4: () => 1: itself and the two outer closures
-A20$$anonfun$6 / null / null / 17
-A20$$anonfun$6$$anonfun$apply$3 / null / null / 17
-A20$$anonfun$6$$anonfun$apply$3$$anonfun$apply$2 / null / null / 17
+A20$$anonfun$4 / null / null / 17
+A20$$anonfun$4$$anonfun$apply$2 / null / null / 17
+A20$$anonfun$4$$anonfun$apply$2$$anonfun$apply$3 / null / null / 17
 enclosing: nested closures have outer class defined, but no outer method
 A20 / null / null
-A20$$anonfun$6 / null / null
-A20$$anonfun$6 / null / null
-A20$$anonfun$6$$anonfun$apply$3 / null / null
+A20$$anonfun$4 / null / null
+A20$$anonfun$4 / null / null
+A20$$anonfun$4$$anonfun$apply$2 / null / null
 #partest -Ydelambdafy:method
 -- A4 --
 null / null / null
diff --git a/test/files/jvm/innerClassAttribute/Classes_1.scala b/test/files/jvm/innerClassAttribute/Classes_1.scala
index fb1f32a..62c7d94 100644
--- a/test/files/jvm/innerClassAttribute/Classes_1.scala
+++ b/test/files/jvm/innerClassAttribute/Classes_1.scala
@@ -12,8 +12,8 @@ object A3 {
 }
 
 class A4 {
-  def f(l: List[Int]): List[Int] = {
-    l map (_ + 1)
+  def f(l: List[String]): List[String] = {
+    l map (_ + "1")
   }
 }
 
@@ -114,21 +114,21 @@ class A18 {
 }
 
 class A19 {
-  ((x: Int) => x + 3)
+  ((x: String) => x + "3")
 
   val x = {
-    ((x: Int) => x + 1)
+    ((x: String) => x + "1")
   }
 
   {
-    ((x: Int) => x + 2)
+    ((x: String) => x + "2")
   }
 }
 
 class A20 {
-  () => {
-    {() => ()}
-    {() => () => 1}
+  (s: String) => {
+    {(s: String) => ()}
+    {(s: String) => (s: String) => 1}
   }
 }
 
@@ -189,13 +189,13 @@ trait A24 extends A24Base {
 class SI_9105 {    
   // the EnclosingMethod attributes depend on the delambdafy strategy (inline vs method)
 
-                                       //  outerClass-inline   enclMeth-inline   outerClass-method   enclMeth-method                    
-  val fun = () => {
+                                       //  outerClass-inline   enclMeth-inline   outerClass-method   enclMeth-method
+  val fun = (s: String) => {
     class A                            //     closure             null (*)            SI_9105           null
     def m: Object = { class B; new B } //     closure              m$1                SI_9105            m$1
     val f: Object = { class C; new C } //     closure             null (*)            SI_9105           null
   }
-  def met = () => {
+  def met = (s: String) => {
     class D                            //     closure             null (*)            SI_9105            met
     def m: Object = { class E; new E } //     closure              m$1                SI_9105            m$1
     val f: Object = { class F; new F } //     closure             null (*)            SI_9105            met
@@ -210,17 +210,19 @@ class SI_9105 {
   //     So using `null` looks more like the situation in the source code: C / F are nested classes of the anon-fun, and
   //     there's no method in between.
 
-  def byName[T](op: => T) = 0
+  def byName(op: => Any) = 0
 
   val bnV = byName {
     class G                            //     closure             null (*)            SI_9105           null
     def m: Object = { class H; new H } //     closure              m$1                SI_9105            m$1
     val f: Object = { class I; new I } //     closure             null (*)            SI_9105           null
+    ""
   }
   def bnM = byName {
     class J                            //     closure             null (*)            SI_9105            bnM
     def m: Object = { class K; new K } //     closure              m$1                SI_9105            m$1
     val f: Object = { class L; new L } //     closure             null (*)            SI_9105            bnM
+    ""
   }
 }
 
@@ -283,8 +285,8 @@ object NestedInValueClass {
   class A(val arg: String) extends AnyVal {
     // A has InnerClass entries for the two closures (and for A and A$). not for B / C
     def f = {
-      def g = List().map(x => (() => x)) // outer class A, no outer method (g is moved to the companion, doesn't exist in A)
-      g.map(x => (() => x))              // outer class A, outer method f
+      def g = List().map(x => ((s: String) => x)) // outer class A, no outer method (g is moved to the companion, doesn't exist in A)
+      g.map(x => ((s: String) => x))              // outer class A, outer method f
     }
     // statements and field declarations are not allowed in value classes
   }
diff --git a/test/files/jvm/innerClassAttribute/Test.scala b/test/files/jvm/innerClassAttribute/Test.scala
index bc9aa23..3a6737c 100644
--- a/test/files/jvm/innerClassAttribute/Test.scala
+++ b/test/files/jvm/innerClassAttribute/Test.scala
@@ -5,11 +5,14 @@ import asm.{Opcodes => Flags}
 import scala.collection.JavaConverters._
 
 object Test extends BytecodeTest {
+  // Helpful for debugging the test:
+  // println(new java.io.File(classpath.asURLs.head.toURI).list().sorted.mkString("\n"))
+
   def assertSame(a: Any, b: Any) = {
     assert(a == b, s"\na: $a\nb: $b")
   }
 
-  val publicStatic = Flags.ACC_PUBLIC | Flags.ACC_STATIC 
+  val publicStatic = Flags.ACC_PUBLIC | Flags.ACC_STATIC
   val publicAbstractInterface = Flags.ACC_PUBLIC | Flags.ACC_ABSTRACT | Flags.ACC_INTERFACE
 
   def innerClassNodes(className: String): List[InnerClassNode] = {
@@ -146,9 +149,7 @@ object Test extends BytecodeTest {
 
   def testA11() = {
     val List(ann) = innerClassNodes("A11")
-    // in the java class file, the INNERCLASS attribute has more flags (public | static | abstract | interface | annotation)
-    // the scala compiler has its own interpretation of java annotations ant their flags.. it only emits publicStatic.
-    assertMember(ann, "JavaAnnot_1", "Ann", flags = publicStatic)
+    assertMember(ann, "JavaAnnot_1", "Ann", flags = publicAbstractInterface | Flags.ACC_STATIC | Flags.ACC_ANNOTATION)
   }
 
   def testA13() = {
@@ -266,10 +267,10 @@ object Test extends BytecodeTest {
 
     printInnerClassNodes("A20")
 
-    val fun1 = lambdaClass("A20$$anonfun$6", "A20$lambda$1")
-    val fun2 = lambdaClass("A20$$anonfun$6$$anonfun$apply$1", "A20$lambda$$$nestedInAnonfun$5$1")
-    val fun3 = lambdaClass("A20$$anonfun$6$$anonfun$apply$3", "A20$lambda$$$nestedInAnonfun$5$2")
-    val fun4 = lambdaClass("A20$$anonfun$6$$anonfun$apply$3$$anonfun$apply$2", "A20$lambda$$$nestedInAnonfun$7$1")
+    val fun1 = lambdaClass("A20$$anonfun$4", "A20$lambda$1")
+    val fun2 = lambdaClass("A20$$anonfun$4$$anonfun$apply$1", "A20$lambda$$$nestedInAnonfun$5$1")
+    val fun3 = lambdaClass("A20$$anonfun$4$$anonfun$apply$2", "A20$lambda$$$nestedInAnonfun$5$2")
+    val fun4 = lambdaClass("A20$$anonfun$4$$anonfun$apply$2$$anonfun$apply$3", "A20$lambda$$$nestedInAnonfun$7$1")
 
     println("fun1: attribute for itself and the two child closures `() => ()` and `() => () => 1`")
     printInnerClassNodes(fun1)
@@ -339,9 +340,9 @@ object Test extends BytecodeTest {
       assertEnclosingMethod  ("SI_9105$A$3"          , "SI_9105", null , null)
       assertEnclosingMethod  ("SI_9105$B$5"          , "SI_9105", "m$1", "()Ljava/lang/Object;")
       assertEnclosingMethod  ("SI_9105$C$1"          , "SI_9105", null , null)
-      assertEnclosingMethod  ("SI_9105$D$1"          , "SI_9105", "met", "()Lscala/Function0;")
+      assertEnclosingMethod  ("SI_9105$D$1"          , "SI_9105", "met", "()Lscala/Function1;")
       assertEnclosingMethod  ("SI_9105$E$1"          , "SI_9105", "m$3", "()Ljava/lang/Object;")
-      assertEnclosingMethod  ("SI_9105$F$1"          , "SI_9105", "met", "()Lscala/Function0;")
+      assertEnclosingMethod  ("SI_9105$F$1"          , "SI_9105", "met", "()Lscala/Function1;")
       assertNoEnclosingMethod("SI_9105$lambda$$met$1")
       assertNoEnclosingMethod("SI_9105$lambda$1")
       assertNoEnclosingMethod("SI_9105")
@@ -366,35 +367,35 @@ object Test extends BytecodeTest {
       assert(innerClassNodes("SI_9105").length == 12) // the 12 local classes
     } else {
       // comment in innerClassAttribute/Classes_1.scala explains the difference between A / C and D / F.
-      assertEnclosingMethod  ("SI_9105$$anonfun$4$A$3"    , "SI_9105$$anonfun$4"    , null          , null)
-      assertEnclosingMethod  ("SI_9105$$anonfun$4$B$5"    , "SI_9105$$anonfun$4"    , "m$1"         , "()Ljava/lang/Object;")
-      assertEnclosingMethod  ("SI_9105$$anonfun$4$C$1"    , "SI_9105$$anonfun$4"    , null          , null)
+      assertEnclosingMethod  ("SI_9105$$anonfun$5$A$3"    , "SI_9105$$anonfun$5"    , null          , null)
+      assertEnclosingMethod  ("SI_9105$$anonfun$5$B$5"    , "SI_9105$$anonfun$5"    , "m$1"         , "()Ljava/lang/Object;")
+      assertEnclosingMethod  ("SI_9105$$anonfun$5$C$1"    , "SI_9105$$anonfun$5"    , null          , null)
       assertEnclosingMethod  ("SI_9105$$anonfun$met$1$D$1", "SI_9105$$anonfun$met$1", null          , null)
       assertEnclosingMethod  ("SI_9105$$anonfun$met$1$E$1", "SI_9105$$anonfun$met$1", "m$3"         , "()Ljava/lang/Object;")
       assertEnclosingMethod  ("SI_9105$$anonfun$met$1$F$1", "SI_9105$$anonfun$met$1", null          , null)
-      assertEnclosingMethod  ("SI_9105$$anonfun$4"        , "SI_9105"               , null          , null)
-      assertEnclosingMethod  ("SI_9105$$anonfun$met$1"    , "SI_9105"               , "met"         , "()Lscala/Function0;")
+      assertEnclosingMethod  ("SI_9105$$anonfun$5"        , "SI_9105"               , null          , null)
+      assertEnclosingMethod  ("SI_9105$$anonfun$met$1"    , "SI_9105"               , "met"         , "()Lscala/Function1;")
       assertNoEnclosingMethod("SI_9105")
 
-      assertLocal(ownInnerClassNode("SI_9105$$anonfun$4$A$3"),     "SI_9105$$anonfun$4$A$3"    , "A$3")
-      assertLocal(ownInnerClassNode("SI_9105$$anonfun$4$B$5"),     "SI_9105$$anonfun$4$B$5"    , "B$5")
-      assertLocal(ownInnerClassNode("SI_9105$$anonfun$4$C$1"),     "SI_9105$$anonfun$4$C$1"    , "C$1")
+      assertLocal(ownInnerClassNode("SI_9105$$anonfun$5$A$3"),     "SI_9105$$anonfun$5$A$3"    , "A$3")
+      assertLocal(ownInnerClassNode("SI_9105$$anonfun$5$B$5"),     "SI_9105$$anonfun$5$B$5"    , "B$5")
+      assertLocal(ownInnerClassNode("SI_9105$$anonfun$5$C$1"),     "SI_9105$$anonfun$5$C$1"    , "C$1")
       assertLocal(ownInnerClassNode("SI_9105$$anonfun$met$1$D$1"), "SI_9105$$anonfun$met$1$D$1", "D$1")
       assertLocal(ownInnerClassNode("SI_9105$$anonfun$met$1$E$1"), "SI_9105$$anonfun$met$1$E$1", "E$1")
       assertLocal(ownInnerClassNode("SI_9105$$anonfun$met$1$F$1"), "SI_9105$$anonfun$met$1$F$1", "F$1")
 
       // by-name
-      assertEnclosingMethod("SI_9105$$anonfun$5$G$1", "SI_9105$$anonfun$5", null, null)
-      assertEnclosingMethod("SI_9105$$anonfun$5$H$1", "SI_9105$$anonfun$5", "m$2", "()Ljava/lang/Object;")
-      assertEnclosingMethod("SI_9105$$anonfun$5$I$1", "SI_9105$$anonfun$5", null, null)
+      assertEnclosingMethod("SI_9105$$anonfun$6$G$1", "SI_9105$$anonfun$6", null, null)
+      assertEnclosingMethod("SI_9105$$anonfun$6$H$1", "SI_9105$$anonfun$6", "m$2", "()Ljava/lang/Object;")
+      assertEnclosingMethod("SI_9105$$anonfun$6$I$1", "SI_9105$$anonfun$6", null, null)
       assertEnclosingMethod("SI_9105$$anonfun$bnM$1$J$1", "SI_9105$$anonfun$bnM$1", null, null)
       assertEnclosingMethod("SI_9105$$anonfun$bnM$1$K$2", "SI_9105$$anonfun$bnM$1", "m$4", "()Ljava/lang/Object;")
       assertEnclosingMethod("SI_9105$$anonfun$bnM$1$L$1", "SI_9105$$anonfun$bnM$1", null, null)
 
-      assertAnonymous(ownInnerClassNode("SI_9105$$anonfun$4"), "SI_9105$$anonfun$4")
+      assertAnonymous(ownInnerClassNode("SI_9105$$anonfun$5"), "SI_9105$$anonfun$5")
       assertAnonymous(ownInnerClassNode("SI_9105$$anonfun$met$1"), "SI_9105$$anonfun$met$1")
 
-      assert(innerClassNodes("SI_9105$$anonfun$4").length == 4)     // itself and three of the local classes
+      assert(innerClassNodes("SI_9105$$anonfun$5").length == 4)     // itself and three of the local classes
       assert(innerClassNodes("SI_9105$$anonfun$met$1").length == 4) // itself and three of the local classes
       assert(innerClassNodes("SI_9105").length == 4)                // the four anon funs
     }
@@ -474,7 +475,7 @@ object Test extends BytecodeTest {
     testInner("ImplClassesAreTopLevel$B2$1$class", b2)
     testInner("ImplClassesAreTopLevel$B3$1$class", b3)
     testInner("ImplClassesAreTopLevel$B4$class", b4)
- 
+
     testInner("ImplClassesAreTopLevel$B1", b1)
     testInner("ImplClassesAreTopLevel$B2$1", b2)
     testInner("ImplClassesAreTopLevel$B3$1", b3)
@@ -533,13 +534,13 @@ object Test extends BytecodeTest {
         "NestedInValueClass$A$lambda$$g$2$1",
         "NestedInValueClass$A$lambda$$f$extension$1",
         "NestedInValueClass$A$lambda$$$nestedInAnonfun$13$1",
-        "NestedInValueClass$A$lambda$$$nestedInAnonfun$15$1").foreach(assertNoEnclosingMethod)
+        "NestedInValueClass$A$lambda$$NestedInValueClass$A$$$nestedInAnonfun$15$1").foreach(assertNoEnclosingMethod)
       testInner("NestedInValueClass$A", a, am)
       testInner("NestedInValueClass$A$", a, am, b, c)
       testInner("NestedInValueClass$A$lambda$$g$2$1", am)
       testInner("NestedInValueClass$A$lambda$$f$extension$1", am)
       testInner("NestedInValueClass$A$lambda$$$nestedInAnonfun$13$1", am)
-      testInner("NestedInValueClass$A$lambda$$$nestedInAnonfun$15$1", am)
+      testInner("NestedInValueClass$A$lambda$$NestedInValueClass$A$$$nestedInAnonfun$15$1", am)
     } else {
       assertEnclosingMethod("NestedInValueClass$A$$anonfun$g$2$1"                         , "NestedInValueClass$A"                       , null, null)
       assertEnclosingMethod("NestedInValueClass$A$$anonfun$g$2$1$$anonfun$apply$4"        , "NestedInValueClass$A$$anonfun$g$2$1"        , null, null)
diff --git a/test/files/jvm/innerClassEnclMethodJavaReflection.scala b/test/files/jvm/innerClassEnclMethodJavaReflection.scala
index ee39cb4..a60b5ca 100644
--- a/test/files/jvm/innerClassEnclMethodJavaReflection.scala
+++ b/test/files/jvm/innerClassEnclMethodJavaReflection.scala
@@ -8,7 +8,7 @@ object Test extends App {
     // Some classes in scala-compiler.jar have references to jline / ant classes, which seem to be
     // not on the classpath. We just skip over those classes.
     // PENDING: for now we also allow missing $anonfun classes: the optimizer may eliminate some closures
-    // that are refferred to in EnclosingClass attributes. SI-9136
+    // that are referred to in EnclosingClass attributes. SI-9136
     val allowedMissingPackages = Set("jline", "org.apache.tools.ant", "$anonfun")
 
     def ok(t: Throwable) = {
@@ -25,12 +25,13 @@ object Test extends App {
 
   def testClasses(jarOrDirectory: String): Unit = {
     val classPath = AbstractFile.getDirectory(new java.io.File(jarOrDirectory))
+    val basePath = classPath.path + "/"
 
-    def flatten(f: AbstractFile): Iterator[AbstractFile] =
-      if (f.isClassContainer) f.iterator.flatMap(flatten)
-      else Iterator(f)
+    def flatten(f: AbstractFile, s: String): Iterator[(AbstractFile, String)] =
+      if (f.isClassContainer) f.iterator.map(ch => (ch, (if(s.isEmpty) "" else s + "/") + ch.name)).flatMap((flatten _).tupled)
+      else Iterator((f, s))
 
-    val classFullNames = flatten(classPath).filter(_.hasExtension("class")).map(_.path.replace("/", ".").replaceAll(".class$", ""))
+    val classFullNames = flatten(classPath, "").filter(_._1.hasExtension("class")).map(_._2.replace("/", ".").replaceAll(".class$", ""))
 
     // it seems that Class objects can only be GC'd together with their class loader
     //   (http://stackoverflow.com/questions/2433261/when-and-how-are-classes-garbage-collected-in-java)
diff --git a/test/files/jvm/interpreter.check b/test/files/jvm/interpreter.check
index d03edb6..ce3c806 100644
--- a/test/files/jvm/interpreter.check
+++ b/test/files/jvm/interpreter.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> // basics
 
@@ -32,7 +30,7 @@ scala> val four: anotherint = 4
 four: anotherint = 4
 
 scala> val bogus: anotherint = "hello"
-<console>:8: error: type mismatch;
+<console>:12: error: type mismatch;
  found   : String("hello")
  required: anotherint
     (which expands to)  Int
@@ -280,13 +278,13 @@ scala> // both of the following should abort immediately:
 
 scala> def x => y => z
 <console>:1: error: '=' expected but '=>' found.
-       def x => y => z
-             ^
+def x => y => z
+      ^
 
 scala> [1,2,3]
 <console>:1: error: illegal start of definition
-       [1,2,3]
-       ^
+[1,2,3]
+^
 
 scala> 
 
@@ -355,7 +353,7 @@ defined class Term
 scala> def f(e: Exp) = e match {  // non-exhaustive warning here
   case _:Fact => 3
 }
-<console>:18: warning: match may not be exhaustive.
+<console>:22: warning: match may not be exhaustive.
 It would fail on the following inputs: Exp(), Term()
        def f(e: Exp) = e match {  // non-exhaustive warning here
                        ^
@@ -365,6 +363,6 @@ scala> :quit
 plusOne: (x: Int)Int
 res0: Int = 6
 res0: String = after reset
-<console>:8: error: not found: value plusOne
-              plusOne(5) // should be undefined now
-              ^
+<console>:12: error: not found: value plusOne
+       plusOne(5) // should be undefined now
+       ^
diff --git a/test/files/jvm/javaReflection/Classes_1.scala b/test/files/jvm/javaReflection/Classes_1.scala
index 11963e2..e9cd4f7 100644
--- a/test/files/jvm/javaReflection/Classes_1.scala
+++ b/test/files/jvm/javaReflection/Classes_1.scala
@@ -13,7 +13,7 @@ class A {
     trait C
     object D
     new T { }
-    (() => -1)
+    (() => "-1")
     def f = { class KB }
   }
 
@@ -21,21 +21,21 @@ class A {
   new T { }
 
   // anonymous function, not a member
-  (() => 1)
+  (() => "1")
 
   def f = {
     class E
     trait F
     object G
     new T { }
-    (() => 2)
+    (() => "2")
 
     if (new Object().hashCode == 1) {
       class H
       trait I
       object J
       new T { }
-      (() => 3)
+      (() => "3")
     } else {
       ()
     }
@@ -46,7 +46,7 @@ class A {
     trait L
     object M
     new T { }
-    (() => 4)
+    (() => "4")
   }
 
   val x = {
@@ -54,7 +54,7 @@ class A {
     trait O
     object P
     new T { }
-    (() => 5)
+    (() => "5")
   }
 
   def this(x: Int) {
@@ -63,7 +63,7 @@ class A {
     trait R
     object S
     new T { }
-    (() => () => 5)
+    (() => () => "5")
   }
 }
 
@@ -72,7 +72,7 @@ object AO {
   trait C
   object D
   new T { }
-  (() => 1)
+  (() => "1")
 }
 
 trait AT {
@@ -80,5 +80,5 @@ trait AT {
   trait C
   object D
   new T { }
-  (() => 1)
+  (() => "1")
 }
diff --git a/test/files/jvm/javaReflection/Test.scala b/test/files/jvm/javaReflection/Test.scala
index 5b6ef1b..199399f 100644
--- a/test/files/jvm/javaReflection/Test.scala
+++ b/test/files/jvm/javaReflection/Test.scala
@@ -31,7 +31,7 @@ getSimpleName / getCanonicalName / isAnonymousClass / isLocalClass / isSynthetic
     These should be avoided, they yield unexpected results:
 
     - isAnonymousClass is always false. Scala-defined classes are never anonymous for Java
-      reflection. Java reflection insepects the class name to decide whether a class is
+      reflection. Java reflection inspects the class name to decide whether a class is
       anonymous, based on the name spec referenced above.
       Also, the implementation of "isAnonymousClass" calls "getSimpleName", which may throw.
 
@@ -124,8 +124,8 @@ object Test {
       // exclude files from Test.scala, just take those from Classes_1.scala
       case s if !s.startsWith("Test") && s.endsWith(".class") => s.substring(0, s.length - 6)
     }).sortWith((a, b) => {
-      // sort such that first there are all anonymous funcitions, then all other classes.
-      // within those cathegories, sort lexically.
+      // sort such that first there are all anonymous functions, then all other classes.
+      // within those categories, sort lexically.
       // this makes the check file smaller: it differs for anonymous functions between -Ydelambdafy:inline/method.
       // the other classes are the same.
       if (isAnonFunClassName(a)) !isAnonFunClassName(b) || a < b
diff --git a/test/files/jvm/patmat_opt_ignore_underscore.flags b/test/files/jvm/patmat_opt_ignore_underscore.flags
index 1182725..2cd4b38 100644
--- a/test/files/jvm/patmat_opt_ignore_underscore.flags
+++ b/test/files/jvm/patmat_opt_ignore_underscore.flags
@@ -1 +1 @@
--optimize
\ No newline at end of file
+-optimize -Ybackend:GenASM
\ No newline at end of file
diff --git a/test/files/jvm/patmat_opt_no_nullcheck.flags b/test/files/jvm/patmat_opt_no_nullcheck.flags
index 1182725..2cd4b38 100644
--- a/test/files/jvm/patmat_opt_no_nullcheck.flags
+++ b/test/files/jvm/patmat_opt_no_nullcheck.flags
@@ -1 +1 @@
--optimize
\ No newline at end of file
+-optimize -Ybackend:GenASM
\ No newline at end of file
diff --git a/test/files/jvm/patmat_opt_primitive_typetest.flags b/test/files/jvm/patmat_opt_primitive_typetest.flags
index 49d036a..b9bb091 100644
--- a/test/files/jvm/patmat_opt_primitive_typetest.flags
+++ b/test/files/jvm/patmat_opt_primitive_typetest.flags
@@ -1 +1 @@
--optimize
+-optimize -Ybackend:GenASM
diff --git a/test/files/jvm/protectedacc.scala b/test/files/jvm/protectedacc.scala
index 89e70b9..43d218f 100644
--- a/test/files/jvm/protectedacc.scala
+++ b/test/files/jvm/protectedacc.scala
@@ -74,7 +74,7 @@ package p {
   package b {
     import a._;
 
-    /** Test interraction with Scala inherited methods and currying. */
+    /** Test interaction with Scala inherited methods and currying. */
     class B extends A {
       class C {
         def m = {
diff --git a/test/files/jvm/t7006/Foo_1.flags b/test/files/jvm/t7006/Foo_1.flags
index 37b2116..29a9d42 100644
--- a/test/files/jvm/t7006/Foo_1.flags
+++ b/test/files/jvm/t7006/Foo_1.flags
@@ -1 +1 @@
--optimise -Ydebug -Xfatal-warnings
+-optimise -Ydebug -Xfatal-warnings -Ybackend:GenASM
diff --git a/test/files/jvm/t7006/Foo_1.scala b/test/files/jvm/t7006/Foo_1.scala
index 995619c..3985557 100644
--- a/test/files/jvm/t7006/Foo_1.scala
+++ b/test/files/jvm/t7006/Foo_1.scala
@@ -5,6 +5,6 @@ class Foo_1 {
     } finally {
       print("hello")
     }
-    while(true){} // ensure infinite loop doesn't break the algoirthm
+    while(true){} // ensure infinite loop doesn't break the algorithm
   }
 }
diff --git a/test/files/jvm/t8689.scala b/test/files/jvm/t8689.scala
index ef43a1d..3ee20d7 100644
--- a/test/files/jvm/t8689.scala
+++ b/test/files/jvm/t8689.scala
@@ -4,10 +4,15 @@ object Test {
     import ExecutionContext.Implicits.global
     val source1 = Promise[Int]()
     val source2 = Promise[Int]()
+    val done = Promise[Unit]()
     source2.completeWith(source1.future).future.onComplete {
-      case _ => print("success")
+      case _ =>
+         print("success")
+         done.success(())
     }
     source2.tryFailure(new TimeoutException)
     source1.success(123)
+    import duration._
+    Await.result(done.future, 120.seconds)
   }
-}
\ No newline at end of file
+}
diff --git a/test/files/jvm/throws-annot-from-java.check b/test/files/jvm/throws-annot-from-java.check
index c541b26..bf63926 100644
--- a/test/files/jvm/throws-annot-from-java.check
+++ b/test/files/jvm/throws-annot-from-java.check
@@ -1,12 +1,8 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> :power
-** Power User mode enabled - BEEP WHIR GYVE **
-** :phase has been set to 'typer'.          **
-** scala.tools.nsc._ has been imported      **
-** global._, definitions._ also imported    **
-** Try  :help, :vals, power.<tab>           **
+Power mode enabled. :phase is at typer.
+import scala.tools.nsc._, intp.global._, definitions._
+Try :help or completions for vals._ and power._
 
 scala> :paste
 // Entering paste mode (ctrl-D to finish)
diff --git a/test/files/jvm/unreachable/Test.scala b/test/files/jvm/unreachable/Test.scala
index 3f520eb..4c0fcb2 100644
--- a/test/files/jvm/unreachable/Test.scala
+++ b/test/files/jvm/unreachable/Test.scala
@@ -6,7 +6,7 @@ import scala.collection.JavaConverters._
 object Test extends BytecodeTest {
   def show: Unit = {
     val classNode = loadClassNode("Foo_1")
-    // Foo_1 is full of unreachable code which if not elimintated
+    // Foo_1 is full of unreachable code which if not eliminated
     // will result in NOPs as can be confirmed by adding -Ydisable-unreachable-prevention
     // to Foo_1.flags
     for (methodNode <- classNode.methods.asScala) {
diff --git a/test/files/jvm/xml05.check b/test/files/jvm/xml05.check
index cad9075..d456c5e 100644
--- a/test/files/jvm/xml05.check
+++ b/test/files/jvm/xml05.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> <city name="San José"/>
 res0: scala.xml.Elem = <city name="San José"/>
diff --git a/test/files/neg/case-collision2.flags b/test/files/neg/case-collision2.flags
index 5bfa9da..bea4690 100644
--- a/test/files/neg/case-collision2.flags
+++ b/test/files/neg/case-collision2.flags
@@ -1 +1 @@
--Ynooptimize -Ybackend:GenBCode -Xfatal-warnings
+-Ybackend:GenBCode -Xfatal-warnings
diff --git a/test/files/neg/choices.check b/test/files/neg/choices.check
index b114394..df4f234 100644
--- a/test/files/neg/choices.check
+++ b/test/files/neg/choices.check
@@ -1,2 +1,6 @@
+error: Usage: -Yresolve-term-conflict:<strategy>
+ where <strategy> choices are package, object, error (default: error)
+error: bad option: '-Yresolve-term-conflict'
 error: bad options: -Yresolve-term-conflict
-one error found
+error: flags file may only contain compiler options, found: -Yresolve-term-conflict
+four errors found
diff --git a/test/files/neg/depmet_1.check b/test/files/neg/depmet_1.check
index 7a4f845..1549856 100644
--- a/test/files/neg/depmet_1.check
+++ b/test/files/neg/depmet_1.check
@@ -1,7 +1,7 @@
-depmet_1.scala:2: error: illegal dependent method type: parameter appears in the type of another parameter in the same section or an earlier one
+depmet_1.scala:2: error: illegal dependent method type: parameter may only be referenced in a subsequent parameter section
   def precise0(y: x.type)(x: String): Unit = {}
                           ^
-depmet_1.scala:3: error: illegal dependent method type: parameter appears in the type of another parameter in the same section or an earlier one
+depmet_1.scala:3: error: illegal dependent method type: parameter may only be referenced in a subsequent parameter section
   def precise1(x: String, y: x.type): Unit = {}
                ^
 depmet_1.scala:4: error: not found: value y
diff --git a/test/files/neg/inlineMaxSize.check b/test/files/neg/inlineMaxSize.check
new file mode 100644
index 0000000..9d790e1
--- /dev/null
+++ b/test/files/neg/inlineMaxSize.check
@@ -0,0 +1,9 @@
+inlineMaxSize.scala:7: warning: C::i()I is annotated @inline but could not be inlined:
+The size of the callsite method C::j()I
+would exceed the JVM method size limit after inlining C::i()I.
+
+  @inline final def j = i + i + i
+                                ^
+error: No warnings can be incurred under -Xfatal-warnings.
+one warning found
+one error found
diff --git a/test/files/neg/inlineMaxSize.flags b/test/files/neg/inlineMaxSize.flags
new file mode 100644
index 0000000..9c6b811
--- /dev/null
+++ b/test/files/neg/inlineMaxSize.flags
@@ -0,0 +1 @@
+-Ybackend:GenBCode -Ydelambdafy:method -Yopt:l:classpath -Yopt-warnings -Xfatal-warnings
\ No newline at end of file
diff --git a/test/files/neg/inlineMaxSize.scala b/test/files/neg/inlineMaxSize.scala
new file mode 100644
index 0000000..9d2db1a
--- /dev/null
+++ b/test/files/neg/inlineMaxSize.scala
@@ -0,0 +1,8 @@
+// not a JUnit test because of https://github.com/scala-opt/scala/issues/23
+class C {
+  @inline final def f = 0
+  @inline final def g = f + f + f + f + f + f + f + f + f + f
+  @inline final def h = g + g + g + g + g + g + g + g + g + g
+  @inline final def i = h + h + h + h + h + h + h + h + h + h
+  @inline final def j = i + i + i
+}
diff --git a/test/files/neg/macro-invalidshape.check b/test/files/neg/macro-invalidshape.check
index aa694df..5093b87 100644
--- a/test/files/neg/macro-invalidshape.check
+++ b/test/files/neg/macro-invalidshape.check
@@ -8,8 +8,9 @@ macro [<static object>].<method name>[[<type args>]] or
 macro [<macro bundle>].<method name>[[<type args>]]
   def foo2(x: Any) = macro Impls.foo(null)(null)
                                  ^
-Macros_Test_2.scala:4: error: missing arguments for method foo in object Impls;
-follow this method with `_' if you want to treat it as a partially applied function
+Macros_Test_2.scala:4: error: missing argument list for method foo in object Impls
+Unapplied methods are only converted to functions when a function type is expected.
+You can make this conversion explicit by writing `foo _` or `foo(_)(_)` instead of `foo`.
   def foo3(x: Any) = macro {2; Impls.foo}
                                      ^
 Macros_Test_2.scala:7: error: macro implementation reference has wrong shape. required:
diff --git a/test/files/neg/macro-invalidusage-badargs.check b/test/files/neg/macro-invalidusage-badargs.check
index 4c11154..19ac652 100644
--- a/test/files/neg/macro-invalidusage-badargs.check
+++ b/test/files/neg/macro-invalidusage-badargs.check
@@ -9,7 +9,8 @@ Macros_Test_2.scala:6: error: too few argument lists for macro invocation
 Macros_Test_2.scala:7: error: Int does not take parameters
   foo(4)(2)
         ^
-Macros_Test_2.scala:8: error: macro applications do not support named and/or default arguments
+Macros_Test_2.scala:8: error: not enough arguments for macro method foo: (x: Int)Int.
+Unspecified value parameter x.
   foo()
      ^
 Macros_Test_2.scala:9: error: too many arguments for macro method foo: (x: Int)Int
diff --git a/test/files/neg/macro-without-xmacros-a.check b/test/files/neg/macro-without-xmacros-a.check
index ec194be..65445d8 100644
--- a/test/files/neg/macro-without-xmacros-a.check
+++ b/test/files/neg/macro-without-xmacros-a.check
@@ -2,7 +2,7 @@ Macros_2.scala:5: error: macro definition needs to be enabled
 by making the implicit value scala.language.experimental.macros visible.
 This can be achieved by adding the import clause 'import scala.language.experimental.macros'
 or by setting the compiler option -language:experimental.macros.
-See the Scala docs for value scala.language.experimental.macros for a discussion
+See the Scaladoc for value scala.language.experimental.macros for a discussion
 why the feature needs to be explicitly enabled.
     def foo(x: Int): Int = macro foo_impl
         ^
diff --git a/test/files/neg/macro-without-xmacros-b.check b/test/files/neg/macro-without-xmacros-b.check
index c97850f..e3c1010 100644
--- a/test/files/neg/macro-without-xmacros-b.check
+++ b/test/files/neg/macro-without-xmacros-b.check
@@ -2,7 +2,7 @@ Macros_2.scala:3: error: macro definition needs to be enabled
 by making the implicit value scala.language.experimental.macros visible.
 This can be achieved by adding the import clause 'import scala.language.experimental.macros'
 or by setting the compiler option -language:experimental.macros.
-See the Scala docs for value scala.language.experimental.macros for a discussion
+See the Scaladoc for value scala.language.experimental.macros for a discussion
 why the feature needs to be explicitly enabled.
     def foo(x: Int): Int = macro Impls.foo_impl
         ^
diff --git a/test/files/neg/missing-arg-list.check b/test/files/neg/missing-arg-list.check
new file mode 100644
index 0000000..5a011c3
--- /dev/null
+++ b/test/files/neg/missing-arg-list.check
@@ -0,0 +1,21 @@
+missing-arg-list.scala:9: error: missing argument list for method id in trait T
+Unapplied methods are only converted to functions when a function type is expected.
+You can make this conversion explicit by writing `id _` or `id(_)` instead of `id`.
+  val w = id
+          ^
+missing-arg-list.scala:10: error: missing argument list for method f in trait T
+Unapplied methods are only converted to functions when a function type is expected.
+You can make this conversion explicit by writing `f _` or `f(_)(_)` instead of `f`.
+  val x = f
+          ^
+missing-arg-list.scala:11: error: missing argument list for method g in trait T
+Unapplied methods are only converted to functions when a function type is expected.
+You can make this conversion explicit by writing `g _` or `g(_,_,_)` instead of `g`.
+  val y = g
+          ^
+missing-arg-list.scala:12: error: missing argument list for method h in trait T
+Unapplied methods are only converted to functions when a function type is expected.
+You can make this conversion explicit by writing `h _` or `h(_,_,_)(_)` instead of `h`.
+  val z = h
+          ^
+four errors found
diff --git a/test/files/neg/missing-arg-list.scala b/test/files/neg/missing-arg-list.scala
new file mode 100644
index 0000000..c422dd3
--- /dev/null
+++ b/test/files/neg/missing-arg-list.scala
@@ -0,0 +1,13 @@
+
+trait T {
+
+  def id(i: Int) = i
+  def f(i: Int)(j: Int) = i+j
+  def g(i: Int, j: Int, k: Int) = i+j+k
+  def h(i: Int, j: Int, k: Int)(implicit s: String) = s*(i+j+k)
+
+  val w = id
+  val x = f
+  val y = g
+  val z = h
+}
diff --git a/test/files/neg/name-lookup-stable.check b/test/files/neg/name-lookup-stable.check
index 751df95..68d98c4 100644
--- a/test/files/neg/name-lookup-stable.check
+++ b/test/files/neg/name-lookup-stable.check
@@ -6,6 +6,6 @@ import ColumnOption._
 name-lookup-stable.scala:17: error: reference to PrimaryKey is ambiguous;
 it is both defined in class A and imported subsequently by
 import ColumnOption._
-    PrimaryKey // was already ambigious in 2.10.3
+    PrimaryKey // was already ambiguous in 2.10.3
     ^
 two errors found
diff --git a/test/files/neg/name-lookup-stable.scala b/test/files/neg/name-lookup-stable.scala
index 0d862f0..2941e05 100644
--- a/test/files/neg/name-lookup-stable.scala
+++ b/test/files/neg/name-lookup-stable.scala
@@ -14,7 +14,7 @@ class A {
 
     (null: Any) match { case PrimaryKey => }
 
-    PrimaryKey // was already ambigious in 2.10.3
+    PrimaryKey // was already ambiguous in 2.10.3
   }
 }
 
diff --git a/test/files/neg/names-defaults-neg.check b/test/files/neg/names-defaults-neg.check
index 2db24b6..a43bf66 100644
--- a/test/files/neg/names-defaults-neg.check
+++ b/test/files/neg/names-defaults-neg.check
@@ -64,7 +64,7 @@ names-defaults-neg.scala:49: error: ambiguous reference to overloaded definition
 both method g in object t7 of type (a: B)String
 and  method g in object t7 of type (a: C, b: Int*)String
 match argument types (C)
-  t7.g(new C()) // ambigous reference
+  t7.g(new C()) // ambiguous reference
      ^
 names-defaults-neg.scala:53: error: parameter 'b' is already specified at parameter position 2
   test5(a = 1, b = "dkjl", b = "dkj")
@@ -79,7 +79,7 @@ names-defaults-neg.scala:61: error: ambiguous reference to overloaded definition
 both method f in object t8 of type (b: String, a: Int)String
 and  method f in object t8 of type (a: Int, b: Object)String
 match argument types (a: Int,b: String) and expected result type Any
-  println(t8.f(a = 0, b = "1")) // ambigous reference
+  println(t8.f(a = 0, b = "1")) // ambiguous reference
              ^
 names-defaults-neg.scala:69: error: wrong number of arguments for pattern A1(x: Int,y: String)
   A1() match { case A1(_) => () }
diff --git a/test/files/neg/names-defaults-neg.scala b/test/files/neg/names-defaults-neg.scala
index 042f737..a97b590 100644
--- a/test/files/neg/names-defaults-neg.scala
+++ b/test/files/neg/names-defaults-neg.scala
@@ -46,7 +46,7 @@ object Test extends App {
     def g(a: C, b: Int*) = "third"
     def g(a: B) = "fourth"
   }
-  t7.g(new C()) // ambigous reference
+  t7.g(new C()) // ambiguous reference
 
   // vararg
   def test5(a: Int, b: String*) = a
@@ -58,7 +58,7 @@ object Test extends App {
     def f(a: Int, b: Object) = "first"
     def f(b: String, a: Int) = "second"
   }
-  println(t8.f(a = 0, b = "1")) // ambigous reference
+  println(t8.f(a = 0, b = "1")) // ambiguous reference
 
 
   // case class copy does not exist if there's a vararg
diff --git a/test/files/neg/override.scala b/test/files/neg/override.scala
old mode 100755
new mode 100644
diff --git a/test/files/neg/partestInvalidFlag.check b/test/files/neg/partestInvalidFlag.check
new file mode 100644
index 0000000..812191d
--- /dev/null
+++ b/test/files/neg/partestInvalidFlag.check
@@ -0,0 +1,4 @@
+error: bad option: '-badCompilerFlag'
+error: bad options: -badCompilerFlag notAFlag -Yopt:badChoice
+error: flags file may only contain compiler options, found: -badCompilerFlag notAFlag -Yopt:badChoice
+three errors found
diff --git a/test/files/neg/partestInvalidFlag.flags b/test/files/neg/partestInvalidFlag.flags
new file mode 100644
index 0000000..6888453
--- /dev/null
+++ b/test/files/neg/partestInvalidFlag.flags
@@ -0,0 +1 @@
+-badCompilerFlag notAFlag -Yopt:badChoice
diff --git a/test/files/neg/partestInvalidFlag.scala b/test/files/neg/partestInvalidFlag.scala
new file mode 100644
index 0000000..826a1a5
--- /dev/null
+++ b/test/files/neg/partestInvalidFlag.scala
@@ -0,0 +1 @@
+class C
diff --git a/test/files/neg/patmatexhaust-huge.check b/test/files/neg/patmatexhaust-huge.check
new file mode 100644
index 0000000..66dbd42
--- /dev/null
+++ b/test/files/neg/patmatexhaust-huge.check
@@ -0,0 +1,7 @@
+patmatexhaust-huge.scala:404: warning: match may not be exhaustive.
+It would fail on the following inputs: C392, C397
+  def f(c: C): Int = c match {
+                     ^
+error: No warnings can be incurred under -Xfatal-warnings.
+one warning found
+one error found
diff --git a/test/files/neg/patmatexhaust-huge.flags b/test/files/neg/patmatexhaust-huge.flags
new file mode 100644
index 0000000..591a950
--- /dev/null
+++ b/test/files/neg/patmatexhaust-huge.flags
@@ -0,0 +1 @@
+-Xfatal-warnings -unchecked -Ypatmat-exhaust-depth off
\ No newline at end of file
diff --git a/test/files/neg/patmatexhaust-huge.scala b/test/files/neg/patmatexhaust-huge.scala
new file mode 100644
index 0000000..8f87655
--- /dev/null
+++ b/test/files/neg/patmatexhaust-huge.scala
@@ -0,0 +1,806 @@
+sealed trait C
+case object C1 extends C
+case object C2 extends C
+case object C3 extends C
+case object C4 extends C
+case object C5 extends C
+case object C6 extends C
+case object C7 extends C
+case object C8 extends C
+case object C9 extends C
+case object C10 extends C
+case object C11 extends C
+case object C12 extends C
+case object C13 extends C
+case object C14 extends C
+case object C15 extends C
+case object C16 extends C
+case object C17 extends C
+case object C18 extends C
+case object C19 extends C
+case object C20 extends C
+case object C21 extends C
+case object C22 extends C
+case object C23 extends C
+case object C24 extends C
+case object C25 extends C
+case object C26 extends C
+case object C27 extends C
+case object C28 extends C
+case object C29 extends C
+case object C30 extends C
+case object C31 extends C
+case object C32 extends C
+case object C33 extends C
+case object C34 extends C
+case object C35 extends C
+case object C36 extends C
+case object C37 extends C
+case object C38 extends C
+case object C39 extends C
+case object C40 extends C
+case object C41 extends C
+case object C42 extends C
+case object C43 extends C
+case object C44 extends C
+case object C45 extends C
+case object C46 extends C
+case object C47 extends C
+case object C48 extends C
+case object C49 extends C
+case object C50 extends C
+case object C51 extends C
+case object C52 extends C
+case object C53 extends C
+case object C54 extends C
+case object C55 extends C
+case object C56 extends C
+case object C57 extends C
+case object C58 extends C
+case object C59 extends C
+case object C60 extends C
+case object C61 extends C
+case object C62 extends C
+case object C63 extends C
+case object C64 extends C
+case object C65 extends C
+case object C66 extends C
+case object C67 extends C
+case object C68 extends C
+case object C69 extends C
+case object C70 extends C
+case object C71 extends C
+case object C72 extends C
+case object C73 extends C
+case object C74 extends C
+case object C75 extends C
+case object C76 extends C
+case object C77 extends C
+case object C78 extends C
+case object C79 extends C
+case object C80 extends C
+case object C81 extends C
+case object C82 extends C
+case object C83 extends C
+case object C84 extends C
+case object C85 extends C
+case object C86 extends C
+case object C87 extends C
+case object C88 extends C
+case object C89 extends C
+case object C90 extends C
+case object C91 extends C
+case object C92 extends C
+case object C93 extends C
+case object C94 extends C
+case object C95 extends C
+case object C96 extends C
+case object C97 extends C
+case object C98 extends C
+case object C99 extends C
+case object C100 extends C
+case object C101 extends C
+case object C102 extends C
+case object C103 extends C
+case object C104 extends C
+case object C105 extends C
+case object C106 extends C
+case object C107 extends C
+case object C108 extends C
+case object C109 extends C
+case object C110 extends C
+case object C111 extends C
+case object C112 extends C
+case object C113 extends C
+case object C114 extends C
+case object C115 extends C
+case object C116 extends C
+case object C117 extends C
+case object C118 extends C
+case object C119 extends C
+case object C120 extends C
+case object C121 extends C
+case object C122 extends C
+case object C123 extends C
+case object C124 extends C
+case object C125 extends C
+case object C126 extends C
+case object C127 extends C
+case object C128 extends C
+case object C129 extends C
+case object C130 extends C
+case object C131 extends C
+case object C132 extends C
+case object C133 extends C
+case object C134 extends C
+case object C135 extends C
+case object C136 extends C
+case object C137 extends C
+case object C138 extends C
+case object C139 extends C
+case object C140 extends C
+case object C141 extends C
+case object C142 extends C
+case object C143 extends C
+case object C144 extends C
+case object C145 extends C
+case object C146 extends C
+case object C147 extends C
+case object C148 extends C
+case object C149 extends C
+case object C150 extends C
+case object C151 extends C
+case object C152 extends C
+case object C153 extends C
+case object C154 extends C
+case object C155 extends C
+case object C156 extends C
+case object C157 extends C
+case object C158 extends C
+case object C159 extends C
+case object C160 extends C
+case object C161 extends C
+case object C162 extends C
+case object C163 extends C
+case object C164 extends C
+case object C165 extends C
+case object C166 extends C
+case object C167 extends C
+case object C168 extends C
+case object C169 extends C
+case object C170 extends C
+case object C171 extends C
+case object C172 extends C
+case object C173 extends C
+case object C174 extends C
+case object C175 extends C
+case object C176 extends C
+case object C177 extends C
+case object C178 extends C
+case object C179 extends C
+case object C180 extends C
+case object C181 extends C
+case object C182 extends C
+case object C183 extends C
+case object C184 extends C
+case object C185 extends C
+case object C186 extends C
+case object C187 extends C
+case object C188 extends C
+case object C189 extends C
+case object C190 extends C
+case object C191 extends C
+case object C192 extends C
+case object C193 extends C
+case object C194 extends C
+case object C195 extends C
+case object C196 extends C
+case object C197 extends C
+case object C198 extends C
+case object C199 extends C
+case object C200 extends C
+case object C201 extends C
+case object C202 extends C
+case object C203 extends C
+case object C204 extends C
+case object C205 extends C
+case object C206 extends C
+case object C207 extends C
+case object C208 extends C
+case object C209 extends C
+case object C210 extends C
+case object C211 extends C
+case object C212 extends C
+case object C213 extends C
+case object C214 extends C
+case object C215 extends C
+case object C216 extends C
+case object C217 extends C
+case object C218 extends C
+case object C219 extends C
+case object C220 extends C
+case object C221 extends C
+case object C222 extends C
+case object C223 extends C
+case object C224 extends C
+case object C225 extends C
+case object C226 extends C
+case object C227 extends C
+case object C228 extends C
+case object C229 extends C
+case object C230 extends C
+case object C231 extends C
+case object C232 extends C
+case object C233 extends C
+case object C234 extends C
+case object C235 extends C
+case object C236 extends C
+case object C237 extends C
+case object C238 extends C
+case object C239 extends C
+case object C240 extends C
+case object C241 extends C
+case object C242 extends C
+case object C243 extends C
+case object C244 extends C
+case object C245 extends C
+case object C246 extends C
+case object C247 extends C
+case object C248 extends C
+case object C249 extends C
+case object C250 extends C
+case object C251 extends C
+case object C252 extends C
+case object C253 extends C
+case object C254 extends C
+case object C255 extends C
+case object C256 extends C
+case object C257 extends C
+case object C258 extends C
+case object C259 extends C
+case object C260 extends C
+case object C261 extends C
+case object C262 extends C
+case object C263 extends C
+case object C264 extends C
+case object C265 extends C
+case object C266 extends C
+case object C267 extends C
+case object C268 extends C
+case object C269 extends C
+case object C270 extends C
+case object C271 extends C
+case object C272 extends C
+case object C273 extends C
+case object C274 extends C
+case object C275 extends C
+case object C276 extends C
+case object C277 extends C
+case object C278 extends C
+case object C279 extends C
+case object C280 extends C
+case object C281 extends C
+case object C282 extends C
+case object C283 extends C
+case object C284 extends C
+case object C285 extends C
+case object C286 extends C
+case object C287 extends C
+case object C288 extends C
+case object C289 extends C
+case object C290 extends C
+case object C291 extends C
+case object C292 extends C
+case object C293 extends C
+case object C294 extends C
+case object C295 extends C
+case object C296 extends C
+case object C297 extends C
+case object C298 extends C
+case object C299 extends C
+case object C300 extends C
+case object C301 extends C
+case object C302 extends C
+case object C303 extends C
+case object C304 extends C
+case object C305 extends C
+case object C306 extends C
+case object C307 extends C
+case object C308 extends C
+case object C309 extends C
+case object C310 extends C
+case object C311 extends C
+case object C312 extends C
+case object C313 extends C
+case object C314 extends C
+case object C315 extends C
+case object C316 extends C
+case object C317 extends C
+case object C318 extends C
+case object C319 extends C
+case object C320 extends C
+case object C321 extends C
+case object C322 extends C
+case object C323 extends C
+case object C324 extends C
+case object C325 extends C
+case object C326 extends C
+case object C327 extends C
+case object C328 extends C
+case object C329 extends C
+case object C330 extends C
+case object C331 extends C
+case object C332 extends C
+case object C333 extends C
+case object C334 extends C
+case object C335 extends C
+case object C336 extends C
+case object C337 extends C
+case object C338 extends C
+case object C339 extends C
+case object C340 extends C
+case object C341 extends C
+case object C342 extends C
+case object C343 extends C
+case object C344 extends C
+case object C345 extends C
+case object C346 extends C
+case object C347 extends C
+case object C348 extends C
+case object C349 extends C
+case object C350 extends C
+case object C351 extends C
+case object C352 extends C
+case object C353 extends C
+case object C354 extends C
+case object C355 extends C
+case object C356 extends C
+case object C357 extends C
+case object C358 extends C
+case object C359 extends C
+case object C360 extends C
+case object C361 extends C
+case object C362 extends C
+case object C363 extends C
+case object C364 extends C
+case object C365 extends C
+case object C366 extends C
+case object C367 extends C
+case object C368 extends C
+case object C369 extends C
+case object C370 extends C
+case object C371 extends C
+case object C372 extends C
+case object C373 extends C
+case object C374 extends C
+case object C375 extends C
+case object C376 extends C
+case object C377 extends C
+case object C378 extends C
+case object C379 extends C
+case object C380 extends C
+case object C381 extends C
+case object C382 extends C
+case object C383 extends C
+case object C384 extends C
+case object C385 extends C
+case object C386 extends C
+case object C387 extends C
+case object C388 extends C
+case object C389 extends C
+case object C390 extends C
+case object C391 extends C
+case object C392 extends C
+case object C393 extends C
+case object C394 extends C
+case object C395 extends C
+case object C396 extends C
+case object C397 extends C
+case object C398 extends C
+case object C399 extends C
+case object C400 extends C
+
+object M {
+  def f(c: C): Int = c match {
+    case C1 => 1
+    case C2 => 2
+    case C3 => 3
+    case C4 => 4
+    case C5 => 5
+    case C6 => 6
+    case C7 => 7
+    case C8 => 8
+    case C9 => 9
+    case C10 => 10
+    case C11 => 11
+    case C12 => 12
+    case C13 => 13
+    case C14 => 14
+    case C15 => 15
+    case C16 => 16
+    case C17 => 17
+    case C18 => 18
+    case C19 => 19
+    case C20 => 20
+    case C21 => 21
+    case C22 => 22
+    case C23 => 23
+    case C24 => 24
+    case C25 => 25
+    case C26 => 26
+    case C27 => 27
+    case C28 => 28
+    case C29 => 29
+    case C30 => 30
+    case C31 => 31
+    case C32 => 32
+    case C33 => 33
+    case C34 => 34
+    case C35 => 35
+    case C36 => 36
+    case C37 => 37
+    case C38 => 38
+    case C39 => 39
+    case C40 => 40
+    case C41 => 41
+    case C42 => 42
+    case C43 => 43
+    case C44 => 44
+    case C45 => 45
+    case C46 => 46
+    case C47 => 47
+    case C48 => 48
+    case C49 => 49
+    case C50 => 50
+    case C51 => 51
+    case C52 => 52
+    case C53 => 53
+    case C54 => 54
+    case C55 => 55
+    case C56 => 56
+    case C57 => 57
+    case C58 => 58
+    case C59 => 59
+    case C60 => 60
+    case C61 => 61
+    case C62 => 62
+    case C63 => 63
+    case C64 => 64
+    case C65 => 65
+    case C66 => 66
+    case C67 => 67
+    case C68 => 68
+    case C69 => 69
+    case C70 => 70
+    case C71 => 71
+    case C72 => 72
+    case C73 => 73
+    case C74 => 74
+    case C75 => 75
+    case C76 => 76
+    case C77 => 77
+    case C78 => 78
+    case C79 => 79
+    case C80 => 80
+    case C81 => 81
+    case C82 => 82
+    case C83 => 83
+    case C84 => 84
+    case C85 => 85
+    case C86 => 86
+    case C87 => 87
+    case C88 => 88
+    case C89 => 89
+    case C90 => 90
+    case C91 => 91
+    case C92 => 92
+    case C93 => 93
+    case C94 => 94
+    case C95 => 95
+    case C96 => 96
+    case C97 => 97
+    case C98 => 98
+    case C99 => 99
+    case C100 => 100
+    case C101 => 101
+    case C102 => 102
+    case C103 => 103
+    case C104 => 104
+    case C105 => 105
+    case C106 => 106
+    case C107 => 107
+    case C108 => 108
+    case C109 => 109
+    case C110 => 110
+    case C111 => 111
+    case C112 => 112
+    case C113 => 113
+    case C114 => 114
+    case C115 => 115
+    case C116 => 116
+    case C117 => 117
+    case C118 => 118
+    case C119 => 119
+    case C120 => 120
+    case C121 => 121
+    case C122 => 122
+    case C123 => 123
+    case C124 => 124
+    case C125 => 125
+    case C126 => 126
+    case C127 => 127
+    case C128 => 128
+    case C129 => 129
+    case C130 => 130
+    case C131 => 131
+    case C132 => 132
+    case C133 => 133
+    case C134 => 134
+    case C135 => 135
+    case C136 => 136
+    case C137 => 137
+    case C138 => 138
+    case C139 => 139
+    case C140 => 140
+    case C141 => 141
+    case C142 => 142
+    case C143 => 143
+    case C144 => 144
+    case C145 => 145
+    case C146 => 146
+    case C147 => 147
+    case C148 => 148
+    case C149 => 149
+    case C150 => 150
+    case C151 => 151
+    case C152 => 152
+    case C153 => 153
+    case C154 => 154
+    case C155 => 155
+    case C156 => 156
+    case C157 => 157
+    case C158 => 158
+    case C159 => 159
+    case C160 => 160
+    case C161 => 161
+    case C162 => 162
+    case C163 => 163
+    case C164 => 164
+    case C165 => 165
+    case C166 => 166
+    case C167 => 167
+    case C168 => 168
+    case C169 => 169
+    case C170 => 170
+    case C171 => 171
+    case C172 => 172
+    case C173 => 173
+    case C174 => 174
+    case C175 => 175
+    case C176 => 176
+    case C177 => 177
+    case C178 => 178
+    case C179 => 179
+    case C180 => 180
+    case C181 => 181
+    case C182 => 182
+    case C183 => 183
+    case C184 => 184
+    case C185 => 185
+    case C186 => 186
+    case C187 => 187
+    case C188 => 188
+    case C189 => 189
+    case C190 => 190
+    case C191 => 191
+    case C192 => 192
+    case C193 => 193
+    case C194 => 194
+    case C195 => 195
+    case C196 => 196
+    case C197 => 197
+    case C198 => 198
+    case C199 => 199
+    case C200 => 200
+    case C201 => 201
+    case C202 => 202
+    case C203 => 203
+    case C204 => 204
+    case C205 => 205
+    case C206 => 206
+    case C207 => 207
+    case C208 => 208
+    case C209 => 209
+    case C210 => 210
+    case C211 => 211
+    case C212 => 212
+    case C213 => 213
+    case C214 => 214
+    case C215 => 215
+    case C216 => 216
+    case C217 => 217
+    case C218 => 218
+    case C219 => 219
+    case C220 => 220
+    case C221 => 221
+    case C222 => 222
+    case C223 => 223
+    case C224 => 224
+    case C225 => 225
+    case C226 => 226
+    case C227 => 227
+    case C228 => 228
+    case C229 => 229
+    case C230 => 230
+    case C231 => 231
+    case C232 => 232
+    case C233 => 233
+    case C234 => 234
+    case C235 => 235
+    case C236 => 236
+    case C237 => 237
+    case C238 => 238
+    case C239 => 239
+    case C240 => 240
+    case C241 => 241
+    case C242 => 242
+    case C243 => 243
+    case C244 => 244
+    case C245 => 245
+    case C246 => 246
+    case C247 => 247
+    case C248 => 248
+    case C249 => 249
+    case C250 => 250
+    case C251 => 251
+    case C252 => 252
+    case C253 => 253
+    case C254 => 254
+    case C255 => 255
+    case C256 => 256
+    case C257 => 257
+    case C258 => 258
+    case C259 => 259
+    case C260 => 260
+    case C261 => 261
+    case C262 => 262
+    case C263 => 263
+    case C264 => 264
+    case C265 => 265
+    case C266 => 266
+    case C267 => 267
+    case C268 => 268
+    case C269 => 269
+    case C270 => 270
+    case C271 => 271
+    case C272 => 272
+    case C273 => 273
+    case C274 => 274
+    case C275 => 275
+    case C276 => 276
+    case C277 => 277
+    case C278 => 278
+    case C279 => 279
+    case C280 => 280
+    case C281 => 281
+    case C282 => 282
+    case C283 => 283
+    case C284 => 284
+    case C285 => 285
+    case C286 => 286
+    case C287 => 287
+    case C288 => 288
+    case C289 => 289
+    case C290 => 290
+    case C291 => 291
+    case C292 => 292
+    case C293 => 293
+    case C294 => 294
+    case C295 => 295
+    case C296 => 296
+    case C297 => 297
+    case C298 => 298
+    case C299 => 299
+    case C300 => 300
+    case C301 => 301
+    case C302 => 302
+    case C303 => 303
+    case C304 => 304
+    case C305 => 305
+    case C306 => 306
+    case C307 => 307
+    case C308 => 308
+    case C309 => 309
+    case C310 => 310
+    case C311 => 311
+    case C312 => 312
+    case C313 => 313
+    case C314 => 314
+    case C315 => 315
+    case C316 => 316
+    case C317 => 317
+    case C318 => 318
+    case C319 => 319
+    case C320 => 320
+    case C321 => 321
+    case C322 => 322
+    case C323 => 323
+    case C324 => 324
+    case C325 => 325
+    case C326 => 326
+    case C327 => 327
+    case C328 => 328
+    case C329 => 329
+    case C330 => 330
+    case C331 => 331
+    case C332 => 332
+    case C333 => 333
+    case C334 => 334
+    case C335 => 335
+    case C336 => 336
+    case C337 => 337
+    case C338 => 338
+    case C339 => 339
+    case C340 => 340
+    case C341 => 341
+    case C342 => 342
+    case C343 => 343
+    case C344 => 344
+    case C345 => 345
+    case C346 => 346
+    case C347 => 347
+    case C348 => 348
+    case C349 => 349
+    case C350 => 350
+    case C351 => 351
+    case C352 => 352
+    case C353 => 353
+    case C354 => 354
+    case C355 => 355
+    case C356 => 356
+    case C357 => 357
+    case C358 => 358
+    case C359 => 359
+    case C360 => 360
+    case C361 => 361
+    case C362 => 362
+    case C363 => 363
+    case C364 => 364
+    case C365 => 365
+    case C366 => 366
+    case C367 => 367
+    case C368 => 368
+    case C369 => 369
+    case C370 => 370
+    case C371 => 371
+    case C372 => 372
+    case C373 => 373
+    case C374 => 374
+    case C375 => 375
+    case C376 => 376
+    case C377 => 377
+    case C378 => 378
+    case C379 => 379
+    case C380 => 380
+    case C381 => 381
+    case C382 => 382
+    case C383 => 383
+    case C384 => 384
+    case C385 => 385
+    case C386 => 386
+    case C387 => 387
+    case C388 => 388
+    case C389 => 389
+    case C390 => 390
+    case C391 => 391
+//    case C392 => 392
+    case C393 => 393
+    case C394 => 394
+    case C395 => 395
+    case C396 => 396
+//    case C397 => 397
+    case C398 => 398
+    case C399 => 399
+    case C400 => 400
+  }
+}
diff --git a/test/files/neg/reflection-names-neg.check b/test/files/neg/reflection-names-neg.check
deleted file mode 100644
index f941ec8..0000000
--- a/test/files/neg/reflection-names-neg.check
+++ /dev/null
@@ -1,13 +0,0 @@
-reflection-names-neg.scala:5: error: type mismatch;
- found   : String("abc")
- required: reflect.runtime.universe.Name
-Note that implicit conversions are not applicable because they are ambiguous:
- both method stringToTermName in trait Names of type (s: String)reflect.runtime.universe.TermName
- and method stringToTypeName in trait Names of type (s: String)reflect.runtime.universe.TypeName
- are possible conversion functions from String("abc") to reflect.runtime.universe.Name
-  val x2 = ("abc": Name) drop 1         // error
-            ^
-reflection-names-neg.scala:5: error: value drop is not a member of reflect.runtime.universe.Name
-  val x2 = ("abc": Name) drop 1         // error
-                         ^
-two errors found
diff --git a/test/files/neg/reflection-names-neg.scala b/test/files/neg/reflection-names-neg.scala
deleted file mode 100644
index 7283d16..0000000
--- a/test/files/neg/reflection-names-neg.scala
+++ /dev/null
@@ -1,6 +0,0 @@
-import scala.reflect.runtime.universe._
-
-object Test {
-  val x1 = "abc" drop 1                 // "bc": String
-  val x2 = ("abc": Name) drop 1         // error
-}
diff --git a/test/files/neg/t0899.check b/test/files/neg/t0899.check
index 8b71be8..28cb06a 100644
--- a/test/files/neg/t0899.check
+++ b/test/files/neg/t0899.check
@@ -1,10 +1,10 @@
-t0899.scala:9: error: super may be not be used on value o
+t0899.scala:9: error: super may not be used on value o
   override val o = "Ha! " + super.o
                                   ^
-t0899.scala:11: error: super may be not be used on variable v
+t0899.scala:11: error: super may not be used on variable v
   super.v = "aa"
         ^
-t0899.scala:12: error: super may be not be used on variable v
+t0899.scala:12: error: super may not be used on variable v
   println(super.v)
                 ^
 three errors found
diff --git a/test/files/neg/t2336.scala b/test/files/neg/t2336.scala
old mode 100755
new mode 100644
diff --git a/test/files/neg/t2494.scala b/test/files/neg/t2494.scala
old mode 100755
new mode 100644
diff --git a/test/files/neg/t2773.scala b/test/files/neg/t2773.scala
old mode 100755
new mode 100644
diff --git a/test/files/neg/t2779.scala b/test/files/neg/t2779.scala
old mode 100755
new mode 100644
diff --git a/test/files/neg/t2866.check b/test/files/neg/t2866.check
index 340fb8d..bc0da7e 100644
--- a/test/files/neg/t2866.check
+++ b/test/files/neg/t2866.check
@@ -5,7 +5,7 @@ t2866.scala:42: error: ambiguous implicit values:
  both value two of type Int
  and value one in object A of type => Int
  match expected type Int
-    assert(implicitly[Int] == 2) // !!! Not ambiguous in 2.8.0. Ambigous in 2.7.6
+    assert(implicitly[Int] == 2) // !!! Not ambiguous in 2.8.0. Ambiguous in 2.7.6
                      ^
 t2866.scala:50: error: ambiguous implicit values:
  both value two of type Int
diff --git a/test/files/neg/t2866.scala b/test/files/neg/t2866.scala
index 55ebff9..6be8bf9 100644
--- a/test/files/neg/t2866.scala
+++ b/test/files/neg/t2866.scala
@@ -39,7 +39,7 @@ object Test {
     import A.one
     assert(implicitly[Int] == 1)
     implicit val two = 2
-    assert(implicitly[Int] == 2) // !!! Not ambiguous in 2.8.0. Ambigous in 2.7.6
+    assert(implicitly[Int] == 2) // !!! Not ambiguous in 2.8.0. Ambiguous in 2.7.6
   }
 
   locally {
diff --git a/test/files/neg/t2870.scala b/test/files/neg/t2870.scala
old mode 100755
new mode 100644
diff --git a/test/files/neg/t2918.scala b/test/files/neg/t2918.scala
old mode 100755
new mode 100644
diff --git a/test/files/neg/t3006.scala b/test/files/neg/t3006.scala
old mode 100755
new mode 100644
diff --git a/test/files/neg/t3224.scala b/test/files/neg/t3224.scala
old mode 100755
new mode 100644
diff --git a/test/files/neg/t3234.flags b/test/files/neg/t3234.flags
index cc3d9fb..406231b 100644
--- a/test/files/neg/t3234.flags
+++ b/test/files/neg/t3234.flags
@@ -1 +1 @@
--Yinline -Yinline-warnings -Xfatal-warnings
+-Yinline -Yinline-warnings -Xfatal-warnings -Ybackend:GenASM
diff --git a/test/files/neg/t3995.scala b/test/files/neg/t3995.scala
index b03617a..c79f2a5 100644
--- a/test/files/neg/t3995.scala
+++ b/test/files/neg/t3995.scala
@@ -27,6 +27,6 @@ object Test {
   // can be accessed with unambiguous stable prefixes, the implicits infos
   // which are members of these companion objects."
   //
-  // The skolem is stable, but it doen't seem much good to us
+  // The skolem is stable, but it does not seem much good to us
   (new Lift).apply("")
 }
diff --git a/test/files/neg/t4425b.check b/test/files/neg/t4425b.check
index 8418b4f..a204467 100644
--- a/test/files/neg/t4425b.check
+++ b/test/files/neg/t4425b.check
@@ -22,16 +22,28 @@ t4425b.scala:10: error: object X is not a case class, nor does it have an unappl
 Note: def unapply(x: String)(y: String): Nothing exists in object X, but it cannot be used as an extractor due to its second non-implicit parameter list
     println((X: Any) match { case X(_, _) => "ok" ; case _ => "fail" })
                                   ^
-t4425b.scala:18: error: too many patterns for object X: expected 1, found 2
+t4425b.scala:18: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing
+    println(      "" match { case _ X _   => "ok" ; case _ => "fail" })
+                                  ^
+t4425b.scala:18: error: too many patterns for object X offering Boolean: expected 0, found 2
     println(      "" match { case _ X _   => "ok" ; case _ => "fail" })
                                     ^
-t4425b.scala:19: error: too many patterns for object X: expected 1, found 2
+t4425b.scala:19: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing
+    println((X: Any) match { case _ X _   => "ok" ; case _ => "fail" })
+                                  ^
+t4425b.scala:19: error: too many patterns for object X offering Boolean: expected 0, found 2
     println((X: Any) match { case _ X _   => "ok" ; case _ => "fail" })
                                     ^
-t4425b.scala:22: error: too many patterns for object X: expected 1, found 2
+t4425b.scala:20: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing
+    println(      "" match { case X(_)    => "ok" ; case _ => "fail" })
+                                  ^
+t4425b.scala:21: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing
+    println((X: Any) match { case X(_)    => "ok" ; case _ => "fail" })
+                                  ^
+t4425b.scala:22: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing
     println(      "" match { case X(_, _) => "ok" ; case _ => "fail" })
                                   ^
-t4425b.scala:23: error: too many patterns for object X: expected 1, found 2
+t4425b.scala:23: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing
     println((X: Any) match { case X(_, _) => "ok" ; case _ => "fail" })
                                   ^
 t4425b.scala:31: error: too many patterns for object X offering Nothing: expected 1, found 2
@@ -46,4 +58,4 @@ t4425b.scala:35: error: too many patterns for object X offering Nothing: expecte
 t4425b.scala:36: error: too many patterns for object X offering Nothing: expected 1, found 2
     println((X: Any) match { case X(_, _) => "ok" ; case _ => "fail" })
                                   ^
-14 errors found
+18 errors found
diff --git a/test/files/neg/t5120.scala b/test/files/neg/t5120.scala
index f28b2cf..0df67bc 100644
--- a/test/files/neg/t5120.scala
+++ b/test/files/neg/t5120.scala
@@ -12,7 +12,7 @@ object Test {
     str.x1.length
   }
 }
-// another way demonstrating the same underlying problem, as reported by roman kalukiewicz
+// another way demonstrating the same underlying problem, as reported by Roman Kalukiewicz
 
 class Holder[_T](_f1 : _T, _f2 : _T) {
   type T = _T
diff --git a/test/files/neg/t5376.scala b/test/files/neg/t5376.scala
index 8da3868..b1ba41b 100644
--- a/test/files/neg/t5376.scala
+++ b/test/files/neg/t5376.scala
@@ -12,7 +12,7 @@ object Test {
     "a": Int
   }
 
-  // Import one implict and one non-implicit method with the
+  // Import one implicit and one non-implicit method with the
   // same name in the same scope.
   def m2 = {
     import O1._
diff --git a/test/files/neg/t562.check b/test/files/neg/t562.check
index 8c38236..95be075 100644
--- a/test/files/neg/t562.check
+++ b/test/files/neg/t562.check
@@ -1,4 +1,4 @@
-t562.scala:10: error: super may be not be used on value y
+t562.scala:10: error: super may not be used on value y
   override val y = super.y;
                          ^
 one error found
diff --git a/test/files/neg/t6013/Base.java b/test/files/neg/t6013/Base.java
index b73d7fd..ce6ee47 100644
--- a/test/files/neg/t6013/Base.java
+++ b/test/files/neg/t6013/Base.java
@@ -2,7 +2,7 @@ abstract public class Base {
   // This must considered to be overridden by Abstract#foo based
   // on the erased signatures. This special case is handled by
   // `javaErasedOverridingSym` in `RefChecks`.
-  public abstract void bar(java.util.List<java.lang.String> foo) { return; }
+  public void bar(java.util.List<java.lang.String> foo) { return; }
 
   // But, a concrete method in a Java superclass must not excuse
   // a deferred method in the Java subclass!
diff --git a/test/files/neg/t6040.check b/test/files/neg/t6040.check
index 16c90ed..350f796 100644
--- a/test/files/neg/t6040.check
+++ b/test/files/neg/t6040.check
@@ -2,7 +2,7 @@ t6040.scala:1: error: extension of type scala.Dynamic needs to be enabled
 by making the implicit value scala.language.dynamics visible.
 This can be achieved by adding the import clause 'import scala.language.dynamics'
 or by setting the compiler option -language:dynamics.
-See the Scala docs for value scala.language.dynamics for a discussion
+See the Scaladoc for value scala.language.dynamics for a discussion
 why the feature needs to be explicitly enabled.
 class X extends Dynamic
                 ^
diff --git a/test/files/neg/t6120.check b/test/files/neg/t6120.check
index a7d17e2..f432fde 100644
--- a/test/files/neg/t6120.check
+++ b/test/files/neg/t6120.check
@@ -2,7 +2,7 @@ t6120.scala:5: warning: postfix operator bippy should be enabled
 by making the implicit value scala.language.postfixOps visible.
 This can be achieved by adding the import clause 'import scala.language.postfixOps'
 or by setting the compiler option -language:postfixOps.
-See the Scala docs for value scala.language.postfixOps for a discussion
+See the Scaladoc for value scala.language.postfixOps for a discussion
 why the feature should be explicitly enabled.
   def f = null == null bippy
                        ^
diff --git a/test/files/neg/t6446-additional.check b/test/files/neg/t6446-additional.check
old mode 100755
new mode 100644
diff --git a/test/files/neg/t6446-list.check b/test/files/neg/t6446-list.check
old mode 100755
new mode 100644
diff --git a/test/files/neg/t6446-missing.check b/test/files/neg/t6446-missing.check
old mode 100755
new mode 100644
diff --git a/test/files/neg/t6666d.check b/test/files/neg/t6666d.check
deleted file mode 100644
index b4785f0..0000000
--- a/test/files/neg/t6666d.check
+++ /dev/null
@@ -1,4 +0,0 @@
-t6666d.scala:7: error: Implementation restriction: access of object TreeOrd$1 from object TreeOrd$2, would require illegal premature access to the unconstructed `this` of class Test
-    implicit object TreeOrd extends Ordering[K](){
-                    ^
-one error found
diff --git a/test/files/neg/t6895.check b/test/files/neg/t6895.check
new file mode 100644
index 0000000..df01031
--- /dev/null
+++ b/test/files/neg/t6895.check
@@ -0,0 +1,6 @@
+t6895.scala:19: error: polymorphic expression cannot be instantiated to expected type;
+ found   : [F3[F3_P]]Foo[F3]
+ required: Foo[[X3]Bar[[X1]String]]
+  val nok: Foo[({type L[X3] = Bar[M]})#L] = barFoo /* Type inference can't unify F with L */
+                                            ^
+one error found
diff --git a/test/files/neg/t6895.scala b/test/files/neg/t6895.scala
new file mode 100644
index 0000000..5fb20d8
--- /dev/null
+++ b/test/files/neg/t6895.scala
@@ -0,0 +1,26 @@
+trait Foo[F1[F1_P]]
+trait Bar[F2[F2_P]]
+
+class Test {
+  def barFoo[F3[F3_P]]: Foo[F3] = ???
+
+  // Now we can define a couple of type aliases:
+  type M[X1] = String
+  type N[X2] = Bar[M]
+
+  // val ok1: Foo[N] = barFoo
+  // Foo[?F3] <:< Foo[Test.this.N]
+  //   [X2]Test.this.N[X2] <:< [F3_P]?F3[F3_P]
+  //      Test.this.N[X2] <:< ?F3[X2]
+  //        true, ?F3=N
+
+  // val ok2: Foo[({type L[X] = Bar[M]})#L] = barFoo[N]
+
+  val nok: Foo[({type L[X3] = Bar[M]})#L] = barFoo /* Type inference can't unify F with L */
+  // Foo[?F3] <:< Foo[[X3]Bar[[X1]String]]
+  //   [X3]Bar[[X1]String] <:< ?F3
+  //     [X3]Bar[[X1]String] <:< [F3_P]?F3[F3_P]
+  //        Bar[[X1]String] <:< ?F3[X3]
+  //          X3 <:< [X1]String
+  //            false
+}
diff --git a/test/files/neg/t6895b.check b/test/files/neg/t6895b.check
new file mode 100644
index 0000000..5659251
--- /dev/null
+++ b/test/files/neg/t6895b.check
@@ -0,0 +1,9 @@
+t6895b.scala:20: error: could not find implicit value for parameter e: Foo[[X]Bar[[X]Or[String,X],X]]
+  implicitly[Foo[({type L[X] = Bar[StringOr, X]})#L]]
+            ^
+t6895b.scala:23: error: polymorphic expression cannot be instantiated to expected type;
+ found   : [F[_]]Foo[[X(in type L)]Bar[F,X(in type L)]]
+ required: Foo[[X(in type L)]Bar[[X]Or[String,X],X(in type L)]]
+  barFoo(null) : Foo[({type L[X] = Bar[StringOr, X]})#L]
+        ^
+two errors found
diff --git a/test/files/neg/t6895b.scala b/test/files/neg/t6895b.scala
new file mode 100644
index 0000000..c465065
--- /dev/null
+++ b/test/files/neg/t6895b.scala
@@ -0,0 +1,39 @@
+trait Foo[F[_]]
+trait Bar[F[_], A]
+
+trait Or[A, B]
+
+class Test {
+  implicit def orFoo[A]: Foo[({type L[X] = Or[A, X]})#L] = ???
+  implicit def barFoo[F[_]](implicit f: Foo[F]): Foo[({type L[X] = Bar[F, X]})#L] = ???
+
+  // Now we can define a couple of type aliases:
+  type StringOr[X] = Or[String, X]
+  type BarStringOr[X] = Bar[StringOr, X]
+
+  // ok
+  implicitly[Foo[BarStringOr]]
+  barFoo[StringOr](null) : Foo[BarStringOr]
+  barFoo(null) : Foo[BarStringOr]
+
+  // nok
+  implicitly[Foo[({type L[X] = Bar[StringOr, X]})#L]]
+  // Let's write the application explicitly, and then
+  // compile with just this line enabled and -explaintypes.
+  barFoo(null) : Foo[({type L[X] = Bar[StringOr, X]})#L]
+
+  // Foo[[X]Bar[F,X]] <: Foo[[X]Bar[[X]Or[String,X],X]]?
+  //   Bar[[X]Or[String,X],X] <: Bar[F,X]?
+  //     F[_] <: Or[String,_]?
+  //     false
+  //   false
+  // false
+
+  // Note that the type annotation above is typechecked as
+  // Foo[[X]Bar[[X]Or[String,X],X]], ie the type alias `L`
+  // is eta expanded.
+  //
+  // This is done so that it does not escape its defining scope.
+  // However, one this is done, higher kinded inference
+  // no longer is able to unify F with `StringOr` (SI-2712)
+}
diff --git a/test/files/neg/t6952.check b/test/files/neg/t6952.check
index 1a591d0..acee0e7 100644
--- a/test/files/neg/t6952.check
+++ b/test/files/neg/t6952.check
@@ -2,7 +2,7 @@ t6952.scala:2: error: extension of type scala.Dynamic needs to be enabled
 by making the implicit value scala.language.dynamics visible.
 This can be achieved by adding the import clause 'import scala.language.dynamics'
 or by setting the compiler option -language:dynamics.
-See the Scala docs for value scala.language.dynamics for a discussion
+See the Scaladoc for value scala.language.dynamics for a discussion
 why the feature needs to be explicitly enabled.
 trait B extends Dynamic
                 ^
diff --git a/test/files/neg/t7157.check b/test/files/neg/t7157.check
index c6a7af9..3988460 100644
--- a/test/files/neg/t7157.check
+++ b/test/files/neg/t7157.check
@@ -7,7 +7,8 @@ Test_2.scala:6: error: too many arguments for macro method m1_0_0: ()Unit
 Test_2.scala:7: error: too many arguments for macro method m1_0_0: ()Unit
   m1_0_0(1, 2, 3)
         ^
-Test_2.scala:9: error: macro applications do not support named and/or default arguments
+Test_2.scala:9: error: not enough arguments for macro method m1_1_1: (x: Int)Unit.
+Unspecified value parameter x.
   m1_1_1()
         ^
 Test_2.scala:11: error: too many arguments for macro method m1_1_1: (x: Int)Unit
@@ -16,22 +17,27 @@ Test_2.scala:11: error: too many arguments for macro method m1_1_1: (x: Int)Unit
 Test_2.scala:12: error: too many arguments for macro method m1_1_1: (x: Int)Unit
   m1_1_1(1, 2, 3)
         ^
-Test_2.scala:14: error: macro applications do not support named and/or default arguments
+Test_2.scala:14: error: not enough arguments for macro method m1_2_2: (x: Int, y: Int)Unit.
+Unspecified value parameters x, y.
   m1_2_2()
         ^
-Test_2.scala:15: error: macro applications do not support named and/or default arguments
+Test_2.scala:15: error: not enough arguments for macro method m1_2_2: (x: Int, y: Int)Unit.
+Unspecified value parameter y.
   m1_2_2(1)
         ^
 Test_2.scala:17: error: too many arguments for macro method m1_2_2: (x: Int, y: Int)Unit
   m1_2_2(1, 2, 3)
         ^
-Test_2.scala:24: error: macro applications do not support named and/or default arguments
+Test_2.scala:24: error: not enough arguments for macro method m1_1_inf: (x: Int, y: Int*)Unit.
+Unspecified value parameters x, y.
   m1_1_inf()
           ^
-Test_2.scala:29: error: macro applications do not support named and/or default arguments
+Test_2.scala:29: error: not enough arguments for macro method m1_2_inf: (x: Int, y: Int, z: Int*)Unit.
+Unspecified value parameters x, y, z.
   m1_2_inf()
           ^
-Test_2.scala:30: error: macro applications do not support named and/or default arguments
+Test_2.scala:30: error: not enough arguments for macro method m1_2_inf: (x: Int, y: Int, z: Int*)Unit.
+Unspecified value parameters y, z.
   m1_2_inf(1)
           ^
 Test_2.scala:35: error: too many arguments for macro method m2_0_0: ()Unit
@@ -43,7 +49,8 @@ Test_2.scala:36: error: too many arguments for macro method m2_0_0: ()Unit
 Test_2.scala:37: error: too many arguments for macro method m2_0_0: ()Unit
   m2_0_0()(1, 2, 3)
           ^
-Test_2.scala:39: error: macro applications do not support named and/or default arguments
+Test_2.scala:39: error: not enough arguments for macro method m2_1_1: (x: Int)Unit.
+Unspecified value parameter x.
   m2_1_1()()
           ^
 Test_2.scala:41: error: too many arguments for macro method m2_1_1: (x: Int)Unit
@@ -52,22 +59,27 @@ Test_2.scala:41: error: too many arguments for macro method m2_1_1: (x: Int)Unit
 Test_2.scala:42: error: too many arguments for macro method m2_1_1: (x: Int)Unit
   m2_1_1()(1, 2, 3)
           ^
-Test_2.scala:44: error: macro applications do not support named and/or default arguments
+Test_2.scala:44: error: not enough arguments for macro method m2_2_2: (x: Int, y: Int)Unit.
+Unspecified value parameters x, y.
   m2_2_2()()
           ^
-Test_2.scala:45: error: macro applications do not support named and/or default arguments
+Test_2.scala:45: error: not enough arguments for macro method m2_2_2: (x: Int, y: Int)Unit.
+Unspecified value parameter y.
   m2_2_2()(1)
           ^
 Test_2.scala:47: error: too many arguments for macro method m2_2_2: (x: Int, y: Int)Unit
   m2_2_2()(1, 2, 3)
           ^
-Test_2.scala:54: error: macro applications do not support named and/or default arguments
+Test_2.scala:54: error: not enough arguments for macro method m2_1_inf: (x: Int, y: Int*)Unit.
+Unspecified value parameters x, y.
   m2_1_inf()()
             ^
-Test_2.scala:59: error: macro applications do not support named and/or default arguments
+Test_2.scala:59: error: not enough arguments for macro method m2_2_inf: (x: Int, y: Int, z: Int*)Unit.
+Unspecified value parameters x, y, z.
   m2_2_inf()()
             ^
-Test_2.scala:60: error: macro applications do not support named and/or default arguments
+Test_2.scala:60: error: not enough arguments for macro method m2_2_inf: (x: Int, y: Int, z: Int*)Unit.
+Unspecified value parameters y, z.
   m2_2_inf()(1)
             ^
 24 errors found
diff --git a/test/files/neg/t7214neg.scala b/test/files/neg/t7214neg.scala
index ff1ea80..e2b2d90 100644
--- a/test/files/neg/t7214neg.scala
+++ b/test/files/neg/t7214neg.scala
@@ -1,4 +1,4 @@
-// pattern matcher crashes here trying to synthesize an uneeded outer test.
+// pattern matcher crashes here trying to synthesize an unneeded outer test.
 //     no-symbol does not have an owner
 // at scala.reflect.internal.SymbolTable.abort(SymbolTable.scala:49)
 // at scala.tools.nsc.Global.abort(Global.scala:253)
diff --git a/test/files/neg/t7623.check b/test/files/neg/t7623.check
index db368dd..de35023 100644
--- a/test/files/neg/t7623.check
+++ b/test/files/neg/t7623.check
@@ -1,21 +1,15 @@
-t7623.scala:19: warning: A repeated case parameter or extracted sequence should be matched only by a sequence wildcard (_*).
-  def f = "" match { case X(s) => }
+t7623.scala:21: warning: A repeated case parameter or extracted sequence is not matched by a sequence wildcard (_*), and may fail at runtime.
+  def g = "" match { case X(s, t) => }               // warn
                           ^
-t7623.scala:21: warning: A repeated case parameter or extracted sequence should be matched only by a sequence wildcard (_*).
-  def g = "" match { case X(s, t) => }
+t7623.scala:23: warning: Sequence wildcard (_*) does not align with repeated case parameter or extracted sequence; the result may be unexpected.
+  def h = "" match { case X(s, t, u @ _*) => }       // warn
                           ^
-t7623.scala:23: warning: A repeated case parameter or extracted sequence should be matched only by a sequence wildcard (_*).
-  def h = "" match { case X(s, t, u @ _*) => }
-                          ^
-t7623.scala:9: warning: A repeated case parameter or extracted sequence should be matched only by a sequence wildcard (_*).
-  def f = C("") match { case C(s) => }
-                             ^
-t7623.scala:11: warning: A repeated case parameter or extracted sequence should be matched only by a sequence wildcard (_*).
-  def g = C("") match { case C(s, t) => }
+t7623.scala:11: warning: A repeated case parameter or extracted sequence is not matched by a sequence wildcard (_*), and may fail at runtime.
+  def g = C("") match { case C(s, t) => }            // warn
                              ^
-t7623.scala:13: warning: A repeated case parameter or extracted sequence should be matched only by a sequence wildcard (_*).
-  def h = C("") match { case C(s, t, u @ _*) => }
+t7623.scala:13: warning: Sequence wildcard (_*) does not align with repeated case parameter or extracted sequence; the result may be unexpected.
+  def h = C("") match { case C(s, t, u @ _*) => }    // warn
                              ^
 error: No warnings can be incurred under -Xfatal-warnings.
-6 warnings found
+four warnings found
 one error found
diff --git a/test/files/neg/t7623.scala b/test/files/neg/t7623.scala
index 5c40f37..5334cc5 100644
--- a/test/files/neg/t7623.scala
+++ b/test/files/neg/t7623.scala
@@ -8,9 +8,9 @@ object X { def unapplySeq(a: Any): Option[(String, Seq[Int])] = Some("", List(1,
 trait Ctest {
   def f = C("") match { case C(s) => }
 
-  def g = C("") match { case C(s, t) => }
+  def g = C("") match { case C(s, t) => }            // warn
 
-  def h = C("") match { case C(s, t, u @ _*) => }
+  def h = C("") match { case C(s, t, u @ _*) => }    // warn
 
   def ok = C("") match { case C(s, u @ _*) => }
 }
@@ -18,9 +18,9 @@ trait Ctest {
 trait Xtest {
   def f = "" match { case X(s) => }
 
-  def g = "" match { case X(s, t) => }
+  def g = "" match { case X(s, t) => }               // warn
 
-  def h = "" match { case X(s, t, u @ _*) => }
+  def h = "" match { case X(s, t, u @ _*) => }       // warn
 
   def ok = "" match { case X(s, u @ _*) => }
 }
diff --git a/test/files/neg/t771.scala b/test/files/neg/t771.scala
old mode 100755
new mode 100644
diff --git a/test/files/neg/t7848-interp-warn.check b/test/files/neg/t7848-interp-warn.check
index 4cf9d55..637fc89 100644
--- a/test/files/neg/t7848-interp-warn.check
+++ b/test/files/neg/t7848-interp-warn.check
@@ -4,9 +4,12 @@ t7848-interp-warn.scala:8: warning: possible missing interpolator: detected inte
 t7848-interp-warn.scala:12: warning: possible missing interpolator: detected an interpolated expression
     "A doubly important ${foo * 2} message!"
     ^
+t7848-interp-warn.scala:15: warning: possible missing interpolator: detected interpolated identifier `$bar`
+  def i = s"Try using '${ "$bar" }' instead."  // was: no warn on space test
+                          ^
 t7848-interp-warn.scala:16: warning: possible missing interpolator: detected interpolated identifier `$bar`
   def j = s"Try using '${ "something like $bar" }' instead."  // warn
                           ^
 error: No warnings can be incurred under -Xfatal-warnings.
-three warnings found
+four warnings found
 one error found
diff --git a/test/files/neg/t7848-interp-warn.scala b/test/files/neg/t7848-interp-warn.scala
index 3887aff..a761410 100644
--- a/test/files/neg/t7848-interp-warn.scala
+++ b/test/files/neg/t7848-interp-warn.scala
@@ -12,7 +12,7 @@ object Test {
     "A doubly important ${foo * 2} message!"
   }
   def h = s"Try using '$$bar' instead."  // no warn
-  def i = s"Try using '${ "$bar" }' instead."  // no warn on space test
+  def i = s"Try using '${ "$bar" }' instead."  // was: no warn on space test
   def j = s"Try using '${ "something like $bar" }' instead."  // warn
   def k = f"Try using '$bar' instead."  // no warn on other std interps
 }
diff --git a/test/files/neg/t8127a.check b/test/files/neg/t8127a.check
new file mode 100644
index 0000000..5a30574
--- /dev/null
+++ b/test/files/neg/t8127a.check
@@ -0,0 +1,4 @@
+t8127a.scala:7: error: The result type of an unapplySeq method must contain a member `get` to be used as an extractor pattern, no such member exists in Seq[_$1]
+    case H(v) =>
+         ^
+one error found
diff --git a/test/files/neg/t8127a.scala b/test/files/neg/t8127a.scala
new file mode 100644
index 0000000..c05facd
--- /dev/null
+++ b/test/files/neg/t8127a.scala
@@ -0,0 +1,12 @@
+object H {
+  def unapplySeq(m: Any): Seq[_] = List("")
+}
+
+object Test {
+  def unapply(m: Any) = m match {
+    case H(v) =>
+    case _ =>
+  }
+  // now:  too many patterns for object H offering Boolean: expected 0, found 1
+  // was: result type Seq[_$2] of unapplySeq defined in method unapplySeq in object H does not conform to Option[_]
+}
diff --git a/test/files/neg/t8237-default.scala b/test/files/neg/t8237-default.scala
index f695aa5..a437004 100644
--- a/test/files/neg/t8237-default.scala
+++ b/test/files/neg/t8237-default.scala
@@ -1,4 +1,4 @@
-// This test case was extracte from `names-defaults-neg.scala`
+// This test case was extracted from `names-defaults-neg.scala`
 // It pinpoints an improvement an error message that results from
 // a type inference failure
 object Test extends App {
diff --git a/test/files/neg/t836.scala b/test/files/neg/t836.scala
index 3633b81..4b86d04 100644
--- a/test/files/neg/t836.scala
+++ b/test/files/neg/t836.scala
@@ -12,5 +12,5 @@ abstract class A {
 class B extends A {
   type MyObj = ObjImpl
   val myString:   S = "hello"
-  val realString: String = myString   // error: type missmatch
+  val realString: String = myString   // error: type mismatch
 }
diff --git a/test/files/neg/t8431.scala b/test/files/neg/t8431.scala
index 032a1f3..bc45bb6 100644
--- a/test/files/neg/t8431.scala
+++ b/test/files/neg/t8431.scala
@@ -48,7 +48,7 @@ class TestExplicit {
   {val c1 = convert2(s); c1.combined}
 }
 
-// These ones work before and after; infering G=Null doesn't need to contribute an undetermined type param.
+// These ones work before and after; inferring G=Null doesn't need to contribute an undetermined type param.
 class Test3 {
    import C.{cbf, convert1, convert2}
    val s: Invariant[Null] = ???
diff --git a/test/files/neg/t8463.scala b/test/files/neg/t8463.scala
index 7c954fd..1337f8b 100644
--- a/test/files/neg/t8463.scala
+++ b/test/files/neg/t8463.scala
@@ -7,7 +7,7 @@ object Test {
 
 /* If SI-8230 is fixed, and `viewExists` is changed to no longer leak
    ambiguity errors, you might expect the check file for this test to
-   change as folloes:
+   change as follows:
 
 @@ -1,18 +1,10 @@
 -t8463.scala:5: error: no type parameters for method apply: (activity:
diff --git a/test/files/neg/t8597b.scala b/test/files/neg/t8597b.scala
index b29d591..cbf0bf1 100644
--- a/test/files/neg/t8597b.scala
+++ b/test/files/neg/t8597b.scala
@@ -4,7 +4,7 @@ object Unchecked {
 
       // t is a fresh pattern type variable, despite our attempts to
       // backtick our way to the enclosing `t`. Under this interpretation,
-      // the absense of an unchecked warning is expected.
+      // the absence of an unchecked warning is expected.
       (null: Any) match {
         case _: Some[t] => // no warn
       }
diff --git a/test/files/neg/t8675b.scala b/test/files/neg/t8675b.scala
index 2c5015b..b2212fa 100644
--- a/test/files/neg/t8675b.scala
+++ b/test/files/neg/t8675b.scala
@@ -9,11 +9,11 @@ object Test {
   }
   trait Reportable1[Params, R]
 
-  // "missing paramater type" error was swallowed in 2.11.0 leading to a crash
+  // "missing parameter type" error was swallowed in 2.11.0 leading to a crash
   // in the backend.
   //
   // This error is itself a regression (or at least a change) in 2.11.0-M7,
-  // specifically in SI-7944. The type paramaters to the implicit view
+  // specifically in SI-7944. The type parameters to the implicit view
   // `EngineTools1` are undetermined, and are now treated as type variables
   // in the expected type of the closure argument to `withFilter`.
   for (path: List[Any] <- (null : Engine1).asRequirement.pathsIncludingSelf.toList) {
diff --git a/test/files/neg/t8731.check b/test/files/neg/t8731.check
index 2a9af47..d47bd55 100644
--- a/test/files/neg/t8731.check
+++ b/test/files/neg/t8731.check
@@ -1,9 +1,6 @@
-t8731.scala:5: warning: matches with two cases or fewer are emitted using if-then-else instead of switch
-  def f(x: Int) = (x: @annotation.switch) match {
-                       ^
 t8731.scala:10: warning: could not emit switch for @switch annotated match
   def g(x: Int) = (x: @annotation.switch) match {
                        ^
 error: No warnings can be incurred under -Xfatal-warnings.
-two warnings found
+one warning found
 one error found
diff --git a/test/files/neg/t8736-c.check b/test/files/neg/t8736-c.check
index 06b2228..7debb6d 100644
--- a/test/files/neg/t8736-c.check
+++ b/test/files/neg/t8736-c.check
@@ -2,7 +2,7 @@ t8736-c.scala:4: warning: higher-kinded type should be enabled
 by making the implicit value scala.language.higherKinds visible.
 This can be achieved by adding the import clause 'import scala.language.higherKinds'
 or by setting the compiler option -language:higherKinds.
-See the Scala docs for value scala.language.higherKinds for a discussion
+See the Scaladoc for value scala.language.higherKinds for a discussion
 why the feature should be explicitly enabled.
   def hk[M[_]] = ???
          ^
diff --git a/test/files/neg/t8777.check b/test/files/neg/t8777.check
new file mode 100644
index 0000000..cd05f1e
--- /dev/null
+++ b/test/files/neg/t8777.check
@@ -0,0 +1,6 @@
+t8777.scala:3: error: type mismatch;
+ found   : Foo.this.TreePrinter(in trait Printers)
+ required: Foo.this.TreePrinter(in trait Printers)
+    super.newCodePrinter(out, tree, printRootPkg)
+                        ^
+one error found
diff --git a/test/files/neg/t8777.scala b/test/files/neg/t8777.scala
new file mode 100644
index 0000000..5b7d123
--- /dev/null
+++ b/test/files/neg/t8777.scala
@@ -0,0 +1,4 @@
+trait Foo extends scala.tools.nsc.Global {
+  override def newCodePrinter(out: java.io.PrintWriter, tree: Tree, printRootPkg: Boolean): TreePrinter =
+    super.newCodePrinter(out, tree, printRootPkg)
+}
diff --git a/test/files/neg/t8892.check b/test/files/neg/t8892.check
new file mode 100644
index 0000000..5930be5
--- /dev/null
+++ b/test/files/neg/t8892.check
@@ -0,0 +1,7 @@
+t8892.scala:2: error: type mismatch;
+ found   : B
+ required: C.this.B
+    (which expands to)  String
+class C[B](x: B) extends A { def f: B = x }
+                                        ^
+one error found
diff --git a/test/files/neg/t8892.scala b/test/files/neg/t8892.scala
new file mode 100644
index 0000000..f857e6f
--- /dev/null
+++ b/test/files/neg/t8892.scala
@@ -0,0 +1,2 @@
+trait A { type B = String }
+class C[B](x: B) extends A { def f: B = x }
diff --git a/test/files/neg/t8989.check b/test/files/neg/t8989.check
new file mode 100644
index 0000000..4e89b86
--- /dev/null
+++ b/test/files/neg/t8989.check
@@ -0,0 +1,4 @@
+t8989.scala:11: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in A
+  val f = p match {case d(1) => true; case _ => false}
+                        ^
+one error found
diff --git a/test/files/neg/t8989.scala b/test/files/neg/t8989.scala
new file mode 100644
index 0000000..8ed6a90
--- /dev/null
+++ b/test/files/neg/t8989.scala
@@ -0,0 +1,14 @@
+class A extends Product1[Int] {
+    def _1 = 1
+    def isEmpty = false // used by scalac
+    def isDefined = !isEmpty // used by dotty
+    def canEqual(a: Any) = true
+}
+
+object d{
+  def unapply(a: Any) = new A
+  val p: Any = ???
+  val f = p match {case d(1) => true; case _ => false}
+}
+
+
diff --git a/test/files/neg/t9127.check b/test/files/neg/t9127.check
new file mode 100644
index 0000000..2ecf8af
--- /dev/null
+++ b/test/files/neg/t9127.check
@@ -0,0 +1,12 @@
+t9127.scala:4: warning: possible missing interpolator: detected interpolated identifier `$s`
+  val t = "$s"
+          ^
+t9127.scala:5: warning: possible missing interpolator: detected an interpolated expression
+  val u = "a${s}b"
+          ^
+t9127.scala:6: warning: possible missing interpolator: detected interpolated identifier `$s`
+  val v = "a$s b"
+          ^
+error: No warnings can be incurred under -Xfatal-warnings.
+three warnings found
+one error found
diff --git a/test/files/neg/t9127.flags b/test/files/neg/t9127.flags
new file mode 100644
index 0000000..b0d7bc2
--- /dev/null
+++ b/test/files/neg/t9127.flags
@@ -0,0 +1 @@
+-Xlint:missing-interpolator -Xfatal-warnings
diff --git a/test/files/neg/t9127.scala b/test/files/neg/t9127.scala
new file mode 100644
index 0000000..c074614
--- /dev/null
+++ b/test/files/neg/t9127.scala
@@ -0,0 +1,7 @@
+
+trait X {
+  val s = "hello"
+  val t = "$s"
+  val u = "a${s}b"
+  val v = "a$s b"
+}
diff --git a/test/files/neg/t9231.check b/test/files/neg/t9231.check
new file mode 100644
index 0000000..43c14f5
--- /dev/null
+++ b/test/files/neg/t9231.check
@@ -0,0 +1,4 @@
+t9231.scala:8: error: not found: type DoesNotExist
+  foo[DoesNotExist]
+      ^
+one error found
diff --git a/test/files/neg/t9231.scala b/test/files/neg/t9231.scala
new file mode 100644
index 0000000..05b1d24
--- /dev/null
+++ b/test/files/neg/t9231.scala
@@ -0,0 +1,9 @@
+class M[A]
+class C {
+  implicit def M1: M[Int] = null
+  implicit def M2: M[String] = null
+
+  def foo[A](implicit M: M[A]) = null
+
+  foo[DoesNotExist]
+}
diff --git a/test/files/neg/t9273.check b/test/files/neg/t9273.check
new file mode 100644
index 0000000..1dca63a
--- /dev/null
+++ b/test/files/neg/t9273.check
@@ -0,0 +1,10 @@
+t9273.scala:2: error: class type required but ? found
+  val foo: Class[_] = classOf            // error without position, line or file
+                      ^
+t9273.scala:3: error: not found: type X
+  val foo1: Class[_] = classOf[X]        // good error, all info contained
+                               ^
+t9273.scala:7: error: not found: type X
+  val foo4: Class[_] = Predef.classOf[X] // good error, all info contained
+                                      ^
+three errors found
diff --git a/test/files/neg/t9273.scala b/test/files/neg/t9273.scala
new file mode 100644
index 0000000..3f99dff
--- /dev/null
+++ b/test/files/neg/t9273.scala
@@ -0,0 +1,9 @@
+class MissingLineNumbers {
+  val foo: Class[_] = classOf            // error without position, line or file
+  val foo1: Class[_] = classOf[X]        // good error, all info contained
+  val foo2 = classOf                     // Infers  T=Nothing
+
+  val foo3: Class[_] = Predef.classOf    // Infers  T=Nothing. Irregular wrt typedIdent.
+  val foo4: Class[_] = Predef.classOf[X] // good error, all info contained
+  val foo5 = Predef.classOf              // Infers  T=Nothing
+}
diff --git a/test/files/neg/t9286a.check b/test/files/neg/t9286a.check
new file mode 100644
index 0000000..2bc7c0c
--- /dev/null
+++ b/test/files/neg/t9286a.check
@@ -0,0 +1,7 @@
+t9286a.scala:6: error: name clash between defined and inherited member:
+def foo(o: (String,)): Unit in class T and
+private def foo(o: (Any,)): Unit at line 6
+have same type after erasure: (o: Tuple1)Unit
+   private def foo(o: Tuple1[Any]) = ()
+               ^
+one error found
diff --git a/test/files/neg/t9286a.scala b/test/files/neg/t9286a.scala
new file mode 100644
index 0000000..0375ac5
--- /dev/null
+++ b/test/files/neg/t9286a.scala
@@ -0,0 +1,13 @@
+class T {
+  def foo(o: Tuple1[String]) = ()
+}
+
+class U extends T {
+   private def foo(o: Tuple1[Any]) = ()
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    new U().foo(null) // IllegalAccessError:  tried to access method U.foo(Lscala/Tuple1;)V from class Test$
+  }
+}
diff --git a/test/files/neg/t9286b.check b/test/files/neg/t9286b.check
new file mode 100644
index 0000000..89a191b
--- /dev/null
+++ b/test/files/neg/t9286b.check
@@ -0,0 +1,7 @@
+t9286b.scala:2: error: name clash between defined and inherited member:
+def foo: Int in class C and
+private def foo[A]: Int at line 2
+have same type after erasure: ()Int
+class D extends C { private def foo[A] = 0 }
+                                ^
+one error found
diff --git a/test/files/neg/t9286b.scala b/test/files/neg/t9286b.scala
new file mode 100644
index 0000000..5c23075
--- /dev/null
+++ b/test/files/neg/t9286b.scala
@@ -0,0 +1,5 @@
+class C { def foo = 0 }
+class D extends C { private def foo[A] = 0 }
+
+class E { private def foo = 0 }
+class F extends E { def foo[A] = 0 } // okay
diff --git a/test/files/neg/t9286c.check b/test/files/neg/t9286c.check
new file mode 100644
index 0000000..785cb3f
--- /dev/null
+++ b/test/files/neg/t9286c.check
@@ -0,0 +1,7 @@
+t9286c.scala:8: error: name clash between defined and inherited member:
+def foo(m: M[_ >: String]): Int in trait T and
+private def foo(m: M[_ >: Any]): Int at line 8
+have same type after erasure: (m: M)Int
+    def foo(m: M[_ >: Any]) = 0 // Expected: "same type after erasure"
+        ^
+one error found
diff --git a/test/files/neg/t9286c.scala b/test/files/neg/t9286c.scala
new file mode 100644
index 0000000..3df08dc
--- /dev/null
+++ b/test/files/neg/t9286c.scala
@@ -0,0 +1,14 @@
+class M[_]
+trait T {
+  def foo(m: M[_ >: String]) = 42
+}
+
+object Test {
+  def t: T = new T {
+    def foo(m: M[_ >: Any]) = 0 // Expected: "same type after erasure"
+  }
+  def main(args: Array[String]): Unit = {
+    val m: M[String] = null
+    t.foo(m) // VeriyError: Duplicate method name&signature
+  }
+}
diff --git a/test/files/neg/t9401.check b/test/files/neg/t9401.check
new file mode 100644
index 0000000..638d56d
--- /dev/null
+++ b/test/files/neg/t9401.check
@@ -0,0 +1,4 @@
+t9401.scala:3: error: cannot find class tag for element type T
+  gencastarray = new Array[T](0)
+                 ^
+one error found
diff --git a/test/files/neg/t9401.scala b/test/files/neg/t9401.scala
new file mode 100644
index 0000000..f42ecc7
--- /dev/null
+++ b/test/files/neg/t9401.scala
@@ -0,0 +1,4 @@
+class Resetting[T] {
+  var gencastarray: Any = null
+  gencastarray = new Array[T](0)
+}
diff --git a/test/files/neg/t9572.check b/test/files/neg/t9572.check
new file mode 100644
index 0000000..b95bd01
--- /dev/null
+++ b/test/files/neg/t9572.check
@@ -0,0 +1,7 @@
+t9572.scala:3: error: too many elements for tuple: 23, allowed: 22
+  val term23 = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23)
+               ^
+t9572.scala:5: error: too many elements for tuple: 23, allowed: 22
+  val type23: (Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int) = null
+              ^
+two errors found
diff --git a/test/files/neg/t9572.scala b/test/files/neg/t9572.scala
new file mode 100644
index 0000000..32b2db3
--- /dev/null
+++ b/test/files/neg/t9572.scala
@@ -0,0 +1,6 @@
+class T9572 {
+  val term22 = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22)
+  val term23 = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23)
+  val type22: (Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int) = null
+  val type23: (Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int) = null
+}
diff --git a/src/intellij/test/files/neg/virtpatmat_exhaust_big.check b/test/files/neg/virtpatmat_exhaust_big.check
similarity index 100%
rename from src/intellij/test/files/neg/virtpatmat_exhaust_big.check
rename to test/files/neg/virtpatmat_exhaust_big.check
diff --git a/src/intellij/test/files/neg/virtpatmat_exhaust_big.flags b/test/files/neg/virtpatmat_exhaust_big.flags
similarity index 100%
copy from src/intellij/test/files/neg/virtpatmat_exhaust_big.flags
copy to test/files/neg/virtpatmat_exhaust_big.flags
diff --git a/src/intellij/test/files/neg/virtpatmat_exhaust_big.scala b/test/files/neg/virtpatmat_exhaust_big.scala
similarity index 100%
rename from src/intellij/test/files/neg/virtpatmat_exhaust_big.scala
rename to test/files/neg/virtpatmat_exhaust_big.scala
diff --git a/test/files/neg/virtpatmat_exhaust_compound.scala b/test/files/neg/virtpatmat_exhaust_compound.scala
index 386c7af..4ff04dd 100644
--- a/test/files/neg/virtpatmat_exhaust_compound.scala
+++ b/test/files/neg/virtpatmat_exhaust_compound.scala
@@ -10,7 +10,7 @@ case object O3 extends Base2
 case object O4 extends Base with Base2
 
 object Test {
-  val a /*: Product with Serialiable with Base */ = if (true) O1 else O2
+  val a /*: Product with Serializable with Base */ = if (true) O1 else O2
   a match {
     case null =>
   }
diff --git a/test/files/neg/warn-unused-imports.check b/test/files/neg/warn-unused-imports.check
index 36c6dd0..0a53d7a 100644
--- a/test/files/neg/warn-unused-imports.check
+++ b/test/files/neg/warn-unused-imports.check
@@ -1,33 +1,55 @@
-warn-unused-imports.scala:57: warning: Unused import
+warn-unused-imports_2.scala:133: error: type mismatch;
+ found   : Int(42)
+ required: Sample.X
+    f(42)                       // error
+      ^
+warn-unused-imports_2.scala:57: warning: Unused import
     import p1.A // warn
               ^
-warn-unused-imports.scala:62: warning: Unused import
+warn-unused-imports_2.scala:62: warning: Unused import
     import p1.{ A, B } // warn on A
                 ^
-warn-unused-imports.scala:67: warning: Unused import
+warn-unused-imports_2.scala:67: warning: Unused import
     import p1.{ A, B } // warn on both
                 ^
-warn-unused-imports.scala:67: warning: Unused import
+warn-unused-imports_2.scala:67: warning: Unused import
     import p1.{ A, B } // warn on both
                    ^
-warn-unused-imports.scala:73: warning: Unused import
+warn-unused-imports_2.scala:73: warning: Unused import
     import c._  // warn
              ^
-warn-unused-imports.scala:78: warning: Unused import
+warn-unused-imports_2.scala:78: warning: Unused import
     import p1._ // warn
               ^
-warn-unused-imports.scala:85: warning: Unused import
+warn-unused-imports_2.scala:85: warning: Unused import
     import c._  // warn
              ^
-warn-unused-imports.scala:91: warning: Unused import
+warn-unused-imports_2.scala:91: warning: Unused import
     import p1.c._  // warn
                 ^
-warn-unused-imports.scala:98: warning: Unused import
+warn-unused-imports_2.scala:98: warning: Unused import
     import p1._   // warn
               ^
-warn-unused-imports.scala:118: warning: Unused import
+warn-unused-imports_2.scala:118: warning: Unused import
     import p1.A   // warn
               ^
-error: No warnings can be incurred under -Xfatal-warnings.
-10 warnings found
+warn-unused-imports_2.scala:132: warning: Unused import
+    import Sample.Implicits._   // warn
+                            ^
+warn-unused-imports_2.scala:143: warning: Unused import
+    import Sample.Implicits.useless     // warn
+                            ^
+warn-unused-imports_2.scala:147: warning: Unused import
+    import java.io.File                 // warn
+                   ^
+warn-unused-imports_2.scala:148: warning: Unused import
+    import scala.concurrent.Future      // warn
+                            ^
+warn-unused-imports_2.scala:149: warning: Unused import
+    import scala.concurrent.ExecutionContext.Implicits.global // warn
+                                                       ^
+warn-unused-imports_2.scala:150: warning: Unused import
+    import p1.A                         // warn
+              ^
+16 warnings found
 one error found
diff --git a/test/files/neg/warn-unused-imports.scala b/test/files/neg/warn-unused-imports.scala
deleted file mode 100644
index b7a2f1c..0000000
--- a/test/files/neg/warn-unused-imports.scala
+++ /dev/null
@@ -1,125 +0,0 @@
-class Bippo {
-  def length: Int = 123
-  class Tree
-}
-
-package object p1 {
-  class A
-  implicit class B(val s: String) { def bippy = s }
-  val c: Bippo = new Bippo
-  type D = String
-}
-package object p2 {
-  class A
-  implicit class B(val s: String) { def bippy = s }
-  val c: Bippo = new Bippo
-  type D = Int
-}
-
-trait NoWarn {
-  {
-    import p1._ // no warn
-    println("abc".bippy)
-  }
-
-  {
-    import p1._ // no warn
-    println(new A)
-  }
-
-  {
-    import p1.B // no warn
-    println("abc".bippy)
-  }
-
-  {
-    import p1._ // no warn
-    import c._  // no warn
-    println(length)
-  }
-
-  {
-    import p1._ // no warn
-    import c._  // no warn
-    val x: Tree = null
-    println(x)
-  }
-
-  {
-    import p1.D // no warn
-    val x: D = null
-    println(x)
-  }
-}
-
-trait Warn {
-  {
-    import p1.A // warn
-    println(123)
-  }
-
-  {
-    import p1.{ A, B } // warn on A
-    println("abc".bippy)
-  }
-
-  {
-    import p1.{ A, B } // warn on both
-    println(123)
-  }
-
-  {
-    import p1._ // no warn (technically this could warn, but not worth the effort to unroll unusedness transitively)
-    import c._  // warn
-    println(123)
-  }
-
-  {
-    import p1._ // warn
-    println(123)
-  }
-
-  {
-    class Tree
-    import p1._ // no warn
-    import c._  // warn
-    val x: Tree = null
-    println(x)
-  }
-
-  {
-    import p1.c._  // warn
-    println(123)
-  }
-}
-
-trait Nested {
-  {
-    import p1._   // warn
-    trait Warn {  // warn about unused local trait for good measure
-      import p2._
-      println(new A)
-      println("abc".bippy)
-    }
-    println("")
-  }
-
-  {
-    import p1._   // no warn
-    trait NoWarn {
-      import p2.B  // no warn
-      println("abc".bippy)
-      println(new A)
-    }
-    println(new NoWarn { })
-  }
-
-  {
-    import p1.A   // warn
-    trait Warn {
-      import p2.A
-      println(new A)
-    }
-    println(new Warn { })
-  }
-}
diff --git a/test/files/neg/warn-unused-imports/sample_1.scala b/test/files/neg/warn-unused-imports/sample_1.scala
new file mode 100644
index 0000000..d2f8623
--- /dev/null
+++ b/test/files/neg/warn-unused-imports/sample_1.scala
@@ -0,0 +1,17 @@
+
+import language._
+
+object Sample {
+  trait X
+  trait Y
+
+  // import of the non-implicit should be unused
+  object Implicits {
+    def `int to X`(i: Int): X = null
+    implicit def `int to Y`(i: Int): Y = null
+    implicit def useless(i: Int): String = null
+  }
+
+  def f(x: X) = ???
+  def g(y: Y) = ???
+}
diff --git a/test/files/neg/warn-unused-imports/warn-unused-imports_2.scala b/test/files/neg/warn-unused-imports/warn-unused-imports_2.scala
new file mode 100644
index 0000000..ded1186
--- /dev/null
+++ b/test/files/neg/warn-unused-imports/warn-unused-imports_2.scala
@@ -0,0 +1,155 @@
+class Bippo {
+  def length: Int = 123
+  class Tree
+}
+
+package object p1 {
+  class A
+  implicit class B(val s: String) { def bippy = s }
+  val c: Bippo = new Bippo
+  type D = String
+}
+package object p2 {
+  class A
+  implicit class B(val s: String) { def bippy = s }
+  val c: Bippo = new Bippo
+  type D = Int
+}
+
+trait NoWarn {
+  {
+    import p1._ // no warn
+    println("abc".bippy)
+  }
+
+  {
+    import p1._ // no warn
+    println(new A)
+  }
+
+  {
+    import p1.B // no warn
+    println("abc".bippy)
+  }
+
+  {
+    import p1._ // no warn
+    import c._  // no warn
+    println(length)
+  }
+
+  {
+    import p1._ // no warn
+    import c._  // no warn
+    val x: Tree = null
+    println(x)
+  }
+
+  {
+    import p1.D // no warn
+    val x: D = null
+    println(x)
+  }
+}
+
+trait Warn {
+  {
+    import p1.A // warn
+    println(123)
+  }
+
+  {
+    import p1.{ A, B } // warn on A
+    println("abc".bippy)
+  }
+
+  {
+    import p1.{ A, B } // warn on both
+    println(123)
+  }
+
+  {
+    import p1._ // no warn (technically this could warn, but not worth the effort to unroll unusedness transitively)
+    import c._  // warn
+    println(123)
+  }
+
+  {
+    import p1._ // warn
+    println(123)
+  }
+
+  {
+    class Tree
+    import p1._ // no warn
+    import c._  // warn
+    val x: Tree = null
+    println(x)
+  }
+
+  {
+    import p1.c._  // warn
+    println(123)
+  }
+}
+
+trait Nested {
+  {
+    import p1._   // warn
+    trait Warn {  // warn about unused local trait for good measure
+      import p2._
+      println(new A)
+      println("abc".bippy)
+    }
+    println("")
+  }
+
+  {
+    import p1._   // no warn
+    trait NoWarn {
+      import p2.B  // no warn
+      println("abc".bippy)
+      println(new A)
+    }
+    println(new NoWarn { })
+  }
+
+  {
+    import p1.A   // warn
+    trait Warn {
+      import p2.A
+      println(new A)
+    }
+    println(new Warn { })
+  }
+}
+
+// test unusage of imports from other compilation units after implicit search
+trait Outsiders {
+  {
+    //implicit search should not disable warning
+    import Sample._
+    import Sample.Implicits._   // warn
+    f(42)                       // error
+  }
+  {
+    import Sample._
+    import Sample.Implicits._   // nowarn
+    g(42)                       // ok
+  }
+  {
+    import Sample._
+    import Sample.Implicits.`int to Y`  // nowarn
+    import Sample.Implicits.useless     // warn
+    g(42)                       // ok
+  }
+  {
+    import java.io.File                 // warn
+    import scala.concurrent.Future      // warn
+    import scala.concurrent.ExecutionContext.Implicits.global // warn
+    import p1.A                         // warn
+    import p1.B                         // no warn
+    println("abc".bippy)
+    //Future("abc".bippy)
+  }
+}
diff --git a/test/files/neg/warn-unused-privates.scala b/test/files/neg/warn-unused-privates.scala
index 2faa07e..2eda280 100644
--- a/test/files/neg/warn-unused-privates.scala
+++ b/test/files/neg/warn-unused-privates.scala
@@ -21,7 +21,7 @@ class B3(msg0: String) extends A("msg")
 
 /*** Early defs warnings disabled primarily due to SI-6595.
  *   The test case is here to assure we aren't issuing false positives;
- *   the ones labeled "warn" don't warn.
+ *   the ones labelled "warn" don't warn.
  ***/
 class Boppy extends {
   private val hmm: String = "abc"       // no warn, used in early defs
diff --git a/test/files/pos/SI-4012-b.scala b/test/files/pos/SI-4012-b.scala
index 6bc8592..f6d8496 100644
--- a/test/files/pos/SI-4012-b.scala
+++ b/test/files/pos/SI-4012-b.scala
@@ -6,7 +6,7 @@ object Sub extends Super[Int] {
   // it is expected that super[Super].superb crashes, since 
   // specialization does parent class rewiring, and the super
   // of Sub becomes Super$mcII$sp and not Super. But I consider
-  // this normal behavior -- if you want, I can modify duplicatiors
+  // this normal behavior -- if you want, I can modify duplicators
   // to make this work, but I consider it's best to keep this
   // let the user know Super is not the superclass anymore.
   // super[Super].superb - Vlad
diff --git a/test/files/pos/delambdafy-patterns.scala b/test/files/pos/delambdafy-patterns.scala
index 95d4986..ca9eaa6 100644
--- a/test/files/pos/delambdafy-patterns.scala
+++ b/test/files/pos/delambdafy-patterns.scala
@@ -2,7 +2,7 @@ class DelambdafyPatterns {
   def bar: Unit = ()
   def wildcardPatternInTryCatch: Unit => Unit = (x: Unit) =>
     // patterns in try..catch are preserved so we need to be
-    // careful when it comes to free variable detction
+    // careful when it comes to free variable detection
     // in particular a is _not_ free variable, also the
     // `_` identifier has no symbol attached to it
     try bar catch {
diff --git a/test/files/pos/existental-slow-compile2.scala b/test/files/pos/existental-slow-compile2.scala
new file mode 100644
index 0000000..9073449
--- /dev/null
+++ b/test/files/pos/existental-slow-compile2.scala
@@ -0,0 +1,7 @@
+class C {
+  class L[+A]
+  def test = {
+    val foo:
+      L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: _ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: _ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_]]]]]]]]]]]]]]]]]]]]]]]]
+          = ??? } }
+
diff --git a/test/files/pos/existential-slow-compile1.flags b/test/files/pos/existential-slow-compile1.flags
new file mode 100644
index 0000000..7f75819
--- /dev/null
+++ b/test/files/pos/existential-slow-compile1.flags
@@ -0,0 +1 @@
+-Ystop-after:refchecks
diff --git a/test/files/pos/existential-slow-compile1.scala b/test/files/pos/existential-slow-compile1.scala
new file mode 100644
index 0000000..8602afd
--- /dev/null
+++ b/test/files/pos/existential-slow-compile1.scala
@@ -0,0 +1,7 @@
+class C {
+  type L[+A] = scala.collection.immutable.List[A]
+  def test = {
+    val foo:
+      L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: _ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: _ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_ <: L[_]]]]]]]]]]]]]]]]]]]]]]]]
+          = ??? } }
+
diff --git a/test/files/pos/jesper.scala b/test/files/pos/jesper.scala
new file mode 100644
index 0000000..82623e4
--- /dev/null
+++ b/test/files/pos/jesper.scala
@@ -0,0 +1,30 @@
+object Pair {
+ sealed trait Pair {
+   type First
+   type Second <: Pair
+ }
+
+ case class End() extends Pair {
+   type First = Nothing
+   type Second = End
+
+   def ::[T](v : T) : Cons[T, End] = Cons(v, this)
+ }
+
+ object End extends End()
+
+ final case class Cons[T1, T2 <: Pair](_1 : T1, _2 : T2) extends Pair {
+   type First = T1
+   type Second = T2
+
+   def ::[T](v : T) : Cons[T, Cons[T1, T2]] = Cons(v, this)
+   def find[T](implicit finder : Cons[T1, T2] => T) = finder(this)
+ }
+
+ implicit def findFirst[T1, T2 <: Pair] : Cons[T1, T2] => T1 = (p : Cons[T1, T2]) => p._1
+ implicit def findSecond[T, T1, T2 <: Pair](implicit finder : T2 => T) : Cons[T1, T2] => T = (p : Cons[T1, T2]) => finder(p._2)
+
+ val p : Cons[Int, Cons[Boolean, End]] = 10 :: false :: End
+// val x : Boolean = p.find[Boolean](findSecond(findFirst))
+ val x2 : Boolean = p.find[Boolean]  // Doesn't compile
+}
diff --git a/test/files/pos/lexical.scala b/test/files/pos/lexical.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/packageobjs.scala b/test/files/pos/packageobjs.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/spec-t6286.scala b/test/files/pos/spec-t6286.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t1459/AbstractBase.java b/test/files/pos/t1459/AbstractBase.java
old mode 100755
new mode 100644
diff --git a/test/files/pos/t1459/App.scala b/test/files/pos/t1459/App.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t1459/Caller.java b/test/files/pos/t1459/Caller.java
old mode 100755
new mode 100644
diff --git a/test/files/pos/t1722/Test.scala b/test/files/pos/t1722/Test.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t1722/Top.scala b/test/files/pos/t1722/Top.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t1756.scala b/test/files/pos/t1756.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2060.scala b/test/files/pos/t2060.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2082.scala b/test/files/pos/t2082.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2179.scala b/test/files/pos/t2179.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2405.scala b/test/files/pos/t2405.scala
index 224b2ce..0bc7a77 100644
--- a/test/files/pos/t2405.scala
+++ b/test/files/pos/t2405.scala
@@ -6,14 +6,14 @@ object Test1 {
 	implicitly[Int]
 }
 
-// Testing for the absense of shadowing #1.
+// Testing for the absence of shadowing #1.
 object Test2 {
 	import A.{x => y}
 	val x = 2
 	implicitly[Int]
 }
 
-// Testing for the absense of shadowing #2.
+// Testing for the absence of shadowing #2.
 object Test3 {
 	{
 		import A.{x => y}
diff --git a/test/files/pos/t2425.scala b/test/files/pos/t2425.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2429.scala b/test/files/pos/t2429.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2433/A.java b/test/files/pos/t2433/A.java
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2433/B.java b/test/files/pos/t2433/B.java
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2433/Test.scala b/test/files/pos/t2433/Test.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2484.scala b/test/files/pos/t2484.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2504.scala b/test/files/pos/t2504.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2545.scala b/test/files/pos/t2545.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2635.scala b/test/files/pos/t2635.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2683.scala b/test/files/pos/t2683.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2913.scala b/test/files/pos/t2913.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t2956/t2956.scala b/test/files/pos/t2956/t2956.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t3174.scala b/test/files/pos/t3174.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t3174b.scala b/test/files/pos/t3174b.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t3368.flags b/test/files/pos/t3368.flags
new file mode 100644
index 0000000..cb20509
--- /dev/null
+++ b/test/files/pos/t3368.flags
@@ -0,0 +1 @@
+-Ystop-after:parser
diff --git a/test/files/pos/t3368.scala b/test/files/pos/t3368.scala
new file mode 100644
index 0000000..c8e861a
--- /dev/null
+++ b/test/files/pos/t3368.scala
@@ -0,0 +1,5 @@
+
+trait X {
+  // error: in XML literal: name expected, but char '!' cannot start a name
+  def x = <![CDATA[hi & bye]]> <![CDATA[red & black]]>
+}
diff --git a/test/files/pos/t3420.flags b/test/files/pos/t3420.flags
index ea03113..d37e817 100644
--- a/test/files/pos/t3420.flags
+++ b/test/files/pos/t3420.flags
@@ -1 +1 @@
--optimise -Xfatal-warnings
\ No newline at end of file
+-optimise -Xfatal-warnings
diff --git a/test/files/pos/t3568.scala b/test/files/pos/t3568.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t4553.scala b/test/files/pos/t4553.scala
old mode 100755
new mode 100644
diff --git a/test/files/pos/t6089b.scala b/test/files/pos/t6089b.scala
index ff7ca15..0409874 100644
--- a/test/files/pos/t6089b.scala
+++ b/test/files/pos/t6089b.scala
@@ -1,5 +1,5 @@
 // this crazy code simply tries to nest pattern matches so that the last call is in a tricky-to-determine
-// tail position (my initial tightenign of tailpos detection for SI-6089 ruled this out)
+// tail position (my initial tightening of tailpos detection for SI-6089 ruled this out)
 class BKTree {
  @annotation.tailrec
  final def -?-[AA](a: AA): Boolean = this match {
diff --git a/test/files/pos/t6575b.scala b/test/files/pos/t6575b.scala
index d3e58b2..c894242 100644
--- a/test/files/pos/t6575b.scala
+++ b/test/files/pos/t6575b.scala
@@ -1,5 +1,5 @@
 // inferred types were okay here as Function nodes aren't
-// translated into anoymous subclasses of AbstractFunctionN
+// translated into anonymous subclasses of AbstractFunctionN
 // until after the typer.
 //
 // So this test is just confirmation.
diff --git a/test/files/pos/t6601/UsePrivateValueClass_2.scala b/test/files/pos/t6601/UsePrivateValueClass_2.scala
index 461b839..3b2b3dc 100644
--- a/test/files/pos/t6601/UsePrivateValueClass_2.scala
+++ b/test/files/pos/t6601/UsePrivateValueClass_2.scala
@@ -1,5 +1,5 @@
 object Test {
-	// After the first attempt to make seprately compiled value
+	// After the first attempt to make separately compiled value
 	// classes respect the privacy of constructors, we got:
 	//
 	//   exception when typing v.a().==(v.a())/class scala.reflect.internal.Trees$Apply
diff --git a/test/files/pos/t6648.scala b/test/files/pos/t6648.scala
index 9593ebf..b8f2487 100644
--- a/test/files/pos/t6648.scala
+++ b/test/files/pos/t6648.scala
@@ -10,7 +10,7 @@ class Transformer {
 }
 
 object transformer1 extends Transformer {
-  // Adding explicit type arguments, or making the impilcit view
+  // Adding explicit type arguments, or making the implicit view
   // seqToNodeSeq explicit avoids the crash
   NodeSeq.foo {
     // These both avoid the crash:
diff --git a/test/files/neg/t6666d.scala b/test/files/pos/t6666d.scala
similarity index 100%
rename from test/files/neg/t6666d.scala
rename to test/files/pos/t6666d.scala
diff --git a/test/files/pos/t6942.flags b/test/files/pos/t6942.flags
index e8fb65d..0f96f1f 100644
--- a/test/files/pos/t6942.flags
+++ b/test/files/pos/t6942.flags
@@ -1 +1 @@
--Xfatal-warnings
\ No newline at end of file
+-nowarn
\ No newline at end of file
diff --git a/test/files/pos/t7200b.scala b/test/files/pos/t7200b.scala
index 9d579c6..59be898 100644
--- a/test/files/pos/t7200b.scala
+++ b/test/files/pos/t7200b.scala
@@ -10,7 +10,7 @@ trait Foo {
 object O extends Foo {
   def coflatMap[A <: T](f: A) = {
     val f2 = coflatMap(f) // inferred in 2.9.2 / 2.10.0 as [Nothing]
-    f2.t                  // so this does't type check.
+    f2.t                  // so this fails to type check.
     f2
   }
 }
diff --git a/test/files/pos/t7689.scala b/test/files/pos/t7689.scala
index 022e7ab..72cca99 100644
--- a/test/files/pos/t7689.scala
+++ b/test/files/pos/t7689.scala
@@ -2,6 +2,6 @@ object A {
   // The default getter must have an explicit return type (List[_] => Int)
   // This wasn't happening since e28c3edda4. That commit encoded upper/lower
   // bounds of Any/Nothing as EmptyTree, which were triggering an .isEmpty
-  // check in Namers#TypeTreeSubstitutor
+  // check in Namers#TypeTreeSubstituter
   def x(f: List[_] => Int = _ => 3) = 9
 }
diff --git a/test/files/pos/t7815.scala b/test/files/pos/t7815.scala
index 12a434c..0a126f9 100644
--- a/test/files/pos/t7815.scala
+++ b/test/files/pos/t7815.scala
@@ -21,7 +21,7 @@ object Foo {
 object Main extends App {
   def mapWithFoo[A <: AnyRef, B](as: List[A])(implicit foo: Foo.Aux[A, B]) = {
     // Should be Eta expandable because the result type of `f` is not
-    // dependant on the value, it is just `B`.
+    // dependent on the value, it is just `B`.
     as map foo.f
     as map foo.g
     as map foo.m
diff --git a/test/files/pos/t8002-nested-scope.scala b/test/files/pos/t8002-nested-scope.scala
index a2088bc..8ce809e 100644
--- a/test/files/pos/t8002-nested-scope.scala
+++ b/test/files/pos/t8002-nested-scope.scala
@@ -1,5 +1,5 @@
 //  This test serves to capture the status quo, but should really
-// emit an accessibiltiy error.
+// emit an accessibility error.
 
 // `Namers#companionSymbolOf` seems too lenient, and currently doesn't
 // implement the same-scope checks mentioned:
diff --git a/test/files/pos/t8111.scala b/test/files/pos/t8111.scala
index 0d63a16..09463ce 100644
--- a/test/files/pos/t8111.scala
+++ b/test/files/pos/t8111.scala
@@ -7,10 +7,10 @@ trait T {
     foo((u: Unit) => ma)
     foo(0, (u: Any) => ma) apply ()
 
-    // crash due to side effects on the onwer of the symbol in the 
+    // crash due to side effects on the owner of the symbol in the
     // qualifier or arguments of the application during an abandoned
-    // names/defaults transform. The code type checkes because of
-    // autp-tupling which promotes and empty parmater list to `(): Unit`
+    // names/defaults transform. The code type checks because of
+    // auto-tupling which promotes an empty parameter list to `(): Unit`
     foo((u: Any) => ma)()
     
     {{(u: Any) => ma}; this}.foo(0)()
diff --git a/test/files/jvm/patmat_opt_primitive_typetest.flags b/test/files/pos/t8359-closelim-crash.flags
similarity index 100%
copy from test/files/jvm/patmat_opt_primitive_typetest.flags
copy to test/files/pos/t8359-closelim-crash.flags
diff --git a/test/files/pos/t8359-closelim-crash.scala b/test/files/pos/t8359-closelim-crash.scala
new file mode 100644
index 0000000..1413694
--- /dev/null
+++ b/test/files/pos/t8359-closelim-crash.scala
@@ -0,0 +1,23 @@
+package test
+
+// This is a minimization of code that crashed the compiler during bootstrapping
+// in the first iteration of https://github.com/scala/scala/pull/4373, the PR
+// that adjusted the order of free and declared params in LambdaLift.
+
+// Was:
+//  java.lang.AssertionError: assertion failed:
+//  Record Record(<$anon: Function1>,Map(value a$1 -> Deref(LocalVar(value b)))) does not contain a field value b$1
+// at scala.tools.nsc.Global.assert(Global.scala:262)
+// at scala.tools.nsc.backend.icode.analysis.CopyPropagation$copyLattice$State.getFieldNonRecordValue(CopyPropagation.scala:113)
+// at scala.tools.nsc.backend.icode.analysis.CopyPropagation$copyLattice$State.getFieldNonRecordValue(CopyPropagation.scala:122)
+// at scala.tools.nsc.backend.opt.ClosureElimination$ClosureElim$$anonfun$analyzeMethod$1$$anonfun$apply$2.replaceFieldAccess$1(ClosureElimination.scala:124)
+class Typer {
+  def bar(a: Boolean, b: Boolean): Unit = {
+    @inline
+    def baz(): Unit = {
+      ((_: Any) => (Typer.this, a, b)).apply("")
+    }
+    ((_: Any) => baz()).apply("")
+  }
+}
+
diff --git a/test/files/pos/t8861.flags b/test/files/pos/t8861.flags
new file mode 100644
index 0000000..99a6391
--- /dev/null
+++ b/test/files/pos/t8861.flags
@@ -0,0 +1 @@
+-Xlint:infer-any -Xfatal-warnings
diff --git a/test/files/pos/t8861.scala b/test/files/pos/t8861.scala
new file mode 100644
index 0000000..816d157
--- /dev/null
+++ b/test/files/pos/t8861.scala
@@ -0,0 +1,11 @@
+
+trait Test {
+  type R = PartialFunction[Any, Unit]
+
+  val x: R = { case "" => }
+  val y: R = { case "" => }
+
+  val z: R = x orElse y
+  val zz   = x orElse y
+}
+
diff --git a/test/files/pos/t8947/Macro_1.scala b/test/files/pos/t8947/Macro_1.scala
index 4a5de3d..ace389f 100644
--- a/test/files/pos/t8947/Macro_1.scala
+++ b/test/files/pos/t8947/Macro_1.scala
@@ -35,7 +35,7 @@ object X {
   //        symtab.EmptyTree.setAttachments(symtab.NoPosition)
   //      }
   //
-  //   To make this visible to the macro implementaiton, it will need to be compiled in an earlier stage,
+  //   To make this visible to the macro implementation, it will need to be compiled in an earlier stage,
   //   e.g a separate SBT sub-project.
 
 }
diff --git a/test/files/pos/t8954/t2.scala b/test/files/pos/t8954/t2.scala
index 4def127..c178486 100644
--- a/test/files/pos/t8954/t2.scala
+++ b/test/files/pos/t8954/t2.scala
@@ -19,7 +19,7 @@ class C {
 }
 
 // 2.1 overriding with a deprecated def should be fine
-// and also shoudln't trigger the "deprecation is useless"
+// and also should not trigger the "deprecation is useless"
 // warning
 class D extends C {
   @deprecated("","") override def foo(): Unit = ???
diff --git a/test/files/pos/t9020.flags b/test/files/pos/t9020.flags
new file mode 100644
index 0000000..efb2dd3
--- /dev/null
+++ b/test/files/pos/t9020.flags
@@ -0,0 +1 @@
+-Ywarn-value-discard -Xfatal-warnings
diff --git a/test/files/pos/t9020.scala b/test/files/pos/t9020.scala
new file mode 100644
index 0000000..16e31e2
--- /dev/null
+++ b/test/files/pos/t9020.scala
@@ -0,0 +1,10 @@
+trait ValueDiscard[@specialized U] {
+  def u: U
+}
+/* Was:
+scalac-hash v2.11.5 -Ywarn-value-discard test/files/pos/t9020.scala
+test/files/pos/t9020.scala:2: warning: discarded non-Unit value
+  def u: U
+      ^
+one warning found
+*/
diff --git a/test/files/pos/t9111-inliner-workaround.flags b/test/files/pos/t9111-inliner-workaround.flags
new file mode 100644
index 0000000..63b5558
--- /dev/null
+++ b/test/files/pos/t9111-inliner-workaround.flags
@@ -0,0 +1 @@
+-Ybackend:GenBCode -Yopt:l:classpath
\ No newline at end of file
diff --git a/test/files/pos/t9111-inliner-workaround/A_1.java b/test/files/pos/t9111-inliner-workaround/A_1.java
new file mode 100644
index 0000000..bc60b68
--- /dev/null
+++ b/test/files/pos/t9111-inliner-workaround/A_1.java
@@ -0,0 +1,13 @@
+public class A_1 {
+  public static class T { }
+
+  public static class Inner {
+    public static class T { }
+
+    public void foo(T t) { }
+
+    public T t = null;
+
+    public class Deeper extends T { }
+  }
+}
diff --git a/test/files/pos/t9111-inliner-workaround/Test_1.scala b/test/files/pos/t9111-inliner-workaround/Test_1.scala
new file mode 100644
index 0000000..1a00fff
--- /dev/null
+++ b/test/files/pos/t9111-inliner-workaround/Test_1.scala
@@ -0,0 +1,10 @@
+object Test extends App {
+  println(new A_1.Inner())
+
+  // Accessing foo or Deeper triggers the error of SI-9111.
+  // However, when not referring to those definitions, compilation should
+  // succeed, also if the inliner is enabled.
+
+  // println(i.foo(null))
+  // new i.Deeper()
+}
diff --git a/test/files/pos/t9181.flags b/test/files/pos/t9181.flags
new file mode 100644
index 0000000..0f96f1f
--- /dev/null
+++ b/test/files/pos/t9181.flags
@@ -0,0 +1 @@
+-nowarn
\ No newline at end of file
diff --git a/test/files/pos/t9181.scala b/test/files/pos/t9181.scala
new file mode 100644
index 0000000..2edf6fe
--- /dev/null
+++ b/test/files/pos/t9181.scala
@@ -0,0 +1,806 @@
+sealed trait C
+case object C1 extends C
+case object C2 extends C
+case object C3 extends C
+case object C4 extends C
+case object C5 extends C
+case object C6 extends C
+case object C7 extends C
+case object C8 extends C
+case object C9 extends C
+case object C10 extends C
+case object C11 extends C
+case object C12 extends C
+case object C13 extends C
+case object C14 extends C
+case object C15 extends C
+case object C16 extends C
+case object C17 extends C
+case object C18 extends C
+case object C19 extends C
+case object C20 extends C
+case object C21 extends C
+case object C22 extends C
+case object C23 extends C
+case object C24 extends C
+case object C25 extends C
+case object C26 extends C
+case object C27 extends C
+case object C28 extends C
+case object C29 extends C
+case object C30 extends C
+case object C31 extends C
+case object C32 extends C
+case object C33 extends C
+case object C34 extends C
+case object C35 extends C
+case object C36 extends C
+case object C37 extends C
+case object C38 extends C
+case object C39 extends C
+case object C40 extends C
+case object C41 extends C
+case object C42 extends C
+case object C43 extends C
+case object C44 extends C
+case object C45 extends C
+case object C46 extends C
+case object C47 extends C
+case object C48 extends C
+case object C49 extends C
+case object C50 extends C
+case object C51 extends C
+case object C52 extends C
+case object C53 extends C
+case object C54 extends C
+case object C55 extends C
+case object C56 extends C
+case object C57 extends C
+case object C58 extends C
+case object C59 extends C
+case object C60 extends C
+case object C61 extends C
+case object C62 extends C
+case object C63 extends C
+case object C64 extends C
+case object C65 extends C
+case object C66 extends C
+case object C67 extends C
+case object C68 extends C
+case object C69 extends C
+case object C70 extends C
+case object C71 extends C
+case object C72 extends C
+case object C73 extends C
+case object C74 extends C
+case object C75 extends C
+case object C76 extends C
+case object C77 extends C
+case object C78 extends C
+case object C79 extends C
+case object C80 extends C
+case object C81 extends C
+case object C82 extends C
+case object C83 extends C
+case object C84 extends C
+case object C85 extends C
+case object C86 extends C
+case object C87 extends C
+case object C88 extends C
+case object C89 extends C
+case object C90 extends C
+case object C91 extends C
+case object C92 extends C
+case object C93 extends C
+case object C94 extends C
+case object C95 extends C
+case object C96 extends C
+case object C97 extends C
+case object C98 extends C
+case object C99 extends C
+case object C100 extends C
+case object C101 extends C
+case object C102 extends C
+case object C103 extends C
+case object C104 extends C
+case object C105 extends C
+case object C106 extends C
+case object C107 extends C
+case object C108 extends C
+case object C109 extends C
+case object C110 extends C
+case object C111 extends C
+case object C112 extends C
+case object C113 extends C
+case object C114 extends C
+case object C115 extends C
+case object C116 extends C
+case object C117 extends C
+case object C118 extends C
+case object C119 extends C
+case object C120 extends C
+case object C121 extends C
+case object C122 extends C
+case object C123 extends C
+case object C124 extends C
+case object C125 extends C
+case object C126 extends C
+case object C127 extends C
+case object C128 extends C
+case object C129 extends C
+case object C130 extends C
+case object C131 extends C
+case object C132 extends C
+case object C133 extends C
+case object C134 extends C
+case object C135 extends C
+case object C136 extends C
+case object C137 extends C
+case object C138 extends C
+case object C139 extends C
+case object C140 extends C
+case object C141 extends C
+case object C142 extends C
+case object C143 extends C
+case object C144 extends C
+case object C145 extends C
+case object C146 extends C
+case object C147 extends C
+case object C148 extends C
+case object C149 extends C
+case object C150 extends C
+case object C151 extends C
+case object C152 extends C
+case object C153 extends C
+case object C154 extends C
+case object C155 extends C
+case object C156 extends C
+case object C157 extends C
+case object C158 extends C
+case object C159 extends C
+case object C160 extends C
+case object C161 extends C
+case object C162 extends C
+case object C163 extends C
+case object C164 extends C
+case object C165 extends C
+case object C166 extends C
+case object C167 extends C
+case object C168 extends C
+case object C169 extends C
+case object C170 extends C
+case object C171 extends C
+case object C172 extends C
+case object C173 extends C
+case object C174 extends C
+case object C175 extends C
+case object C176 extends C
+case object C177 extends C
+case object C178 extends C
+case object C179 extends C
+case object C180 extends C
+case object C181 extends C
+case object C182 extends C
+case object C183 extends C
+case object C184 extends C
+case object C185 extends C
+case object C186 extends C
+case object C187 extends C
+case object C188 extends C
+case object C189 extends C
+case object C190 extends C
+case object C191 extends C
+case object C192 extends C
+case object C193 extends C
+case object C194 extends C
+case object C195 extends C
+case object C196 extends C
+case object C197 extends C
+case object C198 extends C
+case object C199 extends C
+case object C200 extends C
+case object C201 extends C
+case object C202 extends C
+case object C203 extends C
+case object C204 extends C
+case object C205 extends C
+case object C206 extends C
+case object C207 extends C
+case object C208 extends C
+case object C209 extends C
+case object C210 extends C
+case object C211 extends C
+case object C212 extends C
+case object C213 extends C
+case object C214 extends C
+case object C215 extends C
+case object C216 extends C
+case object C217 extends C
+case object C218 extends C
+case object C219 extends C
+case object C220 extends C
+case object C221 extends C
+case object C222 extends C
+case object C223 extends C
+case object C224 extends C
+case object C225 extends C
+case object C226 extends C
+case object C227 extends C
+case object C228 extends C
+case object C229 extends C
+case object C230 extends C
+case object C231 extends C
+case object C232 extends C
+case object C233 extends C
+case object C234 extends C
+case object C235 extends C
+case object C236 extends C
+case object C237 extends C
+case object C238 extends C
+case object C239 extends C
+case object C240 extends C
+case object C241 extends C
+case object C242 extends C
+case object C243 extends C
+case object C244 extends C
+case object C245 extends C
+case object C246 extends C
+case object C247 extends C
+case object C248 extends C
+case object C249 extends C
+case object C250 extends C
+case object C251 extends C
+case object C252 extends C
+case object C253 extends C
+case object C254 extends C
+case object C255 extends C
+case object C256 extends C
+case object C257 extends C
+case object C258 extends C
+case object C259 extends C
+case object C260 extends C
+case object C261 extends C
+case object C262 extends C
+case object C263 extends C
+case object C264 extends C
+case object C265 extends C
+case object C266 extends C
+case object C267 extends C
+case object C268 extends C
+case object C269 extends C
+case object C270 extends C
+case object C271 extends C
+case object C272 extends C
+case object C273 extends C
+case object C274 extends C
+case object C275 extends C
+case object C276 extends C
+case object C277 extends C
+case object C278 extends C
+case object C279 extends C
+case object C280 extends C
+case object C281 extends C
+case object C282 extends C
+case object C283 extends C
+case object C284 extends C
+case object C285 extends C
+case object C286 extends C
+case object C287 extends C
+case object C288 extends C
+case object C289 extends C
+case object C290 extends C
+case object C291 extends C
+case object C292 extends C
+case object C293 extends C
+case object C294 extends C
+case object C295 extends C
+case object C296 extends C
+case object C297 extends C
+case object C298 extends C
+case object C299 extends C
+case object C300 extends C
+case object C301 extends C
+case object C302 extends C
+case object C303 extends C
+case object C304 extends C
+case object C305 extends C
+case object C306 extends C
+case object C307 extends C
+case object C308 extends C
+case object C309 extends C
+case object C310 extends C
+case object C311 extends C
+case object C312 extends C
+case object C313 extends C
+case object C314 extends C
+case object C315 extends C
+case object C316 extends C
+case object C317 extends C
+case object C318 extends C
+case object C319 extends C
+case object C320 extends C
+case object C321 extends C
+case object C322 extends C
+case object C323 extends C
+case object C324 extends C
+case object C325 extends C
+case object C326 extends C
+case object C327 extends C
+case object C328 extends C
+case object C329 extends C
+case object C330 extends C
+case object C331 extends C
+case object C332 extends C
+case object C333 extends C
+case object C334 extends C
+case object C335 extends C
+case object C336 extends C
+case object C337 extends C
+case object C338 extends C
+case object C339 extends C
+case object C340 extends C
+case object C341 extends C
+case object C342 extends C
+case object C343 extends C
+case object C344 extends C
+case object C345 extends C
+case object C346 extends C
+case object C347 extends C
+case object C348 extends C
+case object C349 extends C
+case object C350 extends C
+case object C351 extends C
+case object C352 extends C
+case object C353 extends C
+case object C354 extends C
+case object C355 extends C
+case object C356 extends C
+case object C357 extends C
+case object C358 extends C
+case object C359 extends C
+case object C360 extends C
+case object C361 extends C
+case object C362 extends C
+case object C363 extends C
+case object C364 extends C
+case object C365 extends C
+case object C366 extends C
+case object C367 extends C
+case object C368 extends C
+case object C369 extends C
+case object C370 extends C
+case object C371 extends C
+case object C372 extends C
+case object C373 extends C
+case object C374 extends C
+case object C375 extends C
+case object C376 extends C
+case object C377 extends C
+case object C378 extends C
+case object C379 extends C
+case object C380 extends C
+case object C381 extends C
+case object C382 extends C
+case object C383 extends C
+case object C384 extends C
+case object C385 extends C
+case object C386 extends C
+case object C387 extends C
+case object C388 extends C
+case object C389 extends C
+case object C390 extends C
+case object C391 extends C
+case object C392 extends C
+case object C393 extends C
+case object C394 extends C
+case object C395 extends C
+case object C396 extends C
+case object C397 extends C
+case object C398 extends C
+case object C399 extends C
+case object C400 extends C
+
+object M {
+  def f(c: C): Int = c match {
+    case C1 => 1
+    case C2 => 2
+    case C3 => 3
+    case C4 => 4
+    case C5 => 5
+    case C6 => 6
+    case C7 => 7
+    case C8 => 8
+    case C9 => 9
+    case C10 => 10
+    case C11 => 11
+    case C12 => 12
+    case C13 => 13
+    case C14 => 14
+    case C15 => 15
+    case C16 => 16
+    case C17 => 17
+    case C18 => 18
+    case C19 => 19
+    case C20 => 20
+    case C21 => 21
+    case C22 => 22
+    case C23 => 23
+    case C24 => 24
+    case C25 => 25
+    case C26 => 26
+    case C27 => 27
+    case C28 => 28
+    case C29 => 29
+    case C30 => 30
+    case C31 => 31
+    case C32 => 32
+    case C33 => 33
+    case C34 => 34
+    case C35 => 35
+    case C36 => 36
+    case C37 => 37
+    case C38 => 38
+    case C39 => 39
+    case C40 => 40
+    case C41 => 41
+    case C42 => 42
+    case C43 => 43
+    case C44 => 44
+    case C45 => 45
+    case C46 => 46
+    case C47 => 47
+    case C48 => 48
+    case C49 => 49
+    case C50 => 50
+    case C51 => 51
+    case C52 => 52
+    case C53 => 53
+    case C54 => 54
+    case C55 => 55
+    case C56 => 56
+    case C57 => 57
+    case C58 => 58
+    case C59 => 59
+    case C60 => 60
+    case C61 => 61
+    case C62 => 62
+    case C63 => 63
+    case C64 => 64
+    case C65 => 65
+    case C66 => 66
+    case C67 => 67
+    case C68 => 68
+    case C69 => 69
+    case C70 => 70
+    case C71 => 71
+    case C72 => 72
+    case C73 => 73
+    case C74 => 74
+    case C75 => 75
+    case C76 => 76
+    case C77 => 77
+    case C78 => 78
+    case C79 => 79
+    case C80 => 80
+    case C81 => 81
+    case C82 => 82
+    case C83 => 83
+    case C84 => 84
+    case C85 => 85
+    case C86 => 86
+    case C87 => 87
+    case C88 => 88
+    case C89 => 89
+    case C90 => 90
+    case C91 => 91
+    case C92 => 92
+    case C93 => 93
+    case C94 => 94
+    case C95 => 95
+    case C96 => 96
+    case C97 => 97
+    case C98 => 98
+    case C99 => 99
+    case C100 => 100
+    case C101 => 101
+    case C102 => 102
+    case C103 => 103
+    case C104 => 104
+    case C105 => 105
+    case C106 => 106
+    case C107 => 107
+    case C108 => 108
+    case C109 => 109
+    case C110 => 110
+    case C111 => 111
+    case C112 => 112
+    case C113 => 113
+    case C114 => 114
+    case C115 => 115
+    case C116 => 116
+    case C117 => 117
+    case C118 => 118
+    case C119 => 119
+    case C120 => 120
+    case C121 => 121
+    case C122 => 122
+    case C123 => 123
+    case C124 => 124
+    case C125 => 125
+    case C126 => 126
+    case C127 => 127
+    case C128 => 128
+    case C129 => 129
+    case C130 => 130
+    case C131 => 131
+    case C132 => 132
+    case C133 => 133
+    case C134 => 134
+    case C135 => 135
+    case C136 => 136
+    case C137 => 137
+    case C138 => 138
+    case C139 => 139
+    case C140 => 140
+    case C141 => 141
+    case C142 => 142
+    case C143 => 143
+    case C144 => 144
+    case C145 => 145
+    case C146 => 146
+    case C147 => 147
+    case C148 => 148
+    case C149 => 149
+    case C150 => 150
+    case C151 => 151
+    case C152 => 152
+    case C153 => 153
+    case C154 => 154
+    case C155 => 155
+    case C156 => 156
+    case C157 => 157
+    case C158 => 158
+    case C159 => 159
+    case C160 => 160
+    case C161 => 161
+    case C162 => 162
+    case C163 => 163
+    case C164 => 164
+    case C165 => 165
+    case C166 => 166
+    case C167 => 167
+    case C168 => 168
+    case C169 => 169
+    case C170 => 170
+    case C171 => 171
+    case C172 => 172
+    case C173 => 173
+    case C174 => 174
+    case C175 => 175
+    case C176 => 176
+    case C177 => 177
+    case C178 => 178
+    case C179 => 179
+    case C180 => 180
+    case C181 => 181
+    case C182 => 182
+    case C183 => 183
+    case C184 => 184
+    case C185 => 185
+    case C186 => 186
+    case C187 => 187
+    case C188 => 188
+    case C189 => 189
+    case C190 => 190
+    case C191 => 191
+    case C192 => 192
+    case C193 => 193
+    case C194 => 194
+    case C195 => 195
+    case C196 => 196
+    case C197 => 197
+    case C198 => 198
+    case C199 => 199
+    case C200 => 200
+    case C201 => 201
+    case C202 => 202
+    case C203 => 203
+    case C204 => 204
+    case C205 => 205
+    case C206 => 206
+    case C207 => 207
+    case C208 => 208
+    case C209 => 209
+    case C210 => 210
+    case C211 => 211
+    case C212 => 212
+    case C213 => 213
+    case C214 => 214
+    case C215 => 215
+    case C216 => 216
+    case C217 => 217
+    case C218 => 218
+    case C219 => 219
+    case C220 => 220
+    case C221 => 221
+    case C222 => 222
+    case C223 => 223
+    case C224 => 224
+    case C225 => 225
+    case C226 => 226
+    case C227 => 227
+    case C228 => 228
+    case C229 => 229
+    case C230 => 230
+    case C231 => 231
+    case C232 => 232
+    case C233 => 233
+    case C234 => 234
+    case C235 => 235
+    case C236 => 236
+    case C237 => 237
+    case C238 => 238
+    case C239 => 239
+    case C240 => 240
+    case C241 => 241
+    case C242 => 242
+    case C243 => 243
+    case C244 => 244
+    case C245 => 245
+    case C246 => 246
+    case C247 => 247
+    case C248 => 248
+    case C249 => 249
+    case C250 => 250
+    case C251 => 251
+    case C252 => 252
+    case C253 => 253
+    case C254 => 254
+    case C255 => 255
+    case C256 => 256
+    case C257 => 257
+    case C258 => 258
+    case C259 => 259
+    case C260 => 260
+    case C261 => 261
+    case C262 => 262
+    case C263 => 263
+    case C264 => 264
+    case C265 => 265
+    case C266 => 266
+    case C267 => 267
+    case C268 => 268
+    case C269 => 269
+    case C270 => 270
+    case C271 => 271
+    case C272 => 272
+    case C273 => 273
+    case C274 => 274
+    case C275 => 275
+    case C276 => 276
+    case C277 => 277
+    case C278 => 278
+    case C279 => 279
+    case C280 => 280
+    case C281 => 281
+    case C282 => 282
+    case C283 => 283
+    case C284 => 284
+    case C285 => 285
+    case C286 => 286
+    case C287 => 287
+    case C288 => 288
+    case C289 => 289
+    case C290 => 290
+    case C291 => 291
+    case C292 => 292
+    case C293 => 293
+    case C294 => 294
+    case C295 => 295
+    case C296 => 296
+    case C297 => 297
+    case C298 => 298
+    case C299 => 299
+    case C300 => 300
+    case C301 => 301
+    case C302 => 302
+    case C303 => 303
+    case C304 => 304
+    case C305 => 305
+    case C306 => 306
+    case C307 => 307
+    case C308 => 308
+    case C309 => 309
+    case C310 => 310
+    case C311 => 311
+    case C312 => 312
+    case C313 => 313
+    case C314 => 314
+    case C315 => 315
+    case C316 => 316
+    case C317 => 317
+    case C318 => 318
+    case C319 => 319
+    case C320 => 320
+    case C321 => 321
+    case C322 => 322
+    case C323 => 323
+    case C324 => 324
+    case C325 => 325
+    case C326 => 326
+    case C327 => 327
+    case C328 => 328
+    case C329 => 329
+    case C330 => 330
+    case C331 => 331
+    case C332 => 332
+    case C333 => 333
+    case C334 => 334
+    case C335 => 335
+    case C336 => 336
+    case C337 => 337
+    case C338 => 338
+    case C339 => 339
+    case C340 => 340
+    case C341 => 341
+    case C342 => 342
+    case C343 => 343
+    case C344 => 344
+    case C345 => 345
+    case C346 => 346
+    case C347 => 347
+    case C348 => 348
+    case C349 => 349
+    case C350 => 350
+    case C351 => 351
+    case C352 => 352
+    case C353 => 353
+    case C354 => 354
+    case C355 => 355
+    case C356 => 356
+    case C357 => 357
+    case C358 => 358
+    case C359 => 359
+    case C360 => 360
+    case C361 => 361
+    case C362 => 362
+    case C363 => 363
+    case C364 => 364
+    case C365 => 365
+    case C366 => 366
+    case C367 => 367
+    case C368 => 368
+    case C369 => 369
+    case C370 => 370
+    case C371 => 371
+    case C372 => 372
+    case C373 => 373
+    case C374 => 374
+    case C375 => 375
+    case C376 => 376
+    case C377 => 377
+    case C378 => 378
+    case C379 => 379
+    case C380 => 380
+    case C381 => 381
+    case C382 => 382
+    case C383 => 383
+    case C384 => 384
+    case C385 => 385
+    case C386 => 386
+    case C387 => 387
+    case C388 => 388
+    case C389 => 389
+    case C390 => 390
+    case C391 => 391
+    case C392 => 392
+    case C393 => 393
+    case C394 => 394
+    case C395 => 395
+    case C396 => 396
+    case C397 => 397
+    case C398 => 398
+    case C399 => 399
+    case C400 => 400
+  }
+}
diff --git a/test/files/pos/t9239/Declaration.scala b/test/files/pos/t9239/Declaration.scala
new file mode 100644
index 0000000..452dcc1
--- /dev/null
+++ b/test/files/pos/t9239/Declaration.scala
@@ -0,0 +1,3 @@
+class Foo[A]
+trait Bar[A] extends Foo[A]
+class Baz[A] extends Bar[A]
diff --git a/test/files/pos/t9239/Usage.java b/test/files/pos/t9239/Usage.java
new file mode 100644
index 0000000..d1e3fb0
--- /dev/null
+++ b/test/files/pos/t9239/Usage.java
@@ -0,0 +1,15 @@
+/**
+ * Used to fail with:
+ *
+ * Usage.java:5: error: incompatible types: Baz<String> cannot be converted to Foo<String>
+ * 	  foo(f);
+ *            ^
+ */
+public class Usage {
+  public Usage() {
+	  Baz<String> f = null;
+	  foo(f);
+  }
+
+  public void foo(Foo<String> f) { };
+}
diff --git a/test/files/pos/t9285.flags b/test/files/pos/t9285.flags
new file mode 100644
index 0000000..85d8eb2
--- /dev/null
+++ b/test/files/pos/t9285.flags
@@ -0,0 +1 @@
+-Xfatal-warnings
diff --git a/test/files/pos/t9285.scala b/test/files/pos/t9285.scala
new file mode 100644
index 0000000..b7146cd
--- /dev/null
+++ b/test/files/pos/t9285.scala
@@ -0,0 +1 @@
+case class C(placeholder: Unit)
diff --git a/test/files/pos/t9321.scala b/test/files/pos/t9321.scala
new file mode 100644
index 0000000..ed3a816
--- /dev/null
+++ b/test/files/pos/t9321.scala
@@ -0,0 +1,10 @@
+object p {
+  trait A {
+    private[p] val qualifiedPrivateMember = 1
+  }
+ 
+  def useQualifiedPrivate(b: Mix) =
+    b.qualifiedPrivateMember // allowed
+}
+ 
+trait Mix extends p.A
diff --git a/test/files/pos/t9356/Foo_2.scala b/test/files/pos/t9356/Foo_2.scala
new file mode 100644
index 0000000..ab7bb44
--- /dev/null
+++ b/test/files/pos/t9356/Foo_2.scala
@@ -0,0 +1,6 @@
+class C
+
+trait Foo {
+  @annot.MyAnnotation(cls = classOf[C])
+  def function: Any = ???
+}
diff --git a/test/files/pos/t9356/MyAnnotation.java b/test/files/pos/t9356/MyAnnotation.java
new file mode 100644
index 0000000..b6c00e7
--- /dev/null
+++ b/test/files/pos/t9356/MyAnnotation.java
@@ -0,0 +1,12 @@
+package annot;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+ at Target(ElementType.METHOD)
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface MyAnnotation {
+    Class<?> cls();
+}
diff --git a/test/files/pos/t9356/Test_3.scala b/test/files/pos/t9356/Test_3.scala
new file mode 100644
index 0000000..fa1b76c
--- /dev/null
+++ b/test/files/pos/t9356/Test_3.scala
@@ -0,0 +1,3 @@
+class Foo1 extends Foo
+
+class Foo2 extends Foo
\ No newline at end of file
diff --git a/src/intellij/test/files/neg/virtpatmat_exhaust_big.flags b/test/files/pos/t9369.flags
similarity index 100%
rename from src/intellij/test/files/neg/virtpatmat_exhaust_big.flags
rename to test/files/pos/t9369.flags
diff --git a/test/files/pos/t9369.scala b/test/files/pos/t9369.scala
new file mode 100644
index 0000000..94be2ea
--- /dev/null
+++ b/test/files/pos/t9369.scala
@@ -0,0 +1,24 @@
+object Test {
+
+  trait Tree
+
+  sealed abstract class Prop
+
+  trait Simple extends Prop
+
+  case class Atom(tree: Tree) extends Prop with Simple
+
+  case class Not(prop: Prop) extends Prop with Simple
+
+  def simplify1(prop: Prop): Prop = prop match {
+    case Atom(tree) => ???
+    case Not(prop)  => ???
+    case _          => ???
+  }
+
+  def simplify2(prop: Prop): Prop = prop match {
+    case Not(Atom(tree)) => ???
+    case Not(Not(prop))  => ???
+    case _               => ???
+  }
+}
\ No newline at end of file
diff --git a/test/files/pos/t9370/ThePlugin.scala b/test/files/pos/t9370/ThePlugin.scala
new file mode 100644
index 0000000..cd80078
--- /dev/null
+++ b/test/files/pos/t9370/ThePlugin.scala
@@ -0,0 +1,31 @@
+package scala.test.plugins
+
+import scala.tools.nsc
+import nsc.Global
+import nsc.Phase
+import nsc.plugins.Plugin
+import nsc.plugins.PluginComponent
+
+class ThePlugin(val global: Global) extends Plugin {
+  import global._
+
+  val name = "timebomb"
+  val description = "Explodes if run. Maybe I haven't implemented it yet."
+  val components = List[PluginComponent](thePhase1)
+
+  private object thePhase1 extends PluginComponent {
+    val global = ThePlugin.this.global
+
+    val runsAfter = List[String]("parser")
+    override val runsBefore = List[String]("namer")
+    val phaseName = ThePlugin.this.name
+
+    def newPhase(prev: Phase) = new ThePhase(prev)
+  }
+
+  private class ThePhase(prev: Phase) extends Phase(prev) {
+    override def name = ThePlugin.this.name
+    override def run  = ???
+  }
+}
+
diff --git a/test/files/pos/t9370/sample_2.flags b/test/files/pos/t9370/sample_2.flags
new file mode 100644
index 0000000..dd7eb55
--- /dev/null
+++ b/test/files/pos/t9370/sample_2.flags
@@ -0,0 +1 @@
+-Xplugin:/tmp -Xplugin:. -Xplugin-require:timebomb -Ystop-after:parser
diff --git a/test/files/pos/t9370/sample_2.scala b/test/files/pos/t9370/sample_2.scala
new file mode 100644
index 0000000..7eb11b8
--- /dev/null
+++ b/test/files/pos/t9370/sample_2.scala
@@ -0,0 +1,6 @@
+
+package sample
+
+// just a sample that is compiled with the explosive plugin disabled
+object Sample extends App {
+}
diff --git a/test/files/pos/t9370/scalac-plugin.xml b/test/files/pos/t9370/scalac-plugin.xml
new file mode 100644
index 0000000..2558d6f
--- /dev/null
+++ b/test/files/pos/t9370/scalac-plugin.xml
@@ -0,0 +1,5 @@
+<plugin>
+  <name>ignored</name>
+  <classname>scala.test.plugins.ThePlugin</classname>
+</plugin>
+
diff --git a/test/files/pos/t9392/client_2.scala b/test/files/pos/t9392/client_2.scala
new file mode 100644
index 0000000..6b706fe
--- /dev/null
+++ b/test/files/pos/t9392/client_2.scala
@@ -0,0 +1,4 @@
+class Client {
+  Macro()
+}
+
diff --git a/test/files/pos/t9392/macro_1.scala b/test/files/pos/t9392/macro_1.scala
new file mode 100644
index 0000000..3f67ac1
--- /dev/null
+++ b/test/files/pos/t9392/macro_1.scala
@@ -0,0 +1,16 @@
+import language.experimental.macros
+
+
+object Macro {
+
+  import reflect.macros.blackbox.Context
+  def impl(c: Context)(): c.Tree = {
+    import c.universe._
+    val tree = q"""class C; new C"""
+    val tree1 = c.typecheck(tree)
+    val tpe = tree1.tpe
+    val tree2 = c.typecheck(c.untypecheck(tree1))
+    q"""$tree2.asInstanceOf[$tpe]"""
+  }
+  def apply(): Any = macro impl
+}
diff --git a/test/files/pos/t9393/NamedImpl_1.java b/test/files/pos/t9393/NamedImpl_1.java
new file mode 100644
index 0000000..02ec9b4
--- /dev/null
+++ b/test/files/pos/t9393/NamedImpl_1.java
@@ -0,0 +1,15 @@
+/*
+ * Copyright (C) 2009-2015 Typesafe Inc. <http://www.typesafe.com>
+ */
+package bug;
+
+import bug.Named_1;
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+
+public class NamedImpl_1 implements Named_1 {
+
+    public Class<? extends Annotation> annotationType() {
+        return null;
+    }
+}
diff --git a/test/files/pos/t9393/NamedImpl_2.java b/test/files/pos/t9393/NamedImpl_2.java
new file mode 100644
index 0000000..c87e940
--- /dev/null
+++ b/test/files/pos/t9393/NamedImpl_2.java
@@ -0,0 +1,15 @@
+/*
+ * Copyright (C) 2009-2015 Typesafe Inc. <http://www.typesafe.com>
+ */
+package bug;
+
+import bug.Named_2;
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+
+public class NamedImpl_2 implements Named_2 {
+
+    public Class<? extends Annotation> annotationType() {
+        return null;
+    }
+}
diff --git a/test/files/pos/t9393/Named_1.java b/test/files/pos/t9393/Named_1.java
new file mode 100644
index 0000000..30a6c98
--- /dev/null
+++ b/test/files/pos/t9393/Named_1.java
@@ -0,0 +1,3 @@
+package bug;
+
+public @interface Named_1 {}
diff --git a/test/files/pos/t9393/Named_2.java b/test/files/pos/t9393/Named_2.java
new file mode 100644
index 0000000..3210fb6
--- /dev/null
+++ b/test/files/pos/t9393/Named_2.java
@@ -0,0 +1,3 @@
+package bug;
+
+public @interface Named_2 {}
diff --git a/test/files/pos/t9393/test_2.scala b/test/files/pos/t9393/test_2.scala
new file mode 100644
index 0000000..8ea3461
--- /dev/null
+++ b/test/files/pos/t9393/test_2.scala
@@ -0,0 +1,4 @@
+class C {
+  new bug.NamedImpl_1 // separate compilation, testing the classfile parser
+  new bug.NamedImpl_2 // mixed compilation, testing the java source parser
+}
diff --git a/test/files/pos/t9442.scala b/test/files/pos/t9442.scala
new file mode 100644
index 0000000..2ea81e7
--- /dev/null
+++ b/test/files/pos/t9442.scala
@@ -0,0 +1,14 @@
+trait Ctx {
+  trait Tree
+}
+trait Lst[+A] {
+  def zip[A1 >: A, B](that: Lst[B]): Nothing
+}
+class C[@specialized(Int) T] {
+  def moo(t: T) = {
+    def foo1(c: Ctx)(l: Lst[c.Tree]) = l zip l
+    def foo2(c: Ctx)(l: Lst[c.Tree]*) = l(0) zip l(1)
+    def foo3(c: Ctx)(l: => Lst[c.Tree]) = l zip l
+    ???
+  }
+}
diff --git a/test/files/pos/t9475.scala b/test/files/pos/t9475.scala
new file mode 100644
index 0000000..ce9c250
--- /dev/null
+++ b/test/files/pos/t9475.scala
@@ -0,0 +1,19 @@
+trait Ctx {
+  trait Tree
+}
+
+trait Lst[+A] {
+  def zip[A1 >: A, B](that: Lst[B]): Nothing
+}
+
+object Test {
+
+  // both of these methods should be transformed by uncurry
+  // such that List[c.Tree] becomes List[Ctx#Tree]:
+  def foo1(c: Ctx)(l: Lst[c.Tree]) = l zip l
+  def foo2[@specialized T](c: Ctx)(l: Lst[c.Tree], t: T) = l zip l
+
+  // if this doesn't happen for the 2nd method, the specialization
+  // transformation fails
+}
+
diff --git a/test/files/pos/virtpatmat_exhaust_big.scala b/test/files/pos/virtpatmat_exhaust_big.scala
new file mode 100644
index 0000000..9850933
--- /dev/null
+++ b/test/files/pos/virtpatmat_exhaust_big.scala
@@ -0,0 +1,33 @@
+sealed abstract class Z
+object Z {
+   object     Z0    extends Z
+   case class Z1()  extends Z
+   object     Z2    extends Z
+   case class Z3()  extends Z
+   object     Z4    extends Z
+   case class Z5()  extends Z
+   object     Z6    extends Z
+   case class Z7()  extends Z
+   object     Z8    extends Z
+   case class Z9()  extends Z
+   object     Z10   extends Z
+   case class Z11() extends Z
+   object     Z12   extends Z
+   case class Z13() extends Z
+   object     Z14   extends Z
+   case class Z15() extends Z
+   object     Z16   extends Z
+   case class Z17() extends Z
+   object     Z18   extends Z
+   case class Z19() extends Z
+}
+
+// drop any case and it will report an error
+object Test {
+  import Z._
+  def foo(z: Z) = z match {
+    case Z0  | Z1()  | Z2  | Z3()  | Z4  | Z5()  | Z6  | Z7()  | Z8  | Z9() |
+         Z10 | Z11() | Z12 | Z13() | Z14 | Z15() | Z16 | Z17() | Z18 | Z19()
+         =>
+  }
+}
\ No newline at end of file
diff --git a/test/files/presentation/callcc-interpreter.check b/test/files/presentation/callcc-interpreter.check
index 4bf68b3..94a3d64 100644
--- a/test/files/presentation/callcc-interpreter.check
+++ b/test/files/presentation/callcc-interpreter.check
@@ -3,7 +3,7 @@ reload: CallccInterpreter.scala
 askTypeCompletion at CallccInterpreter.scala(51,34)
 ================================================================================
 [response] askTypeCompletion at (51,34)
-retrieved 57 members
+retrieved 66 members
 abstract trait Term extends AnyRef
 abstract trait Value extends AnyRef
 case class Add extends callccInterpreter.Term with Product with Serializable
@@ -50,6 +50,15 @@ final def synchronized[T0](x$1: T0): T0
 final def wait(): Unit
 final def wait(x$1: Long): Unit
 final def wait(x$1: Long,x$2: Int): Unit
+object Add
+object App
+object Ccc
+object Con
+object Fun
+object Lam
+object M
+object Num
+object Var
 private[this] val term0: callccInterpreter.App
 private[this] val term1: callccInterpreter.App
 private[this] val term2: callccInterpreter.Add
diff --git a/test/files/presentation/doc/doc.scala b/test/files/presentation/doc/doc.scala
old mode 100755
new mode 100644
index f2233f1..ce43191
--- a/test/files/presentation/doc/doc.scala
+++ b/test/files/presentation/doc/doc.scala
@@ -118,6 +118,12 @@ object Test extends InteractiveTest {
       }
     }
 
+    // The remainder of this test has been found to fail intermittently on Windows
+    // only.  The problem is difficult to isolate and reproduce; see
+    // https://github.com/scala/scala-dev/issues/72 for details.
+    // So if we're on Windows, let's just bail out here.
+    if (scala.util.Properties.isWin) return
+
     // Check inter-classes documentation one-time retrieved ok.
     val baseSource = findSource("Base.scala")
     val derivedSource = findSource("Derived.scala")
diff --git a/test/files/presentation/doc/src/Class.scala b/test/files/presentation/doc/src/Class.scala
old mode 100755
new mode 100644
diff --git a/test/files/presentation/doc/src/p/Base.scala b/test/files/presentation/doc/src/p/Base.scala
old mode 100755
new mode 100644
diff --git a/test/files/presentation/doc/src/p/Derived.scala b/test/files/presentation/doc/src/p/Derived.scala
old mode 100755
new mode 100644
diff --git a/test/files/presentation/t8941b/IdempotencyTest.scala b/test/files/presentation/t8941b/IdempotencyTest.scala
index af01b36..ffbbc0d 100644
--- a/test/files/presentation/t8941b/IdempotencyTest.scala
+++ b/test/files/presentation/t8941b/IdempotencyTest.scala
@@ -6,9 +6,9 @@ import reporters.{Reporter => CompilerReporter}
 import scala.tools.nsc.interactive.InteractiveReporter
 import scala.reflect.internal.util.SourceFile
 
-/** Determistically interrupts typechecking of `code` when a defintion named
-  * `MagicInterruptionMarker` is typechecked, and then performs a targetted
-  * typecheck of the tree at the specal comment marker marker
+/** Deterministically interrupts typechecking of `code` when a definition named
+  * `MagicInterruptionMarker` is typechecked, and then performs a targeted
+  * typecheck of the tree at the special comment marker marker
   */  
 abstract class IdempotencyTest { self =>
   private val settings = new Settings
diff --git a/test/files/res/t9170.check b/test/files/res/t9170.check
new file mode 100644
index 0000000..6d40b6b
--- /dev/null
+++ b/test/files/res/t9170.check
@@ -0,0 +1,7 @@
+
+nsc> t9170/A.scala:3: error: double definition:
+def f[A](a: => A): Int at line 2 and
+def f[A](a: => Either[Exception,A]): Int at line 3
+have same type after erasure: (a: Function0)Int
+  def f[A](a: => Either[Exception, A]) = 2
+      ^
diff --git a/test/files/res/t9170.res b/test/files/res/t9170.res
new file mode 100644
index 0000000..c2aec2f
--- /dev/null
+++ b/test/files/res/t9170.res
@@ -0,0 +1,2 @@
+t9170/A.scala
+t9170/A.scala
diff --git a/test/files/res/t9170/A.scala b/test/files/res/t9170/A.scala
new file mode 100644
index 0000000..239df89
--- /dev/null
+++ b/test/files/res/t9170/A.scala
@@ -0,0 +1,4 @@
+object Y {
+  def f[A](a: =>  A) = 1
+  def f[A](a: => Either[Exception, A]) = 2
+}
diff --git a/test/files/run/ReplacementMatching.scala b/test/files/run/ReplacementMatching.scala
index 05040d9..81034aa 100644
--- a/test/files/run/ReplacementMatching.scala
+++ b/test/files/run/ReplacementMatching.scala
@@ -32,12 +32,12 @@ object Test {
 
   def groupsMatching {
     val Date = """(\d+)/(\d+)/(\d+)""".r
-    for (Regex.Groups(a, b, c) <- Date findFirstMatchIn "1/1/2001 marks the start of the millenium. 31/12/2000 doesn't.") {
+    for (Regex.Groups(a, b, c) <- Date findFirstMatchIn "1/1/2001 marks the start of the millennium. 31/12/2000 doesn't.") {
       assert(a == "1")
       assert(b == "1")
       assert(c == "2001")
     }
-    for (Regex.Groups(a, b, c) <- (Date findAllIn "1/1/2001 marks the start of the millenium. 31/12/2000 doesn't.").matchData) {
+    for (Regex.Groups(a, b, c) <- (Date findAllIn "1/1/2001 marks the start of the millennium. 31/12/2000 doesn't.").matchData) {
       assert(a == "1" || a == "31")
       assert(b == "1" || b == "12")
       assert(c == "2001" || c == "2000")
diff --git a/test/files/run/bcodeInlinerMixed.flags b/test/files/run/bcodeInlinerMixed.flags
new file mode 100644
index 0000000..63b5558
--- /dev/null
+++ b/test/files/run/bcodeInlinerMixed.flags
@@ -0,0 +1 @@
+-Ybackend:GenBCode -Yopt:l:classpath
\ No newline at end of file
diff --git a/test/files/run/bcodeInlinerMixed/A_1.java b/test/files/run/bcodeInlinerMixed/A_1.java
new file mode 100644
index 0000000..44d7d88
--- /dev/null
+++ b/test/files/run/bcodeInlinerMixed/A_1.java
@@ -0,0 +1,3 @@
+public class A_1 {
+  public static final int bar() { return 100; }
+}
diff --git a/test/files/run/bcodeInlinerMixed/B_1.scala b/test/files/run/bcodeInlinerMixed/B_1.scala
new file mode 100644
index 0000000..2aadecc
--- /dev/null
+++ b/test/files/run/bcodeInlinerMixed/B_1.scala
@@ -0,0 +1,20 @@
+// Partest does proper mixed compilation:
+//   1. scalac *.scala *.java
+//   2. javac *.java
+//   3. scalc *.scala
+//
+// In the second scalc round, the classfile for A_1 is on the classpath.
+// Therefore the inliner has access to the bytecode of `bar`, which means
+// it can verify that the invocation to `bar` can be safely inlined.
+//
+// So both callsites of `flop` are inlined.
+//
+// In a single mixed compilation, `flop` cannot be inlined, see JUnit InlinerTest.scala, def mixedCompilationNoInline.
+
+class B {
+  @inline final def flop = A_1.bar
+  def g = flop
+}
+class C {
+  def h(b: B) = b.flop
+}
diff --git a/test/files/run/bcodeInlinerMixed/Test.scala b/test/files/run/bcodeInlinerMixed/Test.scala
new file mode 100644
index 0000000..c8c7a9f
--- /dev/null
+++ b/test/files/run/bcodeInlinerMixed/Test.scala
@@ -0,0 +1,16 @@
+import scala.tools.partest.{BytecodeTest, ASMConverters}
+import ASMConverters._
+
+object Test extends BytecodeTest {
+  def show: Unit = {
+    val gIns = instructionsFromMethod(getMethod(loadClassNode("B"), "g"))
+    val hIns = instructionsFromMethod(getMethod(loadClassNode("C"), "h"))
+    // val invocation = Invoke(INVOKESTATIC, A_1, bar, ()I, false)
+    for (i <- List(gIns, hIns)) {
+      assert(i exists {
+        case Invoke(_, _, "bar", "()I", _) => true
+        case _ => false
+      }, i mkString "\n")
+    }
+  }
+}
diff --git a/test/files/run/blame_eye_triple_eee-double.check b/test/files/run/blame_eye_triple_eee-double.check
index 5e46d91..53eac99 100644
--- a/test/files/run/blame_eye_triple_eee-double.check
+++ b/test/files/run/blame_eye_triple_eee-double.check
@@ -6,4 +6,4 @@ if (x != x) is good
 if (NaN != x) is good
 x matching was good
 NaN matching was good
-loop with NaN was goood
+loop with NaN was good
diff --git a/test/files/run/blame_eye_triple_eee-double.scala b/test/files/run/blame_eye_triple_eee-double.scala
index 1640aea..4dcbfe7 100644
--- a/test/files/run/blame_eye_triple_eee-double.scala
+++ b/test/files/run/blame_eye_triple_eee-double.scala
@@ -56,6 +56,6 @@ object Test extends App {
     else z = NaN
     i += 1
   }
-  if (z.isNaN && i == 10) println("loop with NaN was goood")
+  if (z.isNaN && i == 10) println("loop with NaN was good")
   else println("loop with NaN was broken")
 }
diff --git a/test/files/run/blame_eye_triple_eee-float.check b/test/files/run/blame_eye_triple_eee-float.check
index 5e46d91..53eac99 100644
--- a/test/files/run/blame_eye_triple_eee-float.check
+++ b/test/files/run/blame_eye_triple_eee-float.check
@@ -6,4 +6,4 @@ if (x != x) is good
 if (NaN != x) is good
 x matching was good
 NaN matching was good
-loop with NaN was goood
+loop with NaN was good
diff --git a/test/files/run/blame_eye_triple_eee-float.scala b/test/files/run/blame_eye_triple_eee-float.scala
index 4deb9f3..bcc6b19 100644
--- a/test/files/run/blame_eye_triple_eee-float.scala
+++ b/test/files/run/blame_eye_triple_eee-float.scala
@@ -56,6 +56,6 @@ object Test extends App {
     else z = NaN
     i += 1
   }
-  if (z.isNaN && i == 10) println("loop with NaN was goood")
+  if (z.isNaN && i == 10) println("loop with NaN was good")
   else println("loop with NaN was broken")
 }
diff --git a/test/files/run/class-symbol-contravariant.check b/test/files/run/class-symbol-contravariant.check
index cbb90b5..5166fce 100644
--- a/test/files/run/class-symbol-contravariant.check
+++ b/test/files/run/class-symbol-contravariant.check
@@ -1,12 +1,8 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> :power
-** Power User mode enabled - BEEP WHIR GYVE **
-** :phase has been set to 'typer'.          **
-** scala.tools.nsc._ has been imported      **
-** global._, definitions._ also imported    **
-** Try  :help, :vals, power.<tab>           **
+Power mode enabled. :phase is at typer.
+import scala.tools.nsc._, intp.global._, definitions._
+Try :help or completions for vals._ and power._
 
 scala> val u = rootMirror.universe
 u: $r.intp.global.type = <global>
diff --git a/test/files/run/classfile-format-51.scala b/test/files/run/classfile-format-51.scala
index 24b1ee8..81df2f0 100644
--- a/test/files/run/classfile-format-51.scala
+++ b/test/files/run/classfile-format-51.scala
@@ -12,9 +12,9 @@ import Opcodes._
 // it runs a normal compile on the source in the 'code' field that refers to
 // DynamicInvoker. Any failure will be dumped to std out.
 //
-// By it's nature the test can only work on JDK 7+ because under JDK 6 some of the
+// By its nature the test can only work on JDK 7+ because under JDK 6 some of the
 // classes referred to by DynamicInvoker won't be available and DynamicInvoker won't
-// verify. So the test includes a version check that short-circuites the whole test
+// verify. So the test includes a version check that short-circuits the whole test
 // on JDK 6
 object Test extends DirectTest {
   override def extraSettings: String = "-optimise -usejavacp -d " + testOutput.path + " -cp " + testOutput.path
diff --git a/test/files/run/classfile-format-52.scala b/test/files/run/classfile-format-52.scala
index e12c841..453f61a 100644
--- a/test/files/run/classfile-format-52.scala
+++ b/test/files/run/classfile-format-52.scala
@@ -11,7 +11,7 @@ import Opcodes._
 // HasDefaultMethod. Then it runs a normal compile on Scala source that extends that
 // interface. Any failure will be dumped to std out.
 //
-// By it's nature the test can only work on JDK 8+ because under JDK 7- the
+// By its nature the test can only work on JDK 8+ because under JDK 7- the
 // interface won't verify.
 object Test extends DirectTest {
   override def extraSettings: String = "-optimise -usejavacp -d " + testOutput.path + " -cp " + testOutput.path
diff --git a/test/files/run/colltest1.scala b/test/files/run/colltest1.scala
index e0ec378..de8780a 100644
--- a/test/files/run/colltest1.scala
+++ b/test/files/run/colltest1.scala
@@ -1,5 +1,5 @@
 /*
- * filter: inliner warnings; re-run with -Yinline-warnings for details
+ * filter: inliner warnings; re-run with
  */
 import scala.collection._
 import scala.language.postfixOps
diff --git a/test/files/run/compiler-asSeenFrom.scala b/test/files/run/compiler-asSeenFrom.scala
index 677dd40..a60c2e8 100644
--- a/test/files/run/compiler-asSeenFrom.scala
+++ b/test/files/run/compiler-asSeenFrom.scala
@@ -1,5 +1,5 @@
 /*
- * filter: inliner warning; re-run with -Yinline-warnings for details
+ * filter: inliner warning; re-run with
  */
 import scala.tools.nsc._
 import scala.tools.partest.DirectTest
diff --git a/test/files/run/complicatedmatch.scala b/test/files/run/complicatedmatch.scala
index 681029a..1676a41 100644
--- a/test/files/run/complicatedmatch.scala
+++ b/test/files/run/complicatedmatch.scala
@@ -7,7 +7,7 @@ object Even{
 }
 
 object Test extends App{
-  val LongWord = "supercalifragilisticexpialadocious";
+  val LongWord = "supercalifragilisticexpialidocious";
 
   def foo(x : Int, y : String) : Int = (x, y) match {
     case (Even(i), "bar") => 1
diff --git a/test/files/run/constant-type.check b/test/files/run/constant-type.check
index a7ba5a4..9df1353 100644
--- a/test/files/run/constant-type.check
+++ b/test/files/run/constant-type.check
@@ -1,12 +1,8 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> :power
-** Power User mode enabled - BEEP WHIR GYVE **
-** :phase has been set to 'typer'.          **
-** scala.tools.nsc._ has been imported      **
-** global._, definitions._ also imported    **
-** Try  :help, :vals, power.<tab>           **
+Power mode enabled. :phase is at typer.
+import scala.tools.nsc._, intp.global._, definitions._
+Try :help or completions for vals._ and power._
 
 scala> val s = transformedType(StringClass.toType).asInstanceOf[Type]
 s: $r.intp.global.Type = String
diff --git a/test/files/run/constrained-types.check b/test/files/run/constrained-types.check
index 89a08d5..5444cf2 100644
--- a/test/files/run/constrained-types.check
+++ b/test/files/run/constrained-types.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> class Annot(obj: Any) extends annotation.Annotation with annotation.TypeConstraint
 defined class Annot
@@ -135,16 +133,16 @@ y: String = hello
 scala> 
 
 scala> val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message
-<console>:8: error: not found: value e
+<console>:12: error: not found: value e
        val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message
                               ^
-<console>:8: error: not found: value f
+<console>:12: error: not found: value f
        val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message
                                 ^
-<console>:8: error: not found: value g
+<console>:12: error: not found: value g
        val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message
                                   ^
-<console>:8: error: not found: value h
+<console>:12: error: not found: value h
        val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message
                                     ^
 
diff --git a/test/files/run/dead-code-elimination.scala b/test/files/run/dead-code-elimination.scala
index fd3f2a9..2291b22 100644
--- a/test/files/run/dead-code-elimination.scala
+++ b/test/files/run/dead-code-elimination.scala
@@ -10,7 +10,7 @@
 // the stack after code elimination.
 //
 // Originally, this did not compile, but I included it in the run
-// tests because this was ASM-dependand and did not happen for GenJVM.
+// tests because this was ASM-dependent and did not happen for GenJVM.
 //
 // Thus, we run the code and force the loading of class B -- if the
 // bytecode is incorrect, it will fail the test.
diff --git a/test/files/run/deeps.scala b/test/files/run/deeps.scala
index 6049cc6..1546112 100644
--- a/test/files/run/deeps.scala
+++ b/test/files/run/deeps.scala
@@ -3,7 +3,7 @@
 //############################################################################
 
 //############################################################################
-// need to revisit array equqality
+// need to revisit array equality
 object Test {
 
   def testEquals1 {
diff --git a/test/files/run/delambdafy-specialized.check b/test/files/run/delambdafy-specialized.check
new file mode 100644
index 0000000..c6903b9
--- /dev/null
+++ b/test/files/run/delambdafy-specialized.check
@@ -0,0 +1 @@
+scala.runtime.AbstractFunction1$mcII$sp
diff --git a/test/files/run/delambdafy-specialized.flags b/test/files/run/delambdafy-specialized.flags
new file mode 100644
index 0000000..48b438d
--- /dev/null
+++ b/test/files/run/delambdafy-specialized.flags
@@ -0,0 +1 @@
+-Ydelambdafy:method
diff --git a/test/files/run/delambdafy-specialized.scala b/test/files/run/delambdafy-specialized.scala
new file mode 100644
index 0000000..634d4e4
--- /dev/null
+++ b/test/files/run/delambdafy-specialized.scala
@@ -0,0 +1,6 @@
+object Test {
+  def main(args: Array[String]): Unit = {
+    val f = (x: Int) => -x
+    println(f.getClass.getSuperclass.getName)
+  }
+}
diff --git a/test/files/run/delambdafy_t6028.check b/test/files/run/delambdafy_t6028.check
index 7bd8cd7..419e704 100644
--- a/test/files/run/delambdafy_t6028.check
+++ b/test/files/run/delambdafy_t6028.check
@@ -1,35 +1,35 @@
 [[syntax trees at end of                lambdalift]] // newSource1.scala
 package <empty> {
   class T extends Object {
-    <paramaccessor> private[this] val classParam: Int = _;
-    def <init>(classParam: Int): T = {
+    <paramaccessor> private[this] val classParam: String = _;
+    def <init>(classParam: String): T = {
       T.super.<init>();
       ()
     };
-    private[this] val field: Int = 0;
-    <stable> <accessor> def field(): Int = T.this.field;
-    def foo(methodParam: Int): Function0 = {
-      val methodLocal: Int = 0;
+    private[this] val field: String = "";
+    <stable> <accessor> def field(): String = T.this.field;
+    def foo(methodParam: String): Function0 = {
+      val methodLocal: String = "";
       {
         (() => T.this.$anonfun$1(methodParam, methodLocal)).$asInstanceOf[Function0]()
       }
     };
-    def bar(barParam: Int): Object = {
+    def bar(barParam: String): Object = {
       @volatile var MethodLocalObject$module: runtime.VolatileObjectRef = scala.runtime.VolatileObjectRef.zero();
       T.this.MethodLocalObject$1(barParam, MethodLocalObject$module)
     };
-    def tryy(tryyParam: Int): Function0 = {
-      var tryyLocal: runtime.IntRef = scala.runtime.IntRef.create(0);
+    def tryy(tryyParam: String): Function0 = {
+      var tryyLocal: runtime.ObjectRef = scala.runtime.ObjectRef.create("");
       {
-        (() => T.this.$anonfun$2(tryyParam, tryyLocal)).$asInstanceOf[Function0]()
+        (new <$anon: Function0>(T.this, tryyParam, tryyLocal): Function0)
       }
     };
-    final <artifact> private[this] def $anonfun$1(methodParam$1: Int, methodLocal$1: Int): Int = T.this.classParam.+(T.this.field()).+(methodParam$1).+(methodLocal$1);
+    final <artifact> private[this] def $anonfun$1(methodParam$1: String, methodLocal$1: String): String = T.this.classParam.+(T.this.field()).+(methodParam$1).+(methodLocal$1);
     abstract trait MethodLocalTrait$1 extends Object {
       <synthetic> <stable> <artifact> def $outer(): T
     };
     object MethodLocalObject$2 extends Object with T#MethodLocalTrait$1 {
-      def <init>($outer: T, barParam$1: Int): T#MethodLocalObject$2.type = {
+      def <init>($outer: T, barParam$1: String): T#MethodLocalObject$2.type = {
         MethodLocalObject$2.super.<init>();
         MethodLocalObject$2.this.$asInstanceOf[T#MethodLocalTrait$1$class]()./*MethodLocalTrait$1$class*/$init$(barParam$1);
         ()
@@ -38,19 +38,34 @@ package <empty> {
       <synthetic> <stable> <artifact> def $outer(): T = MethodLocalObject$2.this.$outer;
       <synthetic> <stable> <artifact> def $outer(): T = MethodLocalObject$2.this.$outer
     };
-    final <stable> private[this] def MethodLocalObject$1(barParam$1: Int, MethodLocalObject$module$1: runtime.VolatileObjectRef): T#MethodLocalObject$2.type = {
+    final <stable> private[this] def MethodLocalObject$1(barParam$1: String, MethodLocalObject$module$1: runtime.VolatileObjectRef): T#MethodLocalObject$2.type = {
       MethodLocalObject$module$1.elem = new T#MethodLocalObject$2.type(T.this, barParam$1);
       MethodLocalObject$module$1.elem.$asInstanceOf[T#MethodLocalObject$2.type]()
     };
     abstract trait MethodLocalTrait$1$class extends Object with T#MethodLocalTrait$1 {
-      def /*MethodLocalTrait$1$class*/$init$(barParam$1: Int): Unit = {
+      def /*MethodLocalTrait$1$class*/$init$(barParam$1: String): Unit = {
         ()
       };
-      scala.this.Predef.print(scala.Int.box(barParam$1))
+      scala.this.Predef.print(barParam$1)
     };
-    final <artifact> private[this] def $anonfun$2(tryyParam$1: Int, tryyLocal$1: runtime.IntRef): Unit = try {
-      tryyLocal$1.elem = tryyParam$1
-    } finally ()
+    @SerialVersionUID(value = 0) final <synthetic> class $anonfun$tryy$1 extends scala.runtime.AbstractFunction0$mcV$sp with Serializable {
+      def <init>($outer: T, tryyParam$1: String, tryyLocal$1: runtime.ObjectRef): <$anon: Function0> = {
+        $anonfun$tryy$1.super.<init>();
+        ()
+      };
+      final def apply(): Unit = $anonfun$tryy$1.this.apply$mcV$sp();
+      <specialized> def apply$mcV$sp(): Unit = try {
+        $anonfun$tryy$1.this.tryyLocal$1.elem = $anonfun$tryy$1.this.tryyParam$1
+      } finally ();
+      <synthetic> <paramaccessor> <artifact> private[this] val $outer: T = _;
+      <synthetic> <stable> <artifact> def $outer(): T = $anonfun$tryy$1.this.$outer;
+      final <bridge> <artifact> def apply(): Object = {
+        $anonfun$tryy$1.this.apply();
+        scala.runtime.BoxedUnit.UNIT
+      };
+      <synthetic> <paramaccessor> private[this] val tryyParam$1: String = _;
+      <synthetic> <paramaccessor> private[this] val tryyLocal$1: runtime.ObjectRef = _
+    }
   }
 }
 
diff --git a/test/files/run/delambdafy_t6028.scala b/test/files/run/delambdafy_t6028.scala
index 0b7ef48..ca39195 100644
--- a/test/files/run/delambdafy_t6028.scala
+++ b/test/files/run/delambdafy_t6028.scala
@@ -5,11 +5,11 @@ object Test extends DirectTest {
 
   override def extraSettings: String = "-usejavacp -Ydelambdafy:method -Xprint:lambdalift -d " + testOutput.path
 
-  override def code = """class T(classParam: Int) {
-                        |  val field: Int = 0
-                        |  def foo(methodParam: Int) = {val methodLocal = 0 ; () => classParam + field + methodParam + methodLocal }
-                        |  def bar(barParam: Int) = { trait MethodLocalTrait { print(barParam) }; object MethodLocalObject extends MethodLocalTrait; MethodLocalObject }
-                        |  def tryy(tryyParam: Int) = { var tryyLocal = 0; () => try { tryyLocal = tryyParam } finally () }
+  override def code = """class T(classParam: String) {
+                        |  val field: String = ""
+                        |  def foo(methodParam: String) = {val methodLocal = "" ; () => classParam + field + methodParam + methodLocal }
+                        |  def bar(barParam: String) = { trait MethodLocalTrait { print(barParam) }; object MethodLocalObject extends MethodLocalTrait; MethodLocalObject }
+                        |  def tryy(tryyParam: String) = { var tryyLocal = ""; () => try { tryyLocal = tryyParam } finally () }
                         |}
                         |""".stripMargin.trim
 
diff --git a/test/files/run/delambdafy_t6555.check b/test/files/run/delambdafy_t6555.check
index 6b174c0..b6ccebd 100644
--- a/test/files/run/delambdafy_t6555.check
+++ b/test/files/run/delambdafy_t6555.check
@@ -5,11 +5,11 @@ package <empty> {
       Foo.super.<init>();
       ()
     };
-    private[this] val f: Int => Int = {
-      final <artifact> def $anonfun(param: Int): Int = param;
-      ((param: Int) => $anonfun(param))
+    private[this] val f: String => String = {
+      final <artifact> def $anonfun(param: String): String = param;
+      ((param: String) => $anonfun(param))
     };
-    <stable> <accessor> def f(): Int => Int = Foo.this.f
+    <stable> <accessor> def f(): String => String = Foo.this.f
   }
 }
 
diff --git a/test/files/run/delambdafy_t6555.scala b/test/files/run/delambdafy_t6555.scala
index a1dcfe7..8d4976e 100644
--- a/test/files/run/delambdafy_t6555.scala
+++ b/test/files/run/delambdafy_t6555.scala
@@ -5,7 +5,7 @@ object Test extends DirectTest {
 
   override def extraSettings: String = "-usejavacp -Xprint:specialize -Ydelambdafy:method -d " + testOutput.path
 
-  override def code = "class Foo { val f = (param: Int) => param } "
+  override def code = "class Foo { val f = (param: String) => param } "
 
   override def show(): Unit = {
     Console.withErr(System.out) {
diff --git a/test/files/run/delambdafy_uncurry_byname_method.check b/test/files/run/delambdafy_uncurry_byname_method.check
index cd3edc7..e0f281b 100644
--- a/test/files/run/delambdafy_uncurry_byname_method.check
+++ b/test/files/run/delambdafy_uncurry_byname_method.check
@@ -5,9 +5,9 @@ package <empty> {
       Foo.super.<init>();
       ()
     };
-    def bar(x: () => Int): Int = x.apply();
-    def foo(): Int = Foo.this.bar({
-      final <artifact> def $anonfun(): Int = 1;
+    def bar(x: () => String): String = x.apply();
+    def foo(): String = Foo.this.bar({
+      final <artifact> def $anonfun(): String = "";
       (() => $anonfun())
     })
   }
diff --git a/test/files/run/delambdafy_uncurry_byname_method.scala b/test/files/run/delambdafy_uncurry_byname_method.scala
index 1adeec8..0ccc1f2 100644
--- a/test/files/run/delambdafy_uncurry_byname_method.scala
+++ b/test/files/run/delambdafy_uncurry_byname_method.scala
@@ -6,9 +6,9 @@ object Test extends DirectTest {
   override def extraSettings: String = "-usejavacp -Xprint:uncurry -Ydelambdafy:method -Ystop-after:uncurry -d " + testOutput.path
 
   override def code = """class Foo {
-                        |  def bar(x: => Int) = x
+                        |  def bar(x: => String) = x
                         |  
-                        |  def foo = bar(1)
+                        |  def foo = bar("")
                         |}
                         |""".stripMargin.trim
 
diff --git a/test/files/run/disable-assertions.flags b/test/files/run/disable-assertions.flags
new file mode 100644
index 0000000..afaa521
--- /dev/null
+++ b/test/files/run/disable-assertions.flags
@@ -0,0 +1 @@
+-Xdisable-assertions
diff --git a/test/files/run/disable-assertions.scala b/test/files/run/disable-assertions.scala
new file mode 100644
index 0000000..7ec4cfb
--- /dev/null
+++ b/test/files/run/disable-assertions.scala
@@ -0,0 +1,14 @@
+
+object Elided {
+  import annotation._, elidable._
+  @elidable(INFO) def info(): Boolean = true
+  @elidable(10000) def f(): Boolean = true
+  def g(): Boolean = { assert(false); true }
+}
+
+object Test extends App {
+  import Elided._
+  if (info()) println("Bad info.")
+  if (!f()) println("Elided f.")
+  if (!g()) println("Elided g?")   // assert should be off
+}
diff --git a/test/files/run/existentials-in-compiler.scala b/test/files/run/existentials-in-compiler.scala
index dfc7048..e516edd 100644
--- a/test/files/run/existentials-in-compiler.scala
+++ b/test/files/run/existentials-in-compiler.scala
@@ -1,5 +1,5 @@
 /*
- * filter: inliner warnings; re-run with -Yinline-warnings for details
+ * filter: inliner warnings; re-run with
  */
 import scala.tools.nsc._
 import scala.tools.partest.CompilerTest
diff --git a/test/files/run/finally.check b/test/files/run/finally.check
index 901a797..b0f2293 100644
--- a/test/files/run/finally.check
+++ b/test/files/run/finally.check
@@ -29,7 +29,7 @@ body
 in finally
 java.lang.Exception
 ----------------------------------------
-Running nestedFinalies
+Running nestedFinallyBlocks
 in finally 1
 in finally 2
 ----------------------------------------
diff --git a/test/files/run/finally.scala b/test/files/run/finally.scala
index 2c01eda..467c9e5 100644
--- a/test/files/run/finally.scala
+++ b/test/files/run/finally.scala
@@ -93,8 +93,8 @@ object Test extends App {
     }
   }
 
-  // nested finallies with return value
-  def nestedFinalies: Int =
+  // nested finally blocks with return value
+  def nestedFinallyBlocks: Int =
     try {
       try {
         return 10
@@ -123,5 +123,5 @@ object Test extends App {
   test(throwBody, "throwBody")
   test(retFinally, "retFinally")
   test(throwFinally, "throwFinally")
-  test(nestedFinalies, "nestedFinalies")
+  test(nestedFinallyBlocks, "nestedFinallyBlocks")
 }
diff --git a/test/files/run/function-null-unbox.scala b/test/files/run/function-null-unbox.scala
new file mode 100644
index 0000000..6c0369f
--- /dev/null
+++ b/test/files/run/function-null-unbox.scala
@@ -0,0 +1,8 @@
+object Test {
+  def main(args: Array[String]): Unit = {
+     val i2s = (x: Int) => ""
+     assert(i2s.asInstanceOf[AnyRef => String].apply(null) == "")
+     val i2i = (x: Int) => x + 1
+     assert(i2i.asInstanceOf[AnyRef => Int].apply(null) == 1)
+   }
+}
diff --git a/test/files/run/idempotency-case-classes.check b/test/files/run/idempotency-case-classes.check
index 5a8d0ad..ea698ce 100644
--- a/test/files/run/idempotency-case-classes.check
+++ b/test/files/run/idempotency-case-classes.check
@@ -47,8 +47,7 @@ C(2,3)
     case <synthetic> def unapply(x$0: C): Option[(Int, Int)] = if (x$0.==(null))
       scala.this.None
     else
-      Some.apply[(Int, Int)](scala.Tuple2.apply[Int, Int](x$0.x, x$0.y));
-    <synthetic> private def readResolve(): Object = C
+      Some.apply[(Int, Int)](scala.Tuple2.apply[Int, Int](x$0.x, x$0.y))
   };
   Predef.println(C.apply(2, 3))
 }
diff --git a/test/files/run/indylambda-boxing/VC.scala b/test/files/run/indylambda-boxing/VC.scala
new file mode 100644
index 0000000..ef867a3
--- /dev/null
+++ b/test/files/run/indylambda-boxing/VC.scala
@@ -0,0 +1,2 @@
+
+class VC(private val i: Int) extends AnyVal
diff --git a/test/files/run/indylambda-boxing/test.scala b/test/files/run/indylambda-boxing/test.scala
new file mode 100644
index 0000000..cc0a460
--- /dev/null
+++ b/test/files/run/indylambda-boxing/test.scala
@@ -0,0 +1,29 @@
+class Capture
+class Test {
+  def test1 = (i: Int) => ""
+  def test2 = (i: VC) => i
+  def test3 = (i: Int) => i
+
+  def test4 = {val c = new Capture; (i: Int) => {(c, Test.this.toString); 42} }
+  def test5 = {val c = new Capture; (i: VC) => (c, Test.this.toString) }
+  def test6 = {val c = new Capture; (i: Int) => (c, Test.this.toString) }
+
+  def test7 = {val vc = new Capture; (i: Int) => vc }
+  def test8 = {val c = 42; (s: String) => (s, c)}
+  def test9 = {val c = 42; (s: String) => ()}
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    val t = new Test
+    assert(t.test1.apply(42) == "")
+    assert(t.test2.apply(new VC(42)) == new VC(42))
+    assert(t.test3.apply(-1) == -1)
+    t.test4.apply(0)
+    t.test5.apply(new VC(42))
+    t.test6.apply(42)
+    t.test7.apply(0)
+    t.test8.apply("")
+    t.test9.apply("")
+  }
+}
diff --git a/test/files/run/iq.scala b/test/files/run/iq.scala
index 1eb1d40..0ccf67a 100644
--- a/test/files/run/iq.scala
+++ b/test/files/run/iq.scala
@@ -69,7 +69,7 @@ object iq {
     val (_, q7) = q6.dequeue
     //val q8 = q7 + 10 + 11  //deprecated
     val q8 = q7.enqueue(10).enqueue(11)
-    /* Test dequeu
+    /* Test dequeue
      * Expected: q8: Queue(2,3,4,5,6,7,8,9,10,11)
      */
     Console.println("q8: " + q8)
diff --git a/test/files/run/is-valid-num.scala b/test/files/run/is-valid-num.scala
index 4ab2fac..156121c 100644
--- a/test/files/run/is-valid-num.scala
+++ b/test/files/run/is-valid-num.scala
@@ -1,5 +1,5 @@
 /*
- * filter: inliner warnings; re-run with -Yinline-warnings for details
+ * filter: inliner warnings; re-run with
  */
 object Test {
   def x = BigInt("10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
diff --git a/test/files/run/iterator-from.scala b/test/files/run/iterator-from.scala
index e2ca586..e7ba1ae 100644
--- a/test/files/run/iterator-from.scala
+++ b/test/files/run/iterator-from.scala
@@ -1,5 +1,5 @@
 /* This file tests iteratorFrom, keysIteratorFrom, and valueIteratorFrom on various sorted sets and maps
- * filter: inliner warnings; re-run with -Yinline-warnings for details
+ * filter: inliner warnings; re-run with
  */
 
 import scala.util.{Random => R}
diff --git a/test/files/run/kind-repl-command.check b/test/files/run/kind-repl-command.check
index 586b271..560529b 100644
--- a/test/files/run/kind-repl-command.check
+++ b/test/files/run/kind-repl-command.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> :kind scala.Option
 scala.Option's kind is F[+A]
@@ -21,8 +19,8 @@ scala> :k new { def empty = false }
 AnyRef{def empty: Boolean}'s kind is A
 
 scala> :k Nonexisting
-<console>:8: error: not found: value Nonexisting
-              Nonexisting
-              ^
+<console>:12: error: not found: value Nonexisting
+       Nonexisting
+       ^
 
 scala> :quit
diff --git a/test/files/run/kmpSliceSearch.flags b/test/files/run/kmpSliceSearch.flags
new file mode 100644
index 0000000..ac96850
--- /dev/null
+++ b/test/files/run/kmpSliceSearch.flags
@@ -0,0 +1 @@
+-Ydelambdafy:inline
\ No newline at end of file
diff --git a/test/files/run/lambda-serialization-gc.scala b/test/files/run/lambda-serialization-gc.scala
new file mode 100644
index 0000000..8fa0b4b
--- /dev/null
+++ b/test/files/run/lambda-serialization-gc.scala
@@ -0,0 +1,40 @@
+import java.io._
+
+import java.net.URLClassLoader
+
+class C {
+  def serializeDeserialize[T <: AnyRef](obj: T) = {
+    val buffer = new ByteArrayOutputStream
+    val out = new ObjectOutputStream(buffer)
+    out.writeObject(obj)
+    val in = new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray))
+    in.readObject.asInstanceOf[T]
+  }
+
+  serializeDeserialize((c: String) => c.length)
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    test()
+  }
+
+  def test(): Unit = {
+    val loader = getClass.getClassLoader.asInstanceOf[URLClassLoader]
+    val loaderCClass = classOf[C]
+    def deserializedInThrowawayClassloader = {
+      val throwawayLoader: java.net.URLClassLoader = new java.net.URLClassLoader(loader.getURLs, ClassLoader.getSystemClassLoader) {
+        val maxMemory = Runtime.getRuntime.maxMemory()
+        val junk = new Array[Byte]((maxMemory / 2).toInt)
+      }
+      val clazz = throwawayLoader.loadClass("C")
+      assert(clazz != loaderCClass)
+      clazz.newInstance()
+    }
+    (1 to 4) foreach { i =>
+      // This would OOM by the third iteration if we leaked `throwawayLoader` during
+      // deserialization.
+      deserializedInThrowawayClassloader
+    }
+  }
+}
diff --git a/test/files/run/lambda-serialization.scala b/test/files/run/lambda-serialization.scala
new file mode 100644
index 0000000..46b26d7
--- /dev/null
+++ b/test/files/run/lambda-serialization.scala
@@ -0,0 +1,35 @@
+import java.io.{ByteArrayInputStream, ObjectInputStream, ObjectOutputStream, ByteArrayOutputStream}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    roundTrip
+  }
+
+  def roundTrip(): Unit = {
+    val c = new Capture("Capture")
+    val lambda = (p: Param) => ("a", p, c)
+    val reconstituted1 = serializeDeserialize(lambda).asInstanceOf[Object => Any]
+    val p = new Param
+    assert(reconstituted1.apply(p) == ("a", p, c))
+    val reconstituted2 = serializeDeserialize(lambda).asInstanceOf[Object => Any]
+    assert(reconstituted1.getClass == reconstituted2.getClass)
+
+    val reconstituted3 = serializeDeserialize(reconstituted1)
+    assert(reconstituted3.apply(p) == ("a", p, c))
+
+    val specializedLambda = (p: Int) => List(p, c).length
+    assert(serializeDeserialize(specializedLambda).apply(42) == 2)
+    assert(serializeDeserialize(serializeDeserialize(specializedLambda)).apply(42) == 2)
+  }
+
+  def serializeDeserialize[T <: AnyRef](obj: T) = {
+    val buffer = new ByteArrayOutputStream
+    val out = new ObjectOutputStream(buffer)
+    out.writeObject(obj)
+    val in = new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray))
+    in.readObject.asInstanceOf[T]
+  }
+}
+
+case class Capture(s: String) extends Serializable
+class Param
diff --git a/test/files/run/list_map.scala b/test/files/run/list_map.scala
old mode 100755
new mode 100644
diff --git a/test/files/run/lub-visibility.check b/test/files/run/lub-visibility.check
index 7073496..757f0f5 100644
--- a/test/files/run/lub-visibility.check
+++ b/test/files/run/lub-visibility.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> // should infer List[scala.collection.immutable.Seq[Nothing]]
 
diff --git a/test/files/run/macro-bundle-repl.check b/test/files/run/macro-bundle-repl.check
index 75c5c2a..ce5c980 100644
--- a/test/files/run/macro-bundle-repl.check
+++ b/test/files/run/macro-bundle-repl.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.language.experimental.macros
 import scala.language.experimental.macros
diff --git a/test/files/run/macro-repl-basic.check b/test/files/run/macro-repl-basic.check
index fab03d1..7e1cb61 100644
--- a/test/files/run/macro-repl-basic.check
+++ b/test/files/run/macro-repl-basic.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import language.experimental.macros
 import language.experimental.macros
diff --git a/test/files/run/macro-repl-dontexpand.check b/test/files/run/macro-repl-dontexpand.check
index 6ecc924..a307ffb 100644
--- a/test/files/run/macro-repl-dontexpand.check
+++ b/test/files/run/macro-repl-dontexpand.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> def bar1(c: scala.reflect.macros.blackbox.Context) = ???
 bar1: (c: scala.reflect.macros.blackbox.Context)Nothing
diff --git a/test/files/run/macro-system-properties.check b/test/files/run/macro-system-properties.check
index e2e2bd3..e20a5bb 100644
--- a/test/files/run/macro-system-properties.check
+++ b/test/files/run/macro-system-properties.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.language.experimental._, scala.reflect.macros.blackbox.Context
 import scala.language.experimental._
diff --git a/test/files/run/mapConserve.scala b/test/files/run/mapConserve.scala
index f52af3b..c177542 100644
--- a/test/files/run/mapConserve.scala
+++ b/test/files/run/mapConserve.scala
@@ -1,5 +1,5 @@
 /*
- * filter: inliner warnings; re-run with -Yinline-warnings for details
+ * filter: inliner warnings; re-run with
  */
 import scala.annotation.tailrec
 import scala.collection.mutable.ListBuffer
diff --git a/test/files/run/names-defaults.scala b/test/files/run/names-defaults.scala
index b7ed490..4159dbd 100644
--- a/test/files/run/names-defaults.scala
+++ b/test/files/run/names-defaults.scala
@@ -86,7 +86,7 @@ object Test extends App {
     def f(a: Object) = "first"
     val f: String => String = a => "second"
   }
-  println(t5.f(new Sub1())) // firsst
+  println(t5.f(new Sub1())) // first
   println(t5.f("dfklj"))    // second
 
   object t6 {
@@ -192,7 +192,7 @@ object Test extends App {
   println(argName) // should be 4
   test5 { argName = 5 }
   println(argName) // should be 5
-  val a: Unit = test1(a = 10, b = "2") // local values a and b exist, but not ambiuous since they're val's
+  val a: Unit = test1(a = 10, b = "2") // local values a and b exist, but it's not ambiguous since they're vals
 
 
   // dependent types and copy method
@@ -239,7 +239,7 @@ object Test extends App {
   // result type of default getters: parameter type, except if this one mentions any type
   // parameter, in which case the result type is inferred. examples:
 
-  // result type of default getter is "String => String". if it were infered, the compiler
+  // result type of default getter is "String => String". if it were inferred, the compiler
   // would put "Nothing => Nothing", which is useless
   def transform(s: String, f: String => String = identity _) = f(s)
   println(transform("my text"))
diff --git a/test/files/run/nothingTypeNoFramesNoDce.scala b/test/files/run/nothingTypeNoFramesNoDce.scala
index 3d12983..7f63fae 100644
--- a/test/files/run/nothingTypeNoFramesNoDce.scala
+++ b/test/files/run/nothingTypeNoFramesNoDce.scala
@@ -26,7 +26,7 @@ class C {
   }
 
   def f5(x: Boolean) = {
-    // stack heights need to be the smae. ??? looks to the jvm like returning a value of
+    // stack heights need to be the same. ??? looks to the jvm like returning a value of
     // type Nothing$, need to drop or throw it.
     println(
       if (x) { ???; 10 }
diff --git a/test/files/run/nothingTypeNoOpt.scala b/test/files/run/nothingTypeNoOpt.scala
index 5c5a20f..454539a 100644
--- a/test/files/run/nothingTypeNoOpt.scala
+++ b/test/files/run/nothingTypeNoOpt.scala
@@ -26,7 +26,7 @@ class C {
   }
 
   def f5(x: Boolean) = {
-    // stack heights need to be the smae. ??? looks to the jvm like returning a value of
+    // stack heights need to be the same. ??? looks to the jvm like returning a value of
     // type Nothing$, need to drop or throw it.
     println(
       if (x) { ???; 10 }
diff --git a/test/files/run/nullable-lazyvals.scala b/test/files/run/nullable-lazyvals.scala
index c201e74..be5d82f 100644
--- a/test/files/run/nullable-lazyvals.scala
+++ b/test/files/run/nullable-lazyvals.scala
@@ -24,7 +24,7 @@ object Test extends App {
 
 	// test that try-finally does not generated a liftedTry
 	// helper. This would already fail the first part of the test,
-	// but this check will help diganose it (if the single access to a
+	// but this check will help diagnose it (if the single access to a
 	// private field does not happen directly in the lazy val, it won't
 	// be nulled).
 	for (f <- foo.getClass.getDeclaredMethods) {
diff --git a/test/files/run/pc-conversions.scala b/test/files/run/pc-conversions.scala
index 5fecac9..d4ae305 100644
--- a/test/files/run/pc-conversions.scala
+++ b/test/files/run/pc-conversions.scala
@@ -1,5 +1,5 @@
 /*
- * filter: inliner warning; re-run with -Yinline-warnings for details
+ * filter: inliner warning; re-run with
  */
 
 import collection._
diff --git a/test/files/run/private-inline.flags b/test/files/run/private-inline.flags
index 00d3643..c550fdc 100644
--- a/test/files/run/private-inline.flags
+++ b/test/files/run/private-inline.flags
@@ -1 +1 @@
--optimise -Yinline-warnings
+-optimise -Yinline-warnings -Ybackend:GenASM
diff --git a/test/files/run/range.scala b/test/files/run/range.scala
index 4637ab8..e50d0ac 100644
--- a/test/files/run/range.scala
+++ b/test/files/run/range.scala
@@ -36,16 +36,19 @@ object Test {
 
     def gr1 = NumericRange(x, x, x)
     def gr2 = NumericRange.inclusive(x, x, x)
-    def gr3 = NumericRange(x, x * fromInt(10), x)
-    def gr4 = NumericRange.inclusive(x, x * fromInt(10), x)
-    def gr5 = gr3.toList ::: negated.gr3.toList
+    def gr3 = NumericRange(x, x * fromInt(4), x * fromInt(2))  // SI-9348
+    def gr4 = NumericRange(x, x * fromInt(-2), x * fromInt(-2))
+    def gr5 = NumericRange(x, x * fromInt(10), x)
+    def gr6 = NumericRange.inclusive(x, x * fromInt(10), x)
+    def gr7 = gr3.toList ::: negated.gr3.toList
 
     def check = {
       assert(gr1.isEmpty && !gr2.isEmpty)
-      assert(gr3.size == 9 && gr4.size == 10)
-      assert(gr5.sum == num.zero, gr5.toString)
-      assert(!(gr3 contains (x * fromInt(10))))
-      assert((gr4 contains (x * fromInt(10))))
+      assert(gr3.size == 2 && gr4.size == 2)
+      assert(gr5.size == 9 && gr6.size == 10)
+      assert(gr7.sum == num.zero, gr7.toString)
+      assert(!(gr5 contains (x * fromInt(10))))
+      assert(gr6 contains (x * fromInt(10)))
     }
   }
 
@@ -55,6 +58,7 @@ object Test {
 
     val _grs = List[GR[_]](
       GR(BigDecimal(5.0)),
+      GR(BigDecimal(0.25)),  // SI-9348
       GR(BigInt(5)),
       GR(5L),
       GR(5.0d),
diff --git a/test/files/run/reflection-equality.check b/test/files/run/reflection-equality.check
index d60d861..09a0858 100644
--- a/test/files/run/reflection-equality.check
+++ b/test/files/run/reflection-equality.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> class X {
    def methodIntIntInt(x: Int, y: Int) = x+y
diff --git a/test/files/run/reflection-fieldmirror-ctorparam.check b/test/files/run/reflection-fieldmirror-ctorparam.check
index e391e7c..c66be94 100644
--- a/test/files/run/reflection-fieldmirror-ctorparam.check
+++ b/test/files/run/reflection-fieldmirror-ctorparam.check
@@ -1,3 +1,3 @@
-class scala.ScalaReflectionException: Scala field x isn't represented as a Java field, neither it has a Java accessor method
-note that private parameters of class constructors don't get mapped onto fields and/or accessors,
-unless they are used outside of their declaring constructors.
+class scala.ScalaReflectionException: Scala field x of class A isn't represented as a Java field, nor does it have a
+Java accessor method. One common reason for this is that it may be a private class parameter
+not used outside the primary constructor.
diff --git a/test/files/run/reflection-magicsymbols-repl.check b/test/files/run/reflection-magicsymbols-repl.check
index ca8857a..dd26c08 100644
--- a/test/files/run/reflection-magicsymbols-repl.check
+++ b/test/files/run/reflection-magicsymbols-repl.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.reflect.runtime.universe._
 import scala.reflect.runtime.universe._
diff --git a/test/files/run/reflection-repl-classes.check b/test/files/run/reflection-repl-classes.check
index 5ebf993..df889b9 100644
--- a/test/files/run/reflection-repl-classes.check
+++ b/test/files/run/reflection-repl-classes.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> class A
 defined class A
diff --git a/test/files/run/reflection-repl-elementary.check b/test/files/run/reflection-repl-elementary.check
index e948c9f..2a7f5d9 100644
--- a/test/files/run/reflection-repl-elementary.check
+++ b/test/files/run/reflection-repl-elementary.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> scala.reflect.runtime.universe.typeOf[List[Nothing]]
 res0: reflect.runtime.universe.Type = scala.List[Nothing]
diff --git a/test/files/run/reify-repl-fail-gracefully.check b/test/files/run/reify-repl-fail-gracefully.check
index c9e6974..32ed876 100644
--- a/test/files/run/reify-repl-fail-gracefully.check
+++ b/test/files/run/reify-repl-fail-gracefully.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import language.experimental.macros
 import language.experimental.macros
@@ -10,8 +8,8 @@ import scala.reflect.runtime.universe._
 scala> 
 
 scala> reify
-<console>:12: error: too few argument lists for macro invocation
-              reify
-              ^
+<console>:16: error: too few argument lists for macro invocation
+       reify
+       ^
 
 scala> :quit
diff --git a/test/files/run/reify_newimpl_22.check b/test/files/run/reify_newimpl_22.check
index 952f384..985f646 100644
--- a/test/files/run/reify_newimpl_22.check
+++ b/test/files/run/reify_newimpl_22.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.reflect.runtime.universe._
 import scala.reflect.runtime.universe._
@@ -17,9 +15,9 @@ scala> {
   }
   println(code.eval)
 }
-<console>:15: free term: Ident(TermName("x")) defined by res0  in <console>:14:21
-                val code = reify {
-                                 ^
+<console>:19: free term: Ident(TermName("x")) defined by res0  in <console>:18:14
+         val code = reify {
+                          ^
 2
 
 scala> :quit
diff --git a/test/files/run/reify_newimpl_23.check b/test/files/run/reify_newimpl_23.check
index b7e9bfd..f60113c 100644
--- a/test/files/run/reify_newimpl_23.check
+++ b/test/files/run/reify_newimpl_23.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.reflect.runtime.universe._
 import scala.reflect.runtime.universe._
@@ -16,7 +14,7 @@ scala> def foo[T]{
   }
   println(code.eval)
 }
-<console>:13: free type: Ident(TypeName("T")) defined by foo in <console>:12:16
+<console>:17: free type: Ident(TypeName("T")) defined by foo in <console>:16:16
          val code = reify {
                           ^
 foo: [T]=> Unit
diff --git a/test/files/run/reify_newimpl_25.check b/test/files/run/reify_newimpl_25.check
index 4f36ba1..9104d8d 100644
--- a/test/files/run/reify_newimpl_25.check
+++ b/test/files/run/reify_newimpl_25.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> {
   import scala.reflect.runtime.universe._
@@ -7,9 +5,9 @@ scala> {
   val tt = implicitly[TypeTag[x.type]]
   println(tt)
 }
-<console>:11: free term: Ident(TermName("x")) defined by res0  in <console>:10:21
-                val tt = implicitly[TypeTag[x.type]]
-                                   ^
+<console>:15: free term: Ident(TermName("x")) defined by res0  in <console>:14:14
+         val tt = implicitly[TypeTag[x.type]]
+                            ^
 TypeTag[x.type]
 
 scala> :quit
diff --git a/test/files/run/reify_newimpl_26.check b/test/files/run/reify_newimpl_26.check
index 681b862..cbb2185 100644
--- a/test/files/run/reify_newimpl_26.check
+++ b/test/files/run/reify_newimpl_26.check
@@ -1,12 +1,10 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> def foo[T]{
   import scala.reflect.runtime.universe._
   val tt = implicitly[WeakTypeTag[List[T]]]
   println(tt)
 }
-<console>:9: free type: Ident(TypeName("T")) defined by foo in <console>:7:16
+<console>:13: free type: Ident(TypeName("T")) defined by foo in <console>:11:16
          val tt = implicitly[WeakTypeTag[List[T]]]
                             ^
 foo: [T]=> Unit
diff --git a/test/files/run/reify_newimpl_35.check b/test/files/run/reify_newimpl_35.check
index bd9b3a2..4f9b43d 100644
--- a/test/files/run/reify_newimpl_35.check
+++ b/test/files/run/reify_newimpl_35.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.reflect.runtime.universe._
 import scala.reflect.runtime.universe._
diff --git a/test/files/run/reify_timeofday.scala b/test/files/run/reify_timeofday.scala
index efeb81d..4950ebf 100644
--- a/test/files/run/reify_timeofday.scala
+++ b/test/files/run/reify_timeofday.scala
@@ -6,7 +6,7 @@ object Test extends App {
     class DateError extends Exception
 
     /** Simulating properties in Scala
-     *  (example 4.2.1 in ScalaReference.pdf)
+     *  (example 4.2.1 in the Scala Language Specification)
      */
     class TimeOfDayVar {
       private var h, m, s: Int = 0
@@ -39,4 +39,4 @@ object Test extends App {
       case e: Exception => println("Exception")
     }
   }.eval
-}
\ No newline at end of file
+}
diff --git a/test/files/run/repl-assign.check b/test/files/run/repl-assign.check
index faa8a93..a9e0a22 100644
--- a/test/files/run/repl-assign.check
+++ b/test/files/run/repl-assign.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> var x = 10
 x: Int = 10
diff --git a/test/files/run/repl-bare-expr.check b/test/files/run/repl-bare-expr.check
index 07cf234..e0a1f4e 100644
--- a/test/files/run/repl-bare-expr.check
+++ b/test/files/run/repl-bare-expr.check
@@ -1,34 +1,32 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> 2 ; 3
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              2 ;;
-              ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       2 ;;
+       ^
 res0: Int = 3
 
 scala> { 2 ; 3 }
-<console>:8: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              { 2 ; 3 }
-                ^
+<console>:12: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       { 2 ; 3 }
+         ^
 res1: Int = 3
 
 scala> 5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
   1 +
   2 +
   3 } ; bippy+88+11
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
-              ^
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
-                  ^
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
-                                         ^
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
-                                                                                                ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
+       ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
+           ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
+                                  ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
+                                                                                         ^
 defined object Cow
 defined class Moo
 bippy: Int
diff --git a/test/files/run/repl-colon-type.check b/test/files/run/repl-colon-type.check
index 9898027..21fbe34 100644
--- a/test/files/run/repl-colon-type.check
+++ b/test/files/run/repl-colon-type.check
@@ -1,10 +1,8 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> :type List[1, 2, 3]
 <console>:1: error: identifier expected but integer literal found.
-       List[1, 2, 3]
-            ^
+List[1, 2, 3]
+     ^
 
 scala> :type List(1, 2, 3)
 List[Int]
diff --git a/test/files/run/repl-empty-package.check b/test/files/run/repl-empty-package.check
index d3b75f6..69488ec 100644
--- a/test/files/run/repl-empty-package.check
+++ b/test/files/run/repl-empty-package.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> println(Bippy.bippy)
 bippy!
diff --git a/test/files/run/repl-javap-app.check b/test/files/run/repl-javap-app.check
index eb3718f..bace953 100644
--- a/test/files/run/repl-javap-app.check
+++ b/test/files/run/repl-javap-app.check
@@ -1,7 +1,6 @@
 #partest java6
 Welcome to Scala
-Type in expressions to have them evaluated.
-Type :help for more information.
+Type in expressions for evaluation. Or try :help.
 
 scala> :javap -app MyApp$
 public final void delayedEndpoint$MyApp$1();
@@ -18,8 +17,7 @@ public final void delayedEndpoint$MyApp$1();
 scala> :quit
 #partest java7
 Welcome to Scala
-Type in expressions to have them evaluated.
-Type :help for more information.
+Type in expressions for evaluation. Or try :help.
 
 scala> :javap -app MyApp$
   public final void delayedEndpoint$MyApp$1();
@@ -40,8 +38,7 @@ scala> :javap -app MyApp$
 scala> :quit
 #partest java8
 Welcome to Scala
-Type in expressions to have them evaluated.
-Type :help for more information.
+Type in expressions for evaluation. Or try :help.
 
 scala> :javap -app MyApp$
   public final void delayedEndpoint$MyApp$1();
diff --git a/test/files/run/repl-javap-lambdas.scala b/test/files/run/repl-javap-lambdas.scala
index 15e5bf6..76a6ec8 100644
--- a/test/files/run/repl-javap-lambdas.scala
+++ b/test/files/run/repl-javap-lambdas.scala
@@ -7,8 +7,8 @@ object Test extends JavapTest {
   def code = """
     |object Betty {
     | List(1,2,3) count (_ % 2 != 0)
-    | def f = List(1,2,3) filter (_ % 2 != 0) map (_ * 2)
-    | def g = List(1,2,3) filter (_ % 2 == 0) map (_ * 3) map (_ + 1)
+    | def f = List(1,2,3) filter ((x: Any) => true) map (x => "m1")
+    | def g = List(1,2,3) filter ((x: Any) => true) map (x => "m1") map (x => "m2")
     |}
     |:javap -fun Betty#g
   """.stripMargin
@@ -16,7 +16,7 @@ object Test extends JavapTest {
   // three anonfuns of Betty#g
   override def yah(res: Seq[String]) = {
     import PartialFunction.{ cond => when }
-    val r = """\s*private static final .* \$anonfun\$\d+\(.*""".r
+    val r = """.*final .* .*\$anonfun\$\d+\(.*""".r
     def filtered = res filter (when(_) { case r(_*) => true })
     3 == filtered.size
   }
diff --git a/test/files/run/repl-out-dir.check b/test/files/run/repl-out-dir.check
index c354492..6fd85f5 100644
--- a/test/files/run/repl-out-dir.check
+++ b/test/files/run/repl-out-dir.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> case class Bippy(x: Int)
 defined class Bippy
diff --git a/test/files/run/repl-parens.check b/test/files/run/repl-parens.check
index 74d15ff..6516f4e 100644
--- a/test/files/run/repl-parens.check
+++ b/test/files/run/repl-parens.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> (2)
 res0: Int = 2
@@ -20,12 +18,12 @@ scala>   (  (2 + 2 )  )
 res5: Int = 4
 
 scala> 5 ;   (  (2 + 2 )  ) ; ((5))
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ;   (  (2 + 2 )  ) ;;
-              ^
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ;   (  (2 + 2 )  ) ;;
-                          ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ;   (  (2 + 2 )  ) ;;
+       ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ;   (  (2 + 2 )  ) ;;
+                   ^
 res6: Int = 5
 
 scala> (((2 + 2)), ((2 + 2)))
@@ -40,18 +38,18 @@ res9: String = 4423
 scala> 
 
 scala> 55 ; ((2 + 2)) ; (1, 2, 3)
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              55 ; ((2 + 2)) ;;
-              ^
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              55 ; ((2 + 2)) ;;
-                       ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       55 ; ((2 + 2)) ;;
+       ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       55 ; ((2 + 2)) ;;
+                ^
 res10: (Int, Int, Int) = (1,2,3)
 
 scala> 55 ; (x: Int) => x + 1 ; () => ((5))
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              55 ; (x: Int) => x + 1 ;;
-              ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       55 ; (x: Int) => x + 1 ;;
+       ^
 res11: () => Int = <function0>
 
 scala> 
@@ -60,9 +58,9 @@ scala> () => 5
 res12: () => Int = <function0>
 
 scala> 55 ; () => 5
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              55 ;;
-              ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       55 ;;
+       ^
 res13: () => Int = <function0>
 
 scala> () => { class X ; new X }
diff --git a/test/files/run/repl-paste-2.check b/test/files/run/repl-paste-2.check
index 6ea8e2f..4c589df 100644
--- a/test/files/run/repl-paste-2.check
+++ b/test/files/run/repl-paste-2.check
@@ -1,9 +1,7 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> scala> 999l
 
-// Detected repl transcript paste: ctrl-D to finish.
+// Detected repl transcript. Paste more, or ctrl-D to finish.
 
 res4: Int = 0123
 
@@ -44,7 +42,7 @@ scala> res5 + res6
 res1: Int = 690
 
 scala> val x = dingus
-<console>:7: error: not found: value dingus
+<console>:11: error: not found: value dingus
        val x = dingus
                ^
 
diff --git a/test/files/run/repl-paste-3.check b/test/files/run/repl-paste-3.check
index 23e4028..603fcfa 100644
--- a/test/files/run/repl-paste-3.check
+++ b/test/files/run/repl-paste-3.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> println(3)
 3
diff --git a/test/files/run/repl-paste-4.scala b/test/files/run/repl-paste-4.scala
index cb0a6aa..90f0c18 100644
--- a/test/files/run/repl-paste-4.scala
+++ b/test/files/run/repl-paste-4.scala
@@ -3,9 +3,7 @@ import scala.tools.partest.SessionTest
 
 object Test extends SessionTest {
   def session =
-s"""|Type in expressions to have them evaluated.
-    |Type :help for more information.
-    |
+s"""|
     |scala> :paste $pastie
     |Pasting file $pastie...
     |defined class Foo
diff --git a/test/files/run/repl-paste-5.check b/test/files/run/repl-paste-5.check
new file mode 100644
index 0000000..8b97b88
--- /dev/null
+++ b/test/files/run/repl-paste-5.check
@@ -0,0 +1,28 @@
+
+scala> :paste < EOF
+// Entering paste mode (EOF to finish)
+
+class C { def c = 42 }
+EOF
+
+// Exiting paste mode, now interpreting.
+
+defined class C
+
+scala> new C().c
+res0: Int = 42
+
+scala> :paste <| EOF
+// Entering paste mode (EOF to finish)
+
+  |class D { def d = 42 }
+EOF
+
+// Exiting paste mode, now interpreting.
+
+defined class D
+
+scala> new D().d
+res1: Int = 42
+
+scala> :quit
diff --git a/test/files/run/repl-paste-5.scala b/test/files/run/repl-paste-5.scala
new file mode 100644
index 0000000..890f47f
--- /dev/null
+++ b/test/files/run/repl-paste-5.scala
@@ -0,0 +1,18 @@
+
+import scala.tools.partest.ReplTest
+
+object Test extends ReplTest {
+  //def code = ":paste < EOF\n" + (
+  def code = 
+    """
+:paste < EOF
+class C { def c = 42 }
+EOF
+new C().c
+:paste <| EOF
+  |class D { def d = 42 }
+EOF
+new D().d
+    """
+  //)
+}
diff --git a/test/files/run/repl-paste-raw.scala b/test/files/run/repl-paste-raw.scala
index 3b41254..9bd5e8e 100644
--- a/test/files/run/repl-paste-raw.scala
+++ b/test/files/run/repl-paste-raw.scala
@@ -3,9 +3,7 @@ import scala.tools.partest.SessionTest
 
 object Test extends SessionTest {
   def session =
-s"""|Type in expressions to have them evaluated.
-    |Type :help for more information.
-    |
+s"""|
     |scala> :paste -raw $pastie
     |Pasting file $pastie...
     |
diff --git a/test/files/run/repl-paste.check b/test/files/run/repl-paste.check
index 1714472..3bcfd33 100644
--- a/test/files/run/repl-paste.check
+++ b/test/files/run/repl-paste.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> :paste
 // Entering paste mode (ctrl-D to finish)
diff --git a/test/files/run/repl-power.check b/test/files/run/repl-power.check
index e2318c9..0d4a30b 100644
--- a/test/files/run/repl-power.check
+++ b/test/files/run/repl-power.check
@@ -1,12 +1,8 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> :power
-** Power User mode enabled - BEEP WHIR GYVE **
-** :phase has been set to 'typer'.          **
-** scala.tools.nsc._ has been imported      **
-** global._, definitions._ also imported    **
-** Try  :help, :vals, power.<tab>           **
+Power mode enabled. :phase is at typer.
+import scala.tools.nsc._, intp.global._, definitions._
+Try :help or completions for vals._ and power._
 
 scala> // guarding against "error: reference to global is ambiguous"
 
@@ -27,4 +23,7 @@ m: $r.treedsl.global.Literal = 10
 scala> typed(m).tpe                              // typed is in scope
 res2: $r.treedsl.global.Type = Int(10)
 
+scala> """escaping is hard, m'kah"""
+res3: String = escaping is hard, m'kah
+
 scala> :quit
diff --git a/test/files/run/repl-power.scala b/test/files/run/repl-power.scala
index 4dfeb37..5ecaad8 100644
--- a/test/files/run/repl-power.scala
+++ b/test/files/run/repl-power.scala
@@ -1,7 +1,9 @@
 import scala.tools.partest.ReplTest
 
 object Test extends ReplTest {
-  def code = """
+  def tripleQuote(s: String) = "\"\"\"" + s + "\"\"\""
+
+  def code = s"""
 :power
 // guarding against "error: reference to global is ambiguous"
 global.emptyValDef  // "it is imported twice in the same scope by ..."
@@ -9,5 +11,6 @@ val tp = ArrayClass[scala.util.Random]    // magic with tags
 tp.memberType(Array_apply)                // evidence
 val m = LIT(10)                           // treedsl
 typed(m).tpe                              // typed is in scope
+${tripleQuote("escaping is hard, m'kah")}
   """.trim
 }
diff --git a/test/files/run/repl-reset.check b/test/files/run/repl-reset.check
index cd7893b..cf4d9a1 100644
--- a/test/files/run/repl-reset.check
+++ b/test/files/run/repl-reset.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> val x1 = 1
 x1: Int = 1
@@ -30,23 +28,23 @@ Forgetting all expression results and named terms: $intp, BippyBungus, x1, x2, x
 Forgetting defined types: BippyBungus
 
 scala> x1 + x2 + x3
-<console>:8: error: not found: value x1
-              x1 + x2 + x3
-              ^
-<console>:8: error: not found: value x2
-              x1 + x2 + x3
-                   ^
-<console>:8: error: not found: value x3
-              x1 + x2 + x3
-                        ^
+<console>:12: error: not found: value x1
+       x1 + x2 + x3
+       ^
+<console>:12: error: not found: value x2
+       x1 + x2 + x3
+            ^
+<console>:12: error: not found: value x3
+       x1 + x2 + x3
+                 ^
 
 scala> val x1 = 4
 x1: Int = 4
 
 scala> new BippyBungus
-<console>:8: error: not found: type BippyBungus
-              new BippyBungus
-                  ^
+<console>:12: error: not found: type BippyBungus
+       new BippyBungus
+           ^
 
 scala> class BippyBungus() { def f = 5 }
 defined class BippyBungus
diff --git a/test/files/run/repl-save.scala b/test/files/run/repl-save.scala
index c98e6ae..8a3a887 100644
--- a/test/files/run/repl-save.scala
+++ b/test/files/run/repl-save.scala
@@ -2,9 +2,7 @@ import scala.tools.partest.SessionTest
 
 object Test extends SessionTest {
   def session =
-s"""|Type in expressions to have them evaluated.
-    |Type :help for more information.
-    |
+s"""|
     |scala> val i = 7
     |i: Int = 7
     |
diff --git a/test/files/run/repl-serialization.check b/test/files/run/repl-serialization.check
new file mode 100644
index 0000000..bbbf0dc
--- /dev/null
+++ b/test/files/run/repl-serialization.check
@@ -0,0 +1,24 @@
+== evaluating lines
+extract: AnyRef => Unit = <function1>
+  evaluating x
+x: Int = 0
+getX: ()Int
+defined class U
+y: Int = <lazy>
+  evaluating z
+  evaluating zz
+defined class D
+z: Int = 0
+zz: Int = 0
+defined object O
+defined class A
+defined type alias AA
+constructing U
+u: U = U
+== evaluating lambda
+  evaluating y
+  evaluating O
+  constructing A
+== reconstituting into a fresh classloader
+== evaluating reconstituted lambda
+  constructing A
diff --git a/test/files/run/repl-serialization.scala b/test/files/run/repl-serialization.scala
new file mode 100644
index 0000000..55b7519
--- /dev/null
+++ b/test/files/run/repl-serialization.scala
@@ -0,0 +1,68 @@
+import java.io._
+
+import scala.reflect.io.AbstractFile
+import scala.tools.nsc.Settings
+import scala.tools.nsc.interpreter.IMain
+import scala.tools.nsc.util._
+import scala.reflect.internal.util.AbstractFileClassLoader
+
+object Test {
+  def main(args: Array[String]) {
+    run()
+  }
+
+  def run(): Unit = {
+    val settings = new Settings()
+    settings.Yreplclassbased.value = true
+    settings.usejavacp.value = true
+
+    var imain: IMain = null
+    object extract extends ((AnyRef) => Unit) with Serializable {
+      var value: AnyRef = null
+
+      def apply(a: AnyRef) = value = a
+    }
+
+    val code =
+      """val x = {println("  evaluating x"); 0 }
+        |def getX() = x
+        |class U extends Serializable { println("constructing U"); val x = 0 ; override def toString = "U" }
+        |lazy val y = {println("  evaluating y"); 0 }
+        |class D; val z = {println("  evaluating z"); 0}; val zz = {println("  evaluating zz"); 0}
+        |object O extends Serializable { val apply = {println("  evaluating O"); 0} }
+        |class A(i: Int) { println("  constructing A") }
+        |type AA = A
+        |val u = new U()
+        |extract(() => new AA(x + getX() + y + z + zz + O.apply + u.x))
+      """.stripMargin
+
+    imain = new IMain(settings)
+    println("== evaluating lines")
+    imain.directBind("extract", "(AnyRef => Unit)", extract)
+    code.lines.foreach(imain.interpret)
+
+    val virtualFile: AbstractFile = extract.value.getClass.getClassLoader.asInstanceOf[AbstractFileClassLoader].root
+    val newLoader = new AbstractFileClassLoader(virtualFile, getClass.getClassLoader)
+
+    def deserializeInNewLoader(string: Array[Byte]): AnyRef = {
+      val bis = new ByteArrayInputStream(string)
+      val in = new ObjectInputStream(bis) {
+        override def resolveClass(desc: ObjectStreamClass) = Class.forName(desc.getName, false, newLoader)
+      }
+      in.readObject()
+    }
+    def serialize(o: AnyRef): Array[Byte] = {
+      val bos = new ByteArrayOutputStream()
+      val out = new ObjectOutputStream(bos)
+      out.writeObject(o)
+      out.close()
+      bos.toByteArray
+    }
+    println("== evaluating lambda")
+    extract.value.asInstanceOf[() => Any].apply()
+    println("== reconstituting into a fresh classloader")
+    val reconstituted = deserializeInNewLoader(serialize(extract.value)).asInstanceOf[() => Any]
+    println("== evaluating reconstituted lambda")
+    reconstituted.apply() // should not print("evaluating x") a second time
+  }
+}
diff --git a/test/files/run/repl-term-macros.check b/test/files/run/repl-term-macros.check
index 2cd0b93..b020611 100644
--- a/test/files/run/repl-term-macros.check
+++ b/test/files/run/repl-term-macros.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.reflect.macros.blackbox.Context
 import scala.reflect.macros.blackbox.Context
diff --git a/test/files/run/repl-transcript.check b/test/files/run/repl-transcript.check
index b0f1063..d0b455c 100644
--- a/test/files/run/repl-transcript.check
+++ b/test/files/run/repl-transcript.check
@@ -1,9 +1,7 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> scala> class Bippity
 
-// Detected repl transcript paste: ctrl-D to finish.
+// Detected repl transcript. Paste more, or ctrl-D to finish.
 
 defined class Bippity
 
diff --git a/test/files/run/repl-trim-stack-trace.scala b/test/files/run/repl-trim-stack-trace.scala
index a53ce3b..c081490 100644
--- a/test/files/run/repl-trim-stack-trace.scala
+++ b/test/files/run/repl-trim-stack-trace.scala
@@ -5,15 +5,14 @@ import scala.tools.partest.{ SessionTest, Welcoming }
 object Test extends SessionTest with Welcoming {
   def session =
 """Welcome to Scala
-Type in expressions to have them evaluated.
-Type :help for more information.
+Type in expressions for evaluation. Or try :help.
 
 scala> def f = throw new Exception("Uh-oh")
 f: Nothing
 
 scala> f
 java.lang.Exception: Uh-oh
-  at .f(<console>:7)
+  at .f(<console>:11)
   ... 69 elided
 
 scala> def f = throw new Exception("")
@@ -21,7 +20,7 @@ f: Nothing
 
 scala> f
 java.lang.Exception:
-  at .f(<console>:7)
+  at .f(<console>:11)
   ... 69 elided
 
 scala> def f = throw new Exception
@@ -29,7 +28,7 @@ f: Nothing
 
 scala> f
 java.lang.Exception
-  at .f(<console>:7)
+  at .f(<console>:11)
   ... 69 elided
 
 scala> :quit"""
@@ -37,7 +36,6 @@ scala> :quit"""
   // normalize the "elided" lines because the frame count depends on test context
   lazy val elided = """(\s+\.{3} )\d+( elided)""".r
   override def normalize(line: String) = line match {
-    case welcome(w)               => w
     case elided(ellipsis, suffix) => s"$ellipsis???$suffix"
     case s                        => s
   }
diff --git a/test/files/run/repl-type-verbose.check b/test/files/run/repl-type-verbose.check
index 6f6b47b..10a9c12 100644
--- a/test/files/run/repl-type-verbose.check
+++ b/test/files/run/repl-type-verbose.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> // verbose!
 
diff --git a/test/files/run/sbt-icode-interface.scala b/test/files/run/sbt-icode-interface.scala
new file mode 100644
index 0000000..84d38cc
--- /dev/null
+++ b/test/files/run/sbt-icode-interface.scala
@@ -0,0 +1,42 @@
+import scala.tools.partest._
+import scala.tools.nsc._
+
+object Test extends DirectTest {
+
+  def code = """
+    class C { class D }
+    object O
+  """.trim
+
+  def show() {
+    for (b <- List("GenASM", "GenBCode")) {
+      val global = newCompiler("-usejavacp", s"-Ybackend:$b")
+      import global._
+      val r = new Run
+      r.compileSources(newSourceFile(code) :: Nil)
+      
+      val results = collection.mutable.Buffer[(Boolean, String)]()
+
+      // Nailing down defacto compiler API from SBT's usage
+      // https://github.com/sbt/sbt/blob/adb41611cf73260938274915d8462d924df200c8/compile/interface/src/main/scala/xsbt/Analyzer.scala#L29-L41
+      def isTopLevelModule(sym: Symbol) = sym.isTopLevel && sym.isModule
+      for (unit <- currentRun.units if !unit.isJava) {
+        val sourceFile = unit.source.file.file
+        for (iclass <- unit.icode) {
+          val sym = iclass.symbol
+          def addGenerated(separatorRequired: Boolean) {
+            results += (separatorRequired -> sym.fullName)
+          }
+          if (sym.isModuleClass && !sym.isImplClass) {
+            if (isTopLevelModule(sym) && sym.companionClass == NoSymbol)
+              addGenerated(false)
+            addGenerated(true)
+          } else
+            addGenerated(false)
+        }
+      }
+      val expected = List((false, "C"), (true, "O"), (false, "C$D"))
+      assert(results.toList == expected, b + ": " + results.toList)
+    }
+  }
+}
diff --git a/test/files/run/scalapInvokedynamic.check b/test/files/run/scalapInvokedynamic.check
new file mode 100644
index 0000000..8e4b08f
--- /dev/null
+++ b/test/files/run/scalapInvokedynamic.check
@@ -0,0 +1,5 @@
+class C extends scala.AnyRef {
+  def this() = { /* compiled code */ }
+  def m: java.lang.String = { /* compiled code */ }
+}
+
diff --git a/test/files/run/scalapInvokedynamic.scala b/test/files/run/scalapInvokedynamic.scala
new file mode 100644
index 0000000..670cf26
--- /dev/null
+++ b/test/files/run/scalapInvokedynamic.scala
@@ -0,0 +1,11 @@
+class C {
+  def m = {
+    val f = (x: String) => x.trim
+    f(" H ae i  ")
+  }
+}
+
+object Test extends App {
+  val testClassesDir = System.getProperty("partest.output")
+  scala.tools.scalap.Main.main(Array("-cp", testClassesDir, "C"))
+}
\ No newline at end of file
diff --git a/test/files/run/stringinterpolation_macro-run.scala b/test/files/run/stringinterpolation_macro-run.scala
index e18375d..ae7c0e5 100644
--- a/test/files/run/stringinterpolation_macro-run.scala
+++ b/test/files/run/stringinterpolation_macro-run.scala
@@ -1,5 +1,5 @@
 /*
- * filter: inliner warnings; re-run with -Yinline-warnings for details
+ * filter: inliner warnings; re-run with
  */
 object Test extends App {
 
diff --git a/test/files/run/synchronized.check b/test/files/run/synchronized.check
index eab191b..dd9f4ef 100644
--- a/test/files/run/synchronized.check
+++ b/test/files/run/synchronized.check
@@ -1,4 +1,3 @@
-warning: there were 14 inliner warnings; re-run with -Yinline-warnings for details
     .|.               c1.f1:     OK
     .|.               c1.fi:     OK
     .|...             c1.fv:     OK
diff --git a/test/files/run/synchronized.scala b/test/files/run/synchronized.scala
index 1f0e329..077e9d0 100644
--- a/test/files/run/synchronized.scala
+++ b/test/files/run/synchronized.scala
@@ -1,3 +1,6 @@
+/*
+ * filter: inliner warnings; re-run with
+ */
 import java.lang.Thread.holdsLock
 import scala.collection.mutable.StringBuilder
 
diff --git a/test/files/run/t0631.scala b/test/files/run/t0631.scala
index c401ed3..8d67257 100644
--- a/test/files/run/t0631.scala
+++ b/test/files/run/t0631.scala
@@ -11,6 +11,6 @@ object Test extends App {
   case class Bar(x: Foo)
   val b = new Bar(new Foo)
 
-  // this should not call Foo.equals, but simply compare object identiy of b
+  // this should not call Foo.equals, but simply compare object identity of b
   println(b == b)
 }
diff --git a/test/files/run/t1931.scala b/test/files/run/t1931.scala
new file mode 100644
index 0000000..eedfa9b
--- /dev/null
+++ b/test/files/run/t1931.scala
@@ -0,0 +1,43 @@
+
+import scala.tools.partest.SessionTest
+
+object Test extends SessionTest {
+
+  def session =
+"""
+scala> val x: Any = 42
+x: Any = 42
+
+scala> x + " works"
+res0: String = 42 works
+
+scala> import Predef.{ any2stringadd => _, _ }
+import Predef.{any2stringadd=>_, _}
+
+scala> x + " works"
+<console>:14: error: value + is not a member of Any
+       x + " works"
+         ^
+
+scala> import Predef._
+import Predef._
+
+scala> x + " works"
+res2: String = 42 works
+
+scala> object Predef { def f = 42 }
+defined object Predef
+
+scala> import Predef._
+import Predef._
+
+scala> f
+<console>:14: error: not found: value f
+       f
+       ^
+
+scala> Predef.f
+res4: Int = 42
+
+scala> :quit"""
+}
diff --git a/test/files/run/t1987b/cce_test.scala b/test/files/run/t1987b/cce_test.scala
index 4f9acf0..e131df7 100644
--- a/test/files/run/t1987b/cce_test.scala
+++ b/test/files/run/t1987b/cce_test.scala
@@ -1,5 +1,5 @@
 package scales.xml
-//import scales.xml._ // using another pacakge and importing doesn't CCE
+//import scales.xml._ // using another package and importing doesn't CCE
 
 object CCE_Test {
   def main(args: Array[String]): Unit = {
diff --git a/test/files/run/t2106.check b/test/files/run/t2106.check
index f8f625f..66a0e70 100644
--- a/test/files/run/t2106.check
+++ b/test/files/run/t2106.check
@@ -1,3 +1,10 @@
+#partest -Ybackend:GenBCode
+t2106.scala:7: warning: A::foo()Ljava/lang/Object; is annotated @inline but could not be inlined:
+The callee A::foo()Ljava/lang/Object; contains the instruction INVOKEVIRTUAL java/lang/Object.clone ()Ljava/lang/Object;
+that would cause an IllegalAccessError when inlined into class Test$.
+  def main(args: Array[String]): Unit = x.foo
+                                          ^
+#partest !-Ybackend:GenBCode
 t2106.scala:7: warning: Could not inline required method foo because access level required by callee not matched by caller.
   def main(args: Array[String]): Unit = x.foo
                                           ^
diff --git a/test/files/run/t2106.flags b/test/files/run/t2106.flags
index 00d3643..a2e413b 100644
--- a/test/files/run/t2106.flags
+++ b/test/files/run/t2106.flags
@@ -1 +1 @@
--optimise -Yinline-warnings
+-optimise -Yinline-warnings -Yopt:l:classpath
diff --git a/test/files/run/t2127.scala b/test/files/run/t2127.scala
old mode 100755
new mode 100644
index 869d8a3..839c8d6
--- a/test/files/run/t2127.scala
+++ b/test/files/run/t2127.scala
@@ -28,5 +28,5 @@
 
     }
 
-The constructor invocation of Bar is done within the scope of object Foo's constructor, and therefor the private constructor of Foo should be visible and accessible.
+The constructor invocation of Bar is done within the scope of object Foo's constructor, and therefore the private constructor of Foo should be visible and accessible.
 */
diff --git a/test/files/run/t2318.scala b/test/files/run/t2318.scala
index b638c43..4239c01 100644
--- a/test/files/run/t2318.scala
+++ b/test/files/run/t2318.scala
@@ -11,6 +11,7 @@ object Test {
       case _: java.io.FilePermission                                                        => ()
       case x: java.security.SecurityPermission if x.getName contains ".networkaddress."     => () // generality ftw
       case x: java.util.PropertyPermission if x.getName == "sun.net.inetaddr.ttl"           => ()
+      case _: java.lang.reflect.ReflectPermission                                           => () // needed for LambdaMetaFactory
       case _                                                                                => super.checkPermission(perm)
     }
   }
diff --git a/test/files/run/t2503.scala b/test/files/run/t2503.scala
old mode 100755
new mode 100644
diff --git a/test/files/run/t2526.scala b/test/files/run/t2526.scala
index 53f3059..9f3c48e 100644
--- a/test/files/run/t2526.scala
+++ b/test/files/run/t2526.scala
@@ -38,7 +38,7 @@ object Test {
 
   /*
    * Checks foreach of `actual` goes over all the elements in `expected`
-   * We duplicate the method above because there is no common inteface between Traversable and
+   * We duplicate the method above because there is no common interface between Traversable and
    * Iterator and we want to avoid converting between collections to ensure that we test what
    * we mean to test.
    */
diff --git a/test/files/run/t3026.scala b/test/files/run/t3026.scala
old mode 100755
new mode 100644
diff --git a/test/files/run/t3368-b.check b/test/files/run/t3368-b.check
new file mode 100644
index 0000000..4cbe98c
--- /dev/null
+++ b/test/files/run/t3368-b.check
@@ -0,0 +1,89 @@
+[[syntax trees at end of                    parser]] // newSource1.scala
+package <empty> {
+  abstract trait X extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def x = {
+      val $buf = new _root_.scala.xml.NodeBuffer();
+      $buf.$amp$plus(new _root_.scala.xml.PCData("hi & bye"));
+      $buf.$amp$plus(new _root_.scala.xml.PCData("red & black"));
+      $buf
+    }
+  };
+  abstract trait Y extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def y = {
+      {
+        new _root_.scala.xml.Elem(null, "a", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "b", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("start"));
+          $buf.$amp$plus(new _root_.scala.xml.PCData("hi & bye"));
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "c", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("world"));
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "d", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("stuff"));
+          $buf.$amp$plus(new _root_.scala.xml.PCData("red & black"));
+          $buf
+        }: _*))
+      }
+    }
+  };
+  abstract trait Z extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def d = new _root_.scala.xml.PCData("hello, world");
+    def e = {
+      val $buf = new _root_.scala.xml.NodeBuffer();
+      $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+      $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+      $buf
+    };
+    def f = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.Text("x"));
+          $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+          $buf
+        }: _*))
+      }
+    };
+    def g = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+          $buf
+        }: _*))
+      }
+    };
+    def h = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+          $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+          $buf
+        }: _*))
+      }
+    }
+  }
+}
+
diff --git a/test/files/run/t3368-b.scala b/test/files/run/t3368-b.scala
new file mode 100644
index 0000000..108cb9a
--- /dev/null
+++ b/test/files/run/t3368-b.scala
@@ -0,0 +1,26 @@
+
+import scala.tools.partest.ParserTest
+
+
+object Test extends ParserTest {
+
+  override def code = """
+  trait X {
+    // error: in XML literal: name expected, but char '!' cannot start a name
+    def x = <![CDATA[hi & bye]]> <![CDATA[red & black]]>
+  }
+  trait Y {
+    def y = <a><b/>start<![CDATA[hi & bye]]><c/>world<d/>stuff<![CDATA[red & black]]></a>
+  }
+  trait Z {
+    def d = <![CDATA[hello, world]]>
+    def e = <![CDATA[hello, world]]><![CDATA[hello, world]]>            // top level not coalesced
+    def f = <foo>x<![CDATA[hello, world]]></foo>                        // adjoining text
+    def g = <foo><![CDATA[hello, world]]></foo>                         // text node when coalescing
+    def h = <foo><![CDATA[hello, world]]><![CDATA[hello, world]]></foo>
+  }
+  """
+
+  // not coalescing
+  override def extraSettings = s"${super.extraSettings} -Xxml:-coalescing"
+}
diff --git a/test/files/run/t3368-c.check b/test/files/run/t3368-c.check
new file mode 100644
index 0000000..e0c10cc
--- /dev/null
+++ b/test/files/run/t3368-c.check
@@ -0,0 +1,85 @@
+[[syntax trees at end of                    parser]] // newSource1.scala
+package <empty> {
+  abstract trait X extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def x = {
+      val $buf = new _root_.scala.xml.NodeBuffer();
+      $buf.$amp$plus(new _root_.scala.xml.Text("hi & bye"));
+      $buf.$amp$plus(new _root_.scala.xml.Text("red & black"));
+      $buf
+    }
+  };
+  abstract trait Y extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def y = {
+      {
+        new _root_.scala.xml.Elem(null, "a", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "b", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("starthi & bye"));
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "c", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("world"));
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "d", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("stuffred & black"));
+          $buf
+        }: _*))
+      }
+    }
+  };
+  abstract trait Z extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def d = new _root_.scala.xml.Text("hello, world");
+    def e = {
+      val $buf = new _root_.scala.xml.NodeBuffer();
+      $buf.$amp$plus(new _root_.scala.xml.Text("hello, world"));
+      $buf.$amp$plus(new _root_.scala.xml.Text("hello, world"));
+      $buf
+    };
+    def f = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.Text("xhello, world"));
+          $buf
+        }: _*))
+      }
+    };
+    def g = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.Text("hello, world"));
+          $buf
+        }: _*))
+      }
+    };
+    def h = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.Text("hello, worldhello, world"));
+          $buf
+        }: _*))
+      }
+    }
+  }
+}
+
diff --git a/test/files/run/t3368-c.scala b/test/files/run/t3368-c.scala
new file mode 100644
index 0000000..5121794
--- /dev/null
+++ b/test/files/run/t3368-c.scala
@@ -0,0 +1,26 @@
+
+import scala.tools.partest.ParserTest
+
+
+object Test extends ParserTest {
+
+  override def code = """
+  trait X {
+    // error: in XML literal: name expected, but char '!' cannot start a name
+    def x = <![CDATA[hi & bye]]> <![CDATA[red & black]]>
+  }
+  trait Y {
+    def y = <a><b/>start<![CDATA[hi & bye]]><c/>world<d/>stuff<![CDATA[red & black]]></a>
+  }
+  trait Z {
+    def d = <![CDATA[hello, world]]>
+    def e = <![CDATA[hello, world]]><![CDATA[hello, world]]>            // top level not coalesced
+    def f = <foo>x<![CDATA[hello, world]]></foo>                        // adjoining text
+    def g = <foo><![CDATA[hello, world]]></foo>                         // text node when coalescing
+    def h = <foo><![CDATA[hello, world]]><![CDATA[hello, world]]></foo>
+  }
+  """
+
+  // default coalescing behavior, whatever that is today.
+  //override def extraSettings = s"${super.extraSettings} -Xxml:coalescing"
+}
diff --git a/test/files/run/t3368-d.check b/test/files/run/t3368-d.check
new file mode 100644
index 0000000..4cbe98c
--- /dev/null
+++ b/test/files/run/t3368-d.check
@@ -0,0 +1,89 @@
+[[syntax trees at end of                    parser]] // newSource1.scala
+package <empty> {
+  abstract trait X extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def x = {
+      val $buf = new _root_.scala.xml.NodeBuffer();
+      $buf.$amp$plus(new _root_.scala.xml.PCData("hi & bye"));
+      $buf.$amp$plus(new _root_.scala.xml.PCData("red & black"));
+      $buf
+    }
+  };
+  abstract trait Y extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def y = {
+      {
+        new _root_.scala.xml.Elem(null, "a", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "b", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("start"));
+          $buf.$amp$plus(new _root_.scala.xml.PCData("hi & bye"));
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "c", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("world"));
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "d", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("stuff"));
+          $buf.$amp$plus(new _root_.scala.xml.PCData("red & black"));
+          $buf
+        }: _*))
+      }
+    }
+  };
+  abstract trait Z extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def d = new _root_.scala.xml.PCData("hello, world");
+    def e = {
+      val $buf = new _root_.scala.xml.NodeBuffer();
+      $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+      $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+      $buf
+    };
+    def f = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.Text("x"));
+          $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+          $buf
+        }: _*))
+      }
+    };
+    def g = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+          $buf
+        }: _*))
+      }
+    };
+    def h = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+          $buf.$amp$plus(new _root_.scala.xml.PCData("hello, world"));
+          $buf
+        }: _*))
+      }
+    }
+  }
+}
+
diff --git a/test/files/run/t3368-d.scala b/test/files/run/t3368-d.scala
new file mode 100644
index 0000000..5777c1a
--- /dev/null
+++ b/test/files/run/t3368-d.scala
@@ -0,0 +1,26 @@
+
+import scala.tools.partest.ParserTest
+
+
+object Test extends ParserTest {
+
+  override def code = """
+  trait X {
+    // error: in XML literal: name expected, but char '!' cannot start a name
+    def x = <![CDATA[hi & bye]]> <![CDATA[red & black]]>
+  }
+  trait Y {
+    def y = <a><b/>start<![CDATA[hi & bye]]><c/>world<d/>stuff<![CDATA[red & black]]></a>
+  }
+  trait Z {
+    def d = <![CDATA[hello, world]]>
+    def e = <![CDATA[hello, world]]><![CDATA[hello, world]]>            // top level not coalesced
+    def f = <foo>x<![CDATA[hello, world]]></foo>                        // adjoining text
+    def g = <foo><![CDATA[hello, world]]></foo>                         // text node when coalescing
+    def h = <foo><![CDATA[hello, world]]><![CDATA[hello, world]]></foo>
+  }
+  """
+
+  // default under 2.12 is not coalescing
+  override def extraSettings = s"${super.extraSettings} -Xsource:212"
+}
diff --git a/test/files/run/t3368.check b/test/files/run/t3368.check
new file mode 100644
index 0000000..e0c10cc
--- /dev/null
+++ b/test/files/run/t3368.check
@@ -0,0 +1,85 @@
+[[syntax trees at end of                    parser]] // newSource1.scala
+package <empty> {
+  abstract trait X extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def x = {
+      val $buf = new _root_.scala.xml.NodeBuffer();
+      $buf.$amp$plus(new _root_.scala.xml.Text("hi & bye"));
+      $buf.$amp$plus(new _root_.scala.xml.Text("red & black"));
+      $buf
+    }
+  };
+  abstract trait Y extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def y = {
+      {
+        new _root_.scala.xml.Elem(null, "a", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "b", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("starthi & bye"));
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "c", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("world"));
+          $buf.$amp$plus({
+            {
+              new _root_.scala.xml.Elem(null, "d", _root_.scala.xml.Null, $scope, true)
+            }
+          });
+          $buf.$amp$plus(new _root_.scala.xml.Text("stuffred & black"));
+          $buf
+        }: _*))
+      }
+    }
+  };
+  abstract trait Z extends scala.AnyRef {
+    def $init$() = {
+      ()
+    };
+    def d = new _root_.scala.xml.Text("hello, world");
+    def e = {
+      val $buf = new _root_.scala.xml.NodeBuffer();
+      $buf.$amp$plus(new _root_.scala.xml.Text("hello, world"));
+      $buf.$amp$plus(new _root_.scala.xml.Text("hello, world"));
+      $buf
+    };
+    def f = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.Text("xhello, world"));
+          $buf
+        }: _*))
+      }
+    };
+    def g = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.Text("hello, world"));
+          $buf
+        }: _*))
+      }
+    };
+    def h = {
+      {
+        new _root_.scala.xml.Elem(null, "foo", _root_.scala.xml.Null, $scope, false, ({
+          val $buf = new _root_.scala.xml.NodeBuffer();
+          $buf.$amp$plus(new _root_.scala.xml.Text("hello, worldhello, world"));
+          $buf
+        }: _*))
+      }
+    }
+  }
+}
+
diff --git a/test/files/run/t3368.scala b/test/files/run/t3368.scala
new file mode 100644
index 0000000..284fed0
--- /dev/null
+++ b/test/files/run/t3368.scala
@@ -0,0 +1,26 @@
+
+import scala.tools.partest.ParserTest
+
+
+object Test extends ParserTest {
+
+  override def code = """
+  trait X {
+    // error: in XML literal: name expected, but char '!' cannot start a name
+    def x = <![CDATA[hi & bye]]> <![CDATA[red & black]]>
+  }
+  trait Y {
+    def y = <a><b/>start<![CDATA[hi & bye]]><c/>world<d/>stuff<![CDATA[red & black]]></a>
+  }
+  trait Z {
+    def d = <![CDATA[hello, world]]>
+    def e = <![CDATA[hello, world]]><![CDATA[hello, world]]>            // top level not coalesced
+    def f = <foo>x<![CDATA[hello, world]]></foo>                        // adjoining text
+    def g = <foo><![CDATA[hello, world]]></foo>                         // text node when coalescing
+    def h = <foo><![CDATA[hello, world]]><![CDATA[hello, world]]></foo>
+  }
+  """
+
+  // coalescing
+  override def extraSettings = s"${super.extraSettings} -Xxml:coalescing"
+}
diff --git a/test/files/run/t3376.check b/test/files/run/t3376.check
index b8fd284..0af54d6 100644
--- a/test/files/run/t3376.check
+++ b/test/files/run/t3376.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> class M[@specialized T] { override def toString = "mmm" }
 defined class M
diff --git a/test/files/run/t3647.check b/test/files/run/t3647.check
new file mode 100644
index 0000000..e5c1ee1
--- /dev/null
+++ b/test/files/run/t3647.check
@@ -0,0 +1 @@
+warning: there were three deprecation warnings; re-run with -deprecation for details
diff --git a/test/files/run/t4025.check b/test/files/run/t4025.check
index e8c6851..ed3f254 100644
--- a/test/files/run/t4025.check
+++ b/test/files/run/t4025.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> class Color(val red: Int)
 defined class Color
diff --git a/test/files/run/t4172.check b/test/files/run/t4172.check
index 315c1c9..3141647 100644
--- a/test/files/run/t4172.check
+++ b/test/files/run/t4172.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> val c = { class C { override def toString = "C" }; ((new C, new C { def f = 2 })) }
 warning: there was one feature warning; re-run with -feature for details
diff --git a/test/files/run/t4216.check b/test/files/run/t4216.check
index e4610e8..3ec394b 100644
--- a/test/files/run/t4216.check
+++ b/test/files/run/t4216.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.reflect.ClassTag
 import scala.reflect.ClassTag
diff --git a/test/files/run/t4285.check b/test/files/run/t4285.check
index b952cb8..465aee7 100644
--- a/test/files/run/t4285.check
+++ b/test/files/run/t4285.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> val x = Array(1,2,3,4,5,6,7)
 x: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7)
diff --git a/test/files/run/t4542.check b/test/files/run/t4542.check
index f7716dc..6e09922 100644
--- a/test/files/run/t4542.check
+++ b/test/files/run/t4542.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> @deprecated("foooo", "ReplTest version 1.0-FINAL") class Foo() {
   override def toString = "Bippy"
@@ -7,7 +5,7 @@ scala> @deprecated("foooo", "ReplTest version 1.0-FINAL") class Foo() {
 defined class Foo
 
 scala> val f = new Foo
-<console>:8: warning: class Foo is deprecated: foooo
+<console>:12: warning: class Foo is deprecated: foooo
        val f = new Foo
                    ^
 f: Foo = Bippy
diff --git a/test/files/run/t4594-repl-settings.scala b/test/files/run/t4594-repl-settings.scala
index db5dc19..f2d1a8b 100644
--- a/test/files/run/t4594-repl-settings.scala
+++ b/test/files/run/t4594-repl-settings.scala
@@ -4,23 +4,21 @@ import scala.tools.partest.SessionTest
 // Detected repl transcript paste: ctrl-D to finish.
 object Test extends SessionTest {
   def session =
-""" |Type in expressions to have them evaluated.
-    |Type :help for more information.
-    |
-    |scala> @deprecated(message="Please don't do that.", since="Time began.") def depp = "john"
-    |depp: String
-    |
-    |scala> def a = depp
-    |warning: there was one deprecation warning; re-run with -deprecation for details
-    |a: String
-    |
-    |scala> :settings -deprecation
-    |
-    |scala> def b = depp
-    |<console>:8: warning: method depp is deprecated: Please don't do that.
-    |       def b = depp
-    |               ^
-    |b: String
-    |
-    |scala> :quit"""
+"""|
+   |scala> @deprecated(message="Please don't do that.", since="Time began.") def depp = "john"
+   |depp: String
+   |
+   |scala> def a = depp
+   |warning: there was one deprecation warning; re-run with -deprecation for details
+   |a: String
+   |
+   |scala> :settings -deprecation
+   |
+   |scala> def b = depp
+   |<console>:12: warning: method depp is deprecated: Please don't do that.
+   |       def b = depp
+   |               ^
+   |b: String
+   |
+   |scala> :quit"""
 }
diff --git a/test/files/run/t4658.check b/test/files/run/t4658.check
index bb64051..3bc52da 100644
--- a/test/files/run/t4658.check
+++ b/test/files/run/t4658.check
@@ -1,5 +1,5 @@
 Ranges:
-1073741824
+-1073741824
 1073741824
 0
 0
@@ -20,7 +20,7 @@ Ranges:
 -10
 IntRanges:
 -1073741824
--1073741824
+1073741824
 0
 0
 55
@@ -78,3 +78,6 @@ BigIntRanges:
 -24
 -30
 -10
+BigInt agrees with Long: true
+Long agrees with Int when rounded: true
+Numeric Int agrees with Range: true
diff --git a/test/files/run/t4658.scala b/test/files/run/t4658.scala
index 8c07c50..7fc6d45 100644
--- a/test/files/run/t4658.scala
+++ b/test/files/run/t4658.scala
@@ -2,6 +2,7 @@ import scala.collection.immutable.NumericRange
 //#4658
 object Test {
 
+  // Only works for Int values!  Need to rethink explicit otherwise.
   case class R(start: Int, end: Int, step: Int = 1, inclusive: Boolean = true)
 
   val rangeData = Array(
@@ -28,6 +29,14 @@ object Test {
     numericLongRanges.foreach{range => println(range.sum)}
     println("BigIntRanges:")
     numericBigIntRanges.foreach{range => println(range.sum)}
+    println("BigInt agrees with Long: " + 
+      (numericLongRanges zip numericBigIntRanges).forall{ case (lr, bir) => lr.sum == bir.sum }
+    )
+    println("Long agrees with Int when rounded: " + 
+      (numericLongRanges zip numericIntRanges).forall{ case (lr, ir) => lr.sum.toInt == ir.sum }
+    )
+    println("Numeric Int agrees with Range: " +
+      (numericIntRanges zip ranges).forall{ case (ir, r) => ir.sum == r.sum }
+    )
   }
-
 }
\ No newline at end of file
diff --git a/test/files/run/t4671.check b/test/files/run/t4671.check
index 1640dac..b267bef 100644
--- a/test/files/run/t4671.check
+++ b/test/files/run/t4671.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> object o { val file = sys.props("partest.cwd") + "/t4671.scala" }
 defined object o
diff --git a/test/files/run/t4710.check b/test/files/run/t4710.check
index 0dd49df..5f90c68 100644
--- a/test/files/run/t4710.check
+++ b/test/files/run/t4710.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> def method : String = { implicit def f(s: Symbol) = "" ; 'symbol }
 warning: there was one feature warning; re-run with -feature for details
diff --git a/test/files/run/t4950.check b/test/files/run/t4950.check
deleted file mode 100644
index 3f3a302..0000000
--- a/test/files/run/t4950.check
+++ /dev/null
@@ -1,9 +0,0 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
-
-scala> val 1 = 2
-scala.MatchError: 2 (of class java.lang.Integer)
-
-scala> val List(1) = List(1)
-
-scala> :quit
diff --git a/test/files/run/t4950.scala b/test/files/run/t4950.scala
index cef0602..e34b2cf 100644
--- a/test/files/run/t4950.scala
+++ b/test/files/run/t4950.scala
@@ -1,12 +1,24 @@
-import scala.tools.partest.ReplTest
+import scala.tools.partest.SessionTest
+import scala.PartialFunction.{ cond => when }
+
+object Elision {
+  val elideMsg = """  ... \d+ elided""".r
+}
+
+object Test extends SessionTest {
+  import Elision._
 
-object Test extends ReplTest {
   // Filter out the abbreviated stacktrace "... X elided" 
   // because the number seems to differ between versions/platforms/...
-  override def show = eval() filterNot (_ contains "elided") foreach println
-  def code =
+  def elided(s: String) = when(s) { case elideMsg() => true }
+  override def eval() = super.eval() filterNot elided
+  def session =
 """
-val 1 = 2
-val List(1) = List(1)
+scala> val 1 = 2
+scala.MatchError: 2 (of class java.lang.Integer)
+
+scala> val List(1) = List(1)
+
+scala> :quit
 """
 }
diff --git a/test/files/run/t5072.check b/test/files/run/t5072.check
index ab34e49..586c0a6 100644
--- a/test/files/run/t5072.check
+++ b/test/files/run/t5072.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> class C
 defined class C
diff --git a/test/files/run/t5256d.check b/test/files/run/t5256d.check
index c2b4998..3cdcb57 100644
--- a/test/files/run/t5256d.check
+++ b/test/files/run/t5256d.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.reflect.runtime.universe._
 import scala.reflect.runtime.universe._
diff --git a/test/files/run/t5535.check b/test/files/run/t5535.check
index 84097cc..11d298c 100644
--- a/test/files/run/t5535.check
+++ b/test/files/run/t5535.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> def h()(i: Int) = 1 + i
 h: ()(i: Int)Int
diff --git a/test/files/run/t5537.check b/test/files/run/t5537.check
index 98265cc..bffa02f 100644
--- a/test/files/run/t5537.check
+++ b/test/files/run/t5537.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> List[Predef.type]()
 res0: List[scala.Predef.type] = List()
diff --git a/test/files/run/t5583.check b/test/files/run/t5583.check
index 32d285c..72ad898 100644
--- a/test/files/run/t5583.check
+++ b/test/files/run/t5583.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> var s = 0
 s: Int = 0
diff --git a/test/files/run/t5655.check b/test/files/run/t5655.check
index 4bbc54b..9191997 100644
--- a/test/files/run/t5655.check
+++ b/test/files/run/t5655.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> object x { def x={} }
 defined object x
@@ -8,19 +6,19 @@ scala> import x._
 import x._
 
 scala> x
-<console>:12: error: reference to x is ambiguous;
+<console>:16: error: reference to x is ambiguous;
 it is imported twice in the same scope by
 import x._
 and import x
-              x
-              ^
+       x
+       ^
 
 scala> x
-<console>:12: error: reference to x is ambiguous;
+<console>:16: error: reference to x is ambiguous;
 it is imported twice in the same scope by
 import x._
 and import x
-              x
-              ^
+       x
+       ^
 
 scala> :quit
diff --git a/test/files/run/t5699.check b/test/files/run/t5699.check
old mode 100755
new mode 100644
diff --git a/test/files/run/t5699.scala b/test/files/run/t5699.scala
old mode 100755
new mode 100644
index ec3b1d2..409bcd2
--- a/test/files/run/t5699.scala
+++ b/test/files/run/t5699.scala
@@ -1,21 +1,13 @@
-import scala.tools.partest.DirectTest
+import scala.tools.partest.ParserTest
 import scala.reflect.internal.util.BatchSourceFile
 
-object Test extends DirectTest {
+object Test extends ParserTest {
   // Java code
   override def code = """
     |public @interface MyAnnotation { String value(); }
   """.stripMargin
 
-  override def extraSettings: String = "-usejavacp -Ystop-after:typer -Xprint:parser"
-
-  override def show(): Unit = {
-    // redirect err to out, for logging
-    val prevErr = System.err
-    System.setErr(System.out)
-    compile()
-    System.setErr(prevErr)
-  }
+  override def extraSettings: String = "-usejavacp -Ystop-after:namer -Xprint:parser"
 
   override def newSources(sourceCodes: String*) = {
     assert(sourceCodes.size == 1)
diff --git a/test/files/run/t5717.scala b/test/files/run/t5717.scala
old mode 100755
new mode 100644
diff --git a/test/files/run/t5789.check b/test/files/run/t5789.check
index 193abfa..d286922 100644
--- a/test/files/run/t5789.check
+++ b/test/files/run/t5789.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> val n = 2
 n: Int = 2
diff --git a/test/files/run/t6086-repl.check b/test/files/run/t6086-repl.check
index b904f11..f022e84 100644
--- a/test/files/run/t6086-repl.check
+++ b/test/files/run/t6086-repl.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> case class X(s: String)
 defined class X
diff --git a/test/files/run/t6102.check b/test/files/run/t6102.check
index aa3e6cc..07378f5 100644
--- a/test/files/run/t6102.check
+++ b/test/files/run/t6102.check
@@ -28,5 +28,10 @@
 [running phase constopt on t6102.scala]
 #partest
 [running phase dce on t6102.scala]
+#partest !-Ybackend:GenBCode
 [running phase jvm on icode]
+#partest -Ybackend:GenBCode
+[running phase jvm on t6102.scala]
+[running phase jvm on t6102.scala]
+#partest
 hello
diff --git a/test/files/run/t6146b.check b/test/files/run/t6146b.check
index 6998873..11149c5 100644
--- a/test/files/run/t6146b.check
+++ b/test/files/run/t6146b.check
@@ -2,15 +2,11 @@ t6146b.scala:15: warning: match may not be exhaustive.
 It would fail on the following inputs: S2(), S3()
   def foo(f: F[Int]) = f match { case X.S1 => }
                        ^
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> :power
-** Power User mode enabled - BEEP WHIR GYVE **
-** :phase has been set to 'typer'.          **
-** scala.tools.nsc._ has been imported      **
-** global._, definitions._ also imported    **
-** Try  :help, :vals, power.<tab>           **
+Power mode enabled. :phase is at typer.
+import scala.tools.nsc._, intp.global._, definitions._
+Try :help or completions for vals._ and power._
 
 scala> val u = rootMirror.universe; import u._, language._
 u: $r.intp.global.type = <global>
diff --git a/test/files/run/t6187.check b/test/files/run/t6187.check
index 9a9e266..28bc7e3 100644
--- a/test/files/run/t6187.check
+++ b/test/files/run/t6187.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.language.experimental.macros, scala.reflect.macros.blackbox.Context
 import scala.language.experimental.macros
diff --git a/test/files/run/t6240-universe-code-gen.scala b/test/files/run/t6240-universe-code-gen.scala
index 9f7061e..60e1f76 100644
--- a/test/files/run/t6240-universe-code-gen.scala
+++ b/test/files/run/t6240-universe-code-gen.scala
@@ -13,8 +13,8 @@ object Test extends App {
           (sym.isMethod && sym.asMethod.isLazy)
        || sym.isModule
     )
-    val forcables = tp.members.sorted.filter(isLazyAccessorOrObject)
-    forcables.map {
+    val forceables = tp.members.sorted.filter(isLazyAccessorOrObject)
+    forceables.map {
       sym =>
         val path = s"$prefix.${sym.name}"
         "    " + (
diff --git a/test/files/run/t6273.check b/test/files/run/t6273.check
index 3b68280..6190ff2 100644
--- a/test/files/run/t6273.check
+++ b/test/files/run/t6273.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> val y = 55
 y: Int = 55
diff --git a/test/files/run/t6320.check b/test/files/run/t6320.check
index af7c865..08ef7fc 100644
--- a/test/files/run/t6320.check
+++ b/test/files/run/t6320.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.language.dynamics
 import scala.language.dynamics
diff --git a/test/files/run/t6329_repl.check b/test/files/run/t6329_repl.check
index ebb1aac..8909c47 100644
--- a/test/files/run/t6329_repl.check
+++ b/test/files/run/t6329_repl.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.reflect.classTag
 import scala.reflect.classTag
diff --git a/test/files/run/t6329_repl_bug.check b/test/files/run/t6329_repl_bug.check
index 84297a6..4b539f9 100644
--- a/test/files/run/t6329_repl_bug.check
+++ b/test/files/run/t6329_repl_bug.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.reflect.runtime.universe._
 import scala.reflect.runtime.universe._
diff --git a/test/files/run/t6381.check b/test/files/run/t6381.check
index 49c6a78..c66eb4c 100644
--- a/test/files/run/t6381.check
+++ b/test/files/run/t6381.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.language.experimental.macros
 import scala.language.experimental.macros
diff --git a/test/files/run/t6434.check b/test/files/run/t6434.check
index 0a75ae2..1f123ee 100644
--- a/test/files/run/t6434.check
+++ b/test/files/run/t6434.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> def f(x: => Int): Int = x
 f: (x: => Int)Int
diff --git a/test/files/run/t6439.check b/test/files/run/t6439.check
index c4b7591..dd7ba9f 100644
--- a/test/files/run/t6439.check
+++ b/test/files/run/t6439.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> class A
 defined class A
@@ -50,11 +48,9 @@ scala> type F = Int // no warn
 defined type alias F
 
 scala> :power
-** Power User mode enabled - BEEP WHIR GYVE **
-** :phase has been set to 'typer'.          **
-** scala.tools.nsc._ has been imported      **
-** global._, definitions._ also imported    **
-** Try  :help, :vals, power.<tab>           **
+Power mode enabled. :phase is at typer.
+import scala.tools.nsc._, intp.global._, definitions._
+Try :help or completions for vals._ and power._
 
 scala> object lookup {
   import intp._
diff --git a/test/files/run/t6440b.scala b/test/files/run/t6440b.scala
index 974aca2..7ab9529 100644
--- a/test/files/run/t6440b.scala
+++ b/test/files/run/t6440b.scala
@@ -35,7 +35,7 @@ object Test extends StoreReporterDirectTest {
   def app2 = """
     package pack3
     object Test {
-      pack2.V.u.t // we have to fail if T.class is misisng
+      pack2.V.u.t // we have to fail if T.class is missing
     }
   """
 
diff --git a/test/files/run/t6502.scala b/test/files/run/t6502.scala
index 52fabef..f4fc39a 100644
--- a/test/files/run/t6502.scala
+++ b/test/files/run/t6502.scala
@@ -1,11 +1,14 @@
 import scala.tools.nsc.Settings
-import scala.tools.nsc.interpreter.ILoop
+import scala.tools.nsc.interpreter.{ ILoop, replProps }
 import scala.tools.nsc.settings.ClassPathRepresentationType
 import scala.tools.partest._
 
 object Test extends StoreReporterDirectTest {
   def code = ???
 
+  lazy val headerLength = replProps.welcome.lines.size
+  lazy val promptLength = replProps.prompt.lines.size - 1  // extra newlines
+
   def compileCode(code: String, jarFileName: String) = {
     val classpath = List(sys.props("partest.lib"), testOutput.path) mkString sys.props("path.separator")
     compileString(newCompiler("-cp", classpath, "-d", s"${testOutput.path}/$jarFileName"))(code)
@@ -56,14 +59,21 @@ object Test extends StoreReporterDirectTest {
     val jar = "test1.jar"
     compileCode(app1, jar)
 
-    val codeToRun = toCodeInSeparateLines(s":require ${testOutput.path}/$jar", "test.Test.test()")
+    val codeToRun = s"""
+      |:require ${testOutput.path}/$jar
+      |test.Test.test()
+      |""".stripMargin.trim
     val output = ILoop.run(codeToRun, settings)
-    val lines  = output.split("\n")
-    assert {
-      lines(4).contains("Added") && lines(4).contains("test1.jar")
-    }
+    var lines  = output.lines.drop(headerLength)
+    lines      = lines drop promptLength
+    val added  = lines.next
+    assert (
+      added.contains("Added") && added.contains("test1.jar"),
+      s"[${added}] in [${output.lines.mkString("/")}]"
+    )
+    lines      = lines drop promptLength
     assert {
-      lines(lines.length-3).contains("testing...")
+      lines.next.contains("testing...")
     }
   }
 
@@ -73,14 +83,21 @@ object Test extends StoreReporterDirectTest {
     val jar2 = "test2.jar"
     compileCode(app2, jar2)
 
-    val codeToRun = toCodeInSeparateLines(s":require ${testOutput.path}/$jar1", s":require ${testOutput.path}/$jar2")
+    val codeToRun = s"""
+      |:require ${testOutput.path}/$jar1
+      |:require ${testOutput.path}/$jar2
+      |""".stripMargin.trim
     val output = ILoop.run(codeToRun, settings)
-    val lines  = output.split("\n")
+    var lines  = output.lines.drop(headerLength)
+    lines      = lines drop promptLength
+    val added  = lines.next
     assert {
-      lines(4).contains("Added") && lines(4).contains("test1.jar")
+      added.contains("Added") && added.contains("test1.jar")
     }
+    lines      = lines drop promptLength
+    val msg    = lines.next
     assert {
-      lines(lines.length-3).contains("test2.jar") && lines(lines.length-3).contains("existing classpath entries conflict")
+      msg.contains("test2.jar") && msg.contains("existing classpath entries conflict")
     }
   }
 
@@ -90,28 +107,42 @@ object Test extends StoreReporterDirectTest {
     val jar3 = "test3.jar"
     compileCode(app3, jar3)
 
-    val codeToRun = toCodeInSeparateLines(s":require ${testOutput.path}/$jar1", s":require ${testOutput.path}/$jar3", "test.Test3.test()")
+    val codeToRun = s"""
+      |:require ${testOutput.path}/$jar1
+      |:require ${testOutput.path}/$jar3
+      |test.Test3.test()
+      |""".stripMargin.trim
     val output = ILoop.run(codeToRun, settings)
-    val lines  = output.split("\n")
+    var lines  = output.lines.drop(headerLength)
+    lines      = lines drop promptLength
+    val added  = lines.next
     assert {
-      lines(4).contains("Added") && lines(4).contains("test1.jar")
+      added.contains("Added") && added.contains("test1.jar")
     }
+    lines      = lines drop (2 * promptLength + 1)
     assert {
-      lines(lines.length-3).contains("new object in existing package")
+      lines.next.contains("new object in existing package")
     }
   }
 
   def test4(): Unit = {
     // twice the same jar should be rejected
     val jar1   = "test1.jar"
-    val codeToRun = toCodeInSeparateLines(s":require ${testOutput.path}/$jar1", s":require ${testOutput.path}/$jar1")
+    val codeToRun = s"""
+      |:require ${testOutput.path}/$jar1
+      |:require ${testOutput.path}/$jar1
+      |""".stripMargin.trim
     val output = ILoop.run(codeToRun, settings)
-    val lines  = output.split("\n")
+    var lines  = output.lines.drop(headerLength)
+    lines      = lines drop promptLength
+    val added  = lines.next
     assert {
-      lines(4).contains("Added") && lines(4).contains("test1.jar")
+      added.contains("Added") && added.contains("test1.jar")
     }
+    lines      = lines drop promptLength
+    val msg    = lines.next
     assert {
-      lines(lines.length-3).contains("test1.jar") && lines(lines.length-3).contains("existing classpath entries conflict")
+      msg.contains("test1.jar") && msg.contains("existing classpath entries conflict")
     }
   }
 
@@ -123,11 +154,14 @@ object Test extends StoreReporterDirectTest {
   }
 
   def test6(): Unit = {
-    // Avoid java.lang.NoClassDefFoundError triggered by the old appoach of using a Java
+    // Avoid java.lang.NoClassDefFoundError triggered by the old approach of using a Java
     // classloader to parse .class files in order to read their names.
     val jar = "test6.jar"
     compileCode(app6, jar)
-    val codeToRun = toCodeInSeparateLines(s":require ${testOutput.path}/$jar", "import test6._; new A; new Z")
+    val codeToRun = s"""
+      |:require ${testOutput.path}/$jar
+      |import test6._; new A; new Z
+      |""".stripMargin.trim
     val output = ILoop.run(codeToRun, settings)
     assert(output.contains("created test6.A"), output)
     assert(output.contains("created test6.Z"), output)
@@ -141,6 +175,4 @@ object Test extends StoreReporterDirectTest {
     test5()
     test6()
   }
-
-  def toCodeInSeparateLines(lines: String*): String = lines mkString "\n"
 }
diff --git a/test/files/run/t6507.check b/test/files/run/t6507.check
index 5da4aa3..75cf392 100644
--- a/test/files/run/t6507.check
+++ b/test/files/run/t6507.check
@@ -1,8 +1,5 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> :silent
-Switched off result printing.
 
 scala> class A { override def toString() = { println("!"); "A" } }
 
@@ -15,7 +12,6 @@ scala> b = new A
 scala> new A
 
 scala> :silent
-Switched on result printing.
 
 scala> res0
 !
diff --git a/test/files/run/t6549.check b/test/files/run/t6549.check
index be34459..00203d5 100644
--- a/test/files/run/t6549.check
+++ b/test/files/run/t6549.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> case class `X"`(var xxx: Any)
 defined class X$u0022
diff --git a/test/files/run/t6937.check b/test/files/run/t6937.check
index 5c5d448..b7b2f45 100644
--- a/test/files/run/t6937.check
+++ b/test/files/run/t6937.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.reflect.runtime.{universe => ru}
 import scala.reflect.runtime.{universe=>ru}
diff --git a/test/files/run/t7096.scala b/test/files/run/t7096.scala
index 872562d..f723d70 100644
--- a/test/files/run/t7096.scala
+++ b/test/files/run/t7096.scala
@@ -1,5 +1,5 @@
 /*
- * filter: inliner warning; re-run with -Yinline-warnings for details
+ * filter: inliner warning; re-run with
  */
 import scala.tools.partest._
 import scala.tools.nsc._
diff --git a/test/files/run/t7185.check b/test/files/run/t7185.check
index e4f80a8..6b7fbaf 100644
--- a/test/files/run/t7185.check
+++ b/test/files/run/t7185.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> import scala.tools.reflect.ToolBox
 import scala.tools.reflect.ToolBox
diff --git a/test/files/run/t720.scala b/test/files/run/t720.scala
new file mode 100644
index 0000000..a5cb249
--- /dev/null
+++ b/test/files/run/t720.scala
@@ -0,0 +1,48 @@
+class Lazy(f: => Int) {
+  lazy val get: Int = f
+}
+
+class UsedLater(f: => Int) {
+  lazy val get: Int = f
+  def other = f
+}
+
+class TransientLazy(f: => Int) {
+  @transient
+  lazy val get: Int = f
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    testLazy()
+    testUsedLater()
+  }
+
+  def testLazy() {
+    val o = new Lazy("".length)
+    val f = classOf[Lazy].getDeclaredField("f")
+    f.setAccessible(true)
+    assert(f.get(o) != null)
+    o.get
+    assert(f.get(o) == null)
+  }
+
+  def testUsedLater() {
+    val o = new UsedLater("".length)
+    val f = classOf[UsedLater].getDeclaredField("f")
+    f.setAccessible(true)
+    assert(f.get(o) != null)
+    o.get
+    assert(f.get(o) != null)
+  }
+
+  def testTransientLazy() {
+    val o = new TransientLazy("".length)
+    val f = classOf[TransientLazy].getDeclaredField("f")
+    f.setAccessible(true)
+    assert(f.get(o) != null)
+    o.get
+    assert(f.get(o) != null) // SI-9365
+  }
+}
+
diff --git a/test/files/run/t7214.scala b/test/files/run/t7214.scala
index 15c2c24..b2ef53e 100644
--- a/test/files/run/t7214.scala
+++ b/test/files/run/t7214.scala
@@ -1,4 +1,4 @@
-// pattern matcher crashes here trying to synthesize an uneeded outer test.
+// pattern matcher crashes here trying to synthesize an unneeded outer test.
 //     no-symbol does not have an owner
 // at scala.reflect.internal.SymbolTable.abort(SymbolTable.scala:49)
 // at scala.tools.nsc.Global.abort(Global.scala:253)
diff --git a/test/files/run/t7246.check b/test/files/run/t7246.check
old mode 100755
new mode 100644
diff --git a/test/files/run/t7246/Outer.java b/test/files/run/t7246/Outer.java
old mode 100755
new mode 100644
diff --git a/test/files/run/t7246/Test.scala b/test/files/run/t7246/Test.scala
old mode 100755
new mode 100644
diff --git a/test/files/run/t7246b.check b/test/files/run/t7246b.check
old mode 100755
new mode 100644
diff --git a/test/files/run/t7246b/Base.scala b/test/files/run/t7246b/Base.scala
old mode 100755
new mode 100644
diff --git a/test/files/run/t7246b/Outer.java b/test/files/run/t7246b/Outer.java
old mode 100755
new mode 100644
diff --git a/test/files/run/t7246b/Test.scala b/test/files/run/t7246b/Test.scala
old mode 100755
new mode 100644
diff --git a/test/files/run/t7319.check b/test/files/run/t7319.check
index e35cfc9..4d8429e 100644
--- a/test/files/run/t7319.check
+++ b/test/files/run/t7319.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> class M[A]
 defined class M
@@ -17,25 +15,25 @@ warning: there was one feature warning; re-run with -feature for details
 convert: [F[X <: F[X]]](builder: F[_ <: F[_]])Int
 
 scala> convert(Some[Int](0))
-<console>:12: error: no type parameters for method convert: (builder: F[_ <: F[_]])Int exist so that it can be applied to arguments (Some[Int])
+<console>:16: error: no type parameters for method convert: (builder: F[_ <: F[_]])Int exist so that it can be applied to arguments (Some[Int])
  --- because ---
 argument expression's type is not compatible with formal parameter type;
  found   : Some[Int]
  required: ?F[_$1] forSome { type _$1 <: ?F[_$2] forSome { type _$2 } }
-              convert(Some[Int](0))
-              ^
-<console>:12: error: type mismatch;
+       convert(Some[Int](0))
+       ^
+<console>:16: error: type mismatch;
  found   : Some[Int]
  required: F[_ <: F[_]]
-              convert(Some[Int](0))
-                               ^
+       convert(Some[Int](0))
+                        ^
 
 scala> Range(1,2).toArray: Seq[_]
-<console>:11: error: polymorphic expression cannot be instantiated to expected type;
+<console>:15: error: polymorphic expression cannot be instantiated to expected type;
  found   : [B >: Int]Array[B]
  required: Seq[_]
-              Range(1,2).toArray: Seq[_]
-                         ^
+       Range(1,2).toArray: Seq[_]
+                  ^
 
 scala> 0
 res2: Int = 0
diff --git a/test/files/run/t7341.flags b/test/files/run/t7341.flags
old mode 100755
new mode 100644
diff --git a/test/files/run/t7341.scala b/test/files/run/t7341.scala
old mode 100755
new mode 100644
diff --git a/test/files/run/t7407.flags b/test/files/run/t7407.flags
index be4ef07..ffc65f4 100644
--- a/test/files/run/t7407.flags
+++ b/test/files/run/t7407.flags
@@ -1 +1 @@
--Ynooptimise -Yopt:l:none -Ybackend:GenBCode
+-Yopt:l:none -Ybackend:GenBCode
diff --git a/test/files/run/t7407b.flags b/test/files/run/t7407b.flags
index c8547a2..c30091d 100644
--- a/test/files/run/t7407b.flags
+++ b/test/files/run/t7407b.flags
@@ -1 +1 @@
--Ynooptimise -Ybackend:GenBCode
+-Ybackend:GenBCode
diff --git a/test/files/run/t7482a.check b/test/files/run/t7482a.check
index a21ef7b..1120bb0 100644
--- a/test/files/run/t7482a.check
+++ b/test/files/run/t7482a.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> val v: java.util.ArrayList[String] = new java.util.ArrayList[String](5)
 v: java.util.ArrayList[String] = []
diff --git a/test/files/run/t7582.check b/test/files/run/t7582.check
index cd951d8..0cfbf08 100644
--- a/test/files/run/t7582.check
+++ b/test/files/run/t7582.check
@@ -1,2 +1 @@
-warning: there was one inliner warning; re-run with -Yinline-warnings for details
 2
diff --git a/test/files/run/t7582/InlineHolder.scala b/test/files/run/t7582/InlineHolder.scala
index a18b9ef..3cbf233 100644
--- a/test/files/run/t7582/InlineHolder.scala
+++ b/test/files/run/t7582/InlineHolder.scala
@@ -1,3 +1,6 @@
+/*
+ * filter: inliner warning; re-run with
+ */
 package p1 {
   object InlineHolder {
     @inline def inlinable = p1.PackageProtectedJava.protectedMethod() + 1
diff --git a/test/files/run/t7582b.check b/test/files/run/t7582b.check
index cd951d8..0cfbf08 100644
--- a/test/files/run/t7582b.check
+++ b/test/files/run/t7582b.check
@@ -1,2 +1 @@
-warning: there was one inliner warning; re-run with -Yinline-warnings for details
 2
diff --git a/test/files/run/t7582b/InlineHolder.scala b/test/files/run/t7582b/InlineHolder.scala
index a18b9ef..3cbf233 100644
--- a/test/files/run/t7582b/InlineHolder.scala
+++ b/test/files/run/t7582b/InlineHolder.scala
@@ -1,3 +1,6 @@
+/*
+ * filter: inliner warning; re-run with
+ */
 package p1 {
   object InlineHolder {
     @inline def inlinable = p1.PackageProtectedJava.protectedMethod() + 1
diff --git a/test/files/run/t7634.check b/test/files/run/t7634.check
index 9c6b8b4..43128ca 100644
--- a/test/files/run/t7634.check
+++ b/test/files/run/t7634.check
@@ -1,8 +1,6 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 
-scala> .lines
-res1: List[String] = List(shello, world.)
+scala> .lines.foreach(println)
+shello, world.
 
 scala> :quit
diff --git a/test/files/run/t7634.scala b/test/files/run/t7634.scala
index aeb6a5e..9520931 100644
--- a/test/files/run/t7634.scala
+++ b/test/files/run/t7634.scala
@@ -9,7 +9,7 @@ import scala.util.Properties.propOrElse
 object Test extends ReplTest {
   def java = propOrElse("javacmd", "java")
   def code = s""":sh $java -classpath $testOutput hello.Hello
-                |.lines""".stripMargin
+                |.lines.foreach(println)""".stripMargin
 }
 
 package hello {
diff --git a/test/files/run/t7741a/GroovyInterface$1Dump.java b/test/files/run/t7741a/GroovyInterface$1Dump.java
new file mode 100644
index 0000000..0c0eab3
--- /dev/null
+++ b/test/files/run/t7741a/GroovyInterface$1Dump.java
@@ -0,0 +1,222 @@
+import java.util.*;
+import scala.tools.asm.*;
+
+// generated with
+//    git clone alewando/scala_groovy_interop
+//    SCALA_HOME=... GROOVY_HOME=... ant
+//    cd /code/scala2
+//    java  -classpath build/asm/classes:/Users/jason/code/scala_groovy_interop/classes:/code/scala2/build/pack/lib/scala-library.jar:/usr/local/Cellar/groovy/2.4.1/libexec/embeddable/groovy-all-2.4.1.jar scala.tools.asm.util.ASMifier 'GroovyInterface$1'
+//    java  -classpath build/asm/classes:/Users/jason/code/scala_groovy_interop/classes:/code/scala2/build/pack/lib/scala-library.jar:/usr/local/Cellar/groovy/2.4.1/libexec/embeddable/groovy-all-2.4.1.jar scala.tools.asm.util.ASMifier 'GroovyInterface$1'
+public class GroovyInterface$1Dump implements Opcodes {
+
+    public static byte[] dump () throws Exception {
+
+        ClassWriter cw = new ClassWriter(0);
+        FieldVisitor fv;
+        MethodVisitor mv;
+        AnnotationVisitor av0;
+
+        cw.visit(V1_5, ACC_SUPER + ACC_SYNTHETIC, "GroovyInterface$1", null, "java/lang/Object", new String[] {});
+
+        cw.visitInnerClass("GroovyInterface$1", "GroovyInterface", "1", ACC_SYNTHETIC);
+
+        {
+            fv = cw.visitField(ACC_STATIC + ACC_SYNTHETIC, "$class$GroovyInterface", "Ljava/lang/Class;", null, null);
+            fv.visitEnd();
+        }
+        {
+            fv = cw.visitField(ACC_PRIVATE + ACC_STATIC + ACC_SYNTHETIC, "$staticClassInfo", "Lorg/codehaus/groovy/reflection/ClassInfo;", null, null);
+            fv.visitEnd();
+        }
+        {
+            fv = cw.visitField(ACC_PUBLIC + ACC_STATIC + ACC_TRANSIENT + ACC_SYNTHETIC, "__$stMC", "Z", null, null);
+            fv.visitEnd();
+        }
+        {
+            fv = cw.visitField(ACC_PRIVATE + ACC_TRANSIENT + ACC_SYNTHETIC, "metaClass", "Lgroovy/lang/MetaClass;", null, null);
+            fv.visitEnd();
+        }
+        {
+            fv = cw.visitField(ACC_PRIVATE + ACC_STATIC + ACC_SYNTHETIC, "$callSiteArray", "Ljava/lang/ref/SoftReference;", null, null);
+            fv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+            mv.visitCode();
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+            mv.visitMethodInsn(INVOKESTATIC, "GroovyInterface$1", "$getCallSiteArray", "()[Lorg/codehaus/groovy/runtime/callsite/CallSite;", false);
+            mv.visitVarInsn(ASTORE, 1);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKEVIRTUAL, "GroovyInterface$1", "$getStaticMetaClass", "()Lgroovy/lang/MetaClass;", false);
+            mv.visitVarInsn(ASTORE, 2);
+            mv.visitVarInsn(ALOAD, 2);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitInsn(SWAP);
+            mv.visitFieldInsn(PUTFIELD, "GroovyInterface$1", "metaClass", "Lgroovy/lang/MetaClass;");
+            mv.visitVarInsn(ALOAD, 2);
+            mv.visitInsn(POP);
+            mv.visitInsn(RETURN);
+            mv.visitMaxs(2, 3);
+            mv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_PROTECTED + ACC_SYNTHETIC, "$getStaticMetaClass", "()Lgroovy/lang/MetaClass;", null, null);
+            mv.visitCode();
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+            mv.visitLdcInsn(Type.getType("LGroovyInterface$1;"));
+            Label l0 = new Label();
+            mv.visitJumpInsn(IF_ACMPEQ, l0);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKESTATIC, "org/codehaus/groovy/runtime/ScriptBytecodeAdapter", "initMetaClass", "(Ljava/lang/Object;)Lgroovy/lang/MetaClass;", false);
+            mv.visitInsn(ARETURN);
+            mv.visitLabel(l0);
+            mv.visitFieldInsn(GETSTATIC, "GroovyInterface$1", "$staticClassInfo", "Lorg/codehaus/groovy/reflection/ClassInfo;");
+            mv.visitVarInsn(ASTORE, 1);
+            mv.visitVarInsn(ALOAD, 1);
+            Label l1 = new Label();
+            mv.visitJumpInsn(IFNONNULL, l1);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+            mv.visitMethodInsn(INVOKESTATIC, "org/codehaus/groovy/reflection/ClassInfo", "getClassInfo", "(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;", false);
+            mv.visitInsn(DUP);
+            mv.visitVarInsn(ASTORE, 1);
+            mv.visitFieldInsn(PUTSTATIC, "GroovyInterface$1", "$staticClassInfo", "Lorg/codehaus/groovy/reflection/ClassInfo;");
+            mv.visitLabel(l1);
+            mv.visitVarInsn(ALOAD, 1);
+            mv.visitMethodInsn(INVOKEVIRTUAL, "org/codehaus/groovy/reflection/ClassInfo", "getMetaClass", "()Lgroovy/lang/MetaClass;", false);
+            mv.visitInsn(ARETURN);
+            mv.visitMaxs(2, 2);
+            mv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_PUBLIC + ACC_SYNTHETIC, "getMetaClass", "()Lgroovy/lang/MetaClass;", null, null);
+            mv.visitCode();
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitFieldInsn(GETFIELD, "GroovyInterface$1", "metaClass", "Lgroovy/lang/MetaClass;");
+            mv.visitInsn(DUP);
+            Label l0 = new Label();
+            mv.visitJumpInsn(IFNULL, l0);
+            mv.visitInsn(ARETURN);
+            mv.visitLabel(l0);
+            mv.visitInsn(POP);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitInsn(DUP);
+            mv.visitMethodInsn(INVOKEVIRTUAL, "GroovyInterface$1", "$getStaticMetaClass", "()Lgroovy/lang/MetaClass;", false);
+            mv.visitFieldInsn(PUTFIELD, "GroovyInterface$1", "metaClass", "Lgroovy/lang/MetaClass;");
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitFieldInsn(GETFIELD, "GroovyInterface$1", "metaClass", "Lgroovy/lang/MetaClass;");
+            mv.visitInsn(ARETURN);
+            mv.visitMaxs(2, 1);
+            mv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_PUBLIC + ACC_SYNTHETIC, "setMetaClass", "(Lgroovy/lang/MetaClass;)V", null, null);
+            mv.visitCode();
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitVarInsn(ALOAD, 1);
+            mv.visitFieldInsn(PUTFIELD, "GroovyInterface$1", "metaClass", "Lgroovy/lang/MetaClass;");
+            mv.visitInsn(RETURN);
+            mv.visitMaxs(2, 2);
+            mv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_PUBLIC + ACC_SYNTHETIC, "invokeMethod", "(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;", null, null);
+            mv.visitCode();
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKEVIRTUAL, "GroovyInterface$1", "getMetaClass", "()Lgroovy/lang/MetaClass;", false);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitVarInsn(ALOAD, 1);
+            mv.visitVarInsn(ALOAD, 2);
+            mv.visitMethodInsn(INVOKEINTERFACE, "groovy/lang/MetaClass", "invokeMethod", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;", true);
+            mv.visitInsn(ARETURN);
+            mv.visitMaxs(4, 3);
+            mv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_PUBLIC + ACC_SYNTHETIC, "getProperty", "(Ljava/lang/String;)Ljava/lang/Object;", null, null);
+            mv.visitCode();
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKEVIRTUAL, "GroovyInterface$1", "getMetaClass", "()Lgroovy/lang/MetaClass;", false);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitVarInsn(ALOAD, 1);
+            mv.visitMethodInsn(INVOKEINTERFACE, "groovy/lang/MetaClass", "getProperty", "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;", true);
+            mv.visitInsn(ARETURN);
+            mv.visitMaxs(3, 2);
+            mv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_PUBLIC + ACC_SYNTHETIC, "setProperty", "(Ljava/lang/String;Ljava/lang/Object;)V", null, null);
+            mv.visitCode();
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKEVIRTUAL, "GroovyInterface$1", "getMetaClass", "()Lgroovy/lang/MetaClass;", false);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitVarInsn(ALOAD, 1);
+            mv.visitVarInsn(ALOAD, 2);
+            mv.visitMethodInsn(INVOKEINTERFACE, "groovy/lang/MetaClass", "setProperty", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V", true);
+            mv.visitInsn(RETURN);
+            mv.visitMaxs(4, 3);
+            mv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
+            mv.visitCode();
+            mv.visitLdcInsn(Type.getType("LGroovyInterface;"));
+            mv.visitVarInsn(ASTORE, 0);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitFieldInsn(PUTSTATIC, "GroovyInterface$1", "$class$GroovyInterface", "Ljava/lang/Class;");
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitInsn(POP);
+            mv.visitInsn(RETURN);
+            mv.visitMaxs(1, 1);
+            mv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_PRIVATE + ACC_STATIC + ACC_SYNTHETIC, "$createCallSiteArray", "()Lorg/codehaus/groovy/runtime/callsite/CallSiteArray;", null, null);
+            mv.visitCode();
+            mv.visitLdcInsn(new Integer(0));
+            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
+            mv.visitVarInsn(ASTORE, 0);
+            mv.visitTypeInsn(NEW, "org/codehaus/groovy/runtime/callsite/CallSiteArray");
+            mv.visitInsn(DUP);
+            mv.visitLdcInsn(Type.getType("LGroovyInterface$1;"));
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKESPECIAL, "org/codehaus/groovy/runtime/callsite/CallSiteArray", "<init>", "(Ljava/lang/Class;[Ljava/lang/String;)V", false);
+            mv.visitInsn(ARETURN);
+            mv.visitMaxs(4, 1);
+            mv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC + ACC_SYNTHETIC, "$getCallSiteArray", "()[Lorg/codehaus/groovy/runtime/callsite/CallSite;", null, null);
+            mv.visitCode();
+            mv.visitFieldInsn(GETSTATIC, "GroovyInterface$1", "$callSiteArray", "Ljava/lang/ref/SoftReference;");
+            Label l0 = new Label();
+            mv.visitJumpInsn(IFNULL, l0);
+            mv.visitFieldInsn(GETSTATIC, "GroovyInterface$1", "$callSiteArray", "Ljava/lang/ref/SoftReference;");
+            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/ref/SoftReference", "get", "()Ljava/lang/Object;", false);
+            mv.visitTypeInsn(CHECKCAST, "org/codehaus/groovy/runtime/callsite/CallSiteArray");
+            mv.visitInsn(DUP);
+            mv.visitVarInsn(ASTORE, 0);
+            Label l1 = new Label();
+            mv.visitJumpInsn(IFNONNULL, l1);
+            mv.visitLabel(l0);
+            mv.visitMethodInsn(INVOKESTATIC, "GroovyInterface$1", "$createCallSiteArray", "()Lorg/codehaus/groovy/runtime/callsite/CallSiteArray;", false);
+            mv.visitVarInsn(ASTORE, 0);
+            mv.visitTypeInsn(NEW, "java/lang/ref/SoftReference");
+            mv.visitInsn(DUP);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/ref/SoftReference", "<init>", "(Ljava/lang/Object;)V", false);
+            mv.visitFieldInsn(PUTSTATIC, "GroovyInterface$1", "$callSiteArray", "Ljava/lang/ref/SoftReference;");
+            mv.visitLabel(l1);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitFieldInsn(GETFIELD, "org/codehaus/groovy/runtime/callsite/CallSiteArray", "array", "[Lorg/codehaus/groovy/runtime/callsite/CallSite;");
+            mv.visitInsn(ARETURN);
+            mv.visitMaxs(3, 1);
+            mv.visitEnd();
+        }
+        cw.visitEnd();
+
+        return cw.toByteArray();
+    }
+}
diff --git a/test/files/run/t7741a/GroovyInterfaceDump.java b/test/files/run/t7741a/GroovyInterfaceDump.java
new file mode 100644
index 0000000..87c09e2
--- /dev/null
+++ b/test/files/run/t7741a/GroovyInterfaceDump.java
@@ -0,0 +1,51 @@
+import java.util.*;
+import scala.tools.asm.*;
+
+// generated with
+//    git clone alewando/scala_groovy_interop
+//    SCALA_HOME=... GROOVY_HOME=... ant
+//    cd /code/scala2
+//    java  -classpath build/asm/classes:/Users/jason/code/scala_groovy_interop/classes:/code/scala2/build/pack/lib/scala-library.jar:/usr/local/Cellar/groovy/2.4.1/libexec/embeddable/groovy-all-2.4.1.jar scala.tools.asm.util.ASMifier 'GroovyInterface$1'
+//    java  -classpath build/asm/classes:/Users/jason/code/scala_groovy_interop/classes:/code/scala2/build/pack/lib/scala-library.jar:/usr/local/Cellar/groovy/2.4.1/libexec/embeddable/groovy-all-2.4.1.jar scala.tools.asm.util.ASMifier 'GroovyInterface$1'
+public class GroovyInterfaceDump implements Opcodes {
+
+    public static byte[] dump () throws Exception {
+
+        ClassWriter cw = new ClassWriter(0);
+        FieldVisitor fv;
+        MethodVisitor mv;
+        AnnotationVisitor av0;
+
+        cw.visit(V1_5, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE, "GroovyInterface", null, "java/lang/Object", null);
+
+        cw.visitInnerClass("GroovyInterface$1", "GroovyInterface", "1", ACC_SYNTHETIC);
+
+        cw.visitInnerClass("GroovyInterface$__clinit__closure1", null, null, 0);
+
+        {
+            fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "closure", "Ljava/lang/Object;", null, null);
+            fv.visitEnd();
+        }
+        {
+            mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
+            mv.visitCode();
+            mv.visitTypeInsn(NEW, "GroovyInterface$__clinit__closure1");
+            mv.visitInsn(DUP);
+            mv.visitFieldInsn(GETSTATIC, "GroovyInterface$1", "$class$GroovyInterface", "Ljava/lang/Class;");
+            mv.visitFieldInsn(GETSTATIC, "GroovyInterface$1", "$class$GroovyInterface", "Ljava/lang/Class;");
+            mv.visitMethodInsn(INVOKESPECIAL, "GroovyInterface$__clinit__closure1", "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V", false);
+            mv.visitVarInsn(ASTORE, 0);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitFieldInsn(PUTSTATIC, "GroovyInterface", "closure", "Ljava/lang/Object;");
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitInsn(POP);
+            mv.visitInsn(RETURN);
+            mv.visitMaxs(4, 1);
+            mv.visitEnd();
+        }
+        cw.visitEnd();
+
+        return cw.toByteArray();
+    }
+}
+
diff --git a/test/files/run/t7741a/Test.scala b/test/files/run/t7741a/Test.scala
new file mode 100644
index 0000000..cdba1cc
--- /dev/null
+++ b/test/files/run/t7741a/Test.scala
@@ -0,0 +1,47 @@
+import java.io.{ByteArrayInputStream, FileOutputStream, BufferedOutputStream}
+import java.util
+
+import java.io.File
+
+import scala.tools.partest.DirectTest
+
+object Test extends DirectTest {
+
+  def code = ""
+
+  override def show(): Unit = {
+
+    val class1: Array[Byte] = GroovyInterfaceDump.dump()
+    val class2: Array[Byte] = GroovyInterface$1Dump.dump()
+    def writeFile(contents: Array[Byte], f: java.io.File): Unit = {
+      val out = new BufferedOutputStream(new FileOutputStream(f))
+      try {
+        out.write(contents)
+      } finally out.close()
+    }
+
+    val outdir = testOutput.jfile
+
+    // interface GroovyInterface {
+    //
+    //   // This is the line that causes scalac to choke.
+    //   // It results in a GroovyInterface$1 class, which is a non-static inner class but its constructor does not
+    //   // include the implicit parameter that is the immediate enclosing instance.
+    //   // See http://jira.codehaus.org/browse/GROOVY-7312
+    //   //
+    //   // Scalac error:
+    //   //   [scalac] error: error while loading 1, class file '..../scala_groovy_interop/classes/com/example/groovy/GroovyInterface$1.class' is broken
+    //   //   [scalac] (class java.util.NoSuchElementException/head of empty list)
+    //   final static def closure = { x -> "banana" }
+    //
+    // }
+    writeFile(GroovyInterfaceDump.dump(), new File(outdir, "GroovyInterface.class"))
+    writeFile(GroovyInterface$1Dump.dump(), new File(outdir, "GroovyInterface$1.class"))
+    compileCode("object Test { def foo(g: GroovyInterface) = g.toString }")
+  }
+
+  def compileCode(code: String) = {
+    val classpath = List(sys.props("partest.lib"), testOutput.path) mkString sys.props("path.separator")
+    compileString(newCompiler("-cp", classpath, "-d", testOutput.path))(code)
+  }
+}
diff --git a/test/files/run/t7741b.check b/test/files/run/t7741b.check
new file mode 100644
index 0000000..a19e54a
--- /dev/null
+++ b/test/files/run/t7741b.check
@@ -0,0 +1,3 @@
+1. Don't refer to Inner
+2. Refering to Inner
+pos: NoPosition Class file for HasInner$Inner not found ERROR
diff --git a/test/files/run/t7741b/HasInner.java b/test/files/run/t7741b/HasInner.java
new file mode 100644
index 0000000..a1d0d0d
--- /dev/null
+++ b/test/files/run/t7741b/HasInner.java
@@ -0,0 +1,3 @@
+class HasInner {
+    class Inner {}
+}
diff --git a/test/files/run/t7741b/Test.scala b/test/files/run/t7741b/Test.scala
new file mode 100644
index 0000000..569ae6b
--- /dev/null
+++ b/test/files/run/t7741b/Test.scala
@@ -0,0 +1,29 @@
+import java.io.File
+
+import scala.tools.partest.StoreReporterDirectTest
+
+object Test extends StoreReporterDirectTest {
+
+  def code = ""
+
+  override def show(): Unit = {
+    deleteClass("HasInner$Inner")
+    println("1. Don't refer to Inner")
+    compileCode("class Test { def test(x: HasInner) = x }")
+    assert(filteredInfos.isEmpty, filteredInfos)
+    println("2. Refering to Inner")
+    compileCode("class Test { def test(x: HasInner#Inner) = x }")
+    println(filteredInfos.mkString("\n"))
+  }
+
+  def deleteClass(name: String) {
+    val classFile = new File(testOutput.path, name + ".class")
+    assert(classFile.exists)
+    assert(classFile.delete())
+  }
+
+  def compileCode(code: String) = {
+    val classpath = List(sys.props("partest.lib"), testOutput.path) mkString sys.props("path.separator")
+    compileString(newCompiler("-cp", classpath, "-d", testOutput.path))(code)
+  }
+}
diff --git a/test/files/run/t7747-repl.check b/test/files/run/t7747-repl.check
index 105b238..d698ea6 100644
--- a/test/files/run/t7747-repl.check
+++ b/test/files/run/t7747-repl.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> var x = 10
 x: Int = 10
@@ -17,33 +15,33 @@ scala> val z = x * y
 z: Int = 156
 
 scala> 2 ; 3
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              2 ;;
-              ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       2 ;;
+       ^
 res0: Int = 3
 
 scala> { 2 ; 3 }
-<console>:8: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              { 2 ; 3 }
-                ^
+<console>:12: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       { 2 ; 3 }
+         ^
 res1: Int = 3
 
 scala> 5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
   1 +
   2 +
   3 } ; bippy+88+11
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
-              ^
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
-                  ^
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
-                                         ^
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
-                                                                                                ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
+       ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
+           ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
+                                  ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ; 10 ; case object Cow ; 20 ; class Moo { override def toString = "Moooooo" } ; 30 ; def bippy = {
+                                                                                         ^
 defined object Cow
 defined class Moo
 bippy: Int
@@ -83,12 +81,12 @@ scala>   (  (2 + 2 )  )
 res10: Int = 4
 
 scala> 5 ;   (  (2 + 2 )  ) ; ((5))
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ;   (  (2 + 2 )  ) ;;
-              ^
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              5 ;   (  (2 + 2 )  ) ;;
-                          ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ;   (  (2 + 2 )  ) ;;
+       ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       5 ;   (  (2 + 2 )  ) ;;
+                   ^
 res11: Int = 5
 
 scala> (((2 + 2)), ((2 + 2)))
@@ -103,18 +101,18 @@ res14: String = 4423
 scala> 
 
 scala> 55 ; ((2 + 2)) ; (1, 2, 3)
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              55 ; ((2 + 2)) ;;
-              ^
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              55 ; ((2 + 2)) ;;
-                       ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       55 ; ((2 + 2)) ;;
+       ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       55 ; ((2 + 2)) ;;
+                ^
 res15: (Int, Int, Int) = (1,2,3)
 
 scala> 55 ; (x: Int) => x + 1 ; () => ((5))
-<console>:8: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              55 ; (x: Int) => x + 1 ;;
-              ^
+<console>:13: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       55 ; (x: Int) => x + 1 ;;
+       ^
 res16: () => Int = <function0>
 
 scala> 
@@ -123,9 +121,9 @@ scala> () => 5
 res17: () => Int = <function0>
 
 scala> 55 ; () => 5
-<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
-              55 ;;
-              ^
+<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
+       55 ;;
+       ^
 res18: () => Int = <function0>
 
 scala> () => { class X ; new X }
@@ -211,23 +209,23 @@ Forgetting all expression results and named terms: $intp, BippyBungus, Bovine, C
 Forgetting defined types: BippyBungus, Moo, Ruminant
 
 scala> x1 + x2 + x3
-<console>:8: error: not found: value x1
-              x1 + x2 + x3
-              ^
-<console>:8: error: not found: value x2
-              x1 + x2 + x3
-                   ^
-<console>:8: error: not found: value x3
-              x1 + x2 + x3
-                        ^
+<console>:12: error: not found: value x1
+       x1 + x2 + x3
+       ^
+<console>:12: error: not found: value x2
+       x1 + x2 + x3
+            ^
+<console>:12: error: not found: value x3
+       x1 + x2 + x3
+                 ^
 
 scala> val x1 = 4
 x1: Int = 4
 
 scala> new BippyBungus
-<console>:8: error: not found: type BippyBungus
-              new BippyBungus
-                  ^
+<console>:12: error: not found: type BippyBungus
+       new BippyBungus
+           ^
 
 scala> class BippyBungus() { def f = 5 }
 defined class BippyBungus
@@ -258,12 +256,12 @@ class $read extends Serializable {
       super.<init>;
       ()
     };
-    import $line44.$read.$iw.$iw.BippyBups;
-    import $line44.$read.$iw.$iw.BippyBups;
-    import $line45.$read.$iw.$iw.PuppyPups;
-    import $line45.$read.$iw.$iw.PuppyPups;
-    import $line46.$read.$iw.$iw.Bingo;
-    import $line46.$read.$iw.$iw.Bingo;
+    import $line44.$read.INSTANCE.$iw.$iw.BippyBups;
+    import $line44.$read.INSTANCE.$iw.$iw.BippyBups;
+    import $line45.$read.INSTANCE.$iw.$iw.PuppyPups;
+    import $line45.$read.INSTANCE.$iw.$iw.PuppyPups;
+    import $line46.$read.INSTANCE.$iw.$iw.Bingo;
+    import $line46.$read.INSTANCE.$iw.$iw.Bingo;
     class $iw extends Serializable {
       def <init>() = {
         super.<init>;
@@ -275,12 +273,33 @@ class $read extends Serializable {
   };
   val $iw = new $iw.<init>
 }
-object $read extends $read {
+object $read extends scala.AnyRef {
   def <init>() = {
     super.<init>;
     ()
-  }
+  };
+  val INSTANCE = new $read.<init>
 }
 res3: List[Product with Serializable] = List(BippyBups(), PuppyPups(), Bingo())
 
+scala> case class Sum(exp: String, exp2: String)
+defined class Sum
+
+scala> val a = Sum("A", "B")
+a: Sum = Sum(A,B)
+
+scala> def b(a: Sum): String = a match { case Sum(_, _) => "Found Sum" }
+b: (a: Sum)String
+
+scala> b(a)
+res4: String = Found Sum
+
+scala> :power
+Power mode enabled. :phase is at typer.
+import scala.tools.nsc._, intp.global._, definitions._
+Try :help or completions for vals._ and power._
+
+scala> intp.lastRequest
+res5: $r.intp.Request = Request(line=def $ires3 = intp.global, 1 trees)
+
 scala> :quit
diff --git a/test/files/run/t7747-repl.scala b/test/files/run/t7747-repl.scala
index 0e64210..141c2d9 100644
--- a/test/files/run/t7747-repl.scala
+++ b/test/files/run/t7747-repl.scala
@@ -65,5 +65,11 @@ object Test extends ReplTest {
     |case class PuppyPups()
     |case class Bingo()
     |List(BippyBups(), PuppyPups(), Bingo()) // show
+    |case class Sum(exp: String, exp2: String)
+    |val a = Sum("A", "B")
+    |def b(a: Sum): String = a match { case Sum(_, _) => "Found Sum" }
+    |b(a)
+    |:power
+    |intp.lastRequest
     |""".stripMargin
 }
diff --git a/test/files/run/t7801.check b/test/files/run/t7801.check
index e0b656b..4ec89f0 100644
--- a/test/files/run/t7801.check
+++ b/test/files/run/t7801.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> val g: scala.reflect.internal.SymbolTable = null; import g.abort
 g: scala.reflect.internal.SymbolTable = null
diff --git a/test/files/run/t7805-repl-i.check b/test/files/run/t7805-repl-i.check
index 7f66c06..24512c0 100644
--- a/test/files/run/t7805-repl-i.check
+++ b/test/files/run/t7805-repl-i.check
@@ -2,8 +2,7 @@ Loading t7805-repl-i.script...
 import util._
 
 Welcome to Scala
-Type in expressions to have them evaluated.
-Type :help for more information.
+Type in expressions for evaluation. Or try :help.
 
 scala> Console println Try(8)
 Success(8)
diff --git a/test/files/run/t7817-tree-gen.scala b/test/files/run/t7817-tree-gen.scala
index a8317fd..094c0d6 100644
--- a/test/files/run/t7817-tree-gen.scala
+++ b/test/files/run/t7817-tree-gen.scala
@@ -1,6 +1,6 @@
 import scala.tools.partest._
 
-// Testing that `mkAttributedRef` doesn't incude the package object test.`package`,
+// Testing that `mkAttributedRef` doesn't include the package object test.`package`,
 // under joint and separate compilation.
 
 package testSep { class C { object O } }
diff --git a/test/files/run/t7850c.scala b/test/files/run/t7850c.scala
new file mode 100644
index 0000000..25b9c00
--- /dev/null
+++ b/test/files/run/t7850c.scala
@@ -0,0 +1,11 @@
+// Testing that isEmpty and get are viewed with `memberType` from `Casey1`.
+trait T[A, B >: Null] { def isEmpty: A = false.asInstanceOf[A]; def get: B = null}
+class Casey1() extends T[Boolean, String]
+object Casey1 { def unapply(a: Casey1) = a }
+
+object Test {
+  def main(args: Array[String]) {
+    val c @ Casey1(x) = new Casey1()
+    assert(x == c.get)
+  }
+}
diff --git a/test/files/run/t7850d.scala b/test/files/run/t7850d.scala
new file mode 100644
index 0000000..ccc98f1
--- /dev/null
+++ b/test/files/run/t7850d.scala
@@ -0,0 +1,17 @@
+// Testing that the ad-hoc overload resolution of isEmpty/get discards
+// parameter-accepting variants
+trait T[A, B >: Null] { def isEmpty: A = false.asInstanceOf[A]; def get: B = null}
+class Casey1(val a: Int) {
+  def isEmpty: Boolean = false
+  def isEmpty(x: Int): Boolean = ???
+  def get: Int = a
+  def get(x: Int): String = ???
+}
+object Casey1 { def unapply(a: Casey1) = a }
+
+object Test {
+  def main(args: Array[String]) {
+    val c @ Casey1(x) = new Casey1(0)
+    assert(x == c.get)
+  }
+}
diff --git a/test/files/run/t7974.check b/test/files/run/t7974.check
index d8152d3..4eae5eb 100644
--- a/test/files/run/t7974.check
+++ b/test/files/run/t7974.check
@@ -1,19 +1,3 @@
-public class Symbols {
-
-
-
-
-  // access flags 0x12
-  private final Lscala/Symbol; someSymbol3
-
-  // access flags 0xA
-  private static Lscala/Symbol; symbol$1
-
-  // access flags 0xA
-  private static Lscala/Symbol; symbol$2
-
-  // access flags 0xA
-  private static Lscala/Symbol; symbol$3
 
   // access flags 0x9
   public static <clinit>()V
@@ -33,6 +17,7 @@ public class Symbols {
     MAXSTACK = 2
     MAXLOCALS = 0
 
+
   // access flags 0x1
   public someSymbol1()Lscala/Symbol;
     GETSTATIC Symbols.symbol$1 : Lscala/Symbol;
@@ -40,6 +25,7 @@ public class Symbols {
     MAXSTACK = 1
     MAXLOCALS = 1
 
+
   // access flags 0x1
   public someSymbol2()Lscala/Symbol;
     GETSTATIC Symbols.symbol$2 : Lscala/Symbol;
@@ -47,6 +33,7 @@ public class Symbols {
     MAXSTACK = 1
     MAXLOCALS = 1
 
+
   // access flags 0x1
   public sameSymbol1()Lscala/Symbol;
     GETSTATIC Symbols.symbol$1 : Lscala/Symbol;
@@ -54,6 +41,7 @@ public class Symbols {
     MAXSTACK = 1
     MAXLOCALS = 1
 
+
   // access flags 0x1
   public someSymbol3()Lscala/Symbol;
     ALOAD 0
@@ -62,6 +50,7 @@ public class Symbols {
     MAXSTACK = 1
     MAXLOCALS = 1
 
+
   // access flags 0x1
   public <init>()V
     ALOAD 0
@@ -72,4 +61,4 @@ public class Symbols {
     RETURN
     MAXSTACK = 2
     MAXLOCALS = 1
-}
+
diff --git a/test/files/run/t7974/Test.scala b/test/files/run/t7974/Test.scala
index 29d2b9c..296ec32 100644
--- a/test/files/run/t7974/Test.scala
+++ b/test/files/run/t7974/Test.scala
@@ -1,20 +1,14 @@
-import java.io.PrintWriter;
+import java.io.PrintWriter
 
 import scala.tools.partest.BytecodeTest
+import scala.tools.nsc.backend.jvm.AsmUtils
 import scala.tools.asm.util._
 import scala.tools.nsc.util.stringFromWriter
+import scala.collection.convert.decorateAsScala._
 
 object Test extends BytecodeTest {
   def show {
     val classNode = loadClassNode("Symbols", skipDebugInfo = true)
-    val textifier = new Textifier
-    classNode.accept(new TraceClassVisitor(null, textifier, null))
-
-    val classString = stringFromWriter(w => textifier.print(w))
-    val result =
-      classString.split('\n')
-        .dropWhile(elem => elem != "public class Symbols {")
-        .filterNot(elem => elem.startsWith("  @Lscala/reflect/ScalaSignature") || elem.startsWith("  ATTRIBUTE ScalaSig"))
-    result foreach println
+    classNode.methods.asScala.foreach(m => println(AsmUtils.textify(m)))
   }
 }
diff --git a/test/files/run/t8010.scala b/test/files/run/t8010.scala
index 8636bbd..c78d45a 100644
--- a/test/files/run/t8010.scala
+++ b/test/files/run/t8010.scala
@@ -5,7 +5,7 @@ trait Base {
   def bt(n: Int) = n
 }
 trait Derived extends Base {
-  // was: double defintion error
+  // was: double definition error
   override def t          = 1 + super.t
   override def t(n: Int)  = 1 + super.t(n)
   override def bt         = 1 + super.bt
@@ -14,7 +14,7 @@ trait Derived extends Base {
 
 object Test extends App {
   val d = new Derived {}
-  // not the focus of thie bug, but let's just check the runtime behaviour while we're here.
+  // not the focus of this bug, but let's just check the runtime behaviour while we're here.
   assert(d.t == 2)
   assert(d.t(1) == 2)
   assert(d.bt == 3)
diff --git a/test/files/run/t8047.scala b/test/files/run/t8047.scala
index f566054..9ec8c1d 100644
--- a/test/files/run/t8047.scala
+++ b/test/files/run/t8047.scala
@@ -1,7 +1,7 @@
 object Test extends App {
   import scala.reflect.runtime.universe._
   //
-  // x's owner is outer Test scope. Previosly the quasiquote expansion
+  // x's owner is outer Test scope. Previously the quasiquote expansion
   // looked like:
   //
   //     object Test {
diff --git a/test/files/run/t8346.check b/test/files/run/t8346.check
deleted file mode 100644
index 1ba5c31..0000000
--- a/test/files/run/t8346.check
+++ /dev/null
@@ -1,6 +0,0 @@
-BitSet: List(invariant, invariant, invariant, invariant)
-HashSet: List(covariant (true), covariant (true), covariant (true), covariant (true))
-ListSet: List(covariant (true), covariant (true), covariant (true), covariant (true))
-SortedSet: List(invariant, invariant, invariant, invariant)
-TreeSet: List(invariant, invariant, invariant, invariant)
-ValueSet: invariant
diff --git a/test/files/run/t8346.scala b/test/files/run/t8346.scala
deleted file mode 100644
index 5f3df84..0000000
--- a/test/files/run/t8346.scala
+++ /dev/null
@@ -1,34 +0,0 @@
-object Test extends App {
-  import reflect.ClassTag
-
-  object SomeEnum extends Enumeration {
-    val one, two, three, four = Value
-  }
-
-  def sctor[A <: Set[Int]](f: Int => A)(implicit A: ClassTag[A])
-      : (String, Int => Set[Int]) =
-    (A.runtimeClass.getSimpleName, f)
-
-  val inits: Seq[(String, Int => Set[Int])] = {
-    import collection.immutable.{Seq => _, _}
-    Seq(sctor(BitSet(_)),
-        sctor(HashSet(_)),
-        sctor(ListSet(_)),
-        sctor(SortedSet(_)),
-        sctor(TreeSet(_)))
-  }
-
-  def sVarInfo[A](sa: Set[A]): String = {
-    val saa = sa.toSet[Any]
-    if (sa eq saa) s"""covariant (${(saa + "hi") contains "hi"})"""
-    else "invariant"
-  }
-
-  inits foreach {case (name, singleton) =>
-    print(s"${name}: ")
-    val one = singleton(1)
-    println(Seq(2,3,4).scanLeft(one)(_ + _) map sVarInfo toList)
-  }
-
-  println(s"ValueSet: ${sVarInfo(SomeEnum.values)}")
-}
diff --git a/test/files/run/t8502b.scala b/test/files/run/t8502b.scala
new file mode 100644
index 0000000..4f70d13
--- /dev/null
+++ b/test/files/run/t8502b.scala
@@ -0,0 +1,46 @@
+import scala.tools.partest._
+import java.io.File
+
+// used to crash with an assertion failure in flatten because the type symbol created for the missing
+// package was a ClassSymbol, not a PackageClassSymbol
+//   - isFlattenablePrefix(vanishingPackage) was true (wrongly)
+//   - therefore flatten tried to flatten the class defined in the package, but the class is
+//     top-level, vanishingClass.enclosingTopLevelClass is NoSymbol
+object Test extends StoreReporterDirectTest {
+  def code = ???
+
+  def compileCode(code: String) = {
+    val classpath = List(sys.props("partest.lib"), testOutput.path) mkString sys.props("path.separator")
+    compileString(newCompiler("-cp", classpath, "-d", testOutput.path))(code)
+  }
+
+  def show(): Unit = {
+    compileCode("""
+      class Outer {
+        class Nested extends vanishing.Vanishing
+      }
+
+      package vanishing {
+        class Vanishing
+      }
+      """)
+    assert(filteredInfos.isEmpty, filteredInfos)
+    deletePackage("vanishing")
+    compileCode("""
+      class Test {
+        def f(o: Outer): Outer = o
+      }
+    """)
+    assert(storeReporter.infos.isEmpty, storeReporter.infos.mkString("\n")) // Included a MissingRequirementError before.
+  }
+
+  def deletePackage(name: String) {
+    val directory = new File(testOutput.path, name)
+    for (f <- directory.listFiles()) {
+      assert(f.getName.endsWith(".class"))
+      assert(f.delete())
+    }
+    assert(directory.listFiles().isEmpty)
+    assert(directory.delete())
+  }
+}
diff --git a/test/files/run/t8601-closure-elim.flags b/test/files/run/t8601-closure-elim.flags
index 2b5fd8a..9158076 100644
--- a/test/files/run/t8601-closure-elim.flags
+++ b/test/files/run/t8601-closure-elim.flags
@@ -1 +1 @@
--optimize -Ydelambdafy:inline
+-optimize -Ydelambdafy:inline -Ybackend:GenASM
diff --git a/test/files/run/t8601-closure-elim.scala b/test/files/run/t8601-closure-elim.scala
index 2c5b03a..ebeb16e 100644
--- a/test/files/run/t8601-closure-elim.scala
+++ b/test/files/run/t8601-closure-elim.scala
@@ -11,7 +11,7 @@ object Test extends BytecodeTest {
       val classNode = loadClassNode("Foo")
       val methodNode = getMethod(classNode, "b")
       val ops = methodNode.instructions.iterator.asScala.map(_.getOpcode).toList
-      assert(!ops.contains(asm.Opcodes.NEW), ops)// should be allocation free if the closure is eliminiated
+      assert(!ops.contains(asm.Opcodes.NEW), ops)// should be allocation free if the closure is eliminated
     }
     test("b")
   }
diff --git a/test/files/run/t8708_b/Test_2.scala b/test/files/run/t8708_b/Test_2.scala
index c978490..fae3c67 100644
--- a/test/files/run/t8708_b/Test_2.scala
+++ b/test/files/run/t8708_b/Test_2.scala
@@ -13,7 +13,7 @@ object Test extends DirectTest {
       val c = g.rootMirror.getRequiredClass("p.C")
       println(c.info.decls)
       val t = c.info.member(g.newTypeName("T"))
-      // this test ensrues that the <local child> dummy class symbol is not entered in the
+      // this test ensures that the <local child> dummy class symbol is not entered in the
       // scope of trait T during unpickling.
       println(t.info.decls)
     })
diff --git a/test/files/run/t8843-repl-xlat.scala b/test/files/run/t8843-repl-xlat.scala
index 6426dbe..215dd97 100644
--- a/test/files/run/t8843-repl-xlat.scala
+++ b/test/files/run/t8843-repl-xlat.scala
@@ -4,9 +4,7 @@ import scala.tools.partest.SessionTest
 // Handy hamburger helper for repl resources
 object Test extends SessionTest {
   def session =
-"""Type in expressions to have them evaluated.
-Type :help for more information.
-
+"""
 scala> $intp.isettings.unwrapStrings = false
 $intp.isettings.unwrapStrings: Boolean = false
 
diff --git a/test/files/run/t8845.flags b/test/files/run/t8845.flags
index aada25f..c30091d 100644
--- a/test/files/run/t8845.flags
+++ b/test/files/run/t8845.flags
@@ -1 +1 @@
--Ybackend:GenBCode -Ynooptimize
+-Ybackend:GenBCode
diff --git a/test/files/run/t8893b.scala b/test/files/run/t8893b.scala
index 1912087..066425a 100644
--- a/test/files/run/t8893b.scala
+++ b/test/files/run/t8893b.scala
@@ -5,7 +5,7 @@ object Test {
   def tick(i : Int): Unit =
     if (i == 0) ()
     else if (i == 42) {
-      tick(0) /*not in tail posiiton*/
+      tick(0) /*not in tail position*/
       tick(i - 1)
     } else tick(i - 1)
 
diff --git a/test/files/run/t8925.flags b/test/files/run/t8925.flags
index be4ef07..ffc65f4 100644
--- a/test/files/run/t8925.flags
+++ b/test/files/run/t8925.flags
@@ -1 +1 @@
--Ynooptimise -Yopt:l:none -Ybackend:GenBCode
+-Yopt:l:none -Ybackend:GenBCode
diff --git a/test/files/run/t9029.flags b/test/files/run/t9029.flags
new file mode 100644
index 0000000..dcc59eb
--- /dev/null
+++ b/test/files/run/t9029.flags
@@ -0,0 +1 @@
+-deprecation
diff --git a/test/files/run/t9029.scala b/test/files/run/t9029.scala
new file mode 100644
index 0000000..c01033b
--- /dev/null
+++ b/test/files/run/t9029.scala
@@ -0,0 +1,15 @@
+class Y(val _2: Int, val _1: String)
+
+object X { def unapply(u: Unit): Option[Y] = Some(new Y(42, "!")) }
+
+object Test {
+  def test1 = {
+    val X(y) = ()
+    val yy: Y = y
+    assert(yy._1 == "!")
+    assert(yy._2 == 42)
+  }
+  def main(args: Array[String]): Unit = {
+    test1
+  }
+}
diff --git a/test/files/run/t9029b.check b/test/files/run/t9029b.check
new file mode 100644
index 0000000..aeb2d5e
--- /dev/null
+++ b/test/files/run/t9029b.check
@@ -0,0 +1 @@
+Some(1)
diff --git a/test/files/run/t9029b.scala b/test/files/run/t9029b.scala
new file mode 100644
index 0000000..764d077
--- /dev/null
+++ b/test/files/run/t9029b.scala
@@ -0,0 +1,31 @@
+class Foo(val x: Bar) {
+  def isEmpty = false
+  def get = x
+}
+
+object Foo {
+  def unapply(x: Foo) = x
+}
+
+class Bar(val x: Option[Int], val y: Option[Int]) {
+  def isEmpty = false
+  def get = this
+  def _1 = x
+  def _2 = y
+}
+
+object Bar {
+  def unapply(x: Bar) = x
+}
+
+object Test {
+  def nameBased: Unit = {
+    val x: AnyRef = new Foo(new Bar(Some(1), Some(2)))
+    x match {
+      case Foo(Bar(x1, x2)) => println(x1)
+    }
+  }
+  def main(args: Array[String]): Unit = {
+    nameBased
+  }
+}
diff --git a/test/files/run/t9029c.scala b/test/files/run/t9029c.scala
new file mode 100644
index 0000000..ccb51e2
--- /dev/null
+++ b/test/files/run/t9029c.scala
@@ -0,0 +1,21 @@
+object Extractor {
+  def unapply(a: Any): Option[Product2[Int, String]] = Some(new P2(1, "2"))
+}
+class P2[A, B](val _1: A, val _2: B) extends Product2[A, B] {
+  def canEqual(other: Any) = true
+  def isP2 = true
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    "" match {
+      case Extractor(p) =>
+        val pp: Product2[Int, String] = p
+    }
+    "" match {
+      case Extractor(x, y) =>
+        val xx: Int = x
+        val yy: String = y
+    }
+  }
+}
diff --git a/test/files/run/t9097.scala b/test/files/run/t9097.scala
index d2bf55f..aa2b23b 100644
--- a/test/files/run/t9097.scala
+++ b/test/files/run/t9097.scala
@@ -15,7 +15,7 @@ object Test extends StoreReporterDirectTest {
   override def code = """package o
                         |package a {
                         |  class C {
-                        |    def hihi = List(1,2).map(_ * 2)
+                        |    def hihi = List(1,2).map(_ => "")
                         |  }
                         |}
                         |package object a {
diff --git a/test/files/run/t9102.scala b/test/files/run/t9102.scala
new file mode 100644
index 0000000..c46cf0e
--- /dev/null
+++ b/test/files/run/t9102.scala
@@ -0,0 +1,81 @@
+
+object Test extends App {
+  import reflect.runtime._, universe._
+
+  class C { def f(i: Int, j: => Int) = i + j }
+
+  class V(val v: Int) extends AnyVal { def doubled = 2 * v }
+  class D { def f(i: Int, j: V) = i + j.doubled }
+
+  class E(i: Int, j: V)
+
+  locally {
+    val ms = typeOf[C].member(TermName("f")).asMethod
+    val im = currentMirror reflect (new C)
+    val mm = im reflectMethod ms
+    assert(mm(2,3) == 5)
+  }
+  locally {
+    val ms = typeOf[D].member(TermName("f")).asMethod
+    val im = currentMirror reflect (new D)
+    val mm = im reflectMethod ms
+    assert(mm(2, new V(3)) == 8)
+  }
+  locally {
+    val ms = typeOf[E].typeSymbol.asClass.primaryConstructor
+    val cm = currentMirror reflectClass typeOf[E].typeSymbol.asClass
+    val mm = cm reflectConstructor ms.asMethod
+    assert(mm(42, new V(7)).isInstanceOf[E])
+  }
+}
+
+/* Session tests without special init code should reside in simple script files.
+ * Also, provide filters such as for `(bound to C at 74f7d1d2)`.
+
+import scala.tools.partest.SessionTest
+
+object Test extends SessionTest {
+//Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_40).
+  def session =
+    s"""|Type in expressions to have them evaluated.
+        |Type :help for more information.
+        |
+        |scala> import reflect.runtime._, universe._
+        |import reflect.runtime._
+        |import universe._
+        |
+        |scala> class C { def f(i: Int, j: => Int) = i + j }
+        |defined class C
+        |
+        |scala> typeOf[C].member(TermName("f"))
+        |res0: reflect.runtime.universe.Symbol = method f
+        |
+        |scala> .asMethod
+        |res1: reflect.runtime.universe.MethodSymbol = method f
+        |
+        |scala> currentMirror reflect (new C)
+        |res2: reflect.runtime.universe.InstanceMirror = instance mirror for C at 74f7d1d2
+        |
+        |scala> res2 reflectMethod res1
+        |res3: reflect.runtime.universe.MethodMirror = method mirror for def f(i: scala.Int,j: => scala.Int): scala.Int (bound to C at 74f7d1d2)
+        |
+        |scala> res3(2,3)
+        |res4: Any = 5
+        |
+        |scala> :quit"""
+}
+*/
+
+/* was:
+scala> res3(2,3)
+java.lang.IllegalArgumentException
+  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+  at java.lang.reflect.Method.invoke(Method.java:497)
+  at scala.reflect.runtime.JavaMirrors$JavaMirror$JavaMethodMirror.jinvokeraw(JavaMirrors.scala:335)
+  at scala.reflect.runtime.JavaMirrors$JavaMirror$JavaMethodMirror.jinvoke(JavaMirrors.scala:339)
+  at scala.reflect.runtime.JavaMirrors$JavaMirror$JavaTransformingMethodMirror.apply(JavaMirrors.scala:436)
+  ... 33 elided
+*/
+
diff --git a/test/files/run/t9170.scala b/test/files/run/t9170.scala
new file mode 100644
index 0000000..f39467b
--- /dev/null
+++ b/test/files/run/t9170.scala
@@ -0,0 +1,56 @@
+
+import scala.tools.partest.SessionTest
+
+object Test extends SessionTest {
+
+  override def stripMargins = false
+
+  def session =
+"""
+scala> object Y { def f[A](a: => A) = 1 ; def f[A](a: => Either[Exception, A]) = 2 }
+<console>:11: error: double definition:
+def f[A](a: => A): Int at line 11 and
+def f[A](a: => Either[Exception,A]): Int at line 11
+have same type after erasure: (a: Function0)Int
+       object Y { def f[A](a: => A) = 1 ; def f[A](a: => Either[Exception, A]) = 2 }
+                                              ^
+
+scala> object Y { def f[A](a: => A) = 1 ; def f[A](a: => Either[Exception, A]) = 2 }
+<console>:11: error: double definition:
+def f[A](a: => A): Int at line 11 and
+def f[A](a: => Either[Exception,A]): Int at line 11
+have same type after erasure: (a: Function0)Int
+       object Y { def f[A](a: => A) = 1 ; def f[A](a: => Either[Exception, A]) = 2 }
+                                              ^
+
+scala> object Y {
+     |   def f[A](a: =>  A) = 1
+     |   def f[A](a: => Either[Exception, A]) = 2
+     | }
+<console>:13: error: double definition:
+def f[A](a: => A): Int at line 12 and
+def f[A](a: => Either[Exception,A]): Int at line 13
+have same type after erasure: (a: Function0)Int
+         def f[A](a: => Either[Exception, A]) = 2
+             ^
+
+scala> :pa
+// Entering paste mode (ctrl-D to finish)
+
+object Y {
+  def f[A](a: =>  A) = 1
+  def f[A](a: => Either[Exception, A]) = 2
+}
+
+// Exiting paste mode, now interpreting.
+
+<console>:13: error: double definition:
+def f[A](a: => A): Int at line 12 and
+def f[A](a: => Either[Exception,A]): Int at line 13
+have same type after erasure: (a: Function0)Int
+         def f[A](a: => Either[Exception, A]) = 2
+             ^
+
+scala> :quit"""
+}
+
diff --git a/test/files/run/t9182.check b/test/files/run/t9182.check
new file mode 100644
index 0000000..80e8b6c
--- /dev/null
+++ b/test/files/run/t9182.check
@@ -0,0 +1,3 @@
+constructor package
+method A
+object A
diff --git a/test/files/run/t9182.scala b/test/files/run/t9182.scala
new file mode 100644
index 0000000..1768aa6
--- /dev/null
+++ b/test/files/run/t9182.scala
@@ -0,0 +1,12 @@
+// Main.scala
+package object ops {
+  object A
+  def A(a: Any) = ()
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    val pack = scala.reflect.runtime.currentMirror.staticModule("ops.package")
+    println(pack.info.decls.toList.map(_.toString).sorted.mkString("\n"))
+  }
+}
diff --git a/test/files/run/t9206.scala b/test/files/run/t9206.scala
new file mode 100644
index 0000000..4067981
--- /dev/null
+++ b/test/files/run/t9206.scala
@@ -0,0 +1,37 @@
+
+import scala.tools.partest.SessionTest
+
+object Test extends SessionTest {
+  //override def prompt = "XXX> "
+//Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_40).
+  def session =
+    s"""|
+        |scala> val i: Int = "foo"
+        |<console>:11: error: type mismatch;
+        | found   : String("foo")
+        | required: Int
+        |       val i: Int = "foo"
+        |                    ^
+        |
+        |scala> { val j = 42 ; val i: Int = "foo" + j }
+        |<console>:12: error: type mismatch;
+        | found   : String
+        | required: Int
+        |       { val j = 42 ; val i: Int = "foo" + j }
+        |                                         ^
+        |
+        |scala> :quit"""
+        /*
+        |XXX> XXX> def f = 42
+        |
+        |// Detected repl transcript paste: ctrl-D to finish.
+        |
+        |// Replaying 1 commands from transcript.
+        |
+        |XXX> def f = 42
+        |f: Int
+        |
+        |XXX> :quit"""
+        */
+
+}
diff --git a/test/files/run/t9219.check b/test/files/run/t9219.check
new file mode 100644
index 0000000..3509ece
--- /dev/null
+++ b/test/files/run/t9219.check
@@ -0,0 +1,3 @@
+Stream(1, 2, ?)
+Stream(1, 2, 3, 4, ?)
+Stream(1, 2, 3, 4, 5, 6, ?)
diff --git a/test/files/run/t9219.scala b/test/files/run/t9219.scala
new file mode 100644
index 0000000..c15f55f
--- /dev/null
+++ b/test/files/run/t9219.scala
@@ -0,0 +1,11 @@
+object Test extends App {
+  def check[U](f: Stream[Int] => U) = {
+    val s = Stream.from(1)
+    f(s)
+    println(s)
+  }
+
+  check(_.tail)
+  check(_.take(4).force)
+  check(_(5))
+}
diff --git a/test/files/run/t9223.scala b/test/files/run/t9223.scala
new file mode 100644
index 0000000..78767b1
--- /dev/null
+++ b/test/files/run/t9223.scala
@@ -0,0 +1,8 @@
+class X(val x: String)
+class Y(y: => String) extends X(y) { def f = y }
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    assert(new Y("hi").f == "hi")
+  }
+}
diff --git a/test/files/run/t9223b.scala b/test/files/run/t9223b.scala
new file mode 100644
index 0000000..2afc7dd
--- /dev/null
+++ b/test/files/run/t9223b.scala
@@ -0,0 +1,8 @@
+class X(x: => String) { def xx = x }
+class Y(y: String) extends X(y) { def f = y }
+
+object Test {
+  def main(args: Array[String]): Unit = {
+     assert(new Y("hi").f == "hi")
+  }
+}
diff --git a/test/files/run/t9252.check b/test/files/run/t9252.check
new file mode 100644
index 0000000..b00d748
--- /dev/null
+++ b/test/files/run/t9252.check
@@ -0,0 +1 @@
+class [Lscala.runtime.BoxedUnit;
diff --git a/test/files/run/t9252.scala b/test/files/run/t9252.scala
new file mode 100644
index 0000000..da69894
--- /dev/null
+++ b/test/files/run/t9252.scala
@@ -0,0 +1,5 @@
+import scala.reflect.runtime.universe._
+
+object Test extends App {
+  println(rootMirror.runtimeClass(typeOf[Array[Unit]]))
+}
\ No newline at end of file
diff --git a/test/files/run/t9268.check b/test/files/run/t9268.check
new file mode 100644
index 0000000..90ef940
--- /dev/null
+++ b/test/files/run/t9268.check
@@ -0,0 +1,5 @@
+Compiling Client1
+pos: NoPosition Class Waiter not found - continuing with a stub. WARNING
+Compiling Client2
+pos: NoPosition Class Waiter not found - continuing with a stub. WARNING
+pos: NoPosition Unable to locate class corresponding to inner class entry for Predicate in owner Waiter ERROR
diff --git a/test/files/run/t9268/Java.java b/test/files/run/t9268/Java.java
new file mode 100644
index 0000000..c9a0bec
--- /dev/null
+++ b/test/files/run/t9268/Java.java
@@ -0,0 +1,12 @@
+public class Java {
+}
+
+class Partial {
+	public <E extends java.lang.Exception> long waitFor(long l, Waiter.Predicate<E> pred) throws E {
+		return 0L;
+	}
+}
+
+class Waiter {
+	interface Predicate<E> {}
+}
diff --git a/test/files/run/t9268/Test.scala b/test/files/run/t9268/Test.scala
new file mode 100644
index 0000000..813cbe7
--- /dev/null
+++ b/test/files/run/t9268/Test.scala
@@ -0,0 +1,40 @@
+import scala.tools.partest._
+import java.io.File
+
+object Test extends StoreReporterDirectTest {
+  def code = ???
+
+  def compileCode(code: String) = {
+    val classpath = List(sys.props("partest.lib"), testOutput.path) mkString sys.props("path.separator")
+    compileString(newCompiler("-cp", classpath, "-d", testOutput.path))(code)
+  }
+
+  def client1 = """
+    class Client1 { def p(p: Partial) = p.toString }
+  """
+
+  def client2 = """
+    class Client2 { def p(p: Partial) = p.waitFor() }
+  """
+
+  def deleteClass(s: String) = {
+    val f = new File(testOutput.path, s + ".class")
+    assert(f.exists)
+    f.delete()
+  }
+
+  def show(): Unit = {
+    deleteClass("Waiter")
+    deleteClass("Waiter$Predicate")
+
+    // Used to crash in Java Generic Signature parsing
+    println("Compiling Client1")
+    compileCode(client1)
+    println(storeReporter.infos.mkString("\n"))
+    storeReporter.reset()
+    println("Compiling Client2")
+    compileCode(client2)
+    println(storeReporter.infos.mkString("\n"))
+  }
+}
+
diff --git a/test/files/run/t9298/Test.java b/test/files/run/t9298/Test.java
new file mode 100644
index 0000000..81f5265
--- /dev/null
+++ b/test/files/run/t9298/Test.java
@@ -0,0 +1,7 @@
+public class Test {
+	public void consume(VC vc) {}
+
+	public static void main(String[] args) {
+		new Client().test();
+	}
+}
diff --git a/test/files/run/t9298/VC.scala b/test/files/run/t9298/VC.scala
new file mode 100644
index 0000000..916e62d
--- /dev/null
+++ b/test/files/run/t9298/VC.scala
@@ -0,0 +1,5 @@
+class VC(val s: String) extends AnyVal
+
+class Client {
+  def test = new Test().consume(new VC(""))
+}
diff --git a/test/files/run/t9298b/Test.java b/test/files/run/t9298b/Test.java
new file mode 100644
index 0000000..f369b26
--- /dev/null
+++ b/test/files/run/t9298b/Test.java
@@ -0,0 +1,7 @@
+public class Test {
+	public VC identity(VC vc) { return vc; }
+
+	public static void main(String[] args) {
+		new Client().test();
+	}
+}
diff --git a/test/files/run/t9298b/VC.scala b/test/files/run/t9298b/VC.scala
new file mode 100644
index 0000000..bb5978b
--- /dev/null
+++ b/test/files/run/t9298b/VC.scala
@@ -0,0 +1,8 @@
+class VC(val s: Int) extends AnyVal
+
+class Client {
+  def test = {
+    val vc: VC = new Test().identity(new VC(42))
+    assert(vc.s == 42)
+  }
+}
diff --git a/test/files/run/t9359.check b/test/files/run/t9359.check
new file mode 100644
index 0000000..8dcfe4f
--- /dev/null
+++ b/test/files/run/t9359.check
@@ -0,0 +1,18 @@
+  // access flags 0x4009
+  public static enum INNERCLASS A_1$A1N A_1 A1N
+
+  // access flags 0x4409
+  public static abstract enum INNERCLASS A_1$A1N_ABSTRACT A_1 A1N_ABSTRACT
+
+  // access flags 0x4019
+  public final static enum INNERCLASS A_1$A1N_FINAL A_1 A1N_FINAL
+
+  // access flags 0x4009
+  public static enum INNERCLASS B_2$A1N B_2 A1N
+
+  // access flags 0x4409
+  public static abstract enum INNERCLASS B_2$A1N_ABSTRACT B_2 A1N_ABSTRACT
+
+  // access flags 0x4019
+  public final static enum INNERCLASS B_2$A1N_FINAL B_2 A1N_FINAL
+
diff --git a/test/files/run/t9359/A_1.java b/test/files/run/t9359/A_1.java
new file mode 100644
index 0000000..3ac82ed
--- /dev/null
+++ b/test/files/run/t9359/A_1.java
@@ -0,0 +1,19 @@
+public class A_1 {
+  // nested final
+  public static enum A1N_FINAL {
+    A1N_FINAL_VAL
+  }
+
+  // nested, non-final
+  public enum A1N {
+    A1N_VAL { } // value has a body, so a class extending A1N is generated
+  }
+
+  // nested, non-final, abstract
+  public enum A1N_ABSTRACT {
+    A1N_ABSTRACT_VAL {
+      void foo() { return; }
+    };
+    abstract void foo(); // abstract member makes the enum class abstract
+  }
+}
diff --git a/test/files/run/t9359/B_2.java b/test/files/run/t9359/B_2.java
new file mode 100644
index 0000000..d824fac
--- /dev/null
+++ b/test/files/run/t9359/B_2.java
@@ -0,0 +1,19 @@
+public class B_2 {
+  // nested final
+  public enum A1N_FINAL {
+    A1N_FINAL_VAL
+  }
+
+  // nested, non-final
+  public enum A1N {
+    A1N_VAL { } // value has a body, so a class extending A1N is generated
+  }
+
+  // nested, non-final, abstract
+  public enum A1N_ABSTRACT {
+    A1N_ABSTRACT_VAL {
+      void foo() { return; }
+    };
+    abstract void foo(); // abstract member makes the enum class abstract
+  }
+}
diff --git a/test/files/run/t9359/Test_2.scala b/test/files/run/t9359/Test_2.scala
new file mode 100644
index 0000000..869c51b
--- /dev/null
+++ b/test/files/run/t9359/Test_2.scala
@@ -0,0 +1,28 @@
+import scala.tools.partest.BytecodeTest
+import scala.tools.asm
+import asm.tree.{ClassNode, InnerClassNode}
+import asm.{Opcodes => Flags}
+import scala.collection.JavaConverters._
+
+class C {
+  def f1: A_1.A1N_FINAL    = A_1.A1N_FINAL.A1N_FINAL_VAL
+  def f2: A_1.A1N          = A_1.A1N.A1N_VAL
+  def f3: A_1.A1N_ABSTRACT = A_1.A1N_ABSTRACT.A1N_ABSTRACT_VAL
+
+  def f4: B_2.A1N_FINAL    = B_2.A1N_FINAL.A1N_FINAL_VAL
+  def f5: B_2.A1N          = B_2.A1N.A1N_VAL
+  def f6: B_2.A1N_ABSTRACT = B_2.A1N_ABSTRACT.A1N_ABSTRACT_VAL
+}
+
+object Test extends BytecodeTest {
+  def tost(n: InnerClassNode) = {
+    val t = new asm.util.Textifier
+    t.visitInnerClass(n.name, n.outerName, n.innerName, n.access)
+    t.getText.get(0);
+  }
+  def show(): Unit = {
+    for (n <- loadClassNode("C").innerClasses.asScala.toList.sortBy(_.name)) {
+      println(tost(n))
+    }
+  }
+}
diff --git a/test/files/run/t9365.check b/test/files/run/t9365.check
new file mode 100644
index 0000000..0d55bed
--- /dev/null
+++ b/test/files/run/t9365.check
@@ -0,0 +1,2 @@
+foo
+foo
diff --git a/test/files/run/t9365.scala b/test/files/run/t9365.scala
new file mode 100644
index 0000000..0c4477d
--- /dev/null
+++ b/test/files/run/t9365.scala
@@ -0,0 +1,18 @@
+class Test(x: => Object) extends Serializable {
+  @transient lazy val foo = x
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    import java.io._
+    val t = new Test("foo")
+    println(t.foo)
+    val baos = new ByteArrayOutputStream
+    val dos = new ObjectOutputStream(baos)
+    dos.writeObject(t)
+    dos.close()
+    val dis = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))
+    val t1 = dis.readObject().asInstanceOf[Test]
+    println(t1.foo) // was NPE
+  }
+}
diff --git a/test/files/run/t9375.check b/test/files/run/t9375.check
new file mode 100644
index 0000000..87551dc
--- /dev/null
+++ b/test/files/run/t9375.check
@@ -0,0 +1,60 @@
+  konstruktor: class A
+  konstruktor: class A$O$12$
+  konstruktor: class A$$anon$1
+  konstruktor: class A$A
+  konstruktor: class A$C
+  konstruktor: class C
+  konstruktor: class T$O$15$
+  konstruktor: class T$$anon$2
+  konstruktor: class T$A
+  konstruktor: class T$C
+  konstruktor: class A$N$
+  konstruktor: class T$N$
+serializing outer objects should not initialize any nested objects
+now initializing nested objects
+  konstruktor: class A$O$
+  konstruktor: class A$Op$
+  konstruktor: class A$N$O$
+  konstruktor: class A$N$Op$
+  konstruktor: class A$A$O$
+  konstruktor: class A$A$Op$
+  konstruktor: class A$T$O$
+  konstruktor: class A$T$Op$
+  konstruktor: class A$O$11$
+  konstruktor: class A$$anonfun$1$O$13$
+  konstruktor: class A$$anon$1$O$
+  konstruktor: class A$$anon$1$Op$
+  konstruktor: class T$O$
+  konstruktor: class T$Op$
+  konstruktor: class T$N$O$
+  konstruktor: class T$N$Op$
+  konstruktor: class T$A$O$
+  konstruktor: class T$A$Op$
+  konstruktor: class T$T$O$
+  konstruktor: class T$T$Op$
+  konstruktor: class T$O$14$
+  konstruktor: class T$$anonfun$2$O$16$
+  konstruktor: class T$$anon$2$O$
+  konstruktor: class T$$anon$2$Op$
+no object konstruktors called when serializing / deserializing objects (starting at the outer or the object itself)
+deserializing outer objects with non-initialized inners again
+accessing modules triggers initialization
+  konstruktor: class A$O$
+  konstruktor: class A$Op$
+  konstruktor: class A$N$O$
+  konstruktor: class A$N$Op$
+deserializing creates a new object graph, including new scala 'object' instances, no matter where serialization starts
+init static module M and field v
+  konstruktor: class M$
+  konstruktor: class M$O$18$
+serDeser does not initialize nested static modules
+init M.O
+  konstruktor: class M$O$
+serDeser nested static module
+objects declared in field decls are not static modules, so they deserialize to new instances
+init lazy val M.w
+objects declared in lazy val are not static modules either
+  konstruktor: class M$O$19$
+object declared in a function: new instance created on each invocation
+  konstruktor: class M$$anonfun$3$O$20$
+  konstruktor: class M$$anonfun$3$O$20$
diff --git a/test/files/run/t9375.scala b/test/files/run/t9375.scala
new file mode 100644
index 0000000..6ff4a42
--- /dev/null
+++ b/test/files/run/t9375.scala
@@ -0,0 +1,279 @@
+/*
+ * filter: inliner warning
+ */
+import java.io._
+
+object SerDes {
+  def serialize(obj: AnyRef): Array[Byte] = {
+    val buffer = new ByteArrayOutputStream
+    val out = new ObjectOutputStream(buffer)
+    out.writeObject(obj)
+    buffer.toByteArray
+  }
+
+  def deserialize(a: Array[Byte]): AnyRef = {
+    val in = new ObjectInputStream(new ByteArrayInputStream(a))
+    in.readObject
+  }
+
+  def serializeDeserialize[T <: AnyRef](obj: T) = deserialize(serialize(obj)).asInstanceOf[T]
+}
+
+import SerDes._
+
+// tests to make sure that de-serializing an object does not run its constructor
+
+trait S extends Serializable {
+  println("  konstruktor: " + this.getClass)
+}
+
+trait SE extends S {
+  def outer: Object
+}
+
+class A extends S {
+  object O extends SE { def outer = A.this }
+  private[this] object Op extends SE { def outer = A.this }
+  def P: SE = Op
+
+  object N extends S {
+    object O extends SE { def outer = N }
+    private[this] object Op extends SE { def outer = N }
+    def P: SE = Op
+  }
+
+  class A extends S {
+    object O extends SE { def outer = A.this }
+    private[this] object Op extends SE { def outer = A.this }
+    def P: SE = Op
+  }
+
+  trait T extends S {
+    object O extends SE { def outer = T.this }
+    private[this] object Op extends SE { def outer = T.this }
+    def P: SE = Op
+  }
+  class C extends T
+
+  def u: SE = {
+    object O extends SE { def outer = A.this }
+    O
+  }
+
+  val v: SE = {
+    object O extends SE { def outer = A.this }
+    O
+  }
+
+  val f: () => SE = () => {
+    object O extends SE { def outer = A.this }
+    O
+  }
+
+  trait GetObj { def O: SE; def P: SE }
+  val a: GetObj = new GetObj with S {
+    def anonThis = this
+    object O extends SE { def outer = anonThis }
+    private[this] object Op extends SE { def outer = anonThis }
+    def P: SE = Op
+  }
+}
+
+trait T extends S {
+  object O extends SE { def outer = T.this }
+  private[this] object Op extends SE { def outer = T.this }
+  def P: SE = Op
+
+  object N extends S {
+    object O extends SE { def outer = N }
+    private[this] object Op extends SE { def outer = N }
+    def P: SE = Op
+  }
+
+  class A extends S {
+    object O extends SE { def outer = A.this }
+    private[this] object Op extends SE { def outer = A.this }
+    def P: SE = Op
+  }
+
+  trait T extends S {
+    object O extends SE { def outer = T.this }
+    private[this] object Op extends SE { def outer = T.this }
+    def P: SE = Op
+  }
+  class C extends T
+
+  def u: SE = {
+    object O extends SE { def outer = T.this }
+    O
+  }
+
+  val v: SE = {
+    object O extends SE { def outer = T.this }
+    O
+  }
+
+  val f: () => SE = () => {
+    object O extends SE { def outer = T.this }
+    O
+  }
+
+  trait GetObj { def O: SE; def P: SE }
+  val a: GetObj = new GetObj with S {
+    def anonThis = this
+    object O extends SE { def outer = anonThis }
+    private[this] object Op extends SE { def outer = anonThis }
+    def P: SE = Op
+  }
+}
+
+class C extends T
+
+object DeserializeModuleNoConstructor {
+  def t(): Unit = {
+    val a = new A
+    val aa = new a.A
+    val ac = new a.C
+
+    val c = new C
+    val ca = new c.A
+    val cc = new c.C
+
+    val outers: List[Object] = List(
+      a, a.N, aa, ac, a.a,
+      c, c.N, ca, cc, c.a
+    )
+
+    println("serializing outer objects should not initialize any nested objects")
+
+    val serANotInit = serialize(a)
+    outers foreach serializeDeserialize
+
+    println("now initializing nested objects")
+
+    val os: List[(SE, Object)] = List(
+      a.O   -> a,
+      a.P   -> a,
+      a.N.O -> a.N,
+      a.N.P -> a.N,
+      aa.O  -> aa,
+      aa.P  -> aa,
+      ac.O  -> ac,
+      ac.P  -> ac,
+      a.u   -> a,
+      a.v   -> a,
+      a.f() -> a,
+      a.a.O -> a.a,
+      a.a.P -> a.a,
+
+      c.O   -> c,
+      c.P   -> c,
+      c.N.O -> c.N,
+      c.N.P -> c.N,
+      ca.O  -> ca,
+      ca.P  -> ca,
+      cc.O  -> cc,
+      cc.P  -> cc,
+      c.u   -> c,
+      c.v   -> c,
+      c.f() -> c,
+      c.a.O -> c.a,
+      c.a.P -> c.a
+    )
+
+    println("no object konstruktors called when serializing / deserializing objects (starting at the outer or the object itself)")
+
+    for ((obj, outer) <- os) {
+      assert(obj.outer eq outer, s"${obj.outer} of $obj -- $outer")
+      serializeDeserialize(obj)
+      serializeDeserialize(outer)
+    }
+
+    println("deserializing outer objects with non-initialized inners again")
+    val aNotInit = deserialize(serANotInit).asInstanceOf[A]
+
+    println("accessing modules triggers initialization")
+    aNotInit.O
+    aNotInit.P
+    aNotInit.N.O
+    aNotInit.N.P
+
+    println("deserializing creates a new object graph, including new scala 'object' instances, no matter where serialization starts")
+    val deserializedAs: List[A] = List(
+      serializeDeserialize(a),
+      serializeDeserialize(a.O).outer.asInstanceOf[A],
+      serializeDeserialize(a.P).outer.asInstanceOf[A],
+      serializeDeserialize(a.v).outer.asInstanceOf[A]
+    )
+    for (aSD <- deserializedAs) {
+      assert(aSD ne a)
+      assert(aSD.O ne a.O)
+      assert(aSD.P ne a.P)
+      assert(aSD.N ne a.N)
+      assert(aSD.N.O ne a.N.O)
+      assert(aSD.N.P ne a.N.P)
+      assert(aSD.v ne a.v)
+      assert(aSD.a.O ne a.a.O)
+      assert(aSD.a.P ne a.a.P)
+    }
+  }
+}
+
+// tests for serializing / deserializing static modules
+
+object M extends S {
+  object O extends S
+
+  def u: S = {
+    object O extends S
+    O
+  }
+
+  val v: S = {
+    object O extends S
+    O
+  }
+
+  lazy val w: S = {
+    object O extends S
+    O
+  }
+
+  val f: () => S = () => {
+    object O extends S
+    O
+  }
+}
+
+object SerializingStaticModules {
+  def t(): Unit = {
+    println("init static module M and field v")
+    M
+
+    println("serDeser does not initialize nested static modules")
+    assert(serializeDeserialize(M) eq M)
+
+    println("init M.O")
+    M.O
+
+    println("serDeser nested static module")
+    assert(serializeDeserialize(M.O) eq M.O)
+
+    println("objects declared in field decls are not static modules, so they deserialize to new instances")
+    assert(serializeDeserialize(M.v) ne M.v)
+
+    println("init lazy val M.w")
+
+    println("objects declared in lazy val are not static modules either")
+    assert(serializeDeserialize(M.w) ne M.w)
+
+    println("object declared in a function: new instance created on each invocation")
+    assert(M.f() ne M.f())
+  }
+}
+
+
+object Test extends App {
+  DeserializeModuleNoConstructor.t()
+  SerializingStaticModules.t()
+}
diff --git a/test/files/run/t9387.scala b/test/files/run/t9387.scala
new file mode 100644
index 0000000..3e33d19
--- /dev/null
+++ b/test/files/run/t9387.scala
@@ -0,0 +1,20 @@
+class G[T]
+object G {
+  def v[T](x: T): G[T] = null
+}
+
+class A[T]
+object A {
+  def apply[T](x: => G[T]): A[T] = null
+}
+
+object T {
+  A[Unit](G.v(() => ())) // Was VerifyError
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    T
+  }
+
+}
\ No newline at end of file
diff --git a/test/files/run/t9387b.check b/test/files/run/t9387b.check
new file mode 100644
index 0000000..6a452c1
--- /dev/null
+++ b/test/files/run/t9387b.check
@@ -0,0 +1 @@
+()
diff --git a/test/files/run/t9387b.scala b/test/files/run/t9387b.scala
new file mode 100644
index 0000000..6339f4c
--- /dev/null
+++ b/test/files/run/t9387b.scala
@@ -0,0 +1,16 @@
+object T {
+  val f: Unit = () => ()
+  println(f)
+}
+
+object U {
+  def f[T](t: T): T = t
+  f[Unit](() => ())
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    T
+    U
+  }
+}
diff --git a/test/files/run/t9388-bin-compat.scala b/test/files/run/t9388-bin-compat.scala
new file mode 100644
index 0000000..a036466
--- /dev/null
+++ b/test/files/run/t9388-bin-compat.scala
@@ -0,0 +1,16 @@
+class C {
+  private object N extends Serializable { override def toString = "N" }
+  def foo = N.toString
+}
+object Test {
+  def main(args: Array[String]): Unit = {
+    val c = Class.forName("C")
+    assert(c.getDeclaredFields().toList.map(_.toString) ==
+      List("private volatile C$N$ C.C$$N$module")) // field is name-mangled (C$$N$module instead of just N$module)
+    assert(c.getDeclaredMethods().toList.map(_.toString).sorted ==
+      List("private C$N$ C.C$$N$lzycompute()",
+           "public C$N$ C.C$$N()",
+           "public java.lang.String C.foo()")) // accessor is public, name-mangled
+    assert((new C).foo == "N")
+  }
+}
diff --git a/test/files/run/t9403.flags b/test/files/run/t9403.flags
new file mode 100644
index 0000000..3076680
--- /dev/null
+++ b/test/files/run/t9403.flags
@@ -0,0 +1 @@
+-Ybackend:GenASM -optimize
diff --git a/test/files/run/t9403/C_1.scala b/test/files/run/t9403/C_1.scala
new file mode 100644
index 0000000..439af1a
--- /dev/null
+++ b/test/files/run/t9403/C_1.scala
@@ -0,0 +1,5 @@
+package p
+class C {
+  @inline final def f(x: Int): Long = 10L / (if (x < 0) -2 else 2)
+  @inline final def g(x: Int): Long = 3000L / (if (x < 0) -300 else 300)
+}
diff --git a/test/files/run/t9403/Test_2.scala b/test/files/run/t9403/Test_2.scala
new file mode 100644
index 0000000..fb2777b
--- /dev/null
+++ b/test/files/run/t9403/Test_2.scala
@@ -0,0 +1,29 @@
+import p.C
+import scala.tools.asm.Opcodes
+import scala.tools.partest.BytecodeTest
+import scala.tools.partest.ASMConverters._
+
+
+object Test extends BytecodeTest {
+  def foo(c: C, x: Int) = c.f(x)
+  def goo(c: C, x: Int) = c.g(x)
+
+  def has(i: Instruction, c: String, m: String) = {
+    val cls = loadClassNode(c)
+    val mth = convertMethod(getMethod(cls, m))
+    assert(mth.instructions.contains(i))
+  }
+
+  def show(): Unit = {
+    assert(foo(new C, -2) == -5L)
+    assert(goo(new C, -2) == -10L)
+
+    val bipush2 = IntOp(Opcodes.BIPUSH, -2)
+    has(bipush2, "p.C", "f")
+    has(bipush2, "Test$", "foo")
+
+    val sipush300 = IntOp(Opcodes.SIPUSH, -300)
+    has(sipush300, "p.C", "g")
+    has(sipush300, "Test$", "goo")
+  }
+}
diff --git a/test/files/run/t9422.scala b/test/files/run/t9422.scala
new file mode 100644
index 0000000..5ca2e8d
--- /dev/null
+++ b/test/files/run/t9422.scala
@@ -0,0 +1,11 @@
+class Test(val x: Long) {
+  def sameDirection(y: Long): Boolean =
+    (y == 0 || x == 0 || ((y > 0) == (x > 0)))
+}
+ 
+object Test {
+  def main(args: Array[String]) {
+    val b = new Test(1L)
+    assert(!b.sameDirection(-1L))
+  }
+}
diff --git a/test/files/run/t9425.scala b/test/files/run/t9425.scala
new file mode 100644
index 0000000..f251cc8
--- /dev/null
+++ b/test/files/run/t9425.scala
@@ -0,0 +1,8 @@
+class C { case class Foo private (x: Int); Foo.apply(0) }
+
+object Test {
+  def test(c: C) = {import c.Foo; Foo.apply(0)}
+  def main(args: Array[String]): Unit = {
+    test(new C)
+  }  
+}
diff --git a/test/files/run/t9546.scala b/test/files/run/t9546.scala
new file mode 100644
index 0000000..7016881
--- /dev/null
+++ b/test/files/run/t9546.scala
@@ -0,0 +1,13 @@
+package foo {
+  case class Opt[A] private[foo](val get: A) extends AnyVal
+  object Opt {
+    def mkOpt = Opt("")
+  }
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    foo.Opt.mkOpt
+  }
+}
+
diff --git a/test/files/run/t9546b.scala b/test/files/run/t9546b.scala
new file mode 100644
index 0000000..0b4d2d3
--- /dev/null
+++ b/test/files/run/t9546b.scala
@@ -0,0 +1,13 @@
+package foo {
+  case class Opt[A](val get: A) extends AnyVal {
+  }
+  object Opt {
+    def mkOpt = Opt("")
+  }
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    foo.Opt.mkOpt
+  }
+}
diff --git a/test/files/run/t9546c.scala b/test/files/run/t9546c.scala
new file mode 100644
index 0000000..ea6a5a3
--- /dev/null
+++ b/test/files/run/t9546c.scala
@@ -0,0 +1,13 @@
+package foo {
+  case class Opt[A] private[foo](val get: A)
+  object Opt {
+    def mkOpt = Opt("")
+  }
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    foo.Opt.mkOpt
+  }
+}
+
diff --git a/test/files/run/t9546d.scala b/test/files/run/t9546d.scala
new file mode 100644
index 0000000..00bf37d
--- /dev/null
+++ b/test/files/run/t9546d.scala
@@ -0,0 +1,16 @@
+class X {
+  def test: Any = {
+    object Opt {
+      def mkOpt = Opt("")
+    }
+    case class Opt[A] private[X](val get: A)
+    Opt.mkOpt
+  }
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    new X().test
+  }
+}
+
diff --git a/test/files/run/t9546e.scala b/test/files/run/t9546e.scala
new file mode 100644
index 0000000..b19d087
--- /dev/null
+++ b/test/files/run/t9546e.scala
@@ -0,0 +1,15 @@
+case class A private (x: Int)
+case class B private (x: Int)(y: Int)
+
+class C {
+  def f = A(1)
+  def g = B(1)(2) // was: constructor B in class B cannot be accessed in class C
+}
+
+object Test {
+  def main(args: Array[String]): Unit = {
+    new C().f
+    new C().g
+  }
+
+}
diff --git a/test/files/run/t9567.scala b/test/files/run/t9567.scala
new file mode 100644
index 0000000..69896b8
--- /dev/null
+++ b/test/files/run/t9567.scala
@@ -0,0 +1,18 @@
+object Test {
+  def testMethodLocalCaseClass {
+    case class MethodLocalWide(
+                                f01: Int, f02: Int, f03: Int, f04: Int, f05: Int, f06: Int, f07: Int, f08: Int, f09: Int, f10: Int,
+                                f11: Int, f12: Int, f13: Int, f14: Int, f15: Int, f16: Int, f17: Int, f18: Int, f19: Int, f20: Int,
+                                f21: Int, f22: Int, f23: Int)
+
+    val instance = MethodLocalWide(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+    val result = instance match {
+      case MethodLocalWide(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) => true
+      case _ => false
+    }
+    assert(result)
+  }
+  def main(args: Array[String]) {
+    testMethodLocalCaseClass
+  }
+}
diff --git a/test/files/run/t9567b.scala b/test/files/run/t9567b.scala
new file mode 100644
index 0000000..88cef0a
--- /dev/null
+++ b/test/files/run/t9567b.scala
@@ -0,0 +1,19 @@
+object Test {
+  def testMethodLocalCaseClass {
+    object MethodLocalWide
+    case class MethodLocalWide(
+                                f01: Int, f02: Int, f03: Int, f04: Int, f05: Int, f06: Int, f07: Int, f08: Int, f09: Int, f10: Int,
+                                f11: Int, f12: Int, f13: Int, f14: Int, f15: Int, f16: Int, f17: Int, f18: Int, f19: Int, f20: Int,
+                                f21: Int, f22: Int, f23: Int)
+
+    val instance = MethodLocalWide(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+    val result = instance match {
+      case MethodLocalWide(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) => true
+      case _ => false
+    }
+    assert(result)
+  }
+  def main(args: Array[String]) {
+    testMethodLocalCaseClass
+  }
+}
diff --git a/test/files/run/t9567c.scala b/test/files/run/t9567c.scala
new file mode 100644
index 0000000..560bea8
--- /dev/null
+++ b/test/files/run/t9567c.scala
@@ -0,0 +1,29 @@
+case class CaseSequenceTopLevel(as: Int*)
+
+object Test {
+   def main(args: Array[String]): Unit = {
+
+    val buffer1 = collection.mutable.Buffer(0, 0)
+    CaseSequenceTopLevel(buffer1: _*) match {
+      case CaseSequenceTopLevel(_, i) =>
+        buffer1(1) = 1
+        assert(i == 0, i) // fails in 2.11.7 -optimize
+    }
+
+    case class CaseSequence(as: Int*)
+    val buffer2 = collection.mutable.Buffer(0, 0)
+    CaseSequence(buffer2: _*) match {
+      case CaseSequence(_, i) =>
+        buffer2(1) = 1
+        assert(i == 0, i)
+    }
+
+    case class CaseSequenceWithVar(var x: Any, as: Int*)
+    val buffer3 = collection.mutable.Buffer(0, 0)
+    CaseSequenceWithVar("", buffer3: _*) match {
+      case CaseSequenceWithVar(_, _, i) => // crashes in 2.11.7
+        buffer2(1) = 1
+        assert(i == 0, i)
+    }
+  }
+}
diff --git a/test/files/run/test-cpp.scala b/test/files/run/test-cpp.scala
index 4e00e72..4fca67d 100644
--- a/test/files/run/test-cpp.scala
+++ b/test/files/run/test-cpp.scala
@@ -46,7 +46,7 @@ object TestSetterInline {
  * The access of the local variable 'y' should be replaced by the
  * constant.
  */
-object TestAliasChainConstat {
+object TestAliasChainConstant {
 
   def main(args: Array[String]): Unit = {
     val x = 2
diff --git a/test/files/run/toolbox-varargs/Test.scala b/test/files/run/toolbox-varargs/Test.scala
new file mode 100644
index 0000000..be5ab45
--- /dev/null
+++ b/test/files/run/toolbox-varargs/Test.scala
@@ -0,0 +1,13 @@
+object Test {
+  def main(args: Array[String]): Unit = {
+     import scala.tools.reflect.ToolBox
+     val m = reflect.runtime.currentMirror
+     val u = m.universe
+     import u._
+     val tb = m.mkToolBox();
+     tb.compile(q"new p.Varargs(null, null)")
+     tb.compile(q"p.Varargs.staticMethod(null, null)")
+     tb.compile(q"(null: p.Varargs).instanceMethod(null, null)")
+  }
+}
+
diff --git a/test/files/run/toolbox-varargs/Varargs.java b/test/files/run/toolbox-varargs/Varargs.java
new file mode 100644
index 0000000..da1dbba
--- /dev/null
+++ b/test/files/run/toolbox-varargs/Varargs.java
@@ -0,0 +1,8 @@
+package p;
+
+public class Varargs {
+	public Varargs(String... args) {}
+	public static void staticMethod(String... args) {}
+
+	public void instanceMethod(String... args) {}
+}
diff --git a/test/files/run/toolbox_expand_macro.check b/test/files/run/toolbox_expand_macro.check
new file mode 100644
index 0000000..d81cc07
--- /dev/null
+++ b/test/files/run/toolbox_expand_macro.check
@@ -0,0 +1 @@
+42
diff --git a/test/files/run/toolbox_expand_macro.scala b/test/files/run/toolbox_expand_macro.scala
new file mode 100644
index 0000000..a52e449
--- /dev/null
+++ b/test/files/run/toolbox_expand_macro.scala
@@ -0,0 +1,23 @@
+import scala.reflect.runtime.universe._
+import scala.reflect.runtime.{universe => ru}
+import scala.reflect.runtime.{currentMirror => cm}
+import scala.tools.reflect.{ToolBox}
+
+object Test extends App {
+  val toolBox = cm.mkToolBox()
+  val x = 21
+  val runtimeMacro =
+    q"""object RuntimeMacro {
+      import scala.reflect.macros.whitebox.Context
+      import scala.language.experimental.macros
+
+      def add(y: Int): Int = macro addImpl
+      def addImpl(c: Context)(y: c.Expr[Int]): c.Expr[Int] = {
+        import c.universe._
+        val x = $x
+        c.Expr[Int](q"$$x + $$y")
+      }
+    }"""
+  val s = toolBox.define(runtimeMacro)
+  println(toolBox.eval(q"$s.add(21)"))
+}
diff --git a/test/files/run/tpeCache-tyconCache.check b/test/files/run/tpeCache-tyconCache.check
index ff60481..b26f1ab 100644
--- a/test/files/run/tpeCache-tyconCache.check
+++ b/test/files/run/tpeCache-tyconCache.check
@@ -1,12 +1,8 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> :power
-** Power User mode enabled - BEEP WHIR GYVE **
-** :phase has been set to 'typer'.          **
-** scala.tools.nsc._ has been imported      **
-** global._, definitions._ also imported    **
-** Try  :help, :vals, power.<tab>           **
+Power mode enabled. :phase is at typer.
+import scala.tools.nsc._, intp.global._, definitions._
+Try :help or completions for vals._ and power._
 
 scala> 
 
diff --git a/test/files/run/valueClassSelfType.scala b/test/files/run/valueClassSelfType.scala
new file mode 100644
index 0000000..47a3764
--- /dev/null
+++ b/test/files/run/valueClassSelfType.scala
@@ -0,0 +1,52 @@
+trait T
+
+class V1(val l: Long) extends AnyVal { self: T =>
+  def foo: V1 = self
+  def bar: T  = self
+}
+
+class V2(val l: Long) extends AnyVal { self =>
+  def foo: V2 = self
+}
+
+class V3(val l: Long) extends AnyVal { self: Long =>
+  def foo: V3   = self
+  def bar: Long = self
+}
+
+// non-value classes
+
+class C1(val l: Long) { self: T =>
+  def foo: C1 = self
+  def bar: T  = self
+}
+
+class C2(val l: Long) { self =>
+  def foo: C2 = self
+}
+
+class C3(val l: Long) { self: Long =>
+  def foo: C3   = self
+  def bar: Long = self
+}
+
+object Test extends App {
+  // Rejected: superclass V1 is not a subclass of the superclass Object of the mixin trait T
+  // new V1(1l) with T
+
+  assert(new V2(1l).foo.l == 1l)
+
+  // Rejected: V3 does not conform to its self-type V3 with Long
+  // new V3(1l)
+
+  val c2 = new C1(2l) with T
+  assert(c2.foo.l + c2.bar.asInstanceOf[C1].l == 4l)
+
+  assert(new C2(3l).foo.l == 3l)
+
+  // Rejected: C3 does not conform to its self-type C3 with Long
+  // new C3(4l)
+
+  // Rejected: class Long needs to be a trait to be mixed in
+  // new C3(4l) with Long
+}
diff --git a/test/files/run/viewtest.scala b/test/files/run/viewtest.scala
old mode 100755
new mode 100644
diff --git a/test/files/run/weakconform.scala b/test/files/run/weakconform.scala
old mode 100755
new mode 100644
diff --git a/test/files/run/xMigration.check b/test/files/run/xMigration.check
index 378f7bb..cd860bf 100644
--- a/test/files/run/xMigration.check
+++ b/test/files/run/xMigration.check
@@ -1,5 +1,3 @@
-Type in expressions to have them evaluated.
-Type :help for more information.
 
 scala> Map(1 -> "eis").values    // no warn
 res0: Iterable[String] = MapLike(eis)
@@ -12,10 +10,10 @@ res1: Iterable[String] = MapLike(eis)
 scala> :setting -Xmigration:any
 
 scala> Map(1 -> "eis").values    // warn
-<console>:8: warning: method values in trait MapLike has changed semantics in version 2.8.0:
+<console>:12: warning: method values in trait MapLike has changed semantics in version 2.8.0:
 `values` returns `Iterable[B]` rather than `Iterator[B]`.
-              Map(1 -> "eis").values    // warn
-                              ^
+       Map(1 -> "eis").values    // warn
+                       ^
 res2: Iterable[String] = MapLike(eis)
 
 scala> :setting -Xmigration:2.8
@@ -26,10 +24,10 @@ res3: Iterable[String] = MapLike(eis)
 scala> :setting -Xmigration:2.7
 
 scala> Map(1 -> "eis").values    // warn
-<console>:8: warning: method values in trait MapLike has changed semantics in version 2.8.0:
+<console>:12: warning: method values in trait MapLike has changed semantics in version 2.8.0:
 `values` returns `Iterable[B]` rather than `Iterator[B]`.
-              Map(1 -> "eis").values    // warn
-                              ^
+       Map(1 -> "eis").values    // warn
+                       ^
 res4: Iterable[String] = MapLike(eis)
 
 scala> :setting -Xmigration:2.11
@@ -40,10 +38,10 @@ res5: Iterable[String] = MapLike(eis)
 scala> :setting -Xmigration      // same as :any
 
 scala> Map(1 -> "eis").values    // warn
-<console>:8: warning: method values in trait MapLike has changed semantics in version 2.8.0:
+<console>:12: warning: method values in trait MapLike has changed semantics in version 2.8.0:
 `values` returns `Iterable[B]` rather than `Iterator[B]`.
-              Map(1 -> "eis").values    // warn
-                              ^
+       Map(1 -> "eis").values    // warn
+                       ^
 res6: Iterable[String] = MapLike(eis)
 
 scala> :quit
diff --git a/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala b/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala
index 7bd3714..ab1056d 100644
--- a/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala
+++ b/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala
@@ -250,8 +250,8 @@ trait ArbitraryTreesAndNames {
                genAppliedTypeTree(size - 1), genTypeBoundsTree(size - 1))
 
   /*  These are marker types that allow to write tests that
-   *  depend specificly on Trees that are terms or types.
-   *  They are transparently tranformed to trees through
+   *  depend specifically on Trees that are terms or types.
+   *  They are transparently transformed to trees through
    *  implicit conversions and liftables for quasiquotes.
    */
 
diff --git a/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala b/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala
index fd81067..4ab8bb8 100644
--- a/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala
+++ b/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala
@@ -346,7 +346,7 @@ trait MethodConstruction { self: QuasiquoteProperties =>
     }
   }
 
-  property("can't unquote annotations with arguments specificed twice") = test {
+  property("can't unquote annotations with arguments specified twice") = test {
     val a = q"new a(x)"
     assertThrows[IllegalArgumentException] {
       q"@$a(y) def foo"
@@ -370,7 +370,7 @@ trait PackageConstruction { self: QuasiquoteProperties =>
     assertEqAst(q"package $name { }", "package foo.bar { }")
   }
 
-  property("splce name into package name") = test{
+  property("splice name into package name") = test{
     val name = TermName("bippy")
     assertEqAst(q"package $name { }", "package bippy { }")
   }
diff --git a/test/files/scalacheck/quasiquotes/ErrorProps.scala b/test/files/scalacheck/quasiquotes/ErrorProps.scala
index 2cba07a..0c24149 100644
--- a/test/files/scalacheck/quasiquotes/ErrorProps.scala
+++ b/test/files/scalacheck/quasiquotes/ErrorProps.scala
@@ -162,7 +162,7 @@ object ErrorProps extends QuasiquoteProperties("errors") {
       q"$n"
     """)
 
-  property("SI-8211: check unbound placeholder paremeters") = fails(
+  property("SI-8211: check unbound placeholder parameters") = fails(
     "unbound placeholder parameter",
     """
       q"_"
diff --git a/test/files/scalacheck/quasiquotes/RuntimeErrorProps.scala b/test/files/scalacheck/quasiquotes/RuntimeErrorProps.scala
index a3b6137..40fb42d 100644
--- a/test/files/scalacheck/quasiquotes/RuntimeErrorProps.scala
+++ b/test/files/scalacheck/quasiquotes/RuntimeErrorProps.scala
@@ -68,7 +68,7 @@ object RuntimeErrorProps extends QuasiquoteProperties("errors") {
     q"for(..$enums) 0"
   }
 
-  property("for inlalid enum") = testFails {
+  property("for invalid enum") = testFails {
     val enums = q"foo" :: Nil
     q"for(..$enums) 0"
   }
diff --git a/test/files/scalacheck/range.scala b/test/files/scalacheck/range.scala
index 493083a..ac24b52 100644
--- a/test/files/scalacheck/range.scala
+++ b/test/files/scalacheck/range.scala
@@ -134,7 +134,22 @@ abstract class RangeTest(kind: String) extends Properties("Range "+kind) {
     val expected = r.length match {
       case 0 => 0
       case 1 => r.head
-      case _ => ((r.head + r.last).toLong * r.length  / 2).toInt
+      case x if x < 1000 => 
+        // Explicit sum, to guard against having the same mistake in both the
+        // range implementation and test implementation of sum formula.
+        // (Yes, this happened before.)
+        var i = r.head
+        var s = 0L
+        var n = x
+        while (n > 0) {
+          s += i
+          i += r.step
+          n -= 1
+        }
+        s.toInt
+      case _ =>
+        // Make sure head + last doesn't overflow!
+        ((r.head.toLong + r.last) * r.length  / 2).toInt
     }
 //   println("size: " + r.length)
 //   println("expected: " + expected)
diff --git a/test/files/scalacheck/redblacktree.scala b/test/files/scalacheck/redblacktree.scala
index 871444a..4ded37b 100644
--- a/test/files/scalacheck/redblacktree.scala
+++ b/test/files/scalacheck/redblacktree.scala
@@ -33,7 +33,7 @@ package scala.collection.immutable.redblacktree {
 
     def mkTree(level: Int, parentIsBlack: Boolean = false, label: String = ""): Gen[Tree[String, Int]] =
       if (level == 0) {
-        value(null)
+        const(null)
       } else {
         for {
           oddOrEven <- choose(0, 2)
diff --git a/test/files/scalap/t8679.check b/test/files/scalap/t8679.check
new file mode 100644
index 0000000..938b767
--- /dev/null
+++ b/test/files/scalap/t8679.check
@@ -0,0 +1,3503 @@
+class T8679 extends scala.AnyRef {
+  def this() = { /* compiled code */ }
+  def foo1(): scala.Int = { /* compiled code */ }
+  def foo2(): scala.Int = { /* compiled code */ }
+  def foo3(): scala.Int = { /* compiled code */ }
+  def foo4(): scala.Int = { /* compiled code */ }
+  def foo5(): scala.Int = { /* compiled code */ }
+  def foo6(): scala.Int = { /* compiled code */ }
+  def foo7(): scala.Int = { /* compiled code */ }
+  def foo8(): scala.Int = { /* compiled code */ }
+  def foo9(): scala.Int = { /* compiled code */ }
+  def foo10(): scala.Int = { /* compiled code */ }
+  def foo11(): scala.Int = { /* compiled code */ }
+  def foo12(): scala.Int = { /* compiled code */ }
+  def foo13(): scala.Int = { /* compiled code */ }
+  def foo14(): scala.Int = { /* compiled code */ }
+  def foo15(): scala.Int = { /* compiled code */ }
+  def foo16(): scala.Int = { /* compiled code */ }
+  def foo17(): scala.Int = { /* compiled code */ }
+  def foo18(): scala.Int = { /* compiled code */ }
+  def foo19(): scala.Int = { /* compiled code */ }
+  def foo20(): scala.Int = { /* compiled code */ }
+  def foo21(): scala.Int = { /* compiled code */ }
+  def foo22(): scala.Int = { /* compiled code */ }
+  def foo23(): scala.Int = { /* compiled code */ }
+  def foo24(): scala.Int = { /* compiled code */ }
+  def foo25(): scala.Int = { /* compiled code */ }
+  def foo26(): scala.Int = { /* compiled code */ }
+  def foo27(): scala.Int = { /* compiled code */ }
+  def foo28(): scala.Int = { /* compiled code */ }
+  def foo29(): scala.Int = { /* compiled code */ }
+  def foo30(): scala.Int = { /* compiled code */ }
+  def foo31(): scala.Int = { /* compiled code */ }
+  def foo32(): scala.Int = { /* compiled code */ }
+  def foo33(): scala.Int = { /* compiled code */ }
+  def foo34(): scala.Int = { /* compiled code */ }
+  def foo35(): scala.Int = { /* compiled code */ }
+  def foo36(): scala.Int = { /* compiled code */ }
+  def foo37(): scala.Int = { /* compiled code */ }
+  def foo38(): scala.Int = { /* compiled code */ }
+  def foo39(): scala.Int = { /* compiled code */ }
+  def foo40(): scala.Int = { /* compiled code */ }
+  def foo41(): scala.Int = { /* compiled code */ }
+  def foo42(): scala.Int = { /* compiled code */ }
+  def foo43(): scala.Int = { /* compiled code */ }
+  def foo44(): scala.Int = { /* compiled code */ }
+  def foo45(): scala.Int = { /* compiled code */ }
+  def foo46(): scala.Int = { /* compiled code */ }
+  def foo47(): scala.Int = { /* compiled code */ }
+  def foo48(): scala.Int = { /* compiled code */ }
+  def foo49(): scala.Int = { /* compiled code */ }
+  def foo50(): scala.Int = { /* compiled code */ }
+  def foo51(): scala.Int = { /* compiled code */ }
+  def foo52(): scala.Int = { /* compiled code */ }
+  def foo53(): scala.Int = { /* compiled code */ }
+  def foo54(): scala.Int = { /* compiled code */ }
+  def foo55(): scala.Int = { /* compiled code */ }
+  def foo56(): scala.Int = { /* compiled code */ }
+  def foo57(): scala.Int = { /* compiled code */ }
+  def foo58(): scala.Int = { /* compiled code */ }
+  def foo59(): scala.Int = { /* compiled code */ }
+  def foo60(): scala.Int = { /* compiled code */ }
+  def foo61(): scala.Int = { /* compiled code */ }
+  def foo62(): scala.Int = { /* compiled code */ }
+  def foo63(): scala.Int = { /* compiled code */ }
+  def foo64(): scala.Int = { /* compiled code */ }
+  def foo65(): scala.Int = { /* compiled code */ }
+  def foo66(): scala.Int = { /* compiled code */ }
+  def foo67(): scala.Int = { /* compiled code */ }
+  def foo68(): scala.Int = { /* compiled code */ }
+  def foo69(): scala.Int = { /* compiled code */ }
+  def foo70(): scala.Int = { /* compiled code */ }
+  def foo71(): scala.Int = { /* compiled code */ }
+  def foo72(): scala.Int = { /* compiled code */ }
+  def foo73(): scala.Int = { /* compiled code */ }
+  def foo74(): scala.Int = { /* compiled code */ }
+  def foo75(): scala.Int = { /* compiled code */ }
+  def foo76(): scala.Int = { /* compiled code */ }
+  def foo77(): scala.Int = { /* compiled code */ }
+  def foo78(): scala.Int = { /* compiled code */ }
+  def foo79(): scala.Int = { /* compiled code */ }
+  def foo80(): scala.Int = { /* compiled code */ }
+  def foo81(): scala.Int = { /* compiled code */ }
+  def foo82(): scala.Int = { /* compiled code */ }
+  def foo83(): scala.Int = { /* compiled code */ }
+  def foo84(): scala.Int = { /* compiled code */ }
+  def foo85(): scala.Int = { /* compiled code */ }
+  def foo86(): scala.Int = { /* compiled code */ }
+  def foo87(): scala.Int = { /* compiled code */ }
+  def foo88(): scala.Int = { /* compiled code */ }
+  def foo89(): scala.Int = { /* compiled code */ }
+  def foo90(): scala.Int = { /* compiled code */ }
+  def foo91(): scala.Int = { /* compiled code */ }
+  def foo92(): scala.Int = { /* compiled code */ }
+  def foo93(): scala.Int = { /* compiled code */ }
+  def foo94(): scala.Int = { /* compiled code */ }
+  def foo95(): scala.Int = { /* compiled code */ }
+  def foo96(): scala.Int = { /* compiled code */ }
+  def foo97(): scala.Int = { /* compiled code */ }
+  def foo98(): scala.Int = { /* compiled code */ }
+  def foo99(): scala.Int = { /* compiled code */ }
+  def foo100(): scala.Int = { /* compiled code */ }
+  def foo101(): scala.Int = { /* compiled code */ }
+  def foo102(): scala.Int = { /* compiled code */ }
+  def foo103(): scala.Int = { /* compiled code */ }
+  def foo104(): scala.Int = { /* compiled code */ }
+  def foo105(): scala.Int = { /* compiled code */ }
+  def foo106(): scala.Int = { /* compiled code */ }
+  def foo107(): scala.Int = { /* compiled code */ }
+  def foo108(): scala.Int = { /* compiled code */ }
+  def foo109(): scala.Int = { /* compiled code */ }
+  def foo110(): scala.Int = { /* compiled code */ }
+  def foo111(): scala.Int = { /* compiled code */ }
+  def foo112(): scala.Int = { /* compiled code */ }
+  def foo113(): scala.Int = { /* compiled code */ }
+  def foo114(): scala.Int = { /* compiled code */ }
+  def foo115(): scala.Int = { /* compiled code */ }
+  def foo116(): scala.Int = { /* compiled code */ }
+  def foo117(): scala.Int = { /* compiled code */ }
+  def foo118(): scala.Int = { /* compiled code */ }
+  def foo119(): scala.Int = { /* compiled code */ }
+  def foo120(): scala.Int = { /* compiled code */ }
+  def foo121(): scala.Int = { /* compiled code */ }
+  def foo122(): scala.Int = { /* compiled code */ }
+  def foo123(): scala.Int = { /* compiled code */ }
+  def foo124(): scala.Int = { /* compiled code */ }
+  def foo125(): scala.Int = { /* compiled code */ }
+  def foo126(): scala.Int = { /* compiled code */ }
+  def foo127(): scala.Int = { /* compiled code */ }
+  def foo128(): scala.Int = { /* compiled code */ }
+  def foo129(): scala.Int = { /* compiled code */ }
+  def foo130(): scala.Int = { /* compiled code */ }
+  def foo131(): scala.Int = { /* compiled code */ }
+  def foo132(): scala.Int = { /* compiled code */ }
+  def foo133(): scala.Int = { /* compiled code */ }
+  def foo134(): scala.Int = { /* compiled code */ }
+  def foo135(): scala.Int = { /* compiled code */ }
+  def foo136(): scala.Int = { /* compiled code */ }
+  def foo137(): scala.Int = { /* compiled code */ }
+  def foo138(): scala.Int = { /* compiled code */ }
+  def foo139(): scala.Int = { /* compiled code */ }
+  def foo140(): scala.Int = { /* compiled code */ }
+  def foo141(): scala.Int = { /* compiled code */ }
+  def foo142(): scala.Int = { /* compiled code */ }
+  def foo143(): scala.Int = { /* compiled code */ }
+  def foo144(): scala.Int = { /* compiled code */ }
+  def foo145(): scala.Int = { /* compiled code */ }
+  def foo146(): scala.Int = { /* compiled code */ }
+  def foo147(): scala.Int = { /* compiled code */ }
+  def foo148(): scala.Int = { /* compiled code */ }
+  def foo149(): scala.Int = { /* compiled code */ }
+  def foo150(): scala.Int = { /* compiled code */ }
+  def foo151(): scala.Int = { /* compiled code */ }
+  def foo152(): scala.Int = { /* compiled code */ }
+  def foo153(): scala.Int = { /* compiled code */ }
+  def foo154(): scala.Int = { /* compiled code */ }
+  def foo155(): scala.Int = { /* compiled code */ }
+  def foo156(): scala.Int = { /* compiled code */ }
+  def foo157(): scala.Int = { /* compiled code */ }
+  def foo158(): scala.Int = { /* compiled code */ }
+  def foo159(): scala.Int = { /* compiled code */ }
+  def foo160(): scala.Int = { /* compiled code */ }
+  def foo161(): scala.Int = { /* compiled code */ }
+  def foo162(): scala.Int = { /* compiled code */ }
+  def foo163(): scala.Int = { /* compiled code */ }
+  def foo164(): scala.Int = { /* compiled code */ }
+  def foo165(): scala.Int = { /* compiled code */ }
+  def foo166(): scala.Int = { /* compiled code */ }
+  def foo167(): scala.Int = { /* compiled code */ }
+  def foo168(): scala.Int = { /* compiled code */ }
+  def foo169(): scala.Int = { /* compiled code */ }
+  def foo170(): scala.Int = { /* compiled code */ }
+  def foo171(): scala.Int = { /* compiled code */ }
+  def foo172(): scala.Int = { /* compiled code */ }
+  def foo173(): scala.Int = { /* compiled code */ }
+  def foo174(): scala.Int = { /* compiled code */ }
+  def foo175(): scala.Int = { /* compiled code */ }
+  def foo176(): scala.Int = { /* compiled code */ }
+  def foo177(): scala.Int = { /* compiled code */ }
+  def foo178(): scala.Int = { /* compiled code */ }
+  def foo179(): scala.Int = { /* compiled code */ }
+  def foo180(): scala.Int = { /* compiled code */ }
+  def foo181(): scala.Int = { /* compiled code */ }
+  def foo182(): scala.Int = { /* compiled code */ }
+  def foo183(): scala.Int = { /* compiled code */ }
+  def foo184(): scala.Int = { /* compiled code */ }
+  def foo185(): scala.Int = { /* compiled code */ }
+  def foo186(): scala.Int = { /* compiled code */ }
+  def foo187(): scala.Int = { /* compiled code */ }
+  def foo188(): scala.Int = { /* compiled code */ }
+  def foo189(): scala.Int = { /* compiled code */ }
+  def foo190(): scala.Int = { /* compiled code */ }
+  def foo191(): scala.Int = { /* compiled code */ }
+  def foo192(): scala.Int = { /* compiled code */ }
+  def foo193(): scala.Int = { /* compiled code */ }
+  def foo194(): scala.Int = { /* compiled code */ }
+  def foo195(): scala.Int = { /* compiled code */ }
+  def foo196(): scala.Int = { /* compiled code */ }
+  def foo197(): scala.Int = { /* compiled code */ }
+  def foo198(): scala.Int = { /* compiled code */ }
+  def foo199(): scala.Int = { /* compiled code */ }
+  def foo200(): scala.Int = { /* compiled code */ }
+  def foo201(): scala.Int = { /* compiled code */ }
+  def foo202(): scala.Int = { /* compiled code */ }
+  def foo203(): scala.Int = { /* compiled code */ }
+  def foo204(): scala.Int = { /* compiled code */ }
+  def foo205(): scala.Int = { /* compiled code */ }
+  def foo206(): scala.Int = { /* compiled code */ }
+  def foo207(): scala.Int = { /* compiled code */ }
+  def foo208(): scala.Int = { /* compiled code */ }
+  def foo209(): scala.Int = { /* compiled code */ }
+  def foo210(): scala.Int = { /* compiled code */ }
+  def foo211(): scala.Int = { /* compiled code */ }
+  def foo212(): scala.Int = { /* compiled code */ }
+  def foo213(): scala.Int = { /* compiled code */ }
+  def foo214(): scala.Int = { /* compiled code */ }
+  def foo215(): scala.Int = { /* compiled code */ }
+  def foo216(): scala.Int = { /* compiled code */ }
+  def foo217(): scala.Int = { /* compiled code */ }
+  def foo218(): scala.Int = { /* compiled code */ }
+  def foo219(): scala.Int = { /* compiled code */ }
+  def foo220(): scala.Int = { /* compiled code */ }
+  def foo221(): scala.Int = { /* compiled code */ }
+  def foo222(): scala.Int = { /* compiled code */ }
+  def foo223(): scala.Int = { /* compiled code */ }
+  def foo224(): scala.Int = { /* compiled code */ }
+  def foo225(): scala.Int = { /* compiled code */ }
+  def foo226(): scala.Int = { /* compiled code */ }
+  def foo227(): scala.Int = { /* compiled code */ }
+  def foo228(): scala.Int = { /* compiled code */ }
+  def foo229(): scala.Int = { /* compiled code */ }
+  def foo230(): scala.Int = { /* compiled code */ }
+  def foo231(): scala.Int = { /* compiled code */ }
+  def foo232(): scala.Int = { /* compiled code */ }
+  def foo233(): scala.Int = { /* compiled code */ }
+  def foo234(): scala.Int = { /* compiled code */ }
+  def foo235(): scala.Int = { /* compiled code */ }
+  def foo236(): scala.Int = { /* compiled code */ }
+  def foo237(): scala.Int = { /* compiled code */ }
+  def foo238(): scala.Int = { /* compiled code */ }
+  def foo239(): scala.Int = { /* compiled code */ }
+  def foo240(): scala.Int = { /* compiled code */ }
+  def foo241(): scala.Int = { /* compiled code */ }
+  def foo242(): scala.Int = { /* compiled code */ }
+  def foo243(): scala.Int = { /* compiled code */ }
+  def foo244(): scala.Int = { /* compiled code */ }
+  def foo245(): scala.Int = { /* compiled code */ }
+  def foo246(): scala.Int = { /* compiled code */ }
+  def foo247(): scala.Int = { /* compiled code */ }
+  def foo248(): scala.Int = { /* compiled code */ }
+  def foo249(): scala.Int = { /* compiled code */ }
+  def foo250(): scala.Int = { /* compiled code */ }
+  def foo251(): scala.Int = { /* compiled code */ }
+  def foo252(): scala.Int = { /* compiled code */ }
+  def foo253(): scala.Int = { /* compiled code */ }
+  def foo254(): scala.Int = { /* compiled code */ }
+  def foo255(): scala.Int = { /* compiled code */ }
+  def foo256(): scala.Int = { /* compiled code */ }
+  def foo257(): scala.Int = { /* compiled code */ }
+  def foo258(): scala.Int = { /* compiled code */ }
+  def foo259(): scala.Int = { /* compiled code */ }
+  def foo260(): scala.Int = { /* compiled code */ }
+  def foo261(): scala.Int = { /* compiled code */ }
+  def foo262(): scala.Int = { /* compiled code */ }
+  def foo263(): scala.Int = { /* compiled code */ }
+  def foo264(): scala.Int = { /* compiled code */ }
+  def foo265(): scala.Int = { /* compiled code */ }
+  def foo266(): scala.Int = { /* compiled code */ }
+  def foo267(): scala.Int = { /* compiled code */ }
+  def foo268(): scala.Int = { /* compiled code */ }
+  def foo269(): scala.Int = { /* compiled code */ }
+  def foo270(): scala.Int = { /* compiled code */ }
+  def foo271(): scala.Int = { /* compiled code */ }
+  def foo272(): scala.Int = { /* compiled code */ }
+  def foo273(): scala.Int = { /* compiled code */ }
+  def foo274(): scala.Int = { /* compiled code */ }
+  def foo275(): scala.Int = { /* compiled code */ }
+  def foo276(): scala.Int = { /* compiled code */ }
+  def foo277(): scala.Int = { /* compiled code */ }
+  def foo278(): scala.Int = { /* compiled code */ }
+  def foo279(): scala.Int = { /* compiled code */ }
+  def foo280(): scala.Int = { /* compiled code */ }
+  def foo281(): scala.Int = { /* compiled code */ }
+  def foo282(): scala.Int = { /* compiled code */ }
+  def foo283(): scala.Int = { /* compiled code */ }
+  def foo284(): scala.Int = { /* compiled code */ }
+  def foo285(): scala.Int = { /* compiled code */ }
+  def foo286(): scala.Int = { /* compiled code */ }
+  def foo287(): scala.Int = { /* compiled code */ }
+  def foo288(): scala.Int = { /* compiled code */ }
+  def foo289(): scala.Int = { /* compiled code */ }
+  def foo290(): scala.Int = { /* compiled code */ }
+  def foo291(): scala.Int = { /* compiled code */ }
+  def foo292(): scala.Int = { /* compiled code */ }
+  def foo293(): scala.Int = { /* compiled code */ }
+  def foo294(): scala.Int = { /* compiled code */ }
+  def foo295(): scala.Int = { /* compiled code */ }
+  def foo296(): scala.Int = { /* compiled code */ }
+  def foo297(): scala.Int = { /* compiled code */ }
+  def foo298(): scala.Int = { /* compiled code */ }
+  def foo299(): scala.Int = { /* compiled code */ }
+  def foo300(): scala.Int = { /* compiled code */ }
+  def foo301(): scala.Int = { /* compiled code */ }
+  def foo302(): scala.Int = { /* compiled code */ }
+  def foo303(): scala.Int = { /* compiled code */ }
+  def foo304(): scala.Int = { /* compiled code */ }
+  def foo305(): scala.Int = { /* compiled code */ }
+  def foo306(): scala.Int = { /* compiled code */ }
+  def foo307(): scala.Int = { /* compiled code */ }
+  def foo308(): scala.Int = { /* compiled code */ }
+  def foo309(): scala.Int = { /* compiled code */ }
+  def foo310(): scala.Int = { /* compiled code */ }
+  def foo311(): scala.Int = { /* compiled code */ }
+  def foo312(): scala.Int = { /* compiled code */ }
+  def foo313(): scala.Int = { /* compiled code */ }
+  def foo314(): scala.Int = { /* compiled code */ }
+  def foo315(): scala.Int = { /* compiled code */ }
+  def foo316(): scala.Int = { /* compiled code */ }
+  def foo317(): scala.Int = { /* compiled code */ }
+  def foo318(): scala.Int = { /* compiled code */ }
+  def foo319(): scala.Int = { /* compiled code */ }
+  def foo320(): scala.Int = { /* compiled code */ }
+  def foo321(): scala.Int = { /* compiled code */ }
+  def foo322(): scala.Int = { /* compiled code */ }
+  def foo323(): scala.Int = { /* compiled code */ }
+  def foo324(): scala.Int = { /* compiled code */ }
+  def foo325(): scala.Int = { /* compiled code */ }
+  def foo326(): scala.Int = { /* compiled code */ }
+  def foo327(): scala.Int = { /* compiled code */ }
+  def foo328(): scala.Int = { /* compiled code */ }
+  def foo329(): scala.Int = { /* compiled code */ }
+  def foo330(): scala.Int = { /* compiled code */ }
+  def foo331(): scala.Int = { /* compiled code */ }
+  def foo332(): scala.Int = { /* compiled code */ }
+  def foo333(): scala.Int = { /* compiled code */ }
+  def foo334(): scala.Int = { /* compiled code */ }
+  def foo335(): scala.Int = { /* compiled code */ }
+  def foo336(): scala.Int = { /* compiled code */ }
+  def foo337(): scala.Int = { /* compiled code */ }
+  def foo338(): scala.Int = { /* compiled code */ }
+  def foo339(): scala.Int = { /* compiled code */ }
+  def foo340(): scala.Int = { /* compiled code */ }
+  def foo341(): scala.Int = { /* compiled code */ }
+  def foo342(): scala.Int = { /* compiled code */ }
+  def foo343(): scala.Int = { /* compiled code */ }
+  def foo344(): scala.Int = { /* compiled code */ }
+  def foo345(): scala.Int = { /* compiled code */ }
+  def foo346(): scala.Int = { /* compiled code */ }
+  def foo347(): scala.Int = { /* compiled code */ }
+  def foo348(): scala.Int = { /* compiled code */ }
+  def foo349(): scala.Int = { /* compiled code */ }
+  def foo350(): scala.Int = { /* compiled code */ }
+  def foo351(): scala.Int = { /* compiled code */ }
+  def foo352(): scala.Int = { /* compiled code */ }
+  def foo353(): scala.Int = { /* compiled code */ }
+  def foo354(): scala.Int = { /* compiled code */ }
+  def foo355(): scala.Int = { /* compiled code */ }
+  def foo356(): scala.Int = { /* compiled code */ }
+  def foo357(): scala.Int = { /* compiled code */ }
+  def foo358(): scala.Int = { /* compiled code */ }
+  def foo359(): scala.Int = { /* compiled code */ }
+  def foo360(): scala.Int = { /* compiled code */ }
+  def foo361(): scala.Int = { /* compiled code */ }
+  def foo362(): scala.Int = { /* compiled code */ }
+  def foo363(): scala.Int = { /* compiled code */ }
+  def foo364(): scala.Int = { /* compiled code */ }
+  def foo365(): scala.Int = { /* compiled code */ }
+  def foo366(): scala.Int = { /* compiled code */ }
+  def foo367(): scala.Int = { /* compiled code */ }
+  def foo368(): scala.Int = { /* compiled code */ }
+  def foo369(): scala.Int = { /* compiled code */ }
+  def foo370(): scala.Int = { /* compiled code */ }
+  def foo371(): scala.Int = { /* compiled code */ }
+  def foo372(): scala.Int = { /* compiled code */ }
+  def foo373(): scala.Int = { /* compiled code */ }
+  def foo374(): scala.Int = { /* compiled code */ }
+  def foo375(): scala.Int = { /* compiled code */ }
+  def foo376(): scala.Int = { /* compiled code */ }
+  def foo377(): scala.Int = { /* compiled code */ }
+  def foo378(): scala.Int = { /* compiled code */ }
+  def foo379(): scala.Int = { /* compiled code */ }
+  def foo380(): scala.Int = { /* compiled code */ }
+  def foo381(): scala.Int = { /* compiled code */ }
+  def foo382(): scala.Int = { /* compiled code */ }
+  def foo383(): scala.Int = { /* compiled code */ }
+  def foo384(): scala.Int = { /* compiled code */ }
+  def foo385(): scala.Int = { /* compiled code */ }
+  def foo386(): scala.Int = { /* compiled code */ }
+  def foo387(): scala.Int = { /* compiled code */ }
+  def foo388(): scala.Int = { /* compiled code */ }
+  def foo389(): scala.Int = { /* compiled code */ }
+  def foo390(): scala.Int = { /* compiled code */ }
+  def foo391(): scala.Int = { /* compiled code */ }
+  def foo392(): scala.Int = { /* compiled code */ }
+  def foo393(): scala.Int = { /* compiled code */ }
+  def foo394(): scala.Int = { /* compiled code */ }
+  def foo395(): scala.Int = { /* compiled code */ }
+  def foo396(): scala.Int = { /* compiled code */ }
+  def foo397(): scala.Int = { /* compiled code */ }
+  def foo398(): scala.Int = { /* compiled code */ }
+  def foo399(): scala.Int = { /* compiled code */ }
+  def foo400(): scala.Int = { /* compiled code */ }
+  def foo401(): scala.Int = { /* compiled code */ }
+  def foo402(): scala.Int = { /* compiled code */ }
+  def foo403(): scala.Int = { /* compiled code */ }
+  def foo404(): scala.Int = { /* compiled code */ }
+  def foo405(): scala.Int = { /* compiled code */ }
+  def foo406(): scala.Int = { /* compiled code */ }
+  def foo407(): scala.Int = { /* compiled code */ }
+  def foo408(): scala.Int = { /* compiled code */ }
+  def foo409(): scala.Int = { /* compiled code */ }
+  def foo410(): scala.Int = { /* compiled code */ }
+  def foo411(): scala.Int = { /* compiled code */ }
+  def foo412(): scala.Int = { /* compiled code */ }
+  def foo413(): scala.Int = { /* compiled code */ }
+  def foo414(): scala.Int = { /* compiled code */ }
+  def foo415(): scala.Int = { /* compiled code */ }
+  def foo416(): scala.Int = { /* compiled code */ }
+  def foo417(): scala.Int = { /* compiled code */ }
+  def foo418(): scala.Int = { /* compiled code */ }
+  def foo419(): scala.Int = { /* compiled code */ }
+  def foo420(): scala.Int = { /* compiled code */ }
+  def foo421(): scala.Int = { /* compiled code */ }
+  def foo422(): scala.Int = { /* compiled code */ }
+  def foo423(): scala.Int = { /* compiled code */ }
+  def foo424(): scala.Int = { /* compiled code */ }
+  def foo425(): scala.Int = { /* compiled code */ }
+  def foo426(): scala.Int = { /* compiled code */ }
+  def foo427(): scala.Int = { /* compiled code */ }
+  def foo428(): scala.Int = { /* compiled code */ }
+  def foo429(): scala.Int = { /* compiled code */ }
+  def foo430(): scala.Int = { /* compiled code */ }
+  def foo431(): scala.Int = { /* compiled code */ }
+  def foo432(): scala.Int = { /* compiled code */ }
+  def foo433(): scala.Int = { /* compiled code */ }
+  def foo434(): scala.Int = { /* compiled code */ }
+  def foo435(): scala.Int = { /* compiled code */ }
+  def foo436(): scala.Int = { /* compiled code */ }
+  def foo437(): scala.Int = { /* compiled code */ }
+  def foo438(): scala.Int = { /* compiled code */ }
+  def foo439(): scala.Int = { /* compiled code */ }
+  def foo440(): scala.Int = { /* compiled code */ }
+  def foo441(): scala.Int = { /* compiled code */ }
+  def foo442(): scala.Int = { /* compiled code */ }
+  def foo443(): scala.Int = { /* compiled code */ }
+  def foo444(): scala.Int = { /* compiled code */ }
+  def foo445(): scala.Int = { /* compiled code */ }
+  def foo446(): scala.Int = { /* compiled code */ }
+  def foo447(): scala.Int = { /* compiled code */ }
+  def foo448(): scala.Int = { /* compiled code */ }
+  def foo449(): scala.Int = { /* compiled code */ }
+  def foo450(): scala.Int = { /* compiled code */ }
+  def foo451(): scala.Int = { /* compiled code */ }
+  def foo452(): scala.Int = { /* compiled code */ }
+  def foo453(): scala.Int = { /* compiled code */ }
+  def foo454(): scala.Int = { /* compiled code */ }
+  def foo455(): scala.Int = { /* compiled code */ }
+  def foo456(): scala.Int = { /* compiled code */ }
+  def foo457(): scala.Int = { /* compiled code */ }
+  def foo458(): scala.Int = { /* compiled code */ }
+  def foo459(): scala.Int = { /* compiled code */ }
+  def foo460(): scala.Int = { /* compiled code */ }
+  def foo461(): scala.Int = { /* compiled code */ }
+  def foo462(): scala.Int = { /* compiled code */ }
+  def foo463(): scala.Int = { /* compiled code */ }
+  def foo464(): scala.Int = { /* compiled code */ }
+  def foo465(): scala.Int = { /* compiled code */ }
+  def foo466(): scala.Int = { /* compiled code */ }
+  def foo467(): scala.Int = { /* compiled code */ }
+  def foo468(): scala.Int = { /* compiled code */ }
+  def foo469(): scala.Int = { /* compiled code */ }
+  def foo470(): scala.Int = { /* compiled code */ }
+  def foo471(): scala.Int = { /* compiled code */ }
+  def foo472(): scala.Int = { /* compiled code */ }
+  def foo473(): scala.Int = { /* compiled code */ }
+  def foo474(): scala.Int = { /* compiled code */ }
+  def foo475(): scala.Int = { /* compiled code */ }
+  def foo476(): scala.Int = { /* compiled code */ }
+  def foo477(): scala.Int = { /* compiled code */ }
+  def foo478(): scala.Int = { /* compiled code */ }
+  def foo479(): scala.Int = { /* compiled code */ }
+  def foo480(): scala.Int = { /* compiled code */ }
+  def foo481(): scala.Int = { /* compiled code */ }
+  def foo482(): scala.Int = { /* compiled code */ }
+  def foo483(): scala.Int = { /* compiled code */ }
+  def foo484(): scala.Int = { /* compiled code */ }
+  def foo485(): scala.Int = { /* compiled code */ }
+  def foo486(): scala.Int = { /* compiled code */ }
+  def foo487(): scala.Int = { /* compiled code */ }
+  def foo488(): scala.Int = { /* compiled code */ }
+  def foo489(): scala.Int = { /* compiled code */ }
+  def foo490(): scala.Int = { /* compiled code */ }
+  def foo491(): scala.Int = { /* compiled code */ }
+  def foo492(): scala.Int = { /* compiled code */ }
+  def foo493(): scala.Int = { /* compiled code */ }
+  def foo494(): scala.Int = { /* compiled code */ }
+  def foo495(): scala.Int = { /* compiled code */ }
+  def foo496(): scala.Int = { /* compiled code */ }
+  def foo497(): scala.Int = { /* compiled code */ }
+  def foo498(): scala.Int = { /* compiled code */ }
+  def foo499(): scala.Int = { /* compiled code */ }
+  def foo500(): scala.Int = { /* compiled code */ }
+  def foo501(): scala.Int = { /* compiled code */ }
+  def foo502(): scala.Int = { /* compiled code */ }
+  def foo503(): scala.Int = { /* compiled code */ }
+  def foo504(): scala.Int = { /* compiled code */ }
+  def foo505(): scala.Int = { /* compiled code */ }
+  def foo506(): scala.Int = { /* compiled code */ }
+  def foo507(): scala.Int = { /* compiled code */ }
+  def foo508(): scala.Int = { /* compiled code */ }
+  def foo509(): scala.Int = { /* compiled code */ }
+  def foo510(): scala.Int = { /* compiled code */ }
+  def foo511(): scala.Int = { /* compiled code */ }
+  def foo512(): scala.Int = { /* compiled code */ }
+  def foo513(): scala.Int = { /* compiled code */ }
+  def foo514(): scala.Int = { /* compiled code */ }
+  def foo515(): scala.Int = { /* compiled code */ }
+  def foo516(): scala.Int = { /* compiled code */ }
+  def foo517(): scala.Int = { /* compiled code */ }
+  def foo518(): scala.Int = { /* compiled code */ }
+  def foo519(): scala.Int = { /* compiled code */ }
+  def foo520(): scala.Int = { /* compiled code */ }
+  def foo521(): scala.Int = { /* compiled code */ }
+  def foo522(): scala.Int = { /* compiled code */ }
+  def foo523(): scala.Int = { /* compiled code */ }
+  def foo524(): scala.Int = { /* compiled code */ }
+  def foo525(): scala.Int = { /* compiled code */ }
+  def foo526(): scala.Int = { /* compiled code */ }
+  def foo527(): scala.Int = { /* compiled code */ }
+  def foo528(): scala.Int = { /* compiled code */ }
+  def foo529(): scala.Int = { /* compiled code */ }
+  def foo530(): scala.Int = { /* compiled code */ }
+  def foo531(): scala.Int = { /* compiled code */ }
+  def foo532(): scala.Int = { /* compiled code */ }
+  def foo533(): scala.Int = { /* compiled code */ }
+  def foo534(): scala.Int = { /* compiled code */ }
+  def foo535(): scala.Int = { /* compiled code */ }
+  def foo536(): scala.Int = { /* compiled code */ }
+  def foo537(): scala.Int = { /* compiled code */ }
+  def foo538(): scala.Int = { /* compiled code */ }
+  def foo539(): scala.Int = { /* compiled code */ }
+  def foo540(): scala.Int = { /* compiled code */ }
+  def foo541(): scala.Int = { /* compiled code */ }
+  def foo542(): scala.Int = { /* compiled code */ }
+  def foo543(): scala.Int = { /* compiled code */ }
+  def foo544(): scala.Int = { /* compiled code */ }
+  def foo545(): scala.Int = { /* compiled code */ }
+  def foo546(): scala.Int = { /* compiled code */ }
+  def foo547(): scala.Int = { /* compiled code */ }
+  def foo548(): scala.Int = { /* compiled code */ }
+  def foo549(): scala.Int = { /* compiled code */ }
+  def foo550(): scala.Int = { /* compiled code */ }
+  def foo551(): scala.Int = { /* compiled code */ }
+  def foo552(): scala.Int = { /* compiled code */ }
+  def foo553(): scala.Int = { /* compiled code */ }
+  def foo554(): scala.Int = { /* compiled code */ }
+  def foo555(): scala.Int = { /* compiled code */ }
+  def foo556(): scala.Int = { /* compiled code */ }
+  def foo557(): scala.Int = { /* compiled code */ }
+  def foo558(): scala.Int = { /* compiled code */ }
+  def foo559(): scala.Int = { /* compiled code */ }
+  def foo560(): scala.Int = { /* compiled code */ }
+  def foo561(): scala.Int = { /* compiled code */ }
+  def foo562(): scala.Int = { /* compiled code */ }
+  def foo563(): scala.Int = { /* compiled code */ }
+  def foo564(): scala.Int = { /* compiled code */ }
+  def foo565(): scala.Int = { /* compiled code */ }
+  def foo566(): scala.Int = { /* compiled code */ }
+  def foo567(): scala.Int = { /* compiled code */ }
+  def foo568(): scala.Int = { /* compiled code */ }
+  def foo569(): scala.Int = { /* compiled code */ }
+  def foo570(): scala.Int = { /* compiled code */ }
+  def foo571(): scala.Int = { /* compiled code */ }
+  def foo572(): scala.Int = { /* compiled code */ }
+  def foo573(): scala.Int = { /* compiled code */ }
+  def foo574(): scala.Int = { /* compiled code */ }
+  def foo575(): scala.Int = { /* compiled code */ }
+  def foo576(): scala.Int = { /* compiled code */ }
+  def foo577(): scala.Int = { /* compiled code */ }
+  def foo578(): scala.Int = { /* compiled code */ }
+  def foo579(): scala.Int = { /* compiled code */ }
+  def foo580(): scala.Int = { /* compiled code */ }
+  def foo581(): scala.Int = { /* compiled code */ }
+  def foo582(): scala.Int = { /* compiled code */ }
+  def foo583(): scala.Int = { /* compiled code */ }
+  def foo584(): scala.Int = { /* compiled code */ }
+  def foo585(): scala.Int = { /* compiled code */ }
+  def foo586(): scala.Int = { /* compiled code */ }
+  def foo587(): scala.Int = { /* compiled code */ }
+  def foo588(): scala.Int = { /* compiled code */ }
+  def foo589(): scala.Int = { /* compiled code */ }
+  def foo590(): scala.Int = { /* compiled code */ }
+  def foo591(): scala.Int = { /* compiled code */ }
+  def foo592(): scala.Int = { /* compiled code */ }
+  def foo593(): scala.Int = { /* compiled code */ }
+  def foo594(): scala.Int = { /* compiled code */ }
+  def foo595(): scala.Int = { /* compiled code */ }
+  def foo596(): scala.Int = { /* compiled code */ }
+  def foo597(): scala.Int = { /* compiled code */ }
+  def foo598(): scala.Int = { /* compiled code */ }
+  def foo599(): scala.Int = { /* compiled code */ }
+  def foo600(): scala.Int = { /* compiled code */ }
+  def foo601(): scala.Int = { /* compiled code */ }
+  def foo602(): scala.Int = { /* compiled code */ }
+  def foo603(): scala.Int = { /* compiled code */ }
+  def foo604(): scala.Int = { /* compiled code */ }
+  def foo605(): scala.Int = { /* compiled code */ }
+  def foo606(): scala.Int = { /* compiled code */ }
+  def foo607(): scala.Int = { /* compiled code */ }
+  def foo608(): scala.Int = { /* compiled code */ }
+  def foo609(): scala.Int = { /* compiled code */ }
+  def foo610(): scala.Int = { /* compiled code */ }
+  def foo611(): scala.Int = { /* compiled code */ }
+  def foo612(): scala.Int = { /* compiled code */ }
+  def foo613(): scala.Int = { /* compiled code */ }
+  def foo614(): scala.Int = { /* compiled code */ }
+  def foo615(): scala.Int = { /* compiled code */ }
+  def foo616(): scala.Int = { /* compiled code */ }
+  def foo617(): scala.Int = { /* compiled code */ }
+  def foo618(): scala.Int = { /* compiled code */ }
+  def foo619(): scala.Int = { /* compiled code */ }
+  def foo620(): scala.Int = { /* compiled code */ }
+  def foo621(): scala.Int = { /* compiled code */ }
+  def foo622(): scala.Int = { /* compiled code */ }
+  def foo623(): scala.Int = { /* compiled code */ }
+  def foo624(): scala.Int = { /* compiled code */ }
+  def foo625(): scala.Int = { /* compiled code */ }
+  def foo626(): scala.Int = { /* compiled code */ }
+  def foo627(): scala.Int = { /* compiled code */ }
+  def foo628(): scala.Int = { /* compiled code */ }
+  def foo629(): scala.Int = { /* compiled code */ }
+  def foo630(): scala.Int = { /* compiled code */ }
+  def foo631(): scala.Int = { /* compiled code */ }
+  def foo632(): scala.Int = { /* compiled code */ }
+  def foo633(): scala.Int = { /* compiled code */ }
+  def foo634(): scala.Int = { /* compiled code */ }
+  def foo635(): scala.Int = { /* compiled code */ }
+  def foo636(): scala.Int = { /* compiled code */ }
+  def foo637(): scala.Int = { /* compiled code */ }
+  def foo638(): scala.Int = { /* compiled code */ }
+  def foo639(): scala.Int = { /* compiled code */ }
+  def foo640(): scala.Int = { /* compiled code */ }
+  def foo641(): scala.Int = { /* compiled code */ }
+  def foo642(): scala.Int = { /* compiled code */ }
+  def foo643(): scala.Int = { /* compiled code */ }
+  def foo644(): scala.Int = { /* compiled code */ }
+  def foo645(): scala.Int = { /* compiled code */ }
+  def foo646(): scala.Int = { /* compiled code */ }
+  def foo647(): scala.Int = { /* compiled code */ }
+  def foo648(): scala.Int = { /* compiled code */ }
+  def foo649(): scala.Int = { /* compiled code */ }
+  def foo650(): scala.Int = { /* compiled code */ }
+  def foo651(): scala.Int = { /* compiled code */ }
+  def foo652(): scala.Int = { /* compiled code */ }
+  def foo653(): scala.Int = { /* compiled code */ }
+  def foo654(): scala.Int = { /* compiled code */ }
+  def foo655(): scala.Int = { /* compiled code */ }
+  def foo656(): scala.Int = { /* compiled code */ }
+  def foo657(): scala.Int = { /* compiled code */ }
+  def foo658(): scala.Int = { /* compiled code */ }
+  def foo659(): scala.Int = { /* compiled code */ }
+  def foo660(): scala.Int = { /* compiled code */ }
+  def foo661(): scala.Int = { /* compiled code */ }
+  def foo662(): scala.Int = { /* compiled code */ }
+  def foo663(): scala.Int = { /* compiled code */ }
+  def foo664(): scala.Int = { /* compiled code */ }
+  def foo665(): scala.Int = { /* compiled code */ }
+  def foo666(): scala.Int = { /* compiled code */ }
+  def foo667(): scala.Int = { /* compiled code */ }
+  def foo668(): scala.Int = { /* compiled code */ }
+  def foo669(): scala.Int = { /* compiled code */ }
+  def foo670(): scala.Int = { /* compiled code */ }
+  def foo671(): scala.Int = { /* compiled code */ }
+  def foo672(): scala.Int = { /* compiled code */ }
+  def foo673(): scala.Int = { /* compiled code */ }
+  def foo674(): scala.Int = { /* compiled code */ }
+  def foo675(): scala.Int = { /* compiled code */ }
+  def foo676(): scala.Int = { /* compiled code */ }
+  def foo677(): scala.Int = { /* compiled code */ }
+  def foo678(): scala.Int = { /* compiled code */ }
+  def foo679(): scala.Int = { /* compiled code */ }
+  def foo680(): scala.Int = { /* compiled code */ }
+  def foo681(): scala.Int = { /* compiled code */ }
+  def foo682(): scala.Int = { /* compiled code */ }
+  def foo683(): scala.Int = { /* compiled code */ }
+  def foo684(): scala.Int = { /* compiled code */ }
+  def foo685(): scala.Int = { /* compiled code */ }
+  def foo686(): scala.Int = { /* compiled code */ }
+  def foo687(): scala.Int = { /* compiled code */ }
+  def foo688(): scala.Int = { /* compiled code */ }
+  def foo689(): scala.Int = { /* compiled code */ }
+  def foo690(): scala.Int = { /* compiled code */ }
+  def foo691(): scala.Int = { /* compiled code */ }
+  def foo692(): scala.Int = { /* compiled code */ }
+  def foo693(): scala.Int = { /* compiled code */ }
+  def foo694(): scala.Int = { /* compiled code */ }
+  def foo695(): scala.Int = { /* compiled code */ }
+  def foo696(): scala.Int = { /* compiled code */ }
+  def foo697(): scala.Int = { /* compiled code */ }
+  def foo698(): scala.Int = { /* compiled code */ }
+  def foo699(): scala.Int = { /* compiled code */ }
+  def foo700(): scala.Int = { /* compiled code */ }
+  def foo701(): scala.Int = { /* compiled code */ }
+  def foo702(): scala.Int = { /* compiled code */ }
+  def foo703(): scala.Int = { /* compiled code */ }
+  def foo704(): scala.Int = { /* compiled code */ }
+  def foo705(): scala.Int = { /* compiled code */ }
+  def foo706(): scala.Int = { /* compiled code */ }
+  def foo707(): scala.Int = { /* compiled code */ }
+  def foo708(): scala.Int = { /* compiled code */ }
+  def foo709(): scala.Int = { /* compiled code */ }
+  def foo710(): scala.Int = { /* compiled code */ }
+  def foo711(): scala.Int = { /* compiled code */ }
+  def foo712(): scala.Int = { /* compiled code */ }
+  def foo713(): scala.Int = { /* compiled code */ }
+  def foo714(): scala.Int = { /* compiled code */ }
+  def foo715(): scala.Int = { /* compiled code */ }
+  def foo716(): scala.Int = { /* compiled code */ }
+  def foo717(): scala.Int = { /* compiled code */ }
+  def foo718(): scala.Int = { /* compiled code */ }
+  def foo719(): scala.Int = { /* compiled code */ }
+  def foo720(): scala.Int = { /* compiled code */ }
+  def foo721(): scala.Int = { /* compiled code */ }
+  def foo722(): scala.Int = { /* compiled code */ }
+  def foo723(): scala.Int = { /* compiled code */ }
+  def foo724(): scala.Int = { /* compiled code */ }
+  def foo725(): scala.Int = { /* compiled code */ }
+  def foo726(): scala.Int = { /* compiled code */ }
+  def foo727(): scala.Int = { /* compiled code */ }
+  def foo728(): scala.Int = { /* compiled code */ }
+  def foo729(): scala.Int = { /* compiled code */ }
+  def foo730(): scala.Int = { /* compiled code */ }
+  def foo731(): scala.Int = { /* compiled code */ }
+  def foo732(): scala.Int = { /* compiled code */ }
+  def foo733(): scala.Int = { /* compiled code */ }
+  def foo734(): scala.Int = { /* compiled code */ }
+  def foo735(): scala.Int = { /* compiled code */ }
+  def foo736(): scala.Int = { /* compiled code */ }
+  def foo737(): scala.Int = { /* compiled code */ }
+  def foo738(): scala.Int = { /* compiled code */ }
+  def foo739(): scala.Int = { /* compiled code */ }
+  def foo740(): scala.Int = { /* compiled code */ }
+  def foo741(): scala.Int = { /* compiled code */ }
+  def foo742(): scala.Int = { /* compiled code */ }
+  def foo743(): scala.Int = { /* compiled code */ }
+  def foo744(): scala.Int = { /* compiled code */ }
+  def foo745(): scala.Int = { /* compiled code */ }
+  def foo746(): scala.Int = { /* compiled code */ }
+  def foo747(): scala.Int = { /* compiled code */ }
+  def foo748(): scala.Int = { /* compiled code */ }
+  def foo749(): scala.Int = { /* compiled code */ }
+  def foo750(): scala.Int = { /* compiled code */ }
+  def foo751(): scala.Int = { /* compiled code */ }
+  def foo752(): scala.Int = { /* compiled code */ }
+  def foo753(): scala.Int = { /* compiled code */ }
+  def foo754(): scala.Int = { /* compiled code */ }
+  def foo755(): scala.Int = { /* compiled code */ }
+  def foo756(): scala.Int = { /* compiled code */ }
+  def foo757(): scala.Int = { /* compiled code */ }
+  def foo758(): scala.Int = { /* compiled code */ }
+  def foo759(): scala.Int = { /* compiled code */ }
+  def foo760(): scala.Int = { /* compiled code */ }
+  def foo761(): scala.Int = { /* compiled code */ }
+  def foo762(): scala.Int = { /* compiled code */ }
+  def foo763(): scala.Int = { /* compiled code */ }
+  def foo764(): scala.Int = { /* compiled code */ }
+  def foo765(): scala.Int = { /* compiled code */ }
+  def foo766(): scala.Int = { /* compiled code */ }
+  def foo767(): scala.Int = { /* compiled code */ }
+  def foo768(): scala.Int = { /* compiled code */ }
+  def foo769(): scala.Int = { /* compiled code */ }
+  def foo770(): scala.Int = { /* compiled code */ }
+  def foo771(): scala.Int = { /* compiled code */ }
+  def foo772(): scala.Int = { /* compiled code */ }
+  def foo773(): scala.Int = { /* compiled code */ }
+  def foo774(): scala.Int = { /* compiled code */ }
+  def foo775(): scala.Int = { /* compiled code */ }
+  def foo776(): scala.Int = { /* compiled code */ }
+  def foo777(): scala.Int = { /* compiled code */ }
+  def foo778(): scala.Int = { /* compiled code */ }
+  def foo779(): scala.Int = { /* compiled code */ }
+  def foo780(): scala.Int = { /* compiled code */ }
+  def foo781(): scala.Int = { /* compiled code */ }
+  def foo782(): scala.Int = { /* compiled code */ }
+  def foo783(): scala.Int = { /* compiled code */ }
+  def foo784(): scala.Int = { /* compiled code */ }
+  def foo785(): scala.Int = { /* compiled code */ }
+  def foo786(): scala.Int = { /* compiled code */ }
+  def foo787(): scala.Int = { /* compiled code */ }
+  def foo788(): scala.Int = { /* compiled code */ }
+  def foo789(): scala.Int = { /* compiled code */ }
+  def foo790(): scala.Int = { /* compiled code */ }
+  def foo791(): scala.Int = { /* compiled code */ }
+  def foo792(): scala.Int = { /* compiled code */ }
+  def foo793(): scala.Int = { /* compiled code */ }
+  def foo794(): scala.Int = { /* compiled code */ }
+  def foo795(): scala.Int = { /* compiled code */ }
+  def foo796(): scala.Int = { /* compiled code */ }
+  def foo797(): scala.Int = { /* compiled code */ }
+  def foo798(): scala.Int = { /* compiled code */ }
+  def foo799(): scala.Int = { /* compiled code */ }
+  def foo800(): scala.Int = { /* compiled code */ }
+  def foo801(): scala.Int = { /* compiled code */ }
+  def foo802(): scala.Int = { /* compiled code */ }
+  def foo803(): scala.Int = { /* compiled code */ }
+  def foo804(): scala.Int = { /* compiled code */ }
+  def foo805(): scala.Int = { /* compiled code */ }
+  def foo806(): scala.Int = { /* compiled code */ }
+  def foo807(): scala.Int = { /* compiled code */ }
+  def foo808(): scala.Int = { /* compiled code */ }
+  def foo809(): scala.Int = { /* compiled code */ }
+  def foo810(): scala.Int = { /* compiled code */ }
+  def foo811(): scala.Int = { /* compiled code */ }
+  def foo812(): scala.Int = { /* compiled code */ }
+  def foo813(): scala.Int = { /* compiled code */ }
+  def foo814(): scala.Int = { /* compiled code */ }
+  def foo815(): scala.Int = { /* compiled code */ }
+  def foo816(): scala.Int = { /* compiled code */ }
+  def foo817(): scala.Int = { /* compiled code */ }
+  def foo818(): scala.Int = { /* compiled code */ }
+  def foo819(): scala.Int = { /* compiled code */ }
+  def foo820(): scala.Int = { /* compiled code */ }
+  def foo821(): scala.Int = { /* compiled code */ }
+  def foo822(): scala.Int = { /* compiled code */ }
+  def foo823(): scala.Int = { /* compiled code */ }
+  def foo824(): scala.Int = { /* compiled code */ }
+  def foo825(): scala.Int = { /* compiled code */ }
+  def foo826(): scala.Int = { /* compiled code */ }
+  def foo827(): scala.Int = { /* compiled code */ }
+  def foo828(): scala.Int = { /* compiled code */ }
+  def foo829(): scala.Int = { /* compiled code */ }
+  def foo830(): scala.Int = { /* compiled code */ }
+  def foo831(): scala.Int = { /* compiled code */ }
+  def foo832(): scala.Int = { /* compiled code */ }
+  def foo833(): scala.Int = { /* compiled code */ }
+  def foo834(): scala.Int = { /* compiled code */ }
+  def foo835(): scala.Int = { /* compiled code */ }
+  def foo836(): scala.Int = { /* compiled code */ }
+  def foo837(): scala.Int = { /* compiled code */ }
+  def foo838(): scala.Int = { /* compiled code */ }
+  def foo839(): scala.Int = { /* compiled code */ }
+  def foo840(): scala.Int = { /* compiled code */ }
+  def foo841(): scala.Int = { /* compiled code */ }
+  def foo842(): scala.Int = { /* compiled code */ }
+  def foo843(): scala.Int = { /* compiled code */ }
+  def foo844(): scala.Int = { /* compiled code */ }
+  def foo845(): scala.Int = { /* compiled code */ }
+  def foo846(): scala.Int = { /* compiled code */ }
+  def foo847(): scala.Int = { /* compiled code */ }
+  def foo848(): scala.Int = { /* compiled code */ }
+  def foo849(): scala.Int = { /* compiled code */ }
+  def foo850(): scala.Int = { /* compiled code */ }
+  def foo851(): scala.Int = { /* compiled code */ }
+  def foo852(): scala.Int = { /* compiled code */ }
+  def foo853(): scala.Int = { /* compiled code */ }
+  def foo854(): scala.Int = { /* compiled code */ }
+  def foo855(): scala.Int = { /* compiled code */ }
+  def foo856(): scala.Int = { /* compiled code */ }
+  def foo857(): scala.Int = { /* compiled code */ }
+  def foo858(): scala.Int = { /* compiled code */ }
+  def foo859(): scala.Int = { /* compiled code */ }
+  def foo860(): scala.Int = { /* compiled code */ }
+  def foo861(): scala.Int = { /* compiled code */ }
+  def foo862(): scala.Int = { /* compiled code */ }
+  def foo863(): scala.Int = { /* compiled code */ }
+  def foo864(): scala.Int = { /* compiled code */ }
+  def foo865(): scala.Int = { /* compiled code */ }
+  def foo866(): scala.Int = { /* compiled code */ }
+  def foo867(): scala.Int = { /* compiled code */ }
+  def foo868(): scala.Int = { /* compiled code */ }
+  def foo869(): scala.Int = { /* compiled code */ }
+  def foo870(): scala.Int = { /* compiled code */ }
+  def foo871(): scala.Int = { /* compiled code */ }
+  def foo872(): scala.Int = { /* compiled code */ }
+  def foo873(): scala.Int = { /* compiled code */ }
+  def foo874(): scala.Int = { /* compiled code */ }
+  def foo875(): scala.Int = { /* compiled code */ }
+  def foo876(): scala.Int = { /* compiled code */ }
+  def foo877(): scala.Int = { /* compiled code */ }
+  def foo878(): scala.Int = { /* compiled code */ }
+  def foo879(): scala.Int = { /* compiled code */ }
+  def foo880(): scala.Int = { /* compiled code */ }
+  def foo881(): scala.Int = { /* compiled code */ }
+  def foo882(): scala.Int = { /* compiled code */ }
+  def foo883(): scala.Int = { /* compiled code */ }
+  def foo884(): scala.Int = { /* compiled code */ }
+  def foo885(): scala.Int = { /* compiled code */ }
+  def foo886(): scala.Int = { /* compiled code */ }
+  def foo887(): scala.Int = { /* compiled code */ }
+  def foo888(): scala.Int = { /* compiled code */ }
+  def foo889(): scala.Int = { /* compiled code */ }
+  def foo890(): scala.Int = { /* compiled code */ }
+  def foo891(): scala.Int = { /* compiled code */ }
+  def foo892(): scala.Int = { /* compiled code */ }
+  def foo893(): scala.Int = { /* compiled code */ }
+  def foo894(): scala.Int = { /* compiled code */ }
+  def foo895(): scala.Int = { /* compiled code */ }
+  def foo896(): scala.Int = { /* compiled code */ }
+  def foo897(): scala.Int = { /* compiled code */ }
+  def foo898(): scala.Int = { /* compiled code */ }
+  def foo899(): scala.Int = { /* compiled code */ }
+  def foo900(): scala.Int = { /* compiled code */ }
+  def foo901(): scala.Int = { /* compiled code */ }
+  def foo902(): scala.Int = { /* compiled code */ }
+  def foo903(): scala.Int = { /* compiled code */ }
+  def foo904(): scala.Int = { /* compiled code */ }
+  def foo905(): scala.Int = { /* compiled code */ }
+  def foo906(): scala.Int = { /* compiled code */ }
+  def foo907(): scala.Int = { /* compiled code */ }
+  def foo908(): scala.Int = { /* compiled code */ }
+  def foo909(): scala.Int = { /* compiled code */ }
+  def foo910(): scala.Int = { /* compiled code */ }
+  def foo911(): scala.Int = { /* compiled code */ }
+  def foo912(): scala.Int = { /* compiled code */ }
+  def foo913(): scala.Int = { /* compiled code */ }
+  def foo914(): scala.Int = { /* compiled code */ }
+  def foo915(): scala.Int = { /* compiled code */ }
+  def foo916(): scala.Int = { /* compiled code */ }
+  def foo917(): scala.Int = { /* compiled code */ }
+  def foo918(): scala.Int = { /* compiled code */ }
+  def foo919(): scala.Int = { /* compiled code */ }
+  def foo920(): scala.Int = { /* compiled code */ }
+  def foo921(): scala.Int = { /* compiled code */ }
+  def foo922(): scala.Int = { /* compiled code */ }
+  def foo923(): scala.Int = { /* compiled code */ }
+  def foo924(): scala.Int = { /* compiled code */ }
+  def foo925(): scala.Int = { /* compiled code */ }
+  def foo926(): scala.Int = { /* compiled code */ }
+  def foo927(): scala.Int = { /* compiled code */ }
+  def foo928(): scala.Int = { /* compiled code */ }
+  def foo929(): scala.Int = { /* compiled code */ }
+  def foo930(): scala.Int = { /* compiled code */ }
+  def foo931(): scala.Int = { /* compiled code */ }
+  def foo932(): scala.Int = { /* compiled code */ }
+  def foo933(): scala.Int = { /* compiled code */ }
+  def foo934(): scala.Int = { /* compiled code */ }
+  def foo935(): scala.Int = { /* compiled code */ }
+  def foo936(): scala.Int = { /* compiled code */ }
+  def foo937(): scala.Int = { /* compiled code */ }
+  def foo938(): scala.Int = { /* compiled code */ }
+  def foo939(): scala.Int = { /* compiled code */ }
+  def foo940(): scala.Int = { /* compiled code */ }
+  def foo941(): scala.Int = { /* compiled code */ }
+  def foo942(): scala.Int = { /* compiled code */ }
+  def foo943(): scala.Int = { /* compiled code */ }
+  def foo944(): scala.Int = { /* compiled code */ }
+  def foo945(): scala.Int = { /* compiled code */ }
+  def foo946(): scala.Int = { /* compiled code */ }
+  def foo947(): scala.Int = { /* compiled code */ }
+  def foo948(): scala.Int = { /* compiled code */ }
+  def foo949(): scala.Int = { /* compiled code */ }
+  def foo950(): scala.Int = { /* compiled code */ }
+  def foo951(): scala.Int = { /* compiled code */ }
+  def foo952(): scala.Int = { /* compiled code */ }
+  def foo953(): scala.Int = { /* compiled code */ }
+  def foo954(): scala.Int = { /* compiled code */ }
+  def foo955(): scala.Int = { /* compiled code */ }
+  def foo956(): scala.Int = { /* compiled code */ }
+  def foo957(): scala.Int = { /* compiled code */ }
+  def foo958(): scala.Int = { /* compiled code */ }
+  def foo959(): scala.Int = { /* compiled code */ }
+  def foo960(): scala.Int = { /* compiled code */ }
+  def foo961(): scala.Int = { /* compiled code */ }
+  def foo962(): scala.Int = { /* compiled code */ }
+  def foo963(): scala.Int = { /* compiled code */ }
+  def foo964(): scala.Int = { /* compiled code */ }
+  def foo965(): scala.Int = { /* compiled code */ }
+  def foo966(): scala.Int = { /* compiled code */ }
+  def foo967(): scala.Int = { /* compiled code */ }
+  def foo968(): scala.Int = { /* compiled code */ }
+  def foo969(): scala.Int = { /* compiled code */ }
+  def foo970(): scala.Int = { /* compiled code */ }
+  def foo971(): scala.Int = { /* compiled code */ }
+  def foo972(): scala.Int = { /* compiled code */ }
+  def foo973(): scala.Int = { /* compiled code */ }
+  def foo974(): scala.Int = { /* compiled code */ }
+  def foo975(): scala.Int = { /* compiled code */ }
+  def foo976(): scala.Int = { /* compiled code */ }
+  def foo977(): scala.Int = { /* compiled code */ }
+  def foo978(): scala.Int = { /* compiled code */ }
+  def foo979(): scala.Int = { /* compiled code */ }
+  def foo980(): scala.Int = { /* compiled code */ }
+  def foo981(): scala.Int = { /* compiled code */ }
+  def foo982(): scala.Int = { /* compiled code */ }
+  def foo983(): scala.Int = { /* compiled code */ }
+  def foo984(): scala.Int = { /* compiled code */ }
+  def foo985(): scala.Int = { /* compiled code */ }
+  def foo986(): scala.Int = { /* compiled code */ }
+  def foo987(): scala.Int = { /* compiled code */ }
+  def foo988(): scala.Int = { /* compiled code */ }
+  def foo989(): scala.Int = { /* compiled code */ }
+  def foo990(): scala.Int = { /* compiled code */ }
+  def foo991(): scala.Int = { /* compiled code */ }
+  def foo992(): scala.Int = { /* compiled code */ }
+  def foo993(): scala.Int = { /* compiled code */ }
+  def foo994(): scala.Int = { /* compiled code */ }
+  def foo995(): scala.Int = { /* compiled code */ }
+  def foo996(): scala.Int = { /* compiled code */ }
+  def foo997(): scala.Int = { /* compiled code */ }
+  def foo998(): scala.Int = { /* compiled code */ }
+  def foo999(): scala.Int = { /* compiled code */ }
+  def foo1000(): scala.Int = { /* compiled code */ }
+  def foo1001(): scala.Int = { /* compiled code */ }
+  def foo1002(): scala.Int = { /* compiled code */ }
+  def foo1003(): scala.Int = { /* compiled code */ }
+  def foo1004(): scala.Int = { /* compiled code */ }
+  def foo1005(): scala.Int = { /* compiled code */ }
+  def foo1006(): scala.Int = { /* compiled code */ }
+  def foo1007(): scala.Int = { /* compiled code */ }
+  def foo1008(): scala.Int = { /* compiled code */ }
+  def foo1009(): scala.Int = { /* compiled code */ }
+  def foo1010(): scala.Int = { /* compiled code */ }
+  def foo1011(): scala.Int = { /* compiled code */ }
+  def foo1012(): scala.Int = { /* compiled code */ }
+  def foo1013(): scala.Int = { /* compiled code */ }
+  def foo1014(): scala.Int = { /* compiled code */ }
+  def foo1015(): scala.Int = { /* compiled code */ }
+  def foo1016(): scala.Int = { /* compiled code */ }
+  def foo1017(): scala.Int = { /* compiled code */ }
+  def foo1018(): scala.Int = { /* compiled code */ }
+  def foo1019(): scala.Int = { /* compiled code */ }
+  def foo1020(): scala.Int = { /* compiled code */ }
+  def foo1021(): scala.Int = { /* compiled code */ }
+  def foo1022(): scala.Int = { /* compiled code */ }
+  def foo1023(): scala.Int = { /* compiled code */ }
+  def foo1024(): scala.Int = { /* compiled code */ }
+  def foo1025(): scala.Int = { /* compiled code */ }
+  def foo1026(): scala.Int = { /* compiled code */ }
+  def foo1027(): scala.Int = { /* compiled code */ }
+  def foo1028(): scala.Int = { /* compiled code */ }
+  def foo1029(): scala.Int = { /* compiled code */ }
+  def foo1030(): scala.Int = { /* compiled code */ }
+  def foo1031(): scala.Int = { /* compiled code */ }
+  def foo1032(): scala.Int = { /* compiled code */ }
+  def foo1033(): scala.Int = { /* compiled code */ }
+  def foo1034(): scala.Int = { /* compiled code */ }
+  def foo1035(): scala.Int = { /* compiled code */ }
+  def foo1036(): scala.Int = { /* compiled code */ }
+  def foo1037(): scala.Int = { /* compiled code */ }
+  def foo1038(): scala.Int = { /* compiled code */ }
+  def foo1039(): scala.Int = { /* compiled code */ }
+  def foo1040(): scala.Int = { /* compiled code */ }
+  def foo1041(): scala.Int = { /* compiled code */ }
+  def foo1042(): scala.Int = { /* compiled code */ }
+  def foo1043(): scala.Int = { /* compiled code */ }
+  def foo1044(): scala.Int = { /* compiled code */ }
+  def foo1045(): scala.Int = { /* compiled code */ }
+  def foo1046(): scala.Int = { /* compiled code */ }
+  def foo1047(): scala.Int = { /* compiled code */ }
+  def foo1048(): scala.Int = { /* compiled code */ }
+  def foo1049(): scala.Int = { /* compiled code */ }
+  def foo1050(): scala.Int = { /* compiled code */ }
+  def foo1051(): scala.Int = { /* compiled code */ }
+  def foo1052(): scala.Int = { /* compiled code */ }
+  def foo1053(): scala.Int = { /* compiled code */ }
+  def foo1054(): scala.Int = { /* compiled code */ }
+  def foo1055(): scala.Int = { /* compiled code */ }
+  def foo1056(): scala.Int = { /* compiled code */ }
+  def foo1057(): scala.Int = { /* compiled code */ }
+  def foo1058(): scala.Int = { /* compiled code */ }
+  def foo1059(): scala.Int = { /* compiled code */ }
+  def foo1060(): scala.Int = { /* compiled code */ }
+  def foo1061(): scala.Int = { /* compiled code */ }
+  def foo1062(): scala.Int = { /* compiled code */ }
+  def foo1063(): scala.Int = { /* compiled code */ }
+  def foo1064(): scala.Int = { /* compiled code */ }
+  def foo1065(): scala.Int = { /* compiled code */ }
+  def foo1066(): scala.Int = { /* compiled code */ }
+  def foo1067(): scala.Int = { /* compiled code */ }
+  def foo1068(): scala.Int = { /* compiled code */ }
+  def foo1069(): scala.Int = { /* compiled code */ }
+  def foo1070(): scala.Int = { /* compiled code */ }
+  def foo1071(): scala.Int = { /* compiled code */ }
+  def foo1072(): scala.Int = { /* compiled code */ }
+  def foo1073(): scala.Int = { /* compiled code */ }
+  def foo1074(): scala.Int = { /* compiled code */ }
+  def foo1075(): scala.Int = { /* compiled code */ }
+  def foo1076(): scala.Int = { /* compiled code */ }
+  def foo1077(): scala.Int = { /* compiled code */ }
+  def foo1078(): scala.Int = { /* compiled code */ }
+  def foo1079(): scala.Int = { /* compiled code */ }
+  def foo1080(): scala.Int = { /* compiled code */ }
+  def foo1081(): scala.Int = { /* compiled code */ }
+  def foo1082(): scala.Int = { /* compiled code */ }
+  def foo1083(): scala.Int = { /* compiled code */ }
+  def foo1084(): scala.Int = { /* compiled code */ }
+  def foo1085(): scala.Int = { /* compiled code */ }
+  def foo1086(): scala.Int = { /* compiled code */ }
+  def foo1087(): scala.Int = { /* compiled code */ }
+  def foo1088(): scala.Int = { /* compiled code */ }
+  def foo1089(): scala.Int = { /* compiled code */ }
+  def foo1090(): scala.Int = { /* compiled code */ }
+  def foo1091(): scala.Int = { /* compiled code */ }
+  def foo1092(): scala.Int = { /* compiled code */ }
+  def foo1093(): scala.Int = { /* compiled code */ }
+  def foo1094(): scala.Int = { /* compiled code */ }
+  def foo1095(): scala.Int = { /* compiled code */ }
+  def foo1096(): scala.Int = { /* compiled code */ }
+  def foo1097(): scala.Int = { /* compiled code */ }
+  def foo1098(): scala.Int = { /* compiled code */ }
+  def foo1099(): scala.Int = { /* compiled code */ }
+  def foo1100(): scala.Int = { /* compiled code */ }
+  def foo1101(): scala.Int = { /* compiled code */ }
+  def foo1102(): scala.Int = { /* compiled code */ }
+  def foo1103(): scala.Int = { /* compiled code */ }
+  def foo1104(): scala.Int = { /* compiled code */ }
+  def foo1105(): scala.Int = { /* compiled code */ }
+  def foo1106(): scala.Int = { /* compiled code */ }
+  def foo1107(): scala.Int = { /* compiled code */ }
+  def foo1108(): scala.Int = { /* compiled code */ }
+  def foo1109(): scala.Int = { /* compiled code */ }
+  def foo1110(): scala.Int = { /* compiled code */ }
+  def foo1111(): scala.Int = { /* compiled code */ }
+  def foo1112(): scala.Int = { /* compiled code */ }
+  def foo1113(): scala.Int = { /* compiled code */ }
+  def foo1114(): scala.Int = { /* compiled code */ }
+  def foo1115(): scala.Int = { /* compiled code */ }
+  def foo1116(): scala.Int = { /* compiled code */ }
+  def foo1117(): scala.Int = { /* compiled code */ }
+  def foo1118(): scala.Int = { /* compiled code */ }
+  def foo1119(): scala.Int = { /* compiled code */ }
+  def foo1120(): scala.Int = { /* compiled code */ }
+  def foo1121(): scala.Int = { /* compiled code */ }
+  def foo1122(): scala.Int = { /* compiled code */ }
+  def foo1123(): scala.Int = { /* compiled code */ }
+  def foo1124(): scala.Int = { /* compiled code */ }
+  def foo1125(): scala.Int = { /* compiled code */ }
+  def foo1126(): scala.Int = { /* compiled code */ }
+  def foo1127(): scala.Int = { /* compiled code */ }
+  def foo1128(): scala.Int = { /* compiled code */ }
+  def foo1129(): scala.Int = { /* compiled code */ }
+  def foo1130(): scala.Int = { /* compiled code */ }
+  def foo1131(): scala.Int = { /* compiled code */ }
+  def foo1132(): scala.Int = { /* compiled code */ }
+  def foo1133(): scala.Int = { /* compiled code */ }
+  def foo1134(): scala.Int = { /* compiled code */ }
+  def foo1135(): scala.Int = { /* compiled code */ }
+  def foo1136(): scala.Int = { /* compiled code */ }
+  def foo1137(): scala.Int = { /* compiled code */ }
+  def foo1138(): scala.Int = { /* compiled code */ }
+  def foo1139(): scala.Int = { /* compiled code */ }
+  def foo1140(): scala.Int = { /* compiled code */ }
+  def foo1141(): scala.Int = { /* compiled code */ }
+  def foo1142(): scala.Int = { /* compiled code */ }
+  def foo1143(): scala.Int = { /* compiled code */ }
+  def foo1144(): scala.Int = { /* compiled code */ }
+  def foo1145(): scala.Int = { /* compiled code */ }
+  def foo1146(): scala.Int = { /* compiled code */ }
+  def foo1147(): scala.Int = { /* compiled code */ }
+  def foo1148(): scala.Int = { /* compiled code */ }
+  def foo1149(): scala.Int = { /* compiled code */ }
+  def foo1150(): scala.Int = { /* compiled code */ }
+  def foo1151(): scala.Int = { /* compiled code */ }
+  def foo1152(): scala.Int = { /* compiled code */ }
+  def foo1153(): scala.Int = { /* compiled code */ }
+  def foo1154(): scala.Int = { /* compiled code */ }
+  def foo1155(): scala.Int = { /* compiled code */ }
+  def foo1156(): scala.Int = { /* compiled code */ }
+  def foo1157(): scala.Int = { /* compiled code */ }
+  def foo1158(): scala.Int = { /* compiled code */ }
+  def foo1159(): scala.Int = { /* compiled code */ }
+  def foo1160(): scala.Int = { /* compiled code */ }
+  def foo1161(): scala.Int = { /* compiled code */ }
+  def foo1162(): scala.Int = { /* compiled code */ }
+  def foo1163(): scala.Int = { /* compiled code */ }
+  def foo1164(): scala.Int = { /* compiled code */ }
+  def foo1165(): scala.Int = { /* compiled code */ }
+  def foo1166(): scala.Int = { /* compiled code */ }
+  def foo1167(): scala.Int = { /* compiled code */ }
+  def foo1168(): scala.Int = { /* compiled code */ }
+  def foo1169(): scala.Int = { /* compiled code */ }
+  def foo1170(): scala.Int = { /* compiled code */ }
+  def foo1171(): scala.Int = { /* compiled code */ }
+  def foo1172(): scala.Int = { /* compiled code */ }
+  def foo1173(): scala.Int = { /* compiled code */ }
+  def foo1174(): scala.Int = { /* compiled code */ }
+  def foo1175(): scala.Int = { /* compiled code */ }
+  def foo1176(): scala.Int = { /* compiled code */ }
+  def foo1177(): scala.Int = { /* compiled code */ }
+  def foo1178(): scala.Int = { /* compiled code */ }
+  def foo1179(): scala.Int = { /* compiled code */ }
+  def foo1180(): scala.Int = { /* compiled code */ }
+  def foo1181(): scala.Int = { /* compiled code */ }
+  def foo1182(): scala.Int = { /* compiled code */ }
+  def foo1183(): scala.Int = { /* compiled code */ }
+  def foo1184(): scala.Int = { /* compiled code */ }
+  def foo1185(): scala.Int = { /* compiled code */ }
+  def foo1186(): scala.Int = { /* compiled code */ }
+  def foo1187(): scala.Int = { /* compiled code */ }
+  def foo1188(): scala.Int = { /* compiled code */ }
+  def foo1189(): scala.Int = { /* compiled code */ }
+  def foo1190(): scala.Int = { /* compiled code */ }
+  def foo1191(): scala.Int = { /* compiled code */ }
+  def foo1192(): scala.Int = { /* compiled code */ }
+  def foo1193(): scala.Int = { /* compiled code */ }
+  def foo1194(): scala.Int = { /* compiled code */ }
+  def foo1195(): scala.Int = { /* compiled code */ }
+  def foo1196(): scala.Int = { /* compiled code */ }
+  def foo1197(): scala.Int = { /* compiled code */ }
+  def foo1198(): scala.Int = { /* compiled code */ }
+  def foo1199(): scala.Int = { /* compiled code */ }
+  def foo1200(): scala.Int = { /* compiled code */ }
+  def foo1201(): scala.Int = { /* compiled code */ }
+  def foo1202(): scala.Int = { /* compiled code */ }
+  def foo1203(): scala.Int = { /* compiled code */ }
+  def foo1204(): scala.Int = { /* compiled code */ }
+  def foo1205(): scala.Int = { /* compiled code */ }
+  def foo1206(): scala.Int = { /* compiled code */ }
+  def foo1207(): scala.Int = { /* compiled code */ }
+  def foo1208(): scala.Int = { /* compiled code */ }
+  def foo1209(): scala.Int = { /* compiled code */ }
+  def foo1210(): scala.Int = { /* compiled code */ }
+  def foo1211(): scala.Int = { /* compiled code */ }
+  def foo1212(): scala.Int = { /* compiled code */ }
+  def foo1213(): scala.Int = { /* compiled code */ }
+  def foo1214(): scala.Int = { /* compiled code */ }
+  def foo1215(): scala.Int = { /* compiled code */ }
+  def foo1216(): scala.Int = { /* compiled code */ }
+  def foo1217(): scala.Int = { /* compiled code */ }
+  def foo1218(): scala.Int = { /* compiled code */ }
+  def foo1219(): scala.Int = { /* compiled code */ }
+  def foo1220(): scala.Int = { /* compiled code */ }
+  def foo1221(): scala.Int = { /* compiled code */ }
+  def foo1222(): scala.Int = { /* compiled code */ }
+  def foo1223(): scala.Int = { /* compiled code */ }
+  def foo1224(): scala.Int = { /* compiled code */ }
+  def foo1225(): scala.Int = { /* compiled code */ }
+  def foo1226(): scala.Int = { /* compiled code */ }
+  def foo1227(): scala.Int = { /* compiled code */ }
+  def foo1228(): scala.Int = { /* compiled code */ }
+  def foo1229(): scala.Int = { /* compiled code */ }
+  def foo1230(): scala.Int = { /* compiled code */ }
+  def foo1231(): scala.Int = { /* compiled code */ }
+  def foo1232(): scala.Int = { /* compiled code */ }
+  def foo1233(): scala.Int = { /* compiled code */ }
+  def foo1234(): scala.Int = { /* compiled code */ }
+  def foo1235(): scala.Int = { /* compiled code */ }
+  def foo1236(): scala.Int = { /* compiled code */ }
+  def foo1237(): scala.Int = { /* compiled code */ }
+  def foo1238(): scala.Int = { /* compiled code */ }
+  def foo1239(): scala.Int = { /* compiled code */ }
+  def foo1240(): scala.Int = { /* compiled code */ }
+  def foo1241(): scala.Int = { /* compiled code */ }
+  def foo1242(): scala.Int = { /* compiled code */ }
+  def foo1243(): scala.Int = { /* compiled code */ }
+  def foo1244(): scala.Int = { /* compiled code */ }
+  def foo1245(): scala.Int = { /* compiled code */ }
+  def foo1246(): scala.Int = { /* compiled code */ }
+  def foo1247(): scala.Int = { /* compiled code */ }
+  def foo1248(): scala.Int = { /* compiled code */ }
+  def foo1249(): scala.Int = { /* compiled code */ }
+  def foo1250(): scala.Int = { /* compiled code */ }
+  def foo1251(): scala.Int = { /* compiled code */ }
+  def foo1252(): scala.Int = { /* compiled code */ }
+  def foo1253(): scala.Int = { /* compiled code */ }
+  def foo1254(): scala.Int = { /* compiled code */ }
+  def foo1255(): scala.Int = { /* compiled code */ }
+  def foo1256(): scala.Int = { /* compiled code */ }
+  def foo1257(): scala.Int = { /* compiled code */ }
+  def foo1258(): scala.Int = { /* compiled code */ }
+  def foo1259(): scala.Int = { /* compiled code */ }
+  def foo1260(): scala.Int = { /* compiled code */ }
+  def foo1261(): scala.Int = { /* compiled code */ }
+  def foo1262(): scala.Int = { /* compiled code */ }
+  def foo1263(): scala.Int = { /* compiled code */ }
+  def foo1264(): scala.Int = { /* compiled code */ }
+  def foo1265(): scala.Int = { /* compiled code */ }
+  def foo1266(): scala.Int = { /* compiled code */ }
+  def foo1267(): scala.Int = { /* compiled code */ }
+  def foo1268(): scala.Int = { /* compiled code */ }
+  def foo1269(): scala.Int = { /* compiled code */ }
+  def foo1270(): scala.Int = { /* compiled code */ }
+  def foo1271(): scala.Int = { /* compiled code */ }
+  def foo1272(): scala.Int = { /* compiled code */ }
+  def foo1273(): scala.Int = { /* compiled code */ }
+  def foo1274(): scala.Int = { /* compiled code */ }
+  def foo1275(): scala.Int = { /* compiled code */ }
+  def foo1276(): scala.Int = { /* compiled code */ }
+  def foo1277(): scala.Int = { /* compiled code */ }
+  def foo1278(): scala.Int = { /* compiled code */ }
+  def foo1279(): scala.Int = { /* compiled code */ }
+  def foo1280(): scala.Int = { /* compiled code */ }
+  def foo1281(): scala.Int = { /* compiled code */ }
+  def foo1282(): scala.Int = { /* compiled code */ }
+  def foo1283(): scala.Int = { /* compiled code */ }
+  def foo1284(): scala.Int = { /* compiled code */ }
+  def foo1285(): scala.Int = { /* compiled code */ }
+  def foo1286(): scala.Int = { /* compiled code */ }
+  def foo1287(): scala.Int = { /* compiled code */ }
+  def foo1288(): scala.Int = { /* compiled code */ }
+  def foo1289(): scala.Int = { /* compiled code */ }
+  def foo1290(): scala.Int = { /* compiled code */ }
+  def foo1291(): scala.Int = { /* compiled code */ }
+  def foo1292(): scala.Int = { /* compiled code */ }
+  def foo1293(): scala.Int = { /* compiled code */ }
+  def foo1294(): scala.Int = { /* compiled code */ }
+  def foo1295(): scala.Int = { /* compiled code */ }
+  def foo1296(): scala.Int = { /* compiled code */ }
+  def foo1297(): scala.Int = { /* compiled code */ }
+  def foo1298(): scala.Int = { /* compiled code */ }
+  def foo1299(): scala.Int = { /* compiled code */ }
+  def foo1300(): scala.Int = { /* compiled code */ }
+  def foo1301(): scala.Int = { /* compiled code */ }
+  def foo1302(): scala.Int = { /* compiled code */ }
+  def foo1303(): scala.Int = { /* compiled code */ }
+  def foo1304(): scala.Int = { /* compiled code */ }
+  def foo1305(): scala.Int = { /* compiled code */ }
+  def foo1306(): scala.Int = { /* compiled code */ }
+  def foo1307(): scala.Int = { /* compiled code */ }
+  def foo1308(): scala.Int = { /* compiled code */ }
+  def foo1309(): scala.Int = { /* compiled code */ }
+  def foo1310(): scala.Int = { /* compiled code */ }
+  def foo1311(): scala.Int = { /* compiled code */ }
+  def foo1312(): scala.Int = { /* compiled code */ }
+  def foo1313(): scala.Int = { /* compiled code */ }
+  def foo1314(): scala.Int = { /* compiled code */ }
+  def foo1315(): scala.Int = { /* compiled code */ }
+  def foo1316(): scala.Int = { /* compiled code */ }
+  def foo1317(): scala.Int = { /* compiled code */ }
+  def foo1318(): scala.Int = { /* compiled code */ }
+  def foo1319(): scala.Int = { /* compiled code */ }
+  def foo1320(): scala.Int = { /* compiled code */ }
+  def foo1321(): scala.Int = { /* compiled code */ }
+  def foo1322(): scala.Int = { /* compiled code */ }
+  def foo1323(): scala.Int = { /* compiled code */ }
+  def foo1324(): scala.Int = { /* compiled code */ }
+  def foo1325(): scala.Int = { /* compiled code */ }
+  def foo1326(): scala.Int = { /* compiled code */ }
+  def foo1327(): scala.Int = { /* compiled code */ }
+  def foo1328(): scala.Int = { /* compiled code */ }
+  def foo1329(): scala.Int = { /* compiled code */ }
+  def foo1330(): scala.Int = { /* compiled code */ }
+  def foo1331(): scala.Int = { /* compiled code */ }
+  def foo1332(): scala.Int = { /* compiled code */ }
+  def foo1333(): scala.Int = { /* compiled code */ }
+  def foo1334(): scala.Int = { /* compiled code */ }
+  def foo1335(): scala.Int = { /* compiled code */ }
+  def foo1336(): scala.Int = { /* compiled code */ }
+  def foo1337(): scala.Int = { /* compiled code */ }
+  def foo1338(): scala.Int = { /* compiled code */ }
+  def foo1339(): scala.Int = { /* compiled code */ }
+  def foo1340(): scala.Int = { /* compiled code */ }
+  def foo1341(): scala.Int = { /* compiled code */ }
+  def foo1342(): scala.Int = { /* compiled code */ }
+  def foo1343(): scala.Int = { /* compiled code */ }
+  def foo1344(): scala.Int = { /* compiled code */ }
+  def foo1345(): scala.Int = { /* compiled code */ }
+  def foo1346(): scala.Int = { /* compiled code */ }
+  def foo1347(): scala.Int = { /* compiled code */ }
+  def foo1348(): scala.Int = { /* compiled code */ }
+  def foo1349(): scala.Int = { /* compiled code */ }
+  def foo1350(): scala.Int = { /* compiled code */ }
+  def foo1351(): scala.Int = { /* compiled code */ }
+  def foo1352(): scala.Int = { /* compiled code */ }
+  def foo1353(): scala.Int = { /* compiled code */ }
+  def foo1354(): scala.Int = { /* compiled code */ }
+  def foo1355(): scala.Int = { /* compiled code */ }
+  def foo1356(): scala.Int = { /* compiled code */ }
+  def foo1357(): scala.Int = { /* compiled code */ }
+  def foo1358(): scala.Int = { /* compiled code */ }
+  def foo1359(): scala.Int = { /* compiled code */ }
+  def foo1360(): scala.Int = { /* compiled code */ }
+  def foo1361(): scala.Int = { /* compiled code */ }
+  def foo1362(): scala.Int = { /* compiled code */ }
+  def foo1363(): scala.Int = { /* compiled code */ }
+  def foo1364(): scala.Int = { /* compiled code */ }
+  def foo1365(): scala.Int = { /* compiled code */ }
+  def foo1366(): scala.Int = { /* compiled code */ }
+  def foo1367(): scala.Int = { /* compiled code */ }
+  def foo1368(): scala.Int = { /* compiled code */ }
+  def foo1369(): scala.Int = { /* compiled code */ }
+  def foo1370(): scala.Int = { /* compiled code */ }
+  def foo1371(): scala.Int = { /* compiled code */ }
+  def foo1372(): scala.Int = { /* compiled code */ }
+  def foo1373(): scala.Int = { /* compiled code */ }
+  def foo1374(): scala.Int = { /* compiled code */ }
+  def foo1375(): scala.Int = { /* compiled code */ }
+  def foo1376(): scala.Int = { /* compiled code */ }
+  def foo1377(): scala.Int = { /* compiled code */ }
+  def foo1378(): scala.Int = { /* compiled code */ }
+  def foo1379(): scala.Int = { /* compiled code */ }
+  def foo1380(): scala.Int = { /* compiled code */ }
+  def foo1381(): scala.Int = { /* compiled code */ }
+  def foo1382(): scala.Int = { /* compiled code */ }
+  def foo1383(): scala.Int = { /* compiled code */ }
+  def foo1384(): scala.Int = { /* compiled code */ }
+  def foo1385(): scala.Int = { /* compiled code */ }
+  def foo1386(): scala.Int = { /* compiled code */ }
+  def foo1387(): scala.Int = { /* compiled code */ }
+  def foo1388(): scala.Int = { /* compiled code */ }
+  def foo1389(): scala.Int = { /* compiled code */ }
+  def foo1390(): scala.Int = { /* compiled code */ }
+  def foo1391(): scala.Int = { /* compiled code */ }
+  def foo1392(): scala.Int = { /* compiled code */ }
+  def foo1393(): scala.Int = { /* compiled code */ }
+  def foo1394(): scala.Int = { /* compiled code */ }
+  def foo1395(): scala.Int = { /* compiled code */ }
+  def foo1396(): scala.Int = { /* compiled code */ }
+  def foo1397(): scala.Int = { /* compiled code */ }
+  def foo1398(): scala.Int = { /* compiled code */ }
+  def foo1399(): scala.Int = { /* compiled code */ }
+  def foo1400(): scala.Int = { /* compiled code */ }
+  def foo1401(): scala.Int = { /* compiled code */ }
+  def foo1402(): scala.Int = { /* compiled code */ }
+  def foo1403(): scala.Int = { /* compiled code */ }
+  def foo1404(): scala.Int = { /* compiled code */ }
+  def foo1405(): scala.Int = { /* compiled code */ }
+  def foo1406(): scala.Int = { /* compiled code */ }
+  def foo1407(): scala.Int = { /* compiled code */ }
+  def foo1408(): scala.Int = { /* compiled code */ }
+  def foo1409(): scala.Int = { /* compiled code */ }
+  def foo1410(): scala.Int = { /* compiled code */ }
+  def foo1411(): scala.Int = { /* compiled code */ }
+  def foo1412(): scala.Int = { /* compiled code */ }
+  def foo1413(): scala.Int = { /* compiled code */ }
+  def foo1414(): scala.Int = { /* compiled code */ }
+  def foo1415(): scala.Int = { /* compiled code */ }
+  def foo1416(): scala.Int = { /* compiled code */ }
+  def foo1417(): scala.Int = { /* compiled code */ }
+  def foo1418(): scala.Int = { /* compiled code */ }
+  def foo1419(): scala.Int = { /* compiled code */ }
+  def foo1420(): scala.Int = { /* compiled code */ }
+  def foo1421(): scala.Int = { /* compiled code */ }
+  def foo1422(): scala.Int = { /* compiled code */ }
+  def foo1423(): scala.Int = { /* compiled code */ }
+  def foo1424(): scala.Int = { /* compiled code */ }
+  def foo1425(): scala.Int = { /* compiled code */ }
+  def foo1426(): scala.Int = { /* compiled code */ }
+  def foo1427(): scala.Int = { /* compiled code */ }
+  def foo1428(): scala.Int = { /* compiled code */ }
+  def foo1429(): scala.Int = { /* compiled code */ }
+  def foo1430(): scala.Int = { /* compiled code */ }
+  def foo1431(): scala.Int = { /* compiled code */ }
+  def foo1432(): scala.Int = { /* compiled code */ }
+  def foo1433(): scala.Int = { /* compiled code */ }
+  def foo1434(): scala.Int = { /* compiled code */ }
+  def foo1435(): scala.Int = { /* compiled code */ }
+  def foo1436(): scala.Int = { /* compiled code */ }
+  def foo1437(): scala.Int = { /* compiled code */ }
+  def foo1438(): scala.Int = { /* compiled code */ }
+  def foo1439(): scala.Int = { /* compiled code */ }
+  def foo1440(): scala.Int = { /* compiled code */ }
+  def foo1441(): scala.Int = { /* compiled code */ }
+  def foo1442(): scala.Int = { /* compiled code */ }
+  def foo1443(): scala.Int = { /* compiled code */ }
+  def foo1444(): scala.Int = { /* compiled code */ }
+  def foo1445(): scala.Int = { /* compiled code */ }
+  def foo1446(): scala.Int = { /* compiled code */ }
+  def foo1447(): scala.Int = { /* compiled code */ }
+  def foo1448(): scala.Int = { /* compiled code */ }
+  def foo1449(): scala.Int = { /* compiled code */ }
+  def foo1450(): scala.Int = { /* compiled code */ }
+  def foo1451(): scala.Int = { /* compiled code */ }
+  def foo1452(): scala.Int = { /* compiled code */ }
+  def foo1453(): scala.Int = { /* compiled code */ }
+  def foo1454(): scala.Int = { /* compiled code */ }
+  def foo1455(): scala.Int = { /* compiled code */ }
+  def foo1456(): scala.Int = { /* compiled code */ }
+  def foo1457(): scala.Int = { /* compiled code */ }
+  def foo1458(): scala.Int = { /* compiled code */ }
+  def foo1459(): scala.Int = { /* compiled code */ }
+  def foo1460(): scala.Int = { /* compiled code */ }
+  def foo1461(): scala.Int = { /* compiled code */ }
+  def foo1462(): scala.Int = { /* compiled code */ }
+  def foo1463(): scala.Int = { /* compiled code */ }
+  def foo1464(): scala.Int = { /* compiled code */ }
+  def foo1465(): scala.Int = { /* compiled code */ }
+  def foo1466(): scala.Int = { /* compiled code */ }
+  def foo1467(): scala.Int = { /* compiled code */ }
+  def foo1468(): scala.Int = { /* compiled code */ }
+  def foo1469(): scala.Int = { /* compiled code */ }
+  def foo1470(): scala.Int = { /* compiled code */ }
+  def foo1471(): scala.Int = { /* compiled code */ }
+  def foo1472(): scala.Int = { /* compiled code */ }
+  def foo1473(): scala.Int = { /* compiled code */ }
+  def foo1474(): scala.Int = { /* compiled code */ }
+  def foo1475(): scala.Int = { /* compiled code */ }
+  def foo1476(): scala.Int = { /* compiled code */ }
+  def foo1477(): scala.Int = { /* compiled code */ }
+  def foo1478(): scala.Int = { /* compiled code */ }
+  def foo1479(): scala.Int = { /* compiled code */ }
+  def foo1480(): scala.Int = { /* compiled code */ }
+  def foo1481(): scala.Int = { /* compiled code */ }
+  def foo1482(): scala.Int = { /* compiled code */ }
+  def foo1483(): scala.Int = { /* compiled code */ }
+  def foo1484(): scala.Int = { /* compiled code */ }
+  def foo1485(): scala.Int = { /* compiled code */ }
+  def foo1486(): scala.Int = { /* compiled code */ }
+  def foo1487(): scala.Int = { /* compiled code */ }
+  def foo1488(): scala.Int = { /* compiled code */ }
+  def foo1489(): scala.Int = { /* compiled code */ }
+  def foo1490(): scala.Int = { /* compiled code */ }
+  def foo1491(): scala.Int = { /* compiled code */ }
+  def foo1492(): scala.Int = { /* compiled code */ }
+  def foo1493(): scala.Int = { /* compiled code */ }
+  def foo1494(): scala.Int = { /* compiled code */ }
+  def foo1495(): scala.Int = { /* compiled code */ }
+  def foo1496(): scala.Int = { /* compiled code */ }
+  def foo1497(): scala.Int = { /* compiled code */ }
+  def foo1498(): scala.Int = { /* compiled code */ }
+  def foo1499(): scala.Int = { /* compiled code */ }
+  def foo1500(): scala.Int = { /* compiled code */ }
+  def foo1501(): scala.Int = { /* compiled code */ }
+  def foo1502(): scala.Int = { /* compiled code */ }
+  def foo1503(): scala.Int = { /* compiled code */ }
+  def foo1504(): scala.Int = { /* compiled code */ }
+  def foo1505(): scala.Int = { /* compiled code */ }
+  def foo1506(): scala.Int = { /* compiled code */ }
+  def foo1507(): scala.Int = { /* compiled code */ }
+  def foo1508(): scala.Int = { /* compiled code */ }
+  def foo1509(): scala.Int = { /* compiled code */ }
+  def foo1510(): scala.Int = { /* compiled code */ }
+  def foo1511(): scala.Int = { /* compiled code */ }
+  def foo1512(): scala.Int = { /* compiled code */ }
+  def foo1513(): scala.Int = { /* compiled code */ }
+  def foo1514(): scala.Int = { /* compiled code */ }
+  def foo1515(): scala.Int = { /* compiled code */ }
+  def foo1516(): scala.Int = { /* compiled code */ }
+  def foo1517(): scala.Int = { /* compiled code */ }
+  def foo1518(): scala.Int = { /* compiled code */ }
+  def foo1519(): scala.Int = { /* compiled code */ }
+  def foo1520(): scala.Int = { /* compiled code */ }
+  def foo1521(): scala.Int = { /* compiled code */ }
+  def foo1522(): scala.Int = { /* compiled code */ }
+  def foo1523(): scala.Int = { /* compiled code */ }
+  def foo1524(): scala.Int = { /* compiled code */ }
+  def foo1525(): scala.Int = { /* compiled code */ }
+  def foo1526(): scala.Int = { /* compiled code */ }
+  def foo1527(): scala.Int = { /* compiled code */ }
+  def foo1528(): scala.Int = { /* compiled code */ }
+  def foo1529(): scala.Int = { /* compiled code */ }
+  def foo1530(): scala.Int = { /* compiled code */ }
+  def foo1531(): scala.Int = { /* compiled code */ }
+  def foo1532(): scala.Int = { /* compiled code */ }
+  def foo1533(): scala.Int = { /* compiled code */ }
+  def foo1534(): scala.Int = { /* compiled code */ }
+  def foo1535(): scala.Int = { /* compiled code */ }
+  def foo1536(): scala.Int = { /* compiled code */ }
+  def foo1537(): scala.Int = { /* compiled code */ }
+  def foo1538(): scala.Int = { /* compiled code */ }
+  def foo1539(): scala.Int = { /* compiled code */ }
+  def foo1540(): scala.Int = { /* compiled code */ }
+  def foo1541(): scala.Int = { /* compiled code */ }
+  def foo1542(): scala.Int = { /* compiled code */ }
+  def foo1543(): scala.Int = { /* compiled code */ }
+  def foo1544(): scala.Int = { /* compiled code */ }
+  def foo1545(): scala.Int = { /* compiled code */ }
+  def foo1546(): scala.Int = { /* compiled code */ }
+  def foo1547(): scala.Int = { /* compiled code */ }
+  def foo1548(): scala.Int = { /* compiled code */ }
+  def foo1549(): scala.Int = { /* compiled code */ }
+  def foo1550(): scala.Int = { /* compiled code */ }
+  def foo1551(): scala.Int = { /* compiled code */ }
+  def foo1552(): scala.Int = { /* compiled code */ }
+  def foo1553(): scala.Int = { /* compiled code */ }
+  def foo1554(): scala.Int = { /* compiled code */ }
+  def foo1555(): scala.Int = { /* compiled code */ }
+  def foo1556(): scala.Int = { /* compiled code */ }
+  def foo1557(): scala.Int = { /* compiled code */ }
+  def foo1558(): scala.Int = { /* compiled code */ }
+  def foo1559(): scala.Int = { /* compiled code */ }
+  def foo1560(): scala.Int = { /* compiled code */ }
+  def foo1561(): scala.Int = { /* compiled code */ }
+  def foo1562(): scala.Int = { /* compiled code */ }
+  def foo1563(): scala.Int = { /* compiled code */ }
+  def foo1564(): scala.Int = { /* compiled code */ }
+  def foo1565(): scala.Int = { /* compiled code */ }
+  def foo1566(): scala.Int = { /* compiled code */ }
+  def foo1567(): scala.Int = { /* compiled code */ }
+  def foo1568(): scala.Int = { /* compiled code */ }
+  def foo1569(): scala.Int = { /* compiled code */ }
+  def foo1570(): scala.Int = { /* compiled code */ }
+  def foo1571(): scala.Int = { /* compiled code */ }
+  def foo1572(): scala.Int = { /* compiled code */ }
+  def foo1573(): scala.Int = { /* compiled code */ }
+  def foo1574(): scala.Int = { /* compiled code */ }
+  def foo1575(): scala.Int = { /* compiled code */ }
+  def foo1576(): scala.Int = { /* compiled code */ }
+  def foo1577(): scala.Int = { /* compiled code */ }
+  def foo1578(): scala.Int = { /* compiled code */ }
+  def foo1579(): scala.Int = { /* compiled code */ }
+  def foo1580(): scala.Int = { /* compiled code */ }
+  def foo1581(): scala.Int = { /* compiled code */ }
+  def foo1582(): scala.Int = { /* compiled code */ }
+  def foo1583(): scala.Int = { /* compiled code */ }
+  def foo1584(): scala.Int = { /* compiled code */ }
+  def foo1585(): scala.Int = { /* compiled code */ }
+  def foo1586(): scala.Int = { /* compiled code */ }
+  def foo1587(): scala.Int = { /* compiled code */ }
+  def foo1588(): scala.Int = { /* compiled code */ }
+  def foo1589(): scala.Int = { /* compiled code */ }
+  def foo1590(): scala.Int = { /* compiled code */ }
+  def foo1591(): scala.Int = { /* compiled code */ }
+  def foo1592(): scala.Int = { /* compiled code */ }
+  def foo1593(): scala.Int = { /* compiled code */ }
+  def foo1594(): scala.Int = { /* compiled code */ }
+  def foo1595(): scala.Int = { /* compiled code */ }
+  def foo1596(): scala.Int = { /* compiled code */ }
+  def foo1597(): scala.Int = { /* compiled code */ }
+  def foo1598(): scala.Int = { /* compiled code */ }
+  def foo1599(): scala.Int = { /* compiled code */ }
+  def foo1600(): scala.Int = { /* compiled code */ }
+  def foo1601(): scala.Int = { /* compiled code */ }
+  def foo1602(): scala.Int = { /* compiled code */ }
+  def foo1603(): scala.Int = { /* compiled code */ }
+  def foo1604(): scala.Int = { /* compiled code */ }
+  def foo1605(): scala.Int = { /* compiled code */ }
+  def foo1606(): scala.Int = { /* compiled code */ }
+  def foo1607(): scala.Int = { /* compiled code */ }
+  def foo1608(): scala.Int = { /* compiled code */ }
+  def foo1609(): scala.Int = { /* compiled code */ }
+  def foo1610(): scala.Int = { /* compiled code */ }
+  def foo1611(): scala.Int = { /* compiled code */ }
+  def foo1612(): scala.Int = { /* compiled code */ }
+  def foo1613(): scala.Int = { /* compiled code */ }
+  def foo1614(): scala.Int = { /* compiled code */ }
+  def foo1615(): scala.Int = { /* compiled code */ }
+  def foo1616(): scala.Int = { /* compiled code */ }
+  def foo1617(): scala.Int = { /* compiled code */ }
+  def foo1618(): scala.Int = { /* compiled code */ }
+  def foo1619(): scala.Int = { /* compiled code */ }
+  def foo1620(): scala.Int = { /* compiled code */ }
+  def foo1621(): scala.Int = { /* compiled code */ }
+  def foo1622(): scala.Int = { /* compiled code */ }
+  def foo1623(): scala.Int = { /* compiled code */ }
+  def foo1624(): scala.Int = { /* compiled code */ }
+  def foo1625(): scala.Int = { /* compiled code */ }
+  def foo1626(): scala.Int = { /* compiled code */ }
+  def foo1627(): scala.Int = { /* compiled code */ }
+  def foo1628(): scala.Int = { /* compiled code */ }
+  def foo1629(): scala.Int = { /* compiled code */ }
+  def foo1630(): scala.Int = { /* compiled code */ }
+  def foo1631(): scala.Int = { /* compiled code */ }
+  def foo1632(): scala.Int = { /* compiled code */ }
+  def foo1633(): scala.Int = { /* compiled code */ }
+  def foo1634(): scala.Int = { /* compiled code */ }
+  def foo1635(): scala.Int = { /* compiled code */ }
+  def foo1636(): scala.Int = { /* compiled code */ }
+  def foo1637(): scala.Int = { /* compiled code */ }
+  def foo1638(): scala.Int = { /* compiled code */ }
+  def foo1639(): scala.Int = { /* compiled code */ }
+  def foo1640(): scala.Int = { /* compiled code */ }
+  def foo1641(): scala.Int = { /* compiled code */ }
+  def foo1642(): scala.Int = { /* compiled code */ }
+  def foo1643(): scala.Int = { /* compiled code */ }
+  def foo1644(): scala.Int = { /* compiled code */ }
+  def foo1645(): scala.Int = { /* compiled code */ }
+  def foo1646(): scala.Int = { /* compiled code */ }
+  def foo1647(): scala.Int = { /* compiled code */ }
+  def foo1648(): scala.Int = { /* compiled code */ }
+  def foo1649(): scala.Int = { /* compiled code */ }
+  def foo1650(): scala.Int = { /* compiled code */ }
+  def foo1651(): scala.Int = { /* compiled code */ }
+  def foo1652(): scala.Int = { /* compiled code */ }
+  def foo1653(): scala.Int = { /* compiled code */ }
+  def foo1654(): scala.Int = { /* compiled code */ }
+  def foo1655(): scala.Int = { /* compiled code */ }
+  def foo1656(): scala.Int = { /* compiled code */ }
+  def foo1657(): scala.Int = { /* compiled code */ }
+  def foo1658(): scala.Int = { /* compiled code */ }
+  def foo1659(): scala.Int = { /* compiled code */ }
+  def foo1660(): scala.Int = { /* compiled code */ }
+  def foo1661(): scala.Int = { /* compiled code */ }
+  def foo1662(): scala.Int = { /* compiled code */ }
+  def foo1663(): scala.Int = { /* compiled code */ }
+  def foo1664(): scala.Int = { /* compiled code */ }
+  def foo1665(): scala.Int = { /* compiled code */ }
+  def foo1666(): scala.Int = { /* compiled code */ }
+  def foo1667(): scala.Int = { /* compiled code */ }
+  def foo1668(): scala.Int = { /* compiled code */ }
+  def foo1669(): scala.Int = { /* compiled code */ }
+  def foo1670(): scala.Int = { /* compiled code */ }
+  def foo1671(): scala.Int = { /* compiled code */ }
+  def foo1672(): scala.Int = { /* compiled code */ }
+  def foo1673(): scala.Int = { /* compiled code */ }
+  def foo1674(): scala.Int = { /* compiled code */ }
+  def foo1675(): scala.Int = { /* compiled code */ }
+  def foo1676(): scala.Int = { /* compiled code */ }
+  def foo1677(): scala.Int = { /* compiled code */ }
+  def foo1678(): scala.Int = { /* compiled code */ }
+  def foo1679(): scala.Int = { /* compiled code */ }
+  def foo1680(): scala.Int = { /* compiled code */ }
+  def foo1681(): scala.Int = { /* compiled code */ }
+  def foo1682(): scala.Int = { /* compiled code */ }
+  def foo1683(): scala.Int = { /* compiled code */ }
+  def foo1684(): scala.Int = { /* compiled code */ }
+  def foo1685(): scala.Int = { /* compiled code */ }
+  def foo1686(): scala.Int = { /* compiled code */ }
+  def foo1687(): scala.Int = { /* compiled code */ }
+  def foo1688(): scala.Int = { /* compiled code */ }
+  def foo1689(): scala.Int = { /* compiled code */ }
+  def foo1690(): scala.Int = { /* compiled code */ }
+  def foo1691(): scala.Int = { /* compiled code */ }
+  def foo1692(): scala.Int = { /* compiled code */ }
+  def foo1693(): scala.Int = { /* compiled code */ }
+  def foo1694(): scala.Int = { /* compiled code */ }
+  def foo1695(): scala.Int = { /* compiled code */ }
+  def foo1696(): scala.Int = { /* compiled code */ }
+  def foo1697(): scala.Int = { /* compiled code */ }
+  def foo1698(): scala.Int = { /* compiled code */ }
+  def foo1699(): scala.Int = { /* compiled code */ }
+  def foo1700(): scala.Int = { /* compiled code */ }
+  def foo1701(): scala.Int = { /* compiled code */ }
+  def foo1702(): scala.Int = { /* compiled code */ }
+  def foo1703(): scala.Int = { /* compiled code */ }
+  def foo1704(): scala.Int = { /* compiled code */ }
+  def foo1705(): scala.Int = { /* compiled code */ }
+  def foo1706(): scala.Int = { /* compiled code */ }
+  def foo1707(): scala.Int = { /* compiled code */ }
+  def foo1708(): scala.Int = { /* compiled code */ }
+  def foo1709(): scala.Int = { /* compiled code */ }
+  def foo1710(): scala.Int = { /* compiled code */ }
+  def foo1711(): scala.Int = { /* compiled code */ }
+  def foo1712(): scala.Int = { /* compiled code */ }
+  def foo1713(): scala.Int = { /* compiled code */ }
+  def foo1714(): scala.Int = { /* compiled code */ }
+  def foo1715(): scala.Int = { /* compiled code */ }
+  def foo1716(): scala.Int = { /* compiled code */ }
+  def foo1717(): scala.Int = { /* compiled code */ }
+  def foo1718(): scala.Int = { /* compiled code */ }
+  def foo1719(): scala.Int = { /* compiled code */ }
+  def foo1720(): scala.Int = { /* compiled code */ }
+  def foo1721(): scala.Int = { /* compiled code */ }
+  def foo1722(): scala.Int = { /* compiled code */ }
+  def foo1723(): scala.Int = { /* compiled code */ }
+  def foo1724(): scala.Int = { /* compiled code */ }
+  def foo1725(): scala.Int = { /* compiled code */ }
+  def foo1726(): scala.Int = { /* compiled code */ }
+  def foo1727(): scala.Int = { /* compiled code */ }
+  def foo1728(): scala.Int = { /* compiled code */ }
+  def foo1729(): scala.Int = { /* compiled code */ }
+  def foo1730(): scala.Int = { /* compiled code */ }
+  def foo1731(): scala.Int = { /* compiled code */ }
+  def foo1732(): scala.Int = { /* compiled code */ }
+  def foo1733(): scala.Int = { /* compiled code */ }
+  def foo1734(): scala.Int = { /* compiled code */ }
+  def foo1735(): scala.Int = { /* compiled code */ }
+  def foo1736(): scala.Int = { /* compiled code */ }
+  def foo1737(): scala.Int = { /* compiled code */ }
+  def foo1738(): scala.Int = { /* compiled code */ }
+  def foo1739(): scala.Int = { /* compiled code */ }
+  def foo1740(): scala.Int = { /* compiled code */ }
+  def foo1741(): scala.Int = { /* compiled code */ }
+  def foo1742(): scala.Int = { /* compiled code */ }
+  def foo1743(): scala.Int = { /* compiled code */ }
+  def foo1744(): scala.Int = { /* compiled code */ }
+  def foo1745(): scala.Int = { /* compiled code */ }
+  def foo1746(): scala.Int = { /* compiled code */ }
+  def foo1747(): scala.Int = { /* compiled code */ }
+  def foo1748(): scala.Int = { /* compiled code */ }
+  def foo1749(): scala.Int = { /* compiled code */ }
+  def foo1750(): scala.Int = { /* compiled code */ }
+  def foo1751(): scala.Int = { /* compiled code */ }
+  def foo1752(): scala.Int = { /* compiled code */ }
+  def foo1753(): scala.Int = { /* compiled code */ }
+  def foo1754(): scala.Int = { /* compiled code */ }
+  def foo1755(): scala.Int = { /* compiled code */ }
+  def foo1756(): scala.Int = { /* compiled code */ }
+  def foo1757(): scala.Int = { /* compiled code */ }
+  def foo1758(): scala.Int = { /* compiled code */ }
+  def foo1759(): scala.Int = { /* compiled code */ }
+  def foo1760(): scala.Int = { /* compiled code */ }
+  def foo1761(): scala.Int = { /* compiled code */ }
+  def foo1762(): scala.Int = { /* compiled code */ }
+  def foo1763(): scala.Int = { /* compiled code */ }
+  def foo1764(): scala.Int = { /* compiled code */ }
+  def foo1765(): scala.Int = { /* compiled code */ }
+  def foo1766(): scala.Int = { /* compiled code */ }
+  def foo1767(): scala.Int = { /* compiled code */ }
+  def foo1768(): scala.Int = { /* compiled code */ }
+  def foo1769(): scala.Int = { /* compiled code */ }
+  def foo1770(): scala.Int = { /* compiled code */ }
+  def foo1771(): scala.Int = { /* compiled code */ }
+  def foo1772(): scala.Int = { /* compiled code */ }
+  def foo1773(): scala.Int = { /* compiled code */ }
+  def foo1774(): scala.Int = { /* compiled code */ }
+  def foo1775(): scala.Int = { /* compiled code */ }
+  def foo1776(): scala.Int = { /* compiled code */ }
+  def foo1777(): scala.Int = { /* compiled code */ }
+  def foo1778(): scala.Int = { /* compiled code */ }
+  def foo1779(): scala.Int = { /* compiled code */ }
+  def foo1780(): scala.Int = { /* compiled code */ }
+  def foo1781(): scala.Int = { /* compiled code */ }
+  def foo1782(): scala.Int = { /* compiled code */ }
+  def foo1783(): scala.Int = { /* compiled code */ }
+  def foo1784(): scala.Int = { /* compiled code */ }
+  def foo1785(): scala.Int = { /* compiled code */ }
+  def foo1786(): scala.Int = { /* compiled code */ }
+  def foo1787(): scala.Int = { /* compiled code */ }
+  def foo1788(): scala.Int = { /* compiled code */ }
+  def foo1789(): scala.Int = { /* compiled code */ }
+  def foo1790(): scala.Int = { /* compiled code */ }
+  def foo1791(): scala.Int = { /* compiled code */ }
+  def foo1792(): scala.Int = { /* compiled code */ }
+  def foo1793(): scala.Int = { /* compiled code */ }
+  def foo1794(): scala.Int = { /* compiled code */ }
+  def foo1795(): scala.Int = { /* compiled code */ }
+  def foo1796(): scala.Int = { /* compiled code */ }
+  def foo1797(): scala.Int = { /* compiled code */ }
+  def foo1798(): scala.Int = { /* compiled code */ }
+  def foo1799(): scala.Int = { /* compiled code */ }
+  def foo1800(): scala.Int = { /* compiled code */ }
+  def foo1801(): scala.Int = { /* compiled code */ }
+  def foo1802(): scala.Int = { /* compiled code */ }
+  def foo1803(): scala.Int = { /* compiled code */ }
+  def foo1804(): scala.Int = { /* compiled code */ }
+  def foo1805(): scala.Int = { /* compiled code */ }
+  def foo1806(): scala.Int = { /* compiled code */ }
+  def foo1807(): scala.Int = { /* compiled code */ }
+  def foo1808(): scala.Int = { /* compiled code */ }
+  def foo1809(): scala.Int = { /* compiled code */ }
+  def foo1810(): scala.Int = { /* compiled code */ }
+  def foo1811(): scala.Int = { /* compiled code */ }
+  def foo1812(): scala.Int = { /* compiled code */ }
+  def foo1813(): scala.Int = { /* compiled code */ }
+  def foo1814(): scala.Int = { /* compiled code */ }
+  def foo1815(): scala.Int = { /* compiled code */ }
+  def foo1816(): scala.Int = { /* compiled code */ }
+  def foo1817(): scala.Int = { /* compiled code */ }
+  def foo1818(): scala.Int = { /* compiled code */ }
+  def foo1819(): scala.Int = { /* compiled code */ }
+  def foo1820(): scala.Int = { /* compiled code */ }
+  def foo1821(): scala.Int = { /* compiled code */ }
+  def foo1822(): scala.Int = { /* compiled code */ }
+  def foo1823(): scala.Int = { /* compiled code */ }
+  def foo1824(): scala.Int = { /* compiled code */ }
+  def foo1825(): scala.Int = { /* compiled code */ }
+  def foo1826(): scala.Int = { /* compiled code */ }
+  def foo1827(): scala.Int = { /* compiled code */ }
+  def foo1828(): scala.Int = { /* compiled code */ }
+  def foo1829(): scala.Int = { /* compiled code */ }
+  def foo1830(): scala.Int = { /* compiled code */ }
+  def foo1831(): scala.Int = { /* compiled code */ }
+  def foo1832(): scala.Int = { /* compiled code */ }
+  def foo1833(): scala.Int = { /* compiled code */ }
+  def foo1834(): scala.Int = { /* compiled code */ }
+  def foo1835(): scala.Int = { /* compiled code */ }
+  def foo1836(): scala.Int = { /* compiled code */ }
+  def foo1837(): scala.Int = { /* compiled code */ }
+  def foo1838(): scala.Int = { /* compiled code */ }
+  def foo1839(): scala.Int = { /* compiled code */ }
+  def foo1840(): scala.Int = { /* compiled code */ }
+  def foo1841(): scala.Int = { /* compiled code */ }
+  def foo1842(): scala.Int = { /* compiled code */ }
+  def foo1843(): scala.Int = { /* compiled code */ }
+  def foo1844(): scala.Int = { /* compiled code */ }
+  def foo1845(): scala.Int = { /* compiled code */ }
+  def foo1846(): scala.Int = { /* compiled code */ }
+  def foo1847(): scala.Int = { /* compiled code */ }
+  def foo1848(): scala.Int = { /* compiled code */ }
+  def foo1849(): scala.Int = { /* compiled code */ }
+  def foo1850(): scala.Int = { /* compiled code */ }
+  def foo1851(): scala.Int = { /* compiled code */ }
+  def foo1852(): scala.Int = { /* compiled code */ }
+  def foo1853(): scala.Int = { /* compiled code */ }
+  def foo1854(): scala.Int = { /* compiled code */ }
+  def foo1855(): scala.Int = { /* compiled code */ }
+  def foo1856(): scala.Int = { /* compiled code */ }
+  def foo1857(): scala.Int = { /* compiled code */ }
+  def foo1858(): scala.Int = { /* compiled code */ }
+  def foo1859(): scala.Int = { /* compiled code */ }
+  def foo1860(): scala.Int = { /* compiled code */ }
+  def foo1861(): scala.Int = { /* compiled code */ }
+  def foo1862(): scala.Int = { /* compiled code */ }
+  def foo1863(): scala.Int = { /* compiled code */ }
+  def foo1864(): scala.Int = { /* compiled code */ }
+  def foo1865(): scala.Int = { /* compiled code */ }
+  def foo1866(): scala.Int = { /* compiled code */ }
+  def foo1867(): scala.Int = { /* compiled code */ }
+  def foo1868(): scala.Int = { /* compiled code */ }
+  def foo1869(): scala.Int = { /* compiled code */ }
+  def foo1870(): scala.Int = { /* compiled code */ }
+  def foo1871(): scala.Int = { /* compiled code */ }
+  def foo1872(): scala.Int = { /* compiled code */ }
+  def foo1873(): scala.Int = { /* compiled code */ }
+  def foo1874(): scala.Int = { /* compiled code */ }
+  def foo1875(): scala.Int = { /* compiled code */ }
+  def foo1876(): scala.Int = { /* compiled code */ }
+  def foo1877(): scala.Int = { /* compiled code */ }
+  def foo1878(): scala.Int = { /* compiled code */ }
+  def foo1879(): scala.Int = { /* compiled code */ }
+  def foo1880(): scala.Int = { /* compiled code */ }
+  def foo1881(): scala.Int = { /* compiled code */ }
+  def foo1882(): scala.Int = { /* compiled code */ }
+  def foo1883(): scala.Int = { /* compiled code */ }
+  def foo1884(): scala.Int = { /* compiled code */ }
+  def foo1885(): scala.Int = { /* compiled code */ }
+  def foo1886(): scala.Int = { /* compiled code */ }
+  def foo1887(): scala.Int = { /* compiled code */ }
+  def foo1888(): scala.Int = { /* compiled code */ }
+  def foo1889(): scala.Int = { /* compiled code */ }
+  def foo1890(): scala.Int = { /* compiled code */ }
+  def foo1891(): scala.Int = { /* compiled code */ }
+  def foo1892(): scala.Int = { /* compiled code */ }
+  def foo1893(): scala.Int = { /* compiled code */ }
+  def foo1894(): scala.Int = { /* compiled code */ }
+  def foo1895(): scala.Int = { /* compiled code */ }
+  def foo1896(): scala.Int = { /* compiled code */ }
+  def foo1897(): scala.Int = { /* compiled code */ }
+  def foo1898(): scala.Int = { /* compiled code */ }
+  def foo1899(): scala.Int = { /* compiled code */ }
+  def foo1900(): scala.Int = { /* compiled code */ }
+  def foo1901(): scala.Int = { /* compiled code */ }
+  def foo1902(): scala.Int = { /* compiled code */ }
+  def foo1903(): scala.Int = { /* compiled code */ }
+  def foo1904(): scala.Int = { /* compiled code */ }
+  def foo1905(): scala.Int = { /* compiled code */ }
+  def foo1906(): scala.Int = { /* compiled code */ }
+  def foo1907(): scala.Int = { /* compiled code */ }
+  def foo1908(): scala.Int = { /* compiled code */ }
+  def foo1909(): scala.Int = { /* compiled code */ }
+  def foo1910(): scala.Int = { /* compiled code */ }
+  def foo1911(): scala.Int = { /* compiled code */ }
+  def foo1912(): scala.Int = { /* compiled code */ }
+  def foo1913(): scala.Int = { /* compiled code */ }
+  def foo1914(): scala.Int = { /* compiled code */ }
+  def foo1915(): scala.Int = { /* compiled code */ }
+  def foo1916(): scala.Int = { /* compiled code */ }
+  def foo1917(): scala.Int = { /* compiled code */ }
+  def foo1918(): scala.Int = { /* compiled code */ }
+  def foo1919(): scala.Int = { /* compiled code */ }
+  def foo1920(): scala.Int = { /* compiled code */ }
+  def foo1921(): scala.Int = { /* compiled code */ }
+  def foo1922(): scala.Int = { /* compiled code */ }
+  def foo1923(): scala.Int = { /* compiled code */ }
+  def foo1924(): scala.Int = { /* compiled code */ }
+  def foo1925(): scala.Int = { /* compiled code */ }
+  def foo1926(): scala.Int = { /* compiled code */ }
+  def foo1927(): scala.Int = { /* compiled code */ }
+  def foo1928(): scala.Int = { /* compiled code */ }
+  def foo1929(): scala.Int = { /* compiled code */ }
+  def foo1930(): scala.Int = { /* compiled code */ }
+  def foo1931(): scala.Int = { /* compiled code */ }
+  def foo1932(): scala.Int = { /* compiled code */ }
+  def foo1933(): scala.Int = { /* compiled code */ }
+  def foo1934(): scala.Int = { /* compiled code */ }
+  def foo1935(): scala.Int = { /* compiled code */ }
+  def foo1936(): scala.Int = { /* compiled code */ }
+  def foo1937(): scala.Int = { /* compiled code */ }
+  def foo1938(): scala.Int = { /* compiled code */ }
+  def foo1939(): scala.Int = { /* compiled code */ }
+  def foo1940(): scala.Int = { /* compiled code */ }
+  def foo1941(): scala.Int = { /* compiled code */ }
+  def foo1942(): scala.Int = { /* compiled code */ }
+  def foo1943(): scala.Int = { /* compiled code */ }
+  def foo1944(): scala.Int = { /* compiled code */ }
+  def foo1945(): scala.Int = { /* compiled code */ }
+  def foo1946(): scala.Int = { /* compiled code */ }
+  def foo1947(): scala.Int = { /* compiled code */ }
+  def foo1948(): scala.Int = { /* compiled code */ }
+  def foo1949(): scala.Int = { /* compiled code */ }
+  def foo1950(): scala.Int = { /* compiled code */ }
+  def foo1951(): scala.Int = { /* compiled code */ }
+  def foo1952(): scala.Int = { /* compiled code */ }
+  def foo1953(): scala.Int = { /* compiled code */ }
+  def foo1954(): scala.Int = { /* compiled code */ }
+  def foo1955(): scala.Int = { /* compiled code */ }
+  def foo1956(): scala.Int = { /* compiled code */ }
+  def foo1957(): scala.Int = { /* compiled code */ }
+  def foo1958(): scala.Int = { /* compiled code */ }
+  def foo1959(): scala.Int = { /* compiled code */ }
+  def foo1960(): scala.Int = { /* compiled code */ }
+  def foo1961(): scala.Int = { /* compiled code */ }
+  def foo1962(): scala.Int = { /* compiled code */ }
+  def foo1963(): scala.Int = { /* compiled code */ }
+  def foo1964(): scala.Int = { /* compiled code */ }
+  def foo1965(): scala.Int = { /* compiled code */ }
+  def foo1966(): scala.Int = { /* compiled code */ }
+  def foo1967(): scala.Int = { /* compiled code */ }
+  def foo1968(): scala.Int = { /* compiled code */ }
+  def foo1969(): scala.Int = { /* compiled code */ }
+  def foo1970(): scala.Int = { /* compiled code */ }
+  def foo1971(): scala.Int = { /* compiled code */ }
+  def foo1972(): scala.Int = { /* compiled code */ }
+  def foo1973(): scala.Int = { /* compiled code */ }
+  def foo1974(): scala.Int = { /* compiled code */ }
+  def foo1975(): scala.Int = { /* compiled code */ }
+  def foo1976(): scala.Int = { /* compiled code */ }
+  def foo1977(): scala.Int = { /* compiled code */ }
+  def foo1978(): scala.Int = { /* compiled code */ }
+  def foo1979(): scala.Int = { /* compiled code */ }
+  def foo1980(): scala.Int = { /* compiled code */ }
+  def foo1981(): scala.Int = { /* compiled code */ }
+  def foo1982(): scala.Int = { /* compiled code */ }
+  def foo1983(): scala.Int = { /* compiled code */ }
+  def foo1984(): scala.Int = { /* compiled code */ }
+  def foo1985(): scala.Int = { /* compiled code */ }
+  def foo1986(): scala.Int = { /* compiled code */ }
+  def foo1987(): scala.Int = { /* compiled code */ }
+  def foo1988(): scala.Int = { /* compiled code */ }
+  def foo1989(): scala.Int = { /* compiled code */ }
+  def foo1990(): scala.Int = { /* compiled code */ }
+  def foo1991(): scala.Int = { /* compiled code */ }
+  def foo1992(): scala.Int = { /* compiled code */ }
+  def foo1993(): scala.Int = { /* compiled code */ }
+  def foo1994(): scala.Int = { /* compiled code */ }
+  def foo1995(): scala.Int = { /* compiled code */ }
+  def foo1996(): scala.Int = { /* compiled code */ }
+  def foo1997(): scala.Int = { /* compiled code */ }
+  def foo1998(): scala.Int = { /* compiled code */ }
+  def foo1999(): scala.Int = { /* compiled code */ }
+  def foo2000(): scala.Int = { /* compiled code */ }
+  def foo2001(): scala.Int = { /* compiled code */ }
+  def foo2002(): scala.Int = { /* compiled code */ }
+  def foo2003(): scala.Int = { /* compiled code */ }
+  def foo2004(): scala.Int = { /* compiled code */ }
+  def foo2005(): scala.Int = { /* compiled code */ }
+  def foo2006(): scala.Int = { /* compiled code */ }
+  def foo2007(): scala.Int = { /* compiled code */ }
+  def foo2008(): scala.Int = { /* compiled code */ }
+  def foo2009(): scala.Int = { /* compiled code */ }
+  def foo2010(): scala.Int = { /* compiled code */ }
+  def foo2011(): scala.Int = { /* compiled code */ }
+  def foo2012(): scala.Int = { /* compiled code */ }
+  def foo2013(): scala.Int = { /* compiled code */ }
+  def foo2014(): scala.Int = { /* compiled code */ }
+  def foo2015(): scala.Int = { /* compiled code */ }
+  def foo2016(): scala.Int = { /* compiled code */ }
+  def foo2017(): scala.Int = { /* compiled code */ }
+  def foo2018(): scala.Int = { /* compiled code */ }
+  def foo2019(): scala.Int = { /* compiled code */ }
+  def foo2020(): scala.Int = { /* compiled code */ }
+  def foo2021(): scala.Int = { /* compiled code */ }
+  def foo2022(): scala.Int = { /* compiled code */ }
+  def foo2023(): scala.Int = { /* compiled code */ }
+  def foo2024(): scala.Int = { /* compiled code */ }
+  def foo2025(): scala.Int = { /* compiled code */ }
+  def foo2026(): scala.Int = { /* compiled code */ }
+  def foo2027(): scala.Int = { /* compiled code */ }
+  def foo2028(): scala.Int = { /* compiled code */ }
+  def foo2029(): scala.Int = { /* compiled code */ }
+  def foo2030(): scala.Int = { /* compiled code */ }
+  def foo2031(): scala.Int = { /* compiled code */ }
+  def foo2032(): scala.Int = { /* compiled code */ }
+  def foo2033(): scala.Int = { /* compiled code */ }
+  def foo2034(): scala.Int = { /* compiled code */ }
+  def foo2035(): scala.Int = { /* compiled code */ }
+  def foo2036(): scala.Int = { /* compiled code */ }
+  def foo2037(): scala.Int = { /* compiled code */ }
+  def foo2038(): scala.Int = { /* compiled code */ }
+  def foo2039(): scala.Int = { /* compiled code */ }
+  def foo2040(): scala.Int = { /* compiled code */ }
+  def foo2041(): scala.Int = { /* compiled code */ }
+  def foo2042(): scala.Int = { /* compiled code */ }
+  def foo2043(): scala.Int = { /* compiled code */ }
+  def foo2044(): scala.Int = { /* compiled code */ }
+  def foo2045(): scala.Int = { /* compiled code */ }
+  def foo2046(): scala.Int = { /* compiled code */ }
+  def foo2047(): scala.Int = { /* compiled code */ }
+  def foo2048(): scala.Int = { /* compiled code */ }
+  def foo2049(): scala.Int = { /* compiled code */ }
+  def foo2050(): scala.Int = { /* compiled code */ }
+  def foo2051(): scala.Int = { /* compiled code */ }
+  def foo2052(): scala.Int = { /* compiled code */ }
+  def foo2053(): scala.Int = { /* compiled code */ }
+  def foo2054(): scala.Int = { /* compiled code */ }
+  def foo2055(): scala.Int = { /* compiled code */ }
+  def foo2056(): scala.Int = { /* compiled code */ }
+  def foo2057(): scala.Int = { /* compiled code */ }
+  def foo2058(): scala.Int = { /* compiled code */ }
+  def foo2059(): scala.Int = { /* compiled code */ }
+  def foo2060(): scala.Int = { /* compiled code */ }
+  def foo2061(): scala.Int = { /* compiled code */ }
+  def foo2062(): scala.Int = { /* compiled code */ }
+  def foo2063(): scala.Int = { /* compiled code */ }
+  def foo2064(): scala.Int = { /* compiled code */ }
+  def foo2065(): scala.Int = { /* compiled code */ }
+  def foo2066(): scala.Int = { /* compiled code */ }
+  def foo2067(): scala.Int = { /* compiled code */ }
+  def foo2068(): scala.Int = { /* compiled code */ }
+  def foo2069(): scala.Int = { /* compiled code */ }
+  def foo2070(): scala.Int = { /* compiled code */ }
+  def foo2071(): scala.Int = { /* compiled code */ }
+  def foo2072(): scala.Int = { /* compiled code */ }
+  def foo2073(): scala.Int = { /* compiled code */ }
+  def foo2074(): scala.Int = { /* compiled code */ }
+  def foo2075(): scala.Int = { /* compiled code */ }
+  def foo2076(): scala.Int = { /* compiled code */ }
+  def foo2077(): scala.Int = { /* compiled code */ }
+  def foo2078(): scala.Int = { /* compiled code */ }
+  def foo2079(): scala.Int = { /* compiled code */ }
+  def foo2080(): scala.Int = { /* compiled code */ }
+  def foo2081(): scala.Int = { /* compiled code */ }
+  def foo2082(): scala.Int = { /* compiled code */ }
+  def foo2083(): scala.Int = { /* compiled code */ }
+  def foo2084(): scala.Int = { /* compiled code */ }
+  def foo2085(): scala.Int = { /* compiled code */ }
+  def foo2086(): scala.Int = { /* compiled code */ }
+  def foo2087(): scala.Int = { /* compiled code */ }
+  def foo2088(): scala.Int = { /* compiled code */ }
+  def foo2089(): scala.Int = { /* compiled code */ }
+  def foo2090(): scala.Int = { /* compiled code */ }
+  def foo2091(): scala.Int = { /* compiled code */ }
+  def foo2092(): scala.Int = { /* compiled code */ }
+  def foo2093(): scala.Int = { /* compiled code */ }
+  def foo2094(): scala.Int = { /* compiled code */ }
+  def foo2095(): scala.Int = { /* compiled code */ }
+  def foo2096(): scala.Int = { /* compiled code */ }
+  def foo2097(): scala.Int = { /* compiled code */ }
+  def foo2098(): scala.Int = { /* compiled code */ }
+  def foo2099(): scala.Int = { /* compiled code */ }
+  def foo2100(): scala.Int = { /* compiled code */ }
+  def foo2101(): scala.Int = { /* compiled code */ }
+  def foo2102(): scala.Int = { /* compiled code */ }
+  def foo2103(): scala.Int = { /* compiled code */ }
+  def foo2104(): scala.Int = { /* compiled code */ }
+  def foo2105(): scala.Int = { /* compiled code */ }
+  def foo2106(): scala.Int = { /* compiled code */ }
+  def foo2107(): scala.Int = { /* compiled code */ }
+  def foo2108(): scala.Int = { /* compiled code */ }
+  def foo2109(): scala.Int = { /* compiled code */ }
+  def foo2110(): scala.Int = { /* compiled code */ }
+  def foo2111(): scala.Int = { /* compiled code */ }
+  def foo2112(): scala.Int = { /* compiled code */ }
+  def foo2113(): scala.Int = { /* compiled code */ }
+  def foo2114(): scala.Int = { /* compiled code */ }
+  def foo2115(): scala.Int = { /* compiled code */ }
+  def foo2116(): scala.Int = { /* compiled code */ }
+  def foo2117(): scala.Int = { /* compiled code */ }
+  def foo2118(): scala.Int = { /* compiled code */ }
+  def foo2119(): scala.Int = { /* compiled code */ }
+  def foo2120(): scala.Int = { /* compiled code */ }
+  def foo2121(): scala.Int = { /* compiled code */ }
+  def foo2122(): scala.Int = { /* compiled code */ }
+  def foo2123(): scala.Int = { /* compiled code */ }
+  def foo2124(): scala.Int = { /* compiled code */ }
+  def foo2125(): scala.Int = { /* compiled code */ }
+  def foo2126(): scala.Int = { /* compiled code */ }
+  def foo2127(): scala.Int = { /* compiled code */ }
+  def foo2128(): scala.Int = { /* compiled code */ }
+  def foo2129(): scala.Int = { /* compiled code */ }
+  def foo2130(): scala.Int = { /* compiled code */ }
+  def foo2131(): scala.Int = { /* compiled code */ }
+  def foo2132(): scala.Int = { /* compiled code */ }
+  def foo2133(): scala.Int = { /* compiled code */ }
+  def foo2134(): scala.Int = { /* compiled code */ }
+  def foo2135(): scala.Int = { /* compiled code */ }
+  def foo2136(): scala.Int = { /* compiled code */ }
+  def foo2137(): scala.Int = { /* compiled code */ }
+  def foo2138(): scala.Int = { /* compiled code */ }
+  def foo2139(): scala.Int = { /* compiled code */ }
+  def foo2140(): scala.Int = { /* compiled code */ }
+  def foo2141(): scala.Int = { /* compiled code */ }
+  def foo2142(): scala.Int = { /* compiled code */ }
+  def foo2143(): scala.Int = { /* compiled code */ }
+  def foo2144(): scala.Int = { /* compiled code */ }
+  def foo2145(): scala.Int = { /* compiled code */ }
+  def foo2146(): scala.Int = { /* compiled code */ }
+  def foo2147(): scala.Int = { /* compiled code */ }
+  def foo2148(): scala.Int = { /* compiled code */ }
+  def foo2149(): scala.Int = { /* compiled code */ }
+  def foo2150(): scala.Int = { /* compiled code */ }
+  def foo2151(): scala.Int = { /* compiled code */ }
+  def foo2152(): scala.Int = { /* compiled code */ }
+  def foo2153(): scala.Int = { /* compiled code */ }
+  def foo2154(): scala.Int = { /* compiled code */ }
+  def foo2155(): scala.Int = { /* compiled code */ }
+  def foo2156(): scala.Int = { /* compiled code */ }
+  def foo2157(): scala.Int = { /* compiled code */ }
+  def foo2158(): scala.Int = { /* compiled code */ }
+  def foo2159(): scala.Int = { /* compiled code */ }
+  def foo2160(): scala.Int = { /* compiled code */ }
+  def foo2161(): scala.Int = { /* compiled code */ }
+  def foo2162(): scala.Int = { /* compiled code */ }
+  def foo2163(): scala.Int = { /* compiled code */ }
+  def foo2164(): scala.Int = { /* compiled code */ }
+  def foo2165(): scala.Int = { /* compiled code */ }
+  def foo2166(): scala.Int = { /* compiled code */ }
+  def foo2167(): scala.Int = { /* compiled code */ }
+  def foo2168(): scala.Int = { /* compiled code */ }
+  def foo2169(): scala.Int = { /* compiled code */ }
+  def foo2170(): scala.Int = { /* compiled code */ }
+  def foo2171(): scala.Int = { /* compiled code */ }
+  def foo2172(): scala.Int = { /* compiled code */ }
+  def foo2173(): scala.Int = { /* compiled code */ }
+  def foo2174(): scala.Int = { /* compiled code */ }
+  def foo2175(): scala.Int = { /* compiled code */ }
+  def foo2176(): scala.Int = { /* compiled code */ }
+  def foo2177(): scala.Int = { /* compiled code */ }
+  def foo2178(): scala.Int = { /* compiled code */ }
+  def foo2179(): scala.Int = { /* compiled code */ }
+  def foo2180(): scala.Int = { /* compiled code */ }
+  def foo2181(): scala.Int = { /* compiled code */ }
+  def foo2182(): scala.Int = { /* compiled code */ }
+  def foo2183(): scala.Int = { /* compiled code */ }
+  def foo2184(): scala.Int = { /* compiled code */ }
+  def foo2185(): scala.Int = { /* compiled code */ }
+  def foo2186(): scala.Int = { /* compiled code */ }
+  def foo2187(): scala.Int = { /* compiled code */ }
+  def foo2188(): scala.Int = { /* compiled code */ }
+  def foo2189(): scala.Int = { /* compiled code */ }
+  def foo2190(): scala.Int = { /* compiled code */ }
+  def foo2191(): scala.Int = { /* compiled code */ }
+  def foo2192(): scala.Int = { /* compiled code */ }
+  def foo2193(): scala.Int = { /* compiled code */ }
+  def foo2194(): scala.Int = { /* compiled code */ }
+  def foo2195(): scala.Int = { /* compiled code */ }
+  def foo2196(): scala.Int = { /* compiled code */ }
+  def foo2197(): scala.Int = { /* compiled code */ }
+  def foo2198(): scala.Int = { /* compiled code */ }
+  def foo2199(): scala.Int = { /* compiled code */ }
+  def foo2200(): scala.Int = { /* compiled code */ }
+  def foo2201(): scala.Int = { /* compiled code */ }
+  def foo2202(): scala.Int = { /* compiled code */ }
+  def foo2203(): scala.Int = { /* compiled code */ }
+  def foo2204(): scala.Int = { /* compiled code */ }
+  def foo2205(): scala.Int = { /* compiled code */ }
+  def foo2206(): scala.Int = { /* compiled code */ }
+  def foo2207(): scala.Int = { /* compiled code */ }
+  def foo2208(): scala.Int = { /* compiled code */ }
+  def foo2209(): scala.Int = { /* compiled code */ }
+  def foo2210(): scala.Int = { /* compiled code */ }
+  def foo2211(): scala.Int = { /* compiled code */ }
+  def foo2212(): scala.Int = { /* compiled code */ }
+  def foo2213(): scala.Int = { /* compiled code */ }
+  def foo2214(): scala.Int = { /* compiled code */ }
+  def foo2215(): scala.Int = { /* compiled code */ }
+  def foo2216(): scala.Int = { /* compiled code */ }
+  def foo2217(): scala.Int = { /* compiled code */ }
+  def foo2218(): scala.Int = { /* compiled code */ }
+  def foo2219(): scala.Int = { /* compiled code */ }
+  def foo2220(): scala.Int = { /* compiled code */ }
+  def foo2221(): scala.Int = { /* compiled code */ }
+  def foo2222(): scala.Int = { /* compiled code */ }
+  def foo2223(): scala.Int = { /* compiled code */ }
+  def foo2224(): scala.Int = { /* compiled code */ }
+  def foo2225(): scala.Int = { /* compiled code */ }
+  def foo2226(): scala.Int = { /* compiled code */ }
+  def foo2227(): scala.Int = { /* compiled code */ }
+  def foo2228(): scala.Int = { /* compiled code */ }
+  def foo2229(): scala.Int = { /* compiled code */ }
+  def foo2230(): scala.Int = { /* compiled code */ }
+  def foo2231(): scala.Int = { /* compiled code */ }
+  def foo2232(): scala.Int = { /* compiled code */ }
+  def foo2233(): scala.Int = { /* compiled code */ }
+  def foo2234(): scala.Int = { /* compiled code */ }
+  def foo2235(): scala.Int = { /* compiled code */ }
+  def foo2236(): scala.Int = { /* compiled code */ }
+  def foo2237(): scala.Int = { /* compiled code */ }
+  def foo2238(): scala.Int = { /* compiled code */ }
+  def foo2239(): scala.Int = { /* compiled code */ }
+  def foo2240(): scala.Int = { /* compiled code */ }
+  def foo2241(): scala.Int = { /* compiled code */ }
+  def foo2242(): scala.Int = { /* compiled code */ }
+  def foo2243(): scala.Int = { /* compiled code */ }
+  def foo2244(): scala.Int = { /* compiled code */ }
+  def foo2245(): scala.Int = { /* compiled code */ }
+  def foo2246(): scala.Int = { /* compiled code */ }
+  def foo2247(): scala.Int = { /* compiled code */ }
+  def foo2248(): scala.Int = { /* compiled code */ }
+  def foo2249(): scala.Int = { /* compiled code */ }
+  def foo2250(): scala.Int = { /* compiled code */ }
+  def foo2251(): scala.Int = { /* compiled code */ }
+  def foo2252(): scala.Int = { /* compiled code */ }
+  def foo2253(): scala.Int = { /* compiled code */ }
+  def foo2254(): scala.Int = { /* compiled code */ }
+  def foo2255(): scala.Int = { /* compiled code */ }
+  def foo2256(): scala.Int = { /* compiled code */ }
+  def foo2257(): scala.Int = { /* compiled code */ }
+  def foo2258(): scala.Int = { /* compiled code */ }
+  def foo2259(): scala.Int = { /* compiled code */ }
+  def foo2260(): scala.Int = { /* compiled code */ }
+  def foo2261(): scala.Int = { /* compiled code */ }
+  def foo2262(): scala.Int = { /* compiled code */ }
+  def foo2263(): scala.Int = { /* compiled code */ }
+  def foo2264(): scala.Int = { /* compiled code */ }
+  def foo2265(): scala.Int = { /* compiled code */ }
+  def foo2266(): scala.Int = { /* compiled code */ }
+  def foo2267(): scala.Int = { /* compiled code */ }
+  def foo2268(): scala.Int = { /* compiled code */ }
+  def foo2269(): scala.Int = { /* compiled code */ }
+  def foo2270(): scala.Int = { /* compiled code */ }
+  def foo2271(): scala.Int = { /* compiled code */ }
+  def foo2272(): scala.Int = { /* compiled code */ }
+  def foo2273(): scala.Int = { /* compiled code */ }
+  def foo2274(): scala.Int = { /* compiled code */ }
+  def foo2275(): scala.Int = { /* compiled code */ }
+  def foo2276(): scala.Int = { /* compiled code */ }
+  def foo2277(): scala.Int = { /* compiled code */ }
+  def foo2278(): scala.Int = { /* compiled code */ }
+  def foo2279(): scala.Int = { /* compiled code */ }
+  def foo2280(): scala.Int = { /* compiled code */ }
+  def foo2281(): scala.Int = { /* compiled code */ }
+  def foo2282(): scala.Int = { /* compiled code */ }
+  def foo2283(): scala.Int = { /* compiled code */ }
+  def foo2284(): scala.Int = { /* compiled code */ }
+  def foo2285(): scala.Int = { /* compiled code */ }
+  def foo2286(): scala.Int = { /* compiled code */ }
+  def foo2287(): scala.Int = { /* compiled code */ }
+  def foo2288(): scala.Int = { /* compiled code */ }
+  def foo2289(): scala.Int = { /* compiled code */ }
+  def foo2290(): scala.Int = { /* compiled code */ }
+  def foo2291(): scala.Int = { /* compiled code */ }
+  def foo2292(): scala.Int = { /* compiled code */ }
+  def foo2293(): scala.Int = { /* compiled code */ }
+  def foo2294(): scala.Int = { /* compiled code */ }
+  def foo2295(): scala.Int = { /* compiled code */ }
+  def foo2296(): scala.Int = { /* compiled code */ }
+  def foo2297(): scala.Int = { /* compiled code */ }
+  def foo2298(): scala.Int = { /* compiled code */ }
+  def foo2299(): scala.Int = { /* compiled code */ }
+  def foo2300(): scala.Int = { /* compiled code */ }
+  def foo2301(): scala.Int = { /* compiled code */ }
+  def foo2302(): scala.Int = { /* compiled code */ }
+  def foo2303(): scala.Int = { /* compiled code */ }
+  def foo2304(): scala.Int = { /* compiled code */ }
+  def foo2305(): scala.Int = { /* compiled code */ }
+  def foo2306(): scala.Int = { /* compiled code */ }
+  def foo2307(): scala.Int = { /* compiled code */ }
+  def foo2308(): scala.Int = { /* compiled code */ }
+  def foo2309(): scala.Int = { /* compiled code */ }
+  def foo2310(): scala.Int = { /* compiled code */ }
+  def foo2311(): scala.Int = { /* compiled code */ }
+  def foo2312(): scala.Int = { /* compiled code */ }
+  def foo2313(): scala.Int = { /* compiled code */ }
+  def foo2314(): scala.Int = { /* compiled code */ }
+  def foo2315(): scala.Int = { /* compiled code */ }
+  def foo2316(): scala.Int = { /* compiled code */ }
+  def foo2317(): scala.Int = { /* compiled code */ }
+  def foo2318(): scala.Int = { /* compiled code */ }
+  def foo2319(): scala.Int = { /* compiled code */ }
+  def foo2320(): scala.Int = { /* compiled code */ }
+  def foo2321(): scala.Int = { /* compiled code */ }
+  def foo2322(): scala.Int = { /* compiled code */ }
+  def foo2323(): scala.Int = { /* compiled code */ }
+  def foo2324(): scala.Int = { /* compiled code */ }
+  def foo2325(): scala.Int = { /* compiled code */ }
+  def foo2326(): scala.Int = { /* compiled code */ }
+  def foo2327(): scala.Int = { /* compiled code */ }
+  def foo2328(): scala.Int = { /* compiled code */ }
+  def foo2329(): scala.Int = { /* compiled code */ }
+  def foo2330(): scala.Int = { /* compiled code */ }
+  def foo2331(): scala.Int = { /* compiled code */ }
+  def foo2332(): scala.Int = { /* compiled code */ }
+  def foo2333(): scala.Int = { /* compiled code */ }
+  def foo2334(): scala.Int = { /* compiled code */ }
+  def foo2335(): scala.Int = { /* compiled code */ }
+  def foo2336(): scala.Int = { /* compiled code */ }
+  def foo2337(): scala.Int = { /* compiled code */ }
+  def foo2338(): scala.Int = { /* compiled code */ }
+  def foo2339(): scala.Int = { /* compiled code */ }
+  def foo2340(): scala.Int = { /* compiled code */ }
+  def foo2341(): scala.Int = { /* compiled code */ }
+  def foo2342(): scala.Int = { /* compiled code */ }
+  def foo2343(): scala.Int = { /* compiled code */ }
+  def foo2344(): scala.Int = { /* compiled code */ }
+  def foo2345(): scala.Int = { /* compiled code */ }
+  def foo2346(): scala.Int = { /* compiled code */ }
+  def foo2347(): scala.Int = { /* compiled code */ }
+  def foo2348(): scala.Int = { /* compiled code */ }
+  def foo2349(): scala.Int = { /* compiled code */ }
+  def foo2350(): scala.Int = { /* compiled code */ }
+  def foo2351(): scala.Int = { /* compiled code */ }
+  def foo2352(): scala.Int = { /* compiled code */ }
+  def foo2353(): scala.Int = { /* compiled code */ }
+  def foo2354(): scala.Int = { /* compiled code */ }
+  def foo2355(): scala.Int = { /* compiled code */ }
+  def foo2356(): scala.Int = { /* compiled code */ }
+  def foo2357(): scala.Int = { /* compiled code */ }
+  def foo2358(): scala.Int = { /* compiled code */ }
+  def foo2359(): scala.Int = { /* compiled code */ }
+  def foo2360(): scala.Int = { /* compiled code */ }
+  def foo2361(): scala.Int = { /* compiled code */ }
+  def foo2362(): scala.Int = { /* compiled code */ }
+  def foo2363(): scala.Int = { /* compiled code */ }
+  def foo2364(): scala.Int = { /* compiled code */ }
+  def foo2365(): scala.Int = { /* compiled code */ }
+  def foo2366(): scala.Int = { /* compiled code */ }
+  def foo2367(): scala.Int = { /* compiled code */ }
+  def foo2368(): scala.Int = { /* compiled code */ }
+  def foo2369(): scala.Int = { /* compiled code */ }
+  def foo2370(): scala.Int = { /* compiled code */ }
+  def foo2371(): scala.Int = { /* compiled code */ }
+  def foo2372(): scala.Int = { /* compiled code */ }
+  def foo2373(): scala.Int = { /* compiled code */ }
+  def foo2374(): scala.Int = { /* compiled code */ }
+  def foo2375(): scala.Int = { /* compiled code */ }
+  def foo2376(): scala.Int = { /* compiled code */ }
+  def foo2377(): scala.Int = { /* compiled code */ }
+  def foo2378(): scala.Int = { /* compiled code */ }
+  def foo2379(): scala.Int = { /* compiled code */ }
+  def foo2380(): scala.Int = { /* compiled code */ }
+  def foo2381(): scala.Int = { /* compiled code */ }
+  def foo2382(): scala.Int = { /* compiled code */ }
+  def foo2383(): scala.Int = { /* compiled code */ }
+  def foo2384(): scala.Int = { /* compiled code */ }
+  def foo2385(): scala.Int = { /* compiled code */ }
+  def foo2386(): scala.Int = { /* compiled code */ }
+  def foo2387(): scala.Int = { /* compiled code */ }
+  def foo2388(): scala.Int = { /* compiled code */ }
+  def foo2389(): scala.Int = { /* compiled code */ }
+  def foo2390(): scala.Int = { /* compiled code */ }
+  def foo2391(): scala.Int = { /* compiled code */ }
+  def foo2392(): scala.Int = { /* compiled code */ }
+  def foo2393(): scala.Int = { /* compiled code */ }
+  def foo2394(): scala.Int = { /* compiled code */ }
+  def foo2395(): scala.Int = { /* compiled code */ }
+  def foo2396(): scala.Int = { /* compiled code */ }
+  def foo2397(): scala.Int = { /* compiled code */ }
+  def foo2398(): scala.Int = { /* compiled code */ }
+  def foo2399(): scala.Int = { /* compiled code */ }
+  def foo2400(): scala.Int = { /* compiled code */ }
+  def foo2401(): scala.Int = { /* compiled code */ }
+  def foo2402(): scala.Int = { /* compiled code */ }
+  def foo2403(): scala.Int = { /* compiled code */ }
+  def foo2404(): scala.Int = { /* compiled code */ }
+  def foo2405(): scala.Int = { /* compiled code */ }
+  def foo2406(): scala.Int = { /* compiled code */ }
+  def foo2407(): scala.Int = { /* compiled code */ }
+  def foo2408(): scala.Int = { /* compiled code */ }
+  def foo2409(): scala.Int = { /* compiled code */ }
+  def foo2410(): scala.Int = { /* compiled code */ }
+  def foo2411(): scala.Int = { /* compiled code */ }
+  def foo2412(): scala.Int = { /* compiled code */ }
+  def foo2413(): scala.Int = { /* compiled code */ }
+  def foo2414(): scala.Int = { /* compiled code */ }
+  def foo2415(): scala.Int = { /* compiled code */ }
+  def foo2416(): scala.Int = { /* compiled code */ }
+  def foo2417(): scala.Int = { /* compiled code */ }
+  def foo2418(): scala.Int = { /* compiled code */ }
+  def foo2419(): scala.Int = { /* compiled code */ }
+  def foo2420(): scala.Int = { /* compiled code */ }
+  def foo2421(): scala.Int = { /* compiled code */ }
+  def foo2422(): scala.Int = { /* compiled code */ }
+  def foo2423(): scala.Int = { /* compiled code */ }
+  def foo2424(): scala.Int = { /* compiled code */ }
+  def foo2425(): scala.Int = { /* compiled code */ }
+  def foo2426(): scala.Int = { /* compiled code */ }
+  def foo2427(): scala.Int = { /* compiled code */ }
+  def foo2428(): scala.Int = { /* compiled code */ }
+  def foo2429(): scala.Int = { /* compiled code */ }
+  def foo2430(): scala.Int = { /* compiled code */ }
+  def foo2431(): scala.Int = { /* compiled code */ }
+  def foo2432(): scala.Int = { /* compiled code */ }
+  def foo2433(): scala.Int = { /* compiled code */ }
+  def foo2434(): scala.Int = { /* compiled code */ }
+  def foo2435(): scala.Int = { /* compiled code */ }
+  def foo2436(): scala.Int = { /* compiled code */ }
+  def foo2437(): scala.Int = { /* compiled code */ }
+  def foo2438(): scala.Int = { /* compiled code */ }
+  def foo2439(): scala.Int = { /* compiled code */ }
+  def foo2440(): scala.Int = { /* compiled code */ }
+  def foo2441(): scala.Int = { /* compiled code */ }
+  def foo2442(): scala.Int = { /* compiled code */ }
+  def foo2443(): scala.Int = { /* compiled code */ }
+  def foo2444(): scala.Int = { /* compiled code */ }
+  def foo2445(): scala.Int = { /* compiled code */ }
+  def foo2446(): scala.Int = { /* compiled code */ }
+  def foo2447(): scala.Int = { /* compiled code */ }
+  def foo2448(): scala.Int = { /* compiled code */ }
+  def foo2449(): scala.Int = { /* compiled code */ }
+  def foo2450(): scala.Int = { /* compiled code */ }
+  def foo2451(): scala.Int = { /* compiled code */ }
+  def foo2452(): scala.Int = { /* compiled code */ }
+  def foo2453(): scala.Int = { /* compiled code */ }
+  def foo2454(): scala.Int = { /* compiled code */ }
+  def foo2455(): scala.Int = { /* compiled code */ }
+  def foo2456(): scala.Int = { /* compiled code */ }
+  def foo2457(): scala.Int = { /* compiled code */ }
+  def foo2458(): scala.Int = { /* compiled code */ }
+  def foo2459(): scala.Int = { /* compiled code */ }
+  def foo2460(): scala.Int = { /* compiled code */ }
+  def foo2461(): scala.Int = { /* compiled code */ }
+  def foo2462(): scala.Int = { /* compiled code */ }
+  def foo2463(): scala.Int = { /* compiled code */ }
+  def foo2464(): scala.Int = { /* compiled code */ }
+  def foo2465(): scala.Int = { /* compiled code */ }
+  def foo2466(): scala.Int = { /* compiled code */ }
+  def foo2467(): scala.Int = { /* compiled code */ }
+  def foo2468(): scala.Int = { /* compiled code */ }
+  def foo2469(): scala.Int = { /* compiled code */ }
+  def foo2470(): scala.Int = { /* compiled code */ }
+  def foo2471(): scala.Int = { /* compiled code */ }
+  def foo2472(): scala.Int = { /* compiled code */ }
+  def foo2473(): scala.Int = { /* compiled code */ }
+  def foo2474(): scala.Int = { /* compiled code */ }
+  def foo2475(): scala.Int = { /* compiled code */ }
+  def foo2476(): scala.Int = { /* compiled code */ }
+  def foo2477(): scala.Int = { /* compiled code */ }
+  def foo2478(): scala.Int = { /* compiled code */ }
+  def foo2479(): scala.Int = { /* compiled code */ }
+  def foo2480(): scala.Int = { /* compiled code */ }
+  def foo2481(): scala.Int = { /* compiled code */ }
+  def foo2482(): scala.Int = { /* compiled code */ }
+  def foo2483(): scala.Int = { /* compiled code */ }
+  def foo2484(): scala.Int = { /* compiled code */ }
+  def foo2485(): scala.Int = { /* compiled code */ }
+  def foo2486(): scala.Int = { /* compiled code */ }
+  def foo2487(): scala.Int = { /* compiled code */ }
+  def foo2488(): scala.Int = { /* compiled code */ }
+  def foo2489(): scala.Int = { /* compiled code */ }
+  def foo2490(): scala.Int = { /* compiled code */ }
+  def foo2491(): scala.Int = { /* compiled code */ }
+  def foo2492(): scala.Int = { /* compiled code */ }
+  def foo2493(): scala.Int = { /* compiled code */ }
+  def foo2494(): scala.Int = { /* compiled code */ }
+  def foo2495(): scala.Int = { /* compiled code */ }
+  def foo2496(): scala.Int = { /* compiled code */ }
+  def foo2497(): scala.Int = { /* compiled code */ }
+  def foo2498(): scala.Int = { /* compiled code */ }
+  def foo2499(): scala.Int = { /* compiled code */ }
+  def foo2500(): scala.Int = { /* compiled code */ }
+  def foo2501(): scala.Int = { /* compiled code */ }
+  def foo2502(): scala.Int = { /* compiled code */ }
+  def foo2503(): scala.Int = { /* compiled code */ }
+  def foo2504(): scala.Int = { /* compiled code */ }
+  def foo2505(): scala.Int = { /* compiled code */ }
+  def foo2506(): scala.Int = { /* compiled code */ }
+  def foo2507(): scala.Int = { /* compiled code */ }
+  def foo2508(): scala.Int = { /* compiled code */ }
+  def foo2509(): scala.Int = { /* compiled code */ }
+  def foo2510(): scala.Int = { /* compiled code */ }
+  def foo2511(): scala.Int = { /* compiled code */ }
+  def foo2512(): scala.Int = { /* compiled code */ }
+  def foo2513(): scala.Int = { /* compiled code */ }
+  def foo2514(): scala.Int = { /* compiled code */ }
+  def foo2515(): scala.Int = { /* compiled code */ }
+  def foo2516(): scala.Int = { /* compiled code */ }
+  def foo2517(): scala.Int = { /* compiled code */ }
+  def foo2518(): scala.Int = { /* compiled code */ }
+  def foo2519(): scala.Int = { /* compiled code */ }
+  def foo2520(): scala.Int = { /* compiled code */ }
+  def foo2521(): scala.Int = { /* compiled code */ }
+  def foo2522(): scala.Int = { /* compiled code */ }
+  def foo2523(): scala.Int = { /* compiled code */ }
+  def foo2524(): scala.Int = { /* compiled code */ }
+  def foo2525(): scala.Int = { /* compiled code */ }
+  def foo2526(): scala.Int = { /* compiled code */ }
+  def foo2527(): scala.Int = { /* compiled code */ }
+  def foo2528(): scala.Int = { /* compiled code */ }
+  def foo2529(): scala.Int = { /* compiled code */ }
+  def foo2530(): scala.Int = { /* compiled code */ }
+  def foo2531(): scala.Int = { /* compiled code */ }
+  def foo2532(): scala.Int = { /* compiled code */ }
+  def foo2533(): scala.Int = { /* compiled code */ }
+  def foo2534(): scala.Int = { /* compiled code */ }
+  def foo2535(): scala.Int = { /* compiled code */ }
+  def foo2536(): scala.Int = { /* compiled code */ }
+  def foo2537(): scala.Int = { /* compiled code */ }
+  def foo2538(): scala.Int = { /* compiled code */ }
+  def foo2539(): scala.Int = { /* compiled code */ }
+  def foo2540(): scala.Int = { /* compiled code */ }
+  def foo2541(): scala.Int = { /* compiled code */ }
+  def foo2542(): scala.Int = { /* compiled code */ }
+  def foo2543(): scala.Int = { /* compiled code */ }
+  def foo2544(): scala.Int = { /* compiled code */ }
+  def foo2545(): scala.Int = { /* compiled code */ }
+  def foo2546(): scala.Int = { /* compiled code */ }
+  def foo2547(): scala.Int = { /* compiled code */ }
+  def foo2548(): scala.Int = { /* compiled code */ }
+  def foo2549(): scala.Int = { /* compiled code */ }
+  def foo2550(): scala.Int = { /* compiled code */ }
+  def foo2551(): scala.Int = { /* compiled code */ }
+  def foo2552(): scala.Int = { /* compiled code */ }
+  def foo2553(): scala.Int = { /* compiled code */ }
+  def foo2554(): scala.Int = { /* compiled code */ }
+  def foo2555(): scala.Int = { /* compiled code */ }
+  def foo2556(): scala.Int = { /* compiled code */ }
+  def foo2557(): scala.Int = { /* compiled code */ }
+  def foo2558(): scala.Int = { /* compiled code */ }
+  def foo2559(): scala.Int = { /* compiled code */ }
+  def foo2560(): scala.Int = { /* compiled code */ }
+  def foo2561(): scala.Int = { /* compiled code */ }
+  def foo2562(): scala.Int = { /* compiled code */ }
+  def foo2563(): scala.Int = { /* compiled code */ }
+  def foo2564(): scala.Int = { /* compiled code */ }
+  def foo2565(): scala.Int = { /* compiled code */ }
+  def foo2566(): scala.Int = { /* compiled code */ }
+  def foo2567(): scala.Int = { /* compiled code */ }
+  def foo2568(): scala.Int = { /* compiled code */ }
+  def foo2569(): scala.Int = { /* compiled code */ }
+  def foo2570(): scala.Int = { /* compiled code */ }
+  def foo2571(): scala.Int = { /* compiled code */ }
+  def foo2572(): scala.Int = { /* compiled code */ }
+  def foo2573(): scala.Int = { /* compiled code */ }
+  def foo2574(): scala.Int = { /* compiled code */ }
+  def foo2575(): scala.Int = { /* compiled code */ }
+  def foo2576(): scala.Int = { /* compiled code */ }
+  def foo2577(): scala.Int = { /* compiled code */ }
+  def foo2578(): scala.Int = { /* compiled code */ }
+  def foo2579(): scala.Int = { /* compiled code */ }
+  def foo2580(): scala.Int = { /* compiled code */ }
+  def foo2581(): scala.Int = { /* compiled code */ }
+  def foo2582(): scala.Int = { /* compiled code */ }
+  def foo2583(): scala.Int = { /* compiled code */ }
+  def foo2584(): scala.Int = { /* compiled code */ }
+  def foo2585(): scala.Int = { /* compiled code */ }
+  def foo2586(): scala.Int = { /* compiled code */ }
+  def foo2587(): scala.Int = { /* compiled code */ }
+  def foo2588(): scala.Int = { /* compiled code */ }
+  def foo2589(): scala.Int = { /* compiled code */ }
+  def foo2590(): scala.Int = { /* compiled code */ }
+  def foo2591(): scala.Int = { /* compiled code */ }
+  def foo2592(): scala.Int = { /* compiled code */ }
+  def foo2593(): scala.Int = { /* compiled code */ }
+  def foo2594(): scala.Int = { /* compiled code */ }
+  def foo2595(): scala.Int = { /* compiled code */ }
+  def foo2596(): scala.Int = { /* compiled code */ }
+  def foo2597(): scala.Int = { /* compiled code */ }
+  def foo2598(): scala.Int = { /* compiled code */ }
+  def foo2599(): scala.Int = { /* compiled code */ }
+  def foo2600(): scala.Int = { /* compiled code */ }
+  def foo2601(): scala.Int = { /* compiled code */ }
+  def foo2602(): scala.Int = { /* compiled code */ }
+  def foo2603(): scala.Int = { /* compiled code */ }
+  def foo2604(): scala.Int = { /* compiled code */ }
+  def foo2605(): scala.Int = { /* compiled code */ }
+  def foo2606(): scala.Int = { /* compiled code */ }
+  def foo2607(): scala.Int = { /* compiled code */ }
+  def foo2608(): scala.Int = { /* compiled code */ }
+  def foo2609(): scala.Int = { /* compiled code */ }
+  def foo2610(): scala.Int = { /* compiled code */ }
+  def foo2611(): scala.Int = { /* compiled code */ }
+  def foo2612(): scala.Int = { /* compiled code */ }
+  def foo2613(): scala.Int = { /* compiled code */ }
+  def foo2614(): scala.Int = { /* compiled code */ }
+  def foo2615(): scala.Int = { /* compiled code */ }
+  def foo2616(): scala.Int = { /* compiled code */ }
+  def foo2617(): scala.Int = { /* compiled code */ }
+  def foo2618(): scala.Int = { /* compiled code */ }
+  def foo2619(): scala.Int = { /* compiled code */ }
+  def foo2620(): scala.Int = { /* compiled code */ }
+  def foo2621(): scala.Int = { /* compiled code */ }
+  def foo2622(): scala.Int = { /* compiled code */ }
+  def foo2623(): scala.Int = { /* compiled code */ }
+  def foo2624(): scala.Int = { /* compiled code */ }
+  def foo2625(): scala.Int = { /* compiled code */ }
+  def foo2626(): scala.Int = { /* compiled code */ }
+  def foo2627(): scala.Int = { /* compiled code */ }
+  def foo2628(): scala.Int = { /* compiled code */ }
+  def foo2629(): scala.Int = { /* compiled code */ }
+  def foo2630(): scala.Int = { /* compiled code */ }
+  def foo2631(): scala.Int = { /* compiled code */ }
+  def foo2632(): scala.Int = { /* compiled code */ }
+  def foo2633(): scala.Int = { /* compiled code */ }
+  def foo2634(): scala.Int = { /* compiled code */ }
+  def foo2635(): scala.Int = { /* compiled code */ }
+  def foo2636(): scala.Int = { /* compiled code */ }
+  def foo2637(): scala.Int = { /* compiled code */ }
+  def foo2638(): scala.Int = { /* compiled code */ }
+  def foo2639(): scala.Int = { /* compiled code */ }
+  def foo2640(): scala.Int = { /* compiled code */ }
+  def foo2641(): scala.Int = { /* compiled code */ }
+  def foo2642(): scala.Int = { /* compiled code */ }
+  def foo2643(): scala.Int = { /* compiled code */ }
+  def foo2644(): scala.Int = { /* compiled code */ }
+  def foo2645(): scala.Int = { /* compiled code */ }
+  def foo2646(): scala.Int = { /* compiled code */ }
+  def foo2647(): scala.Int = { /* compiled code */ }
+  def foo2648(): scala.Int = { /* compiled code */ }
+  def foo2649(): scala.Int = { /* compiled code */ }
+  def foo2650(): scala.Int = { /* compiled code */ }
+  def foo2651(): scala.Int = { /* compiled code */ }
+  def foo2652(): scala.Int = { /* compiled code */ }
+  def foo2653(): scala.Int = { /* compiled code */ }
+  def foo2654(): scala.Int = { /* compiled code */ }
+  def foo2655(): scala.Int = { /* compiled code */ }
+  def foo2656(): scala.Int = { /* compiled code */ }
+  def foo2657(): scala.Int = { /* compiled code */ }
+  def foo2658(): scala.Int = { /* compiled code */ }
+  def foo2659(): scala.Int = { /* compiled code */ }
+  def foo2660(): scala.Int = { /* compiled code */ }
+  def foo2661(): scala.Int = { /* compiled code */ }
+  def foo2662(): scala.Int = { /* compiled code */ }
+  def foo2663(): scala.Int = { /* compiled code */ }
+  def foo2664(): scala.Int = { /* compiled code */ }
+  def foo2665(): scala.Int = { /* compiled code */ }
+  def foo2666(): scala.Int = { /* compiled code */ }
+  def foo2667(): scala.Int = { /* compiled code */ }
+  def foo2668(): scala.Int = { /* compiled code */ }
+  def foo2669(): scala.Int = { /* compiled code */ }
+  def foo2670(): scala.Int = { /* compiled code */ }
+  def foo2671(): scala.Int = { /* compiled code */ }
+  def foo2672(): scala.Int = { /* compiled code */ }
+  def foo2673(): scala.Int = { /* compiled code */ }
+  def foo2674(): scala.Int = { /* compiled code */ }
+  def foo2675(): scala.Int = { /* compiled code */ }
+  def foo2676(): scala.Int = { /* compiled code */ }
+  def foo2677(): scala.Int = { /* compiled code */ }
+  def foo2678(): scala.Int = { /* compiled code */ }
+  def foo2679(): scala.Int = { /* compiled code */ }
+  def foo2680(): scala.Int = { /* compiled code */ }
+  def foo2681(): scala.Int = { /* compiled code */ }
+  def foo2682(): scala.Int = { /* compiled code */ }
+  def foo2683(): scala.Int = { /* compiled code */ }
+  def foo2684(): scala.Int = { /* compiled code */ }
+  def foo2685(): scala.Int = { /* compiled code */ }
+  def foo2686(): scala.Int = { /* compiled code */ }
+  def foo2687(): scala.Int = { /* compiled code */ }
+  def foo2688(): scala.Int = { /* compiled code */ }
+  def foo2689(): scala.Int = { /* compiled code */ }
+  def foo2690(): scala.Int = { /* compiled code */ }
+  def foo2691(): scala.Int = { /* compiled code */ }
+  def foo2692(): scala.Int = { /* compiled code */ }
+  def foo2693(): scala.Int = { /* compiled code */ }
+  def foo2694(): scala.Int = { /* compiled code */ }
+  def foo2695(): scala.Int = { /* compiled code */ }
+  def foo2696(): scala.Int = { /* compiled code */ }
+  def foo2697(): scala.Int = { /* compiled code */ }
+  def foo2698(): scala.Int = { /* compiled code */ }
+  def foo2699(): scala.Int = { /* compiled code */ }
+  def foo2700(): scala.Int = { /* compiled code */ }
+  def foo2701(): scala.Int = { /* compiled code */ }
+  def foo2702(): scala.Int = { /* compiled code */ }
+  def foo2703(): scala.Int = { /* compiled code */ }
+  def foo2704(): scala.Int = { /* compiled code */ }
+  def foo2705(): scala.Int = { /* compiled code */ }
+  def foo2706(): scala.Int = { /* compiled code */ }
+  def foo2707(): scala.Int = { /* compiled code */ }
+  def foo2708(): scala.Int = { /* compiled code */ }
+  def foo2709(): scala.Int = { /* compiled code */ }
+  def foo2710(): scala.Int = { /* compiled code */ }
+  def foo2711(): scala.Int = { /* compiled code */ }
+  def foo2712(): scala.Int = { /* compiled code */ }
+  def foo2713(): scala.Int = { /* compiled code */ }
+  def foo2714(): scala.Int = { /* compiled code */ }
+  def foo2715(): scala.Int = { /* compiled code */ }
+  def foo2716(): scala.Int = { /* compiled code */ }
+  def foo2717(): scala.Int = { /* compiled code */ }
+  def foo2718(): scala.Int = { /* compiled code */ }
+  def foo2719(): scala.Int = { /* compiled code */ }
+  def foo2720(): scala.Int = { /* compiled code */ }
+  def foo2721(): scala.Int = { /* compiled code */ }
+  def foo2722(): scala.Int = { /* compiled code */ }
+  def foo2723(): scala.Int = { /* compiled code */ }
+  def foo2724(): scala.Int = { /* compiled code */ }
+  def foo2725(): scala.Int = { /* compiled code */ }
+  def foo2726(): scala.Int = { /* compiled code */ }
+  def foo2727(): scala.Int = { /* compiled code */ }
+  def foo2728(): scala.Int = { /* compiled code */ }
+  def foo2729(): scala.Int = { /* compiled code */ }
+  def foo2730(): scala.Int = { /* compiled code */ }
+  def foo2731(): scala.Int = { /* compiled code */ }
+  def foo2732(): scala.Int = { /* compiled code */ }
+  def foo2733(): scala.Int = { /* compiled code */ }
+  def foo2734(): scala.Int = { /* compiled code */ }
+  def foo2735(): scala.Int = { /* compiled code */ }
+  def foo2736(): scala.Int = { /* compiled code */ }
+  def foo2737(): scala.Int = { /* compiled code */ }
+  def foo2738(): scala.Int = { /* compiled code */ }
+  def foo2739(): scala.Int = { /* compiled code */ }
+  def foo2740(): scala.Int = { /* compiled code */ }
+  def foo2741(): scala.Int = { /* compiled code */ }
+  def foo2742(): scala.Int = { /* compiled code */ }
+  def foo2743(): scala.Int = { /* compiled code */ }
+  def foo2744(): scala.Int = { /* compiled code */ }
+  def foo2745(): scala.Int = { /* compiled code */ }
+  def foo2746(): scala.Int = { /* compiled code */ }
+  def foo2747(): scala.Int = { /* compiled code */ }
+  def foo2748(): scala.Int = { /* compiled code */ }
+  def foo2749(): scala.Int = { /* compiled code */ }
+  def foo2750(): scala.Int = { /* compiled code */ }
+  def foo2751(): scala.Int = { /* compiled code */ }
+  def foo2752(): scala.Int = { /* compiled code */ }
+  def foo2753(): scala.Int = { /* compiled code */ }
+  def foo2754(): scala.Int = { /* compiled code */ }
+  def foo2755(): scala.Int = { /* compiled code */ }
+  def foo2756(): scala.Int = { /* compiled code */ }
+  def foo2757(): scala.Int = { /* compiled code */ }
+  def foo2758(): scala.Int = { /* compiled code */ }
+  def foo2759(): scala.Int = { /* compiled code */ }
+  def foo2760(): scala.Int = { /* compiled code */ }
+  def foo2761(): scala.Int = { /* compiled code */ }
+  def foo2762(): scala.Int = { /* compiled code */ }
+  def foo2763(): scala.Int = { /* compiled code */ }
+  def foo2764(): scala.Int = { /* compiled code */ }
+  def foo2765(): scala.Int = { /* compiled code */ }
+  def foo2766(): scala.Int = { /* compiled code */ }
+  def foo2767(): scala.Int = { /* compiled code */ }
+  def foo2768(): scala.Int = { /* compiled code */ }
+  def foo2769(): scala.Int = { /* compiled code */ }
+  def foo2770(): scala.Int = { /* compiled code */ }
+  def foo2771(): scala.Int = { /* compiled code */ }
+  def foo2772(): scala.Int = { /* compiled code */ }
+  def foo2773(): scala.Int = { /* compiled code */ }
+  def foo2774(): scala.Int = { /* compiled code */ }
+  def foo2775(): scala.Int = { /* compiled code */ }
+  def foo2776(): scala.Int = { /* compiled code */ }
+  def foo2777(): scala.Int = { /* compiled code */ }
+  def foo2778(): scala.Int = { /* compiled code */ }
+  def foo2779(): scala.Int = { /* compiled code */ }
+  def foo2780(): scala.Int = { /* compiled code */ }
+  def foo2781(): scala.Int = { /* compiled code */ }
+  def foo2782(): scala.Int = { /* compiled code */ }
+  def foo2783(): scala.Int = { /* compiled code */ }
+  def foo2784(): scala.Int = { /* compiled code */ }
+  def foo2785(): scala.Int = { /* compiled code */ }
+  def foo2786(): scala.Int = { /* compiled code */ }
+  def foo2787(): scala.Int = { /* compiled code */ }
+  def foo2788(): scala.Int = { /* compiled code */ }
+  def foo2789(): scala.Int = { /* compiled code */ }
+  def foo2790(): scala.Int = { /* compiled code */ }
+  def foo2791(): scala.Int = { /* compiled code */ }
+  def foo2792(): scala.Int = { /* compiled code */ }
+  def foo2793(): scala.Int = { /* compiled code */ }
+  def foo2794(): scala.Int = { /* compiled code */ }
+  def foo2795(): scala.Int = { /* compiled code */ }
+  def foo2796(): scala.Int = { /* compiled code */ }
+  def foo2797(): scala.Int = { /* compiled code */ }
+  def foo2798(): scala.Int = { /* compiled code */ }
+  def foo2799(): scala.Int = { /* compiled code */ }
+  def foo2800(): scala.Int = { /* compiled code */ }
+  def foo2801(): scala.Int = { /* compiled code */ }
+  def foo2802(): scala.Int = { /* compiled code */ }
+  def foo2803(): scala.Int = { /* compiled code */ }
+  def foo2804(): scala.Int = { /* compiled code */ }
+  def foo2805(): scala.Int = { /* compiled code */ }
+  def foo2806(): scala.Int = { /* compiled code */ }
+  def foo2807(): scala.Int = { /* compiled code */ }
+  def foo2808(): scala.Int = { /* compiled code */ }
+  def foo2809(): scala.Int = { /* compiled code */ }
+  def foo2810(): scala.Int = { /* compiled code */ }
+  def foo2811(): scala.Int = { /* compiled code */ }
+  def foo2812(): scala.Int = { /* compiled code */ }
+  def foo2813(): scala.Int = { /* compiled code */ }
+  def foo2814(): scala.Int = { /* compiled code */ }
+  def foo2815(): scala.Int = { /* compiled code */ }
+  def foo2816(): scala.Int = { /* compiled code */ }
+  def foo2817(): scala.Int = { /* compiled code */ }
+  def foo2818(): scala.Int = { /* compiled code */ }
+  def foo2819(): scala.Int = { /* compiled code */ }
+  def foo2820(): scala.Int = { /* compiled code */ }
+  def foo2821(): scala.Int = { /* compiled code */ }
+  def foo2822(): scala.Int = { /* compiled code */ }
+  def foo2823(): scala.Int = { /* compiled code */ }
+  def foo2824(): scala.Int = { /* compiled code */ }
+  def foo2825(): scala.Int = { /* compiled code */ }
+  def foo2826(): scala.Int = { /* compiled code */ }
+  def foo2827(): scala.Int = { /* compiled code */ }
+  def foo2828(): scala.Int = { /* compiled code */ }
+  def foo2829(): scala.Int = { /* compiled code */ }
+  def foo2830(): scala.Int = { /* compiled code */ }
+  def foo2831(): scala.Int = { /* compiled code */ }
+  def foo2832(): scala.Int = { /* compiled code */ }
+  def foo2833(): scala.Int = { /* compiled code */ }
+  def foo2834(): scala.Int = { /* compiled code */ }
+  def foo2835(): scala.Int = { /* compiled code */ }
+  def foo2836(): scala.Int = { /* compiled code */ }
+  def foo2837(): scala.Int = { /* compiled code */ }
+  def foo2838(): scala.Int = { /* compiled code */ }
+  def foo2839(): scala.Int = { /* compiled code */ }
+  def foo2840(): scala.Int = { /* compiled code */ }
+  def foo2841(): scala.Int = { /* compiled code */ }
+  def foo2842(): scala.Int = { /* compiled code */ }
+  def foo2843(): scala.Int = { /* compiled code */ }
+  def foo2844(): scala.Int = { /* compiled code */ }
+  def foo2845(): scala.Int = { /* compiled code */ }
+  def foo2846(): scala.Int = { /* compiled code */ }
+  def foo2847(): scala.Int = { /* compiled code */ }
+  def foo2848(): scala.Int = { /* compiled code */ }
+  def foo2849(): scala.Int = { /* compiled code */ }
+  def foo2850(): scala.Int = { /* compiled code */ }
+  def foo2851(): scala.Int = { /* compiled code */ }
+  def foo2852(): scala.Int = { /* compiled code */ }
+  def foo2853(): scala.Int = { /* compiled code */ }
+  def foo2854(): scala.Int = { /* compiled code */ }
+  def foo2855(): scala.Int = { /* compiled code */ }
+  def foo2856(): scala.Int = { /* compiled code */ }
+  def foo2857(): scala.Int = { /* compiled code */ }
+  def foo2858(): scala.Int = { /* compiled code */ }
+  def foo2859(): scala.Int = { /* compiled code */ }
+  def foo2860(): scala.Int = { /* compiled code */ }
+  def foo2861(): scala.Int = { /* compiled code */ }
+  def foo2862(): scala.Int = { /* compiled code */ }
+  def foo2863(): scala.Int = { /* compiled code */ }
+  def foo2864(): scala.Int = { /* compiled code */ }
+  def foo2865(): scala.Int = { /* compiled code */ }
+  def foo2866(): scala.Int = { /* compiled code */ }
+  def foo2867(): scala.Int = { /* compiled code */ }
+  def foo2868(): scala.Int = { /* compiled code */ }
+  def foo2869(): scala.Int = { /* compiled code */ }
+  def foo2870(): scala.Int = { /* compiled code */ }
+  def foo2871(): scala.Int = { /* compiled code */ }
+  def foo2872(): scala.Int = { /* compiled code */ }
+  def foo2873(): scala.Int = { /* compiled code */ }
+  def foo2874(): scala.Int = { /* compiled code */ }
+  def foo2875(): scala.Int = { /* compiled code */ }
+  def foo2876(): scala.Int = { /* compiled code */ }
+  def foo2877(): scala.Int = { /* compiled code */ }
+  def foo2878(): scala.Int = { /* compiled code */ }
+  def foo2879(): scala.Int = { /* compiled code */ }
+  def foo2880(): scala.Int = { /* compiled code */ }
+  def foo2881(): scala.Int = { /* compiled code */ }
+  def foo2882(): scala.Int = { /* compiled code */ }
+  def foo2883(): scala.Int = { /* compiled code */ }
+  def foo2884(): scala.Int = { /* compiled code */ }
+  def foo2885(): scala.Int = { /* compiled code */ }
+  def foo2886(): scala.Int = { /* compiled code */ }
+  def foo2887(): scala.Int = { /* compiled code */ }
+  def foo2888(): scala.Int = { /* compiled code */ }
+  def foo2889(): scala.Int = { /* compiled code */ }
+  def foo2890(): scala.Int = { /* compiled code */ }
+  def foo2891(): scala.Int = { /* compiled code */ }
+  def foo2892(): scala.Int = { /* compiled code */ }
+  def foo2893(): scala.Int = { /* compiled code */ }
+  def foo2894(): scala.Int = { /* compiled code */ }
+  def foo2895(): scala.Int = { /* compiled code */ }
+  def foo2896(): scala.Int = { /* compiled code */ }
+  def foo2897(): scala.Int = { /* compiled code */ }
+  def foo2898(): scala.Int = { /* compiled code */ }
+  def foo2899(): scala.Int = { /* compiled code */ }
+  def foo2900(): scala.Int = { /* compiled code */ }
+  def foo2901(): scala.Int = { /* compiled code */ }
+  def foo2902(): scala.Int = { /* compiled code */ }
+  def foo2903(): scala.Int = { /* compiled code */ }
+  def foo2904(): scala.Int = { /* compiled code */ }
+  def foo2905(): scala.Int = { /* compiled code */ }
+  def foo2906(): scala.Int = { /* compiled code */ }
+  def foo2907(): scala.Int = { /* compiled code */ }
+  def foo2908(): scala.Int = { /* compiled code */ }
+  def foo2909(): scala.Int = { /* compiled code */ }
+  def foo2910(): scala.Int = { /* compiled code */ }
+  def foo2911(): scala.Int = { /* compiled code */ }
+  def foo2912(): scala.Int = { /* compiled code */ }
+  def foo2913(): scala.Int = { /* compiled code */ }
+  def foo2914(): scala.Int = { /* compiled code */ }
+  def foo2915(): scala.Int = { /* compiled code */ }
+  def foo2916(): scala.Int = { /* compiled code */ }
+  def foo2917(): scala.Int = { /* compiled code */ }
+  def foo2918(): scala.Int = { /* compiled code */ }
+  def foo2919(): scala.Int = { /* compiled code */ }
+  def foo2920(): scala.Int = { /* compiled code */ }
+  def foo2921(): scala.Int = { /* compiled code */ }
+  def foo2922(): scala.Int = { /* compiled code */ }
+  def foo2923(): scala.Int = { /* compiled code */ }
+  def foo2924(): scala.Int = { /* compiled code */ }
+  def foo2925(): scala.Int = { /* compiled code */ }
+  def foo2926(): scala.Int = { /* compiled code */ }
+  def foo2927(): scala.Int = { /* compiled code */ }
+  def foo2928(): scala.Int = { /* compiled code */ }
+  def foo2929(): scala.Int = { /* compiled code */ }
+  def foo2930(): scala.Int = { /* compiled code */ }
+  def foo2931(): scala.Int = { /* compiled code */ }
+  def foo2932(): scala.Int = { /* compiled code */ }
+  def foo2933(): scala.Int = { /* compiled code */ }
+  def foo2934(): scala.Int = { /* compiled code */ }
+  def foo2935(): scala.Int = { /* compiled code */ }
+  def foo2936(): scala.Int = { /* compiled code */ }
+  def foo2937(): scala.Int = { /* compiled code */ }
+  def foo2938(): scala.Int = { /* compiled code */ }
+  def foo2939(): scala.Int = { /* compiled code */ }
+  def foo2940(): scala.Int = { /* compiled code */ }
+  def foo2941(): scala.Int = { /* compiled code */ }
+  def foo2942(): scala.Int = { /* compiled code */ }
+  def foo2943(): scala.Int = { /* compiled code */ }
+  def foo2944(): scala.Int = { /* compiled code */ }
+  def foo2945(): scala.Int = { /* compiled code */ }
+  def foo2946(): scala.Int = { /* compiled code */ }
+  def foo2947(): scala.Int = { /* compiled code */ }
+  def foo2948(): scala.Int = { /* compiled code */ }
+  def foo2949(): scala.Int = { /* compiled code */ }
+  def foo2950(): scala.Int = { /* compiled code */ }
+  def foo2951(): scala.Int = { /* compiled code */ }
+  def foo2952(): scala.Int = { /* compiled code */ }
+  def foo2953(): scala.Int = { /* compiled code */ }
+  def foo2954(): scala.Int = { /* compiled code */ }
+  def foo2955(): scala.Int = { /* compiled code */ }
+  def foo2956(): scala.Int = { /* compiled code */ }
+  def foo2957(): scala.Int = { /* compiled code */ }
+  def foo2958(): scala.Int = { /* compiled code */ }
+  def foo2959(): scala.Int = { /* compiled code */ }
+  def foo2960(): scala.Int = { /* compiled code */ }
+  def foo2961(): scala.Int = { /* compiled code */ }
+  def foo2962(): scala.Int = { /* compiled code */ }
+  def foo2963(): scala.Int = { /* compiled code */ }
+  def foo2964(): scala.Int = { /* compiled code */ }
+  def foo2965(): scala.Int = { /* compiled code */ }
+  def foo2966(): scala.Int = { /* compiled code */ }
+  def foo2967(): scala.Int = { /* compiled code */ }
+  def foo2968(): scala.Int = { /* compiled code */ }
+  def foo2969(): scala.Int = { /* compiled code */ }
+  def foo2970(): scala.Int = { /* compiled code */ }
+  def foo2971(): scala.Int = { /* compiled code */ }
+  def foo2972(): scala.Int = { /* compiled code */ }
+  def foo2973(): scala.Int = { /* compiled code */ }
+  def foo2974(): scala.Int = { /* compiled code */ }
+  def foo2975(): scala.Int = { /* compiled code */ }
+  def foo2976(): scala.Int = { /* compiled code */ }
+  def foo2977(): scala.Int = { /* compiled code */ }
+  def foo2978(): scala.Int = { /* compiled code */ }
+  def foo2979(): scala.Int = { /* compiled code */ }
+  def foo2980(): scala.Int = { /* compiled code */ }
+  def foo2981(): scala.Int = { /* compiled code */ }
+  def foo2982(): scala.Int = { /* compiled code */ }
+  def foo2983(): scala.Int = { /* compiled code */ }
+  def foo2984(): scala.Int = { /* compiled code */ }
+  def foo2985(): scala.Int = { /* compiled code */ }
+  def foo2986(): scala.Int = { /* compiled code */ }
+  def foo2987(): scala.Int = { /* compiled code */ }
+  def foo2988(): scala.Int = { /* compiled code */ }
+  def foo2989(): scala.Int = { /* compiled code */ }
+  def foo2990(): scala.Int = { /* compiled code */ }
+  def foo2991(): scala.Int = { /* compiled code */ }
+  def foo2992(): scala.Int = { /* compiled code */ }
+  def foo2993(): scala.Int = { /* compiled code */ }
+  def foo2994(): scala.Int = { /* compiled code */ }
+  def foo2995(): scala.Int = { /* compiled code */ }
+  def foo2996(): scala.Int = { /* compiled code */ }
+  def foo2997(): scala.Int = { /* compiled code */ }
+  def foo2998(): scala.Int = { /* compiled code */ }
+  def foo2999(): scala.Int = { /* compiled code */ }
+  def foo3000(): scala.Int = { /* compiled code */ }
+  def foo3001(): scala.Int = { /* compiled code */ }
+  def foo3002(): scala.Int = { /* compiled code */ }
+  def foo3003(): scala.Int = { /* compiled code */ }
+  def foo3004(): scala.Int = { /* compiled code */ }
+  def foo3005(): scala.Int = { /* compiled code */ }
+  def foo3006(): scala.Int = { /* compiled code */ }
+  def foo3007(): scala.Int = { /* compiled code */ }
+  def foo3008(): scala.Int = { /* compiled code */ }
+  def foo3009(): scala.Int = { /* compiled code */ }
+  def foo3010(): scala.Int = { /* compiled code */ }
+  def foo3011(): scala.Int = { /* compiled code */ }
+  def foo3012(): scala.Int = { /* compiled code */ }
+  def foo3013(): scala.Int = { /* compiled code */ }
+  def foo3014(): scala.Int = { /* compiled code */ }
+  def foo3015(): scala.Int = { /* compiled code */ }
+  def foo3016(): scala.Int = { /* compiled code */ }
+  def foo3017(): scala.Int = { /* compiled code */ }
+  def foo3018(): scala.Int = { /* compiled code */ }
+  def foo3019(): scala.Int = { /* compiled code */ }
+  def foo3020(): scala.Int = { /* compiled code */ }
+  def foo3021(): scala.Int = { /* compiled code */ }
+  def foo3022(): scala.Int = { /* compiled code */ }
+  def foo3023(): scala.Int = { /* compiled code */ }
+  def foo3024(): scala.Int = { /* compiled code */ }
+  def foo3025(): scala.Int = { /* compiled code */ }
+  def foo3026(): scala.Int = { /* compiled code */ }
+  def foo3027(): scala.Int = { /* compiled code */ }
+  def foo3028(): scala.Int = { /* compiled code */ }
+  def foo3029(): scala.Int = { /* compiled code */ }
+  def foo3030(): scala.Int = { /* compiled code */ }
+  def foo3031(): scala.Int = { /* compiled code */ }
+  def foo3032(): scala.Int = { /* compiled code */ }
+  def foo3033(): scala.Int = { /* compiled code */ }
+  def foo3034(): scala.Int = { /* compiled code */ }
+  def foo3035(): scala.Int = { /* compiled code */ }
+  def foo3036(): scala.Int = { /* compiled code */ }
+  def foo3037(): scala.Int = { /* compiled code */ }
+  def foo3038(): scala.Int = { /* compiled code */ }
+  def foo3039(): scala.Int = { /* compiled code */ }
+  def foo3040(): scala.Int = { /* compiled code */ }
+  def foo3041(): scala.Int = { /* compiled code */ }
+  def foo3042(): scala.Int = { /* compiled code */ }
+  def foo3043(): scala.Int = { /* compiled code */ }
+  def foo3044(): scala.Int = { /* compiled code */ }
+  def foo3045(): scala.Int = { /* compiled code */ }
+  def foo3046(): scala.Int = { /* compiled code */ }
+  def foo3047(): scala.Int = { /* compiled code */ }
+  def foo3048(): scala.Int = { /* compiled code */ }
+  def foo3049(): scala.Int = { /* compiled code */ }
+  def foo3050(): scala.Int = { /* compiled code */ }
+  def foo3051(): scala.Int = { /* compiled code */ }
+  def foo3052(): scala.Int = { /* compiled code */ }
+  def foo3053(): scala.Int = { /* compiled code */ }
+  def foo3054(): scala.Int = { /* compiled code */ }
+  def foo3055(): scala.Int = { /* compiled code */ }
+  def foo3056(): scala.Int = { /* compiled code */ }
+  def foo3057(): scala.Int = { /* compiled code */ }
+  def foo3058(): scala.Int = { /* compiled code */ }
+  def foo3059(): scala.Int = { /* compiled code */ }
+  def foo3060(): scala.Int = { /* compiled code */ }
+  def foo3061(): scala.Int = { /* compiled code */ }
+  def foo3062(): scala.Int = { /* compiled code */ }
+  def foo3063(): scala.Int = { /* compiled code */ }
+  def foo3064(): scala.Int = { /* compiled code */ }
+  def foo3065(): scala.Int = { /* compiled code */ }
+  def foo3066(): scala.Int = { /* compiled code */ }
+  def foo3067(): scala.Int = { /* compiled code */ }
+  def foo3068(): scala.Int = { /* compiled code */ }
+  def foo3069(): scala.Int = { /* compiled code */ }
+  def foo3070(): scala.Int = { /* compiled code */ }
+  def foo3071(): scala.Int = { /* compiled code */ }
+  def foo3072(): scala.Int = { /* compiled code */ }
+  def foo3073(): scala.Int = { /* compiled code */ }
+  def foo3074(): scala.Int = { /* compiled code */ }
+  def foo3075(): scala.Int = { /* compiled code */ }
+  def foo3076(): scala.Int = { /* compiled code */ }
+  def foo3077(): scala.Int = { /* compiled code */ }
+  def foo3078(): scala.Int = { /* compiled code */ }
+  def foo3079(): scala.Int = { /* compiled code */ }
+  def foo3080(): scala.Int = { /* compiled code */ }
+  def foo3081(): scala.Int = { /* compiled code */ }
+  def foo3082(): scala.Int = { /* compiled code */ }
+  def foo3083(): scala.Int = { /* compiled code */ }
+  def foo3084(): scala.Int = { /* compiled code */ }
+  def foo3085(): scala.Int = { /* compiled code */ }
+  def foo3086(): scala.Int = { /* compiled code */ }
+  def foo3087(): scala.Int = { /* compiled code */ }
+  def foo3088(): scala.Int = { /* compiled code */ }
+  def foo3089(): scala.Int = { /* compiled code */ }
+  def foo3090(): scala.Int = { /* compiled code */ }
+  def foo3091(): scala.Int = { /* compiled code */ }
+  def foo3092(): scala.Int = { /* compiled code */ }
+  def foo3093(): scala.Int = { /* compiled code */ }
+  def foo3094(): scala.Int = { /* compiled code */ }
+  def foo3095(): scala.Int = { /* compiled code */ }
+  def foo3096(): scala.Int = { /* compiled code */ }
+  def foo3097(): scala.Int = { /* compiled code */ }
+  def foo3098(): scala.Int = { /* compiled code */ }
+  def foo3099(): scala.Int = { /* compiled code */ }
+  def foo3100(): scala.Int = { /* compiled code */ }
+  def foo3101(): scala.Int = { /* compiled code */ }
+  def foo3102(): scala.Int = { /* compiled code */ }
+  def foo3103(): scala.Int = { /* compiled code */ }
+  def foo3104(): scala.Int = { /* compiled code */ }
+  def foo3105(): scala.Int = { /* compiled code */ }
+  def foo3106(): scala.Int = { /* compiled code */ }
+  def foo3107(): scala.Int = { /* compiled code */ }
+  def foo3108(): scala.Int = { /* compiled code */ }
+  def foo3109(): scala.Int = { /* compiled code */ }
+  def foo3110(): scala.Int = { /* compiled code */ }
+  def foo3111(): scala.Int = { /* compiled code */ }
+  def foo3112(): scala.Int = { /* compiled code */ }
+  def foo3113(): scala.Int = { /* compiled code */ }
+  def foo3114(): scala.Int = { /* compiled code */ }
+  def foo3115(): scala.Int = { /* compiled code */ }
+  def foo3116(): scala.Int = { /* compiled code */ }
+  def foo3117(): scala.Int = { /* compiled code */ }
+  def foo3118(): scala.Int = { /* compiled code */ }
+  def foo3119(): scala.Int = { /* compiled code */ }
+  def foo3120(): scala.Int = { /* compiled code */ }
+  def foo3121(): scala.Int = { /* compiled code */ }
+  def foo3122(): scala.Int = { /* compiled code */ }
+  def foo3123(): scala.Int = { /* compiled code */ }
+  def foo3124(): scala.Int = { /* compiled code */ }
+  def foo3125(): scala.Int = { /* compiled code */ }
+  def foo3126(): scala.Int = { /* compiled code */ }
+  def foo3127(): scala.Int = { /* compiled code */ }
+  def foo3128(): scala.Int = { /* compiled code */ }
+  def foo3129(): scala.Int = { /* compiled code */ }
+  def foo3130(): scala.Int = { /* compiled code */ }
+  def foo3131(): scala.Int = { /* compiled code */ }
+  def foo3132(): scala.Int = { /* compiled code */ }
+  def foo3133(): scala.Int = { /* compiled code */ }
+  def foo3134(): scala.Int = { /* compiled code */ }
+  def foo3135(): scala.Int = { /* compiled code */ }
+  def foo3136(): scala.Int = { /* compiled code */ }
+  def foo3137(): scala.Int = { /* compiled code */ }
+  def foo3138(): scala.Int = { /* compiled code */ }
+  def foo3139(): scala.Int = { /* compiled code */ }
+  def foo3140(): scala.Int = { /* compiled code */ }
+  def foo3141(): scala.Int = { /* compiled code */ }
+  def foo3142(): scala.Int = { /* compiled code */ }
+  def foo3143(): scala.Int = { /* compiled code */ }
+  def foo3144(): scala.Int = { /* compiled code */ }
+  def foo3145(): scala.Int = { /* compiled code */ }
+  def foo3146(): scala.Int = { /* compiled code */ }
+  def foo3147(): scala.Int = { /* compiled code */ }
+  def foo3148(): scala.Int = { /* compiled code */ }
+  def foo3149(): scala.Int = { /* compiled code */ }
+  def foo3150(): scala.Int = { /* compiled code */ }
+  def foo3151(): scala.Int = { /* compiled code */ }
+  def foo3152(): scala.Int = { /* compiled code */ }
+  def foo3153(): scala.Int = { /* compiled code */ }
+  def foo3154(): scala.Int = { /* compiled code */ }
+  def foo3155(): scala.Int = { /* compiled code */ }
+  def foo3156(): scala.Int = { /* compiled code */ }
+  def foo3157(): scala.Int = { /* compiled code */ }
+  def foo3158(): scala.Int = { /* compiled code */ }
+  def foo3159(): scala.Int = { /* compiled code */ }
+  def foo3160(): scala.Int = { /* compiled code */ }
+  def foo3161(): scala.Int = { /* compiled code */ }
+  def foo3162(): scala.Int = { /* compiled code */ }
+  def foo3163(): scala.Int = { /* compiled code */ }
+  def foo3164(): scala.Int = { /* compiled code */ }
+  def foo3165(): scala.Int = { /* compiled code */ }
+  def foo3166(): scala.Int = { /* compiled code */ }
+  def foo3167(): scala.Int = { /* compiled code */ }
+  def foo3168(): scala.Int = { /* compiled code */ }
+  def foo3169(): scala.Int = { /* compiled code */ }
+  def foo3170(): scala.Int = { /* compiled code */ }
+  def foo3171(): scala.Int = { /* compiled code */ }
+  def foo3172(): scala.Int = { /* compiled code */ }
+  def foo3173(): scala.Int = { /* compiled code */ }
+  def foo3174(): scala.Int = { /* compiled code */ }
+  def foo3175(): scala.Int = { /* compiled code */ }
+  def foo3176(): scala.Int = { /* compiled code */ }
+  def foo3177(): scala.Int = { /* compiled code */ }
+  def foo3178(): scala.Int = { /* compiled code */ }
+  def foo3179(): scala.Int = { /* compiled code */ }
+  def foo3180(): scala.Int = { /* compiled code */ }
+  def foo3181(): scala.Int = { /* compiled code */ }
+  def foo3182(): scala.Int = { /* compiled code */ }
+  def foo3183(): scala.Int = { /* compiled code */ }
+  def foo3184(): scala.Int = { /* compiled code */ }
+  def foo3185(): scala.Int = { /* compiled code */ }
+  def foo3186(): scala.Int = { /* compiled code */ }
+  def foo3187(): scala.Int = { /* compiled code */ }
+  def foo3188(): scala.Int = { /* compiled code */ }
+  def foo3189(): scala.Int = { /* compiled code */ }
+  def foo3190(): scala.Int = { /* compiled code */ }
+  def foo3191(): scala.Int = { /* compiled code */ }
+  def foo3192(): scala.Int = { /* compiled code */ }
+  def foo3193(): scala.Int = { /* compiled code */ }
+  def foo3194(): scala.Int = { /* compiled code */ }
+  def foo3195(): scala.Int = { /* compiled code */ }
+  def foo3196(): scala.Int = { /* compiled code */ }
+  def foo3197(): scala.Int = { /* compiled code */ }
+  def foo3198(): scala.Int = { /* compiled code */ }
+  def foo3199(): scala.Int = { /* compiled code */ }
+  def foo3200(): scala.Int = { /* compiled code */ }
+  def foo3201(): scala.Int = { /* compiled code */ }
+  def foo3202(): scala.Int = { /* compiled code */ }
+  def foo3203(): scala.Int = { /* compiled code */ }
+  def foo3204(): scala.Int = { /* compiled code */ }
+  def foo3205(): scala.Int = { /* compiled code */ }
+  def foo3206(): scala.Int = { /* compiled code */ }
+  def foo3207(): scala.Int = { /* compiled code */ }
+  def foo3208(): scala.Int = { /* compiled code */ }
+  def foo3209(): scala.Int = { /* compiled code */ }
+  def foo3210(): scala.Int = { /* compiled code */ }
+  def foo3211(): scala.Int = { /* compiled code */ }
+  def foo3212(): scala.Int = { /* compiled code */ }
+  def foo3213(): scala.Int = { /* compiled code */ }
+  def foo3214(): scala.Int = { /* compiled code */ }
+  def foo3215(): scala.Int = { /* compiled code */ }
+  def foo3216(): scala.Int = { /* compiled code */ }
+  def foo3217(): scala.Int = { /* compiled code */ }
+  def foo3218(): scala.Int = { /* compiled code */ }
+  def foo3219(): scala.Int = { /* compiled code */ }
+  def foo3220(): scala.Int = { /* compiled code */ }
+  def foo3221(): scala.Int = { /* compiled code */ }
+  def foo3222(): scala.Int = { /* compiled code */ }
+  def foo3223(): scala.Int = { /* compiled code */ }
+  def foo3224(): scala.Int = { /* compiled code */ }
+  def foo3225(): scala.Int = { /* compiled code */ }
+  def foo3226(): scala.Int = { /* compiled code */ }
+  def foo3227(): scala.Int = { /* compiled code */ }
+  def foo3228(): scala.Int = { /* compiled code */ }
+  def foo3229(): scala.Int = { /* compiled code */ }
+  def foo3230(): scala.Int = { /* compiled code */ }
+  def foo3231(): scala.Int = { /* compiled code */ }
+  def foo3232(): scala.Int = { /* compiled code */ }
+  def foo3233(): scala.Int = { /* compiled code */ }
+  def foo3234(): scala.Int = { /* compiled code */ }
+  def foo3235(): scala.Int = { /* compiled code */ }
+  def foo3236(): scala.Int = { /* compiled code */ }
+  def foo3237(): scala.Int = { /* compiled code */ }
+  def foo3238(): scala.Int = { /* compiled code */ }
+  def foo3239(): scala.Int = { /* compiled code */ }
+  def foo3240(): scala.Int = { /* compiled code */ }
+  def foo3241(): scala.Int = { /* compiled code */ }
+  def foo3242(): scala.Int = { /* compiled code */ }
+  def foo3243(): scala.Int = { /* compiled code */ }
+  def foo3244(): scala.Int = { /* compiled code */ }
+  def foo3245(): scala.Int = { /* compiled code */ }
+  def foo3246(): scala.Int = { /* compiled code */ }
+  def foo3247(): scala.Int = { /* compiled code */ }
+  def foo3248(): scala.Int = { /* compiled code */ }
+  def foo3249(): scala.Int = { /* compiled code */ }
+  def foo3250(): scala.Int = { /* compiled code */ }
+  def foo3251(): scala.Int = { /* compiled code */ }
+  def foo3252(): scala.Int = { /* compiled code */ }
+  def foo3253(): scala.Int = { /* compiled code */ }
+  def foo3254(): scala.Int = { /* compiled code */ }
+  def foo3255(): scala.Int = { /* compiled code */ }
+  def foo3256(): scala.Int = { /* compiled code */ }
+  def foo3257(): scala.Int = { /* compiled code */ }
+  def foo3258(): scala.Int = { /* compiled code */ }
+  def foo3259(): scala.Int = { /* compiled code */ }
+  def foo3260(): scala.Int = { /* compiled code */ }
+  def foo3261(): scala.Int = { /* compiled code */ }
+  def foo3262(): scala.Int = { /* compiled code */ }
+  def foo3263(): scala.Int = { /* compiled code */ }
+  def foo3264(): scala.Int = { /* compiled code */ }
+  def foo3265(): scala.Int = { /* compiled code */ }
+  def foo3266(): scala.Int = { /* compiled code */ }
+  def foo3267(): scala.Int = { /* compiled code */ }
+  def foo3268(): scala.Int = { /* compiled code */ }
+  def foo3269(): scala.Int = { /* compiled code */ }
+  def foo3270(): scala.Int = { /* compiled code */ }
+  def foo3271(): scala.Int = { /* compiled code */ }
+  def foo3272(): scala.Int = { /* compiled code */ }
+  def foo3273(): scala.Int = { /* compiled code */ }
+  def foo3274(): scala.Int = { /* compiled code */ }
+  def foo3275(): scala.Int = { /* compiled code */ }
+  def foo3276(): scala.Int = { /* compiled code */ }
+  def foo3277(): scala.Int = { /* compiled code */ }
+  def foo3278(): scala.Int = { /* compiled code */ }
+  def foo3279(): scala.Int = { /* compiled code */ }
+  def foo3280(): scala.Int = { /* compiled code */ }
+  def foo3281(): scala.Int = { /* compiled code */ }
+  def foo3282(): scala.Int = { /* compiled code */ }
+  def foo3283(): scala.Int = { /* compiled code */ }
+  def foo3284(): scala.Int = { /* compiled code */ }
+  def foo3285(): scala.Int = { /* compiled code */ }
+  def foo3286(): scala.Int = { /* compiled code */ }
+  def foo3287(): scala.Int = { /* compiled code */ }
+  def foo3288(): scala.Int = { /* compiled code */ }
+  def foo3289(): scala.Int = { /* compiled code */ }
+  def foo3290(): scala.Int = { /* compiled code */ }
+  def foo3291(): scala.Int = { /* compiled code */ }
+  def foo3292(): scala.Int = { /* compiled code */ }
+  def foo3293(): scala.Int = { /* compiled code */ }
+  def foo3294(): scala.Int = { /* compiled code */ }
+  def foo3295(): scala.Int = { /* compiled code */ }
+  def foo3296(): scala.Int = { /* compiled code */ }
+  def foo3297(): scala.Int = { /* compiled code */ }
+  def foo3298(): scala.Int = { /* compiled code */ }
+  def foo3299(): scala.Int = { /* compiled code */ }
+  def foo3300(): scala.Int = { /* compiled code */ }
+  def foo3301(): scala.Int = { /* compiled code */ }
+  def foo3302(): scala.Int = { /* compiled code */ }
+  def foo3303(): scala.Int = { /* compiled code */ }
+  def foo3304(): scala.Int = { /* compiled code */ }
+  def foo3305(): scala.Int = { /* compiled code */ }
+  def foo3306(): scala.Int = { /* compiled code */ }
+  def foo3307(): scala.Int = { /* compiled code */ }
+  def foo3308(): scala.Int = { /* compiled code */ }
+  def foo3309(): scala.Int = { /* compiled code */ }
+  def foo3310(): scala.Int = { /* compiled code */ }
+  def foo3311(): scala.Int = { /* compiled code */ }
+  def foo3312(): scala.Int = { /* compiled code */ }
+  def foo3313(): scala.Int = { /* compiled code */ }
+  def foo3314(): scala.Int = { /* compiled code */ }
+  def foo3315(): scala.Int = { /* compiled code */ }
+  def foo3316(): scala.Int = { /* compiled code */ }
+  def foo3317(): scala.Int = { /* compiled code */ }
+  def foo3318(): scala.Int = { /* compiled code */ }
+  def foo3319(): scala.Int = { /* compiled code */ }
+  def foo3320(): scala.Int = { /* compiled code */ }
+  def foo3321(): scala.Int = { /* compiled code */ }
+  def foo3322(): scala.Int = { /* compiled code */ }
+  def foo3323(): scala.Int = { /* compiled code */ }
+  def foo3324(): scala.Int = { /* compiled code */ }
+  def foo3325(): scala.Int = { /* compiled code */ }
+  def foo3326(): scala.Int = { /* compiled code */ }
+  def foo3327(): scala.Int = { /* compiled code */ }
+  def foo3328(): scala.Int = { /* compiled code */ }
+  def foo3329(): scala.Int = { /* compiled code */ }
+  def foo3330(): scala.Int = { /* compiled code */ }
+  def foo3331(): scala.Int = { /* compiled code */ }
+  def foo3332(): scala.Int = { /* compiled code */ }
+  def foo3333(): scala.Int = { /* compiled code */ }
+  def foo3334(): scala.Int = { /* compiled code */ }
+  def foo3335(): scala.Int = { /* compiled code */ }
+  def foo3336(): scala.Int = { /* compiled code */ }
+  def foo3337(): scala.Int = { /* compiled code */ }
+  def foo3338(): scala.Int = { /* compiled code */ }
+  def foo3339(): scala.Int = { /* compiled code */ }
+  def foo3340(): scala.Int = { /* compiled code */ }
+  def foo3341(): scala.Int = { /* compiled code */ }
+  def foo3342(): scala.Int = { /* compiled code */ }
+  def foo3343(): scala.Int = { /* compiled code */ }
+  def foo3344(): scala.Int = { /* compiled code */ }
+  def foo3345(): scala.Int = { /* compiled code */ }
+  def foo3346(): scala.Int = { /* compiled code */ }
+  def foo3347(): scala.Int = { /* compiled code */ }
+  def foo3348(): scala.Int = { /* compiled code */ }
+  def foo3349(): scala.Int = { /* compiled code */ }
+  def foo3350(): scala.Int = { /* compiled code */ }
+  def foo3351(): scala.Int = { /* compiled code */ }
+  def foo3352(): scala.Int = { /* compiled code */ }
+  def foo3353(): scala.Int = { /* compiled code */ }
+  def foo3354(): scala.Int = { /* compiled code */ }
+  def foo3355(): scala.Int = { /* compiled code */ }
+  def foo3356(): scala.Int = { /* compiled code */ }
+  def foo3357(): scala.Int = { /* compiled code */ }
+  def foo3358(): scala.Int = { /* compiled code */ }
+  def foo3359(): scala.Int = { /* compiled code */ }
+  def foo3360(): scala.Int = { /* compiled code */ }
+  def foo3361(): scala.Int = { /* compiled code */ }
+  def foo3362(): scala.Int = { /* compiled code */ }
+  def foo3363(): scala.Int = { /* compiled code */ }
+  def foo3364(): scala.Int = { /* compiled code */ }
+  def foo3365(): scala.Int = { /* compiled code */ }
+  def foo3366(): scala.Int = { /* compiled code */ }
+  def foo3367(): scala.Int = { /* compiled code */ }
+  def foo3368(): scala.Int = { /* compiled code */ }
+  def foo3369(): scala.Int = { /* compiled code */ }
+  def foo3370(): scala.Int = { /* compiled code */ }
+  def foo3371(): scala.Int = { /* compiled code */ }
+  def foo3372(): scala.Int = { /* compiled code */ }
+  def foo3373(): scala.Int = { /* compiled code */ }
+  def foo3374(): scala.Int = { /* compiled code */ }
+  def foo3375(): scala.Int = { /* compiled code */ }
+  def foo3376(): scala.Int = { /* compiled code */ }
+  def foo3377(): scala.Int = { /* compiled code */ }
+  def foo3378(): scala.Int = { /* compiled code */ }
+  def foo3379(): scala.Int = { /* compiled code */ }
+  def foo3380(): scala.Int = { /* compiled code */ }
+  def foo3381(): scala.Int = { /* compiled code */ }
+  def foo3382(): scala.Int = { /* compiled code */ }
+  def foo3383(): scala.Int = { /* compiled code */ }
+  def foo3384(): scala.Int = { /* compiled code */ }
+  def foo3385(): scala.Int = { /* compiled code */ }
+  def foo3386(): scala.Int = { /* compiled code */ }
+  def foo3387(): scala.Int = { /* compiled code */ }
+  def foo3388(): scala.Int = { /* compiled code */ }
+  def foo3389(): scala.Int = { /* compiled code */ }
+  def foo3390(): scala.Int = { /* compiled code */ }
+  def foo3391(): scala.Int = { /* compiled code */ }
+  def foo3392(): scala.Int = { /* compiled code */ }
+  def foo3393(): scala.Int = { /* compiled code */ }
+  def foo3394(): scala.Int = { /* compiled code */ }
+  def foo3395(): scala.Int = { /* compiled code */ }
+  def foo3396(): scala.Int = { /* compiled code */ }
+  def foo3397(): scala.Int = { /* compiled code */ }
+  def foo3398(): scala.Int = { /* compiled code */ }
+  def foo3399(): scala.Int = { /* compiled code */ }
+  def foo3400(): scala.Int = { /* compiled code */ }
+  def foo3401(): scala.Int = { /* compiled code */ }
+  def foo3402(): scala.Int = { /* compiled code */ }
+  def foo3403(): scala.Int = { /* compiled code */ }
+  def foo3404(): scala.Int = { /* compiled code */ }
+  def foo3405(): scala.Int = { /* compiled code */ }
+  def foo3406(): scala.Int = { /* compiled code */ }
+  def foo3407(): scala.Int = { /* compiled code */ }
+  def foo3408(): scala.Int = { /* compiled code */ }
+  def foo3409(): scala.Int = { /* compiled code */ }
+  def foo3410(): scala.Int = { /* compiled code */ }
+  def foo3411(): scala.Int = { /* compiled code */ }
+  def foo3412(): scala.Int = { /* compiled code */ }
+  def foo3413(): scala.Int = { /* compiled code */ }
+  def foo3414(): scala.Int = { /* compiled code */ }
+  def foo3415(): scala.Int = { /* compiled code */ }
+  def foo3416(): scala.Int = { /* compiled code */ }
+  def foo3417(): scala.Int = { /* compiled code */ }
+  def foo3418(): scala.Int = { /* compiled code */ }
+  def foo3419(): scala.Int = { /* compiled code */ }
+  def foo3420(): scala.Int = { /* compiled code */ }
+  def foo3421(): scala.Int = { /* compiled code */ }
+  def foo3422(): scala.Int = { /* compiled code */ }
+  def foo3423(): scala.Int = { /* compiled code */ }
+  def foo3424(): scala.Int = { /* compiled code */ }
+  def foo3425(): scala.Int = { /* compiled code */ }
+  def foo3426(): scala.Int = { /* compiled code */ }
+  def foo3427(): scala.Int = { /* compiled code */ }
+  def foo3428(): scala.Int = { /* compiled code */ }
+  def foo3429(): scala.Int = { /* compiled code */ }
+  def foo3430(): scala.Int = { /* compiled code */ }
+  def foo3431(): scala.Int = { /* compiled code */ }
+  def foo3432(): scala.Int = { /* compiled code */ }
+  def foo3433(): scala.Int = { /* compiled code */ }
+  def foo3434(): scala.Int = { /* compiled code */ }
+  def foo3435(): scala.Int = { /* compiled code */ }
+  def foo3436(): scala.Int = { /* compiled code */ }
+  def foo3437(): scala.Int = { /* compiled code */ }
+  def foo3438(): scala.Int = { /* compiled code */ }
+  def foo3439(): scala.Int = { /* compiled code */ }
+  def foo3440(): scala.Int = { /* compiled code */ }
+  def foo3441(): scala.Int = { /* compiled code */ }
+  def foo3442(): scala.Int = { /* compiled code */ }
+  def foo3443(): scala.Int = { /* compiled code */ }
+  def foo3444(): scala.Int = { /* compiled code */ }
+  def foo3445(): scala.Int = { /* compiled code */ }
+  def foo3446(): scala.Int = { /* compiled code */ }
+  def foo3447(): scala.Int = { /* compiled code */ }
+  def foo3448(): scala.Int = { /* compiled code */ }
+  def foo3449(): scala.Int = { /* compiled code */ }
+  def foo3450(): scala.Int = { /* compiled code */ }
+  def foo3451(): scala.Int = { /* compiled code */ }
+  def foo3452(): scala.Int = { /* compiled code */ }
+  def foo3453(): scala.Int = { /* compiled code */ }
+  def foo3454(): scala.Int = { /* compiled code */ }
+  def foo3455(): scala.Int = { /* compiled code */ }
+  def foo3456(): scala.Int = { /* compiled code */ }
+  def foo3457(): scala.Int = { /* compiled code */ }
+  def foo3458(): scala.Int = { /* compiled code */ }
+  def foo3459(): scala.Int = { /* compiled code */ }
+  def foo3460(): scala.Int = { /* compiled code */ }
+  def foo3461(): scala.Int = { /* compiled code */ }
+  def foo3462(): scala.Int = { /* compiled code */ }
+  def foo3463(): scala.Int = { /* compiled code */ }
+  def foo3464(): scala.Int = { /* compiled code */ }
+  def foo3465(): scala.Int = { /* compiled code */ }
+  def foo3466(): scala.Int = { /* compiled code */ }
+  def foo3467(): scala.Int = { /* compiled code */ }
+  def foo3468(): scala.Int = { /* compiled code */ }
+  def foo3469(): scala.Int = { /* compiled code */ }
+  def foo3470(): scala.Int = { /* compiled code */ }
+  def foo3471(): scala.Int = { /* compiled code */ }
+  def foo3472(): scala.Int = { /* compiled code */ }
+  def foo3473(): scala.Int = { /* compiled code */ }
+  def foo3474(): scala.Int = { /* compiled code */ }
+  def foo3475(): scala.Int = { /* compiled code */ }
+  def foo3476(): scala.Int = { /* compiled code */ }
+  def foo3477(): scala.Int = { /* compiled code */ }
+  def foo3478(): scala.Int = { /* compiled code */ }
+  def foo3479(): scala.Int = { /* compiled code */ }
+  def foo3480(): scala.Int = { /* compiled code */ }
+  def foo3481(): scala.Int = { /* compiled code */ }
+  def foo3482(): scala.Int = { /* compiled code */ }
+  def foo3483(): scala.Int = { /* compiled code */ }
+  def foo3484(): scala.Int = { /* compiled code */ }
+  def foo3485(): scala.Int = { /* compiled code */ }
+  def foo3486(): scala.Int = { /* compiled code */ }
+  def foo3487(): scala.Int = { /* compiled code */ }
+  def foo3488(): scala.Int = { /* compiled code */ }
+  def foo3489(): scala.Int = { /* compiled code */ }
+  def foo3490(): scala.Int = { /* compiled code */ }
+  def foo3491(): scala.Int = { /* compiled code */ }
+  def foo3492(): scala.Int = { /* compiled code */ }
+  def foo3493(): scala.Int = { /* compiled code */ }
+  def foo3494(): scala.Int = { /* compiled code */ }
+  def foo3495(): scala.Int = { /* compiled code */ }
+  def foo3496(): scala.Int = { /* compiled code */ }
+  def foo3497(): scala.Int = { /* compiled code */ }
+  def foo3498(): scala.Int = { /* compiled code */ }
+  def foo3499(): scala.Int = { /* compiled code */ }
+  def foo3500(): scala.Int = { /* compiled code */ }
+}
diff --git a/test/files/scalap/t8679.scala b/test/files/scalap/t8679.scala
new file mode 100644
index 0000000..f008a7a
--- /dev/null
+++ b/test/files/scalap/t8679.scala
@@ -0,0 +1,3502 @@
+class T8679 {
+  def foo1(): Int = 3
+  def foo2(): Int = 4
+  def foo3(): Int = 5
+  def foo4(): Int = 6
+  def foo5(): Int = 7
+  def foo6(): Int = 8
+  def foo7(): Int = 9
+  def foo8(): Int = 10
+  def foo9(): Int = 11
+  def foo10(): Int = 12
+  def foo11(): Int = 13
+  def foo12(): Int = 14
+  def foo13(): Int = 15
+  def foo14(): Int = 16
+  def foo15(): Int = 17
+  def foo16(): Int = 18
+  def foo17(): Int = 19
+  def foo18(): Int = 20
+  def foo19(): Int = 21
+  def foo20(): Int = 22
+  def foo21(): Int = 23
+  def foo22(): Int = 24
+  def foo23(): Int = 25
+  def foo24(): Int = 26
+  def foo25(): Int = 27
+  def foo26(): Int = 28
+  def foo27(): Int = 29
+  def foo28(): Int = 30
+  def foo29(): Int = 31
+  def foo30(): Int = 32
+  def foo31(): Int = 33
+  def foo32(): Int = 34
+  def foo33(): Int = 35
+  def foo34(): Int = 36
+  def foo35(): Int = 37
+  def foo36(): Int = 38
+  def foo37(): Int = 39
+  def foo38(): Int = 40
+  def foo39(): Int = 41
+  def foo40(): Int = 42
+  def foo41(): Int = 43
+  def foo42(): Int = 44
+  def foo43(): Int = 45
+  def foo44(): Int = 46
+  def foo45(): Int = 47
+  def foo46(): Int = 48
+  def foo47(): Int = 49
+  def foo48(): Int = 50
+  def foo49(): Int = 51
+  def foo50(): Int = 52
+  def foo51(): Int = 53
+  def foo52(): Int = 54
+  def foo53(): Int = 55
+  def foo54(): Int = 56
+  def foo55(): Int = 57
+  def foo56(): Int = 58
+  def foo57(): Int = 59
+  def foo58(): Int = 60
+  def foo59(): Int = 61
+  def foo60(): Int = 62
+  def foo61(): Int = 63
+  def foo62(): Int = 64
+  def foo63(): Int = 65
+  def foo64(): Int = 66
+  def foo65(): Int = 67
+  def foo66(): Int = 68
+  def foo67(): Int = 69
+  def foo68(): Int = 70
+  def foo69(): Int = 71
+  def foo70(): Int = 72
+  def foo71(): Int = 73
+  def foo72(): Int = 74
+  def foo73(): Int = 75
+  def foo74(): Int = 76
+  def foo75(): Int = 77
+  def foo76(): Int = 78
+  def foo77(): Int = 79
+  def foo78(): Int = 80
+  def foo79(): Int = 81
+  def foo80(): Int = 82
+  def foo81(): Int = 83
+  def foo82(): Int = 84
+  def foo83(): Int = 85
+  def foo84(): Int = 86
+  def foo85(): Int = 87
+  def foo86(): Int = 88
+  def foo87(): Int = 89
+  def foo88(): Int = 90
+  def foo89(): Int = 91
+  def foo90(): Int = 92
+  def foo91(): Int = 93
+  def foo92(): Int = 94
+  def foo93(): Int = 95
+  def foo94(): Int = 96
+  def foo95(): Int = 97
+  def foo96(): Int = 98
+  def foo97(): Int = 99
+  def foo98(): Int = 100
+  def foo99(): Int = 101
+  def foo100(): Int = 102
+  def foo101(): Int = 103
+  def foo102(): Int = 104
+  def foo103(): Int = 105
+  def foo104(): Int = 106
+  def foo105(): Int = 107
+  def foo106(): Int = 108
+  def foo107(): Int = 109
+  def foo108(): Int = 110
+  def foo109(): Int = 111
+  def foo110(): Int = 112
+  def foo111(): Int = 113
+  def foo112(): Int = 114
+  def foo113(): Int = 115
+  def foo114(): Int = 116
+  def foo115(): Int = 117
+  def foo116(): Int = 118
+  def foo117(): Int = 119
+  def foo118(): Int = 120
+  def foo119(): Int = 121
+  def foo120(): Int = 122
+  def foo121(): Int = 123
+  def foo122(): Int = 124
+  def foo123(): Int = 125
+  def foo124(): Int = 126
+  def foo125(): Int = 127
+  def foo126(): Int = 128
+  def foo127(): Int = 129
+  def foo128(): Int = 130
+  def foo129(): Int = 131
+  def foo130(): Int = 132
+  def foo131(): Int = 133
+  def foo132(): Int = 134
+  def foo133(): Int = 135
+  def foo134(): Int = 136
+  def foo135(): Int = 137
+  def foo136(): Int = 138
+  def foo137(): Int = 139
+  def foo138(): Int = 140
+  def foo139(): Int = 141
+  def foo140(): Int = 142
+  def foo141(): Int = 143
+  def foo142(): Int = 144
+  def foo143(): Int = 145
+  def foo144(): Int = 146
+  def foo145(): Int = 147
+  def foo146(): Int = 148
+  def foo147(): Int = 149
+  def foo148(): Int = 150
+  def foo149(): Int = 151
+  def foo150(): Int = 152
+  def foo151(): Int = 153
+  def foo152(): Int = 154
+  def foo153(): Int = 155
+  def foo154(): Int = 156
+  def foo155(): Int = 157
+  def foo156(): Int = 158
+  def foo157(): Int = 159
+  def foo158(): Int = 160
+  def foo159(): Int = 161
+  def foo160(): Int = 162
+  def foo161(): Int = 163
+  def foo162(): Int = 164
+  def foo163(): Int = 165
+  def foo164(): Int = 166
+  def foo165(): Int = 167
+  def foo166(): Int = 168
+  def foo167(): Int = 169
+  def foo168(): Int = 170
+  def foo169(): Int = 171
+  def foo170(): Int = 172
+  def foo171(): Int = 173
+  def foo172(): Int = 174
+  def foo173(): Int = 175
+  def foo174(): Int = 176
+  def foo175(): Int = 177
+  def foo176(): Int = 178
+  def foo177(): Int = 179
+  def foo178(): Int = 180
+  def foo179(): Int = 181
+  def foo180(): Int = 182
+  def foo181(): Int = 183
+  def foo182(): Int = 184
+  def foo183(): Int = 185
+  def foo184(): Int = 186
+  def foo185(): Int = 187
+  def foo186(): Int = 188
+  def foo187(): Int = 189
+  def foo188(): Int = 190
+  def foo189(): Int = 191
+  def foo190(): Int = 192
+  def foo191(): Int = 193
+  def foo192(): Int = 194
+  def foo193(): Int = 195
+  def foo194(): Int = 196
+  def foo195(): Int = 197
+  def foo196(): Int = 198
+  def foo197(): Int = 199
+  def foo198(): Int = 200
+  def foo199(): Int = 201
+  def foo200(): Int = 202
+  def foo201(): Int = 203
+  def foo202(): Int = 204
+  def foo203(): Int = 205
+  def foo204(): Int = 206
+  def foo205(): Int = 207
+  def foo206(): Int = 208
+  def foo207(): Int = 209
+  def foo208(): Int = 210
+  def foo209(): Int = 211
+  def foo210(): Int = 212
+  def foo211(): Int = 213
+  def foo212(): Int = 214
+  def foo213(): Int = 215
+  def foo214(): Int = 216
+  def foo215(): Int = 217
+  def foo216(): Int = 218
+  def foo217(): Int = 219
+  def foo218(): Int = 220
+  def foo219(): Int = 221
+  def foo220(): Int = 222
+  def foo221(): Int = 223
+  def foo222(): Int = 224
+  def foo223(): Int = 225
+  def foo224(): Int = 226
+  def foo225(): Int = 227
+  def foo226(): Int = 228
+  def foo227(): Int = 229
+  def foo228(): Int = 230
+  def foo229(): Int = 231
+  def foo230(): Int = 232
+  def foo231(): Int = 233
+  def foo232(): Int = 234
+  def foo233(): Int = 235
+  def foo234(): Int = 236
+  def foo235(): Int = 237
+  def foo236(): Int = 238
+  def foo237(): Int = 239
+  def foo238(): Int = 240
+  def foo239(): Int = 241
+  def foo240(): Int = 242
+  def foo241(): Int = 243
+  def foo242(): Int = 244
+  def foo243(): Int = 245
+  def foo244(): Int = 246
+  def foo245(): Int = 247
+  def foo246(): Int = 248
+  def foo247(): Int = 249
+  def foo248(): Int = 250
+  def foo249(): Int = 251
+  def foo250(): Int = 252
+  def foo251(): Int = 253
+  def foo252(): Int = 254
+  def foo253(): Int = 255
+  def foo254(): Int = 256
+  def foo255(): Int = 257
+  def foo256(): Int = 258
+  def foo257(): Int = 259
+  def foo258(): Int = 260
+  def foo259(): Int = 261
+  def foo260(): Int = 262
+  def foo261(): Int = 263
+  def foo262(): Int = 264
+  def foo263(): Int = 265
+  def foo264(): Int = 266
+  def foo265(): Int = 267
+  def foo266(): Int = 268
+  def foo267(): Int = 269
+  def foo268(): Int = 270
+  def foo269(): Int = 271
+  def foo270(): Int = 272
+  def foo271(): Int = 273
+  def foo272(): Int = 274
+  def foo273(): Int = 275
+  def foo274(): Int = 276
+  def foo275(): Int = 277
+  def foo276(): Int = 278
+  def foo277(): Int = 279
+  def foo278(): Int = 280
+  def foo279(): Int = 281
+  def foo280(): Int = 282
+  def foo281(): Int = 283
+  def foo282(): Int = 284
+  def foo283(): Int = 285
+  def foo284(): Int = 286
+  def foo285(): Int = 287
+  def foo286(): Int = 288
+  def foo287(): Int = 289
+  def foo288(): Int = 290
+  def foo289(): Int = 291
+  def foo290(): Int = 292
+  def foo291(): Int = 293
+  def foo292(): Int = 294
+  def foo293(): Int = 295
+  def foo294(): Int = 296
+  def foo295(): Int = 297
+  def foo296(): Int = 298
+  def foo297(): Int = 299
+  def foo298(): Int = 300
+  def foo299(): Int = 301
+  def foo300(): Int = 302
+  def foo301(): Int = 303
+  def foo302(): Int = 304
+  def foo303(): Int = 305
+  def foo304(): Int = 306
+  def foo305(): Int = 307
+  def foo306(): Int = 308
+  def foo307(): Int = 309
+  def foo308(): Int = 310
+  def foo309(): Int = 311
+  def foo310(): Int = 312
+  def foo311(): Int = 313
+  def foo312(): Int = 314
+  def foo313(): Int = 315
+  def foo314(): Int = 316
+  def foo315(): Int = 317
+  def foo316(): Int = 318
+  def foo317(): Int = 319
+  def foo318(): Int = 320
+  def foo319(): Int = 321
+  def foo320(): Int = 322
+  def foo321(): Int = 323
+  def foo322(): Int = 324
+  def foo323(): Int = 325
+  def foo324(): Int = 326
+  def foo325(): Int = 327
+  def foo326(): Int = 328
+  def foo327(): Int = 329
+  def foo328(): Int = 330
+  def foo329(): Int = 331
+  def foo330(): Int = 332
+  def foo331(): Int = 333
+  def foo332(): Int = 334
+  def foo333(): Int = 335
+  def foo334(): Int = 336
+  def foo335(): Int = 337
+  def foo336(): Int = 338
+  def foo337(): Int = 339
+  def foo338(): Int = 340
+  def foo339(): Int = 341
+  def foo340(): Int = 342
+  def foo341(): Int = 343
+  def foo342(): Int = 344
+  def foo343(): Int = 345
+  def foo344(): Int = 346
+  def foo345(): Int = 347
+  def foo346(): Int = 348
+  def foo347(): Int = 349
+  def foo348(): Int = 350
+  def foo349(): Int = 351
+  def foo350(): Int = 352
+  def foo351(): Int = 353
+  def foo352(): Int = 354
+  def foo353(): Int = 355
+  def foo354(): Int = 356
+  def foo355(): Int = 357
+  def foo356(): Int = 358
+  def foo357(): Int = 359
+  def foo358(): Int = 360
+  def foo359(): Int = 361
+  def foo360(): Int = 362
+  def foo361(): Int = 363
+  def foo362(): Int = 364
+  def foo363(): Int = 365
+  def foo364(): Int = 366
+  def foo365(): Int = 367
+  def foo366(): Int = 368
+  def foo367(): Int = 369
+  def foo368(): Int = 370
+  def foo369(): Int = 371
+  def foo370(): Int = 372
+  def foo371(): Int = 373
+  def foo372(): Int = 374
+  def foo373(): Int = 375
+  def foo374(): Int = 376
+  def foo375(): Int = 377
+  def foo376(): Int = 378
+  def foo377(): Int = 379
+  def foo378(): Int = 380
+  def foo379(): Int = 381
+  def foo380(): Int = 382
+  def foo381(): Int = 383
+  def foo382(): Int = 384
+  def foo383(): Int = 385
+  def foo384(): Int = 386
+  def foo385(): Int = 387
+  def foo386(): Int = 388
+  def foo387(): Int = 389
+  def foo388(): Int = 390
+  def foo389(): Int = 391
+  def foo390(): Int = 392
+  def foo391(): Int = 393
+  def foo392(): Int = 394
+  def foo393(): Int = 395
+  def foo394(): Int = 396
+  def foo395(): Int = 397
+  def foo396(): Int = 398
+  def foo397(): Int = 399
+  def foo398(): Int = 400
+  def foo399(): Int = 401
+  def foo400(): Int = 402
+  def foo401(): Int = 403
+  def foo402(): Int = 404
+  def foo403(): Int = 405
+  def foo404(): Int = 406
+  def foo405(): Int = 407
+  def foo406(): Int = 408
+  def foo407(): Int = 409
+  def foo408(): Int = 410
+  def foo409(): Int = 411
+  def foo410(): Int = 412
+  def foo411(): Int = 413
+  def foo412(): Int = 414
+  def foo413(): Int = 415
+  def foo414(): Int = 416
+  def foo415(): Int = 417
+  def foo416(): Int = 418
+  def foo417(): Int = 419
+  def foo418(): Int = 420
+  def foo419(): Int = 421
+  def foo420(): Int = 422
+  def foo421(): Int = 423
+  def foo422(): Int = 424
+  def foo423(): Int = 425
+  def foo424(): Int = 426
+  def foo425(): Int = 427
+  def foo426(): Int = 428
+  def foo427(): Int = 429
+  def foo428(): Int = 430
+  def foo429(): Int = 431
+  def foo430(): Int = 432
+  def foo431(): Int = 433
+  def foo432(): Int = 434
+  def foo433(): Int = 435
+  def foo434(): Int = 436
+  def foo435(): Int = 437
+  def foo436(): Int = 438
+  def foo437(): Int = 439
+  def foo438(): Int = 440
+  def foo439(): Int = 441
+  def foo440(): Int = 442
+  def foo441(): Int = 443
+  def foo442(): Int = 444
+  def foo443(): Int = 445
+  def foo444(): Int = 446
+  def foo445(): Int = 447
+  def foo446(): Int = 448
+  def foo447(): Int = 449
+  def foo448(): Int = 450
+  def foo449(): Int = 451
+  def foo450(): Int = 452
+  def foo451(): Int = 453
+  def foo452(): Int = 454
+  def foo453(): Int = 455
+  def foo454(): Int = 456
+  def foo455(): Int = 457
+  def foo456(): Int = 458
+  def foo457(): Int = 459
+  def foo458(): Int = 460
+  def foo459(): Int = 461
+  def foo460(): Int = 462
+  def foo461(): Int = 463
+  def foo462(): Int = 464
+  def foo463(): Int = 465
+  def foo464(): Int = 466
+  def foo465(): Int = 467
+  def foo466(): Int = 468
+  def foo467(): Int = 469
+  def foo468(): Int = 470
+  def foo469(): Int = 471
+  def foo470(): Int = 472
+  def foo471(): Int = 473
+  def foo472(): Int = 474
+  def foo473(): Int = 475
+  def foo474(): Int = 476
+  def foo475(): Int = 477
+  def foo476(): Int = 478
+  def foo477(): Int = 479
+  def foo478(): Int = 480
+  def foo479(): Int = 481
+  def foo480(): Int = 482
+  def foo481(): Int = 483
+  def foo482(): Int = 484
+  def foo483(): Int = 485
+  def foo484(): Int = 486
+  def foo485(): Int = 487
+  def foo486(): Int = 488
+  def foo487(): Int = 489
+  def foo488(): Int = 490
+  def foo489(): Int = 491
+  def foo490(): Int = 492
+  def foo491(): Int = 493
+  def foo492(): Int = 494
+  def foo493(): Int = 495
+  def foo494(): Int = 496
+  def foo495(): Int = 497
+  def foo496(): Int = 498
+  def foo497(): Int = 499
+  def foo498(): Int = 500
+  def foo499(): Int = 501
+  def foo500(): Int = 502
+  def foo501(): Int = 503
+  def foo502(): Int = 504
+  def foo503(): Int = 505
+  def foo504(): Int = 506
+  def foo505(): Int = 507
+  def foo506(): Int = 508
+  def foo507(): Int = 509
+  def foo508(): Int = 510
+  def foo509(): Int = 511
+  def foo510(): Int = 512
+  def foo511(): Int = 513
+  def foo512(): Int = 514
+  def foo513(): Int = 515
+  def foo514(): Int = 516
+  def foo515(): Int = 517
+  def foo516(): Int = 518
+  def foo517(): Int = 519
+  def foo518(): Int = 520
+  def foo519(): Int = 521
+  def foo520(): Int = 522
+  def foo521(): Int = 523
+  def foo522(): Int = 524
+  def foo523(): Int = 525
+  def foo524(): Int = 526
+  def foo525(): Int = 527
+  def foo526(): Int = 528
+  def foo527(): Int = 529
+  def foo528(): Int = 530
+  def foo529(): Int = 531
+  def foo530(): Int = 532
+  def foo531(): Int = 533
+  def foo532(): Int = 534
+  def foo533(): Int = 535
+  def foo534(): Int = 536
+  def foo535(): Int = 537
+  def foo536(): Int = 538
+  def foo537(): Int = 539
+  def foo538(): Int = 540
+  def foo539(): Int = 541
+  def foo540(): Int = 542
+  def foo541(): Int = 543
+  def foo542(): Int = 544
+  def foo543(): Int = 545
+  def foo544(): Int = 546
+  def foo545(): Int = 547
+  def foo546(): Int = 548
+  def foo547(): Int = 549
+  def foo548(): Int = 550
+  def foo549(): Int = 551
+  def foo550(): Int = 552
+  def foo551(): Int = 553
+  def foo552(): Int = 554
+  def foo553(): Int = 555
+  def foo554(): Int = 556
+  def foo555(): Int = 557
+  def foo556(): Int = 558
+  def foo557(): Int = 559
+  def foo558(): Int = 560
+  def foo559(): Int = 561
+  def foo560(): Int = 562
+  def foo561(): Int = 563
+  def foo562(): Int = 564
+  def foo563(): Int = 565
+  def foo564(): Int = 566
+  def foo565(): Int = 567
+  def foo566(): Int = 568
+  def foo567(): Int = 569
+  def foo568(): Int = 570
+  def foo569(): Int = 571
+  def foo570(): Int = 572
+  def foo571(): Int = 573
+  def foo572(): Int = 574
+  def foo573(): Int = 575
+  def foo574(): Int = 576
+  def foo575(): Int = 577
+  def foo576(): Int = 578
+  def foo577(): Int = 579
+  def foo578(): Int = 580
+  def foo579(): Int = 581
+  def foo580(): Int = 582
+  def foo581(): Int = 583
+  def foo582(): Int = 584
+  def foo583(): Int = 585
+  def foo584(): Int = 586
+  def foo585(): Int = 587
+  def foo586(): Int = 588
+  def foo587(): Int = 589
+  def foo588(): Int = 590
+  def foo589(): Int = 591
+  def foo590(): Int = 592
+  def foo591(): Int = 593
+  def foo592(): Int = 594
+  def foo593(): Int = 595
+  def foo594(): Int = 596
+  def foo595(): Int = 597
+  def foo596(): Int = 598
+  def foo597(): Int = 599
+  def foo598(): Int = 600
+  def foo599(): Int = 601
+  def foo600(): Int = 602
+  def foo601(): Int = 603
+  def foo602(): Int = 604
+  def foo603(): Int = 605
+  def foo604(): Int = 606
+  def foo605(): Int = 607
+  def foo606(): Int = 608
+  def foo607(): Int = 609
+  def foo608(): Int = 610
+  def foo609(): Int = 611
+  def foo610(): Int = 612
+  def foo611(): Int = 613
+  def foo612(): Int = 614
+  def foo613(): Int = 615
+  def foo614(): Int = 616
+  def foo615(): Int = 617
+  def foo616(): Int = 618
+  def foo617(): Int = 619
+  def foo618(): Int = 620
+  def foo619(): Int = 621
+  def foo620(): Int = 622
+  def foo621(): Int = 623
+  def foo622(): Int = 624
+  def foo623(): Int = 625
+  def foo624(): Int = 626
+  def foo625(): Int = 627
+  def foo626(): Int = 628
+  def foo627(): Int = 629
+  def foo628(): Int = 630
+  def foo629(): Int = 631
+  def foo630(): Int = 632
+  def foo631(): Int = 633
+  def foo632(): Int = 634
+  def foo633(): Int = 635
+  def foo634(): Int = 636
+  def foo635(): Int = 637
+  def foo636(): Int = 638
+  def foo637(): Int = 639
+  def foo638(): Int = 640
+  def foo639(): Int = 641
+  def foo640(): Int = 642
+  def foo641(): Int = 643
+  def foo642(): Int = 644
+  def foo643(): Int = 645
+  def foo644(): Int = 646
+  def foo645(): Int = 647
+  def foo646(): Int = 648
+  def foo647(): Int = 649
+  def foo648(): Int = 650
+  def foo649(): Int = 651
+  def foo650(): Int = 652
+  def foo651(): Int = 653
+  def foo652(): Int = 654
+  def foo653(): Int = 655
+  def foo654(): Int = 656
+  def foo655(): Int = 657
+  def foo656(): Int = 658
+  def foo657(): Int = 659
+  def foo658(): Int = 660
+  def foo659(): Int = 661
+  def foo660(): Int = 662
+  def foo661(): Int = 663
+  def foo662(): Int = 664
+  def foo663(): Int = 665
+  def foo664(): Int = 666
+  def foo665(): Int = 667
+  def foo666(): Int = 668
+  def foo667(): Int = 669
+  def foo668(): Int = 670
+  def foo669(): Int = 671
+  def foo670(): Int = 672
+  def foo671(): Int = 673
+  def foo672(): Int = 674
+  def foo673(): Int = 675
+  def foo674(): Int = 676
+  def foo675(): Int = 677
+  def foo676(): Int = 678
+  def foo677(): Int = 679
+  def foo678(): Int = 680
+  def foo679(): Int = 681
+  def foo680(): Int = 682
+  def foo681(): Int = 683
+  def foo682(): Int = 684
+  def foo683(): Int = 685
+  def foo684(): Int = 686
+  def foo685(): Int = 687
+  def foo686(): Int = 688
+  def foo687(): Int = 689
+  def foo688(): Int = 690
+  def foo689(): Int = 691
+  def foo690(): Int = 692
+  def foo691(): Int = 693
+  def foo692(): Int = 694
+  def foo693(): Int = 695
+  def foo694(): Int = 696
+  def foo695(): Int = 697
+  def foo696(): Int = 698
+  def foo697(): Int = 699
+  def foo698(): Int = 700
+  def foo699(): Int = 701
+  def foo700(): Int = 702
+  def foo701(): Int = 703
+  def foo702(): Int = 704
+  def foo703(): Int = 705
+  def foo704(): Int = 706
+  def foo705(): Int = 707
+  def foo706(): Int = 708
+  def foo707(): Int = 709
+  def foo708(): Int = 710
+  def foo709(): Int = 711
+  def foo710(): Int = 712
+  def foo711(): Int = 713
+  def foo712(): Int = 714
+  def foo713(): Int = 715
+  def foo714(): Int = 716
+  def foo715(): Int = 717
+  def foo716(): Int = 718
+  def foo717(): Int = 719
+  def foo718(): Int = 720
+  def foo719(): Int = 721
+  def foo720(): Int = 722
+  def foo721(): Int = 723
+  def foo722(): Int = 724
+  def foo723(): Int = 725
+  def foo724(): Int = 726
+  def foo725(): Int = 727
+  def foo726(): Int = 728
+  def foo727(): Int = 729
+  def foo728(): Int = 730
+  def foo729(): Int = 731
+  def foo730(): Int = 732
+  def foo731(): Int = 733
+  def foo732(): Int = 734
+  def foo733(): Int = 735
+  def foo734(): Int = 736
+  def foo735(): Int = 737
+  def foo736(): Int = 738
+  def foo737(): Int = 739
+  def foo738(): Int = 740
+  def foo739(): Int = 741
+  def foo740(): Int = 742
+  def foo741(): Int = 743
+  def foo742(): Int = 744
+  def foo743(): Int = 745
+  def foo744(): Int = 746
+  def foo745(): Int = 747
+  def foo746(): Int = 748
+  def foo747(): Int = 749
+  def foo748(): Int = 750
+  def foo749(): Int = 751
+  def foo750(): Int = 752
+  def foo751(): Int = 753
+  def foo752(): Int = 754
+  def foo753(): Int = 755
+  def foo754(): Int = 756
+  def foo755(): Int = 757
+  def foo756(): Int = 758
+  def foo757(): Int = 759
+  def foo758(): Int = 760
+  def foo759(): Int = 761
+  def foo760(): Int = 762
+  def foo761(): Int = 763
+  def foo762(): Int = 764
+  def foo763(): Int = 765
+  def foo764(): Int = 766
+  def foo765(): Int = 767
+  def foo766(): Int = 768
+  def foo767(): Int = 769
+  def foo768(): Int = 770
+  def foo769(): Int = 771
+  def foo770(): Int = 772
+  def foo771(): Int = 773
+  def foo772(): Int = 774
+  def foo773(): Int = 775
+  def foo774(): Int = 776
+  def foo775(): Int = 777
+  def foo776(): Int = 778
+  def foo777(): Int = 779
+  def foo778(): Int = 780
+  def foo779(): Int = 781
+  def foo780(): Int = 782
+  def foo781(): Int = 783
+  def foo782(): Int = 784
+  def foo783(): Int = 785
+  def foo784(): Int = 786
+  def foo785(): Int = 787
+  def foo786(): Int = 788
+  def foo787(): Int = 789
+  def foo788(): Int = 790
+  def foo789(): Int = 791
+  def foo790(): Int = 792
+  def foo791(): Int = 793
+  def foo792(): Int = 794
+  def foo793(): Int = 795
+  def foo794(): Int = 796
+  def foo795(): Int = 797
+  def foo796(): Int = 798
+  def foo797(): Int = 799
+  def foo798(): Int = 800
+  def foo799(): Int = 801
+  def foo800(): Int = 802
+  def foo801(): Int = 803
+  def foo802(): Int = 804
+  def foo803(): Int = 805
+  def foo804(): Int = 806
+  def foo805(): Int = 807
+  def foo806(): Int = 808
+  def foo807(): Int = 809
+  def foo808(): Int = 810
+  def foo809(): Int = 811
+  def foo810(): Int = 812
+  def foo811(): Int = 813
+  def foo812(): Int = 814
+  def foo813(): Int = 815
+  def foo814(): Int = 816
+  def foo815(): Int = 817
+  def foo816(): Int = 818
+  def foo817(): Int = 819
+  def foo818(): Int = 820
+  def foo819(): Int = 821
+  def foo820(): Int = 822
+  def foo821(): Int = 823
+  def foo822(): Int = 824
+  def foo823(): Int = 825
+  def foo824(): Int = 826
+  def foo825(): Int = 827
+  def foo826(): Int = 828
+  def foo827(): Int = 829
+  def foo828(): Int = 830
+  def foo829(): Int = 831
+  def foo830(): Int = 832
+  def foo831(): Int = 833
+  def foo832(): Int = 834
+  def foo833(): Int = 835
+  def foo834(): Int = 836
+  def foo835(): Int = 837
+  def foo836(): Int = 838
+  def foo837(): Int = 839
+  def foo838(): Int = 840
+  def foo839(): Int = 841
+  def foo840(): Int = 842
+  def foo841(): Int = 843
+  def foo842(): Int = 844
+  def foo843(): Int = 845
+  def foo844(): Int = 846
+  def foo845(): Int = 847
+  def foo846(): Int = 848
+  def foo847(): Int = 849
+  def foo848(): Int = 850
+  def foo849(): Int = 851
+  def foo850(): Int = 852
+  def foo851(): Int = 853
+  def foo852(): Int = 854
+  def foo853(): Int = 855
+  def foo854(): Int = 856
+  def foo855(): Int = 857
+  def foo856(): Int = 858
+  def foo857(): Int = 859
+  def foo858(): Int = 860
+  def foo859(): Int = 861
+  def foo860(): Int = 862
+  def foo861(): Int = 863
+  def foo862(): Int = 864
+  def foo863(): Int = 865
+  def foo864(): Int = 866
+  def foo865(): Int = 867
+  def foo866(): Int = 868
+  def foo867(): Int = 869
+  def foo868(): Int = 870
+  def foo869(): Int = 871
+  def foo870(): Int = 872
+  def foo871(): Int = 873
+  def foo872(): Int = 874
+  def foo873(): Int = 875
+  def foo874(): Int = 876
+  def foo875(): Int = 877
+  def foo876(): Int = 878
+  def foo877(): Int = 879
+  def foo878(): Int = 880
+  def foo879(): Int = 881
+  def foo880(): Int = 882
+  def foo881(): Int = 883
+  def foo882(): Int = 884
+  def foo883(): Int = 885
+  def foo884(): Int = 886
+  def foo885(): Int = 887
+  def foo886(): Int = 888
+  def foo887(): Int = 889
+  def foo888(): Int = 890
+  def foo889(): Int = 891
+  def foo890(): Int = 892
+  def foo891(): Int = 893
+  def foo892(): Int = 894
+  def foo893(): Int = 895
+  def foo894(): Int = 896
+  def foo895(): Int = 897
+  def foo896(): Int = 898
+  def foo897(): Int = 899
+  def foo898(): Int = 900
+  def foo899(): Int = 901
+  def foo900(): Int = 902
+  def foo901(): Int = 903
+  def foo902(): Int = 904
+  def foo903(): Int = 905
+  def foo904(): Int = 906
+  def foo905(): Int = 907
+  def foo906(): Int = 908
+  def foo907(): Int = 909
+  def foo908(): Int = 910
+  def foo909(): Int = 911
+  def foo910(): Int = 912
+  def foo911(): Int = 913
+  def foo912(): Int = 914
+  def foo913(): Int = 915
+  def foo914(): Int = 916
+  def foo915(): Int = 917
+  def foo916(): Int = 918
+  def foo917(): Int = 919
+  def foo918(): Int = 920
+  def foo919(): Int = 921
+  def foo920(): Int = 922
+  def foo921(): Int = 923
+  def foo922(): Int = 924
+  def foo923(): Int = 925
+  def foo924(): Int = 926
+  def foo925(): Int = 927
+  def foo926(): Int = 928
+  def foo927(): Int = 929
+  def foo928(): Int = 930
+  def foo929(): Int = 931
+  def foo930(): Int = 932
+  def foo931(): Int = 933
+  def foo932(): Int = 934
+  def foo933(): Int = 935
+  def foo934(): Int = 936
+  def foo935(): Int = 937
+  def foo936(): Int = 938
+  def foo937(): Int = 939
+  def foo938(): Int = 940
+  def foo939(): Int = 941
+  def foo940(): Int = 942
+  def foo941(): Int = 943
+  def foo942(): Int = 944
+  def foo943(): Int = 945
+  def foo944(): Int = 946
+  def foo945(): Int = 947
+  def foo946(): Int = 948
+  def foo947(): Int = 949
+  def foo948(): Int = 950
+  def foo949(): Int = 951
+  def foo950(): Int = 952
+  def foo951(): Int = 953
+  def foo952(): Int = 954
+  def foo953(): Int = 955
+  def foo954(): Int = 956
+  def foo955(): Int = 957
+  def foo956(): Int = 958
+  def foo957(): Int = 959
+  def foo958(): Int = 960
+  def foo959(): Int = 961
+  def foo960(): Int = 962
+  def foo961(): Int = 963
+  def foo962(): Int = 964
+  def foo963(): Int = 965
+  def foo964(): Int = 966
+  def foo965(): Int = 967
+  def foo966(): Int = 968
+  def foo967(): Int = 969
+  def foo968(): Int = 970
+  def foo969(): Int = 971
+  def foo970(): Int = 972
+  def foo971(): Int = 973
+  def foo972(): Int = 974
+  def foo973(): Int = 975
+  def foo974(): Int = 976
+  def foo975(): Int = 977
+  def foo976(): Int = 978
+  def foo977(): Int = 979
+  def foo978(): Int = 980
+  def foo979(): Int = 981
+  def foo980(): Int = 982
+  def foo981(): Int = 983
+  def foo982(): Int = 984
+  def foo983(): Int = 985
+  def foo984(): Int = 986
+  def foo985(): Int = 987
+  def foo986(): Int = 988
+  def foo987(): Int = 989
+  def foo988(): Int = 990
+  def foo989(): Int = 991
+  def foo990(): Int = 992
+  def foo991(): Int = 993
+  def foo992(): Int = 994
+  def foo993(): Int = 995
+  def foo994(): Int = 996
+  def foo995(): Int = 997
+  def foo996(): Int = 998
+  def foo997(): Int = 999
+  def foo998(): Int = 1000
+  def foo999(): Int = 1001
+  def foo1000(): Int = 1002
+  def foo1001(): Int = 1003
+  def foo1002(): Int = 1004
+  def foo1003(): Int = 1005
+  def foo1004(): Int = 1006
+  def foo1005(): Int = 1007
+  def foo1006(): Int = 1008
+  def foo1007(): Int = 1009
+  def foo1008(): Int = 1010
+  def foo1009(): Int = 1011
+  def foo1010(): Int = 1012
+  def foo1011(): Int = 1013
+  def foo1012(): Int = 1014
+  def foo1013(): Int = 1015
+  def foo1014(): Int = 1016
+  def foo1015(): Int = 1017
+  def foo1016(): Int = 1018
+  def foo1017(): Int = 1019
+  def foo1018(): Int = 1020
+  def foo1019(): Int = 1021
+  def foo1020(): Int = 1022
+  def foo1021(): Int = 1023
+  def foo1022(): Int = 1024
+  def foo1023(): Int = 1025
+  def foo1024(): Int = 1026
+  def foo1025(): Int = 1027
+  def foo1026(): Int = 1028
+  def foo1027(): Int = 1029
+  def foo1028(): Int = 1030
+  def foo1029(): Int = 1031
+  def foo1030(): Int = 1032
+  def foo1031(): Int = 1033
+  def foo1032(): Int = 1034
+  def foo1033(): Int = 1035
+  def foo1034(): Int = 1036
+  def foo1035(): Int = 1037
+  def foo1036(): Int = 1038
+  def foo1037(): Int = 1039
+  def foo1038(): Int = 1040
+  def foo1039(): Int = 1041
+  def foo1040(): Int = 1042
+  def foo1041(): Int = 1043
+  def foo1042(): Int = 1044
+  def foo1043(): Int = 1045
+  def foo1044(): Int = 1046
+  def foo1045(): Int = 1047
+  def foo1046(): Int = 1048
+  def foo1047(): Int = 1049
+  def foo1048(): Int = 1050
+  def foo1049(): Int = 1051
+  def foo1050(): Int = 1052
+  def foo1051(): Int = 1053
+  def foo1052(): Int = 1054
+  def foo1053(): Int = 1055
+  def foo1054(): Int = 1056
+  def foo1055(): Int = 1057
+  def foo1056(): Int = 1058
+  def foo1057(): Int = 1059
+  def foo1058(): Int = 1060
+  def foo1059(): Int = 1061
+  def foo1060(): Int = 1062
+  def foo1061(): Int = 1063
+  def foo1062(): Int = 1064
+  def foo1063(): Int = 1065
+  def foo1064(): Int = 1066
+  def foo1065(): Int = 1067
+  def foo1066(): Int = 1068
+  def foo1067(): Int = 1069
+  def foo1068(): Int = 1070
+  def foo1069(): Int = 1071
+  def foo1070(): Int = 1072
+  def foo1071(): Int = 1073
+  def foo1072(): Int = 1074
+  def foo1073(): Int = 1075
+  def foo1074(): Int = 1076
+  def foo1075(): Int = 1077
+  def foo1076(): Int = 1078
+  def foo1077(): Int = 1079
+  def foo1078(): Int = 1080
+  def foo1079(): Int = 1081
+  def foo1080(): Int = 1082
+  def foo1081(): Int = 1083
+  def foo1082(): Int = 1084
+  def foo1083(): Int = 1085
+  def foo1084(): Int = 1086
+  def foo1085(): Int = 1087
+  def foo1086(): Int = 1088
+  def foo1087(): Int = 1089
+  def foo1088(): Int = 1090
+  def foo1089(): Int = 1091
+  def foo1090(): Int = 1092
+  def foo1091(): Int = 1093
+  def foo1092(): Int = 1094
+  def foo1093(): Int = 1095
+  def foo1094(): Int = 1096
+  def foo1095(): Int = 1097
+  def foo1096(): Int = 1098
+  def foo1097(): Int = 1099
+  def foo1098(): Int = 1100
+  def foo1099(): Int = 1101
+  def foo1100(): Int = 1102
+  def foo1101(): Int = 1103
+  def foo1102(): Int = 1104
+  def foo1103(): Int = 1105
+  def foo1104(): Int = 1106
+  def foo1105(): Int = 1107
+  def foo1106(): Int = 1108
+  def foo1107(): Int = 1109
+  def foo1108(): Int = 1110
+  def foo1109(): Int = 1111
+  def foo1110(): Int = 1112
+  def foo1111(): Int = 1113
+  def foo1112(): Int = 1114
+  def foo1113(): Int = 1115
+  def foo1114(): Int = 1116
+  def foo1115(): Int = 1117
+  def foo1116(): Int = 1118
+  def foo1117(): Int = 1119
+  def foo1118(): Int = 1120
+  def foo1119(): Int = 1121
+  def foo1120(): Int = 1122
+  def foo1121(): Int = 1123
+  def foo1122(): Int = 1124
+  def foo1123(): Int = 1125
+  def foo1124(): Int = 1126
+  def foo1125(): Int = 1127
+  def foo1126(): Int = 1128
+  def foo1127(): Int = 1129
+  def foo1128(): Int = 1130
+  def foo1129(): Int = 1131
+  def foo1130(): Int = 1132
+  def foo1131(): Int = 1133
+  def foo1132(): Int = 1134
+  def foo1133(): Int = 1135
+  def foo1134(): Int = 1136
+  def foo1135(): Int = 1137
+  def foo1136(): Int = 1138
+  def foo1137(): Int = 1139
+  def foo1138(): Int = 1140
+  def foo1139(): Int = 1141
+  def foo1140(): Int = 1142
+  def foo1141(): Int = 1143
+  def foo1142(): Int = 1144
+  def foo1143(): Int = 1145
+  def foo1144(): Int = 1146
+  def foo1145(): Int = 1147
+  def foo1146(): Int = 1148
+  def foo1147(): Int = 1149
+  def foo1148(): Int = 1150
+  def foo1149(): Int = 1151
+  def foo1150(): Int = 1152
+  def foo1151(): Int = 1153
+  def foo1152(): Int = 1154
+  def foo1153(): Int = 1155
+  def foo1154(): Int = 1156
+  def foo1155(): Int = 1157
+  def foo1156(): Int = 1158
+  def foo1157(): Int = 1159
+  def foo1158(): Int = 1160
+  def foo1159(): Int = 1161
+  def foo1160(): Int = 1162
+  def foo1161(): Int = 1163
+  def foo1162(): Int = 1164
+  def foo1163(): Int = 1165
+  def foo1164(): Int = 1166
+  def foo1165(): Int = 1167
+  def foo1166(): Int = 1168
+  def foo1167(): Int = 1169
+  def foo1168(): Int = 1170
+  def foo1169(): Int = 1171
+  def foo1170(): Int = 1172
+  def foo1171(): Int = 1173
+  def foo1172(): Int = 1174
+  def foo1173(): Int = 1175
+  def foo1174(): Int = 1176
+  def foo1175(): Int = 1177
+  def foo1176(): Int = 1178
+  def foo1177(): Int = 1179
+  def foo1178(): Int = 1180
+  def foo1179(): Int = 1181
+  def foo1180(): Int = 1182
+  def foo1181(): Int = 1183
+  def foo1182(): Int = 1184
+  def foo1183(): Int = 1185
+  def foo1184(): Int = 1186
+  def foo1185(): Int = 1187
+  def foo1186(): Int = 1188
+  def foo1187(): Int = 1189
+  def foo1188(): Int = 1190
+  def foo1189(): Int = 1191
+  def foo1190(): Int = 1192
+  def foo1191(): Int = 1193
+  def foo1192(): Int = 1194
+  def foo1193(): Int = 1195
+  def foo1194(): Int = 1196
+  def foo1195(): Int = 1197
+  def foo1196(): Int = 1198
+  def foo1197(): Int = 1199
+  def foo1198(): Int = 1200
+  def foo1199(): Int = 1201
+  def foo1200(): Int = 1202
+  def foo1201(): Int = 1203
+  def foo1202(): Int = 1204
+  def foo1203(): Int = 1205
+  def foo1204(): Int = 1206
+  def foo1205(): Int = 1207
+  def foo1206(): Int = 1208
+  def foo1207(): Int = 1209
+  def foo1208(): Int = 1210
+  def foo1209(): Int = 1211
+  def foo1210(): Int = 1212
+  def foo1211(): Int = 1213
+  def foo1212(): Int = 1214
+  def foo1213(): Int = 1215
+  def foo1214(): Int = 1216
+  def foo1215(): Int = 1217
+  def foo1216(): Int = 1218
+  def foo1217(): Int = 1219
+  def foo1218(): Int = 1220
+  def foo1219(): Int = 1221
+  def foo1220(): Int = 1222
+  def foo1221(): Int = 1223
+  def foo1222(): Int = 1224
+  def foo1223(): Int = 1225
+  def foo1224(): Int = 1226
+  def foo1225(): Int = 1227
+  def foo1226(): Int = 1228
+  def foo1227(): Int = 1229
+  def foo1228(): Int = 1230
+  def foo1229(): Int = 1231
+  def foo1230(): Int = 1232
+  def foo1231(): Int = 1233
+  def foo1232(): Int = 1234
+  def foo1233(): Int = 1235
+  def foo1234(): Int = 1236
+  def foo1235(): Int = 1237
+  def foo1236(): Int = 1238
+  def foo1237(): Int = 1239
+  def foo1238(): Int = 1240
+  def foo1239(): Int = 1241
+  def foo1240(): Int = 1242
+  def foo1241(): Int = 1243
+  def foo1242(): Int = 1244
+  def foo1243(): Int = 1245
+  def foo1244(): Int = 1246
+  def foo1245(): Int = 1247
+  def foo1246(): Int = 1248
+  def foo1247(): Int = 1249
+  def foo1248(): Int = 1250
+  def foo1249(): Int = 1251
+  def foo1250(): Int = 1252
+  def foo1251(): Int = 1253
+  def foo1252(): Int = 1254
+  def foo1253(): Int = 1255
+  def foo1254(): Int = 1256
+  def foo1255(): Int = 1257
+  def foo1256(): Int = 1258
+  def foo1257(): Int = 1259
+  def foo1258(): Int = 1260
+  def foo1259(): Int = 1261
+  def foo1260(): Int = 1262
+  def foo1261(): Int = 1263
+  def foo1262(): Int = 1264
+  def foo1263(): Int = 1265
+  def foo1264(): Int = 1266
+  def foo1265(): Int = 1267
+  def foo1266(): Int = 1268
+  def foo1267(): Int = 1269
+  def foo1268(): Int = 1270
+  def foo1269(): Int = 1271
+  def foo1270(): Int = 1272
+  def foo1271(): Int = 1273
+  def foo1272(): Int = 1274
+  def foo1273(): Int = 1275
+  def foo1274(): Int = 1276
+  def foo1275(): Int = 1277
+  def foo1276(): Int = 1278
+  def foo1277(): Int = 1279
+  def foo1278(): Int = 1280
+  def foo1279(): Int = 1281
+  def foo1280(): Int = 1282
+  def foo1281(): Int = 1283
+  def foo1282(): Int = 1284
+  def foo1283(): Int = 1285
+  def foo1284(): Int = 1286
+  def foo1285(): Int = 1287
+  def foo1286(): Int = 1288
+  def foo1287(): Int = 1289
+  def foo1288(): Int = 1290
+  def foo1289(): Int = 1291
+  def foo1290(): Int = 1292
+  def foo1291(): Int = 1293
+  def foo1292(): Int = 1294
+  def foo1293(): Int = 1295
+  def foo1294(): Int = 1296
+  def foo1295(): Int = 1297
+  def foo1296(): Int = 1298
+  def foo1297(): Int = 1299
+  def foo1298(): Int = 1300
+  def foo1299(): Int = 1301
+  def foo1300(): Int = 1302
+  def foo1301(): Int = 1303
+  def foo1302(): Int = 1304
+  def foo1303(): Int = 1305
+  def foo1304(): Int = 1306
+  def foo1305(): Int = 1307
+  def foo1306(): Int = 1308
+  def foo1307(): Int = 1309
+  def foo1308(): Int = 1310
+  def foo1309(): Int = 1311
+  def foo1310(): Int = 1312
+  def foo1311(): Int = 1313
+  def foo1312(): Int = 1314
+  def foo1313(): Int = 1315
+  def foo1314(): Int = 1316
+  def foo1315(): Int = 1317
+  def foo1316(): Int = 1318
+  def foo1317(): Int = 1319
+  def foo1318(): Int = 1320
+  def foo1319(): Int = 1321
+  def foo1320(): Int = 1322
+  def foo1321(): Int = 1323
+  def foo1322(): Int = 1324
+  def foo1323(): Int = 1325
+  def foo1324(): Int = 1326
+  def foo1325(): Int = 1327
+  def foo1326(): Int = 1328
+  def foo1327(): Int = 1329
+  def foo1328(): Int = 1330
+  def foo1329(): Int = 1331
+  def foo1330(): Int = 1332
+  def foo1331(): Int = 1333
+  def foo1332(): Int = 1334
+  def foo1333(): Int = 1335
+  def foo1334(): Int = 1336
+  def foo1335(): Int = 1337
+  def foo1336(): Int = 1338
+  def foo1337(): Int = 1339
+  def foo1338(): Int = 1340
+  def foo1339(): Int = 1341
+  def foo1340(): Int = 1342
+  def foo1341(): Int = 1343
+  def foo1342(): Int = 1344
+  def foo1343(): Int = 1345
+  def foo1344(): Int = 1346
+  def foo1345(): Int = 1347
+  def foo1346(): Int = 1348
+  def foo1347(): Int = 1349
+  def foo1348(): Int = 1350
+  def foo1349(): Int = 1351
+  def foo1350(): Int = 1352
+  def foo1351(): Int = 1353
+  def foo1352(): Int = 1354
+  def foo1353(): Int = 1355
+  def foo1354(): Int = 1356
+  def foo1355(): Int = 1357
+  def foo1356(): Int = 1358
+  def foo1357(): Int = 1359
+  def foo1358(): Int = 1360
+  def foo1359(): Int = 1361
+  def foo1360(): Int = 1362
+  def foo1361(): Int = 1363
+  def foo1362(): Int = 1364
+  def foo1363(): Int = 1365
+  def foo1364(): Int = 1366
+  def foo1365(): Int = 1367
+  def foo1366(): Int = 1368
+  def foo1367(): Int = 1369
+  def foo1368(): Int = 1370
+  def foo1369(): Int = 1371
+  def foo1370(): Int = 1372
+  def foo1371(): Int = 1373
+  def foo1372(): Int = 1374
+  def foo1373(): Int = 1375
+  def foo1374(): Int = 1376
+  def foo1375(): Int = 1377
+  def foo1376(): Int = 1378
+  def foo1377(): Int = 1379
+  def foo1378(): Int = 1380
+  def foo1379(): Int = 1381
+  def foo1380(): Int = 1382
+  def foo1381(): Int = 1383
+  def foo1382(): Int = 1384
+  def foo1383(): Int = 1385
+  def foo1384(): Int = 1386
+  def foo1385(): Int = 1387
+  def foo1386(): Int = 1388
+  def foo1387(): Int = 1389
+  def foo1388(): Int = 1390
+  def foo1389(): Int = 1391
+  def foo1390(): Int = 1392
+  def foo1391(): Int = 1393
+  def foo1392(): Int = 1394
+  def foo1393(): Int = 1395
+  def foo1394(): Int = 1396
+  def foo1395(): Int = 1397
+  def foo1396(): Int = 1398
+  def foo1397(): Int = 1399
+  def foo1398(): Int = 1400
+  def foo1399(): Int = 1401
+  def foo1400(): Int = 1402
+  def foo1401(): Int = 1403
+  def foo1402(): Int = 1404
+  def foo1403(): Int = 1405
+  def foo1404(): Int = 1406
+  def foo1405(): Int = 1407
+  def foo1406(): Int = 1408
+  def foo1407(): Int = 1409
+  def foo1408(): Int = 1410
+  def foo1409(): Int = 1411
+  def foo1410(): Int = 1412
+  def foo1411(): Int = 1413
+  def foo1412(): Int = 1414
+  def foo1413(): Int = 1415
+  def foo1414(): Int = 1416
+  def foo1415(): Int = 1417
+  def foo1416(): Int = 1418
+  def foo1417(): Int = 1419
+  def foo1418(): Int = 1420
+  def foo1419(): Int = 1421
+  def foo1420(): Int = 1422
+  def foo1421(): Int = 1423
+  def foo1422(): Int = 1424
+  def foo1423(): Int = 1425
+  def foo1424(): Int = 1426
+  def foo1425(): Int = 1427
+  def foo1426(): Int = 1428
+  def foo1427(): Int = 1429
+  def foo1428(): Int = 1430
+  def foo1429(): Int = 1431
+  def foo1430(): Int = 1432
+  def foo1431(): Int = 1433
+  def foo1432(): Int = 1434
+  def foo1433(): Int = 1435
+  def foo1434(): Int = 1436
+  def foo1435(): Int = 1437
+  def foo1436(): Int = 1438
+  def foo1437(): Int = 1439
+  def foo1438(): Int = 1440
+  def foo1439(): Int = 1441
+  def foo1440(): Int = 1442
+  def foo1441(): Int = 1443
+  def foo1442(): Int = 1444
+  def foo1443(): Int = 1445
+  def foo1444(): Int = 1446
+  def foo1445(): Int = 1447
+  def foo1446(): Int = 1448
+  def foo1447(): Int = 1449
+  def foo1448(): Int = 1450
+  def foo1449(): Int = 1451
+  def foo1450(): Int = 1452
+  def foo1451(): Int = 1453
+  def foo1452(): Int = 1454
+  def foo1453(): Int = 1455
+  def foo1454(): Int = 1456
+  def foo1455(): Int = 1457
+  def foo1456(): Int = 1458
+  def foo1457(): Int = 1459
+  def foo1458(): Int = 1460
+  def foo1459(): Int = 1461
+  def foo1460(): Int = 1462
+  def foo1461(): Int = 1463
+  def foo1462(): Int = 1464
+  def foo1463(): Int = 1465
+  def foo1464(): Int = 1466
+  def foo1465(): Int = 1467
+  def foo1466(): Int = 1468
+  def foo1467(): Int = 1469
+  def foo1468(): Int = 1470
+  def foo1469(): Int = 1471
+  def foo1470(): Int = 1472
+  def foo1471(): Int = 1473
+  def foo1472(): Int = 1474
+  def foo1473(): Int = 1475
+  def foo1474(): Int = 1476
+  def foo1475(): Int = 1477
+  def foo1476(): Int = 1478
+  def foo1477(): Int = 1479
+  def foo1478(): Int = 1480
+  def foo1479(): Int = 1481
+  def foo1480(): Int = 1482
+  def foo1481(): Int = 1483
+  def foo1482(): Int = 1484
+  def foo1483(): Int = 1485
+  def foo1484(): Int = 1486
+  def foo1485(): Int = 1487
+  def foo1486(): Int = 1488
+  def foo1487(): Int = 1489
+  def foo1488(): Int = 1490
+  def foo1489(): Int = 1491
+  def foo1490(): Int = 1492
+  def foo1491(): Int = 1493
+  def foo1492(): Int = 1494
+  def foo1493(): Int = 1495
+  def foo1494(): Int = 1496
+  def foo1495(): Int = 1497
+  def foo1496(): Int = 1498
+  def foo1497(): Int = 1499
+  def foo1498(): Int = 1500
+  def foo1499(): Int = 1501
+  def foo1500(): Int = 1502
+  def foo1501(): Int = 1503
+  def foo1502(): Int = 1504
+  def foo1503(): Int = 1505
+  def foo1504(): Int = 1506
+  def foo1505(): Int = 1507
+  def foo1506(): Int = 1508
+  def foo1507(): Int = 1509
+  def foo1508(): Int = 1510
+  def foo1509(): Int = 1511
+  def foo1510(): Int = 1512
+  def foo1511(): Int = 1513
+  def foo1512(): Int = 1514
+  def foo1513(): Int = 1515
+  def foo1514(): Int = 1516
+  def foo1515(): Int = 1517
+  def foo1516(): Int = 1518
+  def foo1517(): Int = 1519
+  def foo1518(): Int = 1520
+  def foo1519(): Int = 1521
+  def foo1520(): Int = 1522
+  def foo1521(): Int = 1523
+  def foo1522(): Int = 1524
+  def foo1523(): Int = 1525
+  def foo1524(): Int = 1526
+  def foo1525(): Int = 1527
+  def foo1526(): Int = 1528
+  def foo1527(): Int = 1529
+  def foo1528(): Int = 1530
+  def foo1529(): Int = 1531
+  def foo1530(): Int = 1532
+  def foo1531(): Int = 1533
+  def foo1532(): Int = 1534
+  def foo1533(): Int = 1535
+  def foo1534(): Int = 1536
+  def foo1535(): Int = 1537
+  def foo1536(): Int = 1538
+  def foo1537(): Int = 1539
+  def foo1538(): Int = 1540
+  def foo1539(): Int = 1541
+  def foo1540(): Int = 1542
+  def foo1541(): Int = 1543
+  def foo1542(): Int = 1544
+  def foo1543(): Int = 1545
+  def foo1544(): Int = 1546
+  def foo1545(): Int = 1547
+  def foo1546(): Int = 1548
+  def foo1547(): Int = 1549
+  def foo1548(): Int = 1550
+  def foo1549(): Int = 1551
+  def foo1550(): Int = 1552
+  def foo1551(): Int = 1553
+  def foo1552(): Int = 1554
+  def foo1553(): Int = 1555
+  def foo1554(): Int = 1556
+  def foo1555(): Int = 1557
+  def foo1556(): Int = 1558
+  def foo1557(): Int = 1559
+  def foo1558(): Int = 1560
+  def foo1559(): Int = 1561
+  def foo1560(): Int = 1562
+  def foo1561(): Int = 1563
+  def foo1562(): Int = 1564
+  def foo1563(): Int = 1565
+  def foo1564(): Int = 1566
+  def foo1565(): Int = 1567
+  def foo1566(): Int = 1568
+  def foo1567(): Int = 1569
+  def foo1568(): Int = 1570
+  def foo1569(): Int = 1571
+  def foo1570(): Int = 1572
+  def foo1571(): Int = 1573
+  def foo1572(): Int = 1574
+  def foo1573(): Int = 1575
+  def foo1574(): Int = 1576
+  def foo1575(): Int = 1577
+  def foo1576(): Int = 1578
+  def foo1577(): Int = 1579
+  def foo1578(): Int = 1580
+  def foo1579(): Int = 1581
+  def foo1580(): Int = 1582
+  def foo1581(): Int = 1583
+  def foo1582(): Int = 1584
+  def foo1583(): Int = 1585
+  def foo1584(): Int = 1586
+  def foo1585(): Int = 1587
+  def foo1586(): Int = 1588
+  def foo1587(): Int = 1589
+  def foo1588(): Int = 1590
+  def foo1589(): Int = 1591
+  def foo1590(): Int = 1592
+  def foo1591(): Int = 1593
+  def foo1592(): Int = 1594
+  def foo1593(): Int = 1595
+  def foo1594(): Int = 1596
+  def foo1595(): Int = 1597
+  def foo1596(): Int = 1598
+  def foo1597(): Int = 1599
+  def foo1598(): Int = 1600
+  def foo1599(): Int = 1601
+  def foo1600(): Int = 1602
+  def foo1601(): Int = 1603
+  def foo1602(): Int = 1604
+  def foo1603(): Int = 1605
+  def foo1604(): Int = 1606
+  def foo1605(): Int = 1607
+  def foo1606(): Int = 1608
+  def foo1607(): Int = 1609
+  def foo1608(): Int = 1610
+  def foo1609(): Int = 1611
+  def foo1610(): Int = 1612
+  def foo1611(): Int = 1613
+  def foo1612(): Int = 1614
+  def foo1613(): Int = 1615
+  def foo1614(): Int = 1616
+  def foo1615(): Int = 1617
+  def foo1616(): Int = 1618
+  def foo1617(): Int = 1619
+  def foo1618(): Int = 1620
+  def foo1619(): Int = 1621
+  def foo1620(): Int = 1622
+  def foo1621(): Int = 1623
+  def foo1622(): Int = 1624
+  def foo1623(): Int = 1625
+  def foo1624(): Int = 1626
+  def foo1625(): Int = 1627
+  def foo1626(): Int = 1628
+  def foo1627(): Int = 1629
+  def foo1628(): Int = 1630
+  def foo1629(): Int = 1631
+  def foo1630(): Int = 1632
+  def foo1631(): Int = 1633
+  def foo1632(): Int = 1634
+  def foo1633(): Int = 1635
+  def foo1634(): Int = 1636
+  def foo1635(): Int = 1637
+  def foo1636(): Int = 1638
+  def foo1637(): Int = 1639
+  def foo1638(): Int = 1640
+  def foo1639(): Int = 1641
+  def foo1640(): Int = 1642
+  def foo1641(): Int = 1643
+  def foo1642(): Int = 1644
+  def foo1643(): Int = 1645
+  def foo1644(): Int = 1646
+  def foo1645(): Int = 1647
+  def foo1646(): Int = 1648
+  def foo1647(): Int = 1649
+  def foo1648(): Int = 1650
+  def foo1649(): Int = 1651
+  def foo1650(): Int = 1652
+  def foo1651(): Int = 1653
+  def foo1652(): Int = 1654
+  def foo1653(): Int = 1655
+  def foo1654(): Int = 1656
+  def foo1655(): Int = 1657
+  def foo1656(): Int = 1658
+  def foo1657(): Int = 1659
+  def foo1658(): Int = 1660
+  def foo1659(): Int = 1661
+  def foo1660(): Int = 1662
+  def foo1661(): Int = 1663
+  def foo1662(): Int = 1664
+  def foo1663(): Int = 1665
+  def foo1664(): Int = 1666
+  def foo1665(): Int = 1667
+  def foo1666(): Int = 1668
+  def foo1667(): Int = 1669
+  def foo1668(): Int = 1670
+  def foo1669(): Int = 1671
+  def foo1670(): Int = 1672
+  def foo1671(): Int = 1673
+  def foo1672(): Int = 1674
+  def foo1673(): Int = 1675
+  def foo1674(): Int = 1676
+  def foo1675(): Int = 1677
+  def foo1676(): Int = 1678
+  def foo1677(): Int = 1679
+  def foo1678(): Int = 1680
+  def foo1679(): Int = 1681
+  def foo1680(): Int = 1682
+  def foo1681(): Int = 1683
+  def foo1682(): Int = 1684
+  def foo1683(): Int = 1685
+  def foo1684(): Int = 1686
+  def foo1685(): Int = 1687
+  def foo1686(): Int = 1688
+  def foo1687(): Int = 1689
+  def foo1688(): Int = 1690
+  def foo1689(): Int = 1691
+  def foo1690(): Int = 1692
+  def foo1691(): Int = 1693
+  def foo1692(): Int = 1694
+  def foo1693(): Int = 1695
+  def foo1694(): Int = 1696
+  def foo1695(): Int = 1697
+  def foo1696(): Int = 1698
+  def foo1697(): Int = 1699
+  def foo1698(): Int = 1700
+  def foo1699(): Int = 1701
+  def foo1700(): Int = 1702
+  def foo1701(): Int = 1703
+  def foo1702(): Int = 1704
+  def foo1703(): Int = 1705
+  def foo1704(): Int = 1706
+  def foo1705(): Int = 1707
+  def foo1706(): Int = 1708
+  def foo1707(): Int = 1709
+  def foo1708(): Int = 1710
+  def foo1709(): Int = 1711
+  def foo1710(): Int = 1712
+  def foo1711(): Int = 1713
+  def foo1712(): Int = 1714
+  def foo1713(): Int = 1715
+  def foo1714(): Int = 1716
+  def foo1715(): Int = 1717
+  def foo1716(): Int = 1718
+  def foo1717(): Int = 1719
+  def foo1718(): Int = 1720
+  def foo1719(): Int = 1721
+  def foo1720(): Int = 1722
+  def foo1721(): Int = 1723
+  def foo1722(): Int = 1724
+  def foo1723(): Int = 1725
+  def foo1724(): Int = 1726
+  def foo1725(): Int = 1727
+  def foo1726(): Int = 1728
+  def foo1727(): Int = 1729
+  def foo1728(): Int = 1730
+  def foo1729(): Int = 1731
+  def foo1730(): Int = 1732
+  def foo1731(): Int = 1733
+  def foo1732(): Int = 1734
+  def foo1733(): Int = 1735
+  def foo1734(): Int = 1736
+  def foo1735(): Int = 1737
+  def foo1736(): Int = 1738
+  def foo1737(): Int = 1739
+  def foo1738(): Int = 1740
+  def foo1739(): Int = 1741
+  def foo1740(): Int = 1742
+  def foo1741(): Int = 1743
+  def foo1742(): Int = 1744
+  def foo1743(): Int = 1745
+  def foo1744(): Int = 1746
+  def foo1745(): Int = 1747
+  def foo1746(): Int = 1748
+  def foo1747(): Int = 1749
+  def foo1748(): Int = 1750
+  def foo1749(): Int = 1751
+  def foo1750(): Int = 1752
+  def foo1751(): Int = 1753
+  def foo1752(): Int = 1754
+  def foo1753(): Int = 1755
+  def foo1754(): Int = 1756
+  def foo1755(): Int = 1757
+  def foo1756(): Int = 1758
+  def foo1757(): Int = 1759
+  def foo1758(): Int = 1760
+  def foo1759(): Int = 1761
+  def foo1760(): Int = 1762
+  def foo1761(): Int = 1763
+  def foo1762(): Int = 1764
+  def foo1763(): Int = 1765
+  def foo1764(): Int = 1766
+  def foo1765(): Int = 1767
+  def foo1766(): Int = 1768
+  def foo1767(): Int = 1769
+  def foo1768(): Int = 1770
+  def foo1769(): Int = 1771
+  def foo1770(): Int = 1772
+  def foo1771(): Int = 1773
+  def foo1772(): Int = 1774
+  def foo1773(): Int = 1775
+  def foo1774(): Int = 1776
+  def foo1775(): Int = 1777
+  def foo1776(): Int = 1778
+  def foo1777(): Int = 1779
+  def foo1778(): Int = 1780
+  def foo1779(): Int = 1781
+  def foo1780(): Int = 1782
+  def foo1781(): Int = 1783
+  def foo1782(): Int = 1784
+  def foo1783(): Int = 1785
+  def foo1784(): Int = 1786
+  def foo1785(): Int = 1787
+  def foo1786(): Int = 1788
+  def foo1787(): Int = 1789
+  def foo1788(): Int = 1790
+  def foo1789(): Int = 1791
+  def foo1790(): Int = 1792
+  def foo1791(): Int = 1793
+  def foo1792(): Int = 1794
+  def foo1793(): Int = 1795
+  def foo1794(): Int = 1796
+  def foo1795(): Int = 1797
+  def foo1796(): Int = 1798
+  def foo1797(): Int = 1799
+  def foo1798(): Int = 1800
+  def foo1799(): Int = 1801
+  def foo1800(): Int = 1802
+  def foo1801(): Int = 1803
+  def foo1802(): Int = 1804
+  def foo1803(): Int = 1805
+  def foo1804(): Int = 1806
+  def foo1805(): Int = 1807
+  def foo1806(): Int = 1808
+  def foo1807(): Int = 1809
+  def foo1808(): Int = 1810
+  def foo1809(): Int = 1811
+  def foo1810(): Int = 1812
+  def foo1811(): Int = 1813
+  def foo1812(): Int = 1814
+  def foo1813(): Int = 1815
+  def foo1814(): Int = 1816
+  def foo1815(): Int = 1817
+  def foo1816(): Int = 1818
+  def foo1817(): Int = 1819
+  def foo1818(): Int = 1820
+  def foo1819(): Int = 1821
+  def foo1820(): Int = 1822
+  def foo1821(): Int = 1823
+  def foo1822(): Int = 1824
+  def foo1823(): Int = 1825
+  def foo1824(): Int = 1826
+  def foo1825(): Int = 1827
+  def foo1826(): Int = 1828
+  def foo1827(): Int = 1829
+  def foo1828(): Int = 1830
+  def foo1829(): Int = 1831
+  def foo1830(): Int = 1832
+  def foo1831(): Int = 1833
+  def foo1832(): Int = 1834
+  def foo1833(): Int = 1835
+  def foo1834(): Int = 1836
+  def foo1835(): Int = 1837
+  def foo1836(): Int = 1838
+  def foo1837(): Int = 1839
+  def foo1838(): Int = 1840
+  def foo1839(): Int = 1841
+  def foo1840(): Int = 1842
+  def foo1841(): Int = 1843
+  def foo1842(): Int = 1844
+  def foo1843(): Int = 1845
+  def foo1844(): Int = 1846
+  def foo1845(): Int = 1847
+  def foo1846(): Int = 1848
+  def foo1847(): Int = 1849
+  def foo1848(): Int = 1850
+  def foo1849(): Int = 1851
+  def foo1850(): Int = 1852
+  def foo1851(): Int = 1853
+  def foo1852(): Int = 1854
+  def foo1853(): Int = 1855
+  def foo1854(): Int = 1856
+  def foo1855(): Int = 1857
+  def foo1856(): Int = 1858
+  def foo1857(): Int = 1859
+  def foo1858(): Int = 1860
+  def foo1859(): Int = 1861
+  def foo1860(): Int = 1862
+  def foo1861(): Int = 1863
+  def foo1862(): Int = 1864
+  def foo1863(): Int = 1865
+  def foo1864(): Int = 1866
+  def foo1865(): Int = 1867
+  def foo1866(): Int = 1868
+  def foo1867(): Int = 1869
+  def foo1868(): Int = 1870
+  def foo1869(): Int = 1871
+  def foo1870(): Int = 1872
+  def foo1871(): Int = 1873
+  def foo1872(): Int = 1874
+  def foo1873(): Int = 1875
+  def foo1874(): Int = 1876
+  def foo1875(): Int = 1877
+  def foo1876(): Int = 1878
+  def foo1877(): Int = 1879
+  def foo1878(): Int = 1880
+  def foo1879(): Int = 1881
+  def foo1880(): Int = 1882
+  def foo1881(): Int = 1883
+  def foo1882(): Int = 1884
+  def foo1883(): Int = 1885
+  def foo1884(): Int = 1886
+  def foo1885(): Int = 1887
+  def foo1886(): Int = 1888
+  def foo1887(): Int = 1889
+  def foo1888(): Int = 1890
+  def foo1889(): Int = 1891
+  def foo1890(): Int = 1892
+  def foo1891(): Int = 1893
+  def foo1892(): Int = 1894
+  def foo1893(): Int = 1895
+  def foo1894(): Int = 1896
+  def foo1895(): Int = 1897
+  def foo1896(): Int = 1898
+  def foo1897(): Int = 1899
+  def foo1898(): Int = 1900
+  def foo1899(): Int = 1901
+  def foo1900(): Int = 1902
+  def foo1901(): Int = 1903
+  def foo1902(): Int = 1904
+  def foo1903(): Int = 1905
+  def foo1904(): Int = 1906
+  def foo1905(): Int = 1907
+  def foo1906(): Int = 1908
+  def foo1907(): Int = 1909
+  def foo1908(): Int = 1910
+  def foo1909(): Int = 1911
+  def foo1910(): Int = 1912
+  def foo1911(): Int = 1913
+  def foo1912(): Int = 1914
+  def foo1913(): Int = 1915
+  def foo1914(): Int = 1916
+  def foo1915(): Int = 1917
+  def foo1916(): Int = 1918
+  def foo1917(): Int = 1919
+  def foo1918(): Int = 1920
+  def foo1919(): Int = 1921
+  def foo1920(): Int = 1922
+  def foo1921(): Int = 1923
+  def foo1922(): Int = 1924
+  def foo1923(): Int = 1925
+  def foo1924(): Int = 1926
+  def foo1925(): Int = 1927
+  def foo1926(): Int = 1928
+  def foo1927(): Int = 1929
+  def foo1928(): Int = 1930
+  def foo1929(): Int = 1931
+  def foo1930(): Int = 1932
+  def foo1931(): Int = 1933
+  def foo1932(): Int = 1934
+  def foo1933(): Int = 1935
+  def foo1934(): Int = 1936
+  def foo1935(): Int = 1937
+  def foo1936(): Int = 1938
+  def foo1937(): Int = 1939
+  def foo1938(): Int = 1940
+  def foo1939(): Int = 1941
+  def foo1940(): Int = 1942
+  def foo1941(): Int = 1943
+  def foo1942(): Int = 1944
+  def foo1943(): Int = 1945
+  def foo1944(): Int = 1946
+  def foo1945(): Int = 1947
+  def foo1946(): Int = 1948
+  def foo1947(): Int = 1949
+  def foo1948(): Int = 1950
+  def foo1949(): Int = 1951
+  def foo1950(): Int = 1952
+  def foo1951(): Int = 1953
+  def foo1952(): Int = 1954
+  def foo1953(): Int = 1955
+  def foo1954(): Int = 1956
+  def foo1955(): Int = 1957
+  def foo1956(): Int = 1958
+  def foo1957(): Int = 1959
+  def foo1958(): Int = 1960
+  def foo1959(): Int = 1961
+  def foo1960(): Int = 1962
+  def foo1961(): Int = 1963
+  def foo1962(): Int = 1964
+  def foo1963(): Int = 1965
+  def foo1964(): Int = 1966
+  def foo1965(): Int = 1967
+  def foo1966(): Int = 1968
+  def foo1967(): Int = 1969
+  def foo1968(): Int = 1970
+  def foo1969(): Int = 1971
+  def foo1970(): Int = 1972
+  def foo1971(): Int = 1973
+  def foo1972(): Int = 1974
+  def foo1973(): Int = 1975
+  def foo1974(): Int = 1976
+  def foo1975(): Int = 1977
+  def foo1976(): Int = 1978
+  def foo1977(): Int = 1979
+  def foo1978(): Int = 1980
+  def foo1979(): Int = 1981
+  def foo1980(): Int = 1982
+  def foo1981(): Int = 1983
+  def foo1982(): Int = 1984
+  def foo1983(): Int = 1985
+  def foo1984(): Int = 1986
+  def foo1985(): Int = 1987
+  def foo1986(): Int = 1988
+  def foo1987(): Int = 1989
+  def foo1988(): Int = 1990
+  def foo1989(): Int = 1991
+  def foo1990(): Int = 1992
+  def foo1991(): Int = 1993
+  def foo1992(): Int = 1994
+  def foo1993(): Int = 1995
+  def foo1994(): Int = 1996
+  def foo1995(): Int = 1997
+  def foo1996(): Int = 1998
+  def foo1997(): Int = 1999
+  def foo1998(): Int = 2000
+  def foo1999(): Int = 2001
+  def foo2000(): Int = 2002
+  def foo2001(): Int = 2003
+  def foo2002(): Int = 2004
+  def foo2003(): Int = 2005
+  def foo2004(): Int = 2006
+  def foo2005(): Int = 2007
+  def foo2006(): Int = 2008
+  def foo2007(): Int = 2009
+  def foo2008(): Int = 2010
+  def foo2009(): Int = 2011
+  def foo2010(): Int = 2012
+  def foo2011(): Int = 2013
+  def foo2012(): Int = 2014
+  def foo2013(): Int = 2015
+  def foo2014(): Int = 2016
+  def foo2015(): Int = 2017
+  def foo2016(): Int = 2018
+  def foo2017(): Int = 2019
+  def foo2018(): Int = 2020
+  def foo2019(): Int = 2021
+  def foo2020(): Int = 2022
+  def foo2021(): Int = 2023
+  def foo2022(): Int = 2024
+  def foo2023(): Int = 2025
+  def foo2024(): Int = 2026
+  def foo2025(): Int = 2027
+  def foo2026(): Int = 2028
+  def foo2027(): Int = 2029
+  def foo2028(): Int = 2030
+  def foo2029(): Int = 2031
+  def foo2030(): Int = 2032
+  def foo2031(): Int = 2033
+  def foo2032(): Int = 2034
+  def foo2033(): Int = 2035
+  def foo2034(): Int = 2036
+  def foo2035(): Int = 2037
+  def foo2036(): Int = 2038
+  def foo2037(): Int = 2039
+  def foo2038(): Int = 2040
+  def foo2039(): Int = 2041
+  def foo2040(): Int = 2042
+  def foo2041(): Int = 2043
+  def foo2042(): Int = 2044
+  def foo2043(): Int = 2045
+  def foo2044(): Int = 2046
+  def foo2045(): Int = 2047
+  def foo2046(): Int = 2048
+  def foo2047(): Int = 2049
+  def foo2048(): Int = 2050
+  def foo2049(): Int = 2051
+  def foo2050(): Int = 2052
+  def foo2051(): Int = 2053
+  def foo2052(): Int = 2054
+  def foo2053(): Int = 2055
+  def foo2054(): Int = 2056
+  def foo2055(): Int = 2057
+  def foo2056(): Int = 2058
+  def foo2057(): Int = 2059
+  def foo2058(): Int = 2060
+  def foo2059(): Int = 2061
+  def foo2060(): Int = 2062
+  def foo2061(): Int = 2063
+  def foo2062(): Int = 2064
+  def foo2063(): Int = 2065
+  def foo2064(): Int = 2066
+  def foo2065(): Int = 2067
+  def foo2066(): Int = 2068
+  def foo2067(): Int = 2069
+  def foo2068(): Int = 2070
+  def foo2069(): Int = 2071
+  def foo2070(): Int = 2072
+  def foo2071(): Int = 2073
+  def foo2072(): Int = 2074
+  def foo2073(): Int = 2075
+  def foo2074(): Int = 2076
+  def foo2075(): Int = 2077
+  def foo2076(): Int = 2078
+  def foo2077(): Int = 2079
+  def foo2078(): Int = 2080
+  def foo2079(): Int = 2081
+  def foo2080(): Int = 2082
+  def foo2081(): Int = 2083
+  def foo2082(): Int = 2084
+  def foo2083(): Int = 2085
+  def foo2084(): Int = 2086
+  def foo2085(): Int = 2087
+  def foo2086(): Int = 2088
+  def foo2087(): Int = 2089
+  def foo2088(): Int = 2090
+  def foo2089(): Int = 2091
+  def foo2090(): Int = 2092
+  def foo2091(): Int = 2093
+  def foo2092(): Int = 2094
+  def foo2093(): Int = 2095
+  def foo2094(): Int = 2096
+  def foo2095(): Int = 2097
+  def foo2096(): Int = 2098
+  def foo2097(): Int = 2099
+  def foo2098(): Int = 2100
+  def foo2099(): Int = 2101
+  def foo2100(): Int = 2102
+  def foo2101(): Int = 2103
+  def foo2102(): Int = 2104
+  def foo2103(): Int = 2105
+  def foo2104(): Int = 2106
+  def foo2105(): Int = 2107
+  def foo2106(): Int = 2108
+  def foo2107(): Int = 2109
+  def foo2108(): Int = 2110
+  def foo2109(): Int = 2111
+  def foo2110(): Int = 2112
+  def foo2111(): Int = 2113
+  def foo2112(): Int = 2114
+  def foo2113(): Int = 2115
+  def foo2114(): Int = 2116
+  def foo2115(): Int = 2117
+  def foo2116(): Int = 2118
+  def foo2117(): Int = 2119
+  def foo2118(): Int = 2120
+  def foo2119(): Int = 2121
+  def foo2120(): Int = 2122
+  def foo2121(): Int = 2123
+  def foo2122(): Int = 2124
+  def foo2123(): Int = 2125
+  def foo2124(): Int = 2126
+  def foo2125(): Int = 2127
+  def foo2126(): Int = 2128
+  def foo2127(): Int = 2129
+  def foo2128(): Int = 2130
+  def foo2129(): Int = 2131
+  def foo2130(): Int = 2132
+  def foo2131(): Int = 2133
+  def foo2132(): Int = 2134
+  def foo2133(): Int = 2135
+  def foo2134(): Int = 2136
+  def foo2135(): Int = 2137
+  def foo2136(): Int = 2138
+  def foo2137(): Int = 2139
+  def foo2138(): Int = 2140
+  def foo2139(): Int = 2141
+  def foo2140(): Int = 2142
+  def foo2141(): Int = 2143
+  def foo2142(): Int = 2144
+  def foo2143(): Int = 2145
+  def foo2144(): Int = 2146
+  def foo2145(): Int = 2147
+  def foo2146(): Int = 2148
+  def foo2147(): Int = 2149
+  def foo2148(): Int = 2150
+  def foo2149(): Int = 2151
+  def foo2150(): Int = 2152
+  def foo2151(): Int = 2153
+  def foo2152(): Int = 2154
+  def foo2153(): Int = 2155
+  def foo2154(): Int = 2156
+  def foo2155(): Int = 2157
+  def foo2156(): Int = 2158
+  def foo2157(): Int = 2159
+  def foo2158(): Int = 2160
+  def foo2159(): Int = 2161
+  def foo2160(): Int = 2162
+  def foo2161(): Int = 2163
+  def foo2162(): Int = 2164
+  def foo2163(): Int = 2165
+  def foo2164(): Int = 2166
+  def foo2165(): Int = 2167
+  def foo2166(): Int = 2168
+  def foo2167(): Int = 2169
+  def foo2168(): Int = 2170
+  def foo2169(): Int = 2171
+  def foo2170(): Int = 2172
+  def foo2171(): Int = 2173
+  def foo2172(): Int = 2174
+  def foo2173(): Int = 2175
+  def foo2174(): Int = 2176
+  def foo2175(): Int = 2177
+  def foo2176(): Int = 2178
+  def foo2177(): Int = 2179
+  def foo2178(): Int = 2180
+  def foo2179(): Int = 2181
+  def foo2180(): Int = 2182
+  def foo2181(): Int = 2183
+  def foo2182(): Int = 2184
+  def foo2183(): Int = 2185
+  def foo2184(): Int = 2186
+  def foo2185(): Int = 2187
+  def foo2186(): Int = 2188
+  def foo2187(): Int = 2189
+  def foo2188(): Int = 2190
+  def foo2189(): Int = 2191
+  def foo2190(): Int = 2192
+  def foo2191(): Int = 2193
+  def foo2192(): Int = 2194
+  def foo2193(): Int = 2195
+  def foo2194(): Int = 2196
+  def foo2195(): Int = 2197
+  def foo2196(): Int = 2198
+  def foo2197(): Int = 2199
+  def foo2198(): Int = 2200
+  def foo2199(): Int = 2201
+  def foo2200(): Int = 2202
+  def foo2201(): Int = 2203
+  def foo2202(): Int = 2204
+  def foo2203(): Int = 2205
+  def foo2204(): Int = 2206
+  def foo2205(): Int = 2207
+  def foo2206(): Int = 2208
+  def foo2207(): Int = 2209
+  def foo2208(): Int = 2210
+  def foo2209(): Int = 2211
+  def foo2210(): Int = 2212
+  def foo2211(): Int = 2213
+  def foo2212(): Int = 2214
+  def foo2213(): Int = 2215
+  def foo2214(): Int = 2216
+  def foo2215(): Int = 2217
+  def foo2216(): Int = 2218
+  def foo2217(): Int = 2219
+  def foo2218(): Int = 2220
+  def foo2219(): Int = 2221
+  def foo2220(): Int = 2222
+  def foo2221(): Int = 2223
+  def foo2222(): Int = 2224
+  def foo2223(): Int = 2225
+  def foo2224(): Int = 2226
+  def foo2225(): Int = 2227
+  def foo2226(): Int = 2228
+  def foo2227(): Int = 2229
+  def foo2228(): Int = 2230
+  def foo2229(): Int = 2231
+  def foo2230(): Int = 2232
+  def foo2231(): Int = 2233
+  def foo2232(): Int = 2234
+  def foo2233(): Int = 2235
+  def foo2234(): Int = 2236
+  def foo2235(): Int = 2237
+  def foo2236(): Int = 2238
+  def foo2237(): Int = 2239
+  def foo2238(): Int = 2240
+  def foo2239(): Int = 2241
+  def foo2240(): Int = 2242
+  def foo2241(): Int = 2243
+  def foo2242(): Int = 2244
+  def foo2243(): Int = 2245
+  def foo2244(): Int = 2246
+  def foo2245(): Int = 2247
+  def foo2246(): Int = 2248
+  def foo2247(): Int = 2249
+  def foo2248(): Int = 2250
+  def foo2249(): Int = 2251
+  def foo2250(): Int = 2252
+  def foo2251(): Int = 2253
+  def foo2252(): Int = 2254
+  def foo2253(): Int = 2255
+  def foo2254(): Int = 2256
+  def foo2255(): Int = 2257
+  def foo2256(): Int = 2258
+  def foo2257(): Int = 2259
+  def foo2258(): Int = 2260
+  def foo2259(): Int = 2261
+  def foo2260(): Int = 2262
+  def foo2261(): Int = 2263
+  def foo2262(): Int = 2264
+  def foo2263(): Int = 2265
+  def foo2264(): Int = 2266
+  def foo2265(): Int = 2267
+  def foo2266(): Int = 2268
+  def foo2267(): Int = 2269
+  def foo2268(): Int = 2270
+  def foo2269(): Int = 2271
+  def foo2270(): Int = 2272
+  def foo2271(): Int = 2273
+  def foo2272(): Int = 2274
+  def foo2273(): Int = 2275
+  def foo2274(): Int = 2276
+  def foo2275(): Int = 2277
+  def foo2276(): Int = 2278
+  def foo2277(): Int = 2279
+  def foo2278(): Int = 2280
+  def foo2279(): Int = 2281
+  def foo2280(): Int = 2282
+  def foo2281(): Int = 2283
+  def foo2282(): Int = 2284
+  def foo2283(): Int = 2285
+  def foo2284(): Int = 2286
+  def foo2285(): Int = 2287
+  def foo2286(): Int = 2288
+  def foo2287(): Int = 2289
+  def foo2288(): Int = 2290
+  def foo2289(): Int = 2291
+  def foo2290(): Int = 2292
+  def foo2291(): Int = 2293
+  def foo2292(): Int = 2294
+  def foo2293(): Int = 2295
+  def foo2294(): Int = 2296
+  def foo2295(): Int = 2297
+  def foo2296(): Int = 2298
+  def foo2297(): Int = 2299
+  def foo2298(): Int = 2300
+  def foo2299(): Int = 2301
+  def foo2300(): Int = 2302
+  def foo2301(): Int = 2303
+  def foo2302(): Int = 2304
+  def foo2303(): Int = 2305
+  def foo2304(): Int = 2306
+  def foo2305(): Int = 2307
+  def foo2306(): Int = 2308
+  def foo2307(): Int = 2309
+  def foo2308(): Int = 2310
+  def foo2309(): Int = 2311
+  def foo2310(): Int = 2312
+  def foo2311(): Int = 2313
+  def foo2312(): Int = 2314
+  def foo2313(): Int = 2315
+  def foo2314(): Int = 2316
+  def foo2315(): Int = 2317
+  def foo2316(): Int = 2318
+  def foo2317(): Int = 2319
+  def foo2318(): Int = 2320
+  def foo2319(): Int = 2321
+  def foo2320(): Int = 2322
+  def foo2321(): Int = 2323
+  def foo2322(): Int = 2324
+  def foo2323(): Int = 2325
+  def foo2324(): Int = 2326
+  def foo2325(): Int = 2327
+  def foo2326(): Int = 2328
+  def foo2327(): Int = 2329
+  def foo2328(): Int = 2330
+  def foo2329(): Int = 2331
+  def foo2330(): Int = 2332
+  def foo2331(): Int = 2333
+  def foo2332(): Int = 2334
+  def foo2333(): Int = 2335
+  def foo2334(): Int = 2336
+  def foo2335(): Int = 2337
+  def foo2336(): Int = 2338
+  def foo2337(): Int = 2339
+  def foo2338(): Int = 2340
+  def foo2339(): Int = 2341
+  def foo2340(): Int = 2342
+  def foo2341(): Int = 2343
+  def foo2342(): Int = 2344
+  def foo2343(): Int = 2345
+  def foo2344(): Int = 2346
+  def foo2345(): Int = 2347
+  def foo2346(): Int = 2348
+  def foo2347(): Int = 2349
+  def foo2348(): Int = 2350
+  def foo2349(): Int = 2351
+  def foo2350(): Int = 2352
+  def foo2351(): Int = 2353
+  def foo2352(): Int = 2354
+  def foo2353(): Int = 2355
+  def foo2354(): Int = 2356
+  def foo2355(): Int = 2357
+  def foo2356(): Int = 2358
+  def foo2357(): Int = 2359
+  def foo2358(): Int = 2360
+  def foo2359(): Int = 2361
+  def foo2360(): Int = 2362
+  def foo2361(): Int = 2363
+  def foo2362(): Int = 2364
+  def foo2363(): Int = 2365
+  def foo2364(): Int = 2366
+  def foo2365(): Int = 2367
+  def foo2366(): Int = 2368
+  def foo2367(): Int = 2369
+  def foo2368(): Int = 2370
+  def foo2369(): Int = 2371
+  def foo2370(): Int = 2372
+  def foo2371(): Int = 2373
+  def foo2372(): Int = 2374
+  def foo2373(): Int = 2375
+  def foo2374(): Int = 2376
+  def foo2375(): Int = 2377
+  def foo2376(): Int = 2378
+  def foo2377(): Int = 2379
+  def foo2378(): Int = 2380
+  def foo2379(): Int = 2381
+  def foo2380(): Int = 2382
+  def foo2381(): Int = 2383
+  def foo2382(): Int = 2384
+  def foo2383(): Int = 2385
+  def foo2384(): Int = 2386
+  def foo2385(): Int = 2387
+  def foo2386(): Int = 2388
+  def foo2387(): Int = 2389
+  def foo2388(): Int = 2390
+  def foo2389(): Int = 2391
+  def foo2390(): Int = 2392
+  def foo2391(): Int = 2393
+  def foo2392(): Int = 2394
+  def foo2393(): Int = 2395
+  def foo2394(): Int = 2396
+  def foo2395(): Int = 2397
+  def foo2396(): Int = 2398
+  def foo2397(): Int = 2399
+  def foo2398(): Int = 2400
+  def foo2399(): Int = 2401
+  def foo2400(): Int = 2402
+  def foo2401(): Int = 2403
+  def foo2402(): Int = 2404
+  def foo2403(): Int = 2405
+  def foo2404(): Int = 2406
+  def foo2405(): Int = 2407
+  def foo2406(): Int = 2408
+  def foo2407(): Int = 2409
+  def foo2408(): Int = 2410
+  def foo2409(): Int = 2411
+  def foo2410(): Int = 2412
+  def foo2411(): Int = 2413
+  def foo2412(): Int = 2414
+  def foo2413(): Int = 2415
+  def foo2414(): Int = 2416
+  def foo2415(): Int = 2417
+  def foo2416(): Int = 2418
+  def foo2417(): Int = 2419
+  def foo2418(): Int = 2420
+  def foo2419(): Int = 2421
+  def foo2420(): Int = 2422
+  def foo2421(): Int = 2423
+  def foo2422(): Int = 2424
+  def foo2423(): Int = 2425
+  def foo2424(): Int = 2426
+  def foo2425(): Int = 2427
+  def foo2426(): Int = 2428
+  def foo2427(): Int = 2429
+  def foo2428(): Int = 2430
+  def foo2429(): Int = 2431
+  def foo2430(): Int = 2432
+  def foo2431(): Int = 2433
+  def foo2432(): Int = 2434
+  def foo2433(): Int = 2435
+  def foo2434(): Int = 2436
+  def foo2435(): Int = 2437
+  def foo2436(): Int = 2438
+  def foo2437(): Int = 2439
+  def foo2438(): Int = 2440
+  def foo2439(): Int = 2441
+  def foo2440(): Int = 2442
+  def foo2441(): Int = 2443
+  def foo2442(): Int = 2444
+  def foo2443(): Int = 2445
+  def foo2444(): Int = 2446
+  def foo2445(): Int = 2447
+  def foo2446(): Int = 2448
+  def foo2447(): Int = 2449
+  def foo2448(): Int = 2450
+  def foo2449(): Int = 2451
+  def foo2450(): Int = 2452
+  def foo2451(): Int = 2453
+  def foo2452(): Int = 2454
+  def foo2453(): Int = 2455
+  def foo2454(): Int = 2456
+  def foo2455(): Int = 2457
+  def foo2456(): Int = 2458
+  def foo2457(): Int = 2459
+  def foo2458(): Int = 2460
+  def foo2459(): Int = 2461
+  def foo2460(): Int = 2462
+  def foo2461(): Int = 2463
+  def foo2462(): Int = 2464
+  def foo2463(): Int = 2465
+  def foo2464(): Int = 2466
+  def foo2465(): Int = 2467
+  def foo2466(): Int = 2468
+  def foo2467(): Int = 2469
+  def foo2468(): Int = 2470
+  def foo2469(): Int = 2471
+  def foo2470(): Int = 2472
+  def foo2471(): Int = 2473
+  def foo2472(): Int = 2474
+  def foo2473(): Int = 2475
+  def foo2474(): Int = 2476
+  def foo2475(): Int = 2477
+  def foo2476(): Int = 2478
+  def foo2477(): Int = 2479
+  def foo2478(): Int = 2480
+  def foo2479(): Int = 2481
+  def foo2480(): Int = 2482
+  def foo2481(): Int = 2483
+  def foo2482(): Int = 2484
+  def foo2483(): Int = 2485
+  def foo2484(): Int = 2486
+  def foo2485(): Int = 2487
+  def foo2486(): Int = 2488
+  def foo2487(): Int = 2489
+  def foo2488(): Int = 2490
+  def foo2489(): Int = 2491
+  def foo2490(): Int = 2492
+  def foo2491(): Int = 2493
+  def foo2492(): Int = 2494
+  def foo2493(): Int = 2495
+  def foo2494(): Int = 2496
+  def foo2495(): Int = 2497
+  def foo2496(): Int = 2498
+  def foo2497(): Int = 2499
+  def foo2498(): Int = 2500
+  def foo2499(): Int = 2501
+  def foo2500(): Int = 2502
+  def foo2501(): Int = 2503
+  def foo2502(): Int = 2504
+  def foo2503(): Int = 2505
+  def foo2504(): Int = 2506
+  def foo2505(): Int = 2507
+  def foo2506(): Int = 2508
+  def foo2507(): Int = 2509
+  def foo2508(): Int = 2510
+  def foo2509(): Int = 2511
+  def foo2510(): Int = 2512
+  def foo2511(): Int = 2513
+  def foo2512(): Int = 2514
+  def foo2513(): Int = 2515
+  def foo2514(): Int = 2516
+  def foo2515(): Int = 2517
+  def foo2516(): Int = 2518
+  def foo2517(): Int = 2519
+  def foo2518(): Int = 2520
+  def foo2519(): Int = 2521
+  def foo2520(): Int = 2522
+  def foo2521(): Int = 2523
+  def foo2522(): Int = 2524
+  def foo2523(): Int = 2525
+  def foo2524(): Int = 2526
+  def foo2525(): Int = 2527
+  def foo2526(): Int = 2528
+  def foo2527(): Int = 2529
+  def foo2528(): Int = 2530
+  def foo2529(): Int = 2531
+  def foo2530(): Int = 2532
+  def foo2531(): Int = 2533
+  def foo2532(): Int = 2534
+  def foo2533(): Int = 2535
+  def foo2534(): Int = 2536
+  def foo2535(): Int = 2537
+  def foo2536(): Int = 2538
+  def foo2537(): Int = 2539
+  def foo2538(): Int = 2540
+  def foo2539(): Int = 2541
+  def foo2540(): Int = 2542
+  def foo2541(): Int = 2543
+  def foo2542(): Int = 2544
+  def foo2543(): Int = 2545
+  def foo2544(): Int = 2546
+  def foo2545(): Int = 2547
+  def foo2546(): Int = 2548
+  def foo2547(): Int = 2549
+  def foo2548(): Int = 2550
+  def foo2549(): Int = 2551
+  def foo2550(): Int = 2552
+  def foo2551(): Int = 2553
+  def foo2552(): Int = 2554
+  def foo2553(): Int = 2555
+  def foo2554(): Int = 2556
+  def foo2555(): Int = 2557
+  def foo2556(): Int = 2558
+  def foo2557(): Int = 2559
+  def foo2558(): Int = 2560
+  def foo2559(): Int = 2561
+  def foo2560(): Int = 2562
+  def foo2561(): Int = 2563
+  def foo2562(): Int = 2564
+  def foo2563(): Int = 2565
+  def foo2564(): Int = 2566
+  def foo2565(): Int = 2567
+  def foo2566(): Int = 2568
+  def foo2567(): Int = 2569
+  def foo2568(): Int = 2570
+  def foo2569(): Int = 2571
+  def foo2570(): Int = 2572
+  def foo2571(): Int = 2573
+  def foo2572(): Int = 2574
+  def foo2573(): Int = 2575
+  def foo2574(): Int = 2576
+  def foo2575(): Int = 2577
+  def foo2576(): Int = 2578
+  def foo2577(): Int = 2579
+  def foo2578(): Int = 2580
+  def foo2579(): Int = 2581
+  def foo2580(): Int = 2582
+  def foo2581(): Int = 2583
+  def foo2582(): Int = 2584
+  def foo2583(): Int = 2585
+  def foo2584(): Int = 2586
+  def foo2585(): Int = 2587
+  def foo2586(): Int = 2588
+  def foo2587(): Int = 2589
+  def foo2588(): Int = 2590
+  def foo2589(): Int = 2591
+  def foo2590(): Int = 2592
+  def foo2591(): Int = 2593
+  def foo2592(): Int = 2594
+  def foo2593(): Int = 2595
+  def foo2594(): Int = 2596
+  def foo2595(): Int = 2597
+  def foo2596(): Int = 2598
+  def foo2597(): Int = 2599
+  def foo2598(): Int = 2600
+  def foo2599(): Int = 2601
+  def foo2600(): Int = 2602
+  def foo2601(): Int = 2603
+  def foo2602(): Int = 2604
+  def foo2603(): Int = 2605
+  def foo2604(): Int = 2606
+  def foo2605(): Int = 2607
+  def foo2606(): Int = 2608
+  def foo2607(): Int = 2609
+  def foo2608(): Int = 2610
+  def foo2609(): Int = 2611
+  def foo2610(): Int = 2612
+  def foo2611(): Int = 2613
+  def foo2612(): Int = 2614
+  def foo2613(): Int = 2615
+  def foo2614(): Int = 2616
+  def foo2615(): Int = 2617
+  def foo2616(): Int = 2618
+  def foo2617(): Int = 2619
+  def foo2618(): Int = 2620
+  def foo2619(): Int = 2621
+  def foo2620(): Int = 2622
+  def foo2621(): Int = 2623
+  def foo2622(): Int = 2624
+  def foo2623(): Int = 2625
+  def foo2624(): Int = 2626
+  def foo2625(): Int = 2627
+  def foo2626(): Int = 2628
+  def foo2627(): Int = 2629
+  def foo2628(): Int = 2630
+  def foo2629(): Int = 2631
+  def foo2630(): Int = 2632
+  def foo2631(): Int = 2633
+  def foo2632(): Int = 2634
+  def foo2633(): Int = 2635
+  def foo2634(): Int = 2636
+  def foo2635(): Int = 2637
+  def foo2636(): Int = 2638
+  def foo2637(): Int = 2639
+  def foo2638(): Int = 2640
+  def foo2639(): Int = 2641
+  def foo2640(): Int = 2642
+  def foo2641(): Int = 2643
+  def foo2642(): Int = 2644
+  def foo2643(): Int = 2645
+  def foo2644(): Int = 2646
+  def foo2645(): Int = 2647
+  def foo2646(): Int = 2648
+  def foo2647(): Int = 2649
+  def foo2648(): Int = 2650
+  def foo2649(): Int = 2651
+  def foo2650(): Int = 2652
+  def foo2651(): Int = 2653
+  def foo2652(): Int = 2654
+  def foo2653(): Int = 2655
+  def foo2654(): Int = 2656
+  def foo2655(): Int = 2657
+  def foo2656(): Int = 2658
+  def foo2657(): Int = 2659
+  def foo2658(): Int = 2660
+  def foo2659(): Int = 2661
+  def foo2660(): Int = 2662
+  def foo2661(): Int = 2663
+  def foo2662(): Int = 2664
+  def foo2663(): Int = 2665
+  def foo2664(): Int = 2666
+  def foo2665(): Int = 2667
+  def foo2666(): Int = 2668
+  def foo2667(): Int = 2669
+  def foo2668(): Int = 2670
+  def foo2669(): Int = 2671
+  def foo2670(): Int = 2672
+  def foo2671(): Int = 2673
+  def foo2672(): Int = 2674
+  def foo2673(): Int = 2675
+  def foo2674(): Int = 2676
+  def foo2675(): Int = 2677
+  def foo2676(): Int = 2678
+  def foo2677(): Int = 2679
+  def foo2678(): Int = 2680
+  def foo2679(): Int = 2681
+  def foo2680(): Int = 2682
+  def foo2681(): Int = 2683
+  def foo2682(): Int = 2684
+  def foo2683(): Int = 2685
+  def foo2684(): Int = 2686
+  def foo2685(): Int = 2687
+  def foo2686(): Int = 2688
+  def foo2687(): Int = 2689
+  def foo2688(): Int = 2690
+  def foo2689(): Int = 2691
+  def foo2690(): Int = 2692
+  def foo2691(): Int = 2693
+  def foo2692(): Int = 2694
+  def foo2693(): Int = 2695
+  def foo2694(): Int = 2696
+  def foo2695(): Int = 2697
+  def foo2696(): Int = 2698
+  def foo2697(): Int = 2699
+  def foo2698(): Int = 2700
+  def foo2699(): Int = 2701
+  def foo2700(): Int = 2702
+  def foo2701(): Int = 2703
+  def foo2702(): Int = 2704
+  def foo2703(): Int = 2705
+  def foo2704(): Int = 2706
+  def foo2705(): Int = 2707
+  def foo2706(): Int = 2708
+  def foo2707(): Int = 2709
+  def foo2708(): Int = 2710
+  def foo2709(): Int = 2711
+  def foo2710(): Int = 2712
+  def foo2711(): Int = 2713
+  def foo2712(): Int = 2714
+  def foo2713(): Int = 2715
+  def foo2714(): Int = 2716
+  def foo2715(): Int = 2717
+  def foo2716(): Int = 2718
+  def foo2717(): Int = 2719
+  def foo2718(): Int = 2720
+  def foo2719(): Int = 2721
+  def foo2720(): Int = 2722
+  def foo2721(): Int = 2723
+  def foo2722(): Int = 2724
+  def foo2723(): Int = 2725
+  def foo2724(): Int = 2726
+  def foo2725(): Int = 2727
+  def foo2726(): Int = 2728
+  def foo2727(): Int = 2729
+  def foo2728(): Int = 2730
+  def foo2729(): Int = 2731
+  def foo2730(): Int = 2732
+  def foo2731(): Int = 2733
+  def foo2732(): Int = 2734
+  def foo2733(): Int = 2735
+  def foo2734(): Int = 2736
+  def foo2735(): Int = 2737
+  def foo2736(): Int = 2738
+  def foo2737(): Int = 2739
+  def foo2738(): Int = 2740
+  def foo2739(): Int = 2741
+  def foo2740(): Int = 2742
+  def foo2741(): Int = 2743
+  def foo2742(): Int = 2744
+  def foo2743(): Int = 2745
+  def foo2744(): Int = 2746
+  def foo2745(): Int = 2747
+  def foo2746(): Int = 2748
+  def foo2747(): Int = 2749
+  def foo2748(): Int = 2750
+  def foo2749(): Int = 2751
+  def foo2750(): Int = 2752
+  def foo2751(): Int = 2753
+  def foo2752(): Int = 2754
+  def foo2753(): Int = 2755
+  def foo2754(): Int = 2756
+  def foo2755(): Int = 2757
+  def foo2756(): Int = 2758
+  def foo2757(): Int = 2759
+  def foo2758(): Int = 2760
+  def foo2759(): Int = 2761
+  def foo2760(): Int = 2762
+  def foo2761(): Int = 2763
+  def foo2762(): Int = 2764
+  def foo2763(): Int = 2765
+  def foo2764(): Int = 2766
+  def foo2765(): Int = 2767
+  def foo2766(): Int = 2768
+  def foo2767(): Int = 2769
+  def foo2768(): Int = 2770
+  def foo2769(): Int = 2771
+  def foo2770(): Int = 2772
+  def foo2771(): Int = 2773
+  def foo2772(): Int = 2774
+  def foo2773(): Int = 2775
+  def foo2774(): Int = 2776
+  def foo2775(): Int = 2777
+  def foo2776(): Int = 2778
+  def foo2777(): Int = 2779
+  def foo2778(): Int = 2780
+  def foo2779(): Int = 2781
+  def foo2780(): Int = 2782
+  def foo2781(): Int = 2783
+  def foo2782(): Int = 2784
+  def foo2783(): Int = 2785
+  def foo2784(): Int = 2786
+  def foo2785(): Int = 2787
+  def foo2786(): Int = 2788
+  def foo2787(): Int = 2789
+  def foo2788(): Int = 2790
+  def foo2789(): Int = 2791
+  def foo2790(): Int = 2792
+  def foo2791(): Int = 2793
+  def foo2792(): Int = 2794
+  def foo2793(): Int = 2795
+  def foo2794(): Int = 2796
+  def foo2795(): Int = 2797
+  def foo2796(): Int = 2798
+  def foo2797(): Int = 2799
+  def foo2798(): Int = 2800
+  def foo2799(): Int = 2801
+  def foo2800(): Int = 2802
+  def foo2801(): Int = 2803
+  def foo2802(): Int = 2804
+  def foo2803(): Int = 2805
+  def foo2804(): Int = 2806
+  def foo2805(): Int = 2807
+  def foo2806(): Int = 2808
+  def foo2807(): Int = 2809
+  def foo2808(): Int = 2810
+  def foo2809(): Int = 2811
+  def foo2810(): Int = 2812
+  def foo2811(): Int = 2813
+  def foo2812(): Int = 2814
+  def foo2813(): Int = 2815
+  def foo2814(): Int = 2816
+  def foo2815(): Int = 2817
+  def foo2816(): Int = 2818
+  def foo2817(): Int = 2819
+  def foo2818(): Int = 2820
+  def foo2819(): Int = 2821
+  def foo2820(): Int = 2822
+  def foo2821(): Int = 2823
+  def foo2822(): Int = 2824
+  def foo2823(): Int = 2825
+  def foo2824(): Int = 2826
+  def foo2825(): Int = 2827
+  def foo2826(): Int = 2828
+  def foo2827(): Int = 2829
+  def foo2828(): Int = 2830
+  def foo2829(): Int = 2831
+  def foo2830(): Int = 2832
+  def foo2831(): Int = 2833
+  def foo2832(): Int = 2834
+  def foo2833(): Int = 2835
+  def foo2834(): Int = 2836
+  def foo2835(): Int = 2837
+  def foo2836(): Int = 2838
+  def foo2837(): Int = 2839
+  def foo2838(): Int = 2840
+  def foo2839(): Int = 2841
+  def foo2840(): Int = 2842
+  def foo2841(): Int = 2843
+  def foo2842(): Int = 2844
+  def foo2843(): Int = 2845
+  def foo2844(): Int = 2846
+  def foo2845(): Int = 2847
+  def foo2846(): Int = 2848
+  def foo2847(): Int = 2849
+  def foo2848(): Int = 2850
+  def foo2849(): Int = 2851
+  def foo2850(): Int = 2852
+  def foo2851(): Int = 2853
+  def foo2852(): Int = 2854
+  def foo2853(): Int = 2855
+  def foo2854(): Int = 2856
+  def foo2855(): Int = 2857
+  def foo2856(): Int = 2858
+  def foo2857(): Int = 2859
+  def foo2858(): Int = 2860
+  def foo2859(): Int = 2861
+  def foo2860(): Int = 2862
+  def foo2861(): Int = 2863
+  def foo2862(): Int = 2864
+  def foo2863(): Int = 2865
+  def foo2864(): Int = 2866
+  def foo2865(): Int = 2867
+  def foo2866(): Int = 2868
+  def foo2867(): Int = 2869
+  def foo2868(): Int = 2870
+  def foo2869(): Int = 2871
+  def foo2870(): Int = 2872
+  def foo2871(): Int = 2873
+  def foo2872(): Int = 2874
+  def foo2873(): Int = 2875
+  def foo2874(): Int = 2876
+  def foo2875(): Int = 2877
+  def foo2876(): Int = 2878
+  def foo2877(): Int = 2879
+  def foo2878(): Int = 2880
+  def foo2879(): Int = 2881
+  def foo2880(): Int = 2882
+  def foo2881(): Int = 2883
+  def foo2882(): Int = 2884
+  def foo2883(): Int = 2885
+  def foo2884(): Int = 2886
+  def foo2885(): Int = 2887
+  def foo2886(): Int = 2888
+  def foo2887(): Int = 2889
+  def foo2888(): Int = 2890
+  def foo2889(): Int = 2891
+  def foo2890(): Int = 2892
+  def foo2891(): Int = 2893
+  def foo2892(): Int = 2894
+  def foo2893(): Int = 2895
+  def foo2894(): Int = 2896
+  def foo2895(): Int = 2897
+  def foo2896(): Int = 2898
+  def foo2897(): Int = 2899
+  def foo2898(): Int = 2900
+  def foo2899(): Int = 2901
+  def foo2900(): Int = 2902
+  def foo2901(): Int = 2903
+  def foo2902(): Int = 2904
+  def foo2903(): Int = 2905
+  def foo2904(): Int = 2906
+  def foo2905(): Int = 2907
+  def foo2906(): Int = 2908
+  def foo2907(): Int = 2909
+  def foo2908(): Int = 2910
+  def foo2909(): Int = 2911
+  def foo2910(): Int = 2912
+  def foo2911(): Int = 2913
+  def foo2912(): Int = 2914
+  def foo2913(): Int = 2915
+  def foo2914(): Int = 2916
+  def foo2915(): Int = 2917
+  def foo2916(): Int = 2918
+  def foo2917(): Int = 2919
+  def foo2918(): Int = 2920
+  def foo2919(): Int = 2921
+  def foo2920(): Int = 2922
+  def foo2921(): Int = 2923
+  def foo2922(): Int = 2924
+  def foo2923(): Int = 2925
+  def foo2924(): Int = 2926
+  def foo2925(): Int = 2927
+  def foo2926(): Int = 2928
+  def foo2927(): Int = 2929
+  def foo2928(): Int = 2930
+  def foo2929(): Int = 2931
+  def foo2930(): Int = 2932
+  def foo2931(): Int = 2933
+  def foo2932(): Int = 2934
+  def foo2933(): Int = 2935
+  def foo2934(): Int = 2936
+  def foo2935(): Int = 2937
+  def foo2936(): Int = 2938
+  def foo2937(): Int = 2939
+  def foo2938(): Int = 2940
+  def foo2939(): Int = 2941
+  def foo2940(): Int = 2942
+  def foo2941(): Int = 2943
+  def foo2942(): Int = 2944
+  def foo2943(): Int = 2945
+  def foo2944(): Int = 2946
+  def foo2945(): Int = 2947
+  def foo2946(): Int = 2948
+  def foo2947(): Int = 2949
+  def foo2948(): Int = 2950
+  def foo2949(): Int = 2951
+  def foo2950(): Int = 2952
+  def foo2951(): Int = 2953
+  def foo2952(): Int = 2954
+  def foo2953(): Int = 2955
+  def foo2954(): Int = 2956
+  def foo2955(): Int = 2957
+  def foo2956(): Int = 2958
+  def foo2957(): Int = 2959
+  def foo2958(): Int = 2960
+  def foo2959(): Int = 2961
+  def foo2960(): Int = 2962
+  def foo2961(): Int = 2963
+  def foo2962(): Int = 2964
+  def foo2963(): Int = 2965
+  def foo2964(): Int = 2966
+  def foo2965(): Int = 2967
+  def foo2966(): Int = 2968
+  def foo2967(): Int = 2969
+  def foo2968(): Int = 2970
+  def foo2969(): Int = 2971
+  def foo2970(): Int = 2972
+  def foo2971(): Int = 2973
+  def foo2972(): Int = 2974
+  def foo2973(): Int = 2975
+  def foo2974(): Int = 2976
+  def foo2975(): Int = 2977
+  def foo2976(): Int = 2978
+  def foo2977(): Int = 2979
+  def foo2978(): Int = 2980
+  def foo2979(): Int = 2981
+  def foo2980(): Int = 2982
+  def foo2981(): Int = 2983
+  def foo2982(): Int = 2984
+  def foo2983(): Int = 2985
+  def foo2984(): Int = 2986
+  def foo2985(): Int = 2987
+  def foo2986(): Int = 2988
+  def foo2987(): Int = 2989
+  def foo2988(): Int = 2990
+  def foo2989(): Int = 2991
+  def foo2990(): Int = 2992
+  def foo2991(): Int = 2993
+  def foo2992(): Int = 2994
+  def foo2993(): Int = 2995
+  def foo2994(): Int = 2996
+  def foo2995(): Int = 2997
+  def foo2996(): Int = 2998
+  def foo2997(): Int = 2999
+  def foo2998(): Int = 3000
+  def foo2999(): Int = 3001
+  def foo3000(): Int = 3002
+  def foo3001(): Int = 3003
+  def foo3002(): Int = 3004
+  def foo3003(): Int = 3005
+  def foo3004(): Int = 3006
+  def foo3005(): Int = 3007
+  def foo3006(): Int = 3008
+  def foo3007(): Int = 3009
+  def foo3008(): Int = 3010
+  def foo3009(): Int = 3011
+  def foo3010(): Int = 3012
+  def foo3011(): Int = 3013
+  def foo3012(): Int = 3014
+  def foo3013(): Int = 3015
+  def foo3014(): Int = 3016
+  def foo3015(): Int = 3017
+  def foo3016(): Int = 3018
+  def foo3017(): Int = 3019
+  def foo3018(): Int = 3020
+  def foo3019(): Int = 3021
+  def foo3020(): Int = 3022
+  def foo3021(): Int = 3023
+  def foo3022(): Int = 3024
+  def foo3023(): Int = 3025
+  def foo3024(): Int = 3026
+  def foo3025(): Int = 3027
+  def foo3026(): Int = 3028
+  def foo3027(): Int = 3029
+  def foo3028(): Int = 3030
+  def foo3029(): Int = 3031
+  def foo3030(): Int = 3032
+  def foo3031(): Int = 3033
+  def foo3032(): Int = 3034
+  def foo3033(): Int = 3035
+  def foo3034(): Int = 3036
+  def foo3035(): Int = 3037
+  def foo3036(): Int = 3038
+  def foo3037(): Int = 3039
+  def foo3038(): Int = 3040
+  def foo3039(): Int = 3041
+  def foo3040(): Int = 3042
+  def foo3041(): Int = 3043
+  def foo3042(): Int = 3044
+  def foo3043(): Int = 3045
+  def foo3044(): Int = 3046
+  def foo3045(): Int = 3047
+  def foo3046(): Int = 3048
+  def foo3047(): Int = 3049
+  def foo3048(): Int = 3050
+  def foo3049(): Int = 3051
+  def foo3050(): Int = 3052
+  def foo3051(): Int = 3053
+  def foo3052(): Int = 3054
+  def foo3053(): Int = 3055
+  def foo3054(): Int = 3056
+  def foo3055(): Int = 3057
+  def foo3056(): Int = 3058
+  def foo3057(): Int = 3059
+  def foo3058(): Int = 3060
+  def foo3059(): Int = 3061
+  def foo3060(): Int = 3062
+  def foo3061(): Int = 3063
+  def foo3062(): Int = 3064
+  def foo3063(): Int = 3065
+  def foo3064(): Int = 3066
+  def foo3065(): Int = 3067
+  def foo3066(): Int = 3068
+  def foo3067(): Int = 3069
+  def foo3068(): Int = 3070
+  def foo3069(): Int = 3071
+  def foo3070(): Int = 3072
+  def foo3071(): Int = 3073
+  def foo3072(): Int = 3074
+  def foo3073(): Int = 3075
+  def foo3074(): Int = 3076
+  def foo3075(): Int = 3077
+  def foo3076(): Int = 3078
+  def foo3077(): Int = 3079
+  def foo3078(): Int = 3080
+  def foo3079(): Int = 3081
+  def foo3080(): Int = 3082
+  def foo3081(): Int = 3083
+  def foo3082(): Int = 3084
+  def foo3083(): Int = 3085
+  def foo3084(): Int = 3086
+  def foo3085(): Int = 3087
+  def foo3086(): Int = 3088
+  def foo3087(): Int = 3089
+  def foo3088(): Int = 3090
+  def foo3089(): Int = 3091
+  def foo3090(): Int = 3092
+  def foo3091(): Int = 3093
+  def foo3092(): Int = 3094
+  def foo3093(): Int = 3095
+  def foo3094(): Int = 3096
+  def foo3095(): Int = 3097
+  def foo3096(): Int = 3098
+  def foo3097(): Int = 3099
+  def foo3098(): Int = 3100
+  def foo3099(): Int = 3101
+  def foo3100(): Int = 3102
+  def foo3101(): Int = 3103
+  def foo3102(): Int = 3104
+  def foo3103(): Int = 3105
+  def foo3104(): Int = 3106
+  def foo3105(): Int = 3107
+  def foo3106(): Int = 3108
+  def foo3107(): Int = 3109
+  def foo3108(): Int = 3110
+  def foo3109(): Int = 3111
+  def foo3110(): Int = 3112
+  def foo3111(): Int = 3113
+  def foo3112(): Int = 3114
+  def foo3113(): Int = 3115
+  def foo3114(): Int = 3116
+  def foo3115(): Int = 3117
+  def foo3116(): Int = 3118
+  def foo3117(): Int = 3119
+  def foo3118(): Int = 3120
+  def foo3119(): Int = 3121
+  def foo3120(): Int = 3122
+  def foo3121(): Int = 3123
+  def foo3122(): Int = 3124
+  def foo3123(): Int = 3125
+  def foo3124(): Int = 3126
+  def foo3125(): Int = 3127
+  def foo3126(): Int = 3128
+  def foo3127(): Int = 3129
+  def foo3128(): Int = 3130
+  def foo3129(): Int = 3131
+  def foo3130(): Int = 3132
+  def foo3131(): Int = 3133
+  def foo3132(): Int = 3134
+  def foo3133(): Int = 3135
+  def foo3134(): Int = 3136
+  def foo3135(): Int = 3137
+  def foo3136(): Int = 3138
+  def foo3137(): Int = 3139
+  def foo3138(): Int = 3140
+  def foo3139(): Int = 3141
+  def foo3140(): Int = 3142
+  def foo3141(): Int = 3143
+  def foo3142(): Int = 3144
+  def foo3143(): Int = 3145
+  def foo3144(): Int = 3146
+  def foo3145(): Int = 3147
+  def foo3146(): Int = 3148
+  def foo3147(): Int = 3149
+  def foo3148(): Int = 3150
+  def foo3149(): Int = 3151
+  def foo3150(): Int = 3152
+  def foo3151(): Int = 3153
+  def foo3152(): Int = 3154
+  def foo3153(): Int = 3155
+  def foo3154(): Int = 3156
+  def foo3155(): Int = 3157
+  def foo3156(): Int = 3158
+  def foo3157(): Int = 3159
+  def foo3158(): Int = 3160
+  def foo3159(): Int = 3161
+  def foo3160(): Int = 3162
+  def foo3161(): Int = 3163
+  def foo3162(): Int = 3164
+  def foo3163(): Int = 3165
+  def foo3164(): Int = 3166
+  def foo3165(): Int = 3167
+  def foo3166(): Int = 3168
+  def foo3167(): Int = 3169
+  def foo3168(): Int = 3170
+  def foo3169(): Int = 3171
+  def foo3170(): Int = 3172
+  def foo3171(): Int = 3173
+  def foo3172(): Int = 3174
+  def foo3173(): Int = 3175
+  def foo3174(): Int = 3176
+  def foo3175(): Int = 3177
+  def foo3176(): Int = 3178
+  def foo3177(): Int = 3179
+  def foo3178(): Int = 3180
+  def foo3179(): Int = 3181
+  def foo3180(): Int = 3182
+  def foo3181(): Int = 3183
+  def foo3182(): Int = 3184
+  def foo3183(): Int = 3185
+  def foo3184(): Int = 3186
+  def foo3185(): Int = 3187
+  def foo3186(): Int = 3188
+  def foo3187(): Int = 3189
+  def foo3188(): Int = 3190
+  def foo3189(): Int = 3191
+  def foo3190(): Int = 3192
+  def foo3191(): Int = 3193
+  def foo3192(): Int = 3194
+  def foo3193(): Int = 3195
+  def foo3194(): Int = 3196
+  def foo3195(): Int = 3197
+  def foo3196(): Int = 3198
+  def foo3197(): Int = 3199
+  def foo3198(): Int = 3200
+  def foo3199(): Int = 3201
+  def foo3200(): Int = 3202
+  def foo3201(): Int = 3203
+  def foo3202(): Int = 3204
+  def foo3203(): Int = 3205
+  def foo3204(): Int = 3206
+  def foo3205(): Int = 3207
+  def foo3206(): Int = 3208
+  def foo3207(): Int = 3209
+  def foo3208(): Int = 3210
+  def foo3209(): Int = 3211
+  def foo3210(): Int = 3212
+  def foo3211(): Int = 3213
+  def foo3212(): Int = 3214
+  def foo3213(): Int = 3215
+  def foo3214(): Int = 3216
+  def foo3215(): Int = 3217
+  def foo3216(): Int = 3218
+  def foo3217(): Int = 3219
+  def foo3218(): Int = 3220
+  def foo3219(): Int = 3221
+  def foo3220(): Int = 3222
+  def foo3221(): Int = 3223
+  def foo3222(): Int = 3224
+  def foo3223(): Int = 3225
+  def foo3224(): Int = 3226
+  def foo3225(): Int = 3227
+  def foo3226(): Int = 3228
+  def foo3227(): Int = 3229
+  def foo3228(): Int = 3230
+  def foo3229(): Int = 3231
+  def foo3230(): Int = 3232
+  def foo3231(): Int = 3233
+  def foo3232(): Int = 3234
+  def foo3233(): Int = 3235
+  def foo3234(): Int = 3236
+  def foo3235(): Int = 3237
+  def foo3236(): Int = 3238
+  def foo3237(): Int = 3239
+  def foo3238(): Int = 3240
+  def foo3239(): Int = 3241
+  def foo3240(): Int = 3242
+  def foo3241(): Int = 3243
+  def foo3242(): Int = 3244
+  def foo3243(): Int = 3245
+  def foo3244(): Int = 3246
+  def foo3245(): Int = 3247
+  def foo3246(): Int = 3248
+  def foo3247(): Int = 3249
+  def foo3248(): Int = 3250
+  def foo3249(): Int = 3251
+  def foo3250(): Int = 3252
+  def foo3251(): Int = 3253
+  def foo3252(): Int = 3254
+  def foo3253(): Int = 3255
+  def foo3254(): Int = 3256
+  def foo3255(): Int = 3257
+  def foo3256(): Int = 3258
+  def foo3257(): Int = 3259
+  def foo3258(): Int = 3260
+  def foo3259(): Int = 3261
+  def foo3260(): Int = 3262
+  def foo3261(): Int = 3263
+  def foo3262(): Int = 3264
+  def foo3263(): Int = 3265
+  def foo3264(): Int = 3266
+  def foo3265(): Int = 3267
+  def foo3266(): Int = 3268
+  def foo3267(): Int = 3269
+  def foo3268(): Int = 3270
+  def foo3269(): Int = 3271
+  def foo3270(): Int = 3272
+  def foo3271(): Int = 3273
+  def foo3272(): Int = 3274
+  def foo3273(): Int = 3275
+  def foo3274(): Int = 3276
+  def foo3275(): Int = 3277
+  def foo3276(): Int = 3278
+  def foo3277(): Int = 3279
+  def foo3278(): Int = 3280
+  def foo3279(): Int = 3281
+  def foo3280(): Int = 3282
+  def foo3281(): Int = 3283
+  def foo3282(): Int = 3284
+  def foo3283(): Int = 3285
+  def foo3284(): Int = 3286
+  def foo3285(): Int = 3287
+  def foo3286(): Int = 3288
+  def foo3287(): Int = 3289
+  def foo3288(): Int = 3290
+  def foo3289(): Int = 3291
+  def foo3290(): Int = 3292
+  def foo3291(): Int = 3293
+  def foo3292(): Int = 3294
+  def foo3293(): Int = 3295
+  def foo3294(): Int = 3296
+  def foo3295(): Int = 3297
+  def foo3296(): Int = 3298
+  def foo3297(): Int = 3299
+  def foo3298(): Int = 3300
+  def foo3299(): Int = 3301
+  def foo3300(): Int = 3302
+  def foo3301(): Int = 3303
+  def foo3302(): Int = 3304
+  def foo3303(): Int = 3305
+  def foo3304(): Int = 3306
+  def foo3305(): Int = 3307
+  def foo3306(): Int = 3308
+  def foo3307(): Int = 3309
+  def foo3308(): Int = 3310
+  def foo3309(): Int = 3311
+  def foo3310(): Int = 3312
+  def foo3311(): Int = 3313
+  def foo3312(): Int = 3314
+  def foo3313(): Int = 3315
+  def foo3314(): Int = 3316
+  def foo3315(): Int = 3317
+  def foo3316(): Int = 3318
+  def foo3317(): Int = 3319
+  def foo3318(): Int = 3320
+  def foo3319(): Int = 3321
+  def foo3320(): Int = 3322
+  def foo3321(): Int = 3323
+  def foo3322(): Int = 3324
+  def foo3323(): Int = 3325
+  def foo3324(): Int = 3326
+  def foo3325(): Int = 3327
+  def foo3326(): Int = 3328
+  def foo3327(): Int = 3329
+  def foo3328(): Int = 3330
+  def foo3329(): Int = 3331
+  def foo3330(): Int = 3332
+  def foo3331(): Int = 3333
+  def foo3332(): Int = 3334
+  def foo3333(): Int = 3335
+  def foo3334(): Int = 3336
+  def foo3335(): Int = 3337
+  def foo3336(): Int = 3338
+  def foo3337(): Int = 3339
+  def foo3338(): Int = 3340
+  def foo3339(): Int = 3341
+  def foo3340(): Int = 3342
+  def foo3341(): Int = 3343
+  def foo3342(): Int = 3344
+  def foo3343(): Int = 3345
+  def foo3344(): Int = 3346
+  def foo3345(): Int = 3347
+  def foo3346(): Int = 3348
+  def foo3347(): Int = 3349
+  def foo3348(): Int = 3350
+  def foo3349(): Int = 3351
+  def foo3350(): Int = 3352
+  def foo3351(): Int = 3353
+  def foo3352(): Int = 3354
+  def foo3353(): Int = 3355
+  def foo3354(): Int = 3356
+  def foo3355(): Int = 3357
+  def foo3356(): Int = 3358
+  def foo3357(): Int = 3359
+  def foo3358(): Int = 3360
+  def foo3359(): Int = 3361
+  def foo3360(): Int = 3362
+  def foo3361(): Int = 3363
+  def foo3362(): Int = 3364
+  def foo3363(): Int = 3365
+  def foo3364(): Int = 3366
+  def foo3365(): Int = 3367
+  def foo3366(): Int = 3368
+  def foo3367(): Int = 3369
+  def foo3368(): Int = 3370
+  def foo3369(): Int = 3371
+  def foo3370(): Int = 3372
+  def foo3371(): Int = 3373
+  def foo3372(): Int = 3374
+  def foo3373(): Int = 3375
+  def foo3374(): Int = 3376
+  def foo3375(): Int = 3377
+  def foo3376(): Int = 3378
+  def foo3377(): Int = 3379
+  def foo3378(): Int = 3380
+  def foo3379(): Int = 3381
+  def foo3380(): Int = 3382
+  def foo3381(): Int = 3383
+  def foo3382(): Int = 3384
+  def foo3383(): Int = 3385
+  def foo3384(): Int = 3386
+  def foo3385(): Int = 3387
+  def foo3386(): Int = 3388
+  def foo3387(): Int = 3389
+  def foo3388(): Int = 3390
+  def foo3389(): Int = 3391
+  def foo3390(): Int = 3392
+  def foo3391(): Int = 3393
+  def foo3392(): Int = 3394
+  def foo3393(): Int = 3395
+  def foo3394(): Int = 3396
+  def foo3395(): Int = 3397
+  def foo3396(): Int = 3398
+  def foo3397(): Int = 3399
+  def foo3398(): Int = 3400
+  def foo3399(): Int = 3401
+  def foo3400(): Int = 3402
+  def foo3401(): Int = 3403
+  def foo3402(): Int = 3404
+  def foo3403(): Int = 3405
+  def foo3404(): Int = 3406
+  def foo3405(): Int = 3407
+  def foo3406(): Int = 3408
+  def foo3407(): Int = 3409
+  def foo3408(): Int = 3410
+  def foo3409(): Int = 3411
+  def foo3410(): Int = 3412
+  def foo3411(): Int = 3413
+  def foo3412(): Int = 3414
+  def foo3413(): Int = 3415
+  def foo3414(): Int = 3416
+  def foo3415(): Int = 3417
+  def foo3416(): Int = 3418
+  def foo3417(): Int = 3419
+  def foo3418(): Int = 3420
+  def foo3419(): Int = 3421
+  def foo3420(): Int = 3422
+  def foo3421(): Int = 3423
+  def foo3422(): Int = 3424
+  def foo3423(): Int = 3425
+  def foo3424(): Int = 3426
+  def foo3425(): Int = 3427
+  def foo3426(): Int = 3428
+  def foo3427(): Int = 3429
+  def foo3428(): Int = 3430
+  def foo3429(): Int = 3431
+  def foo3430(): Int = 3432
+  def foo3431(): Int = 3433
+  def foo3432(): Int = 3434
+  def foo3433(): Int = 3435
+  def foo3434(): Int = 3436
+  def foo3435(): Int = 3437
+  def foo3436(): Int = 3438
+  def foo3437(): Int = 3439
+  def foo3438(): Int = 3440
+  def foo3439(): Int = 3441
+  def foo3440(): Int = 3442
+  def foo3441(): Int = 3443
+  def foo3442(): Int = 3444
+  def foo3443(): Int = 3445
+  def foo3444(): Int = 3446
+  def foo3445(): Int = 3447
+  def foo3446(): Int = 3448
+  def foo3447(): Int = 3449
+  def foo3448(): Int = 3450
+  def foo3449(): Int = 3451
+  def foo3450(): Int = 3452
+  def foo3451(): Int = 3453
+  def foo3452(): Int = 3454
+  def foo3453(): Int = 3455
+  def foo3454(): Int = 3456
+  def foo3455(): Int = 3457
+  def foo3456(): Int = 3458
+  def foo3457(): Int = 3459
+  def foo3458(): Int = 3460
+  def foo3459(): Int = 3461
+  def foo3460(): Int = 3462
+  def foo3461(): Int = 3463
+  def foo3462(): Int = 3464
+  def foo3463(): Int = 3465
+  def foo3464(): Int = 3466
+  def foo3465(): Int = 3467
+  def foo3466(): Int = 3468
+  def foo3467(): Int = 3469
+  def foo3468(): Int = 3470
+  def foo3469(): Int = 3471
+  def foo3470(): Int = 3472
+  def foo3471(): Int = 3473
+  def foo3472(): Int = 3474
+  def foo3473(): Int = 3475
+  def foo3474(): Int = 3476
+  def foo3475(): Int = 3477
+  def foo3476(): Int = 3478
+  def foo3477(): Int = 3479
+  def foo3478(): Int = 3480
+  def foo3479(): Int = 3481
+  def foo3480(): Int = 3482
+  def foo3481(): Int = 3483
+  def foo3482(): Int = 3484
+  def foo3483(): Int = 3485
+  def foo3484(): Int = 3486
+  def foo3485(): Int = 3487
+  def foo3486(): Int = 3488
+  def foo3487(): Int = 3489
+  def foo3488(): Int = 3490
+  def foo3489(): Int = 3491
+  def foo3490(): Int = 3492
+  def foo3491(): Int = 3493
+  def foo3492(): Int = 3494
+  def foo3493(): Int = 3495
+  def foo3494(): Int = 3496
+  def foo3495(): Int = 3497
+  def foo3496(): Int = 3498
+  def foo3497(): Int = 3499
+  def foo3498(): Int = 3500
+  def foo3499(): Int = 3501
+  def foo3500(): Int = 3502
+}
diff --git a/test/files/specialized/constant_lambda.scala b/test/files/specialized/constant_lambda.scala
index bb9a974..7c5358c 100644
--- a/test/files/specialized/constant_lambda.scala
+++ b/test/files/specialized/constant_lambda.scala
@@ -1,4 +1,4 @@
-// during development of late delmabdafying there was a problem where
+// during development of late delambdafying there was a problem where
 // specialization would undo some of the work done in uncurry if the body of the
 // lambda had a constant type. That would result in a compiler crash as
 // when the delambdafy phase got a tree shape it didn't understand
diff --git a/test/junit/scala/collection/IterableViewLikeTest.scala b/test/junit/scala/collection/IterableViewLikeTest.scala
index ab09c49..435a43c 100644
--- a/test/junit/scala/collection/IterableViewLikeTest.scala
+++ b/test/junit/scala/collection/IterableViewLikeTest.scala
@@ -13,6 +13,7 @@ class IterableViewLikeTest {
   def hasCorrectDropAndTakeMethods() {
     val iter = Iterable(1, 2, 3)
 
+    import scala.language.postfixOps
     assertEquals(Iterable.empty[Int], iter.view take Int.MinValue force)
     assertEquals(Iterable.empty[Int], iter.view takeRight Int.MinValue force)
     assertEquals(iter, iter.view drop Int.MinValue force)
diff --git a/test/junit/scala/collection/IteratorTest.scala b/test/junit/scala/collection/IteratorTest.scala
index d5389af..329c851 100644
--- a/test/junit/scala/collection/IteratorTest.scala
+++ b/test/junit/scala/collection/IteratorTest.scala
@@ -154,4 +154,42 @@ class IteratorTest {
     results += (Stream from 1).toIterator.drop(10).toStream.drop(10).toIterator.next()
     assertSameElements(List(1,1,21), results)
   }
+  // SI-9332
+  @Test def spanExhaustsLeadingIterator(): Unit = {
+    def it = Iterator.iterate(0)(_ + 1).take(6)
+    val (x, y) = it.span(_ != 1)
+    val z = x.toList
+    assertEquals(1, z.size)
+    assertFalse(x.hasNext)
+    assertEquals(1, y.next)
+    assertFalse(x.hasNext)   // was true, after advancing underlying iterator
+  }
+  // SI-9623
+  @Test def noExcessiveHasNextInJoinIterator: Unit = {
+    var counter = 0
+    val exp = List(1,2,3,1,2,3)
+    def it: Iterator[Int] = new Iterator[Int] {
+      val parent = List(1,2,3).iterator
+      def next(): Int = parent.next
+      def hasNext: Boolean = { counter += 1; parent.hasNext }
+    }
+    // Iterate separately
+    val res = new mutable.ArrayBuffer[Int]
+    it.foreach(res += _)
+    it.foreach(res += _)
+    assertSameElements(exp, res)
+    assertEquals(8, counter)
+    // JoinIterator
+    counter = 0
+    res.clear
+    (it ++ it).foreach(res += _)
+    assertSameElements(exp, res)
+    assertEquals(8, counter) // was 17
+    // ConcatIterator
+    counter = 0
+    res.clear
+    (Iterator.empty ++ it ++ it).foreach(res += _)
+    assertSameElements(exp, res)
+    assertEquals(8, counter) // was 14
+  }
 }
diff --git a/test/junit/scala/collection/SearchingTest.scala b/test/junit/scala/collection/SearchingTest.scala
new file mode 100644
index 0000000..2f939d6
--- /dev/null
+++ b/test/junit/scala/collection/SearchingTest.scala
@@ -0,0 +1,48 @@
+package scala.collection
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Assert._
+import org.junit.Test
+import scala.collection.Searching._
+
+ at RunWith(classOf[JUnit4])
+class SearchingTest {
+
+  @Test
+  def doesLinearSearchOnLinearSeqs() {
+
+    class TestSeq[A](list: List[A]) extends SeqLike[A, TestSeq[A]] {
+      var elementsAccessed = Set.empty[Int]
+
+      protected[this] def newBuilder = ??? // not needed for this test
+      def seq = list
+      def iterator = list.iterator
+      def length = list.length
+      def apply(idx: Int) = { elementsAccessed += idx; list(idx) }
+    }
+
+    val coll = new TestSeq((0 to 6).toList)
+
+    assertEquals(Found(5), coll.search(5))
+    assertEquals(Set.empty, coll.elementsAccessed) // linear search should not access elements via apply()
+  }
+
+  @Test
+  def doesBinarySearchOnIndexedSeqs() {
+
+    class TestIndexedSeq[A](vec: Vector[A]) extends IndexedSeqLike[A, TestIndexedSeq[A]] {
+      var elementsAccessed = Set.empty[Int]
+
+      protected[this] def newBuilder = ??? // not needed for this test
+      def seq = vec
+      def length = vec.length
+      def apply(idx: Int) = { elementsAccessed += idx; vec(idx) }
+    }
+
+    val coll = new TestIndexedSeq((0 to 6).toVector)
+
+    assertEquals(Found(5), coll.search(5))
+    assertEquals(Set(3, 5), coll.elementsAccessed)
+  }
+}
diff --git a/test/junit/scala/collection/immutable/PagedSeqTest.scala b/test/junit/scala/collection/immutable/PagedSeqTest.scala
index 2b576a3..74f8825 100644
--- a/test/junit/scala/collection/immutable/PagedSeqTest.scala
+++ b/test/junit/scala/collection/immutable/PagedSeqTest.scala
@@ -13,6 +13,12 @@ class PagedSeqTest {
     assertEquals(Seq('a'), PagedSeq.fromStrings(List.fill(5000)("a")).slice(4096, 4097))
   }
 
+  // should not NPE, and should be empty
+  @Test
+  def test_SI9480(): Unit = {
+    assertEquals(Seq(), PagedSeq.fromStrings(List("a")).slice(1))
+  }
+
   // Slices shouldn't read outside where they belong
   @Test
   def test_SI6519 {
diff --git a/test/junit/scala/collection/immutable/RangeConsistencyTest.scala b/test/junit/scala/collection/immutable/RangeConsistencyTest.scala
index 3980c31..760498c 100644
--- a/test/junit/scala/collection/immutable/RangeConsistencyTest.scala
+++ b/test/junit/scala/collection/immutable/RangeConsistencyTest.scala
@@ -137,4 +137,39 @@ class RangeConsistencyTest {
     assert( (-3 to Int.MaxValue).dropWhile(_ <= 0).length == Int.MaxValue )
     assert( (-3 to Int.MaxValue).span(_ <= 0) match { case (a,b) => a.length == 4 && b.length == Int.MaxValue } )
   }
+  
+  @Test
+  def testSI9348() {
+    // Test exclusive range with (end-start) != 0 (mod step)
+    assert( (0.0f until 0.4f by 0.25f) sameElements List(0.0f, 0.25f) )
+    assert( (1.0 until 2.2 by 0.5) sameElements List(1.0, 1.5, 2.0) )
+    
+    def bd(d: Double) = BigDecimal(d)
+    val bdRange = bd(-10.0) until bd(0.0) by bd(4.5)
+    assert( bdRange sameElements List(bd(-10.0), bd(-5.5), bd(-1.0)) )
+  }
+
+  @Test
+  def test_SI9388()  {
+    val possiblyNotDefaultNumeric = new scala.math.Numeric[Int] {
+      def fromInt(x: Int) = x
+      def minus(x: Int, y: Int): Int = x - y
+      def negate(x: Int): Int = -x
+      def plus(x: Int, y: Int): Int = x + y
+      def times(x: Int, y: Int): Int = x*y
+      def toDouble(x: Int): Double = x.toDouble
+      def toFloat(x: Int): Float = x.toFloat
+      def toInt(x: Int): Int = x
+      def toLong(x: Int): Long = x.toLong
+      def compare(x: Int, y: Int) = x compare y
+    }
+    val r = (Int.MinValue to Int.MaxValue by (1<<23))
+    val nr = NumericRange(Int.MinValue, Int.MaxValue, 1 << 23)
+    assert({ var i = 0; r.foreach(_ => i += 1); i } == 512)
+    assert({ var i = 0; nr.foreach(_ => i += 1); i } == 512)
+    assert(r.sum == Int.MinValue)
+    assert(nr.sum == Int.MinValue)
+    assert(r.sum(possiblyNotDefaultNumeric) == Int.MinValue)
+    assert(nr.sum(possiblyNotDefaultNumeric) == Int.MinValue)
+  }
 }
diff --git a/test/junit/scala/collection/immutable/SetTests.scala b/test/junit/scala/collection/immutable/SetTests.scala
new file mode 100644
index 0000000..28c7864
--- /dev/null
+++ b/test/junit/scala/collection/immutable/SetTests.scala
@@ -0,0 +1,81 @@
+package scala.collection.immutable
+
+import org.junit.Assert._
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+ at RunWith(classOf[JUnit4])
+class SetTests {
+  @Test
+  def test_SI8346_toSet_soundness(): Unit = {
+    val any2stringadd = "Disabled string conversions so as not to get confused!"
+    
+    def any[A](set: Set[A]): Set[Any] = {
+      val anyset = set.toSet[Any]
+      assert((anyset + "fish") contains "fish")
+      anyset
+    }
+
+    // Make sure default immutable Set does not rebuild itself on widening with toSet
+    // Need to cover 0, 1, 2, 3, 4 elements as special cases
+    var si = Set.empty[Int]
+    assert(si eq si.toSet[Any])
+    for (i <- 1 to 5) {
+      val s1 = Set(Array.range(1, i+1): _*)
+      val s2 = si + i
+      val s1a = any(s1)
+      val s2a = any(s2)
+      assert(s1 eq s1a)
+      assert(s2 eq s2a)
+      si = s2
+    }
+
+    // Make sure BitSet correctly rebuilds itself on widening with toSet
+    // Need to cover empty, values 0-63, values 0-127 as special cases
+    val bitsets = Seq(BitSet.empty, BitSet(23), BitSet(23, 99), BitSet(23, 99, 141))
+    bitsets.foreach{ b =>
+      val ba = any(b)
+      assert(b ne ba)
+      assertEquals(b, ba)
+    }
+
+    // Make sure HashSet (and by extension, its implementing class HashTrieSet)
+    // does not rebuild itself on widening by toSet
+    val hashset = HashSet(1, 3, 5, 7)
+    val hashseta = any(hashset)
+    assert(hashset eq hashseta)
+
+    // Make sure ListSet does not rebuild itself on widening by toSet
+    // (Covers Node also, since it subclasses ListSet)
+    val listset = ListSet(1, 3, 5, 7)
+    val listseta = any(listset)
+    assert(listset eq listseta)
+
+    // Make sure SortedSets correctly rebuild themselves on widening with toSet
+    // Covers TreeSet and keySet of SortedMap also
+    val sortedsets = Seq(
+      SortedSet.empty[Int], SortedSet(5), SortedSet(1,2,3,5,4),
+      SortedMap(1 -> "cod", 2 -> "herring").keySet
+    )
+    sortedsets.foreach{ set => 
+      val seta = any(set)
+      assert(set ne seta)
+      assertEquals(set, seta)
+    }
+
+    // Make sure ValueSets correctly rebuild themselves on widening with toSet
+    object WeekDay extends Enumeration {
+      type WeekDay = Value
+      val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
+    }
+    val valuesa = any(WeekDay.values)
+    assert(WeekDay.values ne valuesa)
+    assertEquals(WeekDay.values, valuesa)
+
+    // Make sure regular Map keySets do not rebuild themselves on widening with toSet
+    val mapset = Map(1 -> "cod", 2 -> "herring").keySet
+    val mapseta = any(mapset)
+    assert(mapset eq mapseta)
+  }
+}
diff --git a/test/junit/scala/collection/immutable/VectorTest.scala b/test/junit/scala/collection/immutable/VectorTest.scala
new file mode 100644
index 0000000..69f7487
--- /dev/null
+++ b/test/junit/scala/collection/immutable/VectorTest.scala
@@ -0,0 +1,30 @@
+package scala.collection.immutable
+
+import org.junit.Assert._
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+
+ at RunWith(classOf[JUnit4])
+class VectorTest {
+
+  @Test
+  def hasCorrectDropAndTakeMethods() {
+    val v = Vector(0) ++ Vector(1 to 64: _*)
+
+    assertEquals(Vector(0, 1), v take 2)
+    assertEquals(Vector(63, 64), v takeRight 2)
+    assertEquals(Vector(2 to 64: _*), v drop 2)
+    assertEquals(Vector(0 to 62: _*), v dropRight 2)
+
+    assertEquals(v, v take Int.MaxValue)
+    assertEquals(v, v takeRight Int.MaxValue)
+    assertEquals(Vector.empty[Int], v drop Int.MaxValue)
+    assertEquals(Vector.empty[Int], v dropRight Int.MaxValue)
+
+    assertEquals(Vector.empty[Int], v take Int.MinValue)
+    assertEquals(Vector.empty[Int], v takeRight Int.MinValue)
+    assertEquals(v, v drop Int.MinValue)
+    assertEquals(v, v dropRight Int.MinValue)
+  }
+}
diff --git a/test/junit/scala/collection/mutable/OpenHashMapTest.scala b/test/junit/scala/collection/mutable/OpenHashMapTest.scala
new file mode 100644
index 0000000..1459c14
--- /dev/null
+++ b/test/junit/scala/collection/mutable/OpenHashMapTest.scala
@@ -0,0 +1,42 @@
+package scala.collection.mutable
+
+import org.junit.Test
+import org.junit.Assert._
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+/** Tests for [[OpenHashMap]]. */
+ at RunWith(classOf[JUnit4])
+class OpenHashMapTest {
+  /** Test that an [[OpenHashMap]] correctly maintains its internal `deleted` count. */
+  @Test
+  def maintainsDeletedCount {
+    val m = OpenHashMap.empty[Int, Int]
+
+    // Reflect to get the private `deleted` field's value, which should be zero.
+
+    /* TODO Doesn't work, due to SI-9306.
+    import scala.reflect.runtime.{universe => ru}
+
+    val mirror = ru.runtimeMirror(m.getClass.getClassLoader)
+    val mapType = ru.typeOf[OpenHashMap[Int, Int]]
+    val termSym = mapType.decls
+      .filterNot { s => s.isMethod }
+      .filter { s => s.fullName.endsWith("deleted") }
+      .head.asTerm
+
+    val fieldMirror = mirror.reflect(m).reflectField(termSym)
+		*/
+    // Use Java reflection instead for now.
+    val field = m.getClass.getDeclaredField("scala$collection$mutable$OpenHashMap$$deleted")
+    field.setAccessible(true)
+
+    m.put(0, 0)
+    m.remove(0)
+    assertEquals(1, field.getInt(m))
+
+    m.put(0, 0)  // Add an entry with the same key
+    // TODO assertEquals(0, fieldMirror.get.asInstanceOf[Int])
+    assertEquals(0, field.getInt(m))
+  }
+}
diff --git a/test/junit/scala/collection/mutable/SetLikeTest.scala b/test/junit/scala/collection/mutable/SetLikeTest.scala
new file mode 100644
index 0000000..c819024
--- /dev/null
+++ b/test/junit/scala/collection/mutable/SetLikeTest.scala
@@ -0,0 +1,26 @@
+package scala.collection.mutable
+
+import org.junit.Assert._
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+ at RunWith(classOf[JUnit4])
+class SetLikeTest {
+
+  class MySet(self: Set[String]) extends Set[String] with SetLike[String, MySet] {
+    override def -=(elem: String) = { self -= elem; this }
+    override def +=(elem: String) = { self += elem; this }
+
+    override def empty = new MySet(self.empty)
+    override def iterator = self.iterator
+    override def contains(elem: String) = self.contains(elem)
+  }
+
+  @Test
+  def hasCorrectClear() {
+    val s = new MySet(Set("EXPOSEDNODE", "CONNECTABLE"))
+    s.clear()
+    assertEquals(new MySet(Set()), s)
+  }
+}
diff --git a/test/junit/scala/collection/mutable/UnrolledBufferTest.scala b/test/junit/scala/collection/mutable/UnrolledBufferTest.scala
new file mode 100644
index 0000000..8660b6c
--- /dev/null
+++ b/test/junit/scala/collection/mutable/UnrolledBufferTest.scala
@@ -0,0 +1,25 @@
+package scala.collection.mutable
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+
+ at RunWith(classOf[JUnit4])
+class UnrolledBufferTestTest {
+  @Test
+  def test_SI9254_original() {
+    val b = new UnrolledBuffer[Int]()
+    (1 to 16).foreach(i => b append i)
+    b.insert(0,-1)
+    b append 17
+    assert(b sameElements (Seq(-1) ++ (1 to 16) ++ Seq(17)))
+  }
+
+  @Test
+  def test_SI9254_additional() {
+    val b = new UnrolledBuffer[Int]()
+    (1 to 100).foreach(i => b append i)
+    b.insert(40, -1)
+    assert(b sameElements((1 to 40) ++ Seq(-1) ++ (41 to 100)))
+  }
+}
diff --git a/test/junit/scala/collection/mutable/VectorTest.scala b/test/junit/scala/collection/mutable/VectorTest.scala
index e9c4d44..b3219d1 100644
--- a/test/junit/scala/collection/mutable/VectorTest.scala
+++ b/test/junit/scala/collection/mutable/VectorTest.scala
@@ -38,7 +38,6 @@ class VectorTest {
   def iteratorCat() {
     def its = vecs.map(_.toList.toIterator)
     val cats = vecs.map(a => its.map(a ++ _))
-    println(cats)
     assert( cats == ans )
   }
 
diff --git a/test/junit/scala/concurrent/duration/SerializationTest.scala b/test/junit/scala/concurrent/duration/SerializationTest.scala
new file mode 100644
index 0000000..af90a10
--- /dev/null
+++ b/test/junit/scala/concurrent/duration/SerializationTest.scala
@@ -0,0 +1,24 @@
+package scala.concurrent.duration
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+
+
+ at RunWith(classOf[JUnit4])
+class SerializationTest {
+  @Test
+  def test_SI9197 {
+    def ser(a: AnyRef): Array[Byte] = {
+      val bais = new java.io.ByteArrayOutputStream
+      (new java.io.ObjectOutputStream(bais)).writeObject(a)
+      bais.toByteArray
+    }
+    def des(ab: Array[Byte]): AnyRef =
+      (new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(ab))).readObject
+    
+    assert(Duration.Undefined eq des(ser(Duration.Undefined)))
+    assert(Duration.Inf eq des(ser(Duration.Inf)))
+    assert(Duration.MinusInf eq des(ser(Duration.MinusInf)))
+  }
+}
diff --git a/test/junit/scala/math/BigDecimalTest.scala b/test/junit/scala/math/BigDecimalTest.scala
index c7a63da..a9e2481 100644
--- a/test/junit/scala/math/BigDecimalTest.scala
+++ b/test/junit/scala/math/BigDecimalTest.scala
@@ -228,4 +228,36 @@ class BigDecimalTest {
   def test_SI8970() {
     assert((0.1).## == BigDecimal(0.1).##)
   }
+
+  // Motivated by the problem of MathContext lost
+  @Test
+  def testMathContext() {
+    def testPrecision() {
+      val p = 1000
+      val n = BigDecimal("1.1", MC.UNLIMITED).pow(p)
+
+      // BigDecimal(x: Float, mc: MC), which may not do what you want, is deprecated
+      assert(BigDecimal(1.1f, MC.UNLIMITED).pow(p) == BigDecimal(java.lang.Double.toString(1.1f.toDouble), MC.UNLIMITED).pow(p))
+      assert(BigDecimal(1.1d, MC.UNLIMITED).pow(p) == n)
+      assert(BigDecimal(new BD("1.1"), MC.UNLIMITED).pow(p) == n)
+
+      assert(BigDecimal.decimal(1.1f, MC.UNLIMITED).pow(p) == n)
+      assert(BigDecimal.decimal(1.1d, MC.UNLIMITED).pow(p) == n)
+      assert(BigDecimal.decimal(new BD("1.1"), MC.UNLIMITED).pow(p) == n)
+
+      assert((BigDecimal(11, MC.UNLIMITED) / 10).pow(p) == n)
+      assert((BigDecimal.decimal(11, MC.UNLIMITED) / 10).pow(p) == n)
+    }
+
+    def testRounded() {
+      // the default rounding mode is HALF_UP
+      assert((BigDecimal(1.23f, new MC(3)) + BigDecimal("0.005")).rounded == BigDecimal("1.24")) // deprecated api
+      assert((BigDecimal(1.23d, new MC(3)) + BigDecimal("0.005")).rounded == BigDecimal("1.24"))
+      assert((BigDecimal.decimal(1.23f, new MC(3)) + BigDecimal("0.005")).rounded == BigDecimal("1.24"))
+      assert((BigDecimal.decimal(1.23d, new MC(3)) + BigDecimal("0.005")).rounded == BigDecimal("1.24"))
+    }
+
+    testPrecision()
+    testRounded()
+  }
 }
diff --git a/test/junit/scala/math/NumericTest.scala b/test/junit/scala/math/NumericTest.scala
index 9bf7d4f..682dcbf 100644
--- a/test/junit/scala/math/NumericTest.scala
+++ b/test/junit/scala/math/NumericTest.scala
@@ -5,6 +5,9 @@ import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
+import scala.math.Numeric.FloatAsIfIntegral
+
+
 @RunWith(classOf[JUnit4])
 class NumericTest {
 
@@ -14,5 +17,28 @@ class NumericTest {
     assertTrue(-0.0.abs equals 0.0)
     assertTrue(-0.0f.abs equals 0.0f)
   }
-}
+  
+  /* Test for SI-9348 */
+  @Test
+  def testFloatAsIfIntegral {
+    val num = scala.math.Numeric.FloatAsIfIntegral
+    assertTrue(num.quot(1.0f, 0.5f) equals 2.0f)
+    assertTrue(num.quot(1.0f, 0.3f) equals 3.0f)
+  }
+
+  /* Test for SI-9348 */
+  @Test
+  def testDoubleAsIfIntegral {
+    val num = scala.math.Numeric.DoubleAsIfIntegral
+    assertTrue(num.quot(1.0, 0.25) equals 4.0)
+    assertTrue(num.quot(0.5, 0.15) equals 3.0)
+  }
+
+  /* Test for SI-9348 */
+  @Test
+  def testBigDecimalAsIfIntegral {
+    val num = scala.math.Numeric.BigDecimalAsIfIntegral
+    assertTrue(num.quot(BigDecimal(2.5), BigDecimal(0.5)) equals BigDecimal(5.0))
+    assertTrue(num.quot(BigDecimal(5.0), BigDecimal(2.0)) equals BigDecimal(2.0))
+  }}
 
diff --git a/test/junit/scala/reflect/ClassTag.scala b/test/junit/scala/reflect/ClassTag.scala
index 90cc981..49022dc 100644
--- a/test/junit/scala/reflect/ClassTag.scala
+++ b/test/junit/scala/reflect/ClassTag.scala
@@ -26,4 +26,14 @@ class ClassTagTest {
   @Test def checkDouble  = assertTrue(checkNotInt[Double] (0.toDouble))
   @Test def checkBoolean = assertTrue(checkNotInt[Boolean](false))
   @Test def checkUnit    = assertTrue(checkNotInt[Unit]   ({}))
-}
\ No newline at end of file
+
+  @Test def t9534: Unit = {
+    val ct = implicitly[scala.reflect.ClassTag[Unit]]
+    val a1 = ct.newArray(1)
+    a1(0) = ()
+    val a2 = ct.wrap.newArray(1)
+    a2(0) = a1
+    val a3 = ct.newArray2(1)
+    a3(0) = a1
+  }
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/BTypesTest.scala b/test/junit/scala/tools/nsc/backend/jvm/BTypesTest.scala
index 2347e82..6ada0e2 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/BTypesTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/BTypesTest.scala
@@ -7,35 +7,41 @@ import org.junit.Test
 import scala.tools.asm.Opcodes
 import org.junit.Assert._
 
- at RunWith(classOf[JUnit4])
-class BTypesTest {
-  val settings = new Settings()
-  settings.processArgumentString("-usejavacp")
-  val g: Global = new Global(settings)
-  val run = new g.Run() // initializes some compiler internals
-  import g.{definitions => d, Symbol}
+import scala.tools.nsc.backend.jvm.CodeGenTools._
+import scala.tools.testing.ClearAfterClass
 
-  def duringBackend[T](f: => T) = g.exitingDelambdafy(f)
+object BTypesTest extends ClearAfterClass.Clearable {
+  var compiler = {
+    val comp = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:none")
+    new comp.Run() // initializes some of the compiler
+    comp.exitingDelambdafy(comp.scalaPrimitives.init()) // needed: it's only done when running the backend, and we don't actually run the compiler
+    comp.exitingDelambdafy(comp.genBCode.bTypes.initializeCoreBTypes())
+    comp
+  }
+  def clear(): Unit = { compiler = null }
+}
 
-  val btypes = new BTypesFromSymbols[g.type](g)
-  import btypes._
-  duringBackend(btypes.initializeCoreBTypes())
+ at RunWith(classOf[JUnit4])
+class BTypesTest extends ClearAfterClass {
+  ClearAfterClass.stateToClear = BTypesTest
 
-  def classBTypeFromSymbol(sym: Symbol) = duringBackend(btypes.classBTypeFromSymbol(sym))
+  val compiler = BTypesTest.compiler
+  import compiler.genBCode.bTypes._
 
-  val jlo = d.ObjectClass
-  val jls = d.StringClass
+  def classBTFS(sym: compiler.Symbol) = compiler.exitingDelambdafy(classBTypeFromSymbol(sym))
 
-  val o = classBTypeFromSymbol(jlo)
-  val s = classBTypeFromSymbol(jls)
-  val oArr = ArrayBType(o)
-  val method = MethodBType(List(oArr, INT, DOUBLE, s), UNIT)
+  def jlo = compiler.definitions.ObjectClass
+  def jls = compiler.definitions.StringClass
+  def o = classBTFS(jlo)
+  def s = classBTFS(jls)
+  def oArr = ArrayBType(o)
+  def method = MethodBType(List(oArr, INT, DOUBLE, s), UNIT)
 
   @Test
   def classBTypesEquality() {
-    val s1 = classBTypeFromSymbol(jls)
-    val s2 = classBTypeFromSymbol(jls)
-    val o  = classBTypeFromSymbol(jlo)
+    val s1 = classBTFS(jls)
+    val s2 = classBTFS(jls)
+    val o  = classBTFS(jlo)
     assertEquals(s1, s2)
     assertEquals(s1.hashCode, s2.hashCode)
     assert(s1 != o)
@@ -53,7 +59,7 @@ class BTypesTest {
     assert(FLOAT.typedOpcode(Opcodes.IALOAD)  == Opcodes.FALOAD)
     assert(LONG.typedOpcode(Opcodes.IALOAD)   == Opcodes.LALOAD)
     assert(DOUBLE.typedOpcode(Opcodes.IALOAD) == Opcodes.DALOAD)
-    assert(classBTypeFromSymbol(jls).typedOpcode(Opcodes.IALOAD) == Opcodes.AALOAD)
+    assert(classBTFS(jls).typedOpcode(Opcodes.IALOAD) == Opcodes.AALOAD)
 
     assert(UNIT.typedOpcode(Opcodes.IRETURN)   == Opcodes.RETURN)
     assert(BOOL.typedOpcode(Opcodes.IRETURN)   == Opcodes.IRETURN)
@@ -64,7 +70,7 @@ class BTypesTest {
     assert(FLOAT.typedOpcode(Opcodes.IRETURN)  == Opcodes.FRETURN)
     assert(LONG.typedOpcode(Opcodes.IRETURN)   == Opcodes.LRETURN)
     assert(DOUBLE.typedOpcode(Opcodes.IRETURN) == Opcodes.DRETURN)
-    assert(classBTypeFromSymbol(jls).typedOpcode(Opcodes.IRETURN)   == Opcodes.ARETURN)
+    assert(classBTFS(jls).typedOpcode(Opcodes.IRETURN)   == Opcodes.ARETURN)
   }
 
   @Test
diff --git a/test/junit/scala/tools/nsc/backend/jvm/CodeGenTools.scala b/test/junit/scala/tools/nsc/backend/jvm/CodeGenTools.scala
index c1c5a71..ee9580c 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/CodeGenTools.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/CodeGenTools.scala
@@ -2,16 +2,20 @@ package scala.tools.nsc.backend.jvm
 
 import org.junit.Assert._
 
+import scala.collection.mutable.ListBuffer
 import scala.reflect.internal.util.BatchSourceFile
 import scala.reflect.io.VirtualDirectory
 import scala.tools.asm.Opcodes
-import scala.tools.asm.tree.{AbstractInsnNode, LabelNode, ClassNode, MethodNode}
+import scala.tools.asm.tree.{AbstractInsnNode, ClassNode, MethodNode}
 import scala.tools.cmd.CommandLineParser
-import scala.tools.nsc.backend.jvm.opt.LocalOpt
-import scala.tools.nsc.settings.{MutableSettings, ScalaSettings}
+import scala.tools.nsc.io.AbstractFile
+import scala.tools.nsc.reporters.StoreReporter
+import scala.tools.nsc.settings.MutableSettings
 import scala.tools.nsc.{Settings, Global}
 import scala.tools.partest.ASMConverters
 import scala.collection.JavaConverters._
+import scala.tools.testing.TempDir
+import AsmUtils._
 
 object CodeGenTools {
   import ASMConverters._
@@ -40,38 +44,104 @@ object CodeGenTools {
   }
 
   def newCompiler(defaultArgs: String = "-usejavacp", extraArgs: String = ""): Global = {
+    val compiler = newCompilerWithoutVirtualOutdir(defaultArgs, extraArgs)
+    resetOutput(compiler)
+    compiler
+  }
+  
+  def newCompilerWithoutVirtualOutdir(defaultArgs: String = "-usejavacp", extraArgs: String = ""): Global = {
     val settings = new Settings()
     val args = (CommandLineParser tokenize defaultArgs) ++ (CommandLineParser tokenize extraArgs)
     settings.processArguments(args, processAll = true)
-    val compiler = new Global(settings)
-    resetOutput(compiler)
-    compiler
+    new Global(settings, new StoreReporter)
   }
 
-  def compile(compiler: Global)(code: String): List[(String, Array[Byte])] = {
+  def newRun(compiler: Global): compiler.Run = {
     compiler.reporter.reset()
     resetOutput(compiler)
-    val run = new compiler.Run()
-    run.compileSources(List(new BatchSourceFile("unitTestSource.scala", code)))
-    val outDir = compiler.settings.outputDirs.getSingleOutput.get
-    (for (f <- outDir.iterator if !f.isDirectory) yield (f.name, f.toByteArray)).toList
+    new compiler.Run()
+  }
+
+  def reporter(compiler: Global) = compiler.reporter.asInstanceOf[StoreReporter]
+
+  def makeSourceFile(code: String, filename: String): BatchSourceFile = new BatchSourceFile(filename, code)
+
+  def getGeneratedClassfiles(outDir: AbstractFile): List[(String, Array[Byte])] = {
+    def files(dir: AbstractFile): List[(String, Array[Byte])] = {
+      val res = ListBuffer.empty[(String, Array[Byte])]
+      for (f <- dir.iterator) {
+        if (!f.isDirectory) res += ((f.name, f.toByteArray))
+        else if (f.name != "." && f.name != "..") res ++= files(f)
+      }
+      res.toList
+    }
+    files(outDir)
   }
 
-  def compileClasses(compiler: Global)(code: String): List[ClassNode] = {
-    compile(compiler)(code).map(p => AsmUtils.readClass(p._2)).sortBy(_.name)
+  def checkReport(compiler: Global, allowMessage: StoreReporter#Info => Boolean = _ => false): Unit = {
+    val disallowed = reporter(compiler).infos.toList.filter(!allowMessage(_)) // toList prevents an infer-non-wildcard-existential warning.
+    if (disallowed.nonEmpty) {
+      val msg = disallowed.mkString("\n")
+      assert(false, "The compiler issued non-allowed warnings or errors:\n" + msg)
+    }
   }
 
-  def compileMethods(compiler: Global)(code: String): List[MethodNode] = {
-    compileClasses(compiler)(s"class C { $code }").head.methods.asScala.toList.filterNot(_.name == "<init>")
+  def compile(compiler: Global)(scalaCode: String, javaCode: List[(String, String)] = Nil, allowMessage: StoreReporter#Info => Boolean = _ => false): List[(String, Array[Byte])] = {
+    val run = newRun(compiler)
+    run.compileSources(makeSourceFile(scalaCode, "unitTestSource.scala") :: javaCode.map(p => makeSourceFile(p._1, p._2)))
+    checkReport(compiler, allowMessage)
+    getGeneratedClassfiles(compiler.settings.outputDirs.getSingleOutput.get)
   }
 
-  def singleMethodInstructions(compiler: Global)(code: String): List[Instruction] = {
-    val List(m) = compileMethods(compiler)(code)
+  /**
+   * Compile multiple Scala files separately into a single output directory.
+   *
+   * Note that a new compiler instance is created for compiling each file because symbols survive
+   * across runs. This makes separate compilation slower.
+   *
+   * The output directory is a physical directory, I have not figured out if / how it's possible to
+   * add a VirtualDirectory to the classpath of a compiler.
+   */
+  def compileSeparately(codes: List[String], extraArgs: String = "", allowMessage: StoreReporter#Info => Boolean = _ => false, afterEach: AbstractFile => Unit = _ => ()): List[(String, Array[Byte])] = {
+    val outDir = AbstractFile.getDirectory(TempDir.createTempDir())
+    val outDirPath = outDir.canonicalPath
+    val argsWithOutDir = extraArgs + s" -d $outDirPath -cp $outDirPath"
+
+    for (code <- codes) {
+      val compiler = newCompilerWithoutVirtualOutdir(extraArgs = argsWithOutDir)
+      new compiler.Run().compileSources(List(makeSourceFile(code, "unitTestSource.scala")))
+      checkReport(compiler, allowMessage)
+      afterEach(outDir)
+    }
+
+    val classfiles = getGeneratedClassfiles(outDir)
+    outDir.delete()
+    classfiles
+  }
+
+  def compileClassesSeparately(codes: List[String], extraArgs: String = "", allowMessage: StoreReporter#Info => Boolean = _ => false, afterEach: AbstractFile => Unit = _ => ()) = {
+    readAsmClasses(compileSeparately(codes, extraArgs, allowMessage, afterEach))
+  }
+
+  def readAsmClasses(classfiles: List[(String, Array[Byte])]) = {
+    classfiles.map(p => AsmUtils.readClass(p._2)).sortBy(_.name)
+  }
+
+  def compileClasses(compiler: Global)(code: String, javaCode: List[(String, String)] = Nil, allowMessage: StoreReporter#Info => Boolean = _ => false): List[ClassNode] = {
+    readAsmClasses(compile(compiler)(code, javaCode, allowMessage))
+  }
+
+  def compileMethods(compiler: Global)(code: String, allowMessage: StoreReporter#Info => Boolean = _ => false): List[MethodNode] = {
+    compileClasses(compiler)(s"class C { $code }", allowMessage = allowMessage).head.methods.asScala.toList.filterNot(_.name == "<init>")
+  }
+
+  def singleMethodInstructions(compiler: Global)(code: String, allowMessage: StoreReporter#Info => Boolean = _ => false): List[Instruction] = {
+    val List(m) = compileMethods(compiler)(code, allowMessage = allowMessage)
     instructionsFromMethod(m)
   }
 
-  def singleMethod(compiler: Global)(code: String): Method = {
-    val List(m) = compileMethods(compiler)(code)
+  def singleMethod(compiler: Global)(code: String, allowMessage: StoreReporter#Info => Boolean = _ => false): Method = {
+    val List(m) = compileMethods(compiler)(code, allowMessage = allowMessage)
     convertMethod(m)
   }
 
@@ -82,17 +152,22 @@ object CodeGenTools {
   def getSingleMethod(classNode: ClassNode, name: String): Method =
     convertMethod(classNode.methods.asScala.toList.find(_.name == name).get)
 
+  /**
+   * Instructions that match `query` when textified.
+   * If `query` starts with a `+`, the next instruction is returned.
+   */
+  def findInstr(method: MethodNode, query: String): List[AbstractInsnNode] = {
+    val useNext = query(0) == '+'
+    val instrPart = if (useNext) query.drop(1) else query
+    val insns = method.instructions.iterator.asScala.find(i => textify(i) contains instrPart).toList
+    if (useNext) insns.map(_.getNext) else insns
+  }
+
   def assertHandlerLabelPostions(h: ExceptionHandler, instructions: List[Instruction], startIndex: Int, endIndex: Int, handlerIndex: Int): Unit = {
     val insVec = instructions.toVector
     assertTrue(h.start == insVec(startIndex) && h.end == insVec(endIndex) && h.handler == insVec(handlerIndex))
   }
 
-  val localOpt = {
-    val settings = new MutableSettings(msg => throw new IllegalArgumentException(msg))
-    settings.processArguments(List("-Yopt:l:method"), processAll = true)
-    new LocalOpt(settings)
-  }
-
   import scala.language.implicitConversions
 
   implicit def aliveInstruction(ins: Instruction): (Instruction, Boolean) = (ins, true)
diff --git a/test/junit/scala/tools/nsc/backend/jvm/DirectCompileTest.scala b/test/junit/scala/tools/nsc/backend/jvm/DirectCompileTest.scala
index 8990029..240d352 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/DirectCompileTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/DirectCompileTest.scala
@@ -7,10 +7,18 @@ import org.junit.Assert._
 import CodeGenTools._
 import scala.tools.asm.Opcodes._
 import scala.tools.partest.ASMConverters._
+import scala.tools.testing.ClearAfterClass
+
+object DirectCompileTest extends ClearAfterClass.Clearable {
+  var compiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:method")
+  def clear(): Unit = { compiler = null }
+}
 
 @RunWith(classOf[JUnit4])
-class DirectCompileTest {
-  val compiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:method")
+class DirectCompileTest extends ClearAfterClass {
+  ClearAfterClass.stateToClear = DirectCompileTest
+
+  val compiler = DirectCompileTest.compiler
 
   @Test
   def testCompile(): Unit = {
@@ -20,7 +28,7 @@ class DirectCompileTest {
         |}
       """.stripMargin)
     def s(i: Int, n: Int) = (bytes(i) & 0xff) << n
-    assertTrue((s(0, 24) | s(1, 16) | s(2, 8) | s(3, 0)) == 0xcafebabe) // mocha java latte machiatto surpreme dark roasted espresso
+    assertTrue((s(0, 24) | s(1, 16) | s(2, 8) | s(3, 0)) == 0xcafebabe) // mocha java latte macchiato surpreme dark roasted espresso
   }
 
   @Test
@@ -70,4 +78,21 @@ class DirectCompileTest {
       Label(11)
     ))
   }
+
+  @Test
+  def testSeparateCompilation(): Unit = {
+    val codeA = "class A { def f = 1 }"
+    val codeB = "class B extends A { def g = f }"
+    val List(a, b) = compileClassesSeparately(List(codeA, codeB))
+    val ins = getSingleMethod(b, "g").instructions
+    assert(ins exists {
+      case Invoke(_, "B", "f", _, _) => true
+      case _ => false
+    }, ins)
+  }
+
+  @Test
+  def compileErroneous(): Unit = {
+    compileClasses(compiler)("class C { def f: String = 1 }", allowMessage = _.msg contains "type mismatch")
+  }
 }
diff --git a/test/junit/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzerTest.scala b/test/junit/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzerTest.scala
new file mode 100644
index 0000000..94e776a
--- /dev/null
+++ b/test/junit/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzerTest.scala
@@ -0,0 +1,220 @@
+package scala.tools.nsc
+package backend.jvm
+package analysis
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+import scala.tools.asm.Opcodes._
+import org.junit.Assert._
+
+import CodeGenTools._
+import scala.tools.asm.tree.{AbstractInsnNode, MethodNode}
+import scala.tools.nsc.backend.jvm.BTypes._
+import scala.tools.partest.ASMConverters
+import ASMConverters._
+import scala.tools.testing.ClearAfterClass
+import scala.tools.nsc.backend.jvm.opt.BytecodeUtils._
+import AsmUtils._
+
+import scala.collection.convert.decorateAsScala._
+
+object NullnessAnalyzerTest extends ClearAfterClass.Clearable {
+  var noOptCompiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:none")
+
+  def clear(): Unit = {
+    noOptCompiler = null
+  }
+}
+
+ at RunWith(classOf[JUnit4])
+class NullnessAnalyzerTest extends ClearAfterClass {
+  ClearAfterClass.stateToClear = NullnessAnalyzerTest
+  val noOptCompiler = NullnessAnalyzerTest.noOptCompiler
+
+  def newNullnessAnalyzer(methodNode: MethodNode, classInternalName: InternalName = "C"): NullnessAnalyzer = {
+    val nullnessAnalyzer = new NullnessAnalyzer
+    nullnessAnalyzer.analyze(classInternalName, methodNode)
+    nullnessAnalyzer
+  }
+
+  def testNullness(analyzer: NullnessAnalyzer, method: MethodNode, query: String, index: Int, nullness: Nullness): Unit = {
+    for (i <- findInstr(method, query)) {
+      val r = analyzer.frameAt(i, method).getValue(index).nullness
+      assertTrue(s"Expected: $nullness, found: $r. At instr ${textify(i)}", nullness == r)
+    }
+  }
+
+  // debug / helper for writing tests
+  def showAllNullnessFrames(analyzer: NullnessAnalyzer, method: MethodNode): String = {
+    val instrLength = method.instructions.iterator.asScala.map(textify(_).length).max
+    val lines = for (i <- method.instructions.iterator.asScala) yield {
+      val f = analyzer.frameAt(i, method)
+      val frameString = {
+        if (f == null) "null"
+        else (0 until (f.getLocals + f.getStackSize)).iterator
+          .map(f.getValue(_).toString)
+          .map(s => "%8s".format(s))
+          .zipWithIndex.map({case (s, i) => s"$i: $s"})
+          .mkString(", ")
+      }
+      ("%"+ instrLength +"s: %s").format(textify(i), frameString)
+    }
+    lines.mkString("\n")
+  }
+
+  @Test
+  def showNullnessFramesTest(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f = this.toString")
+
+    // NOTE: the frame for an instruction represents the state *before* executing that instr.
+    // So in the frame for `ALOAD 0`, the stack is still empty.
+
+    val res =
+      """                                                          L0: 0:  NotNull
+        |                                             LINENUMBER 1 L0: 0:  NotNull
+        |                                                     ALOAD 0: 0:  NotNull
+        |INVOKEVIRTUAL java/lang/Object.toString ()Ljava/lang/String;: 0:  NotNull, 1:  NotNull
+        |                                                     ARETURN: 0:  NotNull, 1: Unknown1
+        |                                                          L0: null""".stripMargin
+    assertEquals(showAllNullnessFrames(newNullnessAnalyzer(m), m), res)
+  }
+
+  @Test
+  def thisNonNull(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f = this.toString")
+    val a = newNullnessAnalyzer(m)
+    testNullness(a, m, "ALOAD 0", 0, NotNull)
+  }
+
+  @Test
+  def instanceMethodCall(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f(a: String) = a.trim")
+    val a = newNullnessAnalyzer(m)
+    testNullness(a, m, "INVOKEVIRTUAL java/lang/String.trim", 1, Unknown)
+    testNullness(a, m, "ARETURN", 1, NotNull)
+  }
+
+  @Test
+  def constructorCall(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f = { val a = new Object; a.toString }")
+    val a = newNullnessAnalyzer(m)
+
+    // for reference, the output of showAllNullnessFrames(a, m) - note that the frame represents the state *before* executing the instr.
+    //                    NEW java/lang/Object: 0: NotNull, 1: Unknown
+    //                                     DUP: 0: NotNull, 1: Unknown, 2: Unknown
+    //   INVOKESPECIAL java/lang/Object.<init>: 0: NotNull, 1: Unknown, 2: Unknown, 3: Unknown
+    //                                ASTORE 1: 0: NotNull, 1: Unknown, 2: NotNull
+    //                                 ALOAD 1: 0: NotNull, 1: NotNull
+    // INVOKEVIRTUAL java/lang/Object.toString: 0: NotNull, 1: NotNull, 2: NotNull
+    //                                 ARETURN: 0: NotNull, 1: NotNull, 2: Unknown
+
+    for ((insn, index, nullness) <- List(
+      ("+NEW", 2, Unknown),                                    // new value at slot 2 on the stack
+      ("+DUP", 3, Unknown),
+      ("+INVOKESPECIAL java/lang/Object", 2, NotNull),         // after calling the initializer on 3, the value at 2 becomes NotNull
+      ("ASTORE 1", 1, Unknown),                                // before the ASTORE 1, nullness of the value in local 1 is Unknown
+      ("+ASTORE 1", 1, NotNull),                               // after storing the value at 2 in local 1, the local 1 is NotNull
+      ("+ALOAD 1", 2, NotNull),                                // loading the value 1 puts a NotNull value on the stack (at 2)
+      ("+INVOKEVIRTUAL java/lang/Object.toString", 2, Unknown) // nullness of value returned by `toString` is Unknown
+    )) testNullness(a, m, insn, index, nullness)
+  }
+
+  @Test
+  def explicitNull(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f = { var a: Object = null; a }")
+    val a = newNullnessAnalyzer(m)
+    for ((insn, index, nullness) <- List(
+      ("+ACONST_NULL", 2, Null),
+      ("+ASTORE 1", 1, Null),
+      ("+ALOAD 1", 2, Null)
+    )) testNullness(a, m, insn, index, nullness)
+  }
+
+  @Test
+  def stringLiteralsNotNull(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("""def f = { val a = "hi"; a.trim }""")
+    val a = newNullnessAnalyzer(m)
+    testNullness(a, m, "+ASTORE 1", 1, NotNull)
+  }
+
+  @Test
+  def newArraynotNull() {
+    val List(m) = compileMethods(noOptCompiler)("def f = { val a = new Array[Int](2); a(0) }")
+    val a = newNullnessAnalyzer(m)
+    testNullness(a, m, "+NEWARRAY T_INT", 2, NotNull) // new array on stack
+    testNullness(a, m, "+ASTORE 1", 1, NotNull)       // local var (a)
+  }
+
+  @Test
+  def aliasBranching(): Unit = {
+    val code =
+      """def f(o: Object) = {
+        |  var a: Object = o     // a and o are aliases
+        |  var b: Object = null
+        |  var c: Object = null
+        |  var d: Object = o
+        |  if ("".trim == "") {
+        |    b = o
+        |    c = o               // a, o, b,  aliases
+        |    d = null
+        |  } else {
+        |    b = a               // a, o, b aliases
+        |    d = null
+        |  }
+        |  b.toString // a, o, b aliases (so they become NotNull), but not c
+        |  // d is null here, assinged in both branches.
+        |}
+      """.stripMargin
+    val List(m) = compileMethods(noOptCompiler)(code)
+    val a = newNullnessAnalyzer(m)
+
+    val trim = "INVOKEVIRTUAL java/lang/String.trim"
+    val toSt = "INVOKEVIRTUAL java/lang/Object.toString"
+    val end  = s"+$toSt"
+    for ((insn, index, nullness) <- List(
+      (trim, 0, NotNull), // this
+      (trim, 1, Unknown), // parameter o
+      (trim, 2, Unknown), // a
+      (trim, 3, Null),    // b
+      (trim, 4, Null),    // c
+      (trim, 5, Unknown), // d
+
+      (toSt, 2, Unknown), // a, still the same
+      (toSt, 3, Unknown), // b, was re-assinged in both branches to Unknown
+      (toSt, 4, Unknown), // c, was re-assigned in one branch to Unknown
+      (toSt, 5, Null),    // d, was assigned to null in both branches
+
+      (end, 2, NotNull),  // a, NotNull (alias of b)
+      (end, 3, NotNull),  // b, receiver of toString
+      (end, 4, Unknown),  // c, no change (not an alias of b)
+      (end, 5, Null)      // d, no change
+    )) testNullness(a, m, insn, index, nullness)
+  }
+
+  @Test
+  def testInstanceOf(): Unit = {
+    val code =
+      """def f(a: Object) = {
+        |  val x = a
+        |  x.isInstanceOf[Throwable]    // x and a remain unknown - INSTANCEOF doesn't throw a NPE on null
+        |  x.toString                   // x and a are not null
+        |  a.asInstanceOf[String].trim  // the stack value (LOAD of local a) is still not-null after the CHECKCAST
+        |}
+      """.stripMargin
+    val List(m) = compileMethods(noOptCompiler)(code)
+    val a = newNullnessAnalyzer(m)
+
+    val instof = "+INSTANCEOF"
+    val tost   = "+INVOKEVIRTUAL java/lang/Object.toString"
+    val trim   = "INVOKEVIRTUAL java/lang/String.trim"
+
+    for ((insn, index, nullness) <- List(
+      (instof, 1, Unknown), // a after INSTANCEOF
+      (instof, 2, Unknown), // x after INSTANCEOF
+      (tost, 1, NotNull),
+      (tost, 2, NotNull),
+      (trim, 3, NotNull)  // receiver at `trim`
+    )) testNullness(a, m, insn, index, nullness)
+  }
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/analysis/ProdConsAnalyzerTest.scala b/test/junit/scala/tools/nsc/backend/jvm/analysis/ProdConsAnalyzerTest.scala
new file mode 100644
index 0000000..941a167
--- /dev/null
+++ b/test/junit/scala/tools/nsc/backend/jvm/analysis/ProdConsAnalyzerTest.scala
@@ -0,0 +1,291 @@
+package scala.tools.nsc
+package backend.jvm
+package analysis
+
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Assert._
+
+import scala.tools.asm.Opcodes
+import scala.tools.asm.tree.AbstractInsnNode
+import scala.tools.partest.ASMConverters._
+import scala.tools.testing.ClearAfterClass
+import CodeGenTools._
+import AsmUtils._
+
+object ProdConsAnalyzerTest extends ClearAfterClass.Clearable {
+  var noOptCompiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:none")
+
+  def clear(): Unit = {
+    noOptCompiler = null
+  }
+}
+
+ at RunWith(classOf[JUnit4])
+class ProdConsAnalyzerTest extends ClearAfterClass {
+  ClearAfterClass.stateToClear = ProdConsAnalyzerTest
+  val noOptCompiler = ProdConsAnalyzerTest.noOptCompiler
+
+  def prodToString(producer: AbstractInsnNode) = producer match {
+    case p: InitialProducer => p.toString
+    case p => textify(p)
+  }
+
+  def testSingleInsn(singletonInsns: Traversable[AbstractInsnNode], expected: String): Unit = {
+    testInsn(single(singletonInsns), expected)
+  }
+
+  def testMultiInsns(insns: Traversable[AbstractInsnNode], expected: Traversable[String]): Unit = {
+    assertTrue(s"Sizes don't match: ${insns.size} vs ${expected.size}", insns.size == expected.size)
+    for (insn <- insns) {
+      val txt = prodToString(insn)
+      assertTrue(s"Instruction $txt not found in ${expected mkString ", "}", expected.exists(txt.contains))
+    }
+  }
+
+  def testInsn(insn: AbstractInsnNode, expected: String): Unit = {
+    val txt = prodToString(insn)
+    assertTrue(s"Expected $expected, found $txt", txt contains expected)
+  }
+
+  def single[T](c: Traversable[T]): T = {
+    assertTrue(s"Expected singleton collection, got $c", c.size == 1)
+    c.head
+  }
+
+  @Test
+  def parameters(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f = this.toString")
+    val a = new ProdConsAnalyzer(m, "C")
+    val call = findInstr(m, "INVOKEVIRTUAL").head
+
+    testSingleInsn(a.producersForValueAt(call, 1), "ALOAD 0") // producer of stack value
+    testSingleInsn(a.producersForInputsOf(call), "ALOAD 0")
+
+    testSingleInsn(a.consumersOfValueAt(call.getNext, 1), "ARETURN")  // consumer of `toString` result
+    testSingleInsn(a.consumersOfOutputsFrom(call), "ARETURN")
+
+    testSingleInsn(a.ultimateConsumersOfValueAt(call.getNext, 1), "ARETURN")
+
+    testSingleInsn(a.initialProducersForValueAt(call, 1), "ParameterProducer")
+    testSingleInsn(a.producersForValueAt(call, 0), "ParameterProducer")
+  }
+
+  @Test
+  def parametersInitialProducer(): Unit = {
+    // mutates a parameter local (not possible in scala, but in bytecode)
+    import Opcodes._
+    val m = genMethod(descriptor = "(I)I")(
+      Label(0),
+      VarOp(ILOAD, 1),
+      Jump(IFNE, Label(1)),
+      Op(ICONST_1),
+      VarOp(ISTORE, 1),
+      Label(1),
+      VarOp(ILOAD, 1),
+      Op(IRETURN),
+      Label(2)
+    )
+    m.maxLocals = 2
+    m.maxStack = 1
+    val a = new ProdConsAnalyzer(m, "C")
+
+    val ifne = findInstr(m, "IFNE").head
+    testSingleInsn(a.producersForValueAt(ifne, 1), "ParameterProducer")
+
+    val ret = findInstr(m, "IRETURN").head
+    testMultiInsns(a.producersForValueAt(ret, 1), List("ParameterProducer", "ISTORE 1"))
+  }
+
+  @Test
+  def branching(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f(x: Int) = { var a = x; if (a == 0) a = 12; a }")
+    val a = new ProdConsAnalyzer(m, "C")
+
+    val List(ret) = findInstr(m, "IRETURN")
+    testMultiInsns(a.producersForValueAt(ret, 2), List("ISTORE 2", "ISTORE 2"))
+    testMultiInsns(a.initialProducersForValueAt(ret, 2), List("BIPUSH 12", "ParameterProducer"))
+
+    val List(bipush) = findInstr(m, "BIPUSH 12")
+    testSingleInsn(a.consumersOfOutputsFrom(bipush), "ISTORE 2")
+    testSingleInsn(a.ultimateConsumersOfValueAt(bipush.getNext, 3), "IRETURN")
+  }
+
+  @Test
+  def checkCast(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f(o: Object) = o.asInstanceOf[String]")
+    val a = new ProdConsAnalyzer(m, "C")
+    assert(findInstr(m, "CHECKCAST java/lang/String").length == 1)
+
+    val List(ret) = findInstr(m, "ARETURN")
+    testSingleInsn(a.initialProducersForInputsOf(ret), "ParameterProducer(1)")
+  }
+
+  @Test
+  def instanceOf(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f(o: Object) = o.isInstanceOf[String]")
+    val a = new ProdConsAnalyzer(m, "C")
+    assert(findInstr(m, "INSTANCEOF java/lang/String").length == 1)
+
+    val List(ret) = findInstr(m, "IRETURN")
+    testSingleInsn(a.initialProducersForInputsOf(ret), "INSTANCEOF")
+  }
+
+  @Test
+  def unInitLocal(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f(b: Boolean) = { if (b) { var a = 0; println(a) }; 1 }")
+    val a = new ProdConsAnalyzer(m, "C")
+
+    val List(store) = findInstr(m, "ISTORE")
+    val List(call)  = findInstr(m, "INVOKEVIRTUAL")
+    val List(ret)   = findInstr(m, "IRETURN")
+
+    testSingleInsn(a.producersForValueAt(store, 2), "UninitializedLocalProducer(2)")
+    testSingleInsn(a.producersForValueAt(call, 2), "ISTORE")
+    testMultiInsns(a.producersForValueAt(ret, 2), List("UninitializedLocalProducer", "ISTORE"))
+  }
+
+  @Test
+  def dupCopying(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f = new Object")
+    val a = new ProdConsAnalyzer(m, "C")
+
+    val List(newO)   = findInstr(m, "NEW")
+    val List(constr) = findInstr(m, "INVOKESPECIAL")
+
+    testSingleInsn(a.producersForInputsOf(constr), "DUP")
+    testSingleInsn(a.initialProducersForInputsOf(constr), "NEW")
+
+    testSingleInsn(a.consumersOfOutputsFrom(newO), "DUP")
+    testMultiInsns(a.ultimateConsumersOfOutputsFrom(newO), List("INVOKESPECIAL", "ARETURN"))
+  }
+
+  @Test
+  def multiProducer(): Unit = {
+    import Opcodes._
+    val m = genMethod(descriptor = "(I)I")(
+      VarOp(ILOAD, 1),
+      VarOp(ILOAD, 1),
+      Op(DUP2),
+      Op(IADD),
+      Op(SWAP),
+      VarOp(ISTORE, 1),
+      Op(IRETURN)
+    )
+    m.maxLocals = 2
+    m.maxStack = 4
+    val a = new ProdConsAnalyzer(m, "C")
+
+    val List(dup2)  = findInstr(m, "DUP2")
+    val List(add)   = findInstr(m, "IADD")
+    val List(swap)  = findInstr(m, "SWAP")
+    val List(store) = findInstr(m, "ISTORE")
+    val List(ret)   = findInstr(m, "IRETURN")
+
+    testMultiInsns(a.producersForInputsOf(dup2), List("ILOAD", "ILOAD"))
+    testSingleInsn(a.consumersOfValueAt(dup2.getNext, 4), "IADD")
+    testSingleInsn(a.consumersOfValueAt(dup2.getNext, 5), "IADD")
+    testMultiInsns(a.consumersOfOutputsFrom(dup2), List("IADD", "SWAP"))
+
+    testSingleInsn(a.ultimateConsumersOfOutputsFrom(dup2), "IADD") // the 'store' is not here: it's a copying instr, so not an ultimate consumer.
+    testMultiInsns(a.consumersOfOutputsFrom(swap), List("IRETURN", "ISTORE"))
+    testSingleInsn(a.ultimateConsumersOfOutputsFrom(swap), "IRETURN") // again, no store
+    testSingleInsn(a.initialProducersForInputsOf(add), "ParameterProducer(1)")
+
+    testMultiInsns(a.producersForInputsOf(swap), List("IADD", "DUP2"))
+    testSingleInsn(a.consumersOfValueAt(swap.getNext, 4), "ISTORE")
+    testSingleInsn(a.consumersOfValueAt(swap.getNext, 3), "IRETURN")
+    testSingleInsn(a.initialProducersForInputsOf(store), "ParameterProducer(1)")
+    testSingleInsn(a.initialProducersForInputsOf(ret), "IADD")
+  }
+
+  @Test
+  def iincProdCons(): Unit = {
+    import Opcodes._
+    val m = genMethod(descriptor = "(I)I")(
+      Incr(IINC, 1, 1), // producer and consumer of local variable 1
+      VarOp(ILOAD, 1),
+      Op(IRETURN)
+    )
+    m.maxLocals = 2
+    m.maxStack = 1
+    val a = new ProdConsAnalyzer(m, "C")
+
+    val List(inc) = findInstr(m, "IINC")
+    val List(load) = findInstr(m, "ILOAD")
+    val List(ret) = findInstr(m, "IRETURN")
+
+    testSingleInsn(a.producersForInputsOf(inc), "ParameterProducer(1)")
+    testSingleInsn(a.consumersOfOutputsFrom(inc), "ILOAD")
+    testSingleInsn(a.ultimateConsumersOfOutputsFrom(inc), "IRETURN")
+    testSingleInsn(a.consumersOfValueAt(inc, 1), "IINC") // parameter value has a single consumer, the IINC
+    testSingleInsn(a.ultimateConsumersOfValueAt(inc, 1), "IINC")
+
+    testSingleInsn(a.producersForInputsOf(load), "IINC")
+    testSingleInsn(a.producersForValueAt(load, 1), "IINC")
+
+    testSingleInsn(a.initialProducersForInputsOf(ret), "IINC")
+  }
+
+  @Test
+  def copyingInsns(): Unit = {
+    val List(m) = compileMethods(noOptCompiler)("def f = 0l.asInstanceOf[Int]")
+    val a = new ProdConsAnalyzer(m, "C")
+
+    val List(cnst) = findInstr(m, "LCONST_0")
+    val List(l2i)  = findInstr(m, "L2I") // l2i is not a copying instruction
+    val List(ret)  = findInstr(m, "IRETURN")
+
+    testSingleInsn(a.consumersOfOutputsFrom(cnst), "L2I")
+    testSingleInsn(a.ultimateConsumersOfOutputsFrom(cnst), "L2I")
+
+    testSingleInsn(a.producersForInputsOf(l2i), "LCONST_0")
+    testSingleInsn(a.initialProducersForInputsOf(l2i), "LCONST_0")
+
+    testSingleInsn(a.consumersOfOutputsFrom(l2i), "IRETURN")
+    testSingleInsn(a.producersForInputsOf(ret), "L2I")
+  }
+
+  @Test
+  def cyclicProdCons(): Unit = {
+    import Opcodes._
+    val m = genMethod(descriptor = "(I)I")(
+      Label(1),
+      VarOp(ILOAD, 1),
+      IntOp(BIPUSH, 10),
+      Op(IADD),          // consumer of the above ILOAD
+
+      Op(ICONST_0),
+      Jump(IF_ICMPNE, Label(2)),
+
+      VarOp(ILOAD, 1),
+      VarOp(ISTORE, 1),
+      Jump(GOTO, Label(1)),
+
+      Label(2),
+      IntOp(BIPUSH, 9),
+      Op(IRETURN)
+    )
+    m.maxLocals = 2
+    m.maxStack = 2
+    val a = new ProdConsAnalyzer(m, "C")
+
+    val List(iadd) = findInstr(m, "IADD")
+    val firstLoad = iadd.getPrevious.getPrevious
+    assert(firstLoad.getOpcode == ILOAD)
+    val secondLoad = findInstr(m, "ISTORE").head.getPrevious
+    assert(secondLoad.getOpcode == ILOAD)
+
+    testSingleInsn(a.producersForValueAt(iadd, 2), "ILOAD")
+    testSingleInsn(a.initialProducersForValueAt(iadd, 2), "ParameterProducer(1)")
+    testMultiInsns(a.producersForInputsOf(firstLoad), List("ParameterProducer", "ISTORE"))
+    testMultiInsns(a.producersForInputsOf(secondLoad), List("ParameterProducer", "ISTORE"))
+
+    testSingleInsn(a.ultimateConsumersOfOutputsFrom(firstLoad), "IADD")
+    testSingleInsn(a.ultimateConsumersOfOutputsFrom(secondLoad), "IADD")
+
+    testSingleInsn(a.consumersOfOutputsFrom(firstLoad), "IADD")
+    testSingleInsn(a.consumersOfOutputsFrom(secondLoad), "ISTORE")
+  }
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/BTypesFromClassfileTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/BTypesFromClassfileTest.scala
index 2975bd0..1b6c080 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/BTypesFromClassfileTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/BTypesFromClassfileTest.scala
@@ -15,11 +15,14 @@ import CodeGenTools._
 import scala.tools.partest.ASMConverters
 import ASMConverters._
 
+import BackendReporting._
+
 import scala.collection.convert.decorateAsScala._
 
 @RunWith(classOf[JUnit4])
 class BTypesFromClassfileTest {
-  val compiler = newCompiler(extraArgs = "-Ybackend:GenBCode")
+  // inliner enabled -> inlineInfos are collected (and compared) in ClassBTypes
+  val compiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:inline-global")
 
   import compiler._
   import definitions._
@@ -29,6 +32,7 @@ class BTypesFromClassfileTest {
   def duringBackend[T](f: => T) = compiler.exitingDelambdafy(f)
 
   val run = new compiler.Run() // initializes some of the compiler
+  duringBackend(compiler.scalaPrimitives.init()) // needed: it's only done when running the backend, and we don't actually run the compiler
   duringBackend(bTypes.initializeCoreBTypes())
 
   def clearCache() = bTypes.classBTypeFromInternalName.clear()
@@ -37,7 +41,7 @@ class BTypesFromClassfileTest {
     if (checked(fromSym.internalName)) checked
     else {
       assert(fromSym == fromClassfile, s"$fromSym != $fromClassfile")
-      sameInfo(fromSym.info, fromClassfile.info, checked + fromSym.internalName)
+      sameInfo(fromSym.info.get, fromClassfile.info.get, checked + fromSym.internalName)
     }
   }
 
@@ -57,8 +61,12 @@ class BTypesFromClassfileTest {
       else (fromSym.flags | ACC_PRIVATE | ACC_PUBLIC) == (fromClassfile.flags | ACC_PRIVATE | ACC_PUBLIC)
     }, s"class flags differ\n$fromSym\n$fromClassfile")
 
-    val chk1 = sameBTypes(fromSym.superClass, fromClassfile.superClass, checked)
+    // we don't compare InlineInfos in this test: in both cases (from symbol and from classfile) they
+    // are actually created by looking at the classfile members, not the symbol's. InlineInfos are only
+    // built from symbols for classes that are being compiled, which is not the case here. Instead
+    // there's a separate InlineInfoTest.
 
+    val chk1 = sameBTypes(fromSym.superClass, fromClassfile.superClass, checked)
     val chk2 = sameBTypes(fromSym.interfaces, fromClassfile.interfaces, chk1)
 
     // The fromSym info has only member classes, no local or anonymous. The symbol is read from the
@@ -67,7 +75,7 @@ class BTypesFromClassfileTest {
     //   and anonymous classes as members of the outer class. But not for unpickled symbols).
     // The fromClassfile info has all nested classes, including anonymous and local. So we filter
     // them out: member classes are identified by having the `outerName` defined.
-    val memberClassesFromClassfile = fromClassfile.nestedClasses.filter(_.info.nestedInfo.get.outerName.isDefined)
+    val memberClassesFromClassfile = fromClassfile.nestedClasses.filter(_.info.get.nestedInfo.get.outerName.isDefined)
     // Sorting is required: the backend sorts all InnerClass entries by internalName before writing
     // them to the classfile (to make it deterministic: the entries are collected in a Set during
     // code generation).
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/CallGraphTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/CallGraphTest.scala
new file mode 100644
index 0000000..9fda034
--- /dev/null
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/CallGraphTest.scala
@@ -0,0 +1,152 @@
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+import scala.collection.generic.Clearable
+import scala.tools.asm.Opcodes._
+import org.junit.Assert._
+
+import scala.tools.asm.tree._
+import scala.tools.asm.tree.analysis._
+import scala.tools.nsc.reporters.StoreReporter
+import scala.tools.testing.AssertUtil._
+
+import CodeGenTools._
+import scala.tools.partest.ASMConverters
+import ASMConverters._
+import AsmUtils._
+import BackendReporting._
+
+import scala.collection.convert.decorateAsScala._
+
+ at RunWith(classOf[JUnit4])
+class CallGraphTest {
+  val compiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:inline-global -Yopt-warnings")
+  import compiler.genBCode.bTypes._
+
+  // allows inspecting the caches after a compilation run
+  val notPerRun: List[Clearable] = List(classBTypeFromInternalName, byteCodeRepository.classes, callGraph.callsites)
+  notPerRun foreach compiler.perRunCaches.unrecordCache
+
+  def compile(code: String, allowMessage: StoreReporter#Info => Boolean): List[ClassNode] = {
+    notPerRun.foreach(_.clear())
+    compileClasses(compiler)(code, allowMessage = allowMessage)
+  }
+
+  def callsInMethod(methodNode: MethodNode): List[MethodInsnNode] = methodNode.instructions.iterator.asScala.collect({
+    case call: MethodInsnNode => call
+  }).toList
+
+  @Test
+  def callGraphStructure(): Unit = {
+    val code =
+      """class C {
+        |  // try-catch prevents inlining - we want to analyze the callsite
+        |  def f1                   = try { 0 } catch { case _: Throwable => 1 }
+        |  final def f2             = try { 0 } catch { case _: Throwable => 1 }
+        |
+        |  @inline def f3           = try { 0 } catch { case _: Throwable => 1 }
+        |  @inline final def f4     = try { 0 } catch { case _: Throwable => 1 }
+        |
+        |  @noinline def f5         = try { 0 } catch { case _: Throwable => 1 }
+        |  @noinline final def f6   = try { 0 } catch { case _: Throwable => 1 }
+        |
+        |  @inline @noinline def f7 = try { 0 } catch { case _: Throwable => 1 }
+        |}
+        |class D extends C {
+        |  @inline override def f1  = try { 0 } catch { case _: Throwable => 1 }
+        |  override final def f3    = try { 0 } catch { case _: Throwable => 1 }
+        |}
+        |object C {
+        |  def g1                   = try { 0 } catch { case _: Throwable => 1 }
+        |}
+        |class Test {
+        |  def t1(c: C) = c.f1 + c.f2 + c.f3 + c.f4 + c.f5 + c.f6 + c.f7 + C.g1
+        |  def t2(d: D) = d.f1 + d.f2 + d.f3 + d.f4 + d.f5 + d.f6 + d.f7 + C.g1
+        |}
+      """.stripMargin
+
+    // Get the ClassNodes from the code repo (don't use the unparsed ClassNodes returned by compile).
+    // The callGraph.callsites map is indexed by instructions of those ClassNodes.
+
+    val ok = Set(
+      "D::f1()I is annotated @inline but cannot be inlined: the method is not final and may be overridden", // only one warning for D.f1: C.f1 is not annotated @inline
+      "C::f3()I is annotated @inline but cannot be inlined: the method is not final and may be overridden", // only one warning for C.f3: D.f3 does not have @inline (and it would also be safe to inline)
+      "C::f7()I is annotated @inline but cannot be inlined: the method is not final and may be overridden", // two warnings (the error message mentions C.f7 even if the receiver type is D, because f7 is inherited from C)
+      "operand stack at the callsite in Test::t1(LC;)I contains more values",
+      "operand stack at the callsite in Test::t2(LD;)I contains more values")
+    var msgCount = 0
+    val checkMsg = (m: StoreReporter#Info) => {
+      msgCount += 1
+      ok exists (m.msg contains _)
+    }
+    val List(cCls, cMod, dCls, testCls) = compile(code, checkMsg).map(c => byteCodeRepository.classNode(c.name).get)
+    assert(msgCount == 6, msgCount)
+
+    val List(cf1, cf2, cf3, cf4, cf5, cf6, cf7) = cCls.methods.iterator.asScala.filter(_.name.startsWith("f")).toList.sortBy(_.name)
+    val List(df1, df3) = dCls.methods.iterator.asScala.filter(_.name.startsWith("f")).toList.sortBy(_.name)
+    val g1 = cMod.methods.iterator.asScala.find(_.name == "g1").get
+    val List(t1, t2) = testCls.methods.iterator.asScala.filter(_.name.startsWith("t")).toList.sortBy(_.name)
+
+    val List(cf1Call, cf2Call, cf3Call, cf4Call, cf5Call, cf6Call, cf7Call, cg1Call) = callsInMethod(t1)
+    val List(df1Call, df2Call, df3Call, df4Call, df5Call, df6Call, df7Call, dg1Call) = callsInMethod(t2)
+
+    def checkCallsite(callsite: callGraph.Callsite,
+                      call: MethodInsnNode, callsiteMethod: MethodNode, target: MethodNode, calleeDeclClass: ClassBType,
+                      safeToInline: Boolean, atInline: Boolean, atNoInline: Boolean) = try {
+      assert(callsite.callsiteInstruction == call)
+      assert(callsite.callsiteMethod == callsiteMethod)
+      val callee = callsite.callee.get
+      assert(callee.callee == target)
+      assert(callee.calleeDeclarationClass == calleeDeclClass)
+      assert(callee.safeToInline == safeToInline)
+      assert(callee.annotatedInline == atInline)
+      assert(callee.annotatedNoInline == atNoInline)
+
+      assert(callsite.argInfos == List()) // not defined yet
+    } catch {
+      case e: Throwable => println(callsite); throw e
+    }
+
+    val cClassBType  = classBTypeFromClassNode(cCls)
+    val cMClassBType = classBTypeFromClassNode(cMod)
+    val dClassBType  = classBTypeFromClassNode(dCls)
+
+    checkCallsite(callGraph.callsites(cf1Call),
+      cf1Call, t1, cf1, cClassBType, false, false, false)
+    checkCallsite(callGraph.callsites(cf2Call),
+      cf2Call, t1, cf2, cClassBType, true, false, false)
+    checkCallsite(callGraph.callsites(cf3Call),
+      cf3Call, t1, cf3, cClassBType, false, true, false)
+    checkCallsite(callGraph.callsites(cf4Call),
+      cf4Call, t1, cf4, cClassBType, true, true, false)
+    checkCallsite(callGraph.callsites(cf5Call),
+      cf5Call, t1, cf5, cClassBType, false, false, true)
+    checkCallsite(callGraph.callsites(cf6Call),
+      cf6Call, t1, cf6, cClassBType, true, false, true)
+    checkCallsite(callGraph.callsites(cf7Call),
+      cf7Call, t1, cf7, cClassBType, false, true, true)
+    checkCallsite(callGraph.callsites(cg1Call),
+      cg1Call, t1, g1, cMClassBType, true, false, false)
+
+    checkCallsite(callGraph.callsites(df1Call),
+      df1Call, t2, df1, dClassBType, false, true, false)
+    checkCallsite(callGraph.callsites(df2Call),
+      df2Call, t2, cf2, cClassBType, true, false, false)
+    checkCallsite(callGraph.callsites(df3Call),
+      df3Call, t2, df3, dClassBType, true, false, false)
+    checkCallsite(callGraph.callsites(df4Call),
+      df4Call, t2, cf4, cClassBType, true, true, false)
+    checkCallsite(callGraph.callsites(df5Call),
+      df5Call, t2, cf5, cClassBType, false, false, true)
+    checkCallsite(callGraph.callsites(df6Call),
+      df6Call, t2, cf6, cClassBType, true, false, true)
+    checkCallsite(callGraph.callsites(df7Call),
+      df7Call, t2, cf7, cClassBType, false, true, true)
+    checkCallsite(callGraph.callsites(dg1Call),
+      dg1Call, t2, g1, cMClassBType, true, false, false)
+  }
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/CompactLocalVariablesTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/CompactLocalVariablesTest.scala
index fc74819..76492cf 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/CompactLocalVariablesTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/CompactLocalVariablesTest.scala
@@ -17,8 +17,8 @@ class CompactLocalVariablesTest {
 
   // recurse-unreachable-jumps is required for eliminating catch blocks, in the first dce round they
   // are still live.only after eliminating the empty handler the catch blocks become unreachable.
-  val methodOptCompiler     = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:unreachable-code,recurse-unreachable-jumps,compact-locals")
-  val noCompactVarsCompiler = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:unreachable-code,recurse-unreachable-jumps")
+  val methodOptCompiler     = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:unreachable-code,compact-locals")
+  val noCompactVarsCompiler = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:unreachable-code")
 
   @Test
   def compactUnused(): Unit = {
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/EmptyExceptionHandlersTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/EmptyExceptionHandlersTest.scala
index 7d83c54..cb01f3d 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/EmptyExceptionHandlersTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/EmptyExceptionHandlersTest.scala
@@ -11,9 +11,23 @@ import org.junit.Assert._
 import CodeGenTools._
 import scala.tools.partest.ASMConverters
 import ASMConverters._
+import scala.tools.testing.ClearAfterClass
+
+object EmptyExceptionHandlersTest extends ClearAfterClass.Clearable {
+  var noOptCompiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:none")
+  var dceCompiler   = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:unreachable-code")
+  def clear(): Unit = {
+    noOptCompiler = null
+    dceCompiler = null
+  }
+}
 
 @RunWith(classOf[JUnit4])
-class EmptyExceptionHandlersTest {
+class EmptyExceptionHandlersTest extends ClearAfterClass {
+  ClearAfterClass.stateToClear = EmptyExceptionHandlersTest
+
+  val noOptCompiler = EmptyExceptionHandlersTest.noOptCompiler
+  val dceCompiler   = EmptyExceptionHandlersTest.dceCompiler
 
   val exceptionDescriptor = "java/lang/Exception"
 
@@ -26,7 +40,7 @@ class EmptyExceptionHandlersTest {
       Op(RETURN)
     )
     assertTrue(convertMethod(asmMethod).handlers.length == 1)
-    localOpt.removeEmptyExceptionHandlers(asmMethod)
+    LocalOptImpls.removeEmptyExceptionHandlers(asmMethod)
     assertTrue(convertMethod(asmMethod).handlers.isEmpty)
   }
 
@@ -47,13 +61,10 @@ class EmptyExceptionHandlersTest {
       Op(RETURN)
     )
     assertTrue(convertMethod(asmMethod).handlers.length == 1)
-    localOpt.removeEmptyExceptionHandlers(asmMethod)
+    LocalOptImpls.removeEmptyExceptionHandlers(asmMethod)
     assertTrue(convertMethod(asmMethod).handlers.isEmpty)
   }
 
-  val noOptCompiler       = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:none")
-  val dceCompiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:unreachable-code")
-
   @Test
   def eliminateUnreachableHandler(): Unit = {
     val code = "def f: Unit = try { } catch { case _: Exception => println(0) }; println(1)"
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/EmptyLabelsAndLineNumbersTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/EmptyLabelsAndLineNumbersTest.scala
index 8c01688..7283e20 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/EmptyLabelsAndLineNumbersTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/EmptyLabelsAndLineNumbersTest.scala
@@ -42,14 +42,14 @@ class EmptyLabelsAndLineNumbersTest {
     )
 
     val method = genMethod()(ops.map(_._1): _*)
-    assertTrue(localOpt.removeEmptyLineNumbers(method))
+    assertTrue(LocalOptImpls.removeEmptyLineNumbers(method))
     assertSameCode(instructionsFromMethod(method), ops.filter(_._2).map(_._1))
   }
 
   @Test
   def badlyLocatedLineNumbers(): Unit = {
     def t(ops: Instruction*) =
-      assertThrows[AssertionError](localOpt.removeEmptyLineNumbers(genMethod()(ops: _*)))
+      assertThrows[AssertionError](LocalOptImpls.removeEmptyLineNumbers(genMethod()(ops: _*)))
 
     // line numbers have to be right after their referenced label node
     t(LineNumber(0, Label(1)), Label(1))
@@ -88,7 +88,7 @@ class EmptyLabelsAndLineNumbersTest {
     )
 
     val method = genMethod(handlers = handler)(ops(2, 3, 8, 8, 9, 11).map(_._1): _*)
-    assertTrue(localOpt.removeEmptyLabelNodes(method))
+    assertTrue(LocalOptImpls.removeEmptyLabelNodes(method))
     val m = convertMethod(method)
     assertSameCode(m.instructions, ops(1, 1, 7, 7, 7, 10).filter(_._2).map(_._1))
     assertTrue(m.handlers match {
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/InlineInfoTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/InlineInfoTest.scala
new file mode 100644
index 0000000..57088bd
--- /dev/null
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/InlineInfoTest.scala
@@ -0,0 +1,67 @@
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+import scala.collection.generic.Clearable
+import org.junit.Assert._
+
+import CodeGenTools._
+import scala.tools.partest.ASMConverters
+import ASMConverters._
+import AsmUtils._
+import scala.tools.testing.ClearAfterClass
+
+import BackendReporting._
+
+import scala.collection.convert.decorateAsScala._
+
+object InlineInfoTest extends ClearAfterClass.Clearable {
+  var compiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:classpath")
+  def clear(): Unit = { compiler = null }
+
+  def notPerRun: List[Clearable] = List(compiler.genBCode.bTypes.classBTypeFromInternalName, compiler.genBCode.bTypes.byteCodeRepository.classes)
+  notPerRun foreach compiler.perRunCaches.unrecordCache
+}
+
+ at RunWith(classOf[JUnit4])
+class InlineInfoTest {
+  val compiler = InlineInfoTest.compiler
+
+  def compile(code: String) = {
+    InlineInfoTest.notPerRun.foreach(_.clear())
+    compileClasses(compiler)(code)
+  }
+
+  @Test
+  def inlineInfosFromSymbolAndAttribute(): Unit = {
+    val code =
+      """trait T {
+        |  @inline def f: Int
+        |  @noinline final def g = 0
+        |}
+        |trait U { self: T =>
+        |  @inline def f = 0
+        |  final def h = 0
+        |  final class K {
+        |    @inline def i = 0
+        |  }
+        |}
+        |sealed trait V {
+        |  @inline def j = 0
+        |}
+        |class C extends T with U
+      """.stripMargin
+    val classes = compile(code)
+    val fromSyms = classes.map(c => compiler.genBCode.bTypes.classBTypeFromInternalName(c.name).info.get.inlineInfo)
+
+    val fromAttrs = classes.map(c => {
+      assert(c.attrs.asScala.exists(_.isInstanceOf[InlineInfoAttribute]), c.attrs)
+      compiler.genBCode.bTypes.inlineInfoFromClassfile(c)
+    })
+
+    assert(fromSyms == fromAttrs)
+  }
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/InlineWarningTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/InlineWarningTest.scala
new file mode 100644
index 0000000..029caa9
--- /dev/null
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/InlineWarningTest.scala
@@ -0,0 +1,194 @@
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+import scala.collection.generic.Clearable
+import scala.collection.mutable.ListBuffer
+import scala.reflect.internal.util.BatchSourceFile
+import scala.tools.asm.Opcodes._
+import org.junit.Assert._
+
+import scala.tools.asm.tree._
+import scala.tools.asm.tree.analysis._
+import scala.tools.nsc.backend.jvm.opt.BytecodeUtils.AsmAnalyzer
+import scala.tools.nsc.io._
+import scala.tools.nsc.reporters.StoreReporter
+import scala.tools.testing.AssertUtil._
+
+import CodeGenTools._
+import scala.tools.partest.ASMConverters
+import ASMConverters._
+import AsmUtils._
+
+import BackendReporting._
+
+import scala.collection.convert.decorateAsScala._
+import scala.tools.testing.ClearAfterClass
+
+object InlineWarningTest extends ClearAfterClass.Clearable {
+  val argsNoWarn = "-Ybackend:GenBCode -Yopt:l:classpath"
+  val args = argsNoWarn + " -Yopt-warnings"
+  var compiler = newCompiler(extraArgs = args)
+  def clear(): Unit = { compiler = null }
+}
+
+ at RunWith(classOf[JUnit4])
+class InlineWarningTest extends ClearAfterClass {
+  ClearAfterClass.stateToClear = InlineWarningTest
+
+  val compiler = InlineWarningTest.compiler
+
+  def compile(scalaCode: String, javaCode: List[(String, String)] = Nil, allowMessage: StoreReporter#Info => Boolean = _ => false): List[ClassNode] = {
+    compileClasses(compiler)(scalaCode, javaCode, allowMessage)
+  }
+
+  @Test
+  def nonFinal(): Unit = {
+    val code =
+      """class C {
+        |  @inline def m1 = 1
+        |}
+        |trait T {
+        |  @inline def m2 = 1
+        |}
+        |class D extends C with T
+        |
+        |class Test {
+        |  def t1(c: C, t: T, d: D) = c.m1 + t.m2 + d.m1 + d.m2
+        |}
+      """.stripMargin
+    var count = 0
+    val warns = Set(
+      "C::m1()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
+      "T::m2()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
+      "D::m2()I is annotated @inline but cannot be inlined: the method is not final and may be overridden")
+    compile(code, allowMessage = i => {count += 1; warns.exists(i.msg contains _)})
+    assert(count == 4, count)
+  }
+
+  @Test
+  def traitMissingImplClass(): Unit = {
+    val codeA = "trait T { @inline final def f = 1 }"
+    val codeB = "class C { def t1(t: T) = t.f }"
+
+    val removeImpl = (outDir: AbstractFile) => {
+      val f = outDir.lookupName("T$class.class", directory = false)
+      if (f != null) f.delete()
+    }
+
+    val warn =
+      """T::f()I is annotated @inline but cannot be inlined: the trait method call could not be rewritten to the static implementation method. Possible reason:
+        |The method f(LT;)I could not be found in the class T$class or any of its parents.
+        |Note that the following parent classes could not be found on the classpath: T$class""".stripMargin
+
+    var c = 0
+    compileSeparately(List(codeA, codeB), extraArgs = InlineWarningTest.args, afterEach = removeImpl, allowMessage = i => {c += 1; i.msg contains warn})
+    assert(c == 1, c)
+
+    // only summary here
+    compileSeparately(List(codeA, codeB), extraArgs = InlineWarningTest.argsNoWarn, afterEach = removeImpl, allowMessage = _.msg contains "there was one inliner warning")
+  }
+
+  @Test
+  def handlerNonEmptyStack(): Unit = {
+    val code =
+      """class C {
+        |  @noinline def q = 0
+        |  @inline final def foo = try { q } catch { case e: Exception => 2 }
+        |  def t1 = println(foo) // inline warning here: foo cannot be inlined on top of a non-empty stack
+        |}
+      """.stripMargin
+
+    var c = 0
+    compile(code, allowMessage = i => {c += 1; i.msg contains "operand stack at the callsite in C::t1()V contains more values"})
+    assert(c == 1, c)
+  }
+
+  @Test
+  def mixedWarnings(): Unit = {
+    val javaCode =
+      """public class A {
+        |  public static final int bar() { return 100; }
+        |}
+      """.stripMargin
+
+    val scalaCode =
+      """class B {
+        |  @inline final def flop = A.bar
+        |  def g = flop
+        |}
+      """.stripMargin
+
+    val warns = List(
+      """failed to determine if bar should be inlined:
+        |The method bar()I could not be found in the class A or any of its parents.
+        |Note that the following parent classes are defined in Java sources (mixed compilation), no bytecode is available: A""".stripMargin,
+
+      """B::flop()I is annotated @inline but could not be inlined:
+        |Failed to check if B::flop()I can be safely inlined to B without causing an IllegalAccessError. Checking instruction INVOKESTATIC A.bar ()I failed:
+        |The method bar()I could not be found in the class A or any of its parents.
+        |Note that the following parent classes are defined in Java sources (mixed compilation), no bytecode is available: A""".stripMargin)
+
+    var c = 0
+    val List(b) = compile(scalaCode, List((javaCode, "A.java")), allowMessage = i => {c += 1; warns.tail.exists(i.msg contains _)})
+    assert(c == 1, c)
+
+    // no warnings here
+    compileClasses(newCompiler(extraArgs = InlineWarningTest.argsNoWarn + " -Yopt-warnings:none"))(scalaCode, List((javaCode, "A.java")))
+
+    c = 0
+    compileClasses(newCompiler(extraArgs = InlineWarningTest.argsNoWarn + " -Yopt-warnings:no-inline-mixed"))(scalaCode, List((javaCode, "A.java")), allowMessage = i => {c += 1; warns.exists(i.msg contains _)})
+    assert(c == 2, c)
+  }
+
+  @Test
+  def cannotInlinePrivateCallIntoDifferentClass(): Unit = {
+    val code =
+      """class M {
+        |  @inline final def f = {
+        |    @noinline def nested = 0
+        |    nested
+        |  }
+        |
+        |  def t = f // ok
+        |}
+        |
+        |class N {
+        |  def t(a: M) = a.f // not possible
+        |}
+      """.stripMargin
+
+    val warn =
+      """M::f()I is annotated @inline but could not be inlined:
+        |The callee M::f()I contains the instruction INVOKESPECIAL M.nested$1 ()I
+        |that would cause an IllegalAccessError when inlined into class N""".stripMargin
+
+    var c = 0
+    compile(code, allowMessage = i => { c += 1; i.msg contains warn })
+    assert(c == 1, c)
+  }
+
+  @Test
+  def cannotMixStrictfp(): Unit = {
+    val code =
+      """import annotation.strictfp
+        |class C {
+        |  @strictfp @inline final def f = 0
+        |  @strictfp def t1 = f
+        |  def t2 = f
+        |}
+      """.stripMargin
+
+    val warn =
+      """C::f()I is annotated @inline but could not be inlined:
+        |The callsite method C::t2()I
+        |does not have the same strictfp mode as the callee C::f()I.""".stripMargin
+
+    var c = 0
+    compile(code, allowMessage = i => { c += 1; i.msg contains warn })
+    assert(c == 1, c)
+  }
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerIllegalAccessTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerIllegalAccessTest.scala
new file mode 100644
index 0000000..7ed0e13
--- /dev/null
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerIllegalAccessTest.scala
@@ -0,0 +1,202 @@
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+import scala.tools.asm.Opcodes._
+import org.junit.Assert._
+
+import scala.tools.asm.tree._
+import scala.tools.testing.AssertUtil._
+
+import CodeGenTools._
+import scala.tools.partest.ASMConverters
+import ASMConverters._
+import AsmUtils._
+
+import scala.collection.convert.decorateAsScala._
+import scala.tools.testing.ClearAfterClass
+
+object InlinerIllegalAccessTest extends ClearAfterClass.Clearable {
+  var compiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:none")
+  def clear(): Unit = { compiler = null }
+}
+
+ at RunWith(classOf[JUnit4])
+class InlinerIllegalAccessTest extends ClearAfterClass {
+  ClearAfterClass.stateToClear = InlinerIllegalAccessTest
+
+  val compiler = InlinerIllegalAccessTest.compiler
+  import compiler.genBCode.bTypes._
+
+  def addToRepo(cls: List[ClassNode]): Unit = for (c <- cls) byteCodeRepository.add(c, ByteCodeRepository.Classfile)
+  def assertEmpty(ins: Option[AbstractInsnNode]) = for (i <- ins)
+    throw new AssertionError(textify(i))
+
+  @Test
+  def typeAccessible(): Unit = {
+    val code =
+      """package a {
+        |  private class C {            // the Scala compiler makes all classes public
+        |    def f1 = new C                   // NEW a/C
+        |    def f2 = new Array[C](0)         // ANEWARRAY a/C
+        |    def f3 = new Array[Array[C]](0)  // ANEWARRAY [La/C;
+        |  }
+        |  class D
+        |}
+        |package b {
+        |  class E
+        |}
+      """.stripMargin
+
+    val allClasses = compileClasses(compiler)(code)
+    val List(cClass, dClass, eClass) = allClasses
+    assert(cClass.name == "a/C" && dClass.name == "a/D" && eClass.name == "b/E", s"${cClass.name}, ${dClass.name}, ${eClass.name}")
+    addToRepo(allClasses) // they are not on the compiler's classpath, so we add them manually to the code repo
+
+    val methods = cClass.methods.asScala.filter(_.name(0) == 'f').toList
+
+    def check(classNode: ClassNode, test: Option[AbstractInsnNode] => Unit) = {
+      for (m <- methods)
+        test(inliner.findIllegalAccess(m.instructions, classBTypeFromParsedClassfile(cClass.name), classBTypeFromParsedClassfile(classNode.name)).map(_._1))
+    }
+
+    check(cClass, assertEmpty)
+    check(dClass, assertEmpty)
+    check(eClass, assertEmpty) // C is public, so accessible in E
+
+    byteCodeRepository.classes.clear()
+    classBTypeFromInternalName.clear()
+
+    cClass.access &= ~ACC_PUBLIC // ftw
+    addToRepo(allClasses)
+
+    // private classes can be accessed from the same package
+    check(cClass, assertEmpty)
+    check(dClass, assertEmpty) // accessing a private class in the same package is OK
+    check(eClass, {
+      case Some(ti: TypeInsnNode) if Set("a/C", "[La/C;")(ti.desc) => ()
+      // MatchError otherwise
+    })
+  }
+
+  @Test
+  def memberAccessible(): Unit = {
+    val code =
+      """package a {
+        |  class C {
+        |    /*public*/  def a = 0
+        |    /*default*/ def b = 0
+        |    protected   def c = 0
+        |    private     def d = 0
+        |
+        |    /*public static*/    def e = 0
+        |    /*default static*/   def f = 0
+        |    protected /*static*/ def g = 0
+        |    private /*static*/   def h = 0
+        |
+        |    def raC = a
+        |    def rbC = b
+        |    def rcC = c
+        |    def rdC = d
+        |    def reC = e
+        |    def rfC = f
+        |    def rgC = g
+        |    def rhC = h
+        |  }
+        |
+        |  class D extends C {
+        |    def rbD = b // 1: default access b, accessed in D, declared in C. can be inlined into any class in the same package as C.
+        |    def rcD = c // 2: protected c, accessed in D. can be inlined into C, D or E, but not into F (F and D are unrelated).
+        |
+        |    def rfD = f // 1
+        |    def rgD = g // 2
+        |  }
+        |  class E extends D
+        |
+        |  class F extends C
+        |
+        |  class G
+        |}
+        |
+        |package b {
+        |  class H extends a.C
+        |  class I
+        |}
+      """.stripMargin
+
+    val allClasses = compileClasses(compiler)(code)
+    val List(cCl, dCl, eCl, fCl, gCl, hCl, iCl) = allClasses
+    addToRepo(allClasses)
+
+    // set flags that Scala scala doesn't (default access, static) - a hacky way to test all access modes.
+    val names = ('a' to 'h').map(_.toString).toSet
+    val List(a, b, c, d, e, f, g, h) = cCl.methods.asScala.toList.filter(m => names(m.name))
+
+    def checkAccess(a: MethodNode, expected: Int): Unit = {
+      assert((a.access & (ACC_STATIC | ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE)) == expected, s"${a.name}, ${a.access}")
+    }
+
+                                                        checkAccess(a, ACC_PUBLIC)
+    b.access &= ~ACC_PUBLIC;                            checkAccess(b, 0) // make it default access
+    c.access &= ~ACC_PUBLIC; c.access |= ACC_PROTECTED; checkAccess(c, ACC_PROTECTED) // make it protected - scalac actually never emits PROTECTED in bytecode, see javaFlags in BTypesFromSymbols
+                                                        checkAccess(d, ACC_PRIVATE)
+
+                             e.access |= ACC_STATIC;                   checkAccess(e, ACC_STATIC | ACC_PUBLIC)
+    f.access &= ~ACC_PUBLIC; f.access |= ACC_STATIC;                   checkAccess(f, ACC_STATIC)
+    g.access &= ~ACC_PUBLIC; g.access |= (ACC_STATIC | ACC_PROTECTED); checkAccess(g, ACC_STATIC | ACC_PROTECTED)
+                             h.access |= ACC_STATIC;                   checkAccess(h, ACC_STATIC | ACC_PRIVATE)
+
+    val List(raC, rbC, rcC, rdC, reC, rfC, rgC, rhC) = cCl.methods.asScala.toList.filter(_.name(0) == 'r').sortBy(_.name)
+
+    val List(rbD, rcD, rfD, rgD) = dCl.methods.asScala.toList.filter(_.name(0) == 'r').sortBy(_.name)
+
+    def check(method: MethodNode, decl: ClassNode, dest: ClassNode, test: Option[AbstractInsnNode] => Unit): Unit = {
+      test(inliner.findIllegalAccess(method.instructions, classBTypeFromParsedClassfile(decl.name), classBTypeFromParsedClassfile(dest.name)).map(_._1))
+    }
+
+    val cOrDOwner = (_: Option[AbstractInsnNode] @unchecked) match {
+      case Some(mi: MethodInsnNode) if Set("a/C", "a/D")(mi.owner) => ()
+      // MatchError otherwise
+    }
+
+    // PUBLIC
+
+    // public methods allowed everywhere
+    for (m <- Set(raC, reC); c <- allClasses) check(m, cCl, c, assertEmpty)
+
+    // DEFAULT ACCESS
+
+    // default access OK in same package
+    for ((m, declCls) <- Set((rbC, cCl), (rfC, cCl), (rbD, dCl), (rfD, dCl)); c <- allClasses) {
+      if (c.name startsWith "a/") check(m, declCls, c, assertEmpty)
+      else check(m, declCls, c, cOrDOwner)
+    }
+
+    // PROTECTED
+
+    // protected static accessed in same class, or protected static accessed in subclass(rgD).
+    // can be inlined to sub- and superclasses, and classes in the same package (gCl)
+    for ((m, declCls) <- Set((rgC, cCl), (rgD, dCl)); c <- Set(cCl, dCl, eCl, fCl, gCl, hCl)) check(m, declCls, c, assertEmpty)
+
+    // protected in non-subclass and different package
+    for (m <- Set(rcC, rgC)) check(m, cCl, iCl, cOrDOwner)
+
+    // non-static protected accessed in subclass (rcD).
+    // can be inlined only if the destination class is related (sub- or superclass) or in the same package,
+    // AND if the receiver object is a subtype of the destination class
+    // TODO: we cannot check this yet, so the check flags the instruction as causing an IllegalAccess. https://github.com/scala-opt/scala/issues/13
+    for ((m, declCls) <- Set((rcC, cCl), (rcD, dCl)); c <- Set(cCl, dCl, eCl, fCl, gCl)) check(m, declCls, c, cOrDOwner)
+
+    // rcD cannot be inlined into non-related classes, if the declaration and destination are not in the same package
+    for (c <- Set(hCl, iCl)) check(rcD, dCl, c, cOrDOwner)
+
+    // PRIVATE
+
+    // privated method accesses can only be inlined in the same class
+    for (m <- Set(rdC, rhC)) check(m, cCl, cCl, assertEmpty)
+    for (m <- Set(rdC, rhC); c <- allClasses.tail) check(m, cCl, c, cOrDOwner)
+  }
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerSeparateCompilationTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerSeparateCompilationTest.scala
new file mode 100644
index 0000000..5c9bd1c
--- /dev/null
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerSeparateCompilationTest.scala
@@ -0,0 +1,115 @@
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+import scala.tools.asm.Opcodes._
+import org.junit.Assert._
+
+import CodeGenTools._
+import scala.tools.partest.ASMConverters
+import ASMConverters._
+import AsmUtils._
+
+import scala.collection.convert.decorateAsScala._
+
+object InlinerSeparateCompilationTest {
+  val args = "-Ybackend:GenBCode -Yopt:l:classpath"
+}
+
+ at RunWith(classOf[JUnit4])
+class InlinerSeparateCompilationTest {
+  import InlinerSeparateCompilationTest._
+  import InlinerTest.{listStringLines, assertInvoke, assertNoInvoke}
+
+  @Test
+  def inlnieMixedinMember(): Unit = {
+    val codeA =
+      """trait T {
+        |  @inline def f = 0
+        |}
+        |object O extends T {
+        |  @inline def g = 1
+        |}
+      """.stripMargin
+
+    val codeB =
+      """class C {
+        |  def t1(t: T) = t.f
+        |  def t2 = O.f
+        |  def t3 = O.g
+        |}
+      """.stripMargin
+
+    val warn = "T::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden"
+    val List(c, o, oMod, t, tCls) = compileClassesSeparately(List(codeA, codeB), args + " -Yopt-warnings", _.msg contains warn)
+    assertInvoke(getSingleMethod(c, "t1"), "T", "f")
+    assertNoInvoke(getSingleMethod(c, "t2"))
+    assertNoInvoke(getSingleMethod(c, "t3"))
+  }
+
+  @Test
+  def inlineSealedMember(): Unit = {
+    val codeA =
+      """sealed trait T {
+        |  @inline def f = 1
+        |}
+      """.stripMargin
+
+    val codeB =
+      """class C {
+        |  def t1(t: T) = t.f
+        |}
+      """.stripMargin
+
+    val List(c, t, tCls) = compileClassesSeparately(List(codeA, codeB), args)
+    assertNoInvoke(getSingleMethod(c, "t1"))
+  }
+
+  @Test
+  def inlineInheritedMember(): Unit = {
+    val codeA =
+      """trait T {
+        |  @inline final def f = 1
+        |}
+        |trait U extends T {
+        |  @inline final def g = f
+        |}
+      """.stripMargin
+
+    val codeB =
+      """class C extends U {
+        |  def t1 = this.f
+        |  def t2 = this.g
+        |  def t3(t: T) = t.f
+        |}
+      """.stripMargin
+
+    val List(c, t, tCls, u, uCls) = compileClassesSeparately(List(codeA, codeB), args)
+    for (m <- List("t1", "t2", "t3")) assertNoInvoke(getSingleMethod(c, m))
+  }
+
+  @Test
+  def inlineWithSelfType(): Unit = {
+    val assembly =
+      """trait Assembly extends T {
+        |  @inline final def g = 1
+        |  @inline final def n = m
+        |}
+      """.stripMargin
+
+    val codeA =
+      s"""trait T { self: Assembly =>
+         |  @inline final def f = g
+         |  @inline final def m = 1
+         |}
+         |$assembly
+      """.stripMargin
+
+    val List(a, aCls, t, tCls) = compileClassesSeparately(List(codeA, assembly), args)
+    assertNoInvoke(getSingleMethod(tCls, "f"))
+    assertNoInvoke(getSingleMethod(aCls, "n"))
+  }
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala
new file mode 100644
index 0000000..0309bb9
--- /dev/null
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala
@@ -0,0 +1,994 @@
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+import scala.collection.generic.Clearable
+import scala.collection.mutable.ListBuffer
+import scala.reflect.internal.util.BatchSourceFile
+import scala.tools.asm.Opcodes._
+import org.junit.Assert._
+
+import scala.tools.asm.tree._
+import scala.tools.asm.tree.analysis._
+import scala.tools.nsc.backend.jvm.opt.BytecodeUtils.AsmAnalyzer
+import scala.tools.nsc.io._
+import scala.tools.nsc.reporters.StoreReporter
+import scala.tools.testing.AssertUtil._
+
+import CodeGenTools._
+import scala.tools.partest.ASMConverters
+import ASMConverters._
+import AsmUtils._
+
+import BackendReporting._
+
+import scala.collection.convert.decorateAsScala._
+import scala.tools.testing.ClearAfterClass
+
+object InlinerTest extends ClearAfterClass.Clearable {
+  val args = "-Ybackend:GenBCode -Yopt:l:classpath -Yopt-warnings"
+  var compiler = newCompiler(extraArgs = args)
+
+  // allows inspecting the caches after a compilation run
+  def notPerRun: List[Clearable] = List(compiler.genBCode.bTypes.classBTypeFromInternalName, compiler.genBCode.bTypes.byteCodeRepository.classes, compiler.genBCode.bTypes.callGraph.callsites)
+  notPerRun foreach compiler.perRunCaches.unrecordCache
+
+  def clear(): Unit = { compiler = null }
+
+  implicit class listStringLines[T](val l: List[T]) extends AnyVal {
+    def stringLines = l.mkString("\n")
+  }
+
+  def assertNoInvoke(m: Method): Unit = assertNoInvoke(m.instructions)
+  def assertNoInvoke(ins: List[Instruction]): Unit = {
+    assert(!ins.exists(_.isInstanceOf[Invoke]), ins.stringLines)
+  }
+
+  def assertInvoke(m: Method, receiver: String, method: String): Unit = assertInvoke(m.instructions, receiver, method)
+  def assertInvoke(l: List[Instruction], receiver: String, method: String): Unit = {
+    assert(l.exists {
+      case Invoke(_, `receiver`, `method`, _, _) => true
+      case _ => false
+    }, l.stringLines)
+  }
+}
+
+ at RunWith(classOf[JUnit4])
+class InlinerTest extends ClearAfterClass {
+  ClearAfterClass.stateToClear = InlinerTest
+
+  import InlinerTest.{listStringLines, assertInvoke, assertNoInvoke}
+
+  val compiler = InlinerTest.compiler
+  import compiler.genBCode.bTypes._
+
+  def compile(scalaCode: String, javaCode: List[(String, String)] = Nil, allowMessage: StoreReporter#Info => Boolean = _ => false): List[ClassNode] = {
+    InlinerTest.notPerRun.foreach(_.clear())
+    compileClasses(compiler)(scalaCode, javaCode, allowMessage)
+  }
+
+  def checkCallsite(callsite: callGraph.Callsite, callee: MethodNode) = {
+    assert(callsite.callsiteMethod.instructions.contains(callsite.callsiteInstruction), instructionsFromMethod(callsite.callsiteMethod))
+
+    val callsiteClassNode = byteCodeRepository.classNode(callsite.callsiteClass.internalName).get
+    assert(callsiteClassNode.methods.contains(callsite.callsiteMethod), callsiteClassNode.methods.asScala.map(_.name).toList)
+
+    assert(callsite.callee.get.callee == callee, callsite.callee.get.callee.name)
+  }
+
+  // inline first invocation of f into g in class C
+  def inlineTest(code: String, mod: ClassNode => Unit = _ => ()): (MethodNode, Option[CannotInlineWarning]) = {
+    val List(cls) = compile(code)
+    mod(cls)
+    val clsBType = classBTypeFromParsedClassfile(cls.name)
+
+    val List(f, g) = cls.methods.asScala.filter(m => Set("f", "g")(m.name)).toList.sortBy(_.name)
+    val fCall = g.instructions.iterator.asScala.collect({ case i: MethodInsnNode if i.name == "f" => i }).next()
+
+    val analyzer = new AsmAnalyzer(g, clsBType.internalName)
+
+    val r = inliner.inline(
+      fCall,
+      analyzer.frameAt(fCall).getStackSize,
+      g,
+      clsBType,
+      f,
+      clsBType,
+      receiverKnownNotNull = true,
+      keepLineNumbers = true)
+    (g, r)
+  }
+
+  @Test
+  def simpleInlineOK(): Unit = {
+    val code =
+      """class C {
+        |  def f = 1
+        |  def g = f + f
+        |}
+      """.stripMargin
+
+    val (g, _) = inlineTest(code)
+
+    val gConv = convertMethod(g)
+    assertSameCode(gConv.instructions.dropNonOp,
+      List(
+        VarOp(ALOAD, 0), VarOp(ASTORE, 1), // store this
+        Op(ICONST_1), VarOp(ISTORE, 2), Jump(GOTO, Label(10)), // store return value
+        Label(10), VarOp(ILOAD, 2), // load return value
+        VarOp(ALOAD, 0), Invoke(INVOKEVIRTUAL, "C", "f", "()I", false), Op(IADD), Op(IRETURN)))
+
+    // line numbers are kept, so there's a line 2 (from the inlined f)
+    assert(gConv.instructions exists {
+      case LineNumber(2, _) => true
+      case _ => false
+    }, gConv.instructions.filter(_.isInstanceOf[LineNumber]))
+
+    assert(gConv.localVars.map(_.name).sorted == List("f_this", "this"), gConv.localVars)
+    assert(g.maxStack == 2 && g.maxLocals == 3, s"${g.maxLocals} - ${g.maxStack}")
+  }
+
+  @Test
+  def nothingTypedOK(): Unit = {
+    val code =
+      """class C {
+        |  def f: Nothing = ???
+        |  def g: Int = { f; 1 }
+        |}
+      """.stripMargin
+
+    // On the bytecode level, methods of type Nothing have return type Nothing$.
+    // This can be treated like any other result object.
+
+    // See also discussion around ATHROW in BCodeBodyBuilder
+
+    val (g, _) = inlineTest(code)
+    val expectedInlined = List(
+      VarOp(ALOAD, 0), VarOp(ASTORE, 1), // store this
+      Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"), Invoke(INVOKEVIRTUAL, "scala/Predef$", "$qmark$qmark$qmark", "()Lscala/runtime/Nothing$;", false)) // inlined call to ???
+
+    assertSameCode(convertMethod(g).instructions.dropNonOp.take(4), expectedInlined)
+
+    compiler.genBCode.bTypes.localOpt.methodOptimizations(g, "C")
+    assertSameCode(convertMethod(g).instructions.dropNonOp,
+      expectedInlined ++ List(VarOp(ASTORE, 2), VarOp(ALOAD, 2), Op(ATHROW)))
+  }
+
+  @Test
+  def synchronizedNoInline(): Unit = {
+    val code =
+      """class C {
+        |  def f: Int = 0
+        |  def g: Int = f
+        |}
+      """.stripMargin
+
+    val (_, can) = inlineTest(code, cls => {
+      val f = cls.methods.asScala.find(_.name == "f").get
+      f.access |= ACC_SYNCHRONIZED
+    })
+    assert(can.get.isInstanceOf[SynchronizedMethod], can)
+  }
+
+  @Test
+  def tryCatchOK(): Unit = {
+    val code =
+      """class C {
+        |  def f: Int = try { 1 } catch { case _: Exception => 2 }
+        |  def g = f + 1
+        |}
+      """.stripMargin
+    val (_, r) = inlineTest(code)
+    assert(r.isEmpty, r)
+  }
+
+  @Test
+  def tryCatchNoInline(): Unit = {
+    // cannot inline f: there's a value on g's stack. if f throws and enters the handler, all values
+    // on the stack are removed, including the one of g's stack that we still need.
+    val code =
+      """class C {
+        |  def f: Int = try { 1 } catch { case _: Exception => 2 }
+        |  def g = println(f)
+        |}
+      """.stripMargin
+    val (_, r) = inlineTest(code)
+    assert(r.get.isInstanceOf[MethodWithHandlerCalledOnNonEmptyStack], r)
+  }
+
+  @Test
+  def illegalAccessNoInline(): Unit = {
+    val code =
+      """package a {
+        |  class C {
+        |    private def f: Int = 0
+        |    def g: Int = f
+        |  }
+        |}
+        |package b {
+        |  class D {
+        |    def h(c: a.C): Int = c.g + 1
+        |  }
+        |}
+      """.stripMargin
+
+    val List(c, d) = compile(code)
+
+    val cTp = classBTypeFromParsedClassfile(c.name)
+    val dTp = classBTypeFromParsedClassfile(d.name)
+
+    val g = c.methods.asScala.find(_.name == "g").get
+    val h = d.methods.asScala.find(_.name == "h").get
+    val gCall = h.instructions.iterator.asScala.collect({
+      case m: MethodInsnNode if m.name == "g" => m
+    }).next()
+
+    val analyzer = new AsmAnalyzer(h, dTp.internalName)
+
+    val r = inliner.inline(
+      gCall,
+      analyzer.frameAt(gCall).getStackSize,
+      h,
+      dTp,
+      g,
+      cTp,
+      receiverKnownNotNull = true,
+      keepLineNumbers = true)
+
+    assert(r.get.isInstanceOf[IllegalAccessInstruction], r)
+  }
+
+  @Test
+  def inlineSimpleAtInline(): Unit = {
+    val code =
+      """class C {
+        |  @inline final def f = 0
+        |  final def g = 1
+        |
+        |  def test = f + g
+        |}
+      """.stripMargin
+    val List(cCls) = compile(code)
+    val instructions = getSingleMethod(cCls, "test").instructions
+    assert(instructions.contains(Op(ICONST_0)), instructions.stringLines)
+    assert(!instructions.contains(Op(ICONST_1)), instructions)
+  }
+
+  @Test
+  def cyclicInline(): Unit = {
+    val code =
+      """class C {
+        |  @inline final def f: Int = g
+        |  @inline final def g: Int = f
+        |}
+      """.stripMargin
+    val List(c) = compile(code)
+    val methods @ List(_, g) = c.methods.asScala.filter(_.name.length == 1).toList
+    val List(fIns, gIns) = methods.map(instructionsFromMethod(_).dropNonOp)
+    val invokeG = Invoke(INVOKEVIRTUAL, "C", "g", "()I", false)
+    assert(fIns contains invokeG, fIns) // no inlining into f, that request is elided
+    assert(gIns contains invokeG, gIns) // f is inlined into g, g invokes itself recursively
+
+    assert(callGraph.callsites.size == 3, callGraph.callsites)
+    for (callsite <- callGraph.callsites.values if methods.contains(callsite.callsiteMethod)) {
+      checkCallsite(callsite, g)
+    }
+  }
+
+  @Test
+  def cyclicInline2(): Unit = {
+    val code =
+      """class C {
+        |  @inline final def h: Int = f
+        |  @inline final def f: Int = g + g
+        |  @inline final def g: Int = h
+        |}
+      """.stripMargin
+    val List(c) = compile(code)
+    val methods @ List(f, g, h) = c.methods.asScala.filter(_.name.length == 1).sortBy(_.name).toList
+    val List(fIns, gIns, hIns) = methods.map(instructionsFromMethod(_).dropNonOp)
+    val invokeG = Invoke(INVOKEVIRTUAL, "C", "g", "()I", false)
+    assert(fIns.count(_ == invokeG) == 2, fIns) // no inlining into f, these requests are elided
+    assert(gIns.count(_ == invokeG) == 2, gIns)
+    assert(hIns.count(_ == invokeG) == 2, hIns)
+
+    assert(callGraph.callsites.size == 7, callGraph.callsites)
+    for (callsite <- callGraph.callsites.values if methods.contains(callsite.callsiteMethod)) {
+      checkCallsite(callsite, g)
+    }
+  }
+
+  @Test
+  def arraycopy(): Unit = {
+    // also tests inlining of a void-returning method (no return value on the stack)
+    val code =
+      """// can't use the `compat.Platform.arraycopy` from the std lib for now, because the classfile doesn't have a ScalaInlineInfo attribute
+        |object Platform {
+        |  @inline def arraycopy(src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int) {
+        |    System.arraycopy(src, srcPos, dest, destPos, length)
+        |  }
+        |}
+        |class C {
+        |  def f(src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int): Unit = {
+        |    Platform.arraycopy(src, srcPos, dest, destPos, length)
+        |  }
+        |}
+      """.stripMargin
+    val List(c, _, _) = compile(code)
+    val ins = getSingleMethod(c, "f").instructions
+    val invokeSysArraycopy = Invoke(INVOKESTATIC, "java/lang/System", "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V", false)
+    assert(ins contains invokeSysArraycopy, ins.stringLines)
+  }
+
+  @Test
+  def arrayMemberMethod(): Unit = {
+    // This used to crash when building the call graph. The `owner` field of the MethodInsnNode
+    // for the invocation of `clone` is not an internal name, but a full array descriptor
+    // [Ljava.lang.Object; - the documentation in the ASM library didn't mention that possibility.
+    val code =
+      """class C {
+        |  def f(a: Array[Object]) = {
+        |    a.clone()
+        |  }
+        |}
+      """.stripMargin
+    val List(c) = compile(code)
+    assert(callGraph.callsites.values exists (_.callsiteInstruction.name == "clone"))
+  }
+
+  @Test
+  def atInlineInTrait(): Unit = {
+    val code =
+      """trait T {
+        |  @inline final def f = 0
+        |}
+        |class C {
+        |  def g(t: T) = t.f
+        |}
+      """.stripMargin
+    val List(c, t, tClass) = compile(code)
+    assertNoInvoke(getSingleMethod(c, "g"))
+  }
+
+  @Test
+  def inlinePrivateMethodWithHandler(): Unit = {
+    val code =
+      """class C {
+        |  @inline private def f = try { 0 } catch { case _: Throwable => 1 }
+        |  def g = f
+        |}
+      """.stripMargin
+    val List(c) = compile(code)
+    // no more invoke, f is inlined
+    assertNoInvoke(getSingleMethod(c, "g"))
+  }
+
+  @Test
+  def inlineStaticCall(): Unit = {
+    val code =
+      """class C {
+        |  def f = Integer.lowestOneBit(103)
+        |}
+      """.stripMargin
+
+    val List(c) = compile(code)
+    val f = c.methods.asScala.find(_.name == "f").get
+    val callsiteIns = f.instructions.iterator().asScala.collect({ case c: MethodInsnNode => c }).next()
+    val clsBType = classBTypeFromParsedClassfile(c.name)
+    val analyzer = new AsmAnalyzer(f, clsBType.internalName)
+
+    val integerClassBType = classBTypeFromInternalName("java/lang/Integer")
+    val lowestOneBitMethod = byteCodeRepository.methodNode(integerClassBType.internalName, "lowestOneBit", "(I)I").get._1
+
+    val r = inliner.inline(
+      callsiteIns,
+      analyzer.frameAt(callsiteIns).getStackSize,
+      f,
+      clsBType,
+      lowestOneBitMethod,
+      integerClassBType,
+      receiverKnownNotNull = false,
+      keepLineNumbers = false)
+
+    assert(r.isEmpty, r)
+    val ins = instructionsFromMethod(f)
+
+    // no invocations, lowestOneBit is inlined
+    assertNoInvoke(ins)
+
+    // no null check when inlining a static method
+    ins foreach {
+      case Jump(IFNONNULL, _) => assert(false, ins.stringLines)
+      case _ =>
+    }
+  }
+
+  @Test
+  def maxLocalsMaxStackAfterInline(): Unit = {
+    val code =
+      """class C {
+        |  @inline final def f1(x: Int): Int = {
+        |    val a = x + 1
+        |    math.max(a, math.min(10, a - 1))
+        |  }
+        |
+        |  @inline final def f2(x: Int): Unit = {
+        |    val a = x + 1
+        |    println(math.max(a, 10))
+        |  }
+        |
+        |  def g1 = println(f1(32))
+        |  def g2 = println(f2(32))
+        |}
+      """.stripMargin
+
+    val List(c) = compile(code)
+    val ms @ List(f1, f2, g1, g2) = c.methods.asScala.filter(_.name.length == 2).toList
+
+    // stack height at callsite of f1 is 1, so max of g1 after inlining is max of f1 + 1
+    assert(g1.maxStack == 7 && f1.maxStack == 6, s"${g1.maxStack} - ${f1.maxStack}")
+
+    // locals in f1: this, x, a
+    // locals in g1 after inlining: this, this-of-f1, x, a, return value
+    assert(g1.maxLocals == 5 && f1.maxLocals == 3, s"${g1.maxLocals} - ${f1.maxLocals}")
+
+    // like maxStack in g1 / f1
+    assert(g2.maxStack == 5 && f2.maxStack == 4, s"${g2.maxStack} - ${f2.maxStack}")
+
+    // like maxLocals for g1 / f1, but no return value
+    assert(g2.maxLocals == 4 && f2.maxLocals == 3, s"${g2.maxLocals} - ${f2.maxLocals}")
+  }
+
+  @Test
+  def mixedCompilationNoInline(): Unit = {
+    // The inliner checks if the invocation `A.bar` can be safely inlined. For that it needs to have
+    // the bytecode of the invoked method. In mixed compilation, there's no classfile available for
+    // A, so `flop` cannot be inlined, we cannot check if it's safe.
+
+    val javaCode =
+      """public class A {
+        |  public static final int bar() { return 100; }
+        |}
+      """.stripMargin
+
+    val scalaCode =
+      """class B {
+        |  @inline final def flop = A.bar
+        |  def g = flop
+        |}
+      """.stripMargin
+
+    val warn =
+      """B::flop()I is annotated @inline but could not be inlined:
+        |Failed to check if B::flop()I can be safely inlined to B without causing an IllegalAccessError. Checking instruction INVOKESTATIC A.bar ()I failed:
+        |The method bar()I could not be found in the class A or any of its parents.
+        |Note that the following parent classes are defined in Java sources (mixed compilation), no bytecode is available: A""".stripMargin
+
+    var c = 0
+    val List(b) = compile(scalaCode, List((javaCode, "A.java")), allowMessage = i => {c += 1; i.msg contains warn})
+    assert(c == 1, c)
+    val ins = getSingleMethod(b, "g").instructions
+    val invokeFlop = Invoke(INVOKEVIRTUAL, "B", "flop", "()I", false)
+    assert(ins contains invokeFlop, ins.stringLines)
+  }
+
+  @Test
+  def inlineFromTraits(): Unit = {
+    val code =
+      """trait T {
+        |  @inline final def f = g
+        |  @inline final def g = 1
+        |}
+        |
+        |class C extends T {
+        |  def t1(t: T) = t.f
+        |  def t2(c: C) = c.f
+        |}
+      """.stripMargin
+    val List(c, t, tClass) = compile(code)
+    // both are just `return 1`, no more calls
+    assertNoInvoke(getSingleMethod(c, "t1"))
+    assertNoInvoke(getSingleMethod(c, "t2"))
+  }
+
+  @Test
+  def inlineMixinMethods(): Unit = {
+    val code =
+      """trait T {
+        |  @inline final def f = 1
+        |}
+        |class C extends T
+      """.stripMargin
+    val List(c, t, tClass) = compile(code)
+    // the static implementation method is inlined into the mixin, so there's no invocation in the mixin
+    assertNoInvoke(getSingleMethod(c, "f"))
+  }
+
+  @Test
+  def inlineTraitInherited(): Unit = {
+    val code =
+      """trait T {
+        |  @inline final def f = 1
+        |}
+        |trait U extends T {
+        |  @inline final def g = f
+        |}
+        |class C extends U {
+        |  def t1 = f
+        |  def t2 = g
+        |}
+      """.stripMargin
+    val List(c, t, tClass, u, uClass) = compile(code)
+    assertNoInvoke(getSingleMethod(c, "t1"))
+    assertNoInvoke(getSingleMethod(c, "t2"))
+  }
+
+  @Test
+  def virtualTraitNoInline(): Unit = {
+    val code =
+      """trait T {
+        |  @inline def f = 1
+        |}
+        |class C extends T {
+        |  def t1(t: T) = t.f
+        |  def t2 = this.f
+        |}
+      """.stripMargin
+    val warns = Set(
+      "C::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
+      "T::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden")
+    var count = 0
+    val List(c, t, tClass) = compile(code, allowMessage = i => {count += 1; warns.exists(i.msg contains _)})
+    assert(count == 2, count)
+    assertInvoke(getSingleMethod(c, "t1"), "T", "f")
+    assertInvoke(getSingleMethod(c, "t2"), "C", "f")
+  }
+
+  @Test
+  def sealedTraitInline(): Unit = {
+    val code =
+      """sealed trait T {
+        |  @inline def f = 1
+        |}
+        |class C {
+        |  def t1(t: T) = t.f
+        |}
+      """.stripMargin
+    val List(c, t, tClass) = compile(code)
+    assertNoInvoke(getSingleMethod(c, "t1"))
+  }
+
+  @Test
+  def inlineFromObject(): Unit = {
+    val code =
+      """trait T {
+        |  @inline def f = 0
+        |}
+        |object O extends T {
+        |  @inline def g = 1
+        |  // mixin generates `def f = T$class.f(this)`, which is inlined here (we get ICONST_0)
+        |}
+        |class C {
+        |  def t1 = O.f       // the mixin method of O is inlined, so we directly get the ICONST_0
+        |  def t2 = O.g       // object members are inlined
+        |  def t3(t: T) = t.f // no inlining here
+        |}
+      """.stripMargin
+    val warn = "T::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden"
+    var count = 0
+    val List(c, oMirror, oModule, t, tClass) = compile(code, allowMessage = i => {count += 1; i.msg contains warn})
+    assert(count == 1, count)
+
+    assertNoInvoke(getSingleMethod(oModule, "f"))
+
+    assertNoInvoke(getSingleMethod(c, "t1"))
+    assertNoInvoke(getSingleMethod(c, "t2"))
+    assertInvoke(getSingleMethod(c, "t3"), "T", "f")
+  }
+
+  @Test
+  def selfTypeInline(): Unit = {
+    val code =
+      """trait T { self: Assembly =>
+        |  @inline final def f = g
+        |  @inline final def m = 1
+        |}
+        |trait Assembly extends T {
+        |  @inline final def g = 1
+        |  @inline final def n = m // inlined. (*)
+        |  // (*) the declaration class of m is T. the signature of T$class.m is m(LAssembly;)I. so we need the self type to build the
+        |  //     signature. then we can look up the MethodNode of T$class.m and then rewrite the INVOKEINTERFACE to INVOKESTATIC.
+        |}
+        |class C {
+        |  def t1(a: Assembly) = a.f // like above, decl class is T, need self-type of T to rewrite the interface call to static.
+        |  def t2(a: Assembly) = a.n
+        |}
+      """.stripMargin
+
+    val List(assembly, assemblyClass, c, t, tClass) = compile(code)
+
+    assertNoInvoke(getSingleMethod(tClass, "f"))
+
+    assertNoInvoke(getSingleMethod(assemblyClass, "n"))
+
+    assertNoInvoke(getSingleMethod(c, "t1"))
+    assertNoInvoke(getSingleMethod(c, "t2"))
+  }
+
+  @Test
+  def selfTypeInline2(): Unit = {
+    // There are some interesting things going on here with the self types. Here's a short version:
+    //
+    //   trait T1 { def f = 1 }
+    //   trait T2a { self: T1 with T2a =>  // self type in the backend: T1
+    //     def f = 2
+    //     def g = f                       // resolved to T2a.f
+    //   }
+    //   trait T2b { self: T2b with T1 =>  // self type in the backend: T2b
+    //     def f = 2
+    //     def g = f                       // resolved to T1.f
+    //   }
+    //
+    // scala> val t = typeOf[T2a]; exitingMixin(t.typeOfThis.typeSymbol)  // self type of T2a is T1
+    // res28: $r.intp.global.Symbol = trait T1
+    //
+    // scala> typeOf[T2a].typeOfThis.member(newTermName("f")).owner       // f in T2a is resolved as T2a.f
+    // res29: $r.intp.global.Symbol = trait T2a
+    //
+    // scala> val t = typeOf[T2b]; exitingMixin(t.typeOfThis.typeSymbol)  // self type of T2b is T1
+    // res30: $r.intp.global.Symbol = trait T2b
+    //
+    // scala> typeOf[T2b].typeOfThis.member(newTermName("f")).owner       // f in T2b is resolved as T1.f
+    // res31: $r.intp.global.Symbol = trait T1
+
+    val code =
+      """trait T1 {
+        |  @inline def f: Int = 0
+        |  @inline def g1 = f     // not inlined: f not final, so T1$class.g1 has an interface call T1.f
+        |}
+        |
+        |// erased self-type (used in impl class for `self` parameter): T1
+        |trait T2a { self: T1 with T2a =>
+        |  @inline override final def f = 1
+        |  @inline def g2a = f    // inlined: resolved as T2a.f, which is re-written to T2a$class.f, so T2a$class.g2a has ICONST_1
+        |}
+        |
+        |final class Ca extends T1 with T2a {
+        |  // mixin generates accessors like `def g1 = T1$class.g1`, the impl class method call is inlined into the accessor.
+        |
+        |  def m1a = g1           // call to accessor, inlined, we get the interface call T1.f
+        |  def m2a = g2a          // call to accessor, inlined, we get ICONST_1
+        |  def m3a = f            // call to accessor, inlined, we get ICONST_1
+        |
+        |  def m4a(t: T1) = t.f   // T1.f is not final, so not inlined, interface call to T1.f
+        |  def m5a(t: T2a) = t.f  // re-written to T2a$class.f, inlined, ICONST_1
+        |}
+        |
+        |// erased self-type: T2b
+        |trait T2b { self: T2b with T1 =>
+        |  @inline override final def f = 1
+        |  @inline def g2b = f    // not inlined: resolved as T1.f, so T2b$class.g2b has an interface call T1.f
+        |}
+        |
+        |final class Cb extends T1 with T2b {
+        |  def m1b = g1           // inlined, we get the interface call to T1.f
+        |  def m2b = g2b          // inlined, we get the interface call to T1.f
+        |  def m3b = f            // inlined, we get ICONST_1
+        |
+        |  def m4b(t: T1) = t.f   // T1.f is not final, so not inlined, interface call to T1.f
+        |  def m5b(t: T2b) = t.f  // re-written to T2b$class.f, inlined, ICONST_1
+        |}
+      """.stripMargin
+
+    val warning = "T1::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden"
+    var count = 0
+    val List(ca, cb, t1, t1C, t2a, t2aC, t2b, t2bC) = compile(code, allowMessage = i => {count += 1; i.msg contains warning})
+    assert(count == 4, count) // see comments, f is not inlined 4 times
+
+    val t2aCfDesc = t2aC.methods.asScala.find(_.name == "f").get.desc
+    assert(t2aCfDesc == "(LT1;)I", t2aCfDesc) // self-type of T2a is T1
+
+    val t2bCfDesc = t2bC.methods.asScala.find(_.name == "f").get.desc
+    assert(t2bCfDesc == "(LT2b;)I", t2bCfDesc) // self-type of T2b is T2b
+
+    assertNoInvoke(getSingleMethod(t2aC, "g2a"))
+    assertInvoke(getSingleMethod(t2bC, "g2b"), "T1", "f")
+
+    assertInvoke(getSingleMethod(ca, "m1a"), "T1", "f")
+    assertNoInvoke(getSingleMethod(ca, "m2a"))            // no invoke, see comment on def g2a
+    assertNoInvoke(getSingleMethod(ca, "m3a"))
+    assertInvoke(getSingleMethod(ca, "m4a"), "T1", "f")
+    assertNoInvoke(getSingleMethod(ca, "m5a"))
+
+    assertInvoke(getSingleMethod(cb, "m1b"), "T1", "f")
+    assertInvoke(getSingleMethod(cb, "m2b"), "T1", "f")  // invoke, see comment on def g2b
+    assertNoInvoke(getSingleMethod(cb, "m3b"))
+    assertInvoke(getSingleMethod(cb, "m4b"), "T1", "f")
+    assertNoInvoke(getSingleMethod(cb, "m5b"))
+  }
+
+  @Test
+  def finalSubclassInline(): Unit = {
+    val code =
+      """class C {
+        |  @inline def f = 0
+        |  @inline final def g = 1
+        |}
+        |final class D extends C
+        |object E extends C
+        |class T {
+        |  def t1(d: D) = d.f + d.g + E.f + E.g // d.f can be inlined because the receiver type is D, which is final.
+        |}                                      // so d.f can be resolved statically. same for E.f
+      """.stripMargin
+    val List(c, d, e, eModule, t) = compile(code)
+    assertNoInvoke(getSingleMethod(t, "t1"))
+  }
+
+  @Test
+  def inlineFromNestedClasses(): Unit = {
+    val code =
+      """class C {
+        |  trait T { @inline final def f = 1 }
+        |  class D extends T{
+        |    def m(t: T) = t.f
+        |  }
+        |
+        |  def m(d: D) = d.f
+        |}
+      """.stripMargin
+    val List(c, d, t, tC) = compile(code)
+    assertNoInvoke(getSingleMethod(d, "m"))
+    assertNoInvoke(getSingleMethod(c, "m"))
+  }
+
+  @Test
+  def inlineTraitCastReceiverToSelf(): Unit = {
+    val code =
+      """class C { def foo(x: Int) = x }
+        |trait T { self: C =>
+        |  @inline final def f(x: Int) = foo(x)
+        |  def t1 = f(1)
+        |  def t2(t: T) = t.f(2)
+        |}
+      """.stripMargin
+    val List(c, t, tc) = compile(code)
+    val t1 = getSingleMethod(tc, "t1")
+    val t2 = getSingleMethod(tc, "t2")
+    val cast = TypeOp(CHECKCAST, "C")
+    Set(t1, t2).foreach(m => assert(m.instructions.contains(cast), m.instructions))
+  }
+
+  @Test
+  def abstractMethodWarning(): Unit = {
+    val code =
+      """abstract class C {
+        |  @inline def foo: Int
+        |}
+        |class T {
+        |  def t1(c: C) = c.foo
+        |}
+      """.stripMargin
+    val warn = "C::foo()I is annotated @inline but cannot be inlined: the method is not final and may be overridden"
+    var c = 0
+    compile(code, allowMessage = i => {c += 1; i.msg contains warn})
+    assert(c == 1, c)
+  }
+
+  @Test
+  def abstractFinalMethodError(): Unit = {
+    val code =
+      """abstract class C {
+        |  @inline final def foo: Int
+        |}
+        |trait T {
+        |  @inline final def bar: Int
+        |}
+      """.stripMargin
+    val err = "abstract member may not have final modifier"
+    var i = 0
+    compile(code, allowMessage = info => {i += 1; info.msg contains err})
+    assert(i == 2, i)
+  }
+
+  @Test
+  def noInlineTraitFieldAccessors(): Unit = {
+    val code =
+      """sealed trait T {
+        |  lazy val a = 0
+        |  val b = 1
+        |  final lazy val c = 2
+        |  final val d = 3
+        |  final val d1: Int = 3
+        |
+        |  @noinline def f = 5       // re-written to T$class
+        |  @noinline final def g = 6 // re-written
+        |
+        |  @noinline def h: Int
+        |  @inline def i: Int
+        |}
+        |
+        |trait U { // not sealed
+        |  lazy val a = 0
+        |  val b = 1
+        |  final lazy val c = 2
+        |  final val d = 3
+        |  final val d1: Int = 3
+        |
+        |  @noinline def f = 5       // not re-written (not final)
+        |  @noinline final def g = 6 // re-written
+        |
+        |  @noinline def h: Int
+        |  @inline def i: Int
+        |}
+        |
+        |class C {
+        |  def m1(t: T) = t.a + t.b + t.c + t.d1
+        |  def m2(t: T) = t.d // inlined by the type-checker's constant folding
+        |  def m3(t: T) = t.f + t.g + t.h + t.i
+        |
+        |  def m4(u: U) = u.a + u.b + u.c + u.d1
+        |  def m5(u: U) = u.d
+        |  def m6(u: U) = u.f + u.g + u.h + u.i
+        |}
+      """.stripMargin
+
+    val List(c, t, tClass, u, uClass) = compile(code, allowMessage = _.msg contains "i()I is annotated @inline but cannot be inlined")
+    val m1 = getSingleMethod(c, "m1")
+    assertInvoke(m1, "T", "a")
+    assertInvoke(m1, "T", "b")
+    assertInvoke(m1, "T", "c")
+
+    assertNoInvoke(getSingleMethod(c, "m2"))
+
+    val m3 = getSingleMethod(c, "m3")
+    assertInvoke(m3, "T$class", "f")
+    assertInvoke(m3, "T$class", "g")
+    assertInvoke(m3, "T", "h")
+    assertInvoke(m3, "T", "i")
+
+    val m4 = getSingleMethod(c, "m4")
+    assertInvoke(m4, "U", "a")
+    assertInvoke(m4, "U", "b")
+    assertInvoke(m4, "U", "c")
+
+    assertNoInvoke(getSingleMethod(c, "m5"))
+
+    val m6 = getSingleMethod(c, "m6")
+    assertInvoke(m6, "U", "f")
+    assertInvoke(m6, "U$class", "g")
+    assertInvoke(m6, "U", "h")
+    assertInvoke(m6, "U", "i")
+  }
+
+  @Test
+  def mixedNoCrashSI9111(): Unit = {
+    val javaCode =
+      """public final class A {
+        |  public static final class T { }
+        |  public static final class Inner {
+        |    public static final class T { }
+        |    public T newT() { return null; }
+        |  }
+        |}
+      """.stripMargin
+
+    val scalaCode =
+      """class C {
+        |  val i = new A.Inner()
+        |}
+      """.stripMargin
+
+    // We don't get to see the warning about SI-9111, because it is associated with the MethodInlineInfo
+    // of method newT, which is not actually used.
+    // The problem is: if we reference `newT` in the scalaCode, the scala code does not compile,
+    // because then SI-9111 triggers during type-checking class C, in the compiler frontend, and
+    // we don't even get to the backend.
+    // Nevertheless, the workaround for SI-9111 in BcodeAsmCommon.buildInlineInfoFromClassSymbol
+    // is still necessary, otherwise this test crashes.
+    // The warning below is the typical warning we get in mixed compilation.
+    val warn =
+      """failed to determine if <init> should be inlined:
+        |The method <init>()V could not be found in the class A$Inner or any of its parents.
+        |Note that the following parent classes could not be found on the classpath: A$Inner""".stripMargin
+
+    var c = 0
+
+    compileClasses(newCompiler(extraArgs = InlinerTest.args + " -Yopt-warnings:_"))(
+      scalaCode,
+      List((javaCode, "A.java")),
+      allowMessage = i => {c += 1; i.msg contains warn})
+    assert(c == 1, c)
+  }
+
+  @Test
+  def inlineInvokeSpecial(): Unit = {
+    val code =
+      """class Aa {
+        |  def f1 = 0
+        |}
+        |class B extends Aa {
+        |  @inline final override def f1 = 1 + super.f1 // invokespecial Aa.f1
+        |
+        |  private def f2m = 0                          // public B$$f2m in bytecode
+        |  @inline final def f2 = f2m                   // invokevirtual B.B$$f2m
+        |
+        |  private def this(x: Int) = this()            // public in bytecode
+        |  @inline final def f3 = new B()               // invokespecial B.<init>()
+        |  @inline final def f4 = new B(1)              // invokespecial B.<init>(I)
+        |
+        |  def t1 = f1                                  // inlined
+        |  def t2 = f2                                  // inlined
+        |  def t3 = f3                                  // inlined
+        |  def t4 = f4                                  // inlined
+        |}
+        |class T {
+        |  def t1(b: B) = b.f1                          // cannot inline: contains a super call
+        |  def t2(b: B) = b.f2                          // inlined
+        |  def t3(b: B) = b.f3                          // inlined
+        |  def t4(b: B) = b.f4                          // inlined
+        |}
+      """.stripMargin
+
+    val warn =
+      """B::f1()I is annotated @inline but could not be inlined:
+        |The callee B::f1()I contains the instruction INVOKESPECIAL Aa.f1 ()I
+        |that would cause an IllegalAccessError when inlined into class T.""".stripMargin
+    var c = 0
+    val List(a, b, t) = compile(code, allowMessage = i => {c += 1; i.msg contains warn})
+    assert(c == 1, c)
+
+    assertInvoke(getSingleMethod(b, "t1"), "Aa", "f1")
+    assertInvoke(getSingleMethod(b, "t2"), "B", "B$$f2m")
+    assertInvoke(getSingleMethod(b, "t3"), "B", "<init>")
+    assertInvoke(getSingleMethod(b, "t4"), "B", "<init>")
+
+    assertInvoke(getSingleMethod(t, "t1"), "B", "f1")
+    assertInvoke(getSingleMethod(t, "t2"), "B", "B$$f2m")
+    assertInvoke(getSingleMethod(t, "t3"), "B", "<init>")
+    assertInvoke(getSingleMethod(t, "t4"), "B", "<init>")
+  }
+
+  @Test
+  def dontInlineNative(): Unit = {
+    val code =
+      """class C {
+        |  def t = System.arraycopy(null, 0, null, 0, 0)
+        |}
+      """.stripMargin
+    val List(c) = compileClasses(newCompiler(extraArgs = InlinerTest.args + " -Yopt-inline-heuristics:everything"))(code)
+    assertInvoke(getSingleMethod(c, "t"), "java/lang/System", "arraycopy")
+  }
+
+  @Test
+  def inlineMayRenderCodeDead(): Unit = {
+    val code =
+      """class C {
+        |  @inline final def f: String = throw new Error("")
+        |  @inline final def g: String = "a" + f + "b"       // after inlining f, need to run DCE, because the rest of g becomes dead.
+        |  def t = g                                         // the inliner requires no dead code when inlining g (uses an Analyzer).
+        |}
+      """.stripMargin
+
+    val List(c) = compile(code)
+    assertInvoke(getSingleMethod(c, "t"), "java/lang/Error", "<init>")
+  }
+
+  @Test
+  def noRedunantNullChecks(): Unit = {
+    val code =
+      """class C {
+        |  @inline final def f: String = "hai!"
+        |  def t(c: C) = {c.f; c.f} // null check on the first, but not the second
+        |}
+      """.stripMargin
+
+    val List(c) = compile(code)
+    val t = getSingleMethod(c, "t").instructions
+    assertNoInvoke(t)
+    assert(2 == t.collect({case Ldc(_, "hai!") => }).size)     // twice the body of f
+    assert(1 == t.collect({case Jump(IFNONNULL, _) => }).size) // one single null check
+  }
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOpts.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOpts.scala
index 5430e33..5ef2458 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOpts.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOpts.scala
@@ -13,17 +13,26 @@ import scala.tools.testing.AssertUtil._
 import CodeGenTools._
 import scala.tools.partest.ASMConverters
 import ASMConverters._
+import scala.tools.testing.ClearAfterClass
+
+object MethodLevelOpts extends ClearAfterClass.Clearable {
+  var methodOptCompiler = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:l:method")
+  def clear(): Unit = { methodOptCompiler = null }
+}
 
 @RunWith(classOf[JUnit4])
-class MethodLevelOpts {
-  val methodOptCompiler = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:l:method")
+class MethodLevelOpts extends ClearAfterClass {
+  ClearAfterClass.stateToClear = MethodLevelOpts
+
+  val methodOptCompiler = MethodLevelOpts.methodOptCompiler
 
   def wrapInDefault(code: Instruction*) = List(Label(0), LineNumber(1, Label(0))) ::: code.toList ::: List(Label(1))
 
   @Test
   def eliminateEmptyTry(): Unit = {
     val code = "def f = { try {} catch { case _: Throwable => 0; () }; 1 }"
-    assertSameCode(singleMethodInstructions(methodOptCompiler)(code), wrapInDefault(Op(ICONST_1), Op(IRETURN)))
+    val warn = "a pure expression does nothing in statement position"
+    assertSameCode(singleMethodInstructions(methodOptCompiler)(code, allowMessage = _.msg contains warn), wrapInDefault(Op(ICONST_1), Op(IRETURN)))
   }
 
   @Test
@@ -47,7 +56,7 @@ class MethodLevelOpts {
   }
 
   @Test
-  def inlineReturnInCachtNotTry(): Unit = {
+  def inlineReturnInCatchNotTry(): Unit = {
     val code = "def f: Int = return { try 1 catch { case _: Throwable => 2 } }"
     // cannot inline the IRETURN into the try block (because RETURN may throw IllegalMonitorState)
     val m = singleMethod(methodOptCompiler)(code)
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/ScalaInlineInfoTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/ScalaInlineInfoTest.scala
new file mode 100644
index 0000000..f8e8874
--- /dev/null
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/ScalaInlineInfoTest.scala
@@ -0,0 +1,85 @@
+package scala.tools.nsc
+package backend.jvm
+package opt
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+import scala.tools.asm.Opcodes._
+import org.junit.Assert._
+
+import CodeGenTools._
+import scala.tools.nsc.backend.jvm.BTypes.{MethodInlineInfo, InlineInfo}
+import scala.tools.partest.ASMConverters
+import ASMConverters._
+import scala.collection.convert.decorateAsScala._
+
+object ScalaInlineInfoTest {
+  var compiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:l:none")
+  def clear(): Unit = { compiler = null }
+}
+
+ at RunWith(classOf[JUnit4])
+class ScalaInlineInfoTest {
+  val compiler = newCompiler()
+
+  @Test
+  def traitMembersInlineInfo(): Unit = {
+    val code =
+      """trait T {
+        |  def f1 = 1                   // concrete method
+        |  private def f2 = 1           // implOnly method (does not end up in the interface)
+        |  def f3 = {
+        |    def nest = 0               // nested method (does not end up in the interface)
+        |    nest
+        |  }
+        |
+        |  @inline
+        |  def f4 = super.toString      // super accessor
+        |
+        |  object O                     // module accessor (method is generated)
+        |  def f5 = {
+        |    object L { val x = 0 }     // nested module (just flattened out)
+        |    L.x
+        |  }
+        |
+        |  @noinline
+        |  def f6: Int                  // abstract method (not in impl class)
+        |
+        |  // fields
+        |
+        |  val x1 = 0
+        |  var y2 = 0
+        |  var x3: Int
+        |  lazy val x4 = 0
+        |
+        |  final val x5 = 0
+        |}
+      """.stripMargin
+
+    val cs @ List(t, tl, to, tCls) = compileClasses(compiler)(code)
+    val List(info) = t.attrs.asScala.collect({ case a: InlineInfoAttribute => a.inlineInfo }).toList
+    val expect = InlineInfo(
+      None,  // self type
+      false, // final class
+      Map(
+        ("O()LT$O$;",                            MethodInlineInfo(true, false,false,false)),
+        ("T$$super$toString()Ljava/lang/String;",MethodInlineInfo(false,false,false,false)),
+        ("T$_setter_$x1_$eq(I)V",                MethodInlineInfo(false,false,false,false)),
+        ("f1()I",                                MethodInlineInfo(false,true, false,false)),
+        ("f3()I",                                MethodInlineInfo(false,true, false,false)),
+        ("f4()Ljava/lang/String;",               MethodInlineInfo(false,true, true, false)),
+        ("f5()I",                                MethodInlineInfo(false,true, false,false)),
+        ("f6()I",                                MethodInlineInfo(false,false,false,true )),
+        ("x1()I",                                MethodInlineInfo(false,false,false,false)),
+        ("x3()I",                                MethodInlineInfo(false,false,false,false)),
+        ("x3_$eq(I)V",                           MethodInlineInfo(false,false,false,false)),
+        ("x4()I",                                MethodInlineInfo(false,false,false,false)),
+        ("x5()I",                                MethodInlineInfo(true, false,false,false)),
+        ("y2()I",                                MethodInlineInfo(false,false,false,false)),
+        ("y2_$eq(I)V",                           MethodInlineInfo(false,false,false,false))),
+      None // warning
+    )
+    assert(info == expect, info)
+  }
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/SimplifyJumpsTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/SimplifyJumpsTest.scala
index 360fa1d..a685ae7 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/SimplifyJumpsTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/SimplifyJumpsTest.scala
@@ -26,7 +26,7 @@ class SimplifyJumpsTest {
       Op(RETURN)
     )
     val method = genMethod()(ops: _*)
-    assertTrue(localOpt.simplifyJumps(method))
+    assertTrue(LocalOptImpls.simplifyJumps(method))
     assertSameCode(instructionsFromMethod(method), Op(RETURN) :: ops.tail)
   }
 
@@ -45,7 +45,7 @@ class SimplifyJumpsTest {
       Jump(GOTO, Label(2)) :: // replaced by ATHROW
       rest: _*
     )
-    assertTrue(localOpt.simplifyJumps(method))
+    assertTrue(LocalOptImpls.simplifyJumps(method))
     assertSameCode(instructionsFromMethod(method), Op(ACONST_NULL) :: Op(ATHROW) :: rest)
   }
 
@@ -66,11 +66,11 @@ class SimplifyJumpsTest {
       Op(RETURN)
     )
     val method = genMethod(handlers = handler)(initialInstrs: _*)
-    assertFalse(localOpt.simplifyJumps(method))
+    assertFalse(LocalOptImpls.simplifyJumps(method))
     assertSameCode(instructionsFromMethod(method), initialInstrs)
 
     val optMethod = genMethod()(initialInstrs: _*) // no handler
-    assertTrue(localOpt.simplifyJumps(optMethod))
+    assertTrue(LocalOptImpls.simplifyJumps(optMethod))
     assertSameCode(instructionsFromMethod(optMethod).take(3), List(Label(1), Op(ACONST_NULL), Op(ATHROW)))
   }
 
@@ -91,7 +91,7 @@ class SimplifyJumpsTest {
       Op(IRETURN)
     )
     val method = genMethod()(begin ::: rest: _*)
-    assertTrue(localOpt.simplifyJumps(method))
+    assertTrue(LocalOptImpls.simplifyJumps(method))
     assertSameCode(
       instructionsFromMethod(method),
       List(VarOp(ILOAD, 1), Jump(IFLT, Label(3))) ::: rest.tail )
@@ -99,7 +99,7 @@ class SimplifyJumpsTest {
     // no label allowed between begin and rest. if there's another label, then there could be a
     // branch that label. eliminating the  GOTO would change the behavior.
     val nonOptMethod = genMethod()(begin ::: Label(22) :: rest: _*)
-    assertFalse(localOpt.simplifyJumps(nonOptMethod))
+    assertFalse(LocalOptImpls.simplifyJumps(nonOptMethod))
   }
 
   @Test
@@ -116,7 +116,7 @@ class SimplifyJumpsTest {
     // ensures that the goto is safely removed. ASM supports removing while iterating, but not the
     // next element of the current. Here, the current is the IFGE, the next is the GOTO.
     val method = genMethod()(code(Jump(IFGE, Label(2)), Jump(GOTO, Label(3))): _*)
-    assertTrue(localOpt.simplifyJumps(method))
+    assertTrue(LocalOptImpls.simplifyJumps(method))
     assertSameCode(instructionsFromMethod(method), code(Jump(IFLT, Label(3))))
   }
 
@@ -131,7 +131,7 @@ class SimplifyJumpsTest {
       Op(IRETURN)
     )
     val method = genMethod()(ops: _*)
-    assertTrue(localOpt.simplifyJumps(method))
+    assertTrue(LocalOptImpls.simplifyJumps(method))
     assertSameCode(instructionsFromMethod(method), ops.tail)
   }
 
@@ -157,7 +157,7 @@ class SimplifyJumpsTest {
       Op(IRETURN)
     )
     val method = genMethod()(ops(1, 2, 3): _*)
-    assertTrue(localOpt.simplifyJumps(method))
+    assertTrue(LocalOptImpls.simplifyJumps(method))
     assertSameCode(instructionsFromMethod(method), ops(3, 3, 3))
   }
 
@@ -181,7 +181,7 @@ class SimplifyJumpsTest {
     )
 
     val method = genMethod()(ops(2): _*)
-    assertTrue(localOpt.simplifyJumps(method))
+    assertTrue(LocalOptImpls.simplifyJumps(method))
     assertSameCode(instructionsFromMethod(method), ops(3))
   }
 
@@ -202,7 +202,7 @@ class SimplifyJumpsTest {
     )
 
     val method = genMethod()(ops(Jump(IFGE, Label(1))): _*)
-    assertTrue(localOpt.simplifyJumps(method))
+    assertTrue(LocalOptImpls.simplifyJumps(method))
     assertSameCode(instructionsFromMethod(method), ops(Op(POP)))
   }
 
@@ -215,7 +215,7 @@ class SimplifyJumpsTest {
       Jump(GOTO, Label(1))
     )
     val method = genMethod()(ops(List(Jump(IF_ICMPGE, Label(1)))): _*)
-    assertTrue(localOpt.simplifyJumps(method))
+    assertTrue(LocalOptImpls.simplifyJumps(method))
     assertSameCode(instructionsFromMethod(method), ops(List(Op(POP), Op(POP))))
   }
 }
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/UnreachableCodeTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/UnreachableCodeTest.scala
index 4a45dd9..902af7b 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/UnreachableCodeTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/UnreachableCodeTest.scala
@@ -13,27 +13,43 @@ import scala.tools.testing.AssertUtil._
 import CodeGenTools._
 import scala.tools.partest.ASMConverters
 import ASMConverters._
+import scala.tools.testing.ClearAfterClass
+
+object UnreachableCodeTest extends ClearAfterClass.Clearable {
+  // jvm-1.6 enables emitting stack map frames, which impacts the code generation wrt dead basic blocks,
+  // see comment in BCodeBodyBuilder
+  var methodOptCompiler = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:l:method")
+  var dceCompiler       = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:unreachable-code")
+  var noOptCompiler     = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:l:none")
+
+  // jvm-1.5 disables computing stack map frames, and it emits dead code as-is. note that this flag triggers a deprecation warning
+  var noOptNoFramesCompiler = newCompiler(extraArgs = "-target:jvm-1.5 -Ybackend:GenBCode -Yopt:l:none -deprecation")
+
+  def clear(): Unit = {
+    methodOptCompiler = null
+    dceCompiler = null
+    noOptCompiler = null
+    noOptNoFramesCompiler = null
+  }
+}
 
 @RunWith(classOf[JUnit4])
-class UnreachableCodeTest {
+class UnreachableCodeTest extends ClearAfterClass {
+  ClearAfterClass.stateToClear = UnreachableCodeTest
+
+  val methodOptCompiler     = UnreachableCodeTest.methodOptCompiler
+  val dceCompiler           = UnreachableCodeTest.dceCompiler
+  val noOptCompiler         = UnreachableCodeTest.noOptCompiler
+  val noOptNoFramesCompiler = UnreachableCodeTest.noOptNoFramesCompiler
 
   def assertEliminateDead(code: (Instruction, Boolean)*): Unit = {
     val method = genMethod()(code.map(_._1): _*)
-    localOpt.removeUnreachableCodeImpl(method, "C")
+    LocalOptImpls.removeUnreachableCodeImpl(method, "C")
     val nonEliminated = instructionsFromMethod(method)
     val expectedLive = code.filter(_._2).map(_._1).toList
     assertSameCode(nonEliminated, expectedLive)
   }
 
-  // jvm-1.6 enables emitting stack map frames, which impacts the code generation wrt dead basic blocks,
-  // see comment in BCodeBodyBuilder
-  val methodOptCompiler = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:l:method")
-  val dceCompiler       = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:unreachable-code")
-  val noOptCompiler     = newCompiler(extraArgs = "-target:jvm-1.6 -Ybackend:GenBCode -Yopt:l:none")
-
-  // jvm-1.5 disables computing stack map frames, and it emits dead code as-is.
-  val noOptNoFramesCompiler = newCompiler(extraArgs = "-target:jvm-1.5 -Ybackend:GenBCode -Yopt:l:none")
-
   @Test
   def basicElimination(): Unit = {
     assertEliminateDead(
@@ -138,7 +154,8 @@ class UnreachableCodeTest {
     assertSameCode(noDce.dropNonOp, List(Op(ICONST_1), Op(IRETURN), Op(ATHROW), Op(ATHROW)))
 
     // when NOT computing stack map frames, ASM's ClassWriter does not replace dead code by NOP/ATHROW
-    val noDceNoFrames = singleMethodInstructions(noOptNoFramesCompiler)(code)
+    val warn = "target:jvm-1.5 is deprecated"
+    val noDceNoFrames = singleMethodInstructions(noOptNoFramesCompiler)(code, allowMessage = _.msg contains warn)
     assertSameCode(noDceNoFrames.dropNonOp, List(Op(ICONST_1), Op(IRETURN), Op(ICONST_2), Op(IRETURN)))
   }
 
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/UnusedLocalVariablesTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/UnusedLocalVariablesTest.scala
index 24a1f9d..7697366 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/UnusedLocalVariablesTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/UnusedLocalVariablesTest.scala
@@ -12,10 +12,18 @@ import scala.collection.JavaConverters._
 import CodeGenTools._
 import scala.tools.partest.ASMConverters
 import ASMConverters._
+import scala.tools.testing.ClearAfterClass
+
+object UnusedLocalVariablesTest extends ClearAfterClass.Clearable {
+  var dceCompiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:unreachable-code")
+  def clear(): Unit = { dceCompiler = null }
+}
 
 @RunWith(classOf[JUnit4])
-class UnusedLocalVariablesTest {
-  val dceCompiler = newCompiler(extraArgs = "-Ybackend:GenBCode -Yopt:unreachable-code")
+class UnusedLocalVariablesTest extends ClearAfterClass {
+  ClearAfterClass.stateToClear = UnusedLocalVariablesTest
+
+  val dceCompiler = UnusedLocalVariablesTest.dceCompiler
 
   @Test
   def removeUnusedVar(): Unit = {
diff --git a/test/junit/scala/tools/nsc/classpath/FlatClassPathResolverTest.scala b/test/junit/scala/tools/nsc/classpath/FlatClassPathResolverTest.scala
index a37ba31..5dee488 100644
--- a/test/junit/scala/tools/nsc/classpath/FlatClassPathResolverTest.scala
+++ b/test/junit/scala/tools/nsc/classpath/FlatClassPathResolverTest.scala
@@ -42,7 +42,7 @@ class FlatClassPathResolverTest {
     // In Java TemporaryFolder in JUnit is managed automatically using @Rule.
     // It would work also in Scala after adding and extending a class like
     // TestWithTempFolder.java containing it. But in this case it doesn't work when running tests
-    // from the command line - java class is not compiled due to some, misterious reasons.
+    // from the command line - java class is not compiled due to some, mysterious reasons.
     // That's why such dirs are here created and deleted manually.
     tempDir.create()
     tempDir.newFile("TestSourceInRootPackage.scala")
diff --git a/test/junit/scala/tools/nsc/doc/html/HtmlDocletTest.scala b/test/junit/scala/tools/nsc/doc/html/HtmlDocletTest.scala
new file mode 100644
index 0000000..d17856e
--- /dev/null
+++ b/test/junit/scala/tools/nsc/doc/html/HtmlDocletTest.scala
@@ -0,0 +1,22 @@
+package scala.tools.nsc.doc.html
+
+import org.junit.Test
+import org.junit.Assert._
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+import scala.tools.testing.AssertUtil._
+
+ at RunWith(classOf[JUnit4])
+class HtmlDocletTest {
+  @Test
+  def testSyntaxHighlightingUnicode() {
+    val in = "unicode: …"
+
+    val out = SyntaxHigh(in).toString
+
+    // SI-9038, this failed with
+    // "unicode: …" != "unicode: ¬タᆭ"
+    assertEquals(in, out)
+  }
+}
diff --git a/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala b/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala
new file mode 100644
index 0000000..78ebb7c
--- /dev/null
+++ b/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala
@@ -0,0 +1,180 @@
+package scala.tools.nsc.interpreter
+
+import java.io.{StringWriter, PrintWriter}
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+import scala.tools.nsc.Settings
+
+class CompletionTest {
+  val EmptyString = "" // def string results include the empty string so that JLine won't insert "def ..." at the cursor
+
+  def newIMain(): IMain = {
+    val settings = new Settings()
+    settings.Xnojline.value = true
+    settings.usejavacp.value = true
+
+    val writer = new StringWriter
+    val out = new PrintWriter(writer)
+    new IMain(settings, out)
+  }
+  @Test
+  def t4438_arrayCompletion(): Unit = {
+    val intp = newIMain()
+    val completer = new PresentationCompilerCompleter(intp)
+    assert(completer.complete("Array(1, 2, 3) rev").candidates.contains("reverseMap"))
+  }
+
+  @Test
+  def completions(): Unit = {
+    val intp = newIMain()
+    val completer = new PresentationCompilerCompleter(intp)
+    checkExact(completer, "object O { def x_y_z = 1 }; import O._; x_y")("x_y_z")
+    checkExact(completer, "object O { private def x_y_z = 1 }; import O._; x_y")()
+    checkExact(completer, "object O { private def x_y_z = 1; x_y", "}")("x_y_z")
+    checkExact(completer, "object x_y_z; import x_y")("x_y_z")
+
+    checkExact(completer, "object x_y_z { def a_b_c }; import x_y_z.a_b")("a_b_c")
+
+    checkExact(completer, "object X { private[this] def definition = 0; def")("definition")
+
+    // stable terms are offered in type completion as they might be used as a prefix
+    checkExact(completer, """object O { def x_y_z = 0; val x_z_y = ""; type T = x_""")("x_z_y")
+    checkExact(completer, """def method { def x_y_z = 0; val x_z_y = ""; type T = x_""")("x_z_y")
+
+    // We exclude inherited members of the synthetic interpreter wrapper classes
+    checkExact(completer, """asInstanceO""")()
+    checkExact(completer, """class C { asInstanceO""")("asInstanceOf")
+
+    // Output is sorted
+    assertEquals(List("prefix_aaa", "prefix_nnn", "prefix_zzz"), completer.complete( """class C { def prefix_nnn = 0; def prefix_zzz = 0; def prefix_aaa = 0; prefix_""").candidates)
+  }
+
+  @Test
+  def annotations(): Unit = {
+    val intp = newIMain()
+    val completer = new PresentationCompilerCompleter(intp)
+    checkExact(completer, "def foo[@specialize", " A]")("specialized")
+    checkExact(completer, "def foo[@specialize")("specialized")
+    checkExact(completer, """@deprecatedN""", """ class Foo""")("deprecatedName")
+    checkExact(completer, """@deprecateN""")("deprecatedName")
+    checkExact(completer, """{@deprecateN""")("deprecatedName")
+  }
+
+  @Test
+  def incompleteStringInterpolation(): Unit = {
+    val intp = newIMain()
+    val completer = new PresentationCompilerCompleter(intp)
+    checkExact(completer, """val x_y_z = 1; s"${x_""", "}\"")("x_y_z")
+    checkExact(completer, """val x_y_z = 1; s"${x_""", "\"")("x_y_z")
+  }
+
+  @Test
+  def symbolically(): Unit = {
+    val intp = newIMain()
+    val completer = new PresentationCompilerCompleter(intp)
+    checkExact(completer, """class C { def +++(a: Any) = 0; def ---(a: Any) = 0; this.++""")("+++")
+  }
+
+  @Test
+  def camelCompletions(): Unit = {
+    val intp = newIMain()
+    val completer = new PresentationCompilerCompleter(intp)
+    checkExact(completer, "object O { def theCatSatOnTheMat = 1 }; import O._; tCSO")("theCatSatOnTheMat")
+    checkExact(completer, "object O { def getBlerganator = 1 }; import O._; blerga")("getBlerganator")
+    checkExact(completer, "object O { def xxxxYyyyyZzzz = 1; def xxxxYyZeee = 1 }; import O._; xYZ")("", "xxxxYyyyyZzzz", "xxxxYyZeee")
+    checkExact(completer, "object O { def xxxxYyyyyZzzz = 1; def xxxxYyyyyZeee = 1 }; import O._; xYZ")("xxxxYyyyyZzzz", "xxxxYyyyyZeee")
+    checkExact(completer, "object O { class AbstractMetaFactoryFactory }; new O.AMFF")("AbstractMetaFactoryFactory")
+  }
+
+  @Test
+  def lenientCamelCompletions(): Unit = {
+    val intp = newIMain()
+    val completer = new PresentationCompilerCompleter(intp)
+    checkExact(completer, "object O { def theCatSatOnTheMat = 1 }; import O._; tcso")("theCatSatOnTheMat")
+    checkExact(completer, "object O { def theCatSatOnTheMat = 1 }; import O._; sotm")("theCatSatOnTheMat")
+    checkExact(completer, "object O { def theCatSatOnTheMat = 1 }; import O._; TCSOTM")()
+  }
+
+  @Test
+  def previousLineCompletions(): Unit = {
+    val intp = newIMain()
+    intp.interpret("class C { val x_y_z = 42 }")
+    intp.interpret("object O { type T = Int }")
+
+    val completer = new PresentationCompilerCompleter(intp)
+
+    checkExact(completer, "new C().x_y")("x_y_z")
+    checkExact(completer, "(1 : O.T).toCha")("toChar")
+
+    intp.interpret("case class X_y_z()")
+    val completer1 = new PresentationCompilerCompleter(intp)
+    checkExact(completer1, "new X_y_")("X_y_z")
+    checkExact(completer1, "X_y_")("X_y_z")
+    checkExact(completer1, "X_y_z.app")("apply")
+  }
+
+  @Test
+  def previousResultInvocation(): Unit = {
+    val intp = newIMain()
+    intp.interpret("1 + 1")
+
+    val completer = new PresentationCompilerCompleter(intp)
+
+    checkExact(completer, ".toCha")("toChar")
+  }
+
+  @Test
+  def defString(): Unit = {
+    val intp = newIMain()
+    val completer = new PresentationCompilerCompleter(intp)
+
+    // Double Tab on a fully typed selection shows the def string
+    checkExact(completer, "(p: {def a_b_c: Int}) => p.a_b_c")()
+    checkExact(completer, "(p: {def a_b_c: Int}) => p.a_b_c")(EmptyString, "def a_b_c: Int")
+
+    // likewise for an ident
+    checkExact(completer, "(p: {def x_y_z: Int}) => {import p._; x_y_z")()
+    checkExact(completer, "(p: {def x_y_z: Int}) => {import p._; x_y_z")(EmptyString, "def x_y_z: Int")
+
+    // If the first completion only gives one alternative
+    checkExact(completer, "(p: {def x_y_z: Int; def x_y_z(a: String): Int }) => p.x_y")("x_y_z")
+    // ... it is automatically inserted into the buffer. Hitting <TAB> again is triggers the help
+    checkExact(completer, "(p: {def x_y_z: Int; def x_y_z(a: String): Int }) => p.x_y_z")(EmptyString, "def x_y_z(a: String): Int", "def x_y_z: Int")
+
+    checkExact(completer, "(p: {def x_y_z: Int; def x_z_y(a: String): Int }) => p.x_")("x_y_z", "x_z_y")
+    // By contrast, in this case the user had to type "y_z" manually, so no def string printing just yet
+    checkExact(completer, "(p: {def x_y_z: Int; def x_z_y(a: String): Int }) => p.x_y_z")()
+    // Another <TAB>, Okay, time to print.
+    checkExact(completer, "(p: {def x_y_z: Int; def x_z_y(a: String): Int }) => p.x_y_z")(EmptyString, "def x_y_z: Int")
+
+    // The def string reconstructs the source-level modifiers (rather than showing the desugarings of vals),
+    // and performs as-seen-from with respect to the prefix
+    checkExact(completer, "trait T[A]{ lazy val x_y_z: A }; class C extends T[Int] { x_y_z")()
+    checkExact(completer, "trait T[A]{ lazy val x_y_z: A }; class C extends T[Int] { x_y_z")(EmptyString, "lazy val x_y_z: Int")
+
+    checkExact(completer, "trait T[A] { def foo: A }; (t: T[Int]) => t.foo")()
+    checkExact(completer, "trait T[A] { def foo: A }; (t: T[Int]) => t.foo")(EmptyString, "def foo: Int")
+  }
+
+  @Test
+  def treePrint(): Unit = {
+    val intp = newIMain()
+    val completer = new PresentationCompilerCompleter(intp)
+    checkExact(completer, " 1.toHexString //print")(EmptyString, "scala.Predef.intWrapper(1).toHexString // : String")
+  }
+
+  @Test
+  def firstCompletionWithNoPrefixHidesUniversalMethodsAndExtensionMethods(): Unit = {
+    val intp = newIMain()
+    val completer = new PresentationCompilerCompleter(intp)
+    checkExact(completer, "class C(val a: Int, val b: Int) { this.")("a", "b")
+    assert(Set("asInstanceOf", "==").diff(completer.complete("class C(val a: Int, val b: Int) { this.").candidates.toSet).isEmpty)
+    checkExact(completer, "case class D(a: Int, b: Int) { this.a")("a", "asInstanceOf")
+  }
+
+  def checkExact(completer: PresentationCompilerCompleter, before: String, after: String = "")(expected: String*): Unit = {
+    assertEquals(expected.toSet, completer.complete(before, after).candidates.toSet)
+  }
+}
diff --git a/test/junit/scala/tools/nsc/interpreter/TabulatorTest.scala b/test/junit/scala/tools/nsc/interpreter/TabulatorTest.scala
index 21e338e..2632650 100644
--- a/test/junit/scala/tools/nsc/interpreter/TabulatorTest.scala
+++ b/test/junit/scala/tools/nsc/interpreter/TabulatorTest.scala
@@ -82,4 +82,24 @@ class TabulatorTest {
     assert(rows(0).size == 1)
     assert(rows(0)(0).size == "efg".length + sut.marginSize)  // 6
   }
+  @Test def badFit() = {
+    val sut = VTabby(isAcross = true)
+    val items = ('a' until 'z').map(_.toString).toList
+    val rows = sut tabulate items
+    assert(rows.size == 2)
+    assert(rows(0).size == 20)   // 20 * 4 = 80
+    assert(rows(1)(0).dropRight(sut.marginSize) == "u")
+  }
+  @Test def badFitter() = {
+    val sut = VTabby(isAcross = true)
+    val items = List (
+      "%", "&", "*", "+", "-", "/", ">", ">=", ">>", ">>>", "^",
+      "asInstanceOf", "isInstanceOf", "toByte", "toChar", "toDouble", "toFloat",
+      "toInt", "toLong", "toShort", "toString", "unary_+", "unary_-", "unary_~", "|"
+    )
+    val rows = sut tabulate items
+    assert(rows.size == 4)
+    assert(rows(3).size == 4)   // 7 cols
+    assert(rows(3)(0).dropRight(sut.marginSize) == "unary_+")
+  }
 }
diff --git a/test/junit/scala/tools/nsc/symtab/FlagsTest.scala b/test/junit/scala/tools/nsc/symtab/FlagsTest.scala
new file mode 100644
index 0000000..fc0e8b0
--- /dev/null
+++ b/test/junit/scala/tools/nsc/symtab/FlagsTest.scala
@@ -0,0 +1,89 @@
+package scala.tools.nsc
+package symtab
+
+import org.junit.Assert._
+import scala.tools.testing.AssertUtil._
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+ at RunWith(classOf[JUnit4])
+class FlagsTest {
+  object symbolTable extends SymbolTableForUnitTesting
+  import symbolTable._
+  import Flags._
+
+  def sym = NoSymbol.newTermSymbol(nme.EMPTY)
+
+  def withFlagMask[A](mask: Long)(body: => A): A = enteringPhase(new Phase(NoPhase) {
+    override def flagMask = mask
+    def name = ""
+    def run() = ()
+  })(body)
+
+  def testTimedFlag(flag: Long, test: Symbol => Boolean, enabling: Boolean) = {
+    assertEquals(withFlagMask(InitialFlags)(test(sym.setFlag(flag))), !enabling)
+    assertEquals(withFlagMask(InitialFlags | flag)(test(sym.setFlag(flag))), enabling)
+  }
+
+  def testLate(flag: Long, test: Symbol => Boolean) = testTimedFlag(flag, test, enabling = true)
+  def testNot(flag: Long, test: Symbol => Boolean) = testTimedFlag(flag, test, enabling = false)
+
+  @Test
+  def testTimedFlags(): Unit = {
+    testLate(lateDEFERRED, _.isDeferred)
+    testLate(lateFINAL, _.isFinal)
+    testLate(lateINTERFACE, _.isInterface)
+    testLate(lateMETHOD, _.isMethod)
+    testLate(lateMODULE, _.isModule)
+    testNot(PROTECTED | notPROTECTED, _.isProtected)
+    testNot(OVERRIDE | notOVERRIDE, _.isOverride)
+    testNot(PRIVATE | notPRIVATE, _.isPrivate)
+
+    assertFalse(withFlagMask(AllFlags)(sym.setFlag(PRIVATE | notPRIVATE).isPrivate))
+
+    assertEquals(withFlagMask(InitialFlags)(sym.setFlag(PRIVATE | notPRIVATE).flags & PRIVATE), PRIVATE)
+    assertEquals(withFlagMask(AllFlags)(sym.setFlag(PRIVATE | notPRIVATE).flags & PRIVATE), 0)
+  }
+
+  @Test
+  def normalLateOverlap(): Unit = {
+    // late flags are shifted by LateShift == 47.
+    // however, the first late flag is lateDEFERRED, which is DEFERRED << 47 == (1 << 4) << 47 == 1 << 51
+    // the flags from 1 << 47 to 1 << 50 are not late flags. this is ensured by the LateFlags mask.
+
+    for (i <- 0 to 3) {
+      val f = 1L << i
+      assertEquals(withFlagMask(AllFlags)(sym.setFlag(f << LateShift).flags & f), 0) // not treated as late flag
+    }
+    for (i <- 4 to 8) {
+      val f = 1L << i
+      assertEquals(withFlagMask(AllFlags)(sym.setFlag(f << LateShift).flags & f), f) // treated as late flag
+    }
+  }
+
+  @Test
+  def normalAnti(): Unit = {
+    for (i <- 0 to 2) {
+      val f = 1L << i
+      assertEquals(withFlagMask(AllFlags)(sym.setFlag(f | (f << AntiShift)).flags & f), 0) // negated flags
+    }
+    for (i <- 3 to 7) {
+      val f = 1L << i
+      assertEquals(withFlagMask(AllFlags)(sym.setFlag(f | (f << AntiShift)).flags & f), f) // not negated
+    }
+  }
+
+  @Test
+  def lateAntiCrossCheck(): Unit = {
+    val allButNegatable = AllFlags & ~(PROTECTED | OVERRIDE | PRIVATE)
+    val lateable        = 0L | DEFERRED | FINAL | INTERFACE | METHOD | MODULE
+    val lateFlags       = lateable << LateShift
+    val allButLateable  = AllFlags & ~lateable
+
+    assertEquals(withFlagMask(AllFlags)(sym.setFlag(AllFlags).flags), allButNegatable)
+    assertEquals(withFlagMask(AllFlags)(sym.setFlag(allButLateable).flags), allButNegatable)
+
+    assertEquals(withFlagMask(AllFlags)(sym.setFlag(lateFlags).flags), lateFlags | lateable)
+  }
+}
diff --git a/test/junit/scala/tools/nsc/symtab/SymbolTableTest.scala b/test/junit/scala/tools/nsc/symtab/SymbolTableTest.scala
index 895ad9d..5a921a5 100644
--- a/test/junit/scala/tools/nsc/symtab/SymbolTableTest.scala
+++ b/test/junit/scala/tools/nsc/symtab/SymbolTableTest.scala
@@ -33,10 +33,10 @@ class SymbolTableTest {
     import symbolTable._
     symbolTable.definitions.init()
     val rootClass = symbolTable.rootMirror.RootClass
-    val fooSymbol = rootClass.newClassSymbol("Foo": TypeName, NoPosition, 0)
+    val fooSymbol = rootClass.newClassSymbol(TypeName("Foo"), NoPosition, 0)
     val fooType = new ClassInfoType(Nil, EmptyScope, fooSymbol)
     fooSymbol.info = fooType
-    val barSymbol = rootClass.newClassSymbol("Bar": TypeName, NoPosition, 0)
+    val barSymbol = rootClass.newClassSymbol(TypeName("Bar"), NoPosition, 0)
     val fooTypeRef = TypeRef(fooSymbol.owner.tpe, fooSymbol, Nil)
     val barType = new ClassInfoType(List(fooTypeRef), EmptyScope, barSymbol)
     barSymbol.info = barType
diff --git a/test/junit/scala/tools/nsc/transform/delambdafy/DelambdafyTest.scala b/test/junit/scala/tools/nsc/transform/delambdafy/DelambdafyTest.scala
new file mode 100644
index 0000000..010078e
--- /dev/null
+++ b/test/junit/scala/tools/nsc/transform/delambdafy/DelambdafyTest.scala
@@ -0,0 +1,73 @@
+package scala.tools.nsc.transform.delambdafy
+
+import scala.reflect.io.Path.jfile2path
+import scala.tools.nsc.backend.jvm.CodeGenTools.getGeneratedClassfiles
+import scala.tools.nsc.backend.jvm.CodeGenTools.makeSourceFile
+import scala.tools.nsc.backend.jvm.CodeGenTools.newCompilerWithoutVirtualOutdir
+import scala.tools.nsc.io.AbstractFile
+import scala.tools.testing.TempDir
+
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+ at RunWith(classOf[JUnit4])
+class DelambdafyTest {
+  def compileToMultipleOutputWithDelamdbafyMethod(): List[(String, Array[Byte])] = {
+    val codeForMultiOutput = """
+object Delambdafy {
+  type -->[D, I] = PartialFunction[D, I]
+
+  def main(args: Array[String]): Unit = {
+    val result = List(1, 2, 4).map { a =>
+      val list = List("1", "2", "3").map { _ + "test" }
+      list.find { _ == a.toString + "test" }
+    }
+    println(result)
+    lazy val _foo = foo(result) {
+      case x :: xs if x isDefined => x.get.length
+      case _ => 0
+    }
+    println(_foo)
+    lazy val bar: Int => Int = {
+      case 2 => 23
+      case _ =>
+        val v = List(1).map { _ + 42 }.head
+        v + 31
+    }
+    bar(3)
+    lazy val _baz = baz {
+      case 1 =>
+        val local = List(1).map(_ + 1)
+        local.head
+    }
+  }
+
+  def baz[T](f: Any --> Any): Any => Any = f
+
+  def foo(b: List[Option[String]])(a: List[Option[String]] => Int): Int = a(b)
+}
+"""
+    val srcFile = makeSourceFile(codeForMultiOutput, "delambdafyTest.scala")
+    val outDir = AbstractFile.getDirectory(TempDir.createTempDir())
+    val outDirPath = outDir.canonicalPath
+    val extraArgs = "-Ybackend:GenBCode -Ydelambdafy:method"
+    val argsWithOutDir = extraArgs + s" -d $outDirPath -cp $outDirPath"
+    val compiler = newCompilerWithoutVirtualOutdir(extraArgs = argsWithOutDir)
+    compiler.settings.outputDirs.add(srcFile.file, outDir)
+
+    new compiler.Run().compileSources(List(srcFile))
+
+    val classfiles = getGeneratedClassfiles(outDir)
+    outDir.delete()
+    classfiles
+  }
+  
+  @Test
+  def shouldFindOutputFoldersForAllPromotedLambdasAsMethod(): Unit = {
+    val actual = compileToMultipleOutputWithDelamdbafyMethod()
+
+    assertTrue(actual.length > 0)
+  }
+}
diff --git a/test/junit/scala/tools/nsc/transform/patmat/SolvingTest.scala b/test/junit/scala/tools/nsc/transform/patmat/SolvingTest.scala
index 1fff9c9..7bcb90a 100644
--- a/test/junit/scala/tools/nsc/transform/patmat/SolvingTest.scala
+++ b/test/junit/scala/tools/nsc/transform/patmat/SolvingTest.scala
@@ -6,6 +6,7 @@ import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
 import scala.collection.mutable
+import scala.reflect.internal.util.Position
 import scala.tools.nsc.{Global, Settings}
 
 object TestSolver extends Logic with Solving {
@@ -51,6 +52,8 @@ object TestSolver extends Logic with Solving {
 
       def domainSyms = None
 
+      def groupedDomains: List[Set[TestSolver.Sym]] = Nil
+
       def implications = Nil
 
       def mayBeNull = false
@@ -72,6 +75,8 @@ object TestSolver extends Logic with Solving {
 
     def prepareNewAnalysis() = {}
 
+    def uncheckedWarning(pos: Position, msg: String) = sys.error(msg)
+
     def reportWarning(msg: String) = sys.error(msg)
 
     /**
@@ -204,11 +209,44 @@ class SolvingTest {
 
   import scala.tools.nsc.transform.patmat.TestSolver.TestSolver._
 
-  implicit val Ord: Ordering[TestSolver.TestSolver.Model] = Ordering.by {
-    _.toSeq.sortBy(_.toString()).toIterable
+  object SymName {
+    def unapply(s: Sym): Option[String] = {
+      val Var(Tree(name)) = s.variable
+      Some(name)
+    }
+  }
+
+  implicit val ModelOrd: Ordering[TestSolver.TestSolver.Model] = Ordering.by {
+    _.toSeq.sortWith {
+      case ((sym1, v1), (sym2, v2)) =>
+        val SymName(name1) = sym1
+        val SymName(name2) = sym2
+        if (name1 < name2)
+          true
+        else if (name1 > name2)
+          false
+        else
+          v1 < v2
+    }.toIterable
   }
 
-  private def sym(name: String) = Sym(Var(Tree(name)), NullConst)
+  implicit val SolutionOrd: Ordering[TestSolver.TestSolver.Solution] =
+    Ordering.by(_.model)
+
+  def formatSolution(solution: Solution): String = {
+    formatModel(solution.model)
+  }
+
+  def formatModel(model: Model): String = {
+    (for {
+      (SymName(name), value) <- model
+    } yield {
+      val v = if (value) "T" else "F"
+      s"$name -> $v"
+    }).mkString(", ")
+  }
+
+  def sym(name: String) = Sym(Var(Tree(name)), NullConst)
 
   @Test
   def testSymCreation() {
@@ -550,6 +588,23 @@ class SolvingTest {
         assertEquals(tseitinNoUnassigned, expansionNoUnassigned)
     }
   }
+
+  def pairWiseEncoding(ops: List[Sym]) = {
+    And(ops.combinations(2).collect {
+      case a :: b :: Nil => Or(Not(a), Not(b))
+    }.toSet[TestSolver.TestSolver.Prop])
+  }
+
+  @Test
+  def testAtMostOne() {
+    val dummySym = sym("dummy")
+    val syms = "pqrstu".map(c => sym(c.toString)).toList
+    // expand unassigned variables
+    // (otherwise solutions can not be compared)
+    val expected = TestSolver.TestSolver.findAllModelsFor(propToSolvable(And(dummySym, pairWiseEncoding(syms)))).flatMap(expandUnassigned)
+    val actual = TestSolver.TestSolver.findAllModelsFor(propToSolvable(And(dummySym, AtMostOne(syms)))).flatMap(expandUnassigned)
+    assertEquals(expected.toSet, actual.toSet)
+  }
 }
 
 
diff --git a/test/junit/scala/tools/testing/ClearAfterClass.java b/test/junit/scala/tools/testing/ClearAfterClass.java
new file mode 100644
index 0000000..232d459
--- /dev/null
+++ b/test/junit/scala/tools/testing/ClearAfterClass.java
@@ -0,0 +1,20 @@
+package scala.tools.testing;
+
+import org.junit.AfterClass;
+
+/**
+ * Extend this class to use JUnit's @AfterClass. This annotation only works on static methods,
+ * which cannot be written in Scala.
+ *
+ * Example: {@link scala.tools.nsc.backend.jvm.opt.InlinerTest}
+ */
+public class ClearAfterClass {
+    public static interface Clearable {
+        void clear();
+    }
+
+    public static Clearable stateToClear;
+
+    @AfterClass
+    public static void clearState() { stateToClear.clear(); }
+}
diff --git a/test/junit/scala/tools/testing/TempDir.scala b/test/junit/scala/tools/testing/TempDir.scala
new file mode 100644
index 0000000..475de8c
--- /dev/null
+++ b/test/junit/scala/tools/testing/TempDir.scala
@@ -0,0 +1,18 @@
+package scala.tools.testing
+
+import java.io.{IOException, File}
+
+object TempDir {
+  final val TEMP_DIR_ATTEMPTS = 10000
+  def createTempDir(): File = {
+    val baseDir = new File(System.getProperty("java.io.tmpdir"))
+    val baseName = System.currentTimeMillis() + "-"
+    var c = 0
+    while (c < TEMP_DIR_ATTEMPTS) {
+      val tempDir = new File(baseDir, baseName + c)
+      if (tempDir.mkdir()) return tempDir
+      c += 1
+    }
+    throw new IOException(s"Failed to create directory")
+  }
+}
diff --git a/test/junit/scala/util/SortingTest.scala b/test/junit/scala/util/SortingTest.scala
new file mode 100644
index 0000000..15a00c8
--- /dev/null
+++ b/test/junit/scala/util/SortingTest.scala
@@ -0,0 +1,69 @@
+package scala.util
+
+import org.junit.Test
+import org.junit.Assert._
+import scala.math.{ Ordered, Ordering }
+import scala.reflect.ClassTag
+
+class SortingTest {
+  case class N(i: Int, j: Int) extends Ordered[N] { def compare(n: N) = if (i < n.i) -1 else if (i > n.i) 1 else 0 }
+
+  def mkA(n: Int, max: Int) = Array.tabulate(n)(i => N(util.Random.nextInt(max), i))
+  
+  def isStable(a: Array[N]): Boolean = { var i = 1; while (i < a.length) { if (a(i).i < a(i-1).i || (a(i).i == a(i-1).i && a(i).j < a(i-1).j)) return false; i += 1 }; true }
+  
+  def isAntistable(a: Array[N]): Boolean =
+    { var i = 1; while (i < a.length) { if (a(i).i > a(i-1).i || (a(i).i == a(i-1).i && a(i).j < a(i-1).j)) return false; i += 1 }; true }
+  
+  def isSorted(a: Array[N]): Boolean = { var i = 1; while (i < a.length) { if (a(i).i < a(i-1).i) return false; i += 1 }; true }
+  
+  def isAntisorted(a: Array[N]): Boolean = { var i = 1; while (i < a.length) { if (a(i).i > a(i-1).i) return false; i += 1 }; true }
+  
+  val sizes = Seq.range(0, 65) ++ Seq(256, 1024, 9121, 65539)
+  val variety = Seq(1, 2, 10, 100, 1000, Int.MaxValue)
+  val workLimit = 1e6
+  val rng = new util.Random(198571)
+  
+  val backwardsN = Ordering by ((n: N) => -n.i)
+  
+  def runOneTest(size: Int, variety: Int): Unit = {
+    val xs = Array.tabulate(size)(i => N(rng.nextInt(variety), i))
+    val ys = Array.range(0, xs.length)
+    val zs = { val temp = xs.clone; java.util.Arrays.sort(temp, new java.util.Comparator[N] { def compare(a: N, b: N) = a.compare(b) }); temp }
+    val qxs = { val temp = xs.clone; Sorting.quickSort(temp); temp }
+    val pxs = { val temp = xs.clone; Sorting.quickSort(temp)(backwardsN); temp }
+    val sxs = { val temp = xs.clone; Sorting.stableSort(temp); temp }
+    val rxs = { val temp = xs.clone; Sorting.stableSort(temp)(implicitly[ClassTag[N]], backwardsN); temp }
+    val sys = Sorting.stableSort(ys.clone: Seq[Int], (i: Int) => xs(i))
+    
+    assertTrue("Quicksort should be in order", isSorted(qxs))
+    assertTrue("Quicksort should be in reverse order", isAntisorted(pxs))
+    assertTrue("Stable sort should be sorted and stable", isStable(sxs))
+    assertTrue("Stable sort should be reverse sorted but stable", isAntistable(rxs))
+    assertTrue("Stable sorting by proxy should produce sorted stable list", isStable(sys.map(i => xs(i))))
+    assertTrue("Quicksort should produce canonical ordering", (qxs zip zs).forall{ case (a,b) => a.i == b.i })
+    assertTrue("Reverse quicksort should produce canonical ordering", (pxs.reverse zip zs).forall{ case (a,b) => a.i == b.i })
+    assertTrue("Stable sort should produce exact ordering", (sxs zip zs).forall{ case (a,b) => a == b })
+    assertTrue("Reverse stable sort should produce canonical ordering", (rxs.reverse zip zs).forall{ case (a,b) => a.i == b.i })
+    assertTrue("Proxy sort and direct sort should produce exactly the same thing", (sxs zip sys.map(i => xs(i))).forall{ case (a,b) => a == b })
+  }
+  
+  @Test def testSortConsistency: Unit = {
+    for {
+      size <- sizes
+      v <- variety
+      i <- 0 until math.min(100, math.max(math.min(math.floor(math.pow(v, size)/2), math.ceil(workLimit / (math.log(math.max(2,size))/math.log(2) * size))), 1).toInt)
+    } runOneTest(size, v)
+    
+    for (size <- sizes) {
+      val b = Array.fill(size)(rng.nextBoolean)
+      val bfwd = Sorting.stableSort(b.clone: Seq[Boolean])
+      val bbkw = Sorting.stableSort(b.clone: Seq[Boolean], (x: Boolean, y: Boolean) => x && !y)
+      assertTrue("All falses should be first", bfwd.dropWhile(_ == false).forall(_ == true))
+      assertTrue("All falses should be last when sorted backwards", bbkw.dropWhile(_ == true).forall(_ == false))
+      assertTrue("Sorting booleans should preserve the number of trues", b.count(_ == true) == bfwd.count(_ == true))
+      assertTrue("Backwards sorting booleans should preserve the number of trues", b.count(_ == true) == bbkw.count(_ == true))
+      assertTrue("Sorting should not change the sizes of arrays", b.length == bfwd.length && b.length == bbkw.length)
+    }
+  }
+}
diff --git a/test/partest b/test/partest
index f396459..cb07c00 100755
--- a/test/partest
+++ b/test/partest
@@ -22,6 +22,14 @@ findScalaHome () {
 }
 
 # Use tput to detect color-capable terminal.
+# (note: I have found that on Cygwin, the script sometimes dies here.
+# it doesn't happen from the Cygwin prompt when ssh'ing in to
+# jenkins-worker-windows-publish, only when I make a Jenkins job
+# that runs this script.  I don't know why.  it may have to do with
+# which bash flags are set (-e? -x?) and with bash flags propagating
+# from one script to another? not sure. anyway, normally in a CI
+# context we run partest through ant, not through this script, so I'm
+# not investigating further for now.)
 term_colors=$(tput colors 2>/dev/null)
 if [[ $? == 0 ]] && [[ $term_colors -gt 2 ]]; then
   git_diff_options="--color=always --word-diff"
@@ -112,7 +120,6 @@ if $cygwin; then
         JAVAC_CMD=`cygpath --$format "$JAVAC_CMD"`
     fi
     SCALA_HOME=`cygpath --$format "$SCALA_HOME"`
-    PARTEST_CLASSPATH=`cygpath --path --$format "$PARTEST_CLASSPATH"`
 fi
 
 # last arg wins, so if JAVA_OPTS already contains -Xmx or -Xms the
diff --git a/test/partest.bat b/test/partest.bat
deleted file mode 100755
index 1806e80..0000000
--- a/test/partest.bat
+++ /dev/null
@@ -1,104 +0,0 @@
- at echo off
-
-rem ##########################################################################
-rem # Scala code runner 2.9.1.final
-rem ##########################################################################
-rem # (c) 2002-2013 LAMP/EPFL
-rem #
-rem # This is free software; see the distribution for copying conditions.
-rem # There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
-rem # PARTICULAR PURPOSE.
-rem ##########################################################################
-
-rem We adopt the following conventions:
-rem - System/user environment variables start with a letter
-rem - Local batch variables start with an underscore ('_')
-
-if "%OS%"=="Windows_NT" (
-  @setlocal
-  call :set_home
-  set _ARGS=%*
-) else (
-  set _SCALA_HOME="%SCALA_HOME%"
-  rem The following line tests SCALA_HOME instead of _SCALA_HOME, because
-  rem the above change to _SCALA_HOME is not visible within this block.
-  if "%SCALA_HOME%"=="" goto error1
-  call :set_args
-)
-
-rem We use the value of the JAVACMD environment variable if defined
-set _JAVACMD=%JAVACMD%
-if "%_JAVACMD%"=="" set _JAVACMD=java
-
-rem We use the value of the JAVACCMD environment variable if defined
-set _JAVACCMD=%JAVACCMD%
-if "%_JAVACCMD%"=="" set _JAVACCMD=javac
-
-rem We use the value of the JAVA_OPTS environment variable if defined
-set _JAVA_OPTS=%JAVA_OPTS%
-if "%_JAVA_OPTS%"=="" set _JAVA_OPTS=-Xmx1024M -Xms64M
-
-rem We use the value of the SCALAC_OPTS environment variable if defined
-set _SCALAC_OPTS=%SCALAC_OPTS%
-if "%_SCALAC_OPTS%"=="" set _SCALAC_OPTS=-deprecation
-
-set _EXTENSION_CLASSPATH=
-if "%_EXTENSION_CLASSPATH%"=="" (
-  if exist "%_SCALA_HOME%\lib\scala-partest.jar" (
-    for %%f in ("%_SCALA_HOME%\lib\*") do call :add_cpath "%%f"
-    if "%OS%"=="Windows_NT" (
-      for /d %%f in ("%_SCALA_HOME%\lib\*") do call :add_cpath "%%f"
-    )
-  ) else if exist "%_SCALA_HOME%\build\pack\lib\scala-partest.jar" (
-    for %%f in ("%_SCALA_HOME%\build\pack\lib\*") do call :add_cpath "%%f"
-    if "%OS%"=="Windows_NT" (
-      for /d %%f in ("%_SCALA_HOME%\build\pack\lib\*") do call :add_cpath "%%f"
-    )  
-  )
-)
-
-set _PROPS=-Dscala.home="%_SCALA_HOME%" -Dpartest.javacmd="%_JAVACMD%" -Dpartest.java_options="%_JAVA_OPTS%" -Dpartest.scalac_options="%_SCALAC_OPTS%" -Dpartest.javac_cmd="%_JAVACCMD%"
-
-rem echo %_JAVACMD% %_JAVA_OPTS% %_PROPS% -cp "%_EXTENSION_CLASSPATH%" scala.tools.partest.nest.NestRunner %_ARGS%
-%_JAVACMD% %_JAVA_OPTS% %_PROPS% -cp "%_EXTENSION_CLASSPATH%" scala.tools.partest.nest.NestRunner %_ARGS%
-goto end
-
-rem ##########################################################################
-rem # subroutines
-
-:add_cpath
-  if "%_EXTENSION_CLASSPATH%"=="" (
-    set _EXTENSION_CLASSPATH=%~1
-  ) else (
-    set _EXTENSION_CLASSPATH=%_EXTENSION_CLASSPATH%;%~1
-  )
-goto :eof
-
-rem Variable "%~dps0" works on WinXP SP2 or newer
-rem (see http://support.microsoft.com/?kbid=833431)
-rem set _SCALA_HOME=%~dps0..
-:set_home
-  set _BIN_DIR=
-  for %%i in (%~sf0) do set _BIN_DIR=%_BIN_DIR%%%~dpsi
-  set _SCALA_HOME=%_BIN_DIR%..
-goto :eof
-
-:set_args
-  set _ARGS=
-  :loop
-  rem Argument %1 may contain quotes so we use parentheses here
-  if (%1)==() goto :eof
-  set _ARGS=%_ARGS% %1
-  shift
-  goto loop
-
-rem ##########################################################################
-rem # errors
-
-:error1
-echo ERROR: environment variable SCALA_HOME is undefined. It should point to your installation directory.
-goto end
-
-:end
-if "%OS%"=="Windows_NT" @endlocal
-exit /b %errorlevel%
diff --git a/test/pending/jvm/javasigs.scala b/test/pending/jvm/javasigs.scala
index 8da59ab..d18a4e6 100644
--- a/test/pending/jvm/javasigs.scala
+++ b/test/pending/jvm/javasigs.scala
@@ -32,7 +32,7 @@ object Scalatest {
   }
     
 
-  /** Execute cmd, wait for the process to end and pipe it's output to stdout */
+  /** Execute cmd, wait for the process to end and pipe its output to stdout */
   def exec(cmd: String) {
     val proc = Runtime.getRuntime().exec(cmd)
     val inp = new BufferedReader(new InputStreamReader(proc.getInputStream))
diff --git a/test/pending/pos/t1786.scala b/test/pending/pos/t1786.scala
index 6299eb9..16ce430 100644
--- a/test/pending/pos/t1786.scala
+++ b/test/pending/pos/t1786.scala
@@ -1,5 +1,5 @@
 /** This a consequence of the current type checking algorithm, where bounds are checked only after variables are instantiated.
- * I believe this will change once we go to contraint-based type inference.
+ * I believe this will change once we go to constraint-based type inference.
  * Alternatively, we can pursue a more extensive fix to SI-6169
  *
  * The below code shows a compiler flaw in that the wildcard "_" as value for a bounded type parameter either
diff --git a/test/pending/run/delambdafy-lambdametafactory.scala b/test/pending/run/delambdafy-lambdametafactory.scala
new file mode 100644
index 0000000..daea8a3
--- /dev/null
+++ b/test/pending/run/delambdafy-lambdametafactory.scala
@@ -0,0 +1,50 @@
+//
+// Tests that the static accessor method for lambda bodies
+// (generated under -Ydelambdafy:method) are compatible with
+// Java 8's LambdaMetafactory.
+//
+import java.lang.invoke._
+
+class C {
+  def test1: Unit = {
+    (x: String) => x.reverse
+  }
+  def test2: Unit = {
+    val capture1 = "capture1"
+    (x: String) => capture1 + " " + x.reverse
+  }
+  def test3: Unit = {
+    (x: String) => C.this + " " + x.reverse
+  }
+}
+trait T {
+  def test4: Unit = {
+    (x: String) => x.reverse
+  }
+}
+
+// A functional interface. Function1 contains abstract methods that are filled in by mixin 
+trait Function1ish[A, B] {
+  def apply(a: A): B
+}
+
+object Test {
+  def lambdaFactory[A, B](hostClass: Class[_], instantiatedParam: Class[A], instantiatedRet: Class[B], accessorName: String,
+                          capturedParams: Array[(Class[_], AnyRef)] = Array()) = {
+    val caller = MethodHandles.lookup
+    val methodType = MethodType.methodType(classOf[AnyRef], Array[Class[_]](classOf[AnyRef]))
+    val instantiatedMethodType = MethodType.methodType(instantiatedRet, Array[Class[_]](instantiatedParam))
+    val (capturedParamTypes, captured) = capturedParams.unzip
+    val targetMethodType = MethodType.methodType(instantiatedRet, capturedParamTypes :+ instantiatedParam)
+    val invokedType = MethodType.methodType(classOf[Function1ish[_, _]], capturedParamTypes)
+    val target = caller.findStatic(hostClass, accessorName, targetMethodType)
+    val site = LambdaMetafactory.metafactory(caller, "apply", invokedType, methodType, target, instantiatedMethodType)
+    site.getTarget.invokeWithArguments(captured: _*).asInstanceOf[Function1ish[A, B]]
+  }
+  def main(args: Array[String]) {
+    println(lambdaFactory(classOf[C], classOf[String], classOf[String], "accessor$1").apply("abc"))
+    println(lambdaFactory(classOf[C], classOf[String], classOf[String], "accessor$2", Array(classOf[String] -> "capture1")).apply("abc"))
+    println(lambdaFactory(classOf[C], classOf[String], classOf[String], "accessor$3", Array(classOf[C] -> new C)).apply("abc"))
+    println(lambdaFactory(Class.forName("T$class"), classOf[String], classOf[String], "accessor$4", Array(classOf[T] -> new T{})).apply("abc"))
+  }
+}
diff --git a/test/pending/run/idempotency-partial-functions.scala b/test/pending/run/idempotency-partial-functions.scala
index b26c442..c9d650c 100644
--- a/test/pending/run/idempotency-partial-functions.scala
+++ b/test/pending/run/idempotency-partial-functions.scala
@@ -6,7 +6,7 @@ import scala.tools.reflect.Eval
 // Related to SI-6187
 //
 // Moved to pending as we are currently blocked by the inability
-// to reify the parent types of the anoymous function class,
+// to reify the parent types of the anonymous function class,
 // which are not part of the tree, but rather only part of the
 // ClassInfoType.
 object Test extends App {
diff --git a/test/pending/run/t3609.scala b/test/pending/run/t3609.scala
old mode 100755
new mode 100644
diff --git a/test/scaladoc/filters b/test/scaladoc/filters
index 51a7507..e91ca0e 100644
--- a/test/scaladoc/filters
+++ b/test/scaladoc/filters
@@ -1,6 +1,7 @@
 #
 #Java HotSpot(TM) 64-Bit Server VM warning: Failed to reserve shared memory (errno = 28).
 Java HotSpot\(TM\) .* warning:
+OpenJDK .* warning:
 # Hotspot receiving VM options through the $_JAVA_OPTIONS
 # env variable outputs them on stderr
 Picked up _JAVA_OPTIONS:
diff --git a/test/scaladoc/resources/SI-4476.scala b/test/scaladoc/resources/SI-4476.scala
new file mode 100644
index 0000000..eb35ef4
--- /dev/null
+++ b/test/scaladoc/resources/SI-4476.scala
@@ -0,0 +1,9 @@
+package foo
+
+ at deprecated("","")
+class A
+
+class B {
+  @deprecated("","")
+  def bar = 1
+}
diff --git a/test/scaladoc/resources/Trac4420.scala b/test/scaladoc/resources/Trac4420.scala
index dbe053f..d8e2078 100644
--- a/test/scaladoc/resources/Trac4420.scala
+++ b/test/scaladoc/resources/Trac4420.scala
@@ -1,7 +1,7 @@
 import java.io.File
 
 /**
- * @define PP This class is an instance of XXX so it's members are not called directly.
+ * @define PP This class is an instance of XXX so its members are not called directly.
  * Instead these classes are instantiated via a driver's ''process''. See YYY for more details. */
 abstract class test
 
diff --git a/test/scaladoc/resources/doc-root/AnyRef.scala b/test/scaladoc/resources/doc-root/AnyRef.scala
index 362fbcf..7cdc3d1 100644
--- a/test/scaladoc/resources/doc-root/AnyRef.scala
+++ b/test/scaladoc/resources/doc-root/AnyRef.scala
@@ -45,7 +45,7 @@ trait AnyRef extends Any {
    */
   def synchronized[T](body: => T): T
 
-  /** Tests whether the argument (`arg0`) is a reference to the receiver object (`this`).
+  /** Tests whether the argument (`that`) is a reference to the receiver object (`this`).
    *
    *  The `eq` method implements an [[http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation]] on
    *  non-null instances of `AnyRef`, and has three additional properties:
@@ -73,7 +73,7 @@ trait AnyRef extends Any {
 
   /** The expression `x == that` is equivalent to `if (x eq null) that eq null else x.equals(that)`.
    *
-   *  @param    arg0  the object to compare against this object for equality.
+   *  @param    that  the object to compare against this object for equality.
    *  @return         `true` if the receiver object is equivalent to the argument; `false` otherwise.
    */
   final def ==(that: AnyRef): Boolean =
diff --git a/test/scaladoc/resources/implicits-base-res.scala b/test/scaladoc/resources/implicits-base-res.scala
index 1d17e9a..559d219 100644
--- a/test/scaladoc/resources/implicits-base-res.scala
+++ b/test/scaladoc/resources/implicits-base-res.scala
@@ -52,7 +52,7 @@ object A {
  * def convToGtColonDoubleA(x: Double)      // enrichA3: no constraints
  * def convToManifestA(x: Double)           // enrichA7: no constraints
  * def convToMyNumericA(x: Double)          // enrichA6: (if showAll is set) with a constraint that there is x: MyNumeric[Double] implicit in scope
- * def convToNumericA(x: Double)            // enrichA1: no constraintsd
+ * def convToNumericA(x: Double)            // enrichA1: no constraints
  * def convToEnrichedA(x: Bar[Foo[Double]]) // enrichA5: no constraints, SHADOWED
  * def convToEnrichedA(x: Double)           // enrichA0: no constraints, SHADOWED
  * def convToTraversableOps(x: Double)      // enrichA7: no constraints
diff --git a/test/scaladoc/resources/links.scala b/test/scaladoc/resources/links.scala
index ecac9c6..8e000ab 100644
--- a/test/scaladoc/resources/links.scala
+++ b/test/scaladoc/resources/links.scala
@@ -1,6 +1,6 @@
 // that would be:
 // SI-5079 "Scaladoc can't link to an object (only a class or trait)"
-// SI-4497 "Links in ScalaDoc - Spec and implementation unsufficient"
+// SI-4497 "Links in Scaladoc - Spec and implementation unsufficient"
 // SI-4224 "Wiki-links should support method targets"
 // SI-3695 "support non-fully-qualified type links in scaladoc comments"
 // SI-6487 "Scaladoc can't link to inner classes"
diff --git a/test/scaladoc/run/SI-191.check b/test/scaladoc/run/SI-191.check
old mode 100755
new mode 100644
diff --git a/test/scaladoc/run/SI-191.scala b/test/scaladoc/run/SI-191.scala
old mode 100755
new mode 100644
diff --git a/test/scaladoc/run/SI-7367.check b/test/scaladoc/run/SI-7367.check
old mode 100755
new mode 100644
diff --git a/test/scaladoc/run/SI-7367.scala b/test/scaladoc/run/SI-7367.scala
old mode 100755
new mode 100644
diff --git a/test/scaladoc/run/SI-8210.check b/test/scaladoc/run/SI-8210.check
new file mode 100644
index 0000000..619c561
--- /dev/null
+++ b/test/scaladoc/run/SI-8210.check
@@ -0,0 +1 @@
+Done.
diff --git a/test/scaladoc/run/SI-8210.scala b/test/scaladoc/run/SI-8210.scala
new file mode 100644
index 0000000..3bd8184
--- /dev/null
+++ b/test/scaladoc/run/SI-8210.scala
@@ -0,0 +1,24 @@
+import scala.tools.nsc.doc.model._
+import scala.tools.partest.ScaladocModelTest
+
+object Test extends ScaladocModelTest {
+  override def code = """
+object Foo {
+  trait Config {
+    /** The bar obviously. */
+    def bar: Int
+  }
+  class ConfigBuilder extends Config {
+    /** @inheritdoc
+      *
+      * The default value is 1234.
+      */
+    var bar: Int = 1234
+  }
+}
+  """
+
+  def scaladocSettings = ""
+
+  def testModel(root: Package) = ()
+}
diff --git a/test/scaladoc/run/SI-8479.scala b/test/scaladoc/run/SI-8479.scala
old mode 100755
new mode 100644
diff --git a/test/scaladoc/run/groups.scala b/test/scaladoc/run/groups.scala
index c9e4a86..ad5cca8 100644
--- a/test/scaladoc/run/groups.scala
+++ b/test/scaladoc/run/groups.scala
@@ -38,7 +38,7 @@ object Test extends ScaladocModelTest {
            *  @groupdesc C Group C is introduced by B
            */
           trait B {
-            /** baz descriptopn
+            /** baz description
              *  @group C */
             def baz = 3
           }
diff --git a/test/scaladoc/run/implicits-base.scala b/test/scaladoc/run/implicits-base.scala
index 8f8652c..ea87a67 100644
--- a/test/scaladoc/run/implicits-base.scala
+++ b/test/scaladoc/run/implicits-base.scala
@@ -94,7 +94,7 @@ object Test extends ScaladocModelTest {
     assert(isShadowed(conv._member("convToEnrichedA")))
     assert(conv._member("convToEnrichedA").resultType.name == "Double")
 
-    // def convToNumericA: Double          // enrichA1: no constraintsd
+    // def convToNumericA: Double          // enrichA1: no constraints
     conv = B._conversion(A.qualifiedName + ".enrichA1")
     assert(conv.members.length == 1)
     assert(conv.constraints.length == 0)
diff --git a/test/scaladoc/run/links.scala b/test/scaladoc/run/links.scala
index 64441c2..01db66a 100644
--- a/test/scaladoc/run/links.scala
+++ b/test/scaladoc/run/links.scala
@@ -3,7 +3,7 @@ import scala.tools.nsc.doc.model._
 import scala.tools.partest.ScaladocModelTest
 
 // SI-5079 "Scaladoc can't link to an object (only a class or trait)"
-// SI-4497 "Links in ScalaDoc - Spec and implementation unsufficient"
+// SI-4497 "Links in Scaladoc - Spec and implementation unsufficient"
 // SI-4224 "Wiki-links should support method targets"
 // SI-3695 "support non-fully-qualified type links in scaladoc comments"
 // SI-6487 "Scaladoc can't link to inner classes"
diff --git a/test/scaladoc/run/t5795.check b/test/scaladoc/run/t5795.check
new file mode 100644
index 0000000..d08ab61
--- /dev/null
+++ b/test/scaladoc/run/t5795.check
@@ -0,0 +1,4 @@
+newSource:16: warning: Could not find any member to link for "Exception".
+  /**
+  ^
+Done.
diff --git a/test/scaladoc/run/t5795.scala b/test/scaladoc/run/t5795.scala
new file mode 100644
index 0000000..767e4f1
--- /dev/null
+++ b/test/scaladoc/run/t5795.scala
@@ -0,0 +1,63 @@
+import scala.tools.nsc.doc.model._
+import scala.tools.partest.ScaladocModelTest
+
+object Test extends ScaladocModelTest {
+
+  override def code = """
+/**
+  * Only the 'deprecated' tag should stay.
+  *
+  * @author
+  * @since
+  * @todo
+  * @note
+  * @see
+  * @version
+  * @deprecated
+  * @example
+  * @constructor
+  */
+object Test {
+  /**
+    * Only the 'throws' tag should stay.
+    * @param foo
+    * @param bar
+    * @param baz
+    * @return
+    * @throws Exception
+    * @tparam T
+    */
+  def foo[T](foo: Any, bar: Any, baz: Any): Int = 1
+}
+  """
+
+  def scaladocSettings = ""
+
+  def test(b: Boolean, text: => String): Unit = if (!b) println(text)
+
+  def testModel(root: Package) = {
+    import access._
+    val obj = root._object("Test")
+    val c = obj.comment.get
+
+    test(c.authors.isEmpty, s"expected no authors, found: ${c.authors}")
+    test(!c.since.isDefined, s"expected no since tag, found: ${c.since}")
+    test(c.todo.isEmpty, s"expected no todos, found: ${c.todo}")
+    test(c.note.isEmpty, s"expected no note, found: ${c.note}")
+    test(c.see.isEmpty, s"expected no see, found: ${c.see}")
+    test(!c.version.isDefined, s"expected no version tag, found: ${c.version}")
+    // deprecated stays
+    test(c.deprecated.isDefined, s"expected deprecated tag, found none")
+    test(c.example.isEmpty, s"expected no example, found: ${c.example}")
+    test(!c.constructor.isDefined, s"expected no constructor tag, found: ${c.constructor}")
+
+    val method = obj._method("foo")
+    val mc = method.comment.get
+
+    test(mc.valueParams.isEmpty, s"expected empty value params, found: ${mc.valueParams}")
+    test(mc.typeParams.isEmpty, s"expected empty type params, found: ${mc.typeParams}")
+    test(!mc.result.isDefined, s"expected no result tag, found: ${mc.result}")
+    // throws stay
+    test(!mc.throws.isEmpty, s"expected an exception tag, found: ${mc.throws}")
+  }
+}
diff --git a/test/scaladoc/run/tag-requirements.check b/test/scaladoc/run/tag-requirements.check
new file mode 100644
index 0000000..184273b
--- /dev/null
+++ b/test/scaladoc/run/tag-requirements.check
@@ -0,0 +1,16 @@
+newSource:3: warning: Only one '@version' tag is allowed
+        /**
+        ^
+newSource:9: warning: Tag '@param' must be followed by a symbol name
+          /**
+          ^
+newSource:9: warning: Tag '@param' is not recognised
+          /**
+          ^
+newSource:14: warning: Only one '@param' tag for symbol b is allowed
+          /**
+          ^
+newSource:20: warning: Tag '@unrecognised' is not recognised
+          /**
+          ^
+Done.
diff --git a/test/scaladoc/run/tag-requirements.scala b/test/scaladoc/run/tag-requirements.scala
new file mode 100644
index 0000000..24f1fab
--- /dev/null
+++ b/test/scaladoc/run/tag-requirements.scala
@@ -0,0 +1,53 @@
+import scala.tools.nsc.doc.base._
+import scala.tools.nsc.doc.model._
+import scala.tools.partest.ScaladocModelTest
+
+object Test extends ScaladocModelTest {
+
+  override def code =
+    """
+      package scala.test.scaladoc.tagrequirements
+        /**
+         * object comment
+         * @version 1.0
+         * @version 2.0
+         */
+        object Test {
+          /**
+           * foo comment
+           * @param
+           */
+          def foo(b: Any) = ???
+          /**
+           * bar comment
+           * @param b A value
+           * @param b A value
+           */
+          def bar(b: Any) = ???
+          /**
+           * baz comment
+           * @unrecognised
+           */
+          def baz() = ???
+        }
+    """
+
+  def scaladocSettings = ""
+
+  def testModel(root: Package) = {
+    // get the quick access implicit defs in scope (_package(s), _class(es), _trait(s), object(s) _method(s), _value(s))
+    import access._
+
+    val base = root._package("scala")._package("test")._package("scaladoc")._package("tagrequirements")
+
+    val test = base._object("Test")
+    /*
+     * We only care about the warnings which are side effects but we assert on the comment to
+     * avoid static code analysis noise about unused values.
+     */
+    assert(extractCommentText(test.comment.get) == "object comment")
+    assert(extractCommentText(test._method("foo").comment.get) == "foo comment")
+    assert(extractCommentText(test._method("bar").comment.get) == "bar comment")
+    assert(extractCommentText(test._method("baz").comment.get) == "baz comment")
+  }
+}
diff --git a/test/scaladoc/scalacheck/CommentFactoryTest.scala b/test/scaladoc/scalacheck/CommentFactoryTest.scala
index ff64a25..d30b780 100644
--- a/test/scaladoc/scalacheck/CommentFactoryTest.scala
+++ b/test/scaladoc/scalacheck/CommentFactoryTest.scala
@@ -24,8 +24,11 @@ class Factory(val g: Global, val s: doc.Settings)
     }
   }
 
+  def getComment(s: String): Comment =
+    parse(s, "", scala.tools.nsc.util.NoPosition, null)
+
   def parseComment(s: String): Option[Inline] =
-    strip(parse(s, "", scala.tools.nsc.util.NoPosition, null))
+    strip(getComment(s))
 
   def createBody(s: String) =
     parse(s, "", scala.tools.nsc.util.NoPosition, null).body
@@ -166,4 +169,19 @@ object Test extends Properties("CommentFactory") {
     }
   }
 
+  property("Empty parameter text should be empty") = {
+    // used to fail with
+    // body == Body(List(Paragraph(Chain(List(Summary(Text('\n')))))))
+    factory.getComment(
+      """
+/**
+  * @deprecated
+  */
+      """).deprecated match {
+      case Some(Body(l)) if l.isEmpty => true
+      case other =>
+        println(other)
+        false
+    }
+  }
 }
diff --git a/test/scaladoc/scalacheck/DeprecatedIndexTest.scala b/test/scaladoc/scalacheck/DeprecatedIndexTest.scala
new file mode 100644
index 0000000..4a5a200
--- /dev/null
+++ b/test/scaladoc/scalacheck/DeprecatedIndexTest.scala
@@ -0,0 +1,50 @@
+import org.scalacheck._
+import org.scalacheck.Prop._
+
+import scala.tools.nsc.doc
+import scala.tools.nsc.doc.html.page.DeprecatedIndex
+import java.net.{URLClassLoader, URLDecoder}
+
+object Test extends Properties("IndexScript") {
+
+  def getClasspath = {
+    // these things can be tricky
+    // this test previously relied on the assumption that the current thread's classloader is an url classloader and contains all the classpaths
+    // does partest actually guarantee this? to quote Leonard Nimoy: The answer, of course, is no.
+    // this test _will_ fail again some time in the future.
+    // Footnote: java.lang.ClassCastException: org.apache.tools.ant.loader.AntClassLoader5 cannot be cast to java.net.URLClassLoader
+    val loader = Thread.currentThread.getContextClassLoader.asInstanceOf[URLClassLoader]
+    val paths = loader.getURLs.map(u => URLDecoder.decode(u.getPath))
+    paths mkString java.io.File.pathSeparator
+  }
+
+  val docFactory = {
+    val settings = new doc.Settings({Console.err.println(_)})
+    settings.scaladocQuietRun = true
+    settings.nowarn.value = true
+    settings.classpath.value = getClasspath
+    val reporter = new scala.tools.nsc.reporters.ConsoleReporter(settings)
+    new doc.DocFactory(reporter, settings)
+  }
+
+  val indexModelFactory = doc.model.IndexModelFactory
+
+  def createDeprecatedScript(path: String) =
+    docFactory.makeUniverse(Left(List(path))) match {
+      case Some(universe) => {
+        val index = new DeprecatedIndex(universe, indexModelFactory.makeIndex(universe))
+        Some(index)
+      }
+      case _ =>
+        None
+    }
+
+    property("deprecated-list page lists deprecated members") = {
+      createDeprecatedScript("test/scaladoc/resources/SI-4476.scala") match {
+        case Some(p) =>
+          p.deprecatedEntries.find(_._1 == "A").isDefined &&
+          p.deprecatedEntries.find(_._1 == "bar").isDefined
+        case None => false
+      }
+    }
+}
diff --git a/test/scaladoc/scalacheck/HtmlFactoryTest.scala b/test/scaladoc/scalacheck/HtmlFactoryTest.scala
index 51633be..578e038 100644
--- a/test/scaladoc/scalacheck/HtmlFactoryTest.scala
+++ b/test/scaladoc/scalacheck/HtmlFactoryTest.scala
@@ -685,7 +685,7 @@ object Test extends Properties("HtmlFactory") {
       case node: scala.xml.Node => {
         val s = node.toString
         s.contains("<h6>Author:</h6>") &&
-        s.contains("<p>The Only Author\n</p>")
+        s.contains("<p>The Only Author</p>")
       }
       case _ => false
     }
@@ -699,7 +699,7 @@ object Test extends Properties("HtmlFactory") {
         val s = node.toString
         s.contains("<h6>Authors:</h6>") &&
         s.contains("<p>The First Author</p>") &&
-        s.contains("<p>The Second Author\n</p>")
+        s.contains("<p>The Second Author</p>")
       }
       case _ => false
     }
@@ -711,7 +711,7 @@ object Test extends Properties("HtmlFactory") {
 
     property("class") = files.get("com/example/p1/Clazz.html") match {
       case Some(node: scala.xml.Node) => {
-        property("implicit convertion") =
+        property("implicit conversion") =
           node.toString contains "<span class=\"modifier\">implicit </span>"
 
         property("gt4s") =
diff --git a/test/scaladoc/scalacheck/IndexTest.scala b/test/scaladoc/scalacheck/IndexTest.scala
index abc0e5d..7dbd210 100644
--- a/test/scaladoc/scalacheck/IndexTest.scala
+++ b/test/scaladoc/scalacheck/IndexTest.scala
@@ -71,7 +71,7 @@ object Test extends Properties("Index") {
       case None => false
     }
   }
-  property("browser contants a script element") = {
+  property("browser contains a script element") = {
     createIndex("src/scaladoc/scala/tools/nsc/doc/html/page/Index.scala") match {
       case Some(index) =>
         (index.browser \ "script").size == 1
@@ -86,4 +86,10 @@ object Test extends Properties("Index") {
       case None => false
     }
   }
+  property("index should report if there are deprecated members") = {
+    createIndex("test/scaladoc/resources/SI-4476.scala") match {
+      case Some(indexPage) => indexPage.index.hasDeprecatedMembers
+      case None => false
+    }
+  }
 }
diff --git a/test/script-tests/README b/test/script-tests/README
old mode 100755
new mode 100644
diff --git a/tools/binary-repo-lib.sh b/tools/binary-repo-lib.sh
index 437c0a0..278804e 100755
--- a/tools/binary-repo-lib.sh
+++ b/tools/binary-repo-lib.sh
@@ -2,8 +2,8 @@
 #
 # Library to push and pull binary artifacts from a remote repository using CURL.
 
-remote_urlget="http://repo.typesafe.com/typesafe/scala-sha-bootstrap/org/scala-lang/bootstrap"
-remote_urlpush="http://private-repo.typesafe.com/typesafe/scala-sha-bootstrap/org/scala-lang/bootstrap"
+remote_urlget="https://dl.bintray.com/typesafe/scala-sha-bootstrap/org/scala-lang/bootstrap"
+remote_urlpush="https://dl.bintray.com/typesafe/scala-sha-bootstrap/org/scala-lang/bootstrap"
 libraryJar="$(pwd)/lib/scala-library.jar"
 desired_ext=".desired.sha1"
 push_jar="$(pwd)/tools/push.jar"
@@ -56,7 +56,7 @@ curlDownload() {
   if [[ "$OSTYPE" == *Cygwin* || "$OSTYPE" == *cygwin* ]]; then
     jar=$(cygpath -m $1)
   fi
-  http_code=$(curl --write-out '%{http_code}' --silent --fail --output "$jar" "$url")
+  http_code=$(curl --write-out '%{http_code}' --silent --fail -L --output "$jar" "$url")
   if (( $? != 0 )); then
     echo "Error downloading $jar: response code: $http_code"
     echo "$url"
diff --git a/tools/get-scala-commit-date.bat b/tools/get-scala-commit-date.bat
index e169de1..735a80b 100644
--- a/tools/get-scala-commit-date.bat
+++ b/tools/get-scala-commit-date.bat
@@ -1,9 +1,9 @@
 @echo off
 for %%X in (bash.exe) do (set FOUND=%%~$PATH:X)
 if defined FOUND (
-  bash "%~dp0\get-scala-commit-date"
+  bash "%~dp0\get-scala-commit-date" 2>NUL
 ) else (
   rem echo this script does not work with cmd.exe. please, install bash
   echo unknown
   exit 1
-)
\ No newline at end of file
+)
diff --git a/tools/get-scala-commit-sha.bat b/tools/get-scala-commit-sha.bat
index 1eaffc0..6559a19 100644
--- a/tools/get-scala-commit-sha.bat
+++ b/tools/get-scala-commit-sha.bat
@@ -1,9 +1,9 @@
 @echo off
 for %%X in (bash.exe) do (set FOUND=%%~$PATH:X)
 if defined FOUND (
-  bash "%~dp0\get-scala-commit-sha"
+  bash "%~dp0\get-scala-commit-sha" 2>NUL
 ) else (
   rem echo this script does not work with cmd.exe. please, install bash
   echo unknown
   exit 1
-)
\ No newline at end of file
+)
diff --git a/tools/scaladoc-compare b/tools/scaladoc-compare
index 74fbfd1..46e1b75 100755
--- a/tools/scaladoc-compare
+++ b/tools/scaladoc-compare
@@ -7,7 +7,7 @@ if [ $# -ne 2 ]
 then
   echo
   echo "scaladoc-compare will compare the scaladoc-generated pages in two different locations and output the diff"
-  echo "it's main purpose is to track changes to scaladoc and prevent updates that break things."
+  echo "its main purpose is to track changes to scaladoc and prevent updates that break things."
   echo
   echo "This script is meant to be used with the scaladoc -raw-output option, as it compares .html.raw files "
   echo "instead of markup-heavy .html files."
diff --git a/tools/scaladoc-diff b/tools/scaladoc-diff
new file mode 100755
index 0000000..df0d1f3
--- /dev/null
+++ b/tools/scaladoc-diff
@@ -0,0 +1,117 @@
+#!/usr/bin/env bash
+#
+# Script to compare the scaladoc of the current commit with the scaladoc
+# of the parent commit. No arguments.
+#
+
+set -e
+
+# opendiff for Mac OS X, meld for Ubuntu then default to other commands.
+displaydiff() {
+  case "$(uname -s)" in
+
+    Darwin)
+      if hash opendiff 2>/dev/null; then
+        echo opendiff "$@"
+        opendiff "$@"
+      else
+        echo diff "$@"
+        diff -y "$@" | less -N
+      fi
+    ;;
+
+    *)
+      if hash meld 2>/dev/null; then
+        echo meld "$@"
+        meld "$@"
+      elif hash gvimdiff 2>/dev/null; then
+        echo gvimdiff "$@"
+        gvimdiff "$@"
+      else
+        echo diff "$@"
+        diff -y "$@" | less -N
+      fi
+    ;;
+  esac
+}
+
+oldsha=$(git rev-parse --short HEAD^)
+
+# Use branch name defaulting to SHA1 when not available for example when in
+# detached HEAD state.
+sha=$(git symbolic-ref -q --short HEAD || git rev-parse --short HEAD)
+
+echo "parent commit sha  : $oldsha"
+echo "current commit sha : $sha"
+
+# create scaladoc for parent commit if not done already
+if [ ! -f "build/scaladoc-output-$oldsha.txt" ]
+then
+  echo "making scaladoc for parent commit ($oldsha)"
+  git checkout -q $oldsha
+  ant docs.lib -Dscaladoc.raw.output='yes' > build/scaladoc-output-$oldsha.txt
+  rm -rf build/scaladoc-${oldsha}
+  mv build/scaladoc build/scaladoc-${oldsha}
+  git checkout -q $sha
+fi
+
+# create scaladoc for current commit
+echo "making scaladoc for current commit ($sha)"
+ant docs.lib -Dscaladoc.raw.output='yes' > build/scaladoc-output-$sha.txt
+rm -rf build/scaladoc-${sha}
+mv build/scaladoc build/scaladoc-${sha}
+
+# Allow script to continue when diff results in -1
+set +e
+
+displaydiff build/scaladoc-output-$oldsha.txt build/scaladoc-output-$sha.txt
+
+# Adapted from tools/scaladoc-compare
+echo "Comparing versions with diff: build/scaladoc-${sha}/ build/scaladoc-$oldsha/"
+NEW_PATH=build/scaladoc-${sha}/
+OLD_PATH=build/scaladoc-$oldsha/
+
+
+NEWFILES=$(find $NEW_PATH -name '*.html.raw')
+if [ "$NEWFILES" == "" ]
+then
+  echo "No .html.raw files found in $NEW_PATH!"
+  exit 1
+fi
+
+for NEW_FILE in $NEWFILES
+do
+  OLD_FILE=${NEW_FILE/$NEW_PATH/$OLD_PATH}
+  if [ -f $OLD_FILE ]
+  then
+    DIFF=$(diff -q -w $NEW_FILE $OLD_FILE 2>&1)
+    if [ "$DIFF" != "" ]
+    then
+      displaydiff $OLD_FILE $NEW_FILE > /dev/null
+
+      echo "next [y\N]? "
+      read -n 1 -s input
+      if [ "$input" == "N" ]; then exit 0; fi
+    fi
+  else
+    echo
+    echo "New file:                 : $NEW_FILE"
+    echo "No corresponding old file : $OLD_FILE"
+
+    echo "next [y\N]? "
+    read -n 1 -s input
+    if [ "$input" == "N" ]; then exit 0; fi
+  fi
+done
+
+OLDFILES=$(find $OLD_PATH -name '*.html.raw')
+for OLD_FILE in $OLDFILES
+do
+  NEW_FILE=${OLD_FILE/$OLD_PATH/$NEW_PATH}
+  if [ ! -f $NEW_FILE ]
+  then
+    echo
+    echo "Old file:                 : $OLD_FILE"
+    echo "No corresponding new file : $NEW_FILE"
+  fi
+done
diff --git a/versions.properties b/versions.properties
index fa08e56..45dada9 100644
--- a/versions.properties
+++ b/versions.properties
@@ -3,32 +3,41 @@
 # via scala-dist-pom.xml and scala-library-all-pom.xml
 # when adding new properties that influence a release,
 # also add them to the update.versions mechanism in build.xml,
-# which is used by scala-release-2.11.x in scala/jenkins-scripts
-starr.version=2.11.5
-starr.use.released=1
+# which is used by the release script scripts/jobs/integrate/bootstrap
+
+# The scala version used for bootstrapping. This has no impact on the final classfiles:
+# there are two stages (locker and quick), so compiler and library are always built
+# with themselves. Stability is ensured by building a third stage (strap).
+starr.version=2.11.7
 
 # These are the versions of the modules that go with this release.
 # These properties are used during PR validation and in dbuild builds.
 
-# e.g. 2.11.0-RC1, 2.11
+# The scala.binary.version determines how modules are resolved. For example, it
+# determines which partest artifact is being used for running the tests.
+# It has to be set in the following way:
+#  - After 2.x.0 is released, the binary version is 2.x.
+#  - During milestones and RCs, modules are cross-built against the full version.
+#    So the value is the full version (e.g. 2.12.0-M1).
 scala.binary.version=2.11
 # e.g. 2.11.0-RC1, 2.11.0, 2.11.1-RC1, 2.11.1
 # this defines the dependency on scala-continuations-plugin in scala-dist's pom
-scala.full.version=2.11.5
+scala.full.version=2.11.7
 
 # external modules shipped with distribution, as specified by scala-library-all's pom
-scala-xml.version.number=1.0.3
-scala-parser-combinators.version.number=1.0.3
+scala-xml.version.number=1.0.4
+scala-parser-combinators.version.number=1.0.4
 scala-continuations-plugin.version.number=1.0.2
 scala-continuations-library.version.number=1.0.2
-scala-swing.version.number=1.0.1
-akka-actor.version.number=2.3.4
+scala-swing.version.number=1.0.2
+akka-actor.version.number=2.3.10
 actors-migration.version.number=1.1.0
 jline.version=2.12.1
+scala-asm.version=5.0.4-scala-3
 
 # external modules, used internally (not shipped)
-partest.version.number=1.0.5
-scalacheck.version.number=1.11.4
+partest.version.number=1.0.13
+scalacheck.version.number=1.11.6
 
 # TODO: modularize the compiler
 #scala-compiler-doc.version.number=1.0.0-RC1

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/scala-2.10.git



More information about the pkg-java-commits mailing list