org.pitest:pitest-parent missing for Maven plug-in
_From [vlae...@online.no](https://code.google.com/u/109446317644574090143/) on June 10, 2011 09:45:18_

What steps will reproduce the problem? 1. I downloaded and installed pitest-0.19
2. I added pitest to pom.xml
3. I ran mvn clean install on my project What is the expected output? What do you see instead? My project doesn't want to build as pitest-parent seems to be missing. What version of the product are you using? On what operating system? I'm using Ubuntu 11.04, and mvn --version returns the following:

Apache Maven 2.2.1 (rdebian-4)
Java version: 1.6.0_22
Java home: /usr/lib/jvm/java-6-openjdk/jre
Default locale: nb_NO, platform encoding: UTF-8
OS name: "linux" version: "2.6.38-8-generic-pae" arch: "i386" Family: "unix"

Here's the output from Maven:

Downloading: http://repository.apache.org/snapshots//org/pitest/pitest-parent/0.19/pitest-parent-0.19.pom [INFO] Unable to find resource 'org.pitest:pitest-parent:pom:0.19' in repository apache.snapshots ( http://repository.apache.org/snapshots/ )
Downloading: http://repo1.maven.org/maven2/org/pitest/pitest-parent/0.19/pitest-parent-0.19.pom [INFO] Unable to find resource 'org.pitest:pitest-parent:pom:0.19' in repository central ( http://repo1.maven.org/maven2 )
Downloading: http://repo1.maven.org/maven2/org/pitest/pitest-parent/0.19/pitest-parent-0.19.pom [INFO] Unable to find resource 'org.pitest:pitest-parent:pom:0.19' in repository central ( http://repo1.maven.org/maven2 )
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error building POM (may not be this project's POM).

Project ID: org.pitest:pitest-maven:maven-plugin:0.19

Reason: Cannot find parent: org.pitest:pitest-parent for project: org.pitest:pitest-maven:maven-plugin:0.19 for project org.pitest:pitest-maven:maven-plugin:0.19

_Original issue: http://code.google.com/p/pitestrunner/issues/detail?id=2_

diff --git a/pitest-aggregator/src/main/java/org/pitest/aggregate/BlockCoverageDataLoader.java b/pitest-aggregator/src/main/java/org/pitest/aggregate/BlockCoverageDataLoader.java
index b0c5cf8e..15605b02 100644
--- a/pitest-aggregator/src/main/java/org/pitest/aggregate/BlockCoverageDataLoader.java
+++ b/pitest-aggregator/src/main/java/org/pitest/aggregate/BlockCoverageDataLoader.java
@@ -8,7 +8,6 @@ import org.pitest.classinfo.ClassName;
 import org.pitest.coverage.BlockCoverage;
 import org.pitest.coverage.BlockLocation;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 
 class BlockCoverageDataLoader extends DataLoader<BlockCoverage> {
 
@@ -29,7 +28,7 @@ class BlockCoverageDataLoader extends DataLoader<BlockCoverage> {
   protected BlockCoverage mapToData(final Map<String, Object> map) {
     final String method = (String) map.get(METHOD);
     final Location location = new Location(ClassName.fromString((String) map.get(CLASSNAME)),
-        MethodName.fromString(method.substring(0, method.indexOf(OPEN_PAREN))), method.substring(method.indexOf(OPEN_PAREN)));
+        method.substring(0, method.indexOf(OPEN_PAREN)), method.substring(method.indexOf(OPEN_PAREN)));
 
     final BlockLocation blockLocation = new BlockLocation(location, Integer.parseInt((String) map.get(NUMBER)),
         Integer.parseInt((String) map.get(FIRST_INSN)),Integer.parseInt((String) map.get(LAST_INSN)));
diff --git a/pitest-aggregator/src/main/java/org/pitest/aggregate/MutationResultDataLoader.java b/pitest-aggregator/src/main/java/org/pitest/aggregate/MutationResultDataLoader.java
index 4bc30558..7c837d14 100644
--- a/pitest-aggregator/src/main/java/org/pitest/aggregate/MutationResultDataLoader.java
+++ b/pitest-aggregator/src/main/java/org/pitest/aggregate/MutationResultDataLoader.java
@@ -10,7 +10,6 @@ import org.pitest.mutationtest.DetectionStatus;
 import org.pitest.mutationtest.MutationResult;
 import org.pitest.mutationtest.MutationStatusTestPair;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 import org.pitest.mutationtest.engine.MutationDetails;
 import org.pitest.mutationtest.engine.MutationIdentifier;
 
@@ -35,7 +34,7 @@ class MutationResultDataLoader extends DataLoader<MutationResult> {
 
   @Override
   protected MutationResult mapToData(final Map<String, Object> map) {
-    final Location location = new Location(ClassName.fromString((String) map.get(MUTATED_CLASS)), MethodName.fromString((String) map.get(MUTATED_METHOD)),
+    final Location location = new Location(ClassName.fromString((String) map.get(MUTATED_CLASS)), (String) map.get(MUTATED_METHOD),
         (String) map.get(METHOD_DESCRIPTION));
 
     final MutationIdentifier id = new MutationIdentifier(location, Arrays.asList(Integer.valueOf((String) map.get(INDEX))), (String) map.get(MUTATOR));
diff --git a/pitest-entry/src/main/java/org/pitest/bytecode/analysis/MethodTree.java b/pitest-entry/src/main/java/org/pitest/bytecode/analysis/MethodTree.java
index b52624b7..a49be27e 100644
--- a/pitest-entry/src/main/java/org/pitest/bytecode/analysis/MethodTree.java
+++ b/pitest-entry/src/main/java/org/pitest/bytecode/analysis/MethodTree.java
@@ -9,7 +9,6 @@ import org.objectweb.asm.tree.AnnotationNode;
 import org.objectweb.asm.tree.MethodNode;
 import org.pitest.classinfo.ClassName;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 
 public class MethodTree {
 
@@ -27,7 +26,7 @@ public class MethodTree {
   }
 
   public Location asLocation() {
-    return Location.location(this.owner,MethodName.fromString(this.rawNode.name), this.rawNode.desc);
+    return Location.location(this.owner, this.rawNode.name, this.rawNode.desc);
   }
     
   /**
diff --git a/pitest-entry/src/main/java/org/pitest/coverage/execute/Receive.java b/pitest-entry/src/main/java/org/pitest/coverage/execute/Receive.java
index 91bf158e..bc2b88d6 100644
--- a/pitest-entry/src/main/java/org/pitest/coverage/execute/Receive.java
+++ b/pitest-entry/src/main/java/org/pitest/coverage/execute/Receive.java
@@ -4,7 +4,6 @@ import org.pitest.classinfo.ClassName;
 import org.pitest.coverage.BlockLocation;
 import org.pitest.coverage.CoverageResult;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 import org.pitest.testapi.Description;
 import org.pitest.util.Id;
 import org.pitest.util.ReceiveStrategy;
@@ -55,7 +54,7 @@ final class Receive implements ReceiveStrategy {
     final int first = is.readInt();
     final int last = is.readInt();
     final Location loc = Location.location(this.classIdToName.get(classId),
-        MethodName.fromString(methodName), methodSig);
+        methodName, methodSig);
     for (int i = first; i != (last + 1); i++) {
       // nb, convert from classwide id to method scoped index within
       // BlockLocation
diff --git a/pitest-entry/src/main/java/org/pitest/coverage/export/DefaultCoverageExporter.java b/pitest-entry/src/main/java/org/pitest/coverage/export/DefaultCoverageExporter.java
index 82952320..fd6e48cc 100644
--- a/pitest-entry/src/main/java/org/pitest/coverage/export/DefaultCoverageExporter.java
+++ b/pitest-entry/src/main/java/org/pitest/coverage/export/DefaultCoverageExporter.java
@@ -48,7 +48,7 @@ public class DefaultCoverageExporter implements CoverageExporter {
         out,
         "<block classname='" + l.getClassName().asJavaName() + "'"
             + " method='"
-            + StringUtil.escapeBasicHtmlChars(l.getMethodName().name()) + StringUtil.escapeBasicHtmlChars(l.getMethodDesc())
+            + StringUtil.escapeBasicHtmlChars(l.getMethodName()) + StringUtil.escapeBasicHtmlChars(l.getMethodDesc())
             + "' number='" + each.getBlock().getBlock()
             + "' firstInstruction='" + each.getBlock().getFirstInsnInBlock()
             + "' lastInstruction='" + each.getBlock().getLastInsnInBlock()
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/build/DefaultTestPrioritiser.java b/pitest-entry/src/main/java/org/pitest/mutationtest/build/DefaultTestPrioritiser.java
index cd110523..a8c5e13a 100644
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/build/DefaultTestPrioritiser.java
+++ b/pitest-entry/src/main/java/org/pitest/mutationtest/build/DefaultTestPrioritiser.java
@@ -41,7 +41,6 @@ public class DefaultTestPrioritiser implements TestPrioritiser {
   }
 
   private Collection<TestInfo> pickTests(MutationDetails mutation) {
-    if (!mutation.isInStaticInitializer()) {
       if (mutation.getId().getIndexes().size() > 1) {
         HashSet<TestInfo> ret = new HashSet<>();
         for (int each : mutation.getId().getIndexes()) {
@@ -59,10 +58,6 @@ public class DefaultTestPrioritiser implements TestPrioritiser {
             .getTestsForInstructionLocation(new InstructionLocation(new BlockLocation(mutation.getId().getLocation(), mutation.getBlock(), -1, -1),
                 mutation.getId().getFirstIndex() - 1));
       }
-    } else {
-      LOG.warning("Using untargetted tests");
-      return this.coverage.getTestsForClass(mutation.getClassName());
-    }
   }
 
   private List<TestInfo> prioritizeTests(ClassName clazz,
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/equivalent/EqualsPerformanceShortcutFilter.java b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/equivalent/EqualsPerformanceShortcutFilter.java
index e14ab61d..aac7438d 100644
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/equivalent/EqualsPerformanceShortcutFilter.java
+++ b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/equivalent/EqualsPerformanceShortcutFilter.java
@@ -21,7 +21,6 @@ import org.pitest.functional.FCollection;
 import org.pitest.mutationtest.build.InterceptorType;
 import org.pitest.mutationtest.build.MutationInterceptor;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 import org.pitest.mutationtest.engine.Mutater;
 import org.pitest.mutationtest.engine.MutationDetails;
 import org.pitest.sequence.QueryParams;
@@ -110,7 +109,7 @@ public class EqualsPerformanceShortcutFilter implements MutationInterceptor {
     return a -> {
       final Location loc = a.getId().getLocation();
       return loc.getMethodDesc().equals("(Ljava/lang/Object;)Z")
-          && loc.getMethodName().equals(MethodName.fromString("equals"));
+          && loc.getMethodName().equals("equals");
     };
   }
 
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/equivalent/NullFlatMapFilter.java b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/equivalent/NullFlatMapFilter.java
index 9f984306..9595e700 100644
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/equivalent/NullFlatMapFilter.java
+++ b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/equivalent/NullFlatMapFilter.java
@@ -131,7 +131,7 @@ public class NullFlatMapFilter implements MutationInterceptor {
 
     private boolean callsTarget(MethodTree target, MethodTree method) {
         return method.instructions().stream()
-                .anyMatch(callTo(target.asLocation().getClassName(), target.asLocation().getMethodName().name(), target.asLocation().getMethodDesc())
+                .anyMatch(callTo(target.asLocation().getClassName(), target.asLocation().getMethodName(), target.asLocation().getMethodDesc())
                         .or(dynamicCallTo(target.asLocation())));
     }
 
@@ -161,7 +161,7 @@ public class NullFlatMapFilter implements MutationInterceptor {
             if ( t instanceof InvokeDynamicInsnNode) {
                 InvokeDynamicInsnNode call = (InvokeDynamicInsnNode) t;
                 return Arrays.stream(call.bsmArgs)
-                        .anyMatch(isHandle(desc.getClassName(), desc.getMethodName().name(), desc.getMethodDesc()));
+                        .anyMatch(isHandle(desc.getClassName(), desc.getMethodName(), desc.getMethodDesc()));
             }
             return false;
         };
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/EnumConstructorFilter.java b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/EnumConstructorFilter.java
index e8d893e9..4f62ac2f 100755
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/EnumConstructorFilter.java
+++ b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/EnumConstructorFilter.java
@@ -37,7 +37,7 @@ public class EnumConstructorFilter implements MutationInterceptor {
     }
 
     private Predicate<MutationDetails> isInEnumConstructor() {
-        return m -> isEnum && m.getMethod().name().equals("<init>");
+        return m -> isEnum && m.getMethod().equals("<init>");
     }
 
 
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/InlinedFinallyBlockFilter.java b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/InlinedFinallyBlockFilter.java
index 1f2c2579..64a6e368 100644
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/InlinedFinallyBlockFilter.java
+++ b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/InlinedFinallyBlockFilter.java
@@ -1,10 +1,21 @@
 package org.pitest.mutationtest.build.intercept.javafeatures;
 
-import static java.util.function.Predicate.isEqual;
-import static org.pitest.functional.FCollection.bucket;
-import static org.pitest.functional.FCollection.map;
-import static org.pitest.functional.FCollection.mapTo;
-import static org.pitest.functional.prelude.Prelude.not;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.LabelNode;
+import org.pitest.bytecode.analysis.ClassTree;
+import org.pitest.bytecode.analysis.MethodTree;
+import org.pitest.mutationtest.build.InterceptorType;
+import org.pitest.mutationtest.build.MutationInterceptor;
+import org.pitest.mutationtest.engine.Mutater;
+import org.pitest.mutationtest.engine.MutationDetails;
+import org.pitest.mutationtest.engine.MutationIdentifier;
+import org.pitest.sequence.Context;
+import org.pitest.sequence.Match;
+import org.pitest.sequence.QueryParams;
+import org.pitest.sequence.QueryStart;
+import org.pitest.sequence.SequenceMatcher;
+import org.pitest.sequence.Slot;
+import org.pitest.util.Log;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -16,15 +27,24 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.logging.Logger;
+import java.util.stream.Collectors;
 
-import org.pitest.bytecode.analysis.ClassTree;
-import org.pitest.functional.FCollection;
-import org.pitest.mutationtest.build.InterceptorType;
-import org.pitest.mutationtest.build.MutationInterceptor;
-import org.pitest.mutationtest.engine.Mutater;
-import org.pitest.mutationtest.engine.MutationDetails;
-import org.pitest.mutationtest.engine.MutationIdentifier;
-import org.pitest.util.Log;
+import static java.util.function.Predicate.isEqual;
+import static org.objectweb.asm.Opcodes.ARETURN;
+import static org.objectweb.asm.Opcodes.ATHROW;
+import static org.objectweb.asm.Opcodes.DRETURN;
+import static org.objectweb.asm.Opcodes.FRETURN;
+import static org.objectweb.asm.Opcodes.IRETURN;
+import static org.objectweb.asm.Opcodes.LRETURN;
+import static org.objectweb.asm.Opcodes.RETURN;
+import static org.pitest.bytecode.analysis.InstructionMatchers.anyInstruction;
+import static org.pitest.bytecode.analysis.InstructionMatchers.isInstruction;
+import static org.pitest.bytecode.analysis.InstructionMatchers.notAnInstruction;
+import static org.pitest.bytecode.analysis.InstructionMatchers.opCode;
+import static org.pitest.functional.FCollection.bucket;
+import static org.pitest.functional.FCollection.map;
+import static org.pitest.functional.FCollection.mapTo;
+import static org.pitest.functional.prelude.Prelude.not;
 
 /**
  * Detects mutations on same line, but within different code blocks. This
@@ -37,6 +57,49 @@ public class InlinedFinallyBlockFilter implements MutationInterceptor {
 
   private static final Logger LOG = Log.getLogger();
 
+  private static final boolean DEBUG = false;
+
+  private static final Slot<AbstractInsnNode> MUTATED_INSTRUCTION = Slot.create(AbstractInsnNode.class);
+  private static final Slot<List> HANDLERS = Slot.create(List.class);
+
+  static final SequenceMatcher<AbstractInsnNode> IS_IN_HANDLER = QueryStart
+          .any(AbstractInsnNode.class)
+          .then(handlerLabel(HANDLERS))
+          .zeroOrMore(QueryStart.match(doesNotEndBlock()))
+          .then(isInstruction(MUTATED_INSTRUCTION.read()))
+          .zeroOrMore(QueryStart.match(anyInstruction()))
+          .compile(QueryParams.params(AbstractInsnNode.class)
+                  .withIgnores(notAnInstruction())
+                  .withDebug(DEBUG)
+          );
+
+  private static Match<AbstractInsnNode> doesNotEndBlock() {
+     return endsBlock().negate();
+  }
+
+  private static Match<AbstractInsnNode> endsBlock() {
+    return opCode(RETURN)
+            .or(opCode(ARETURN))
+            .or(opCode(DRETURN))
+            .or(opCode(FRETURN))
+            .or(opCode(IRETURN))
+            .or(opCode(LRETURN))
+            .or(opCode(ATHROW)); // dubious if this is needed
+  }
+
+  private static Match<AbstractInsnNode> handlerLabel(Slot<List> handlers) {
+    return (c,t) -> {
+      if (t instanceof LabelNode) {
+        LabelNode label = (LabelNode) t;
+        List<LabelNode> labels = c.retrieve(handlers.read()).get();
+        return labels.contains(label);
+      }
+      return false;
+    };
+  }
+
+  private ClassTree currentClass;
+
   @Override
   public InterceptorType type() {
     return InterceptorType.FILTER;
@@ -44,47 +107,49 @@ public class InlinedFinallyBlockFilter implements MutationInterceptor {
 
   @Override
   public void begin(ClassTree clazz) {
-    // no-opp
+    currentClass = clazz;
   }
 
   @Override
   public Collection<MutationDetails> intercept(
       Collection<MutationDetails> mutations, Mutater m) {
-    final List<MutationDetails> combined = new ArrayList<>(
+
+    List<MutationDetails> combined = new ArrayList<>(
         mutations.size());
-    final Map<LineMutatorPair, Collection<MutationDetails>> mutatorLinebuckets = bucket(
+    Map<LineMutatorPair, Collection<MutationDetails>> mutatorLineBuckets = bucket(
         mutations, toLineMutatorPair());
 
-    for (final Entry<LineMutatorPair, Collection<MutationDetails>> each : mutatorLinebuckets
+    for (final Entry<LineMutatorPair, Collection<MutationDetails>> each : mutatorLineBuckets
         .entrySet()) {
       if (each.getValue().size() > 1) {
-        checkForInlinedCode(combined, each);
+        checkForInlinedCode(combined, each.getValue());
       } else {
         combined.addAll(each.getValue());
       }
     }
 
-    /* FIXME tests rely on order of returned mutants */
     combined.sort(compareLineNumbers());
     return combined;
   }
 
   @Override
   public void end() {
-    // no-opp
+    currentClass = null;
   }
 
   private static Comparator<MutationDetails> compareLineNumbers() {
     return Comparator.comparingInt(MutationDetails::getLineNumber);
   }
 
-  private void checkForInlinedCode(final Collection<MutationDetails> combined,
-      final Entry<LineMutatorPair, Collection<MutationDetails>> each) {
+  private void checkForInlinedCode(Collection<MutationDetails> mutantsToReturn,
+                                  Collection<MutationDetails> similarMutantsOnSameLine) {
+
+    final List<MutationDetails> mutationsInHandlerBlock = similarMutantsOnSameLine.stream()
+            .filter(this::isInFinallyBlock)
+            .collect(Collectors.toList());
 
-    final List<MutationDetails> mutationsInHandlerBlock = FCollection
-        .filter(each.getValue(), MutationDetails::isInFinallyBlock);
     if (!isPossibleToCorrectInlining(mutationsInHandlerBlock)) {
-      combined.addAll(each.getValue());
+      mutantsToReturn.addAll(similarMutantsOnSameLine);
       return;
     }
 
@@ -94,16 +159,34 @@ public class InlinedFinallyBlockFilter implements MutationInterceptor {
     // check that we have at least on mutation in a different block
     // to the base one (is this not implied by there being only 1 mutation in
     // the handler ????)
-    final List<Integer> ids = map(each.getValue(), MutationDetails::getBlock);
+    final List<Integer> ids = map(similarMutantsOnSameLine, MutationDetails::getBlock);
     if (ids.stream().anyMatch(not(isEqual(firstBlock)))) {
-      combined.add(makeCombinedMutant(each.getValue()));
+      mutantsToReturn.add(makeCombinedMutant(similarMutantsOnSameLine));
     } else {
-      combined.addAll(each.getValue());
+      mutantsToReturn.addAll(similarMutantsOnSameLine);
     }
   }
 
-  private boolean isPossibleToCorrectInlining(
-      final List<MutationDetails> mutationsInHandlerBlock) {
+  private boolean isInFinallyBlock(MutationDetails m) {
+    MethodTree method = currentClass.method(m.getId().getLocation()).get();
+    List<LabelNode> handlers = method.rawNode().tryCatchBlocks.stream()
+            .filter(t -> t.type == null)
+            .map(t -> t.handler)
+            .collect(Collectors.toList());
+
+    if (handlers.isEmpty()) {
+      return false;
+    }
+
+    AbstractInsnNode mutatedInstruction = method.instruction(m.getInstructionIndex());
+
+    Context<AbstractInsnNode> context = Context.start(method.instructions(), DEBUG);
+    context.store(MUTATED_INSTRUCTION.write(), mutatedInstruction);
+    context.store(HANDLERS.write(), handlers);
+    return IS_IN_HANDLER.matches(method.instructions(), context);
+  }
+
+  private boolean isPossibleToCorrectInlining(List<MutationDetails> mutationsInHandlerBlock) {
     if (mutationsInHandlerBlock.size() > 1) {
       LOG.warning("Found more than one mutation similar on same line in a finally block. Can't correct for inlining.");
       return false;
@@ -112,10 +195,9 @@ public class InlinedFinallyBlockFilter implements MutationInterceptor {
     return !mutationsInHandlerBlock.isEmpty();
   }
 
-  private static MutationDetails makeCombinedMutant(
-      final Collection<MutationDetails> value) {
-    final MutationDetails first = value.iterator().next();
-    final Set<Integer> indexes = new HashSet<>();
+  private static MutationDetails makeCombinedMutant(Collection<MutationDetails> value) {
+    MutationDetails first = value.iterator().next();
+    Set<Integer> indexes = new HashSet<>();
     mapTo(value, MutationDetails::getFirstIndex, indexes);
 
     final MutationIdentifier id = new MutationIdentifier(first.getId()
@@ -125,9 +207,9 @@ public class InlinedFinallyBlockFilter implements MutationInterceptor {
         first.getLineNumber(), first.getBlock());
   }
 
-
   private static Function<MutationDetails, LineMutatorPair> toLineMutatorPair() {
-    return a -> new LineMutatorPair(a.getLineNumber(), a.getMutator());
+    // bucket by combination of mutator and description
+    return a -> new LineMutatorPair(a.getLineNumber(), a.getMutator() + a.getDescription());
   }
 
 }
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/LineMutatorPair.java b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/LineMutatorPair.java
index 4e49dc41..aec2c75d 100644
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/LineMutatorPair.java
+++ b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/LineMutatorPair.java
@@ -2,12 +2,12 @@ package org.pitest.mutationtest.build.intercept.javafeatures;
 
 import java.util.Objects;
 
-public class LineMutatorPair {
+final class LineMutatorPair {
 
   private final int    lineNumber;
   private final String mutator;
 
-  public LineMutatorPair(final int lineNumber, final String mutator) {
+  LineMutatorPair(final int lineNumber, final String mutator) {
     this.lineNumber = lineNumber;
     this.mutator = mutator;
   }
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/RecordFilter.java b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/RecordFilter.java
index b93c2456..4992cc01 100644
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/RecordFilter.java
+++ b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/RecordFilter.java
@@ -47,7 +47,7 @@ public class RecordFilter implements MutationInterceptor {
         Set<String> accessorNames = currentClass.recordComponents().stream()
                 .map(this::toName)
                 .collect(Collectors.toSet());
-        return m -> !accessorNames.contains(m.getMethod().name()) && !isStandardMethod(accessorNames.size(), m);
+        return m -> !accessorNames.contains(m.getMethod()) && !isStandardMethod(accessorNames.size(), m);
     }
 
     private boolean isStandardMethod(int numberOfComponents, MutationDetails m) {
@@ -61,24 +61,24 @@ public class RecordFilter implements MutationInterceptor {
         // constructors with the same airty as the generated ones, but different
         // types won't get mutated. They're probably rare enough that this doesn't matter.
         int airty = Type.getArgumentTypes(m.getId().getLocation().getMethodDesc()).length;
-        return m.getMethod().name().equals("<init>") && airty == numberOfComponents;
+        return m.getMethod().equals("<init>") && airty == numberOfComponents;
     }
 
     private boolean isRecordEquals(MutationDetails m) {
         return m.getId().getLocation().getMethodDesc().equals("(Ljava/lang/Object;)Z")
-                && m.getMethod().name().equals("equals")
+                && m.getMethod().equals("equals")
                 && hasDynamicObjectMethodsCall(m);
     }
 
     private boolean isRecordHashCode(MutationDetails m) {
         return m.getId().getLocation().getMethodDesc().equals("()I")
-                && m.getMethod().name().equals("hashCode")
+                && m.getMethod().equals("hashCode")
                 && hasDynamicObjectMethodsCall(m);
     }
 
     private boolean isRecordToString(MutationDetails m) {
         return m.getId().getLocation().getMethodDesc().equals("()Ljava/lang/String;")
-                && m.getMethod().name().equals("toString")
+                && m.getMethod().equals("toString")
                 && hasDynamicObjectMethodsCall(m);
     }
 
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerFilter.java b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerFilter.java
deleted file mode 100644
index 3ca87403..00000000
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerFilter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.pitest.mutationtest.build.intercept.staticinitializers;
-
-import java.util.Collection;
-
-import org.pitest.bytecode.analysis.ClassTree;
-import org.pitest.functional.FCollection;
-import org.pitest.functional.prelude.Prelude;
-import org.pitest.mutationtest.build.InterceptorType;
-import org.pitest.mutationtest.build.MutationInterceptor;
-import org.pitest.mutationtest.engine.Mutater;
-import org.pitest.mutationtest.engine.MutationDetails;
-
-class StaticInitializerFilter implements MutationInterceptor {
-
-  @Override
-  public void begin(ClassTree clazz) {
-    // noop
-  }
-
-  @Override
-  public Collection<MutationDetails> intercept(
-      Collection<MutationDetails> mutations, Mutater m) {
-    return FCollection.filter(mutations, Prelude.not(MutationDetails::isInStaticInitializer));
-  }
-
-  @Override
-  public void end() {
-    // noop
-  }
-
-  @Override
-  public InterceptorType type() {
-    return InterceptorType.FILTER;
-  }
-
-}
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerFilterFactory.java b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerFilterFactory.java
deleted file mode 100644
index a8886f91..00000000
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerFilterFactory.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.pitest.mutationtest.build.intercept.staticinitializers;
-
-import org.pitest.mutationtest.build.InterceptorParameters;
-import org.pitest.mutationtest.build.MutationInterceptor;
-import org.pitest.mutationtest.build.MutationInterceptorFactory;
-import org.pitest.plugin.Feature;
-
-public class StaticInitializerFilterFactory implements MutationInterceptorFactory {
-
-  @Override
-  public String description() {
-    return "Static initializer filter plugin";
-  }
-
-  @Override
-  public MutationInterceptor createInterceptor(InterceptorParameters params) {
-    return new StaticInitializerFilter();
-  }
-
-  @Override
-  public Feature provides() {
-    return Feature.named("FSTATINIT")
-        .withOnByDefault(true)
-        .withDescription("Filters mutations in static initializers and code called only from them");
-  }
-
-}
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerInterceptor.java b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerInterceptor.java
index f14632b5..199ed234 100644
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerInterceptor.java
+++ b/pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerInterceptor.java
@@ -15,14 +15,11 @@ import org.pitest.bytecode.analysis.AnalysisFunctions;
 import org.pitest.bytecode.analysis.ClassTree;
 import org.pitest.bytecode.analysis.MethodTree;
 import org.pitest.classinfo.ClassName;
-import org.pitest.functional.FCollection;
 import org.pitest.functional.prelude.Prelude;
 import org.pitest.mutationtest.build.InterceptorType;
 import org.pitest.mutationtest.build.MutationInterceptor;
-import org.pitest.mutationtest.engine.MethodName;
 import org.pitest.mutationtest.engine.Mutater;
 import org.pitest.mutationtest.engine.MutationDetails;
-import org.pitest.mutationtest.engine.PoisonStatus;
 
 /**
  * Identifies and marks mutations in code that is active during class
@@ -40,8 +37,6 @@ import org.pitest.mutationtest.engine.PoisonStatus;
  */
 class StaticInitializerInterceptor implements MutationInterceptor {
 
-  private static final MethodName CLINIT = MethodName.fromString("<clinit>");
-
   private Predicate<MutationDetails> isStaticInitCode;
 
   @Override
@@ -53,17 +48,9 @@ class StaticInitializerInterceptor implements MutationInterceptor {
   public Collection<MutationDetails> intercept(
       Collection<MutationDetails> mutations, Mutater m) {
     if (this.isStaticInitCode != null) {
-      final List<MutationDetails> altered =
-          mutations.stream()
-          .filter(this.isStaticInitCode)
-          .map(setStaticInitializerFlag())
-          .collect(Collectors.toList());
-
-      final List<MutationDetails> notAltered =
-          FCollection.filter(mutations, Prelude.not(this.isStaticInitCode));
-
-      notAltered.addAll(altered);
-      return notAltered;
+      return mutations.stream()
+              .filter(this.isStaticInitCode.negate())
+              .collect(Collectors.toList());
     }
     return mutations;
   }
@@ -74,7 +61,7 @@ class StaticInitializerInterceptor implements MutationInterceptor {
   }
 
   private void analyseClass(ClassTree tree) {
-    final Optional<MethodTree> clinit = tree.methods().stream().filter(nameEquals(CLINIT.name())).findFirst();
+    final Optional<MethodTree> clinit = tree.methods().stream().filter(nameEquals("<clinit>")).findFirst();
 
     if (clinit.isPresent()) {
       final List<Predicate<MethodTree>> selfCalls =
@@ -99,7 +86,7 @@ class StaticInitializerInterceptor implements MutationInterceptor {
 
 
   private static Predicate<MutationDetails> isInStaticInitializer() {
-    return a -> a.getId().getLocation().getMethodName().equals(CLINIT);
+    return a -> a.getId().getLocation().getMethodName().equals("<clinit>");
   }
 
   private static Predicate<MethodTree> isPrivateStatic() {
@@ -129,14 +116,9 @@ class StaticInitializerInterceptor implements MutationInterceptor {
     return a -> a.rawNode().name.equals(name);
   }
 
-
-  private Function<MutationDetails, MutationDetails> setStaticInitializerFlag() {
-    return a -> a.withPoisonStatus(PoisonStatus.IS_STATIC_INITIALIZER_CODE);
-  }
-
   @Override
   public InterceptorType type() {
-    return InterceptorType.MODIFY;
+    return InterceptorType.FILTER;
   }
 
 }
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/report/xml/XMLReportListener.java b/pitest-entry/src/main/java/org/pitest/mutationtest/report/xml/XMLReportListener.java
index dba0e4b0..bad5af71 100644
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/report/xml/XMLReportListener.java
+++ b/pitest-entry/src/main/java/org/pitest/mutationtest/report/xml/XMLReportListener.java
@@ -82,7 +82,7 @@ public class XMLReportListener implements MutationResultListener {
     final MutationDetails details = mutation.getDetails();
     return makeNode(clean(details.getFilename()), sourceFile)
         + makeNode(clean(details.getClassName().asJavaName()), mutatedClass)
-        + makeNode(clean(details.getMethod().name()), mutatedMethod)
+        + makeNode(clean(details.getMethod()), mutatedMethod)
         + makeNode(clean(details.getId().getLocation().getMethodDesc()),
             methodDescription)
         + makeNode("" + details.getLineNumber(), lineNumber)
diff --git a/pitest-entry/src/main/resources/META-INF/services/org.pitest.mutationtest.build.MutationInterceptorFactory b/pitest-entry/src/main/resources/META-INF/services/org.pitest.mutationtest.build.MutationInterceptorFactory
index 771a9906..6c9182e4 100755
--- a/pitest-entry/src/main/resources/META-INF/services/org.pitest.mutationtest.build.MutationInterceptorFactory
+++ b/pitest-entry/src/main/resources/META-INF/services/org.pitest.mutationtest.build.MutationInterceptorFactory
@@ -1,7 +1,6 @@
 # Interceptor factories. If you add an entry here you probably should have a test case in MutationDiscoveryTest
 
 org.pitest.mutationtest.build.intercept.staticinitializers.StaticInitializerInterceptorFactory
-org.pitest.mutationtest.build.intercept.staticinitializers.StaticInitializerFilterFactory
 org.pitest.mutationtest.build.intercept.annotations.ExcludedAnnotationInterceptorFactory
 org.pitest.mutationtest.build.intercept.javafeatures.TryWithResourcesFilterFactory
 org.pitest.mutationtest.build.intercept.javafeatures.InlinedFinallyBlockFilterFactory
diff --git a/pitest-entry/src/test/java/org/pitest/coverage/CoverageDataTest.java b/pitest-entry/src/test/java/org/pitest/coverage/CoverageDataTest.java
index 9d83e583..26cd0501 100644
--- a/pitest-entry/src/test/java/org/pitest/coverage/CoverageDataTest.java
+++ b/pitest-entry/src/test/java/org/pitest/coverage/CoverageDataTest.java
@@ -28,7 +28,6 @@ import org.pitest.coverage.CoverageMother.BlockLocationBuilder;
 import org.pitest.coverage.CoverageMother.CoverageResultBuilder;
 import org.pitest.functional.FCollection;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 import org.pitest.testapi.Description;
 
 import java.util.Arrays;
@@ -291,7 +290,7 @@ public class CoverageDataTest {
   private Collection<BlockLocation> makeCoverage(final String clazz,
       final int block) {
     final BlockLocation cs = new BlockLocation(Location.location(
-        ClassName.fromString(clazz), MethodName.fromString("foo"), "V"), block, -1, -1);
+        ClassName.fromString(clazz), "foo", "V"), block, -1, -1);
 
     return Collections.singleton(cs);
   }
diff --git a/pitest-entry/src/test/java/org/pitest/coverage/execute/CoverageProcessSystemTest.java b/pitest-entry/src/test/java/org/pitest/coverage/execute/CoverageProcessSystemTest.java
index bc73c72c..ab40dfa0 100644
--- a/pitest-entry/src/test/java/org/pitest/coverage/execute/CoverageProcessSystemTest.java
+++ b/pitest-entry/src/test/java/org/pitest/coverage/execute/CoverageProcessSystemTest.java
@@ -25,7 +25,6 @@ import org.pitest.coverage.CoverageResult;
 import org.pitest.functional.FCollection;
 import org.pitest.mutationtest.config.TestPluginArguments;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 import org.pitest.mutationtest.execute.DefaultPITClassloader;
 import org.pitest.mutationtest.tooling.JarCreatingJarFinder;
 import org.pitest.process.LaunchOptions;
@@ -56,8 +55,6 @@ import static org.junit.Assert.assertTrue;
 @Category(SystemTest.class)
 public class CoverageProcessSystemTest {
 
-  private final MethodName foo = MethodName.fromString("foo");
-
   @Test
   public void shouldRecordSomeCoverage() throws Exception {
     final List<CoverageResult> coverage = runCoverageForTest(TestsForMultiBlockCoverage.class);
@@ -203,11 +200,11 @@ public class CoverageProcessSystemTest {
         .fromClass(ThrowsExceptionTestee.class);
 
     assertThat(coveredClasses).anyMatch(coverageFor(BlockLocation.blockLocation(
-        Location.location(throwsException, this.foo, "()V"), 0)));
+        Location.location(throwsException, "foo", "()V"), 0)));
 
         assertThat(coveredClasses).anyMatch(coverageFor(BlockLocation.blockLocation(
         Location.location(throwsException,
-            MethodName.fromString("throwsException"), "()V"), 0)));
+            "throwsException", "()V"), 0)));
 
   }
 
@@ -220,10 +217,10 @@ public class CoverageProcessSystemTest {
         .fromClass(ThrowsExceptionInFinallyBlockTestee.class);
 
     assertThat(coveredClasses).anyMatch(coverageFor(BlockLocation.blockLocation(
-        Location.location(clazz, this.foo, "()V"), 0)));
+        Location.location(clazz, "foo", "()V"), 0)));
 
         assertThat(coveredClasses).anyMatch(coverageFor(BlockLocation.blockLocation(
-        Location.location(clazz, this.foo, "()V"), 4)));
+        Location.location(clazz, "foo", "()V"), 4)));
   }
 
   @Test
@@ -235,7 +232,7 @@ public class CoverageProcessSystemTest {
         .fromClass(ThrowsExceptionFromLargeMethodTestee.class);
 
     assertThat(coveredClasses).anyMatch(coverageFor(BlockLocation.blockLocation(
-        Location.location(clazz, this.foo, "()I"), 0)));
+        Location.location(clazz, "foo", "()I"), 0)));
 
   }
 
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/MutationMetaDataTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/MutationMetaDataTest.java
index 4025b963..a459bb5a 100644
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/MutationMetaDataTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/MutationMetaDataTest.java
@@ -4,7 +4,6 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 import org.junit.Test;
 import org.pitest.classinfo.ClassName;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 import org.pitest.mutationtest.engine.MutationDetails;
 
 import java.util.Arrays;
@@ -56,7 +55,7 @@ public class MutationMetaDataTest {
 
   private MutationResult makeResult(String clazz, String method) {
     final Location location = Location.location(ClassName.fromString(clazz),
-        MethodName.fromString(method), "()V");
+        method, "()V");
     final MutationDetails md = aMutationDetail().withId(
         aMutationId().withLocation(location)).build();
     return new MutationResult(md,
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/build/DefaultTestPrioritiserTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/build/DefaultTestPrioritiserTest.java
index 3b30e097..0af5a2fd 100644
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/build/DefaultTestPrioritiserTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/build/DefaultTestPrioritiserTest.java
@@ -23,7 +23,6 @@ import org.pitest.functional.FCollection;
 import java.util.Optional;
 import org.pitest.mutationtest.engine.MutationDetails;
 import org.pitest.mutationtest.engine.MutationIdentifier;
-import org.pitest.mutationtest.engine.PoisonStatus;
 
 public class DefaultTestPrioritiserTest {
 
@@ -52,16 +51,6 @@ public class DefaultTestPrioritiserTest {
     assertEquals(expected, actual);
   }
 
-  @Test
-  public void shouldAssignAllTestsForClassWhenMutationInStaticInitialiser() {
-    final List<TestInfo> expected = makeTestInfos(0);
-    when(this.coverage.getTestsForClass(this.foo)).thenReturn(expected);
-    final List<TestInfo> actual = this.testee
-        .assignTests(makeMutation("<clinit>")
-            .withPoisonStatus(PoisonStatus.IS_STATIC_INITIALIZER_CODE));
-    assertEquals(expected, actual);
-  }
-
   @Test
   public void shouldPrioritiseTestsByExecutionTime() {
     final List<TestInfo> unorderedTests = makeTestInfos(10000, 100, 1000, 1);
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/annotations/ExcludedAnnotationInterceptorTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/annotations/ExcludedAnnotationInterceptorTest.java
index 3fb29c27..3b23ec92 100644
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/annotations/ExcludedAnnotationInterceptorTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/annotations/ExcludedAnnotationInterceptorTest.java
@@ -64,7 +64,7 @@ public class ExcludedAnnotationInterceptorTest {
     final List<MutationDetails> mutations = this.mutator.findMutations(ClassName.fromClass(MethodAnnotatedWithGenerated.class));
     final Collection<MutationDetails> actual = runWithTestee(mutations, MethodAnnotatedWithGenerated.class);
     assertThat(actual).hasSize(1);
-    assertThat(actual.iterator().next().getId().getLocation().getMethodName().name()).isEqualTo("bar");
+    assertThat(actual.iterator().next().getId().getLocation().getMethodName()).isEqualTo("bar");
   }
 
   private Collection<MutationDetails> runWithTestee(
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/EnumConstructorTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/EnumConstructorTest.java
index dd85e8a8..2cc075cc 100755
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/EnumConstructorTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/EnumConstructorTest.java
@@ -28,7 +28,7 @@ public class EnumConstructorTest {
     }
 
     private Predicate<MutationDetails> inMethodNamed(String name) {
-        return m -> m.getMethod().name().equals(name);
+        return m -> m.getMethod().equals(name);
     }
 }
 
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/FilterTester.java b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/FilterTester.java
index 05b305a9..b6c6878c 100755
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/FilterTester.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/FilterTester.java
@@ -38,15 +38,25 @@ public class FilterTester {
   private final ClassByteArraySource source = new ResourceFolderByteArraySource();
   private final MutationInterceptor testee;
   private final Collection<MethodMutatorFactory> mutators;
+  private final Collection<String> compilers;
 
-  public FilterTester(String path, MutationInterceptor testee, MethodMutatorFactory ... mutators) {
-    this(path, testee, Arrays.asList(mutators));
+  public FilterTester(String path, MutationInterceptor testee, Collection<String> compilers, MethodMutatorFactory ... mutators) {
+    this(path, testee, compilers, Arrays.asList(mutators));
   }
 
   public FilterTester(String path, MutationInterceptor testee, Collection<MethodMutatorFactory> mutators) {
+    this(path, testee, COMPILERS, mutators);
+  }
+
+  public FilterTester(String path, MutationInterceptor testee, MethodMutatorFactory ... mutators) {
+    this(path, testee, COMPILERS, Arrays.asList(mutators));
+  }
+
+  public FilterTester(String path, MutationInterceptor testee, Collection<String> compilers, Collection<MethodMutatorFactory> mutators) {
     this.mutators = mutators;
     this.testee = testee;
     this.path = path;
+    this.compilers = compilers;
   }
 
 
@@ -81,6 +91,15 @@ public class FilterTester {
     };
   }
 
+  public void assertCombinedMutantExists(Predicate<MutationDetails> match, Class<?> clazz) {
+    Sample s = makeSampleForCurrentCompiler(clazz);
+    GregorMutater mutator = mutateFromClassLoader();
+    List<MutationDetails> mutations = mutator.findMutations(s.className);
+    Collection<MutationDetails> actual = filter(s.clazz, mutations, mutator);
+
+    assertThat(actual).anyMatch(match.and( m -> m.getId().getIndexes().size() > 1));
+  }
+
   public void assertLeavesNMutants(int n, String sample) {
     final GregorMutater mutator = mutateFromResourceDir();
     atLeastOneSampleExists(sample);
@@ -123,6 +142,7 @@ public class FilterTester {
     softly.assertAll();
   }
 
+
   public void assertFiltersNoMutationsMatching(Predicate<MutationDetails> match, Class<?> clazz) {
     final Sample s = makeSampleForCurrentCompiler(clazz);
 
@@ -298,11 +318,11 @@ public class FilterTester {
       return Stream.empty();
 
     };
-    return COMPILERS.stream().flatMap(toPair).collect(Collectors.toList());
+    return compilers.stream().flatMap(toPair).collect(Collectors.toList());
   }
 
   private boolean atLeastOneSampleExists(String sample) {
-    for (final String compiler : COMPILERS) {
+    for (final String compiler : compilers) {
       final String clazz = makeClassName(sample, compiler);
       if (this.source.getBytes(clazz).isPresent()) {
         return true;
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/InlinedFinallyBlockFilterTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/InlinedFinallyBlockFilterTest.java
index bc1ccfda..cad02414 100644
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/InlinedFinallyBlockFilterTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/InlinedFinallyBlockFilterTest.java
@@ -1,105 +1,111 @@
 package org.pitest.mutationtest.build.intercept.javafeatures;
 
-import static org.junit.Assert.assertEquals;
-import static org.pitest.mutationtest.LocationMother.aLocation;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 import org.junit.Test;
 import org.pitest.mutationtest.build.InterceptorType;
-import org.pitest.mutationtest.engine.Mutater;
 import org.pitest.mutationtest.engine.MutationDetails;
-import org.pitest.mutationtest.engine.MutationIdentifier;
-import org.pitest.mutationtest.engine.PoisonStatus;
+import org.pitest.mutationtest.engine.gregor.MethodMutatorFactory;
+
+import java.util.function.Predicate;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+import static org.pitest.mutationtest.engine.gregor.mutators.IncrementsMutator.INCREMENTS_MUTATOR;
+import static org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator.VOID_METHOD_CALL_MUTATOR;
 
 public class InlinedFinallyBlockFilterTest {
 
-  InlinedFinallyBlockFilter testee = new InlinedFinallyBlockFilter();
-  Mutater unused;
-
-  @Test
-  public void shouldDeclareTypeAsFilter() {
-    assertEquals(InterceptorType.FILTER, this.testee.type());
-  }
-
-  @Test
-  public void shouldNotCombineMutantsWhenOnSameLineAndDifferentBlocksButFromDifferentMutators() {
-    final int line = 100;
-    final int block = 1;
-    final List<MutationDetails> mutations = Arrays.asList(
-        makeMutant(line, block, "Foo", 0),
-        makeMutant(line, block + 1, "NotFoo", 1));
-    assertEquals(mutations, this.testee.intercept(mutations, this.unused));
-  }
-
-  @Test
-  public void shouldNotCombineMutantsWhenOnSameLineAndBlock() {
-    final int line = 100;
-    final int block = 1;
-    final String mutator = "foo";
-    final List<MutationDetails> mutations = Arrays.asList(
-        makeMutant(line, block, mutator, 0),
-        makeMutant(line, block, mutator, 1));
-    assertEquals(mutations, this.testee.intercept(mutations, this.unused));
-  }
-
-  @Test
-  public void shouldCreateSingleMutantWhenSameMutationCreatedOnSameLineInDifferentBlocksAndOneIsInAHandlerBlock() {
-    final int line = 100;
-    final String mutator = "foo";
-    final int block = 1000;
-    final List<MutationDetails> mutations = Arrays.asList(
-        makeMutantInHandlerBlock(line, block, mutator, 0),
-        makeMutant(line, block + 1, mutator, 1));
-    assertEquals(
-        Arrays.asList(makeMutantInHandlerBlock(line, block, mutator,
-            Arrays.asList(0, 1))), this.testee.intercept(mutations, this.unused));
-  }
-
-  @Test
-  public void shouldNotCombineMutationsWhenMoreThanOneInAHandlerBlock() {
-    final int line = 100;
-    final String mutator = "foo";
-    final int block = 1000;
-    final List<MutationDetails> mutations = Arrays.asList(
-        makeMutantInHandlerBlock(line, block, mutator, 0),
-        makeMutantInHandlerBlock(line, block, mutator, 2),
-        makeMutant(line, block + 1, mutator, 1));
-    final Collection<MutationDetails> actual = this.testee.intercept(mutations, this.unused);
-    assertEquals(mutations, actual);
-  }
-
-  private MutationDetails makeMutantInHandlerBlock(final int line,
-      final int block, final String mutator, final int index) {
-    return new MutationDetails(makeId(Collections.singleton(index), mutator),
-        "file", "desc", line, block, true, PoisonStatus.NORMAL);
-  }
-
-  private MutationDetails makeMutantInHandlerBlock(final int line,
-      final int block, final String mutator, final Collection<Integer> indexes) {
-    return new MutationDetails(makeId(new HashSet<>(indexes), mutator),
-        "file", "desc", line, block, true, PoisonStatus.NORMAL);
-  }
-
-  private MutationDetails makeMutant(final int line, final int block,
-      final String mutator, final Collection<Integer> indexes) {
-    return new MutationDetails(makeId(new HashSet<>(indexes), mutator),
-        "file", "desc", line, block);
-  }
-
-  private MutationDetails makeMutant(final int line, final int block,
-      final String mutator, final int index) {
-    return makeMutant(line, block, mutator, Arrays.asList(index));
-  }
-
-  private MutationIdentifier makeId(final Set<Integer> indexes,
-      final String mutator) {
-    return new MutationIdentifier(aLocation().build(), indexes, mutator);
-  }
+    InlinedFinallyBlockFilter testee = new InlinedFinallyBlockFilter();
+
+    FilterTester verifier = new FilterTester("trywithresources/{0}_{1}", this.testee,
+            // omit aspectJ. Filter doesn't work correctly with it, but slack is picked up by the
+            // try with resources filter
+            asList("javac", "javac11", "ecj"),
+            VOID_METHOD_CALL_MUTATOR, INCREMENTS_MUTATOR);
+
+    @Test
+    public void shouldDeclareTypeAsFilter() {
+        assertEquals(InterceptorType.FILTER, this.testee.type());
+    }
+
+    @Test
+    public void doesNotFilterWhenNoFinallyBlock() {
+        verifier.assertFiltersNMutationFromClass(0, TryCatchNoFinally.class);
+    }
+
+    @Test
+    public void combinesMutationsInSimpleFinallyBlocks() {
+        verifier.assertFiltersNMutationFromClass(1, HasFinallyBlock.class);
+        verifier.assertCombinedMutantExists(forMutator(INCREMENTS_MUTATOR), HasFinallyBlock.class);
+    }
+
+    @Test
+    public void combinesMutationsInFinallyBlocksWithExceptionHandlers() {
+        verifier.assertFiltersNMutationFromClass(2, HasFinallyBlockAndExceptionHandler.class);
+        verifier.assertCombinedMutantExists(forMutator(INCREMENTS_MUTATOR), HasFinallyBlockAndExceptionHandler.class);
+    }
+
+    @Test
+    public void combinesSimilarMutationsInFinallyBlocksWhenOnDifferentLines() {
+        verifier.assertFiltersNMutationFromClass(2, HasSimilarMutationsFinallyBlock.class);
+        verifier.assertCombinedMutantExists(forMutator(INCREMENTS_MUTATOR), HasSimilarMutationsFinallyBlock.class);
+    }
+
+    @Test
+    public void filtersMutantsInTryCatchFinallySamples() {
+        verifier.assertFiltersNMutationFromSample(3, "TryCatchFinallyExample");
+    }
+
+    @Test
+    public void filtersMutantsInTryFinallySamples() {
+        verifier.assertFiltersNMutationFromSample(2, "TryFinallyExample");
+    }
+
+    private Predicate<MutationDetails> forMutator(MethodMutatorFactory mutator) {
+        return m -> m.getMutator().equals(mutator.getGloballyUniqueId());
+    }
+
+
+}
+
+class TryCatchNoFinally {
+    public void foo(int i) {
+        try {
+            System.out.println("foo");
+        } catch(Exception ex) {
+            i++;
+        }
+    }
+}
+
+class HasFinallyBlock {
+    public void foo(int i) {
+        try {
+            System.out.println("foo");
+        } finally {
+            i++;
+        }
+    }
+}
+
+class HasSimilarMutationsFinallyBlock {
+    public void foo(int i) {
+        try {
+            System.out.println("foo");
+        } finally {
+            i++;
+            i++;
+        }
+    }
+}
 
+class HasFinallyBlockAndExceptionHandler {
+    public void foo(int i) {
+        try {
+            System.out.println("foo");
+        } catch (final Exception x) {
+            System.out.println("bar");
+        } finally {
+            i++;
+        }
+    }
 }
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/RecordFilterTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/RecordFilterTest.java
index 643ba2d8..900695c5 100644
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/RecordFilterTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/RecordFilterTest.java
@@ -69,7 +69,7 @@ public class RecordFilterTest {
     }
 
     private Predicate<MutationDetails> inMethodCalled(String name) {
-        return m -> m.getMethod().name().equals(name);
+        return m -> m.getMethod().equals(name);
     }
 
 }
\ No newline at end of file
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/logging/LoggingCallsFilterTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/logging/LoggingCallsFilterTest.java
index f6f3e6f7..2ff83fa3 100644
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/logging/LoggingCallsFilterTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/logging/LoggingCallsFilterTest.java
@@ -66,7 +66,7 @@ public class LoggingCallsFilterTest {
   return new  Condition< MutationDetails>("mutants in the methed " + name) {
     @Override
     public boolean matches(MutationDetails value) {
-        return value.getId().getLocation().getMethodName().name().equals(name);
+        return value.getId().getLocation().getMethodName().equals(name);
     }
   };
   }
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerFilterTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerFilterTest.java
deleted file mode 100644
index 0984c075..00000000
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerFilterTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.pitest.mutationtest.build.intercept.staticinitializers;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.pitest.mutationtest.engine.MutationDetailsMother.aMutationDetail;
-
-import java.util.Collection;
-
-import org.junit.Test;
-import org.pitest.mutationtest.engine.MutationDetails;
-import org.pitest.mutationtest.engine.PoisonStatus;
-
-public class StaticInitializerFilterTest {
-
-  StaticInitializerFilter testee  = new StaticInitializerFilter();
-
-  @Test
-  public void shouldRemoveMutationsInStaticInitCode() {
-    final Collection<MutationDetails> marked = aMutationDetail()
-        .withPoison(PoisonStatus.IS_STATIC_INITIALIZER_CODE)
-        .build(2);
-
-    assertThat(this.testee.intercept(marked, null)).isEmpty();
-  }
-
-  @Test
-  public void shouldNotFilterNotStaticMutants() {
-    final Collection<MutationDetails> unmarked = aMutationDetail()
-        .build(2);
-    assertThat(this.testee.intercept(unmarked, null)).containsAll(unmarked);
-  }
-
-}
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerInterceptorTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerInterceptorTest.java
index 4f6d7f10..2a9cb3ea 100644
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerInterceptorTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerInterceptorTest.java
@@ -1,118 +1,57 @@
 package org.pitest.mutationtest.build.intercept.staticinitializers;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.fail;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.junit.Before;
 import org.junit.Test;
-import org.pitest.bytecode.analysis.ClassTree;
-import org.pitest.classinfo.ClassName;
-import org.pitest.classpath.ClassloaderByteArraySource;
+import org.pitest.mutationtest.build.intercept.javafeatures.FilterTester;
 import org.pitest.mutationtest.engine.MutationDetails;
-import org.pitest.mutationtest.engine.gregor.GregorMutater;
-import org.pitest.mutationtest.engine.gregor.MethodMutatorFactory;
-import org.pitest.mutationtest.engine.gregor.mutators.VoidMethodCallMutator;
+import org.pitest.mutationtest.engine.gregor.mutators.NullMutateEverything;
 
-public class StaticInitializerInterceptorTest {
+import java.util.function.Predicate;
 
-  StaticInitializerInterceptor testee;
-  GregorMutater mutator;
 
-  @Before
-  public void setup() {
-    final ClassloaderByteArraySource source = ClassloaderByteArraySource.fromContext();
-    final Collection<MethodMutatorFactory> mutators = Collections.singleton((MethodMutatorFactory)VoidMethodCallMutator.VOID_METHOD_CALL_MUTATOR);
-    this.mutator = new GregorMutater(source, m -> true, mutators);
-    this.testee = new StaticInitializerInterceptor();
-  }
+public class StaticInitializerInterceptorTest {
 
-  @Test
-  public void shouldNotMarkAnyMutationsInClassWithoutStaticInitializer() {
-    final Class<?> clazz = NoStaticInializer.class;
-    final List<MutationDetails> mutations = findMutationsFor(clazz);
+  StaticInitializerInterceptor testee = new StaticInitializerInterceptor();
+
+  FilterTester verifier = new FilterTester("", this.testee, NullMutateEverything.asList());
 
-    this.testee.begin(treeFor(clazz));
-    final Collection<MutationDetails> actual = this.testee.intercept(mutations, this.mutator);
-    this.testee.end();
 
-    assertThat(actual).isSameAs(mutations);
+  @Test
+  public void shouldNotFilterMutationsInClassWithoutStaticInitializer() {
+    verifier.assertFiltersNMutationFromClass(0, NoStaticInializer.class);
   }
 
   @Test
-  public void shouldMarkMutationsInStaticInitializer() {
-    final Collection<MutationDetails> actual = processWithTestee(HasStaticInializer.class);
-    assertAllMarkedAsInStaticInitializers(actual);
+  public void shouldFilterMutationsInStaticInitializer() {
+    verifier.assertFiltersMutationsMatching(inMethodNamed("<clinit>"), HasStaticInializer.class);
   }
 
   @Test
   public void shouldMarkMutationsInPrivateMethodsCalledFromStaticInitializer() {
-    final Collection<MutationDetails> actual = processWithTestee(HasPrivateCallsFromStaticInializer.class);
-    assertAllMarkedAsInStaticInitializers(actual);
+    verifier.assertFiltersMutationsMatching(inMethodNamed("a"), HasPrivateCallsFromStaticInializer.class);
   }
 
   @Test
   public void shouldNotMarkMutationsInPackageDefaultMethodsCalledFromStaticInitializer() {
-    final Collection<MutationDetails> actual = processWithTestee(HasDefaultCallsFromStaticInializer.class);
-    assertOnlyClinitMethodsMarked(actual);
+    verifier.assertFiltersNoMutationsMatching(inMethodNamed("a"), HasDefaultCallsFromStaticInializer.class);
   }
 
 
   @Test
   public void shouldNotMarkMutationsInPrivateStaticMethodsNotInvolvedInInit() {
-    final Collection<MutationDetails> actual = processWithTestee(HasOtherPrivateStaticMethods.class);
-    assertOnlyClinitMethodsMarked(actual);
+    verifier.assertFiltersNoMutationsMatching(inMethodNamed("b"), HasOtherPrivateStaticMethods.class);
   }
 
   @Test
   public void shouldNotMarkMutationsInOverriddenMethodsNotInvolvedInStaticInit() {
-    final Collection<MutationDetails> actual = processWithTestee(HasOverloadedMethodsThatAreNotUsedInStaticInitialization.class);
-    assertOnlyClinitMethodsMarked(actual);
-  }
-
-  Collection<MutationDetails> processWithTestee(Class<?> clazz) {
-    this.testee.begin(treeFor(clazz));
-    final Collection<MutationDetails> actual = this.testee.intercept(findMutationsFor(clazz), this.mutator);
-    this.testee.end();
-    return actual;
+    verifier.assertFiltersNoMutationsMatching(inMethod("a", "(I)V"), HasOverloadedMethodsThatAreNotUsedInStaticInitialization.class);
   }
 
-  private List<MutationDetails> findMutationsFor(Class<?> clazz) {
-    final List<MutationDetails> mutations = this.mutator.findMutations(ClassName.fromClass(clazz));
-    assertThat(mutations).isNotEmpty();
-    return mutations;
+  private Predicate<MutationDetails> inMethodNamed(String name) {
+    return m -> m.getMethod().equals(name);
   }
 
-
-  private ClassTree treeFor(Class<?> clazz) {
-    final ClassloaderByteArraySource source = ClassloaderByteArraySource.fromContext();
-    return ClassTree.fromBytes(source.getBytes(clazz.getName()).get());
-  }
-
-
-
-  private void assertAllMarkedAsInStaticInitializers(
-      Collection<MutationDetails> actual) {
-    for (final MutationDetails each : actual ) {
-      if (!each.isInStaticInitializer()) {
-        fail("Expected all mutants to be marked as for static initialization but " + each + " was not");
-      }
-    }
-
-  }
-
-  private void assertOnlyClinitMethodsMarked(Collection<MutationDetails> actual) {
-    for (final MutationDetails each : actual ) {
-      if (each.isInStaticInitializer()) {
-        if (!each.getId().getLocation().getMethodName().name().equals("<clinit>")) {
-          fail("Expected no mutants to be marked as for static initialization but " + each + " was");
-        }
-      }
-    }
-
+  private Predicate<MutationDetails> inMethod(String name, String desc) {
+    return m -> m.getMethod().equals(name) && m.getId().getLocation().getMethodDesc().equals(desc);
   }
 
 }
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/timeout/InfiniteForLoopFilterFactoryTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/timeout/InfiniteForLoopFilterFactoryTest.java
index 181bafec..67eb6b91 100644
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/timeout/InfiniteForLoopFilterFactoryTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/timeout/InfiniteForLoopFilterFactoryTest.java
@@ -12,7 +12,6 @@ import org.pitest.classinfo.ClassByteArraySource;
 import org.pitest.classinfo.ClassName;
 import org.pitest.classpath.ClassloaderByteArraySource;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 import org.pitest.mutationtest.engine.MutationDetails;
 import org.pitest.mutationtest.engine.gregor.GregorMutater;
 import org.pitest.mutationtest.engine.gregor.mutators.experimental.RemoveIncrementsMutator;
@@ -146,7 +145,7 @@ public class InfiniteForLoopFilterFactoryTest extends InfiniteLoopBaseTest {
   @Test
   public void shouldMatchRealInfiniteLoopFromJodaTimeMutants() {      
     Location l1 = Location.location(ClassName.fromString("org.joda.time.field.BaseDateTimeField")
-        , MethodName.fromString("set")
+        , "set"
         , "(Lorg/joda/time/ReadablePartial;I[II)[I");
     checkFiltered(ClassName.fromString("BaseDateTimeFieldMutated"),forLocation(l1));
     
@@ -160,7 +159,7 @@ public class InfiniteForLoopFilterFactoryTest extends InfiniteLoopBaseTest {
     checkFiltered(ClassName.fromString("BaseChronologyMutated2"),"set");
     
     Location l = Location.location(ClassName.fromString("org.joda.time.MonthDay")
-        , MethodName.fromString("withPeriodAdded")
+        , "withPeriodAdded"
         , "(Lorg/joda/time/ReadablePeriod;I)Lorg/joda/time/MonthDay;");
     checkFiltered(ClassName.fromString("MonthDayMutated2"),forLocation(l));
   }
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/config/SettingsFactoryTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/config/SettingsFactoryTest.java
index b6e959bc..303c071e 100644
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/config/SettingsFactoryTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/config/SettingsFactoryTest.java
@@ -109,11 +109,11 @@ public class SettingsFactoryTest {
     final Consumer<Feature> disabled = Mockito.mock(Consumer.class);
     final Consumer<Feature> enabled = Mockito.mock(Consumer.class);
 
-    this.options.setFeatures(Arrays.asList("+FSTATINIT"));
+    this.options.setFeatures(Arrays.asList("+FSTATI"));
 
     this.testee.describeFeatures(enabled, disabled);
-    verify(enabled).accept(Feature.named("FSTATINIT"));
-    verify(disabled, never()).accept(Feature.named("FSTATINIT"));
+    verify(enabled).accept(Feature.named("FSTATI"));
+    verify(disabled, never()).accept(Feature.named("FSTATI"));
   }
 
   @Test
@@ -121,11 +121,11 @@ public class SettingsFactoryTest {
     final Consumer<Feature> disabled = Mockito.mock(Consumer.class);
     final Consumer<Feature> enabled = Mockito.mock(Consumer.class);
 
-    this.options.setFeatures(Arrays.asList("-FSTATINIT"));
+    this.options.setFeatures(Arrays.asList("-FSTATI"));
 
     this.testee.describeFeatures(enabled, disabled);
-    verify(enabled, never()).accept(Feature.named("FSTATINIT"));
-    verify(disabled).accept(Feature.named("FSTATINIT"));
+    verify(enabled, never()).accept(Feature.named("FSTATI"));
+    verify(disabled).accept(Feature.named("FSTATI"));
   }
 
   @Test
diff --git a/pitest/src/main/java/org/pitest/classinfo/ClassName.java b/pitest/src/main/java/org/pitest/classinfo/ClassName.java
index a8ed15ae..3e3abc44 100644
--- a/pitest/src/main/java/org/pitest/classinfo/ClassName.java
+++ b/pitest/src/main/java/org/pitest/classinfo/ClassName.java
@@ -30,6 +30,12 @@ public final class ClassName implements Comparable<ClassName>, Serializable {
 
   private static final ClassName OBJECT = new ClassName("java/lang/Object");
   private static final ClassName STRING = new ClassName("java/lang/String");
+  private static final ClassName INTEGER = new ClassName("java/lang/Integer");
+  private static final ClassName LIST = new ClassName("java/util/List");
+  private static final ClassName ARRAY_LIST = new ClassName("java/util/ArrayList");
+  private static final ClassName STREAM = new ClassName("java/util/stream/Stream");
+  private static final ClassName FUNCTION = new ClassName("java/util/function/Function");
+  private static final ClassName PREDICATE = new ClassName("java/util/function/Predicate");
 
   // always stored in java/lang/String "internal" format
   private final String        name;
@@ -50,6 +56,24 @@ public final class ClassName implements Comparable<ClassName>, Serializable {
     if (name.equals(STRING.asInternalName())) {
       return STRING;
     }
+    if (name.equals(INTEGER.asInternalName())) {
+      return INTEGER;
+    }
+    if (name.equals(LIST.asInternalName())) {
+      return LIST;
+    }
+    if (name.equals(ARRAY_LIST.asInternalName())) {
+      return ARRAY_LIST;
+    }
+    if (name.equals(STREAM.asInternalName())) {
+      return STREAM;
+    }
+    if (name.equals(FUNCTION.asInternalName())) {
+      return FUNCTION;
+    }
+    if (name.equals(PREDICATE.asInternalName())) {
+      return PREDICATE;
+    }
     return new ClassName(name);
   }
 
diff --git a/pitest/src/main/java/org/pitest/coverage/analysis/LineMapper.java b/pitest/src/main/java/org/pitest/coverage/analysis/LineMapper.java
index 2efd7b39..ba802163 100644
--- a/pitest/src/main/java/org/pitest/coverage/analysis/LineMapper.java
+++ b/pitest/src/main/java/org/pitest/coverage/analysis/LineMapper.java
@@ -14,7 +14,6 @@ import org.pitest.coverage.BlockLocation;
 import org.pitest.coverage.LineMap;
 import java.util.Optional;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 
 public class LineMapper implements LineMap {
 
@@ -40,7 +39,7 @@ public class LineMapper implements LineMap {
       for (final Object m : classNode.methods) {
         final MethodNode mn = (MethodNode) m;
         final Location l = Location.location(clazz,
-            MethodName.fromString(mn.name), mn.desc);
+            mn.name, mn.desc);
         final List<Block> blocks = ControlFlowAnalyser.analyze(mn);
         for (int i = 0; i != blocks.size(); i++) {
           final Block each = blocks.get(i);
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/Location.java b/pitest/src/main/java/org/pitest/mutationtest/engine/Location.java
index 6fa3553f..f4cbc905 100644
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/Location.java
+++ b/pitest/src/main/java/org/pitest/mutationtest/engine/Location.java
@@ -28,10 +28,10 @@ public final class Location implements Comparable<Location>, Serializable  {
   private static final long serialVersionUID = 1L;
 
   private final ClassName  clazz;
-  private final MethodName method;
+  private final String     method;
   private final String     methodDesc;
 
-  public Location(final ClassName clazz, final MethodName method,
+  public Location(final ClassName clazz, final String method,
       final String methodDesc) {
     this.clazz = clazz;
     this.method = method;
@@ -39,7 +39,7 @@ public final class Location implements Comparable<Location>, Serializable  {
   }
 
   public static Location location(final ClassName clazz,
-      final MethodName method, final String methodDesc) {
+      final String method, final String methodDesc) {
     return new Location(clazz, method, methodDesc);
   }
 
@@ -47,7 +47,7 @@ public final class Location implements Comparable<Location>, Serializable  {
     return this.clazz;
   }
 
-  public MethodName getMethodName() {
+  public String getMethodName() {
     return this.method;
   }
 
@@ -81,7 +81,7 @@ public final class Location implements Comparable<Location>, Serializable  {
   }
 
   public String describe() {
-    return this.method.name();
+    return this.method;
   }
 
   @Override
@@ -91,7 +91,7 @@ public final class Location implements Comparable<Location>, Serializable  {
       return comp;
     }
 
-    comp = this.method.name().compareTo(o.getMethodName().name());
+    comp = this.method.compareTo(o.getMethodName());
     if (comp != 0) {
       return comp;
     }
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/MethodName.java b/pitest/src/main/java/org/pitest/mutationtest/engine/MethodName.java
deleted file mode 100644
index 6ae62341..00000000
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/MethodName.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.pitest.mutationtest.engine;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-public class MethodName implements Serializable {
-
-  private static final long serialVersionUID = 1L;
-
-  private final String name;
-
-  MethodName(final String name) {
-    this.name = name;
-  }
-
-  public static MethodName fromString(final String name) {
-    return new MethodName(name);
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(name);
-  }
-
-  @Override
-  public boolean equals(final Object obj) {
-    if (this == obj) {
-      return true;
-    }
-    if (obj == null || getClass() != obj.getClass()) {
-      return false;
-    }
-    final MethodName other = (MethodName) obj;
-    return Objects.equals(name, other.name);
-  }
-
-  @Override
-  public String toString() {
-    return this.name;
-  }
-
-  public final String name() {
-    return this.name;
-  }
-
-}
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/MutationDetails.java b/pitest/src/main/java/org/pitest/mutationtest/engine/MutationDetails.java
index 186767ae..b014d2c1 100644
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/MutationDetails.java
+++ b/pitest/src/main/java/org/pitest/mutationtest/engine/MutationDetails.java
@@ -38,40 +38,25 @@ public final class MutationDetails implements Serializable {
   private final int                 lineNumber;
   private final String              description;
   private final ArrayList<TestInfo> testsInOrder = new ArrayList<>();
-  private final boolean             isInFinallyBlock;
-  private final PoisonStatus        poison;
 
   public MutationDetails(final MutationIdentifier id, final String filename,
       final String description, final int lineNumber, final int block) {
-    this(id, filename, description, lineNumber, block, false, PoisonStatus.NORMAL);
-  }
-
-  public MutationDetails(final MutationIdentifier id, final String filename,
-      final String description, final int lineNumber, final int block,
-      final boolean isInFinallyBlock, final PoisonStatus poison) {
     this.id = id;
     this.description = Objects.requireNonNull(description);
-    this.filename = defaultFilenameIfNotSupplued(filename);
+    this.filename = defaultFilenameIfNotSupplied(filename);
     this.lineNumber = lineNumber;
     this.block = block;
-    this.isInFinallyBlock = isInFinallyBlock;
-    this.poison = poison;
   }
 
   @Override
   public String toString() {
     return "MutationDetails [id=" + this.id + ", filename=" + this.filename + ", block="
         + this.block + ", lineNumber=" + this.lineNumber + ", description=" + this.description
-        + ", testsInOrder=" + this.testsInOrder + ", isInFinallyBlock="
-        + this.isInFinallyBlock + ", poison=" + this.poison + "]";
+        + ", testsInOrder=" + this.testsInOrder + "]";
   }
 
   public MutationDetails withDescription(String desc) {
-    return new MutationDetails(this.id, this.filename, desc, this.lineNumber, this.block, this.isInFinallyBlock, this.poison);
-  }
-
-  public MutationDetails withPoisonStatus(PoisonStatus poisonStatus) {
-    return new MutationDetails(this.id, this.filename, this.description, this.lineNumber, this.block, this.isInFinallyBlock, poisonStatus);
+    return new MutationDetails(this.id, this.filename, desc, this.lineNumber, this.block);
   }
 
   /**
@@ -121,7 +106,7 @@ public final class MutationDetails implements Serializable {
    *
    * @return class in which mutation is located
    */
-  public MethodName getMethod() {
+  public String getMethod() {
     return this.id.getLocation().getMethodName();
   }
 
@@ -182,25 +167,6 @@ public final class MutationDetails implements Serializable {
     this.testsInOrder.trimToSize();
   }
 
-  /**
-   * Indicates if this mutation might poison state within the jvm (e.g affect
-   * the values of static variable)
-   *
-   * @return true if the mutation might poison the jvm otherwise false
-   */
-  public boolean mayPoisonJVM() {
-    return this.poison.mayPoison();
-  }
-
-  /**
-   * Indicates if this mutation is in a static initializer block
-   *
-   * @return true if in a static initializer otherwise false
-   */
-  public boolean isInStaticInitializer() {
-    return this.poison == PoisonStatus.IS_STATIC_INITIALIZER_CODE;
-  }
-
   /**
    * Returns the basic block in which this mutation occurs. See
    * https://github.com/hcoles/pitest/issues/131 for discussion on block
@@ -250,16 +216,8 @@ public final class MutationDetails implements Serializable {
     return getFirstIndex() - 1;
   }
 
-  /**
-   * Indicates if the mutation is within a finally block
-   *
-   * @return true if in finally block otherwise false
-   */
-  public boolean isInFinallyBlock() {
-    return this.isInFinallyBlock;
-  }
-  
-  private String defaultFilenameIfNotSupplued(String filename) {
+
+  private String defaultFilenameIfNotSupplied(String filename) {
     // the BuildVerifier should throw an error if classes are compiled 
     // without filename debug info, however classes may be generated
     // by annotation processors. These can be dealt with based on their
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/PoisonStatus.java b/pitest/src/main/java/org/pitest/mutationtest/engine/PoisonStatus.java
deleted file mode 100644
index 7ad9bfac..00000000
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/PoisonStatus.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.pitest.mutationtest.engine;
-
-public enum PoisonStatus {
-  NORMAL(false), MAY_POISON_JVM(true), IS_STATIC_INITIALIZER_CODE(true);
-
-  private final boolean mayPoison;
-
-  PoisonStatus(boolean mayPoison) {
-    this.mayPoison = mayPoison;
-  }
-
-  boolean mayPoison() {
-    return this.mayPoison;
-  }
-}
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/ClassContext.java b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/ClassContext.java
index f5af39cb..777e36ad 100644
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/ClassContext.java
+++ b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/ClassContext.java
@@ -96,16 +96,6 @@ class ClassContext implements BlockCounter {
 
   }
 
-  @Override
-  public void registerFinallyBlockStart() {
-    this.blockCounter.registerFinallyBlockStart();
-  }
-
-  @Override
-  public void registerFinallyBlockEnd() {
-    this.blockCounter.registerFinallyBlockEnd();
-  }
-
   public int getCurrentBlock() {
     return this.blockCounter.getCurrentBlockThisMethod();
   }
@@ -115,8 +105,4 @@ class ClassContext implements BlockCounter {
     this.blockCounter.registerNewMethodStart();
   }
 
-  public boolean isWithinFinallyBlock() {
-    return this.blockCounter.isWithinFinallyBlock();
-  }
-
 }
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/MethodMutationContext.java b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/MethodMutationContext.java
index 226edb5a..74acfd17 100644
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/MethodMutationContext.java
+++ b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/MethodMutationContext.java
@@ -6,7 +6,6 @@ import java.util.Set;
 import org.pitest.mutationtest.engine.Location;
 import org.pitest.mutationtest.engine.MutationDetails;
 import org.pitest.mutationtest.engine.MutationIdentifier;
-import org.pitest.mutationtest.engine.PoisonStatus;
 import org.pitest.mutationtest.engine.gregor.analysis.InstructionCounter;
 
 class MethodMutationContext implements MutationContext, InstructionCounter {
@@ -31,8 +30,7 @@ class MethodMutationContext implements MutationContext, InstructionCounter {
         this.classContext.getJavaClassName());
     final MutationDetails details = new MutationDetails(newId,
         this.classContext.getFileName(), description, this.lastLineNumber,
-        this.classContext.getCurrentBlock(),
-        this.classContext.isWithinFinallyBlock(), PoisonStatus.NORMAL);
+        this.classContext.getCurrentBlock());
     registerMutation(details);
     return newId;
   }
@@ -69,16 +67,6 @@ class MethodMutationContext implements MutationContext, InstructionCounter {
     this.classContext.registerNewMethodStart();
   }
 
-  @Override
-  public void registerFinallyBlockStart() {
-    this.classContext.registerFinallyBlockStart();
-  }
-
-  @Override
-  public void registerFinallyBlockEnd() {
-    this.classContext.registerFinallyBlockEnd();
-  }
-
   @Override
   public ClassInfo getClassInfo() {
     return this.classContext.getClassInfo();
@@ -90,11 +78,15 @@ class MethodMutationContext implements MutationContext, InstructionCounter {
   }
 
   @Override
+  @Deprecated
+  // create a mutation interceptor instead
   public void disableMutations(final String reason) {
     this.mutationFindingDisabledReasons.add(reason);
   }
 
   @Override
+  @Deprecated
+  // create a mutation interceptor instead
   public void enableMutatations(final String reason) {
     this.mutationFindingDisabledReasons.remove(reason);
   }
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/MutatingClassVisitor.java b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/MutatingClassVisitor.java
index 7b5cc823..a40a514d 100644
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/MutatingClassVisitor.java
+++ b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/MutatingClassVisitor.java
@@ -22,7 +22,6 @@ import org.objectweb.asm.MethodVisitor;
 import org.pitest.bytecode.ASMVersion;
 import org.pitest.classinfo.ClassName;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 import org.pitest.mutationtest.engine.gregor.analysis.InstructionTrackingMethodVisitor;
 import org.pitest.mutationtest.engine.gregor.blocks.BlockTrackingMethodDecorator;
 
@@ -63,7 +62,7 @@ class MutatingClassVisitor extends ClassVisitor {
     final MethodMutationContext methodContext = new MethodMutationContext(
         this.context, Location.location(
             ClassName.fromString(this.context.getClassInfo().getName()),
-            MethodName.fromString(methodName), methodDescriptor));
+            methodName, methodDescriptor));
 
     final MethodVisitor methodVisitor = this.cv.visitMethod(access, methodName,
         methodDescriptor, signature, exceptions);
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/BlockCounter.java b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/BlockCounter.java
index f874ec06..9b730fe5 100644
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/BlockCounter.java
+++ b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/BlockCounter.java
@@ -4,10 +4,6 @@ public interface BlockCounter {
 
   void registerNewBlock();
 
-  void registerFinallyBlockStart();
-
-  void registerFinallyBlockEnd();
-
   void registerNewMethodStart();
 
 }
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/BlockTrackingMethodDecorator.java b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/BlockTrackingMethodDecorator.java
index a60124f0..cbda0d1b 100644
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/BlockTrackingMethodDecorator.java
+++ b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/BlockTrackingMethodDecorator.java
@@ -22,17 +22,8 @@ import org.pitest.bytecode.ASMVersion;
 import org.pitest.coverage.analysis.Block;
 import org.pitest.coverage.analysis.ControlFlowAnalyser;
 
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Set;
-
-import static org.objectweb.asm.Opcodes.ARETURN;
-import static org.objectweb.asm.Opcodes.ATHROW;
-import static org.objectweb.asm.Opcodes.DRETURN;
-import static org.objectweb.asm.Opcodes.FRETURN;
-import static org.objectweb.asm.Opcodes.IRETURN;
-import static org.objectweb.asm.Opcodes.LRETURN;
-import static org.objectweb.asm.Opcodes.RETURN;
+import java.util.ArrayDeque;
+import java.util.Deque;
 
 public class BlockTrackingMethodDecorator extends MethodNode {
 
@@ -51,38 +42,13 @@ public class BlockTrackingMethodDecorator extends MethodNode {
   public void visitEnd() {
     super.visitEnd();
 
-    final LinkedList<Block> blocks = new LinkedList<>(
+    final Deque<Block> blocks = new ArrayDeque<>(
         ControlFlowAnalyser.analyze(this));
 
     blockCounter.registerNewMethodStart();
     this.accept(new MethodVisitor(ASMVersion.ASM_VERSION, cmv) {
       Block curBlock = blocks.pop();
       int i;
-      private final Set<Label> handlers = new HashSet<>();
-
-      @Override
-      public void visitTryCatchBlock(Label start, Label end, Label handler,
-          String type) {
-        super.visitTryCatchBlock(start, end, handler, type);
-        if (type == null) {
-          handlers.add(handler);
-        }
-      }
-
-      private boolean endsBlock(final int opcode) {
-        switch (opcode) {
-        case RETURN:
-        case ARETURN:
-        case DRETURN:
-        case FRETURN:
-        case IRETURN:
-        case LRETURN:
-        case ATHROW: // dubious if this is needed
-          return true;
-        default:
-          return false;
-        }
-      }
 
       private void visitAnything() {
         if ((i == curBlock.getFirstInstruction())) {
@@ -112,9 +78,6 @@ public class BlockTrackingMethodDecorator extends MethodNode {
       public void visitInsn(int opcode) {
         visitAnything();
         super.visitInsn(opcode);
-        if (endsBlock(opcode)) {
-          blockCounter.registerFinallyBlockEnd();
-        }
       }
 
       @Override
@@ -166,9 +129,6 @@ public class BlockTrackingMethodDecorator extends MethodNode {
       @Override
       public void visitLabel(Label label) {
         visitAnything();
-        if (handlers.contains(label)) {
-          blockCounter.registerFinallyBlockStart();
-        }
         super.visitLabel(label);
       }
 
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/ConcreteBlockCounter.java b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/ConcreteBlockCounter.java
index 9298e649..0240c014 100644
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/ConcreteBlockCounter.java
+++ b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/ConcreteBlockCounter.java
@@ -4,7 +4,6 @@ public class ConcreteBlockCounter implements BlockCounter {
 
   private int     currentBlock = 0;
   private int     currentBlockThisMethod = 0;
-  private boolean isWithinExceptionHandler;
 
   @Override
   public void registerNewBlock() {
@@ -12,16 +11,6 @@ public class ConcreteBlockCounter implements BlockCounter {
     this.currentBlockThisMethod++;
   }
 
-  @Override
-  public void registerFinallyBlockStart() {
-    this.isWithinExceptionHandler = true;
-  }
-
-  @Override
-  public void registerFinallyBlockEnd() {
-    this.isWithinExceptionHandler = false;
-  }
-
   @Override
   public void registerNewMethodStart() {
     currentBlockThisMethod = 0;
@@ -35,8 +24,4 @@ public class ConcreteBlockCounter implements BlockCounter {
     return this.currentBlockThisMethod;
   }
 
-  public boolean isWithinFinallyBlock() {
-    return this.isWithinExceptionHandler;
-  }
-
 }
diff --git a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/mutators/NullMutateEverything.java b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/mutators/NullMutateEverything.java
index a3e835e6..5ebd43a8 100644
--- a/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/mutators/NullMutateEverything.java
+++ b/pitest/src/main/java/org/pitest/mutationtest/engine/gregor/mutators/NullMutateEverything.java
@@ -142,7 +142,7 @@ class MutateEveryThing extends MethodVisitor {
   @Override
   public void visitTryCatchBlock(Label start, Label end, Label handler,
       String type) {
-    mutate("visitTryCatchBlock");
+    // Can't mutate try catch blocks as they are not modelled as an instruction in ASM
     super.visitTryCatchBlock(start, end, handler, type);
   }
 
diff --git a/pitest/src/test/java/org/pitest/classinfo/ClassNameTest.java b/pitest/src/test/java/org/pitest/classinfo/ClassNameTest.java
index 2d3ca606..ba820f30 100644
--- a/pitest/src/test/java/org/pitest/classinfo/ClassNameTest.java
+++ b/pitest/src/test/java/org/pitest/classinfo/ClassNameTest.java
@@ -19,9 +19,13 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
 
 import org.junit.Test;
 
@@ -169,4 +173,33 @@ public class ClassNameTest {
     assertThat(ClassName.fromClass(String.class)).isSameAs(ClassName.fromClass(String.class));
   }
 
+  @Test
+  public void shouldUseCachedInstancesForInteger() {
+    assertThat(ClassName.fromClass(Integer.class)).isSameAs(ClassName.fromClass(Integer.class));
+  }
+
+  @Test
+  public void shouldUseCachedInstancesForList() {
+    assertThat(ClassName.fromClass(List.class)).isSameAs(ClassName.fromClass(List.class));
+  }
+
+  @Test
+  public void shouldUseCachedInstancesForArrayList() {
+    assertThat(ClassName.fromClass(ArrayList.class)).isSameAs(ClassName.fromClass(ArrayList.class));
+  }
+
+  @Test
+  public void shouldUseCachedInstancesForStream() {
+    assertThat(ClassName.fromClass(Stream.class)).isSameAs(ClassName.fromClass(Stream.class));
+  }
+
+  @Test
+  public void shouldUseCachedInstancesForFunction() {
+    assertThat(ClassName.fromClass(Function.class)).isSameAs(ClassName.fromClass(Function.class));
+  }
+
+  @Test
+  public void shouldUseCachedInstancesForPredicate() {
+    assertThat(ClassName.fromClass(Predicate.class)).isSameAs(ClassName.fromClass(Predicate.class));
+  }
 }
diff --git a/pitest/src/test/java/org/pitest/coverage/CoverageResultTest.java b/pitest/src/test/java/org/pitest/coverage/CoverageResultTest.java
index 748ddb02..b67b5017 100644
--- a/pitest/src/test/java/org/pitest/coverage/CoverageResultTest.java
+++ b/pitest/src/test/java/org/pitest/coverage/CoverageResultTest.java
@@ -3,7 +3,6 @@ package org.pitest.coverage;
 import org.junit.Test;
 import org.pitest.classinfo.ClassName;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -37,7 +36,7 @@ public class CoverageResultTest {
 
   private BlockLocation makeCoverage(final String name, final int block) {
     final Location l = Location.location(ClassName.fromString(name),
-        MethodName.fromString("amethod"), "methodDesc");
+        "amethod", "methodDesc");
     return new BlockLocation(l, block, 0, 1);
   }
 
diff --git a/pitest/src/test/java/org/pitest/coverage/codeassist/LineMapperTest.java b/pitest/src/test/java/org/pitest/coverage/codeassist/LineMapperTest.java
index b481276c..bb017dd8 100644
--- a/pitest/src/test/java/org/pitest/coverage/codeassist/LineMapperTest.java
+++ b/pitest/src/test/java/org/pitest/coverage/codeassist/LineMapperTest.java
@@ -18,7 +18,6 @@ import org.pitest.coverage.LineMap;
 import org.pitest.coverage.analysis.LineMapper;
 import java.util.Optional;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 
 import com.example.coverage.execute.samples.simple.LastLineOfContructorCheck;
 import com.example.coverage.execute.samples.simple.OneBlock;
@@ -36,7 +35,7 @@ public class LineMapperTest {
     final Map<BlockLocation, Set<Integer>> actual = analyse(OneBlock.class);
 
     final Location l = Location.location(ClassName.fromClass(OneBlock.class),
-        MethodName.fromString("foo"), "()I");
+        "foo", "()I");
     final BlockLocation bl = new BlockLocation(l, 0, -1, -1);
 
     assertThat(actual.get(bl)).containsOnly(5);
@@ -48,7 +47,7 @@ public class LineMapperTest {
     final Map<BlockLocation, Set<Integer>> actual = analyse(ThreeBlocks.class);
 
     final Location l = Location.location(ClassName.fromClass(ThreeBlocks.class),
-        MethodName.fromString("foo"), "(I)I");
+        "foo", "(I)I");
 
     assertThat(actual.get(BlockLocation.blockLocation(l, 0))).containsOnly(5);
     assertThat(actual.get(BlockLocation.blockLocation(l, 1))).containsOnly(6);
@@ -62,7 +61,7 @@ public class LineMapperTest {
 
     final Location l = Location.location(
         ClassName.fromClass(ThreeMultiLineBlocks.class),
-        MethodName.fromString("foo"), "(I)I");
+        "foo", "(I)I");
 
     assertThat(actual.get(BlockLocation.blockLocation(l, 0))).contains(5, 6);
     assertThat(actual.get(BlockLocation.blockLocation(l, 1))).contains(7);
@@ -78,7 +77,7 @@ public class LineMapperTest {
     final Map<BlockLocation, Set<Integer>> actual = analyse(com.example.LineNumbersSpanBlocks.class);
     final Location l = Location.location(
         ClassName.fromClass(com.example.LineNumbersSpanBlocks.class),
-        MethodName.fromString("foo"), "(I)I");
+        "foo", "(I)I");
 
     assertThat(actual.get(BlockLocation.blockLocation(l, 2))).containsOnly(12);
   }
@@ -88,7 +87,7 @@ public class LineMapperTest {
     final Map<BlockLocation, Set<Integer>> actual = analyse(LastLineOfContructorCheck.class);
     final Location l = Location.location(
         ClassName.fromClass(LastLineOfContructorCheck.class),
-        MethodName.fromString("<init>"), "()V");
+        "<init>", "()V");
 
     assertThat(actual.get(BlockLocation.blockLocation(l, 1))).contains(6);
   }
@@ -97,10 +96,10 @@ public class LineMapperTest {
   public void shouldI() throws Exception {
     final Map<BlockLocation, Set<Integer>> actual = analyse(ThreeBlocks2.class);
     final Location l = Location.location(ClassName.fromClass(ThreeBlocks2.class),
-        MethodName.fromString("foo"), "(I)I");
-    assertThat(actual.get(BlockLocation.blockLocation(l, 0))).containsOnly(108);
-    assertThat(actual.get(BlockLocation.blockLocation(l, 1))).containsOnly(109);
-    assertThat(actual.get(BlockLocation.blockLocation(l, 2))).containsOnly(111);
+        "foo", "(I)I");
+    assertThat(actual.get(BlockLocation.blockLocation(l, 0))).containsOnly(107);
+    assertThat(actual.get(BlockLocation.blockLocation(l, 1))).containsOnly(108);
+    assertThat(actual.get(BlockLocation.blockLocation(l, 2))).containsOnly(110);
   }
 
   static class ThreeBlocks2 {
diff --git a/pitest/src/test/java/org/pitest/mutationtest/LocationMother.java b/pitest/src/test/java/org/pitest/mutationtest/LocationMother.java
index 692ac120..ce45b2c0 100644
--- a/pitest/src/test/java/org/pitest/mutationtest/LocationMother.java
+++ b/pitest/src/test/java/org/pitest/mutationtest/LocationMother.java
@@ -2,7 +2,6 @@ package org.pitest.mutationtest;
 
 import org.pitest.classinfo.ClassName;
 import org.pitest.mutationtest.engine.Location;
-import org.pitest.mutationtest.engine.MethodName;
 import org.pitest.mutationtest.engine.MutationIdentifier;
 import org.pitest.quickbuilder.Builder;
 import org.pitest.quickbuilder.Generator;
@@ -57,7 +56,7 @@ public class LocationMother {
 
   private static Generator<LocationBuilder, Location> locationSeed() {
     return b -> Location.location(b._Class(),
-        MethodName.fromString(b._Method()), b._MethodDescription());
+        b._Method(), b._MethodDescription());
   }
 
   public static MutationIdentifierBuilder aMutationId() {
diff --git a/pitest/src/test/java/org/pitest/mutationtest/engine/LocationTest.java b/pitest/src/test/java/org/pitest/mutationtest/engine/LocationTest.java
index 38b26eea..9c41ff28 100644
--- a/pitest/src/test/java/org/pitest/mutationtest/engine/LocationTest.java
+++ b/pitest/src/test/java/org/pitest/mutationtest/engine/LocationTest.java
@@ -17,13 +17,13 @@ public class LocationTest {
   @Test
   public void shouldSortInConsistantOrder() {
     final Location a = location(ClassName.fromString("A"),
-        MethodName.fromString("A"), "A");
+       "A", "A");
     final Location b = location(ClassName.fromString("AA"),
-        MethodName.fromString("A"), "A");
+        "A", "A");
     final Location c = location(ClassName.fromString("A"),
-        MethodName.fromString("AA"), "A");
+        "AA", "A");
     final Location d = location(ClassName.fromString("A"),
-        MethodName.fromString("AA"), "AA");
+        "AA", "AA");
     final List<Location> ls = Arrays.asList(a, b, c, d);
     Collections.sort(ls);
     assertEquals(Arrays.asList(a, c, d, b), ls);
diff --git a/pitest/src/test/java/org/pitest/mutationtest/engine/MutationDetailsMother.java b/pitest/src/test/java/org/pitest/mutationtest/engine/MutationDetailsMother.java
index 384e6cdd..64a8ec9d 100644
--- a/pitest/src/test/java/org/pitest/mutationtest/engine/MutationDetailsMother.java
+++ b/pitest/src/test/java/org/pitest/mutationtest/engine/MutationDetailsMother.java
@@ -30,10 +30,6 @@ public class MutationDetailsMother {
 
     MutationDetailsBuilder withTestsInOrder(List<TestInfo> tests);
 
-    MutationDetailsBuilder withIsInFinallyBlock(boolean b);
-
-    MutationDetailsBuilder withPoison(PoisonStatus b);
-
     MutationIdentifier _Id();
 
     String _Filename();
@@ -44,25 +40,20 @@ public class MutationDetailsMother {
 
     String _Description();
 
-    boolean _IsInFinallyBlock();
-
-    PoisonStatus _Poison();
-
     List<TestInfo> _TestsInOrder();
   }
 
   public static MutationDetailsBuilder aMutationDetail() {
     return QB.builder(MutationDetailsBuilder.class, seed()).withBlock(0)
         .withDescription("A mutation").withFilename("foo.java")
-        .withId(aMutationId()).withLineNumber(42).withIsInFinallyBlock(false)
-        .withPoison(PoisonStatus.NORMAL).withTestsInOrder(Collections.<TestInfo> emptyList());
+        .withId(aMutationId()).withLineNumber(42)
+        .withTestsInOrder(Collections.<TestInfo> emptyList());
   }
 
   private static Generator<MutationDetailsBuilder, MutationDetails> seed() {
     return b -> {
       final MutationDetails md = new MutationDetails(b._Id(), b._Filename(),
-          b._Description(), b._LineNumber(), b._Block(),
-          b._IsInFinallyBlock(), b._Poison());
+          b._Description(), b._LineNumber(), b._Block());
       md.addTestsInOrder(b._TestsInOrder());
       return md;
     };
@@ -74,7 +65,7 @@ public class MutationDetailsMother {
 
   public static MutationDetails makeMutation(final ClassName clazz) {
     return new MutationDetails(new MutationIdentifier(Location.location(clazz,
-        new MethodName("aMethod"), "()V"), 1, "mutatorId"), "foo.java",
+        "aMethod", "()V"), 1, "mutatorId"), "foo.java",
         "A mutation", 0, 0);
   }
 
diff --git a/pitest/src/test/java/org/pitest/mutationtest/engine/MutationDetailsTest.java b/pitest/src/test/java/org/pitest/mutationtest/engine/MutationDetailsTest.java
index 8dd2156c..0e01ff43 100644
--- a/pitest/src/test/java/org/pitest/mutationtest/engine/MutationDetailsTest.java
+++ b/pitest/src/test/java/org/pitest/mutationtest/engine/MutationDetailsTest.java
@@ -8,25 +8,6 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 
 public class MutationDetailsTest {
 
-  @Test
-  public void shouldCreateNewCopyWithUpdatedPoisonStatusForStaticInitializerMarking() {
-    final MutationDetails testee = MutationDetailsMother.aMutationDetail().build();
-
-    final MutationDetails actual = testee.withPoisonStatus(PoisonStatus.IS_STATIC_INITIALIZER_CODE);
-    assertThat(actual).isNotSameAs(testee);
-    assertThat(actual.mayPoisonJVM()).isTrue();
-    assertThat(actual.isInStaticInitializer()).isTrue();
-  }
-
-  @Test
-  public void shouldCreateNewCopyWithUpdatedPoisonStatusForJVMPoisoningMarking() {
-    final MutationDetails testee = MutationDetailsMother.aMutationDetail().build();
-
-    final MutationDetails actual = testee.withPoisonStatus(PoisonStatus.MAY_POISON_JVM);
-    assertThat(actual).isNotSameAs(testee);
-    assertThat(actual.mayPoisonJVM()).isTrue();
-  }
-  
   @Test
   public void shouldDefaultFilenameWhenNoneKnown() {
     final MutationDetails testee = MutationDetailsMother
diff --git a/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/TestGregorMutater.java b/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/TestGregorMutater.java
index c3b60369..2c8bca29 100644
--- a/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/TestGregorMutater.java
+++ b/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/TestGregorMutater.java
@@ -15,7 +15,6 @@
 package org.pitest.mutationtest.engine.gregor;
 
 import org.junit.Test;
-import org.pitest.functional.FCollection;
 import org.pitest.mutationtest.engine.MutationDetails;
 import org.pitest.mutationtest.engine.gregor.config.Mutator;
 import org.pitest.mutationtest.engine.gregor.mutators.IncrementsMutator;
@@ -270,52 +269,6 @@ public class TestGregorMutater extends MutatorTestBase {
     assertTwoMutationsInDifferentBlocks(actualDetails);
   }
 
-  @Test
-  public void shouldNotRecordMutationsAsInFinallyBlockWhenTheyAreNot() {
-    createTesteeWith(Mutator.byName("INCREMENTS"));
-    final List<MutationDetails> actualDetails = findMutationsFor(HasExceptionBlock.class);
-    assertFalse(actualDetails.get(0).isInFinallyBlock());
-    assertFalse(actualDetails.get(1).isInFinallyBlock());
-  }
-
-  public static class HasFinallyBlock {
-    public void foo(int i) {
-      try {
-        System.out.println("foo");
-      } finally {
-        i++;
-      }
-    }
-  }
-
-  @Test
-  public void shouldMarkMutationsWithinFinallyBlocks() {
-    createTesteeWith(Mutator.byName("INCREMENTS"));
-    final List<MutationDetails> actualDetails = findMutationsFor(HasFinallyBlock.class);
-    assertEquals(1, FCollection.filter(actualDetails, isInFinallyBlock())
-        .size());
-  }
-
-  public static class HasFinallyBlockAndExceptionHandler {
-    public void foo(int i) {
-      try {
-        System.out.println("foo");
-      } catch (final Exception x) {
-        System.out.println("bar");
-      } finally {
-        i++;
-      }
-    }
-  }
-
-  @Test
-  public void shouldMarkMutationsWithinFinallyBlocksWhenExceptionHandlerAlsoPresent() {
-    createTesteeWith(Mutator.byName("INCREMENTS"));
-    final List<MutationDetails> actualDetails = findMutationsFor(HasFinallyBlockAndExceptionHandler.class);
-    assertEquals(1, FCollection.filter(actualDetails, isInFinallyBlock())
-        .size());
-  }
-
   public static class HasTwoMutableMethods {
     public int a() {
       return 1;
@@ -349,10 +302,6 @@ public class TestGregorMutater extends MutatorTestBase {
   }
 
 
-  private static Predicate<MutationDetails> isInFinallyBlock() {
-    return a -> a.isInFinallyBlock();
-  }
-
   private void assertTwoMutationsInDifferentBlocks(
       final List<MutationDetails> actualDetails) {
     assertEquals(2, actualDetails.size());
diff --git a/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/blocks/BlockTrackingMethodDecoratorTest.java b/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/blocks/BlockTrackingMethodDecoratorTest.java
index 04e48c60..997235da 100644
--- a/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/blocks/BlockTrackingMethodDecoratorTest.java
+++ b/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/blocks/BlockTrackingMethodDecoratorTest.java
@@ -16,7 +16,6 @@ import org.junit.Test;
 import org.mockito.Mock;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
 import org.pitest.bytecode.MethodDecoratorTest;
 
 public class BlockTrackingMethodDecoratorTest extends MethodDecoratorTest {
@@ -34,35 +33,6 @@ public class BlockTrackingMethodDecoratorTest extends MethodDecoratorTest {
         "foo", "(II)V", null, null);
   }
 
-  @Test
-  public void shouldRegisterFinallyBlockStartWhenHitsLabelFromNullExceptionHandler() {
-    final Label end = new Label();
-    final Label start = new Label();
-    final Label handler = new Label();
-    this.testee.visitTryCatchBlock(start, end, handler, null);
-    this.testee.visitInsn(Opcodes.NOP);
-    this.testee.visitLabel(handler);
-    this.testee.visitEnd();
-    verify(this.tracker).registerFinallyBlockStart();
-  }
-
-  @Test
-  public void shouldNotRegisterFinallyBlockStartWhenHitsLabelFromNonNullExceptionHandler() {
-    final Label end = new Label();
-    final Label start = new Label();
-    final Label handler = new Label();
-    this.testee.visitTryCatchBlock(start, end, handler, "NotNull");
-    this.testee.visitLabel(handler);
-    verify(this.tracker, never()).registerFinallyBlockStart();
-  }
-
-  @Test
-  public void shouldNotRegisterFinallyBlockStartWhenHitsOtherLabelsFromNonNullExceptionHandler() {
-    final Label label = new Label();
-    this.testee.visitLabel(label);
-    verify(this.tracker, never()).registerFinallyBlockStart();
-  }
-
   @Test
   public void shouldRegisiterNewBlockForJumpInstructions() {
     this.testee.visitJumpInsn(0, new Label());
@@ -81,13 +51,6 @@ public class BlockTrackingMethodDecoratorTest extends MethodDecoratorTest {
     verify(this.tracker).registerNewBlock();
   }
 
-  @Test
-  public void shouldRegisterFinallyBlockEndForReturnInstructions() {
-    this.testee.visitInsn(RETURN);
-    this.testee.visitEnd();
-    verify(this.tracker).registerFinallyBlockEnd();
-  }
-
   @Test
   public void shouldRegisterNewBlockForAReturnInstructions() {
     this.testee.visitInsn(ARETURN);
@@ -97,13 +60,6 @@ public class BlockTrackingMethodDecoratorTest extends MethodDecoratorTest {
     verify(this.tracker).registerNewBlock();
   }
 
-  @Test
-  public void shouldRegisterFinallyBlockEndForAReturnInstructions() {
-    this.testee.visitInsn(ARETURN);
-    this.testee.visitEnd();
-    verify(this.tracker).registerFinallyBlockEnd();
-  }
-
   @Test
   public void shouldRegisterNewBlockForFReturnInstructions() {
     this.testee.visitInsn(FRETURN);
@@ -113,13 +69,6 @@ public class BlockTrackingMethodDecoratorTest extends MethodDecoratorTest {
     verify(this.tracker).registerNewBlock();
   }
 
-  @Test
-  public void shouldRegisterFinallyBlockEndForFReturnInstructions() {
-    this.testee.visitInsn(FRETURN);
-    this.testee.visitEnd();
-    verify(this.tracker).registerFinallyBlockEnd();
-  }
-
   @Test
   public void shouldRegisterNewBlockForIReturnInstructions() {
     this.testee.visitInsn(IRETURN);
@@ -129,13 +78,6 @@ public class BlockTrackingMethodDecoratorTest extends MethodDecoratorTest {
     verify(this.tracker).registerNewBlock();
   }
 
-  @Test
-  public void shouldRegisterFinallyBlockEndForIReturnInstructions() {
-    this.testee.visitInsn(IRETURN);
-    this.testee.visitEnd();
-    verify(this.tracker).registerFinallyBlockEnd();
-  }
-
   @Test
   public void shouldRegisterNewBlockForLReturnInstructions() {
     this.testee.visitInsn(LRETURN);
@@ -145,13 +87,6 @@ public class BlockTrackingMethodDecoratorTest extends MethodDecoratorTest {
     verify(this.tracker).registerNewBlock();
   }
 
-  @Test
-  public void shouldRegisterFinallyBlockEndForLReturnInstructions() {
-    this.testee.visitInsn(LRETURN);
-    this.testee.visitEnd();
-    verify(this.tracker).registerFinallyBlockEnd();
-  }
-
   @Test
   public void shouldRegisterNewBlockForAThrowInstructions() {
     this.testee.visitInsn(ATHROW); // possible without also getting a jump??
@@ -161,26 +96,12 @@ public class BlockTrackingMethodDecoratorTest extends MethodDecoratorTest {
     verify(this.tracker).registerNewBlock();
   }
 
-  @Test
-  public void shouldRegisterFinallyBlockEndForAThrowInstructions() {
-    this.testee.visitInsn(ATHROW);
-    this.testee.visitEnd();
-    verify(this.tracker).registerFinallyBlockEnd();
-  }
-
   @Test
   public void shouldNotRegisterANewBlockForOtherInsn() {
     this.testee.visitInsn(ICONST_0);
     verify(this.tracker, never()).registerNewBlock();
   }
 
-  @Test
-  public void shouldNotRegisterFinallyBlockEndForOtherInsn() {
-    this.testee.visitInsn(ICONST_0);
-    verify(this.tracker, never()).registerFinallyBlockEnd();
-  }
-  
-
   @Override
   protected MethodVisitor getTesteeVisitor() {
     return this.testee;
diff --git a/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/blocks/ConcreteBlockCounterTest.java b/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/blocks/ConcreteBlockCounterTest.java
index e1cce8ca..f78fda39 100644
--- a/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/blocks/ConcreteBlockCounterTest.java
+++ b/pitest/src/test/java/org/pitest/mutationtest/engine/gregor/blocks/ConcreteBlockCounterTest.java
@@ -24,13 +24,4 @@ public class ConcreteBlockCounterTest {
     assertEquals(2, this.testee.getCurrentBlock());
   }
 
-  @Test
-  public void shouldTrackWhenCodeIsWithinFinallyBlocks() {
-    assertFalse(this.testee.isWithinFinallyBlock());
-    this.testee.registerFinallyBlockStart();
-    assertTrue(this.testee.isWithinFinallyBlock());
-    this.testee.registerFinallyBlockEnd();
-    assertFalse(this.testee.isWithinFinallyBlock());
-  }
-
 }
diff --git a/pom.xml b/pom.xml
index 3da9a897..bf591053 100644
--- a/pom.xml
+++ b/pom.xml
@@ -142,7 +142,7 @@
 			<dependency>
 				<groupId>nl.jqno.equalsverifier</groupId>
 				<artifactId>equalsverifier</artifactId>
-				<version>3.5.4</version>
+				<version>3.7.1</version>
 				<scope>test</scope>
 			</dependency>
 		</dependencies>
['pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/annotations/ExcludedAnnotationInterceptorTest.java', 'pitest-entry/src/main/java/org/pitest/mutationtest/report/xml/XMLReportListener.java', 'pitest-entry/src/test/java/org/pitest/mutationtest/build/DefaultTestPrioritiserTest.java', 'pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/timeout/InfiniteForLoopFilterFactoryTest.java', 'pitest-entry/src/test/java/org/pitest/mutationtest/config/SettingsFactoryTest.java', 'pitest-entry/src/test/java/org/pitest/mutationtest/MutationMetaDataTest.java', 'pitest/src/main/java/org/pitest/mutationtest/engine/gregor/mutators/NullMutateEverything.java', 'pitest/src/test/java/org/pitest/coverage/CoverageResultTest.java', 'pitest/src/main/java/org/pitest/mutationtest/engine/MutationDetails.java', 'pitest/src/test/java/org/pitest/mutationtest/engine/gregor/blocks/BlockTrackingMethodDecoratorTest.java', 'pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/RecordFilterTest.java', 'pitest/src/test/java/org/pitest/coverage/codeassist/LineMapperTest.java', 'pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/LineMutatorPair.java', 'pom.xml', 'pitest-aggregator/src/main/java/org/pitest/aggregate/BlockCoverageDataLoader.java', 'pitest/src/main/java/org/pitest/mutationtest/engine/gregor/MutatingClassVisitor.java', 'pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/RecordFilter.java', 'pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/logging/LoggingCallsFilterTest.java', 'pitest/src/main/java/org/pitest/mutationtest/engine/Location.java', 'pitest-entry/src/test/java/org/pitest/coverage/CoverageDataTest.java', 'pitest/src/test/java/org/pitest/classinfo/ClassNameTest.java', 'pitest/src/test/java/org/pitest/mutationtest/LocationMother.java', 'pitest-entry/src/main/java/org/pitest/mutationtest/build/DefaultTestPrioritiser.java', 'pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/equivalent/EqualsPerformanceShortcutFilter.java', 'pitest-entry/src/main/java/org/pitest/bytecode/analysis/MethodTree.java', 'pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerInterceptorTest.java', 'pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/staticinitializers/StaticInitializerInterceptor.java', 'pitest/src/main/java/org/pitest/coverage/analysis/LineMapper.java', 'pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/equivalent/NullFlatMapFilter.java', 'pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/FilterTester.java', 'pitest/src/test/java/org/pitest/mutationtest/engine/MutationDetailsMother.java', 'pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/BlockCounter.java', 'pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/ConcreteBlockCounter.java', 'pitest/src/main/java/org/pitest/classinfo/ClassName.java', 'pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/InlinedFinallyBlockFilter.java', 'pitest-entry/src/main/java/org/pitest/coverage/execute/Receive.java', 'pitest/src/main/java/org/pitest/mutationtest/engine/gregor/ClassContext.java', 'pitest/src/test/java/org/pitest/mutationtest/engine/gregor/blocks/ConcreteBlockCounterTest.java', 'pitest-entry/src/main/java/org/pitest/mutationtest/build/intercept/javafeatures/EnumConstructorFilter.java', 'pitest/src/main/java/org/pitest/mutationtest/engine/gregor/MethodMutationContext.java', 'pitest/src/test/java/org/pitest/mutationtest/engine/LocationTest.java', 'pitest/src/main/java/org/pitest/mutationtest/engine/gregor/blocks/BlockTrackingMethodDecorator.java', 'pitest/src/test/java/org/pitest/mutationtest/engine/gregor/TestGregorMutater.java', 'pitest-entry/src/main/resources/META-INF/services/org.pitest.mutationtest.build.MutationInterceptorFactory', 'pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/EnumConstructorTest.java', 'pitest-entry/src/test/java/org/pitest/mutationtest/build/intercept/javafeatures/InlinedFinallyBlockFilterTest.java', 'pitest/src/test/java/org/pitest/mutationtest/engine/MutationDetailsTest.java', 'pitest-entry/src/main/java/org/pitest/coverage/export/DefaultCoverageExporter.java', 'pitest-aggregator/src/main/java/org/pitest/aggregate/MutationResultDataLoader.java', 'pitest-entry/src/test/java/org/pitest/coverage/execute/CoverageProcessSystemTest.java']