Merge remote-tracking branch 'aosp/upstream-master' into master

Bug: 36792868
Test: m -j
Change-Id: I93e18d46e04d41256c56d3d7939914e631b29a98
diff --git a/.appveyor.yml b/.appveyor.yml
new file mode 100644
index 0000000..7ab0b10
--- /dev/null
+++ b/.appveyor.yml
@@ -0,0 +1,17 @@
+cache:
+  - C:\Users\appveyor\apache-maven-3.3.9 -> appveyor.yml
+  - C:\Users\appveyor\.m2 -> **\pom.xml
+
+install:
+  - if not exist C:\Users\appveyor\apache-maven-3.3.9 (
+      curl -LsS "http://www.apache.org/dyn/closer.cgi?action=download&filename=maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip" > apache-maven-3.3.9-bin.zip &&
+      unzip apache-maven-3.3.9-bin.zip -d C:\Users\appveyor
+    )
+  - SET PATH=C:\Users\appveyor\apache-maven-3.3.9\bin;%PATH%
+
+build_script:
+  # Maven 3.3.9 requires Java >= 7, but generation of Javadocs requires Java <= 6 (https://github.com/jacoco/jacoco/issues/110)
+  - mvn -V -B -e verify -Djdk.version=1.6 --toolchains=.travis\appveyor-toolchains.xml
+
+artifacts:
+  - path: jacoco\target\*.zip
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..801fe46
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,17 @@
+This is a issue tracker. Please use our mailing list for general questions: 
+https://groups.google.com/forum/?fromgroups=#!forum/jacoco
+
+Also check FAQ before opening an issue: http://www.jacoco.org/jacoco/trunk/doc/faq.html
+
+
+### Steps to reproduce
+
+JaCoCo version:
+Operating system:
+Tool integration: Maven/Ant/API/Other
+
+
+### Expected behaviour
+
+
+### Actual behaviour
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..dbd7421
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+target/
+.settings/
+!org.jacoco.core/.settings/
+!org.jacoco.core.test/.settings/
+org.jacoco.agent/src/jacocoagent.jar
+.idea
+*.iml
diff --git a/.travis.sh b/.travis.sh
new file mode 100755
index 0000000..dfbd8df
--- /dev/null
+++ b/.travis.sh
@@ -0,0 +1,99 @@
+#!/bin/bash
+
+set -euo pipefail
+
+# Prevent accidental execution outside of Travis:
+if [ -z "${TRAVIS+false}" ]
+then
+  echo "TRAVIS environment variable is not set"
+  exit 1
+fi
+
+# Switch to desired JDK, download if required:
+function install_jdk {
+  JDK_URL=$1
+
+  FILENAME="${JDK_URL##*/}"
+
+  rm -rf /tmp/jdk/$JDK
+  mkdir -p /tmp/jdk/$JDK
+
+  if [ ! -f "/tmp/jdk/$FILENAME" ]
+  then
+    curl -L $JDK_URL -o /tmp/jdk/$FILENAME
+  fi
+
+  tar -xzf /tmp/jdk/$FILENAME -C /tmp/jdk/$JDK --strip-components 1
+
+  if [ -z "${2+false}" ]
+  then
+    export JAVA_HOME="/tmp/jdk/$JDK"
+    export JDK_HOME="${JAVA_HOME}"
+    export JAVAC="${JAVA_HOME}/bin/javac"
+    export PATH="${JAVA_HOME}/bin:${PATH}"
+  fi
+}
+
+source $HOME/.jdk_switcher_rc
+case "$JDK" in
+5)
+  jdk_switcher use oraclejdk8
+  install_jdk $JDK5_URL false
+  ;;
+6)
+  jdk_switcher use openjdk6
+  ;;
+7|8)
+  jdk_switcher use oraclejdk${JDK}
+  ;;
+8-ea)
+  install_jdk $JDK8_EA_URL
+  ;;
+9-ea)
+  install_jdk $JDK9_EA_URL
+  ;;
+9-ea-stable)
+  install_jdk $JDK9_EA_STABLE_URL
+  ;;
+esac
+
+# Do not use "~/.mavenrc" set by Travis (https://github.com/travis-ci/travis-ci/issues/3893),
+# because it prevents execution of JaCoCo during integration tests for jacoco-maven-plugin,
+# and "-XMaxPermSize" not supported by JDK 9
+export MAVEN_SKIP_RC=true
+
+# Build:
+# TODO(Godin): see https://github.com/jacoco/jacoco/issues/300 about "bytecode.version"
+case "$JDK" in
+5)
+  if [[ ${TRAVIS_PULL_REQUEST} == 'false' && ${TRAVIS_BRANCH} == 'master' ]]
+  then
+    # goal "deploy:deploy" used directly instead of "deploy" phase to avoid pollution of Maven repository by "install" phase
+    mvn -V -B -e -f org.jacoco.build verify sonar:sonar deploy:deploy -DdeployAtEnd -Djdk.version=1.5 --toolchains=./.travis/toolchains.xml --settings=./.travis/settings.xml -Dsonar.host.url=${SONARQUBE_URL} -Dsonar.login=${SONARQUBE_TOKEN}
+    python ./.travis/trigger-site-deployment.py
+  else
+    mvn -V -B -e verify -Djdk.version=1.5 --toolchains=./.travis/toolchains.xml
+  fi
+  ;;
+6)
+  mvn -V -B -e verify -Dbytecode.version=1.6
+  ;;
+7)
+  mvn -V -B -e verify -Dbytecode.version=1.7
+  ;;
+8 | 8-ea)
+  mvn -V -B -e verify -Dbytecode.version=1.8 -Decj=${ECJ:-}
+  ;;
+9-ea | 9-ea-stable)
+  # Groovy version should be updated to get rid of "--add-opens" options (see https://twitter.com/CedricChampeau/status/807285853580103684)
+  export MAVEN_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED"
+
+  # see https://bugs.openjdk.java.net/browse/JDK-8131041 about "java.locale.providers"
+  mvn -V -B -e verify -Dbytecode.version=1.9 \
+    -DargLine=-Djava.locale.providers=JRE,SPI
+  ;;
+*)
+  echo "Incorrect JDK [$JDK]"
+  exit 1;
+  ;;
+esac
diff --git a/.travis.yml b/.travis.yml
index a311c29..19f5d2b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,8 +3,6 @@
 # Skip "install" stage:
 install: true
 
-script: mvn -V -B clean verify
-
 # Use container-based infrastructure:
 sudo: false
 
@@ -12,3 +10,21 @@
 cache:
   directories:
     - '$HOME/.m2/repository'
+
+env:
+  - JDK=5
+  - JDK=6
+  - JDK=7
+  - JDK=8
+  - JDK=8
+    ECJ=true
+  - JDK=8-ea
+  - JDK=9-ea
+  - JDK=9-ea-stable
+
+matrix:
+  allow_failures:
+    - env: JDK=8-ea
+    - env: JDK=9-ea
+
+script: ./.travis.sh
diff --git a/.travis/appveyor-toolchains.xml b/.travis/appveyor-toolchains.xml
new file mode 100644
index 0000000..6e91e4b
--- /dev/null
+++ b/.travis/appveyor-toolchains.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF8"?>
+<toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">
+  <toolchain>
+    <type>jdk</type>
+    <provides>
+      <id>java16</id>
+      <version>1.6</version>
+      <vendor>oracle</vendor>
+    </provides>
+    <configuration>
+      <jdkHome>C:\Program Files\Java\jdk1.6.0</jdkHome>
+    </configuration>
+  </toolchain>
+</toolchains>
diff --git a/.travis/settings.xml b/.travis/settings.xml
new file mode 100644
index 0000000..0c27d50
--- /dev/null
+++ b/.travis/settings.xml
@@ -0,0 +1,21 @@
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+  <servers>
+    <server>
+      <id>sonatype-nexus-snapshots</id>
+      <username>${env.SONATYPE_USERNAME}</username>
+      <password>${env.SONATYPE_PASSWORD}</password>
+    </server>
+  </servers>
+  <profiles>
+    <profile>
+      <id>default</id>
+      <properties>
+        <https.protocols>TLSv1</https.protocols>
+      </properties>
+    </profile>
+  </profiles>
+  <activeProfiles>
+    <activeProfile>default</activeProfile>
+  </activeProfiles>
+</settings>
diff --git a/.travis/toolchains.xml b/.travis/toolchains.xml
new file mode 100644
index 0000000..59383f3
--- /dev/null
+++ b/.travis/toolchains.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF8"?>
+<toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">
+  <toolchain>
+    <type>jdk</type>
+    <provides>
+      <id>java15</id>
+      <version>1.5</version>
+      <vendor>sun</vendor>
+    </provides>
+    <configuration>
+      <jdkHome>/tmp/jdk/5</jdkHome>
+    </configuration>
+  </toolchain>
+</toolchains>
diff --git a/.travis/trigger-site-deployment.py b/.travis/trigger-site-deployment.py
new file mode 100644
index 0000000..6add301
--- /dev/null
+++ b/.travis/trigger-site-deployment.py
@@ -0,0 +1,17 @@
+import os
+import urllib2
+import json
+
+def request(url, data, token = None):
+  req = urllib2.Request(url, data)
+  req.add_header('User-Agent', 'MyClient/1.0.0')
+  req.add_header('Accept', 'application/vnd.travis-ci.2+json')
+  req.add_header('Content-Type', 'application/json; charset=UTF-8')
+  if token:
+    req.add_header('Travis-API-Version', '3')
+    req.add_header('Authorization', 'token ' + travis_token)
+  p = urllib2.urlopen(req)
+  return json.loads(p.read())
+
+travis_token = request('https://api.travis-ci.org/auth/github', '{"github_token":"' + os.environ['GH_TOKEN'] + '"}')['access_token']
+print(request('https://api.travis-ci.org/repo/jacoco%2Fwww.eclemma.org/requests', '{ "request": { "branch": "master", "message": "New JaCoCo snapshot" } }', travis_token))
diff --git a/LICENSE.md b/LICENSE.md
index 54fc346..acc6176 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,7 +1,7 @@
 License
 =======
 
-Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
 
 The JaCoCo Java Code Coverage Library and all included documentation is made
 available by Mountainminds GmbH & Co. KG, Munich. Except indicated below, the
@@ -10,5 +10,5 @@
 [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html).
 
 Please visit
-[http://www.eclemma.org/jacoco/trunk/doc/license.html](http://www.eclemma.org/jacoco/trunk/doc/license.html)
+[http://www.jacoco.org/jacoco/trunk/doc/license.html](http://www.jacoco.org/jacoco/trunk/doc/license.html)
 for the complete license information including third party licenses and trademarks.
diff --git a/README.md b/README.md
index f0737fc..c068593 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,17 @@
 JaCoCo Java Code Coverage Library
 =================================
 
+[![Build Status](https://travis-ci.org/jacoco/jacoco.svg?branch=master)](https://travis-ci.org/jacoco/jacoco)
+[![Build status](https://ci.appveyor.com/api/projects/status/g28egytv4tb898d7/branch/master?svg=true)](https://ci.appveyor.com/project/JaCoCo/jacoco/branch/master)
 [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.jacoco/org.jacoco.core/badge.svg?style=flat)](http://search.maven.org/#search|ga|1|g%3Aorg.jacoco)
 
 JaCoCo is a free Java code coverage library distributed under the Eclipse Public
-License. Check the [project homepage](http://www.eclemma.org/jacoco)
+License. Check the [project homepage](http://www.jacoco.org/jacoco)
 for downloads, documentation and feedback.
 
 Please use our [mailing list](https://groups.google.com/forum/?fromgroups=#!forum/jacoco)
 for questions regarding JaCoCo which are not already covered by the
-[extensive documentation](http://www.eclemma.org/jacoco/trunk/doc/).
+[extensive documentation](http://www.jacoco.org/jacoco/trunk/doc/).
+
+Note: We do not answer general questions in the project's issue tracker. Please use our [mailing list](https://groups.google.com/forum/?fromgroups=#!forum/jacoco) for this.
+-------------------------------------------------------------------------
diff --git a/jacoco-maven-plugin.test/.gitignore b/jacoco-maven-plugin.test/.gitignore
deleted file mode 100644
index 2c36b17..0000000
--- a/jacoco-maven-plugin.test/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/target
-/.settings
diff --git a/jacoco-maven-plugin.test/it/it-check-fails-halt/pom.xml b/jacoco-maven-plugin.test/it/it-check-fails-halt/pom.xml
index ad47b34..4032ed1 100644
--- a/jacoco-maven-plugin.test/it/it-check-fails-halt/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-check-fails-halt/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-fails-halt/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-check-fails-halt/src/main/java/Example.java
index f1db2b8..ae29e59 100644
--- a/jacoco-maven-plugin.test/it/it-check-fails-halt/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-check-fails-halt/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-fails-halt/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-check-fails-halt/src/test/java/ExampleTest.java
index 2babeb3..ac41129 100644
--- a/jacoco-maven-plugin.test/it/it-check-fails-halt/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-check-fails-halt/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-fails-halt/verify.bsh b/jacoco-maven-plugin.test/it/it-check-fails-halt/verify.bsh
index d9d31c9..6894b45 100644
--- a/jacoco-maven-plugin.test/it/it-check-fails-halt/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-check-fails-halt/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-fails-no-halt/pom.xml b/jacoco-maven-plugin.test/it/it-check-fails-no-halt/pom.xml
index 4d69d54..a3b7b09 100644
--- a/jacoco-maven-plugin.test/it/it-check-fails-no-halt/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-check-fails-no-halt/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-fails-no-halt/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-check-fails-no-halt/src/main/java/Example.java
index f1db2b8..ae29e59 100644
--- a/jacoco-maven-plugin.test/it/it-check-fails-no-halt/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-check-fails-no-halt/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-fails-no-halt/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-check-fails-no-halt/src/test/java/ExampleTest.java
index 2babeb3..ac41129 100644
--- a/jacoco-maven-plugin.test/it/it-check-fails-no-halt/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-check-fails-no-halt/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-fails-no-halt/verify.bsh b/jacoco-maven-plugin.test/it/it-check-fails-no-halt/verify.bsh
index 3f14501..f1934b5 100644
--- a/jacoco-maven-plugin.test/it/it-check-fails-no-halt/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-check-fails-no-halt/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-passes/pom.xml b/jacoco-maven-plugin.test/it/it-check-passes/pom.xml
index 19d6b5d..9a75755 100644
--- a/jacoco-maven-plugin.test/it/it-check-passes/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-check-passes/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-passes/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-check-passes/src/main/java/Example.java
index f1db2b8..ae29e59 100644
--- a/jacoco-maven-plugin.test/it/it-check-passes/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-check-passes/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-passes/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-check-passes/src/test/java/ExampleTest.java
index 38fd6a2..0c3d451 100644
--- a/jacoco-maven-plugin.test/it/it-check-passes/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-check-passes/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-check-passes/verify.bsh b/jacoco-maven-plugin.test/it/it-check-passes/verify.bsh
index efed84c..7944e69 100644
--- a/jacoco-maven-plugin.test/it/it-check-passes/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-check-passes/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-customize-agent/pom.xml b/jacoco-maven-plugin.test/it/it-customize-agent/pom.xml
index a31f323..1a175a1 100644
--- a/jacoco-maven-plugin.test/it/it-customize-agent/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-customize-agent/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -26,12 +26,17 @@
     <jacoco.destFile>${project.build.directory}/coverage.exec</jacoco.destFile>
     <jacoco.append>false</jacoco.append>
     <jacoco.exclClassLoaders>sun.reflect.DelegatingClassLoader:MyClassLoader</jacoco.exclClassLoaders>
+    <jacoco.inclBootstrapClasses>true</jacoco.inclBootstrapClasses>
+    <jacoco.inclNoLocationClasses>true</jacoco.inclNoLocationClasses>
     <jacoco.sessionId>session</jacoco.sessionId>
     <jacoco.dumpOnExit>true</jacoco.dumpOnExit>
     <jacoco.output>file</jacoco.output>
     <jacoco.address>localhost</jacoco.address>
     <jacoco.port>9999</jacoco.port>
     <jacoco.classDumpDir>${project.build.directory}/classdumps</jacoco.classDumpDir>
+    <jacoco.jmx>true</jacoco.jmx>
+
+    <jacoco.dataFile>${jacoco.destFile}</jacoco.dataFile>
   </properties>
 
   <build>
@@ -43,6 +48,7 @@
           <execution>
             <goals>
               <goal>prepare-agent</goal>
+              <goal>report</goal>
             </goals>
             <configuration>
               <includes>
diff --git a/jacoco-maven-plugin.test/it/it-customize-agent/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-customize-agent/src/main/java/Example.java
new file mode 100644
index 0000000..59e7052
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-customize-agent/src/main/java/Example.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+public class Example {
+
+  public void sayHello() {
+    System.out.println("Hello world");
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-customize-agent/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-customize-agent/src/test/java/ExampleTest.java
new file mode 100644
index 0000000..4f55900
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-customize-agent/src/test/java/ExampleTest.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+import org.junit.Test;
+
+public class ExampleTest {
+
+  @Test
+  public void test() {
+    new Example().sayHello();
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-customize-agent/verify.bsh b/jacoco-maven-plugin.test/it/it-customize-agent/verify.bsh
index ff68b00..b606a43 100644
--- a/jacoco-maven-plugin.test/it/it-customize-agent/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-customize-agent/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,12 +17,15 @@
     + ",includes=*"
     + ",excludes=java.*:sun.*"
     + ",exclclassloader=sun.reflect.DelegatingClassLoader:MyClassLoader"
+    + ",inclbootstrapclasses=true"
+    + ",inclnolocationclasses=true"
     + ",sessionid=session"
     + ",dumponexit=true"
     + ",output=file"
     + ",address=localhost"
     + ",port=9999"
-    + ",classdumpdir=" + basedir + File.separator + "target" + File.separator + "classdumps";
+    + ",classdumpdir=" + basedir + File.separator + "target" + File.separator + "classdumps"
+    + ",jmx=true";
 
 //backslashes will be escaped
 agentOptions = agentOptions.replace("\\","\\\\");
@@ -36,3 +39,9 @@
 {
     throw new FileNotFoundException( "Could not find generated dump: " + file );
 }
+
+File reportDir = new File( basedir, "target/site/jacoco" );
+if ( !reportDir.isDirectory() )
+{
+    throw new RuntimeException( "Could not find generated report" );
+}
diff --git a/jacoco-maven-plugin.test/it/it-dump/pom.xml b/jacoco-maven-plugin.test/it/it-dump/pom.xml
index eeef1b7..b4728c2 100644
--- a/jacoco-maven-plugin.test/it/it-dump/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-dump/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-dump/src/main/java/Server.java b/jacoco-maven-plugin.test/it/it-dump/src/main/java/Server.java
index 370f94f..ddf362f 100644
--- a/jacoco-maven-plugin.test/it/it-dump/src/main/java/Server.java
+++ b/jacoco-maven-plugin.test/it/it-dump/src/main/java/Server.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-dump/verify.bsh b/jacoco-maven-plugin.test/it/it-dump/verify.bsh
index efed84c..7944e69 100644
--- a/jacoco-maven-plugin.test/it/it-dump/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-dump/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-includes-excludes/pom.xml b/jacoco-maven-plugin.test/it/it-includes-excludes/pom.xml
index e700be5..de0c9c4 100644
--- a/jacoco-maven-plugin.test/it/it-includes-excludes/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-includes-excludes/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/DatabaseUtil.java b/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/DatabaseUtil.java
index 284aa20..264bf47 100644
--- a/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/DatabaseUtil.java
+++ b/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/DatabaseUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/FileUtil.java b/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/FileUtil.java
index 62d6292..e35f2c2 100644
--- a/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/FileUtil.java
+++ b/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/FileUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/TestUtil.java b/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/TestUtil.java
index 07c9046..c6f28eb 100644
--- a/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/TestUtil.java
+++ b/jacoco-maven-plugin.test/it/it-includes-excludes/src/main/java/org/project/TestUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-includes-excludes/src/test/java/org/project/TestDatabaseUtil.java b/jacoco-maven-plugin.test/it/it-includes-excludes/src/test/java/org/project/TestDatabaseUtil.java
index 814148a..0b5ad51 100644
--- a/jacoco-maven-plugin.test/it/it-includes-excludes/src/test/java/org/project/TestDatabaseUtil.java
+++ b/jacoco-maven-plugin.test/it/it-includes-excludes/src/test/java/org/project/TestDatabaseUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-includes-excludes/verify.bsh b/jacoco-maven-plugin.test/it/it-includes-excludes/verify.bsh
index d2c88c4..92757e6 100644
--- a/jacoco-maven-plugin.test/it/it-includes-excludes/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-includes-excludes/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-java9/invoker.properties b/jacoco-maven-plugin.test/it/it-java9/invoker.properties
new file mode 100644
index 0000000..750530b
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-java9/invoker.properties
@@ -0,0 +1 @@
+invoker.java.version = 1.9+
diff --git a/jacoco-maven-plugin.test/it/it-java9/pom.xml b/jacoco-maven-plugin.test/it/it-java9/pom.xml
new file mode 100644
index 0000000..5eadbad
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-java9/pom.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Evgeny Mandrikov - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>setup-parent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <relativePath>../setup-parent</relativePath>
+  </parent>
+
+  <artifactId>it-java9</artifactId>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <target>1.9</target>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>prepare-agent</goal>
+              <goal>report</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>check</id>
+            <goals>
+              <goal>check</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <!-- implementation is needed only for Maven 2 -->
+                <rule implementation="org.jacoco.maven.RuleConfiguration">
+                  <limits>
+                    <!-- implementation is needed only for Maven 2 -->
+                    <limit implementation="org.jacoco.report.check.Limit">
+                      <counter>INSTRUCTION</counter>
+                      <value>COVEREDCOUNT</value>
+                      <minimum>8</minimum>
+                      <maximum>8</maximum>
+                    </limit>
+                  </limits>
+                </rule>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-java9/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-java9/src/main/java/Example.java
new file mode 100644
index 0000000..5b45456
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-java9/src/main/java/Example.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+public class Example {
+
+  public void sayHello(String name) {
+    // http://openjdk.java.net/jeps/280
+    System.out.println("Hello, " + name);
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-java9/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-java9/src/test/java/ExampleTest.java
new file mode 100644
index 0000000..a78b458
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-java9/src/test/java/ExampleTest.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+import org.junit.Test;
+
+public class ExampleTest {
+
+  @Test
+  public void test() {
+    new Example().sayHello("test");
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-merge/pom.xml b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-merge/pom.xml
index 059c084..87b19e3 100644
--- a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-merge/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-merge/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/pom.xml b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/pom.xml
index 29cd3ac..d3971b0 100644
--- a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/src/main/java/Example.java
index 891b843..480aca2 100644
--- a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/src/test/java/ExampleTest.java
index 68c0d96..bac494b 100644
--- a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project1/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/pom.xml b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/pom.xml
index 3c0b9b1..a4538da 100644
--- a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/src/main/java/Example.java
index 891b843..480aca2 100644
--- a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/src/test/java/ExampleTest.java
index 68c0d96..bac494b 100644
--- a/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-merge-passes/it-merge-passes-project2/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-merge-passes/pom.xml b/jacoco-maven-plugin.test/it/it-merge-passes/pom.xml
index e941a0e..8d87815 100644
--- a/jacoco-maven-plugin.test/it/it-merge-passes/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-merge-passes/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-merge-passes/verify.bsh b/jacoco-maven-plugin.test/it/it-merge-passes/verify.bsh
index ffa57b7..a714a0a 100644
--- a/jacoco-maven-plugin.test/it/it-merge-passes/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-merge-passes/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multi-module/child-jar-without-sources/pom.xml b/jacoco-maven-plugin.test/it/it-multi-module/child-jar-without-sources/pom.xml
index 4174d53..5c911c5 100644
--- a/jacoco-maven-plugin.test/it/it-multi-module/child-jar-without-sources/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-multi-module/child-jar-without-sources/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multi-module/child/pom.xml b/jacoco-maven-plugin.test/it/it-multi-module/child/pom.xml
index 3b9bf38..2aaddb4 100644
--- a/jacoco-maven-plugin.test/it/it-multi-module/child/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-multi-module/child/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multi-module/child/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-multi-module/child/src/main/java/Example.java
index b38bf60..59e7052 100644
--- a/jacoco-maven-plugin.test/it/it-multi-module/child/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-multi-module/child/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multi-module/child/src/main/java/somepackage/Example.java b/jacoco-maven-plugin.test/it/it-multi-module/child/src/main/java/somepackage/Example.java
index 010f64f..48faaf2 100644
--- a/jacoco-maven-plugin.test/it/it-multi-module/child/src/main/java/somepackage/Example.java
+++ b/jacoco-maven-plugin.test/it/it-multi-module/child/src/main/java/somepackage/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multi-module/child/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-multi-module/child/src/test/java/ExampleTest.java
index ee605f6..4f55900 100644
--- a/jacoco-maven-plugin.test/it/it-multi-module/child/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-multi-module/child/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multi-module/pom.xml b/jacoco-maven-plugin.test/it/it-multi-module/pom.xml
index 37da663..66969e4 100644
--- a/jacoco-maven-plugin.test/it/it-multi-module/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-multi-module/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multi-module/skip-child/pom.xml b/jacoco-maven-plugin.test/it/it-multi-module/skip-child/pom.xml
index 75bdffd..8fad3ba 100644
--- a/jacoco-maven-plugin.test/it/it-multi-module/skip-child/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-multi-module/skip-child/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multi-module/skip-child/src/test/ExampleTest.java b/jacoco-maven-plugin.test/it/it-multi-module/skip-child/src/test/ExampleTest.java
index 9a8347f..73df4bc 100644
--- a/jacoco-maven-plugin.test/it/it-multi-module/skip-child/src/test/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-multi-module/skip-child/src/test/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multi-module/verify.bsh b/jacoco-maven-plugin.test/it/it-multi-module/verify.bsh
index 7662d62..1bfa6d3 100644
--- a/jacoco-maven-plugin.test/it/it-multi-module/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-multi-module/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,7 +13,7 @@
 import org.codehaus.plexus.util.*;
 
 String buildLog = FileUtils.fileRead( new File( basedir, "build.log" ) );
-if ( buildLog.indexOf( "Skipping JaCoCo execution due to missing classes directory:" ) < 0 ) {
+if ( buildLog.indexOf( "Skipping JaCoCo execution due to missing classes directory." ) < 0 ) {
     throw new RuntimeException( "Execution should be skipped when target/classes does not exist." );
 }
 
diff --git a/jacoco-maven-plugin.test/it/it-multiple-executions/pom.xml b/jacoco-maven-plugin.test/it/it-multiple-executions/pom.xml
index 9d6e422..a68f352 100644
--- a/jacoco-maven-plugin.test/it/it-multiple-executions/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-multiple-executions/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multiple-executions/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-multiple-executions/src/main/java/Example.java
index b38bf60..59e7052 100644
--- a/jacoco-maven-plugin.test/it/it-multiple-executions/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-multiple-executions/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multiple-executions/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-multiple-executions/src/test/java/ExampleTest.java
index ee605f6..4f55900 100644
--- a/jacoco-maven-plugin.test/it/it-multiple-executions/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-multiple-executions/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-multiple-executions/verify.bsh b/jacoco-maven-plugin.test/it/it-multiple-executions/verify.bsh
index d7c1944..3b91f65 100644
--- a/jacoco-maven-plugin.test/it/it-multiple-executions/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-multiple-executions/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child-without-main-classes/pom.xml b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child-without-main-classes/pom.xml
index d017899..e2e18db 100644
--- a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child-without-main-classes/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child-without-main-classes/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child-without-main-classes/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child-without-main-classes/src/test/java/ExampleTest.java
index 9a8347f..73df4bc 100644
--- a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child-without-main-classes/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child-without-main-classes/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/pom.xml b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/pom.xml
index a7df69c..9ff1d15 100644
--- a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/main/java/DoNotInstrument.java b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/main/java/DoNotInstrument.java
index b4ef87d..6014925 100644
--- a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/main/java/DoNotInstrument.java
+++ b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/main/java/DoNotInstrument.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/main/java/Example.java
index b38bf60..59e7052 100644
--- a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/test/java/ExampleTest.java
index ee605f6..4f55900 100644
--- a/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-offline-instrumentation/child/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-offline-instrumentation/pom.xml b/jacoco-maven-plugin.test/it/it-offline-instrumentation/pom.xml
index 28bc8de..d0ae6b0 100644
--- a/jacoco-maven-plugin.test/it/it-offline-instrumentation/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-offline-instrumentation/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-offline-instrumentation/verify.bsh b/jacoco-maven-plugin.test/it/it-offline-instrumentation/verify.bsh
index bfe04d3..c76fcd1 100644
--- a/jacoco-maven-plugin.test/it/it-offline-instrumentation/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-offline-instrumentation/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-prepend-property-skip/pom.xml b/jacoco-maven-plugin.test/it/it-prepend-property-skip/pom.xml
new file mode 100644
index 0000000..027abbe
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-prepend-property-skip/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Evgeny Mandrikov - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>setup-parent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>it-prepend-property-skip</artifactId>
+
+  <properties>
+    <argLine>-Dfoo</argLine>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+            <configuration>
+              <skip>true</skip>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-prepend-property-skip/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-prepend-property-skip/src/test/java/ExampleTest.java
new file mode 100644
index 0000000..1c906fc
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-prepend-property-skip/src/test/java/ExampleTest.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+
+public class ExampleTest {
+
+  @Test
+  public void test() {
+    assertNotNull(System.getProperty("foo"));
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-prepend-property/pom.xml b/jacoco-maven-plugin.test/it/it-prepend-property/pom.xml
index 5d0977a..173f6eb 100644
--- a/jacoco-maven-plugin.test/it/it-prepend-property/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-prepend-property/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-prepend-property/verify.bsh b/jacoco-maven-plugin.test/it/it-prepend-property/verify.bsh
index 37b3707..ab0a7ff 100644
--- a/jacoco-maven-plugin.test/it/it-prepend-property/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-prepend-property/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child1/pom.xml b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child1/pom.xml
new file mode 100644
index 0000000..412c70a
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child1/pom.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Marc R. Hoffmann, Jan Wloka - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>it-report-aggregate-customization</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>child1</artifactId>
+  <packaging>jar</packaging>
+
+  <properties>
+    <jacoco.destFile>target/child1.coverage</jacoco.destFile>
+  </properties>
+
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child1/src/main/java/package1/Example1.java b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child1/src/main/java/package1/Example1.java
new file mode 100644
index 0000000..8e15cfc
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child1/src/main/java/package1/Example1.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package package1;
+
+public class Example1 {
+
+  public void a() {
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child1/src/test/java/package1/Example1Test.java b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child1/src/test/java/package1/Example1Test.java
new file mode 100644
index 0000000..d99dafd
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child1/src/test/java/package1/Example1Test.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package package1;
+
+import org.junit.Test;
+
+public class Example1Test {
+
+  @Test
+  public void test() {
+    new Example1().a();
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child2/pom.xml b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child2/pom.xml
new file mode 100644
index 0000000..848853f
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child2/pom.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Marc R. Hoffmann, Jan Wloka - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>it-report-aggregate-customization</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>child2</artifactId>
+  <packaging>jar</packaging>
+
+  <properties>
+    <jacoco.destFile>target/child2.coverage</jacoco.destFile>
+  </properties>
+
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child2/src/main/java/package2/Example2.java b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child2/src/main/java/package2/Example2.java
new file mode 100644
index 0000000..a26d2cd
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child2/src/main/java/package2/Example2.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package package2;
+
+public class Example2 {
+
+  public void a() {
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child2/src/test/java/package2/Example2Test.java b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child2/src/test/java/package2/Example2Test.java
new file mode 100644
index 0000000..63d1988
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/child2/src/test/java/package2/Example2Test.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package package2;
+
+import org.junit.Test;
+
+public class Example2Test {
+
+  @Test
+  public void test() {
+    new Example2().a();
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate-customization/pom.xml b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/pom.xml
new file mode 100644
index 0000000..d8cb181
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Marc R. Hoffmann, Jan Wloka - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>setup-parent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>it-report-aggregate-customization</artifactId>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>child1</module>
+    <module>child2</module>
+    <module>report</module>
+  </modules>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>prepare-agent</id>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate-customization/report/pom.xml b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/report/pom.xml
new file mode 100644
index 0000000..d04ca33
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/report/pom.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Marc R. Hoffmann, Jan Wloka - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>it-report-aggregate-customization</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>report</artifactId>
+  <name>Aggregate Report</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>child1</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>child2</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>report-aggregate</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>report-aggregate</goal>
+            </goals>
+            <configuration>
+              <dataFileIncludes>
+                <dataFileInclude>target/*.coverage</dataFileInclude>
+              </dataFileIncludes>
+              <dataFileExcludes>
+                <dataFileExclude>target/child2.coverage</dataFileExclude>
+              </dataFileExcludes>
+              <outputDirectory>target/jacoco-aggregate-customization</outputDirectory>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate-customization/verify.bsh b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/verify.bsh
new file mode 100644
index 0000000..d8c83bb
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate-customization/verify.bsh
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+import org.codehaus.plexus.util.*;
+import java.util.regex.*;
+
+String buildLog = FileUtils.fileRead( new File( basedir, "build.log" ) );
+
+// Test customization of dataFileIncludes and dataFileExcludes
+
+if ( !Pattern.compile( "Loading execution data file \\S*child1.target.child1.coverage").matcher( buildLog ).find() ) {
+    throw new RuntimeException( "Execution data from child1 was not loaded." );
+}
+
+if ( Pattern.compile( "Loading execution data file \\S*child2").matcher( buildLog ).find() ) {
+    throw new RuntimeException( "Execution data from child2 was loaded." );
+}
+
+// Test customization of outputDirectory
+
+File reportChild1 = new File( basedir, "report/target/jacoco-aggregate-customization/child1/index.html" );
+if ( !reportChild1.isFile() ) {
+    throw new RuntimeException( "Report for child1 was not created." );
+}
+
+File reportChild2 = new File( basedir, "report/target/jacoco-aggregate-customization/child2/index.html" );
+if ( !reportChild2.isFile() ) {
+    throw new RuntimeException( "Report for child2 was not created." );
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/child1-test/pom.xml b/jacoco-maven-plugin.test/it/it-report-aggregate/child1-test/pom.xml
new file mode 100644
index 0000000..54a76a0
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/child1-test/pom.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Marc R. Hoffmann, Jan Wloka - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>it-report-aggregate</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>child1-test</artifactId>
+  <packaging>jar</packaging>
+
+  <dependencies>
+    <dependency>
+      <groupId>jacoco</groupId>
+      <artifactId>child1</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+  
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/child1-test/src/test/java/package1/Example1bTest.java b/jacoco-maven-plugin.test/it/it-report-aggregate/child1-test/src/test/java/package1/Example1bTest.java
new file mode 100644
index 0000000..e543c7e
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/child1-test/src/test/java/package1/Example1bTest.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package package1;
+
+import org.junit.Test;
+
+public class Example1bTest {
+
+  @Test
+  public void test() {
+    new Example1b().b();
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/child1/pom.xml b/jacoco-maven-plugin.test/it/it-report-aggregate/child1/pom.xml
new file mode 100644
index 0000000..df59041
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/child1/pom.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Marc R. Hoffmann, Jan Wloka - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>it-report-aggregate</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>child1</artifactId>
+  <packaging>jar</packaging>
+  
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/child1/src/main/java/package1/Example1a.java b/jacoco-maven-plugin.test/it/it-report-aggregate/child1/src/main/java/package1/Example1a.java
new file mode 100644
index 0000000..8b6de60
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/child1/src/main/java/package1/Example1a.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package package1;
+
+public class Example1a {
+
+  public void a() {
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/child1/src/main/java/package1/Example1b.java b/jacoco-maven-plugin.test/it/it-report-aggregate/child1/src/main/java/package1/Example1b.java
new file mode 100644
index 0000000..0f4ceb4
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/child1/src/main/java/package1/Example1b.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package package1;
+
+public class Example1b {
+
+  public void b() {
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/child1/src/test/java/package1/Example1aTest.java b/jacoco-maven-plugin.test/it/it-report-aggregate/child1/src/test/java/package1/Example1aTest.java
new file mode 100644
index 0000000..abf0b67
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/child1/src/test/java/package1/Example1aTest.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package package1;
+
+import org.junit.Test;
+
+public class Example1aTest {
+
+  @Test
+  public void test() {
+    new Example1a().a();
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/child2/pom.xml b/jacoco-maven-plugin.test/it/it-report-aggregate/child2/pom.xml
new file mode 100644
index 0000000..72aa2c1
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/child2/pom.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Marc R. Hoffmann, Jan Wloka - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>it-report-aggregate</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>child2</artifactId>
+  <packaging>jar</packaging>
+  
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/child2/src/main/java/package2/Example2.java b/jacoco-maven-plugin.test/it/it-report-aggregate/child2/src/main/java/package2/Example2.java
new file mode 100644
index 0000000..a26d2cd
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/child2/src/main/java/package2/Example2.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package package2;
+
+public class Example2 {
+
+  public void a() {
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/child2/src/test/java/package2/Example2Test.java b/jacoco-maven-plugin.test/it/it-report-aggregate/child2/src/test/java/package2/Example2Test.java
new file mode 100644
index 0000000..63d1988
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/child2/src/test/java/package2/Example2Test.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package package2;
+
+import org.junit.Test;
+
+public class Example2Test {
+
+  @Test
+  public void test() {
+    new Example2().a();
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/pom.xml b/jacoco-maven-plugin.test/it/it-report-aggregate/pom.xml
new file mode 100644
index 0000000..080ae97
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Marc R. Hoffmann, Jan Wloka - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>setup-parent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>it-report-aggregate</artifactId>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>child1</module>
+    <module>child1-test</module>
+    <module>child2</module>
+    <module>report</module>
+  </modules>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>prepare-agent</id>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/report/pom.xml b/jacoco-maven-plugin.test/it/it-report-aggregate/report/pom.xml
new file mode 100644
index 0000000..4abfd4b
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/report/pom.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+
+   Contributors:
+      Marc R. Hoffmann, Jan Wloka - initial API and implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>jacoco</groupId>
+    <artifactId>it-report-aggregate</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>report</artifactId>
+  <name>Aggregate Report</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>jacoco</groupId>
+      <artifactId>child1</artifactId>
+      <version>${project.version}</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>jacoco</groupId>
+      <artifactId>child1-test</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>jacoco</groupId>
+      <artifactId>child2</artifactId>
+      <version>${project.version}</version>
+      <scope>runtime</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>report-aggregate</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>report-aggregate</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/report/src/test/java/packagereport/ReportTest.java b/jacoco-maven-plugin.test/it/it-report-aggregate/report/src/test/java/packagereport/ReportTest.java
new file mode 100644
index 0000000..8ea4f4e
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/report/src/test/java/packagereport/ReportTest.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann - initial API and implementation
+ *
+ *******************************************************************************/
+package packagereport;
+
+import org.junit.Test;
+
+public class ReportTest {
+
+  @Test
+  public void test() {
+  }
+
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-aggregate/verify.bsh b/jacoco-maven-plugin.test/it/it-report-aggregate/verify.bsh
new file mode 100644
index 0000000..be3619f
--- /dev/null
+++ b/jacoco-maven-plugin.test/it/it-report-aggregate/verify.bsh
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+import org.codehaus.plexus.util.*;
+import java.util.regex.*;
+
+String buildLog = FileUtils.fileRead( new File( basedir, "build.log" ) );
+
+if ( !Pattern.compile( "Loading execution data file \\S*child1.target.jacoco.exec").matcher( buildLog ).find() ) {
+    throw new RuntimeException( "Execution data from child1 was not loaded." );
+}
+
+if ( !Pattern.compile( "Loading execution data file \\S*child1-test.target.jacoco.exec").matcher( buildLog ).find() ) {
+    throw new RuntimeException( "Execution data from child1-test was not loaded." );
+}
+
+if ( !Pattern.compile( "Loading execution data file \\S*child2.target.jacoco.exec").matcher( buildLog ).find() ) {
+    throw new RuntimeException( "Execution data from child2 was not loaded." );
+}
+
+if ( !Pattern.compile( "Loading execution data file \\S*report.target.jacoco.exec").matcher( buildLog ).find() ) {
+    throw new RuntimeException( "Execution data from report was not loaded." );
+}
+
+File reportChild1 = new File( basedir, "report/target/site/jacoco-aggregate/child1/index.html" );
+if ( !reportChild1.isFile() ) {
+    throw new RuntimeException( "Report for child1 was not created." );
+}
+
+File reportChild1test = new File( basedir, "report/target/site/jacoco-aggregate/child1-test/index.html" );
+if ( reportChild1test.isFile() ) {
+    throw new RuntimeException( "Report for child1-test should not be created." );
+}
+
+File reportChild2 = new File( basedir, "report/target/site/jacoco-aggregate/child2/index.html" );
+if ( !reportChild2.isFile() ) {
+    throw new RuntimeException( "Report for child2 was not created." );
+}
diff --git a/jacoco-maven-plugin.test/it/it-report-nomatch/pom.xml b/jacoco-maven-plugin.test/it/it-report-nomatch/pom.xml
index 2012948..4330aec 100644
--- a/jacoco-maven-plugin.test/it/it-report-nomatch/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-report-nomatch/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-report-nomatch/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-report-nomatch/src/main/java/Example.java
index 5996305..8a57c88 100644
--- a/jacoco-maven-plugin.test/it/it-report-nomatch/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-report-nomatch/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-report-nomatch/verify.bsh b/jacoco-maven-plugin.test/it/it-report-nomatch/verify.bsh
index 2296b1a..c92a898 100644
--- a/jacoco-maven-plugin.test/it/it-report-nomatch/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-report-nomatch/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-report-unreadable-dump/pom.xml b/jacoco-maven-plugin.test/it/it-report-unreadable-dump/pom.xml
index 95c0095..2c09ee7 100644
--- a/jacoco-maven-plugin.test/it/it-report-unreadable-dump/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-report-unreadable-dump/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-report-unreadable-dump/verify.bsh b/jacoco-maven-plugin.test/it/it-report-unreadable-dump/verify.bsh
index dc81874..edab9a3 100644
--- a/jacoco-maven-plugin.test/it/it-report-unreadable-dump/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-report-unreadable-dump/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,6 +13,6 @@
 import org.codehaus.plexus.util.*;
 
 String buildLog = FileUtils.fileRead( new File( basedir, "build.log" ) );
-if ( buildLog.indexOf( "Unable to read execution data file" ) < 0 ) {
+if ( buildLog.indexOf( "Invalid execution data file." ) < 0 ) {
     throw new RuntimeException( "Error was not printed" );
 }
diff --git a/jacoco-maven-plugin.test/it/it-report-without-debug/pom.xml b/jacoco-maven-plugin.test/it/it-report-without-debug/pom.xml
index c3bc961..c8b95f9 100644
--- a/jacoco-maven-plugin.test/it/it-report-without-debug/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-report-without-debug/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-report-without-debug/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-report-without-debug/src/main/java/Example.java
index b38bf60..59e7052 100644
--- a/jacoco-maven-plugin.test/it/it-report-without-debug/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-report-without-debug/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-report-without-debug/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-report-without-debug/src/test/java/ExampleTest.java
index ee605f6..4f55900 100644
--- a/jacoco-maven-plugin.test/it/it-report-without-debug/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-report-without-debug/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-report-without-debug/verify.bsh b/jacoco-maven-plugin.test/it/it-report-without-debug/verify.bsh
index eea349a..bead13f 100644
--- a/jacoco-maven-plugin.test/it/it-report-without-debug/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-report-without-debug/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-report-without-dump/pom.xml b/jacoco-maven-plugin.test/it/it-report-without-dump/pom.xml
index 63f5386..3764f79 100644
--- a/jacoco-maven-plugin.test/it/it-report-without-dump/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-report-without-dump/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-report-without-dump/verify.bsh b/jacoco-maven-plugin.test/it/it-report-without-dump/verify.bsh
index bd41613..9cd9a6e 100644
--- a/jacoco-maven-plugin.test/it/it-report-without-dump/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-report-without-dump/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-site-failsafe/pom.xml b/jacoco-maven-plugin.test/it/it-site-failsafe/pom.xml
index a278932..464a810 100644
--- a/jacoco-maven-plugin.test/it/it-site-failsafe/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-site-failsafe/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-site-failsafe/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-site-failsafe/src/main/java/Example.java
index 08ed108..3a9d445 100644
--- a/jacoco-maven-plugin.test/it/it-site-failsafe/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-site-failsafe/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-site-failsafe/src/test/java/ExampleIT.java b/jacoco-maven-plugin.test/it/it-site-failsafe/src/test/java/ExampleIT.java
index 7cd48aa..5730e71 100644
--- a/jacoco-maven-plugin.test/it/it-site-failsafe/src/test/java/ExampleIT.java
+++ b/jacoco-maven-plugin.test/it/it-site-failsafe/src/test/java/ExampleIT.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-site-failsafe/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-site-failsafe/src/test/java/ExampleTest.java
index ee605f6..4f55900 100644
--- a/jacoco-maven-plugin.test/it/it-site-failsafe/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-site-failsafe/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-site-failsafe/verify.bsh b/jacoco-maven-plugin.test/it/it-site-failsafe/verify.bsh
index f0c4ca5..7a37a55 100644
--- a/jacoco-maven-plugin.test/it/it-site-failsafe/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-site-failsafe/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,7 +13,7 @@
 import org.codehaus.plexus.util.*;
 
 String projectReportsPage = FileUtils.fileRead( new File( basedir, "target/site/project-reports.html" ) );
-if ( projectReportsPage.indexOf( "JaCoCo Test Coverage Report." ) < 0 ) {
+if ( projectReportsPage.indexOf( "JaCoCo Coverage Report." ) < 0 ) {
     throw new RuntimeException( "project-reports.html does not contain link to JaCoCo report" );
 }
 
diff --git a/jacoco-maven-plugin.test/it/it-site/pom.xml b/jacoco-maven-plugin.test/it/it-site/pom.xml
index f131e41..13bb566 100644
--- a/jacoco-maven-plugin.test/it/it-site/pom.xml
+++ b/jacoco-maven-plugin.test/it/it-site/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-site/src/main/java/Example.java b/jacoco-maven-plugin.test/it/it-site/src/main/java/Example.java
index b38bf60..59e7052 100644
--- a/jacoco-maven-plugin.test/it/it-site/src/main/java/Example.java
+++ b/jacoco-maven-plugin.test/it/it-site/src/main/java/Example.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-site/src/test/java/ExampleTest.java b/jacoco-maven-plugin.test/it/it-site/src/test/java/ExampleTest.java
index ee605f6..4f55900 100644
--- a/jacoco-maven-plugin.test/it/it-site/src/test/java/ExampleTest.java
+++ b/jacoco-maven-plugin.test/it/it-site/src/test/java/ExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/it-site/verify.bsh b/jacoco-maven-plugin.test/it/it-site/verify.bsh
index afcaabf..b66e6f1 100644
--- a/jacoco-maven-plugin.test/it/it-site/verify.bsh
+++ b/jacoco-maven-plugin.test/it/it-site/verify.bsh
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,7 +13,7 @@
 import org.codehaus.plexus.util.*;
 
 String projectReportsPage = FileUtils.fileRead( new File( basedir, "target/site/project-reports.html" ) );
-if ( projectReportsPage.indexOf( "JaCoCo Test Coverage Report." ) < 0 ) {
+if ( projectReportsPage.indexOf( "JaCoCo Coverage Report." ) < 0 ) {
     throw new RuntimeException( "project-reports.html does not contain link to JaCoCo report" );
 }
 
diff --git a/jacoco-maven-plugin.test/it/settings.xml b/jacoco-maven-plugin.test/it/settings.xml
index 2179a09..70d5acf 100644
--- a/jacoco-maven-plugin.test/it/settings.xml
+++ b/jacoco-maven-plugin.test/it/settings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/it/setup-parent/pom.xml b/jacoco-maven-plugin.test/it/setup-parent/pom.xml
index 3a3071c..1ebfc4d 100644
--- a/jacoco-maven-plugin.test/it/setup-parent/pom.xml
+++ b/jacoco-maven-plugin.test/it/setup-parent/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/jacoco-maven-plugin.test/pom.xml b/jacoco-maven-plugin.test/pom.xml
index 77ebbb2..9fa1e52 100644
--- a/jacoco-maven-plugin.test/pom.xml
+++ b/jacoco-maven-plugin.test/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.tests</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.tests</relativePath>
   </parent>
 
diff --git a/jacoco-maven-plugin/.gitignore b/jacoco-maven-plugin/.gitignore
deleted file mode 100644
index fefebc3..0000000
--- a/jacoco-maven-plugin/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/bin
-/.settings
diff --git a/jacoco-maven-plugin/META-INF/m2e/lifecycle-mapping-metadata.xml b/jacoco-maven-plugin/META-INF/m2e/lifecycle-mapping-metadata.xml
index 976000b..b54196d 100644
--- a/jacoco-maven-plugin/META-INF/m2e/lifecycle-mapping-metadata.xml
+++ b/jacoco-maven-plugin/META-INF/m2e/lifecycle-mapping-metadata.xml
@@ -1,5 +1,5 @@
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -18,6 +18,7 @@
           <goal>merge</goal>
           <goal>report</goal>
           <goal>report-integration</goal>
+          <goal>report-aggregate</goal>
           <goal>check</goal>
           <goal>dump</goal>
           <goal>instrument</goal>
diff --git a/jacoco-maven-plugin/pom.xml b/jacoco-maven-plugin/pom.xml
index e1c7b86..81c00fd 100644
--- a/jacoco-maven-plugin/pom.xml
+++ b/jacoco-maven-plugin/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.build</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.build</relativePath>
   </parent>
 
@@ -44,7 +44,7 @@
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-utils</artifactId>
-      <version>1.5.6</version>
+      <version>3.0.22</version>
     </dependency>
     <dependency>
       <groupId>org.apache.maven.shared</groupId>
@@ -76,6 +76,14 @@
       <groupId>${project.groupId}</groupId>
       <artifactId>org.jacoco.report</artifactId>
     </dependency>
+
+    <dependency>
+      <groupId>org.apache.maven.plugin-tools</groupId>
+      <artifactId>maven-plugin-annotations</artifactId>
+      <version>3.4</version>
+      <!-- annotations are needed only to build the plugin: -->
+      <scope>provided</scope>
+    </dependency>
   </dependencies>
 
   <build>
@@ -106,7 +114,15 @@
         <artifactId>maven-plugin-plugin</artifactId>
         <executions>
           <execution>
+            <id>default-descriptor</id>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>descriptor</goal>
+            </goals>
+          </execution>
+          <execution>
             <id>help-mojo</id>
+            <phase>process-classes</phase>
             <goals>
               <goal>helpmojo</goal>
             </goals>
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/AbstractAgentMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/AbstractAgentMojo.java
index 9dd1230..67f5521 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/AbstractAgentMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/AbstractAgentMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,6 +16,7 @@
 import java.util.Properties;
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.codehaus.plexus.util.StringUtils;
 import org.jacoco.core.runtime.AgentOptions;
 
@@ -39,27 +40,22 @@
 	static final String SUREFIRE_ARG_LINE = "argLine";
 	/**
 	 * Map of plugin artifacts.
-	 * 
-	 * @parameter property="plugin.artifactMap"
-	 * @required
-	 * @readonly
 	 */
+	@Parameter(property = "plugin.artifactMap", required = true, readonly = true)
 	Map<String, Artifact> pluginArtifactMap;
 	/**
 	 * Allows to specify property which will contains settings for JaCoCo Agent.
 	 * If not specified, then "argLine" would be used for "jar" packaging and
 	 * "tycho.testArgLine" for "eclipse-test-plugin".
-	 * 
-	 * @parameter property="jacoco.propertyName"
 	 */
+	@Parameter(property = "jacoco.propertyName")
 	String propertyName;
 	/**
 	 * If set to true and the execution data file already exists, coverage data
 	 * is appended to the existing file. If set to false, an existing execution
 	 * data file will be replaced.
-	 * 
-	 * @parameter property="jacoco.append"
 	 */
+	@Parameter(property = "jacoco.append")
 	Boolean append;
 	/**
 	 * A list of class loader names, that should be excluded from execution
@@ -68,30 +64,31 @@
 	 * special frameworks that conflict with JaCoCo code instrumentation, in
 	 * particular class loaders that do not have access to the Java runtime
 	 * classes.
-	 * 
-	 * @parameter property="jacoco.exclClassLoaders"
 	 */
+	@Parameter(property = "jacoco.exclClassLoaders")
 	String exclClassLoaders;
 	/**
 	 * Specifies whether also classes from the bootstrap classloader should be
 	 * instrumented. Use this feature with caution, it needs heavy
 	 * includes/excludes tuning.
-	 * 
-	 * @parameter property="jacoco.inclBootstrapClasses"
 	 */
+	@Parameter(property = "jacoco.inclBootstrapClasses")
 	Boolean inclBootstrapClasses;
 	/**
+	 * Specifies whether classes without source location should be instrumented.
+	 */
+	@Parameter(property = "jacoco.inclNoLocationClasses")
+	Boolean inclNoLocationClasses;
+	/**
 	 * A session identifier that is written with the execution data. Without
 	 * this parameter a random identifier is created by the agent.
-	 * 
-	 * @parameter property="jacoco.sessionId"
 	 */
+	@Parameter(property = "jacoco.sessionId")
 	String sessionId;
 	/**
 	 * If set to true coverage data will be written on VM shutdown.
-	 * 
-	 * @parameter property="jacoco.dumpOnExit"
 	 */
+	@Parameter(property = "jacoco.dumpOnExit")
 	Boolean dumpOnExit;
 	/**
 	 * Output method to use for writing coverage data. Valid options are:
@@ -105,41 +102,36 @@
 	 * TCP connection.</li>
 	 * <li>none: Do not produce any output.</li>
 	 * </ul>
-	 * 
-	 * @parameter property="jacoco.output"
 	 */
+	@Parameter(property = "jacoco.output")
 	String output;
 	/**
 	 * IP address or hostname to bind to when the output method is tcpserver or
 	 * connect to when the output method is tcpclient. In tcpserver mode the
 	 * value "*" causes the agent to accept connections on any local address.
-	 * 
-	 * @parameter property="jacoco.address"
 	 */
+	@Parameter(property = "jacoco.address")
 	String address;
 	/**
 	 * Port to bind to when the output method is tcpserver or connect to when
 	 * the output method is tcpclient. In tcpserver mode the port must be
 	 * available, which means that if multiple JaCoCo agents should run on the
 	 * same machine, different ports have to be specified.
-	 * 
-	 * @parameter property="jacoco.port"
 	 */
+	@Parameter(property = "jacoco.port")
 	Integer port;
 	/**
 	 * If a directory is specified for this parameter the JaCoCo agent dumps all
 	 * class files it processes to the given location. This can be useful for
 	 * debugging purposes or in case of dynamically created classes for example
 	 * when scripting engines are used.
-	 * 
-	 * @parameter property="jacoco.classDumpDir"
 	 */
+	@Parameter(property = "jacoco.classDumpDir")
 	File classDumpDir;
 	/**
 	 * If set to true the agent exposes functionality via JMX.
-	 * 
-	 * @parameter property="jacoco.jmx"
 	 */
+	@Parameter(property = "jacoco.jmx")
 	Boolean jmx;
 
 	@Override
@@ -157,8 +149,11 @@
 	protected void skipMojo() {
 		final String name = getEffectivePropertyName();
 		final Properties projectProperties = getProject().getProperties();
-		getLog().info(name + " set to empty");
-		projectProperties.setProperty(name, "");
+		final String oldValue = projectProperties.getProperty(name);
+		if (oldValue == null) {
+			getLog().info(name + " set to empty");
+			projectProperties.setProperty(name, "");
+		}
 	}
 
 	File getAgentJarFile() {
@@ -190,6 +185,10 @@
 			agentOptions.setInclBootstrapClasses(inclBootstrapClasses
 					.booleanValue());
 		}
+		if (inclNoLocationClasses != null) {
+			agentOptions.setInclNoLocationClasses(inclNoLocationClasses
+					.booleanValue());
+		}
 		if (sessionId != null) {
 			agentOptions.setSessionId(sessionId);
 		}
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/AbstractJacocoMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/AbstractJacocoMojo.java
index 8c40101..9faf37a 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/AbstractJacocoMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/AbstractJacocoMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,6 +16,7 @@
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 
 /**
@@ -25,35 +26,30 @@
 
 	/**
 	 * Maven project.
-	 * 
-	 * @parameter property="project"
-	 * @readonly
 	 */
+	@Parameter(property = "project", readonly = true)
 	private MavenProject project;
 
 	/**
 	 * A list of class files to include in instrumentation/analysis/reports. May
 	 * use wildcard characters (* and ?). When not specified everything will be
 	 * included.
-	 * 
-	 * @parameter
 	 */
+	@Parameter
 	private List<String> includes;
 
 	/**
 	 * A list of class files to exclude from instrumentation/analysis/reports.
 	 * May use wildcard characters (* and ?). When not specified nothing will be
 	 * excluded.
-	 * 
-	 * @parameter
 	 */
+	@Parameter
 	private List<String> excludes;
 
 	/**
 	 * Flag used to suppress execution.
-	 * 
-	 * @parameter property="jacoco.skip" default-value="false"
 	 */
+	@Parameter(property = "jacoco.skip", defaultValue = "false")
 	private boolean skip;
 
 	public final void execute() throws MojoExecutionException,
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/AbstractReportMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/AbstractReportMojo.java
index 06a180f..6ba19e8 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/AbstractReportMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/AbstractReportMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,34 +11,19 @@
  *******************************************************************************/
 package org.jacoco.maven;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
 import org.apache.maven.doxia.siterenderer.Renderer;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.AbstractMavenReport;
 import org.apache.maven.reporting.MavenReportException;
-import org.jacoco.core.analysis.IBundleCoverage;
-import org.jacoco.core.analysis.ICoverageNode;
-import org.jacoco.core.data.ExecutionDataStore;
-import org.jacoco.core.data.SessionInfoStore;
-import org.jacoco.core.tools.ExecFileLoader;
-import org.jacoco.report.FileMultiReportOutput;
 import org.jacoco.report.IReportGroupVisitor;
 import org.jacoco.report.IReportVisitor;
-import org.jacoco.report.ISourceFileLocator;
-import org.jacoco.report.MultiReportVisitor;
-import org.jacoco.report.csv.CSVFormatter;
-import org.jacoco.report.html.HTMLFormatter;
-import org.jacoco.report.xml.XMLFormatter;
 
 /**
  * Base class for creating a code coverage report for tests of a single project
@@ -48,57 +33,63 @@
 
 	/**
 	 * Encoding of the generated reports.
-	 * 
-	 * @parameter property="project.reporting.outputEncoding"
-	 *            default-value="UTF-8"
 	 */
+	@Parameter(property = "project.reporting.outputEncoding", defaultValue = "UTF-8")
 	String outputEncoding;
+
+	/**
+	 * Name of the root node HTML report pages.
+	 *
+	 * @since 0.7.7
+	 */
+	@Parameter(defaultValue = "${project.name}")
+	String title;
+
+	/**
+	 * Footer text used in HTML report pages.
+	 *
+	 * @since 0.7.7
+	 */
+	@Parameter
+	String footer;
+
 	/**
 	 * Encoding of the source files.
-	 * 
-	 * @parameter property="project.build.sourceEncoding"
-	 *            default-value="UTF-8"
 	 */
+	@Parameter(property = "project.build.sourceEncoding", defaultValue = "UTF-8")
 	String sourceEncoding;
+
 	/**
 	 * A list of class files to include in the report. May use wildcard
 	 * characters (* and ?). When not specified everything will be included.
-	 * 
-	 * @parameter
 	 */
+	@Parameter
 	List<String> includes;
+
 	/**
 	 * A list of class files to exclude from the report. May use wildcard
 	 * characters (* and ?). When not specified nothing will be excluded.
-	 * 
-	 * @parameter
 	 */
+	@Parameter
 	List<String> excludes;
+
 	/**
 	 * Flag used to suppress execution.
-	 * 
-	 * @parameter property="jacoco.skip" default-value="false"
 	 */
+	@Parameter(property = "jacoco.skip", defaultValue = "false")
 	boolean skip;
+
 	/**
 	 * Maven project.
-	 * 
-	 * @parameter property="project"
-	 * @readonly
 	 */
+	@Parameter(property = "project", readonly = true)
 	MavenProject project;
+
 	/**
 	 * Doxia Site Renderer.
-	 * 
-	 * @component
 	 */
+	@Component
 	Renderer siteRenderer;
-	SessionInfoStore sessionInfoStore;
-	ExecutionDataStore executionDataStore;
-
-	public abstract String getOutputName();
-
-	public abstract String getName(final Locale locale);
 
 	public String getDescription(final Locale locale) {
 		return getName(locale) + " Coverage Report.";
@@ -138,33 +129,29 @@
 	}
 
 	@Override
-	public abstract void setReportOutputDirectory(
-			final File reportOutputDirectory);
-
-	@Override
 	public boolean canGenerateReport() {
 		if (skip) {
 			getLog().info(
 					"Skipping JaCoCo execution because property jacoco.skip is set.");
 			return false;
 		}
-		if (!getDataFile().exists()) {
+		if (!canGenerateReportRegardingDataFiles()) {
 			getLog().info(
-					"Skipping JaCoCo execution due to missing execution data file:"
-							+ getDataFile());
+					"Skipping JaCoCo execution due to missing execution data file.");
 			return false;
 		}
-		final File classesDirectory = new File(getProject().getBuild()
-				.getOutputDirectory());
-		if (!classesDirectory.exists()) {
+		if (!canGenerateReportRegardingClassesDirectory()) {
 			getLog().info(
-					"Skipping JaCoCo execution due to missing classes directory:"
-							+ classesDirectory);
+					"Skipping JaCoCo execution due to missing classes directory.");
 			return false;
 		}
 		return true;
 	}
 
+	abstract boolean canGenerateReportRegardingDataFiles();
+
+	abstract boolean canGenerateReportRegardingClassesDirectory();
+
 	/**
 	 * This method is called when the report generation is invoked directly as a
 	 * standalone Mojo.
@@ -185,12 +172,12 @@
 	@Override
 	protected void executeReport(final Locale locale)
 			throws MavenReportException {
-		loadExecutionData();
 		try {
-			final IReportVisitor visitor = createVisitor(locale);
-			visitor.visitInfo(sessionInfoStore.getInfos(),
-					executionDataStore.getContents());
-			createReport(visitor);
+			final ReportSupport support = new ReportSupport(getLog());
+			loadExecutionData(support);
+			addFormatters(support, locale);
+			final IReportVisitor visitor = support.initRootVisitor();
+			createReport(visitor, support);
 			visitor.visitEnd();
 		} catch (final IOException e) {
 			throw new MavenReportException("Error while creating report: "
@@ -198,110 +185,13 @@
 		}
 	}
 
-	void loadExecutionData() throws MavenReportException {
-		final ExecFileLoader loader = new ExecFileLoader();
-		try {
-			loader.load(getDataFile());
-		} catch (final IOException e) {
-			throw new MavenReportException(
-					"Unable to read execution data file " + getDataFile()
-							+ ": " + e.getMessage(), e);
-		}
-		sessionInfoStore = loader.getSessionInfoStore();
-		executionDataStore = loader.getExecutionDataStore();
-	}
+	abstract void loadExecutionData(final ReportSupport support)
+			throws IOException;
 
-	void createReport(final IReportGroupVisitor visitor) throws IOException {
-		final FileFilter fileFilter = new FileFilter(this.getIncludes(),
-				this.getExcludes());
-		final BundleCreator creator = new BundleCreator(this.getProject(),
-				fileFilter, getLog());
-		final IBundleCoverage bundle = creator.createBundle(executionDataStore);
-		final SourceFileCollection locator = new SourceFileCollection(
-				getCompileSourceRoots(), sourceEncoding);
-		checkForMissingDebugInformation(bundle);
-		visitor.visitBundle(bundle, locator);
-	}
+	abstract void addFormatters(final ReportSupport support, final Locale locale)
+			throws IOException;
 
-	void checkForMissingDebugInformation(final ICoverageNode node) {
-		if (node.getClassCounter().getTotalCount() > 0
-				&& node.getLineCounter().getTotalCount() == 0) {
-			getLog().warn(
-					"To enable source code annotation class files have to be compiled with debug information.");
-		}
-	}
-
-	IReportVisitor createVisitor(final Locale locale) throws IOException {
-		final List<IReportVisitor> visitors = new ArrayList<IReportVisitor>();
-		getOutputDirectoryFile().mkdirs();
-		final XMLFormatter xmlFormatter = new XMLFormatter();
-		xmlFormatter.setOutputEncoding(outputEncoding);
-		visitors.add(xmlFormatter.createVisitor(new FileOutputStream(new File(
-				getOutputDirectoryFile(), "jacoco.xml"))));
-		final CSVFormatter csvFormatter = new CSVFormatter();
-		csvFormatter.setOutputEncoding(outputEncoding);
-		visitors.add(csvFormatter.createVisitor(new FileOutputStream(new File(
-				getOutputDirectoryFile(), "jacoco.csv"))));
-		final HTMLFormatter htmlFormatter = new HTMLFormatter();
-		htmlFormatter.setOutputEncoding(outputEncoding);
-		htmlFormatter.setLocale(locale);
-		visitors.add(htmlFormatter.createVisitor(new FileMultiReportOutput(
-				getOutputDirectoryFile())));
-		return new MultiReportVisitor(visitors);
-	}
-
-	File resolvePath(final String path) {
-		File file = new File(path);
-		if (!file.isAbsolute()) {
-			file = new File(getProject().getBasedir(), path);
-		}
-		return file;
-	}
-
-	List<File> getCompileSourceRoots() {
-		final List<File> result = new ArrayList<File>();
-		for (final Object path : getProject().getCompileSourceRoots()) {
-			result.add(resolvePath((String) path));
-		}
-		return result;
-	}
-
-	private static class SourceFileCollection implements ISourceFileLocator {
-
-		private final List<File> sourceRoots;
-		private final String encoding;
-
-		public SourceFileCollection(final List<File> sourceRoots,
-				final String encoding) {
-			this.sourceRoots = sourceRoots;
-			this.encoding = encoding;
-		}
-
-		public Reader getSourceFile(final String packageName,
-				final String fileName) throws IOException {
-			final String r;
-			if (packageName.length() > 0) {
-				r = packageName + '/' + fileName;
-			} else {
-				r = fileName;
-			}
-			for (final File sourceRoot : sourceRoots) {
-				final File file = new File(sourceRoot, r);
-				if (file.exists() && file.isFile()) {
-					return new InputStreamReader(new FileInputStream(file),
-							encoding);
-				}
-			}
-			return null;
-		}
-
-		public int getTabWidth() {
-			return 4;
-		}
-	}
-
-	abstract File getDataFile();
-
-	abstract File getOutputDirectoryFile();
+	abstract void createReport(final IReportGroupVisitor visitor,
+			final ReportSupport support) throws IOException;
 
 }
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/AgentITMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/AgentITMojo.java
index e0590c8..7d3c05a 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/AgentITMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/AgentITMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,6 +14,11 @@
 
 import java.io.File;
 
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+
 /**
  * Same as <code>prepare-agent</code>, but provides default values suitable for
  * integration-tests:
@@ -22,21 +27,15 @@
  * <li>different <code>destFile</code></li>
  * </ul>
  * 
- * @phase pre-integration-test
- * @goal prepare-agent-integration
- * @requiresProject true
- * @requiresDependencyResolution runtime
- * @threadSafe
  * @since 0.6.4
  */
+@Mojo(name = "prepare-agent-integration", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST, requiresDependencyResolution = ResolutionScope.RUNTIME, threadSafe = true)
 public class AgentITMojo extends AbstractAgentMojo {
 
 	/**
 	 * Path to the output file for execution data.
-	 * 
-	 * @parameter property="jacoco.destFile"
-	 *            default-value="${project.build.directory}/jacoco-it.exec"
 	 */
+	@Parameter(property = "jacoco.destFile", defaultValue = "${project.build.directory}/jacoco-it.exec")
 	private File destFile;
 
 	/**
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/AgentMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/AgentMojo.java
index 1ff9f24..4b9a23f 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/AgentMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/AgentMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,6 +13,11 @@
 
 import java.io.File;
 
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+
 /**
  * <p>
  * Prepares a property pointing to the JaCoCo runtime agent that can be passed
@@ -26,9 +31,33 @@
  * </ul>
  * 
  * <p>
- * If your project already uses the argLine to configure the
- * surefire-maven-plugin, be sure that argLine defined as a property, rather
- * than as part of the plugin configuration. For example:
+ * If your project already defines VM arguments for test execution, be sure that
+ * they will include property defined by JaCoCo.
+ * </p>
+ *
+ * <p>
+ * One of the ways to do this in case of maven-surefire-plugin - is to use
+ * syntax for <a href="http://maven.apache.org/surefire/maven-surefire-plugin/faq.html#late-property-evaluation">late property evaluation</a>:
+ * </p>
+ * 
+ * <pre>
+ *   &lt;plugin&gt;
+ *     &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
+ *     &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
+ *     &lt;configuration&gt;
+ *       &lt;argLine&gt;@{argLine} -your -extra -arguments&lt;/argLine&gt;
+ *     &lt;/configuration&gt;
+ *   &lt;/plugin&gt;
+ * </pre>
+ * 
+ * <p>
+ * You can define empty property to avoid JVM startup error <code>Could not find or load main class @{argLine}</code>
+ * when using late property evaluation and jacoco-maven-plugin not executed.
+ * </p>
+ * 
+ * <p>
+ * Another way is to define "argLine" as a Maven property rather than
+ * as part of the configuration of maven-surefire-plugin:
  * </p>
  * 
  * <pre>
@@ -40,32 +69,25 @@
  *     &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
  *     &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
  *     &lt;configuration&gt;
- *       &lt;!-- Do not define argLine here! --&gt;
+ *       &lt;!-- no argLine here --&gt;
  *     &lt;/configuration&gt;
  *   &lt;/plugin&gt;
  * </pre>
  * 
- * 
  * <p>
  * Resulting coverage information is collected during execution and by default
  * written to a file when the process terminates.
  * </p>
  * 
- * @phase initialize
- * @goal prepare-agent
- * @requiresProject true
- * @requiresDependencyResolution runtime
- * @threadSafe
  * @since 0.5.3
  */
+@Mojo(name = "prepare-agent", defaultPhase = LifecyclePhase.INITIALIZE, requiresDependencyResolution = ResolutionScope.RUNTIME, threadSafe = true)
 public class AgentMojo extends AbstractAgentMojo {
 
 	/**
 	 * Path to the output file for execution data.
-	 * 
-	 * @parameter property="jacoco.destFile"
-	 *            default-value="${project.build.directory}/jacoco.exec"
 	 */
+	@Parameter(property = "jacoco.destFile", defaultValue = "${project.build.directory}/jacoco.exec")
 	private File destFile;
 
 	/**
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/BundleCreator.java b/jacoco-maven-plugin/src/org/jacoco/maven/BundleCreator.java
deleted file mode 100644
index 30cafef..0000000
--- a/jacoco-maven-plugin/src/org/jacoco/maven/BundleCreator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Evgeny Mandrikov - initial API and implementation
- *    Kyle Lieber - implementation of CheckMojo
- *
- *******************************************************************************/
-package org.jacoco.maven;
-
-import static java.lang.String.format;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.util.FileUtils;
-import org.jacoco.core.analysis.Analyzer;
-import org.jacoco.core.analysis.CoverageBuilder;
-import org.jacoco.core.analysis.IBundleCoverage;
-import org.jacoco.core.analysis.IClassCoverage;
-import org.jacoco.core.data.ExecutionDataStore;
-
-/**
- * Creates an IBundleCoverage.
- */
-public final class BundleCreator {
-
-	private final MavenProject project;
-	private final FileFilter fileFilter;
-	private final Log log;
-
-	/**
-	 * Construct a new BundleCreator given the MavenProject and FileFilter.
-	 * 
-	 * @param project
-	 *            the MavenProject
-	 * @param fileFilter
-	 *            the FileFilter
-	 * @param log
-	 *            for log output
-	 */
-	public BundleCreator(final MavenProject project,
-			final FileFilter fileFilter, final Log log) {
-		this.project = project;
-		this.fileFilter = fileFilter;
-		this.log = log;
-	}
-
-	/**
-	 * Create an IBundleCoverage for the given ExecutionDataStore.
-	 * 
-	 * @param executionDataStore
-	 *            the execution data.
-	 * @return the coverage data.
-	 * @throws IOException
-	 *             if class files can't be read
-	 */
-	public IBundleCoverage createBundle(
-			final ExecutionDataStore executionDataStore) throws IOException {
-		final CoverageBuilder builder = new CoverageBuilder();
-		final Analyzer analyzer = new Analyzer(executionDataStore, builder);
-		final File classesDir = new File(this.project.getBuild()
-				.getOutputDirectory());
-
-		@SuppressWarnings("unchecked")
-		final List<File> filesToAnalyze = FileUtils.getFiles(classesDir,
-				fileFilter.getIncludes(), fileFilter.getExcludes());
-
-		for (final File file : filesToAnalyze) {
-			analyzer.analyzeAll(file);
-		}
-
-		final IBundleCoverage bundle = builder
-				.getBundle(this.project.getName());
-		logBundleInfo(bundle, builder.getNoMatchClasses());
-
-		return bundle;
-	}
-
-	private void logBundleInfo(final IBundleCoverage bundle,
-			final Collection<IClassCoverage> nomatch) {
-		log.info(format("Analyzed bundle '%s' with %s classes",
-				bundle.getName(),
-				Integer.valueOf(bundle.getClassCounter().getTotalCount())));
-		if (!nomatch.isEmpty()) {
-			log.warn(format(
-					"Classes in bundle '%s' do no match with execution data. "
-							+ "For report generation the same class files must be used as at runtime.",
-					bundle.getName()));
-			for (final IClassCoverage c : nomatch) {
-				log.warn(format("Execution data for class %s does not match.",
-						c.getName()));
-			}
-		}
-	}
-
-}
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/CheckMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/CheckMojo.java
index dbc694c..43cf35f 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/CheckMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/CheckMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -19,25 +19,21 @@
 import java.util.List;
 
 import org.apache.maven.plugin.MojoExecutionException;
-import org.jacoco.core.analysis.IBundleCoverage;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.jacoco.core.analysis.ICoverageNode;
-import org.jacoco.core.data.ExecutionDataStore;
-import org.jacoco.core.tools.ExecFileLoader;
 import org.jacoco.report.IReportVisitor;
 import org.jacoco.report.check.IViolationsOutput;
 import org.jacoco.report.check.Limit;
 import org.jacoco.report.check.Rule;
-import org.jacoco.report.check.RulesChecker;
 
 /**
  * Checks that the code coverage metrics are being met.
  * 
- * @goal check
- * @phase verify
- * @requiresProject true
- * @threadSafe
  * @since 0.6.1
  */
+@Mojo(name = "check", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true)
 public class CheckMojo extends AbstractJacocoMojo implements IViolationsOutput {
 
 	private static final String MSG_SKIPPING = "Skipping JaCoCo execution due to missing execution data file:";
@@ -54,7 +50,19 @@
 	 * If a limit refers to a ratio the range is from 0.0 to 1.0 where the
 	 * number of decimal places will also determine the precision in error
 	 * messages.
+	 * </p>
 	 * 
+	 * <p>
+	 * If not specified the following defaults are assumed:
+	 * </p>
+	 * 
+	 * <ul>
+	 * <li>rule element: BUNDLE</li>
+	 * <li>limit counter: INSTRUCTION</li>
+	 * <li>limit value: COVEREDRATIO</li>
+	 * </ul>
+	 * 
+	 * <p>
 	 * Note that you <b>must</b> use <tt>implementation</tt> hints for
 	 * <tt>rule</tt> and <tt>limit</tt> when using Maven 2, with Maven 3 you do
 	 * not need to specify the attributes.
@@ -109,25 +117,20 @@
 	 *   </rule>
 	 * </rules>}
 	 * </pre>
-	 * 
-	 * @parameter
-	 * @required
 	 */
+	@Parameter(required = true)
 	private List<RuleConfiguration> rules;
 
 	/**
 	 * Halt the build if any of the checks fail.
-	 * 
-	 * @parameter property="jacoco.haltOnFailure" default-value="true"
-	 * @required
 	 */
+	@Parameter(property = "jacoco.haltOnFailure", defaultValue = "true", required = true)
 	private boolean haltOnFailure;
 
 	/**
 	 * File with execution data.
-	 * 
-	 * @parameter default-value="${project.build.directory}/jacoco.exec"
 	 */
+	@Parameter(defaultValue = "${project.build.directory}/jacoco.exec")
 	private File dataFile;
 
 	private boolean violations;
@@ -158,19 +161,22 @@
 	}
 
 	private void executeCheck() throws MojoExecutionException {
-		final IBundleCoverage bundle = loadBundle();
 		violations = false;
 
-		final RulesChecker checker = new RulesChecker();
+		final ReportSupport support = new ReportSupport(getLog());
+
 		final List<Rule> checkerrules = new ArrayList<Rule>();
 		for (final RuleConfiguration r : rules) {
 			checkerrules.add(r.rule);
 		}
-		checker.setRules(checkerrules);
+		support.addRulesChecker(checkerrules, this);
 
-		final IReportVisitor visitor = checker.createVisitor(this);
 		try {
-			visitor.visitBundle(bundle, null);
+			final IReportVisitor visitor = support.initRootVisitor();
+			support.loadExecutionData(dataFile);
+			support.processProject(visitor, getProject(), this.getIncludes(),
+					this.getExcludes());
+			visitor.visitEnd();
 		} catch (final IOException e) {
 			throw new MojoExecutionException(
 					"Error while checking code coverage: " + e.getMessage(), e);
@@ -186,26 +192,6 @@
 		}
 	}
 
-	private IBundleCoverage loadBundle() throws MojoExecutionException {
-		final FileFilter fileFilter = new FileFilter(this.getIncludes(),
-				this.getExcludes());
-		final BundleCreator creator = new BundleCreator(getProject(),
-				fileFilter, getLog());
-		try {
-			final ExecutionDataStore executionData = loadExecutionData();
-			return creator.createBundle(executionData);
-		} catch (final IOException e) {
-			throw new MojoExecutionException(
-					"Error while reading code coverage: " + e.getMessage(), e);
-		}
-	}
-
-	private ExecutionDataStore loadExecutionData() throws IOException {
-		final ExecFileLoader loader = new ExecFileLoader();
-		loader.load(dataFile);
-		return loader.getExecutionDataStore();
-	}
-
 	public void onViolation(final ICoverageNode node, final Rule rule,
 			final Limit limit, final String message) {
 		this.getLog().warn(message);
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/DumpMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/DumpMojo.java
index b834b18..0d7aa3e 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/DumpMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/DumpMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,6 +18,9 @@
 import java.net.InetAddress;
 
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.jacoco.core.tools.ExecDumpClient;
 import org.jacoco.core.tools.ExecFileLoader;
 
@@ -33,66 +36,56 @@
  * resource.
  * </p>
  * 
- * @goal dump
- * @phase post-integration-test
- * @threadSafe
  * @since 0.6.4
  */
+@Mojo(name = "dump", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST, threadSafe = true)
 public class DumpMojo extends AbstractJacocoMojo {
 
 	/**
 	 * Path to the output file for execution data.
-	 * 
-	 * @parameter property="jacoco.destFile"
-	 *            default-value="${project.build.directory}/jacoco.exec"
 	 */
+	@Parameter(property = "jacoco.destFile", defaultValue = "${project.build.directory}/jacoco.exec")
 	private File destFile;
 
 	/**
 	 * If set to true and the execution data file already exists, coverage data
 	 * is appended to the existing file. If set to false, an existing execution
 	 * data file will be replaced.
-	 * 
-	 * @parameter property="jacoco.append" default-value="true"
 	 */
+	@Parameter(property = "jacoco.append", defaultValue = "true")
 	private boolean append;
 
 	/**
 	 * Sets whether execution data should be downloaded from the remote host.
-	 * 
-	 * @parameter property="jacoco.dump" default-value="true"
 	 */
+	@Parameter(property = "jacoco.dump", defaultValue = "true")
 	private boolean dump;
 
 	/**
 	 * Sets whether a reset command should be sent after the execution data has
 	 * been dumped.
-	 * 
-	 * @parameter property="jacoco.reset" default-value="false"
 	 */
+	@Parameter(property = "jacoco.reset", defaultValue = "false")
 	private boolean reset;
 
 	/**
 	 * IP address or hostname to connect to.
-	 * 
-	 * @parameter property="jacoco.address"
 	 */
+	@Parameter(property = "jacoco.address")
 	private String address;
 
 	/**
 	 * Port number to connect to. If multiple JaCoCo agents should run on the
 	 * same machine, different ports have to be specified for the agents.
-	 * 
-	 * @parameter property="jacoco.port" default-value="6300"
 	 */
+	@Parameter(property = "jacoco.port", defaultValue = "6300")
 	private int port;
 
 	/**
 	 * Number of retries which the goal will attempt to establish a connection.
 	 * This can be used to wait until the target JVM is successfully launched.
-	 * 
-	 * @parameter property="jacoco.retryCount" default-value="10"
 	 */
+	@Parameter(property = "jacoco.retryCount", defaultValue = "10")
 	private int retryCount;
 
 	@Override
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/FileFilter.java b/jacoco-maven-plugin/src/org/jacoco/maven/FileFilter.java
index 5f68d79..0952d74 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/FileFilter.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/FileFilter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -45,6 +45,20 @@
 	}
 
 	/**
+	 * Returns a list of file names.
+	 * 
+	 * @param directory
+	 *            the directory to scan
+	 * @return a list of files
+	 * @throws IOException
+	 *             if file system access fails
+	 */
+	public List<String> getFileNames(final File directory) throws IOException {
+		return FileUtils.getFileNames(directory, getIncludes(), getExcludes(),
+				false);
+	}
+
+	/**
 	 * Returns a list of files.
 	 * 
 	 * @param directory
@@ -53,10 +67,8 @@
 	 * @throws IOException
 	 *             if file system access fails
 	 */
-	@SuppressWarnings("unchecked")
-	public List<String> getFileNames(final File directory) throws IOException {
-		return FileUtils.getFileNames(directory, getIncludes(), getExcludes(),
-				false);
+	public List<File> getFiles(final File directory) throws IOException {
+		return FileUtils.getFiles(directory, getIncludes(), getExcludes());
 	}
 
 	/**
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/InstrumentMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/InstrumentMojo.java
index d54e38a..384ce86 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/InstrumentMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/InstrumentMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -21,6 +21,8 @@
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
 import org.jacoco.core.instr.Instrumenter;
@@ -37,12 +39,9 @@
  * offline instrumentation before using this mode.
  * </p>
  * 
- * @phase process-classes
- * @goal instrument
- * @requiresProject true
- * @threadSafe
  * @since 0.6.2
  */
+@Mojo(name = "instrument", defaultPhase = LifecyclePhase.PROCESS_CLASSES, threadSafe = true)
 public class InstrumentMojo extends AbstractJacocoMojo {
 
 	@Override
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/MergeMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/MergeMojo.java
index 243b455..a73b2fe 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/MergeMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/MergeMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,6 +17,9 @@
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.shared.model.fileset.FileSet;
 import org.apache.maven.shared.model.fileset.util.FileSetManager;
 import org.jacoco.core.tools.ExecFileLoader;
@@ -24,22 +27,17 @@
 /**
  * Mojo for merging a set of execution data files (*.exec) into a single file
  * 
- * @phase generate-resources
- * @goal merge
- * @requiresProject true
- * @threadSafe
  * @since 0.6.4
  */
+@Mojo(name = "merge", defaultPhase = LifecyclePhase.GENERATE_RESOURCES, threadSafe = true)
 public class MergeMojo extends AbstractJacocoMojo {
 
 	private static final String MSG_SKIPPING = "Skipping JaCoCo merge execution due to missing execution data files";
 
 	/**
 	 * Path to the output file for execution data.
-	 * 
-	 * @parameter property="jacoco.destFile"
-	 *            default-value="${project.build.directory}/jacoco.exec"
 	 */
+	@Parameter(property = "jacoco.destFile", defaultValue = "${project.build.directory}/jacoco.exec")
 	private File destFile;
 
 	/**
@@ -52,7 +50,7 @@
 	 * <code>
 	 * &lt;fileSets&gt;
 	 *   &lt;fileSet implementation="org.apache.maven.shared.model.fileset.FileSet"&gt;
-	 *     &lt;directory&gt;${project.parent.build.directory}&lt;/directory&gt;
+	 *     &lt;directory&gt;${project.build.directory}&lt;/directory&gt;
 	 *     &lt;includes&gt;
 	 *       &lt;include&gt;*.exec&lt;/include&gt;
 	 *     &lt;/includes&gt;
@@ -60,10 +58,8 @@
 	 * &lt;/fileSets&gt;
 	 * </code>
 	 * </pre>
-	 * 
-	 * @parameter property="jacoco.fileSets"
-	 * @required
 	 */
+	@Parameter(property = "jacoco.fileSets", required = true)
 	private List<FileSet> fileSets;
 
 	@Override
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/ReportAggregateMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/ReportAggregateMojo.java
new file mode 100644
index 0000000..abd9a04
--- /dev/null
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/ReportAggregateMojo.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    John Oliver, Marc R. Hoffmann, Jan Wloka - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.maven;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.MavenProject;
+import org.jacoco.report.IReportGroupVisitor;
+
+/**
+ * <p>
+ * Creates a structured code coverage report (HTML, XML, and CSV) from multiple
+ * projects within reactor. The report is created from all modules this project
+ * depends on. From those projects class and source files as well as JaCoCo
+ * execution data files will be collected. In addition execution data is
+ * collected from the project itself. This also allows to create coverage
+ * reports when tests are in separate projects than the code under test, for
+ * example in case of integration tests.
+ * </p>
+ * 
+ * <p>
+ * Using the dependency scope allows to distinguish projects which contribute
+ * execution data but should not become part of the report:
+ * </p>
+ * 
+ * <ul>
+ * <li><code>compile</code>, <code>runtime</code>: Project source and execution
+ * data is included in the report.</li>
+ * <li><code>test</code>: Only execution data is considered for the report.</li>
+ * </ul>
+ * 
+ * @since 0.7.7
+ */
+@Mojo(name = "report-aggregate", threadSafe = true)
+public class ReportAggregateMojo extends AbstractReportMojo {
+
+	/**
+	 * A list of execution data files to include in the report from each
+	 * project. May use wildcard characters (* and ?). When not specified all
+	 * *.exec files from the target folder will be included.
+	 */
+	@Parameter
+	List<String> dataFileIncludes;
+
+	/**
+	 * A list of execution data files to exclude from the report. May use
+	 * wildcard characters (* and ?). When not specified nothing will be
+	 * excluded.
+	 */
+	@Parameter
+	List<String> dataFileExcludes;
+
+	/**
+	 * Output directory for the reports. Note that this parameter is only
+	 * relevant if the goal is run from the command line or from the default
+	 * build lifecycle. If the goal is run indirectly as part of a site
+	 * generation, the output directory configured in the Maven Site Plugin is
+	 * used instead.
+	 */
+	@Parameter(defaultValue = "${project.reporting.outputDirectory}/jacoco-aggregate")
+	private File outputDirectory;
+
+	/**
+	 * The projects in the reactor.
+	 */
+	@Parameter(property = "reactorProjects", readonly = true)
+	private List<MavenProject> reactorProjects;
+
+	@Override
+	boolean canGenerateReportRegardingDataFiles() {
+		return true;
+	}
+
+	@Override
+	boolean canGenerateReportRegardingClassesDirectory() {
+		return true;
+	}
+
+	@Override
+	void loadExecutionData(final ReportSupport support) throws IOException {
+		// https://issues.apache.org/jira/browse/MNG-5440
+		if (dataFileIncludes == null) {
+			dataFileIncludes = Arrays.asList("target/*.exec");
+		}
+
+		final FileFilter filter = new FileFilter(dataFileIncludes,
+				dataFileExcludes);
+		loadExecutionData(support, filter, getProject().getBasedir());
+		for (final MavenProject dependency : findDependencies(
+				Artifact.SCOPE_COMPILE, Artifact.SCOPE_RUNTIME,
+				Artifact.SCOPE_TEST)) {
+			loadExecutionData(support, filter, dependency.getBasedir());
+		}
+	}
+
+	private void loadExecutionData(final ReportSupport support,
+			final FileFilter filter, final File basedir) throws IOException {
+		for (final File execFile : filter.getFiles(basedir)) {
+			support.loadExecutionData(execFile);
+		}
+	}
+
+	@Override
+	void addFormatters(final ReportSupport support, final Locale locale)
+			throws IOException {
+		support.addAllFormatters(outputDirectory, outputEncoding, footer,
+				locale);
+	}
+
+	@Override
+	void createReport(final IReportGroupVisitor visitor,
+			final ReportSupport support) throws IOException {
+		final IReportGroupVisitor group = visitor.visitGroup(title);
+		for (final MavenProject dependency : findDependencies(
+				Artifact.SCOPE_COMPILE, Artifact.SCOPE_RUNTIME)) {
+			support.processProject(group, dependency.getArtifactId(),
+					dependency, getIncludes(), getExcludes(), sourceEncoding);
+		}
+	}
+
+	@Override
+	protected String getOutputDirectory() {
+		return outputDirectory.getAbsolutePath();
+	}
+
+	@Override
+	public void setReportOutputDirectory(final File reportOutputDirectory) {
+		if (reportOutputDirectory != null
+				&& !reportOutputDirectory.getAbsolutePath().endsWith(
+						"jacoco-aggregate")) {
+			outputDirectory = new File(reportOutputDirectory,
+					"jacoco-aggregate");
+		} else {
+			outputDirectory = reportOutputDirectory;
+		}
+	}
+
+	public String getOutputName() {
+		return "jacoco-aggregate/index";
+	}
+
+	public String getName(final Locale locale) {
+		return "JaCoCo Aggregate";
+	}
+
+	private List<MavenProject> findDependencies(final String... scopes) {
+		final List<MavenProject> result = new ArrayList<MavenProject>();
+		final List<String> scopeList = Arrays.asList(scopes);
+		for (final Object dependencyObject : getProject().getDependencies()) {
+			final Dependency dependency = (Dependency) dependencyObject;
+			if (scopeList.contains(dependency.getScope())) {
+				final MavenProject project = findProjectFromReactor(dependency);
+				if (project != null) {
+					result.add(project);
+				}
+			}
+		}
+		return result;
+	}
+
+	private MavenProject findProjectFromReactor(final Dependency d) {
+		for (final MavenProject p : reactorProjects) {
+			if (p.getGroupId().equals(d.getGroupId())
+					&& p.getArtifactId().equals(d.getArtifactId())
+					&& p.getVersion().equals(d.getVersion())) {
+				return p;
+			}
+		}
+		return null;
+	}
+
+}
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/ReportITMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/ReportITMojo.java
index e120e6c..e5f28f4 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/ReportITMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/ReportITMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,8 +13,14 @@
 package org.jacoco.maven;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.Locale;
 
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.jacoco.report.IReportGroupVisitor;
+
 /**
  * Same as <code>report</code>, but provides default values suitable for
  * integration-tests:
@@ -23,12 +29,9 @@
  * <li>different <code>dataFile</code></li>
  * </ul>
  * 
- * @phase verify
- * @goal report-integration
- * @requiresProject true
- * @threadSafe
  * @since 0.6.4
  */
+@Mojo(name = "report-integration", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true)
 public class ReportITMojo extends AbstractReportMojo {
 
 	/**
@@ -37,19 +40,46 @@
 	 * build lifecycle. If the goal is run indirectly as part of a site
 	 * generation, the output directory configured in the Maven Site Plugin is
 	 * used instead.
-	 * 
-	 * @parameter default-value="${project.reporting.outputDirectory}/jacoco-it"
 	 */
+	@Parameter(defaultValue = "${project.reporting.outputDirectory}/jacoco-it")
 	private File outputDirectory;
 
 	/**
 	 * File with execution data.
-	 * 
-	 * @parameter default-value="${project.build.directory}/jacoco-it.exec"
 	 */
+	@Parameter(defaultValue = "${project.build.directory}/jacoco-it.exec")
 	private File dataFile;
 
 	@Override
+	boolean canGenerateReportRegardingDataFiles() {
+		return dataFile.exists();
+	}
+
+	@Override
+	boolean canGenerateReportRegardingClassesDirectory() {
+		return new File(getProject().getBuild().getOutputDirectory()).exists();
+	}
+
+	@Override
+	void loadExecutionData(final ReportSupport support) throws IOException {
+		support.loadExecutionData(dataFile);
+	}
+
+	@Override
+	void addFormatters(final ReportSupport support, final Locale locale)
+			throws IOException {
+		support.addAllFormatters(outputDirectory, outputEncoding, footer,
+				locale);
+	}
+
+	@Override
+	void createReport(final IReportGroupVisitor visitor,
+			final ReportSupport support) throws IOException {
+		support.processProject(visitor, title, getProject(), getIncludes(),
+				getExcludes(), sourceEncoding);
+	}
+
+	@Override
 	protected String getOutputDirectory() {
 		return outputDirectory.getAbsolutePath();
 	}
@@ -65,22 +95,10 @@
 		}
 	}
 
-	@Override
-	File getDataFile() {
-		return dataFile;
-	}
-
-	@Override
-	File getOutputDirectoryFile() {
-		return outputDirectory;
-	}
-
-	@Override
 	public String getOutputName() {
 		return "jacoco-it/index";
 	}
 
-	@Override
 	public String getName(final Locale locale) {
 		return "JaCoCo IT";
 	}
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/ReportMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/ReportMojo.java
index b672366..a9ad8df 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/ReportMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/ReportMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,18 +12,21 @@
 package org.jacoco.maven;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.Locale;
 
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.jacoco.report.IReportGroupVisitor;
+
 /**
  * Creates a code coverage report for tests of a single project in multiple
  * formats (HTML, XML, and CSV).
  * 
- * @phase verify
- * @goal report
- * @requiresProject true
- * @threadSafe
  * @since 0.5.3
  */
+@Mojo(name = "report", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true)
 public class ReportMojo extends AbstractReportMojo {
 
 	/**
@@ -32,19 +35,46 @@
 	 * build lifecycle. If the goal is run indirectly as part of a site
 	 * generation, the output directory configured in the Maven Site Plugin is
 	 * used instead.
-	 * 
-	 * @parameter default-value="${project.reporting.outputDirectory}/jacoco"
 	 */
+	@Parameter(defaultValue = "${project.reporting.outputDirectory}/jacoco")
 	private File outputDirectory;
 
 	/**
 	 * File with execution data.
-	 * 
-	 * @parameter default-value="${project.build.directory}/jacoco.exec"
 	 */
+	@Parameter(property = "jacoco.dataFile", defaultValue = "${project.build.directory}/jacoco.exec")
 	private File dataFile;
 
 	@Override
+	boolean canGenerateReportRegardingDataFiles() {
+		return dataFile.exists();
+	}
+
+	@Override
+	boolean canGenerateReportRegardingClassesDirectory() {
+		return new File(getProject().getBuild().getOutputDirectory()).exists();
+	}
+
+	@Override
+	void loadExecutionData(final ReportSupport support) throws IOException {
+		support.loadExecutionData(dataFile);
+	}
+
+	@Override
+	void addFormatters(final ReportSupport support, final Locale locale)
+			throws IOException {
+		support.addAllFormatters(outputDirectory, outputEncoding, footer,
+				locale);
+	}
+
+	@Override
+	void createReport(final IReportGroupVisitor visitor,
+			final ReportSupport support) throws IOException {
+		support.processProject(visitor, title, getProject(), getIncludes(),
+				getExcludes(), sourceEncoding);
+	}
+
+	@Override
 	protected String getOutputDirectory() {
 		return outputDirectory.getAbsolutePath();
 	}
@@ -59,23 +89,11 @@
 		}
 	}
 
-	@Override
-	File getDataFile() {
-		return dataFile;
-	}
-
-	@Override
-	File getOutputDirectoryFile() {
-		return outputDirectory;
-	}
-
-	@Override
 	public String getOutputName() {
 		return "jacoco/index";
 	}
 
-	@Override
 	public String getName(final Locale locale) {
-		return "JaCoCo Test";
+		return "JaCoCo";
 	}
 }
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/ReportSupport.java b/jacoco-maven-plugin/src/org/jacoco/maven/ReportSupport.java
new file mode 100644
index 0000000..59613f4
--- /dev/null
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/ReportSupport.java
@@ -0,0 +1,294 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *    Kyle Lieber - implementation of CheckMojo
+ *
+ *******************************************************************************/
+package org.jacoco.maven;
+
+import static java.lang.String.format;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.jacoco.core.analysis.Analyzer;
+import org.jacoco.core.analysis.CoverageBuilder;
+import org.jacoco.core.analysis.IBundleCoverage;
+import org.jacoco.core.analysis.IClassCoverage;
+import org.jacoco.core.tools.ExecFileLoader;
+import org.jacoco.report.FileMultiReportOutput;
+import org.jacoco.report.IReportGroupVisitor;
+import org.jacoco.report.IReportVisitor;
+import org.jacoco.report.ISourceFileLocator;
+import org.jacoco.report.MultiReportVisitor;
+import org.jacoco.report.check.IViolationsOutput;
+import org.jacoco.report.check.Rule;
+import org.jacoco.report.check.RulesChecker;
+import org.jacoco.report.csv.CSVFormatter;
+import org.jacoco.report.html.HTMLFormatter;
+import org.jacoco.report.xml.XMLFormatter;
+
+/**
+ * Encapsulates the tasks to create reports for Maven projects. Instances are
+ * supposed to be used in the following sequence:
+ * 
+ * <ol>
+ * <li>Create an instance</li>
+ * <li>Load one or multiple exec files with <code>loadExecutionData()</code></li>
+ * <li>Add one or multiple formatters with <code>addXXX()</code> methods</li>
+ * <li>Create the root visitor with <code>initRootVisitor()</code></li>
+ * <li>Process one or multiple projects with <code>processProject()</code></li>
+ * </ol>
+ */
+final class ReportSupport {
+
+	private final Log log;
+	private final ExecFileLoader loader;
+	private final List<IReportVisitor> formatters;
+
+	/**
+	 * Construct a new instance with the given log output.
+	 * 
+	 * @param log
+	 *            for log output
+	 */
+	public ReportSupport(final Log log) {
+		this.log = log;
+		this.loader = new ExecFileLoader();
+		this.formatters = new ArrayList<IReportVisitor>();
+	}
+
+	/**
+	 * Loads the given execution data file.
+	 * 
+	 * @param execFile
+	 *            execution data file to load
+	 * @throws IOException
+	 *             if the file can't be loaded
+	 */
+	public void loadExecutionData(final File execFile) throws IOException {
+		log.info("Loading execution data file " + execFile);
+		loader.load(execFile);
+	}
+
+	public void addXmlFormatter(final File targetfile, final String encoding)
+			throws IOException {
+		final XMLFormatter xml = new XMLFormatter();
+		xml.setOutputEncoding(encoding);
+		formatters.add(xml.createVisitor(new FileOutputStream(targetfile)));
+	}
+
+	public void addCsvFormatter(final File targetfile, final String encoding)
+			throws IOException {
+		final CSVFormatter csv = new CSVFormatter();
+		csv.setOutputEncoding(encoding);
+		formatters.add(csv.createVisitor(new FileOutputStream(targetfile)));
+	}
+
+	public void addHtmlFormatter(final File targetdir, final String encoding,
+			final String footer, final Locale locale) throws IOException {
+		final HTMLFormatter htmlFormatter = new HTMLFormatter();
+		htmlFormatter.setOutputEncoding(encoding);
+		htmlFormatter.setLocale(locale);
+		if (footer != null) {
+			htmlFormatter.setFooterText(footer);
+		}
+		formatters.add(htmlFormatter.createVisitor(new FileMultiReportOutput(
+				targetdir)));
+	}
+
+	public void addAllFormatters(final File targetdir, final String encoding,
+			final String footer, final Locale locale) throws IOException {
+		targetdir.mkdirs();
+		addXmlFormatter(new File(targetdir, "jacoco.xml"), encoding);
+		addCsvFormatter(new File(targetdir, "jacoco.csv"), encoding);
+		addHtmlFormatter(targetdir, encoding, footer, locale);
+	}
+
+	public void addRulesChecker(final List<Rule> rules,
+			final IViolationsOutput output) {
+		final RulesChecker checker = new RulesChecker();
+		checker.setRules(rules);
+		formatters.add(checker.createVisitor(output));
+	}
+
+	public IReportVisitor initRootVisitor() throws IOException {
+		final IReportVisitor visitor = new MultiReportVisitor(formatters);
+		visitor.visitInfo(loader.getSessionInfoStore().getInfos(), loader
+				.getExecutionDataStore().getContents());
+		return visitor;
+	}
+
+	/**
+	 * Calculates coverage for the given project and emits it to the report
+	 * group without source references
+	 * 
+	 * @param visitor
+	 *            group visitor to emit the project's coverage to
+	 * @param project
+	 *            the MavenProject
+	 * @param includes
+	 *            list of includes patterns
+	 * @param excludes
+	 *            list of excludes patterns
+	 * @throws IOException
+	 *             if class files can't be read
+	 */
+	public void processProject(final IReportGroupVisitor visitor,
+			final MavenProject project, final List<String> includes,
+			final List<String> excludes) throws IOException {
+		processProject(visitor, project.getArtifactId(), project, includes,
+				excludes, new NoSourceLocator());
+	}
+
+	/**
+	 * Calculates coverage for the given project and emits it to the report
+	 * group including source references
+	 * 
+	 * @param visitor
+	 *            group visitor to emit the project's coverage to
+	 * @param bundeName
+	 *            name for this project in the report
+	 * @param project
+	 *            the MavenProject
+	 * @param includes
+	 *            list of includes patterns
+	 * @param excludes
+	 *            list of excludes patterns
+	 * @param srcEncoding
+	 *            encoding of the source files within this project
+	 * @throws IOException
+	 *             if class files can't be read
+	 */
+	public void processProject(final IReportGroupVisitor visitor,
+			final String bundeName, final MavenProject project,
+			final List<String> includes, final List<String> excludes,
+			final String srcEncoding) throws IOException {
+		processProject(visitor, bundeName, project, includes, excludes,
+				new SourceFileCollection(project, srcEncoding));
+	}
+
+	private void processProject(final IReportGroupVisitor visitor,
+			final String bundeName, final MavenProject project,
+			final List<String> includes, final List<String> excludes,
+			final ISourceFileLocator locator) throws IOException {
+		final CoverageBuilder builder = new CoverageBuilder();
+		final File classesDir = new File(project.getBuild()
+				.getOutputDirectory());
+
+		if (classesDir.isDirectory()) {
+			final Analyzer analyzer = new Analyzer(
+					loader.getExecutionDataStore(), builder);
+			final FileFilter filter = new FileFilter(includes, excludes);
+			for (final File file : filter.getFiles(classesDir)) {
+				analyzer.analyzeAll(file);
+			}
+		}
+
+		final IBundleCoverage bundle = builder.getBundle(bundeName);
+		logBundleInfo(bundle, builder.getNoMatchClasses());
+
+		visitor.visitBundle(bundle, locator);
+	}
+
+	private void logBundleInfo(final IBundleCoverage bundle,
+			final Collection<IClassCoverage> nomatch) {
+		log.info(format("Analyzed bundle '%s' with %s classes",
+				bundle.getName(),
+				Integer.valueOf(bundle.getClassCounter().getTotalCount())));
+		if (!nomatch.isEmpty()) {
+			log.warn(format(
+					"Classes in bundle '%s' do no match with execution data. "
+							+ "For report generation the same class files must be used as at runtime.",
+					bundle.getName()));
+			for (final IClassCoverage c : nomatch) {
+				log.warn(format("Execution data for class %s does not match.",
+						c.getName()));
+			}
+		}
+		if (bundle.getClassCounter().getTotalCount() > 0
+				&& bundle.getLineCounter().getTotalCount() == 0) {
+			log.warn("To enable source code annotation class files have to be compiled with debug information.");
+		}
+	}
+
+	private class NoSourceLocator implements ISourceFileLocator {
+
+		public Reader getSourceFile(final String packageName,
+				final String fileName) {
+			return null;
+		}
+
+		public int getTabWidth() {
+			return 0;
+		}
+	}
+
+	private class SourceFileCollection implements ISourceFileLocator {
+
+		private final List<File> sourceRoots;
+		private final String encoding;
+
+		public SourceFileCollection(final MavenProject project,
+				final String encoding) {
+			this.sourceRoots = getCompileSourceRoots(project);
+			this.encoding = encoding;
+		}
+
+		public Reader getSourceFile(final String packageName,
+				final String fileName) throws IOException {
+			final String r;
+			if (packageName.length() > 0) {
+				r = packageName + '/' + fileName;
+			} else {
+				r = fileName;
+			}
+			for (final File sourceRoot : sourceRoots) {
+				final File file = new File(sourceRoot, r);
+				if (file.exists() && file.isFile()) {
+					return new InputStreamReader(new FileInputStream(file),
+							encoding);
+				}
+			}
+			return null;
+		}
+
+		public int getTabWidth() {
+			return 4;
+		}
+	}
+
+	private static List<File> getCompileSourceRoots(final MavenProject project) {
+		final List<File> result = new ArrayList<File>();
+		for (final Object path : project.getCompileSourceRoots()) {
+			result.add(resolvePath(project, (String) path));
+		}
+		return result;
+	}
+
+	private static File resolvePath(final MavenProject project,
+			final String path) {
+		File file = new File(path);
+		if (!file.isAbsolute()) {
+			file = new File(project.getBasedir(), path);
+		}
+		return file;
+	}
+
+}
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/RestoreMojo.java b/jacoco-maven-plugin/src/org/jacoco/maven/RestoreMojo.java
index 4e5a7dc..9880412 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/RestoreMojo.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/RestoreMojo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,17 +16,16 @@
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
 import org.codehaus.plexus.util.FileUtils;
 
 /**
  * Restores original classes as they were before offline instrumentation.
  * 
- * @phase prepare-package
- * @goal restore-instrumented-classes
- * @requiresProject true
- * @threadSafe
  * @since 0.6.2
  */
+@Mojo(name = "restore-instrumented-classes", defaultPhase = LifecyclePhase.PREPARE_PACKAGE, threadSafe = true)
 public class RestoreMojo extends AbstractJacocoMojo {
 
 	@Override
diff --git a/jacoco-maven-plugin/src/org/jacoco/maven/RuleConfiguration.java b/jacoco-maven-plugin/src/org/jacoco/maven/RuleConfiguration.java
index 5544b0a..a54fef5 100644
--- a/jacoco-maven-plugin/src/org/jacoco/maven/RuleConfiguration.java
+++ b/jacoco-maven-plugin/src/org/jacoco/maven/RuleConfiguration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/jacoco/.gitignore b/jacoco/.gitignore
deleted file mode 100644
index ea8c4bf..0000000
--- a/jacoco/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/target
diff --git a/jacoco/assembly.xml b/jacoco/assembly.xml
index a77f5a1..b25483f 100644
--- a/jacoco/assembly.xml
+++ b/jacoco/assembly.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -40,7 +40,7 @@
       </excludes>
     </fileSet>
     <fileSet>
-      <directory>${basedir}/../org.jacoco.doc/target/coverage</directory>
+      <directory>${basedir}/../org.jacoco.doc/target/site/jacoco-aggregate</directory>
       <outputDirectory>/coverage</outputDirectory>
     </fileSet>
     <fileSet>
@@ -91,7 +91,7 @@
       <unpack>true</unpack>
       <useProjectArtifact>false</useProjectArtifact>
       <includes>
-        <include>${project.groupId}:org.jacoco.examples</include>
+        <include>${project.groupId}:org.jacoco.examples:zip</include>
       </includes>
     </dependencySet>
     <dependencySet>
diff --git a/jacoco/pom.xml b/jacoco/pom.xml
index 25ee395..5a1875d 100644
--- a/jacoco/pom.xml
+++ b/jacoco/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.build</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.build</relativePath>
   </parent>
 
@@ -25,10 +25,6 @@
   <name>JaCoCo :: Distribution</name>
   <description>JaCoCo Standalone Distribution</description>
 
-  <properties>
-    <jarsigner.skip>true</jarsigner.skip>
-  </properties>
-
   <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
@@ -108,7 +104,7 @@
             <configuration>
               <rules>
                 <requireFilesSize>
-                  <maxsize>3068000</maxsize>
+                  <maxsize>3500000</maxsize>
                   <minsize>2500000</minsize>
                   <files>
                     <file>${project.build.directory}/jacoco-${qualified.bundle.version}.zip</file>
diff --git a/org.jacoco.agent.rt.test/.gitignore b/org.jacoco.agent.rt.test/.gitignore
deleted file mode 100644
index fefebc3..0000000
--- a/org.jacoco.agent.rt.test/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/bin
-/.settings
diff --git a/org.jacoco.agent.rt.test/build.properties b/org.jacoco.agent.rt.test/build.properties
deleted file mode 100644
index a657887..0000000
--- a/org.jacoco.agent.rt.test/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/

-output.. = bin/

-bin.includes = META-INF/,\

-               .,\

-               about.html

diff --git a/org.jacoco.agent.rt.test/pom.xml b/org.jacoco.agent.rt.test/pom.xml
index 188a81a..33a4e15 100644
--- a/org.jacoco.agent.rt.test/pom.xml
+++ b/org.jacoco.agent.rt.test/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.tests</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.tests</relativePath>
   </parent>
 
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/AgentTest.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/AgentTest.java
index 7ffff2d..b09be51 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/AgentTest.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/AgentTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ClassFileDumperTest.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ClassFileDumperTest.java
index c947ea1..f86c9d3 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ClassFileDumperTest.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ClassFileDumperTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ConfigLoaderTest.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ConfigLoaderTest.java
index 9007876..4e046c6 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ConfigLoaderTest.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ConfigLoaderTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/CoverageTransformerTest.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/CoverageTransformerTest.java
index 68f25fc..6ad24dc 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/CoverageTransformerTest.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/CoverageTransformerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -63,51 +63,25 @@
 	}
 
 	@Test
-	public void testHasSourceLocationNegative1() {
-		CoverageTransformer t = createTransformer();
-		assertFalse(t.hasSourceLocation(null));
-	}
-
-	@Test
-	public void testHasSourceLocationNegative2() {
-		CoverageTransformer t = createTransformer();
-		ProtectionDomain pd = new ProtectionDomain(null, null);
-		assertFalse(t.hasSourceLocation(pd));
-	}
-
-	@Test
-	public void testHasSourceLocationNegative3() {
-		CoverageTransformer t = createTransformer();
-		CodeSource cs = new CodeSource(null, new Certificate[0]);
-		ProtectionDomain pd = new ProtectionDomain(cs, null);
-		assertFalse(t.hasSourceLocation(pd));
-	}
-
-	@Test
-	public void testHasSourceLocationPositive() {
-		CoverageTransformer t = createTransformer();
-		assertTrue(t.hasSourceLocation(protectionDomain));
-	}
-
-	@Test
 	public void testFilterAgentClass() {
 		CoverageTransformer t = createTransformer();
 		assertFalse(t.filter(classLoader,
-				"org/jacoco/agent/rt/internal/somepkg/SomeClass"));
+				"org/jacoco/agent/rt/internal/somepkg/SomeClass",
+				protectionDomain));
 	}
 
 	@Test
-	public void testFilterIncludesBootstrapClassesPositive() {
+	public void testFilterInclBootstrapClassesPositive() {
 		options.setInclBootstrapClasses(true);
 		CoverageTransformer t = createTransformer();
-		assertTrue(t.filter(null, "java/util/TreeSet"));
+		assertTrue(t.filter(null, "java/util/TreeSet", protectionDomain));
 	}
 
 	@Test
-	public void testFilterIncludesBootstrapClassesNegative() {
+	public void testFilterInclBootstrapClassesNegative() {
 		options.setInclBootstrapClasses(false);
 		CoverageTransformer t = createTransformer();
-		assertFalse(t.filter(null, "java/util/TreeSet"));
+		assertFalse(t.filter(null, "java/util/TreeSet", protectionDomain));
 	}
 
 	@Test
@@ -115,7 +89,7 @@
 		options.setInclBootstrapClasses(false);
 		options.setExclClassloader("org.jacoco.agent.SomeWhere$*");
 		CoverageTransformer t = createTransformer();
-		assertTrue(t.filter(classLoader, "org/example/Foo"));
+		assertTrue(t.filter(classLoader, "org/example/Foo", protectionDomain));
 	}
 
 	@Test
@@ -123,7 +97,7 @@
 		options.setInclBootstrapClasses(true);
 		options.setExclClassloader("org.jacoco.agent.SomeWhere$*");
 		CoverageTransformer t = createTransformer();
-		assertTrue(t.filter(classLoader, "org/example/Foo"));
+		assertTrue(t.filter(classLoader, "org/example/Foo", protectionDomain));
 	}
 
 	@Test
@@ -133,7 +107,8 @@
 		CoverageTransformer t = createTransformer();
 		ClassLoader myClassLoader = new ClassLoader(null) {
 		};
-		assertFalse(t.filter(myClassLoader, "org/example/Foo"));
+		assertFalse(t
+				.filter(myClassLoader, "org/example/Foo", protectionDomain));
 	}
 
 	@Test
@@ -143,42 +118,76 @@
 		CoverageTransformer t = createTransformer();
 		ClassLoader myClassLoader = new ClassLoader(null) {
 		};
-		assertFalse(t.filter(myClassLoader, "org/example/Foo"));
+		assertFalse(t
+				.filter(myClassLoader, "org/example/Foo", protectionDomain));
 	}
 
 	@Test
 	public void testFilterIncludedClassPositive() {
 		options.setIncludes("org.jacoco.core.*:org.jacoco.agent.rt.*");
 		CoverageTransformer t = createTransformer();
-		assertTrue(t.filter(classLoader, "org/jacoco/core/Foo"));
+		assertTrue(t.filter(classLoader, "org/jacoco/core/Foo",
+				protectionDomain));
 	}
 
 	@Test
 	public void testFilterIncludedClassNegative() {
 		options.setIncludes("org.jacoco.core.*:org.jacoco.agent.rt.*");
 		CoverageTransformer t = createTransformer();
-		assertFalse(t.filter(classLoader, "org/jacoco/report/Foo"));
+		assertFalse(t.filter(classLoader, "org/jacoco/report/Foo",
+				protectionDomain));
 	}
 
 	@Test
 	public void testFilterExcludedClassPositive() {
 		options.setExcludes("*Test");
 		CoverageTransformer t = createTransformer();
-		assertFalse(t.filter(classLoader, "org/jacoco/core/FooTest"));
+		assertFalse(t.filter(classLoader, "org/jacoco/core/FooTest",
+				protectionDomain));
 	}
 
 	@Test
 	public void testFilterExcludedClassPositiveInner() {
 		options.setExcludes("org.jacoco.example.Foo$Inner");
 		CoverageTransformer t = createTransformer();
-		assertFalse(t.filter(classLoader, "org/jacoco/example/Foo$Inner"));
+		assertFalse(t.filter(classLoader, "org/jacoco/example/Foo$Inner",
+				protectionDomain));
 	}
 
 	@Test
 	public void testFilterExcludedClassNegative() {
 		options.setExcludes("*Test");
 		CoverageTransformer t = createTransformer();
-		assertTrue(t.filter(classLoader, "org/jacoco/core/Foo"));
+		assertTrue(t.filter(classLoader, "org/jacoco/core/Foo",
+				protectionDomain));
+	}
+
+	@Test
+	public void testFilterSourceLocationPositive1() {
+		CoverageTransformer t = createTransformer();
+		assertFalse(t.filter(classLoader, "org/jacoco/core/Foo", null));
+	}
+
+	@Test
+	public void testFilterSourceLocationPositive2() {
+		CoverageTransformer t = createTransformer();
+		ProtectionDomain pd = new ProtectionDomain(null, null);
+		assertFalse(t.filter(classLoader, "org/jacoco/core/Foo", pd));
+	}
+
+	@Test
+	public void testFilterSourceLocationPositive3() {
+		CoverageTransformer t = createTransformer();
+		CodeSource cs = new CodeSource(null, new Certificate[0]);
+		ProtectionDomain pd = new ProtectionDomain(cs, null);
+		assertFalse(t.filter(classLoader, "org/jacoco/core/Foo", pd));
+	}
+
+	@Test
+	public void testFilterSourceLocationNegative() {
+		options.setInclNoLocationClasses(true);
+		CoverageTransformer t = createTransformer();
+		assertTrue(t.filter(classLoader, "org/jacoco/core/Foo", null));
 	}
 
 	@Test
@@ -191,7 +200,7 @@
 	@Test
 	public void testTransformFiltered2() throws IllegalClassFormatException {
 		CoverageTransformer t = createTransformer();
-		assertNull(t.transform(null, "org.jacoco.Sample", null,
+		assertNull(t.transform((ClassLoader) null, "org.jacoco.Sample", null,
 				protectionDomain, new byte[0]));
 	}
 
@@ -203,11 +212,11 @@
 					protectionDomain, null);
 			fail("IllegalClassFormatException expected.");
 		} catch (IllegalClassFormatException e) {
-			assertEquals("Error while instrumenting class org.jacoco.Sample.",
+			assertEquals("Error while instrumenting org.jacoco.Sample.",
 					e.getMessage());
 		}
 		recorder.assertException(IllegalClassFormatException.class,
-				"Error while instrumenting class org.jacoco.Sample.",
+				"Error while instrumenting org.jacoco.Sample.",
 				IOException.class);
 		recorder.clear();
 	}
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ExceptionRecorder.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ExceptionRecorder.java
index 86ae262..cc24db6 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ExceptionRecorder.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/ExceptionRecorder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/ExecutorTestBase.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/ExecutorTestBase.java
index 42da75a..a282d2c 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/ExecutorTestBase.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/ExecutorTestBase.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/FileOutputTest.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/FileOutputTest.java
index e1ea8a5..cdc01a7 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/FileOutputTest.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/FileOutputTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockServerSocket.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockServerSocket.java
index 078a356..6b9d67d 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockServerSocket.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockServerSocket.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockServerSocketTest.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockServerSocketTest.java
index 228b45c..13f9862 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockServerSocketTest.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockServerSocketTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockSocketConnection.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockSocketConnection.java
index 574a0ec..d82ef8f 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockSocketConnection.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockSocketConnection.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -41,15 +41,15 @@
 		socketA.connect(socketB);
 	}
 
-	public Socket getSocketA() {
+	public MockSocket getSocketA() {
 		return socketA;
 	}
 
-	public Socket getSocketB() {
+	public MockSocket getSocketB() {
 		return socketB;
 	}
 
-	private class MockSocket extends Socket {
+	class MockSocket extends Socket {
 
 		private MockSocket other;
 
@@ -85,6 +85,7 @@
 								return -1;
 							}
 							final Byte b = buffer.poll();
+							buffer.notifyAll();
 							if (b != null) {
 								return 0xff & b.intValue();
 							}
@@ -98,26 +99,36 @@
 
 			@Override
 			public int available() throws IOException {
-				return buffer.size();
+				synchronized (buffer) {
+					return buffer.size();
+				}
 			}
 
 		};
 
-		public MockSocket() throws SocketException {
+		private MockSocket() throws SocketException {
 			super((SocketImpl) null);
 			closed = false;
 		}
 
-		void connect(MockSocket other) {
+		private void connect(MockSocket other) {
 			this.other = other;
 			other.other = this;
 		}
 
+		public void waitUntilInputBufferIsEmpty() throws InterruptedException {
+			synchronized (buffer) {
+				while (!closed && !buffer.isEmpty()) {
+					buffer.wait();
+				}
+			}
+		}
+
 		// socket methods with mocking behavior:
 
 		@Override
 		public OutputStream getOutputStream() throws IOException {
-			if (closed) {
+			if (isClosed()) {
 				throw new SocketException("Socket is closed");
 			}
 			return out;
@@ -125,7 +136,7 @@
 
 		@Override
 		public InputStream getInputStream() throws IOException {
-			if (closed) {
+			if (isClosed()) {
 				throw new SocketException("Socket is closed");
 			}
 			return in;
@@ -133,8 +144,8 @@
 
 		@Override
 		public void close() throws IOException {
-			closed = true;
 			synchronized (buffer) {
+				closed = true;
 				buffer.notifyAll();
 			}
 			synchronized (other.buffer) {
@@ -144,7 +155,9 @@
 
 		@Override
 		public boolean isClosed() {
-			return closed;
+			synchronized (buffer) {
+				return closed;
+			}
 		}
 
 		// unsupported socket methods:
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockSocketConnectionTest.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockSocketConnectionTest.java
index 814946d..43cb019 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockSocketConnectionTest.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/MockSocketConnectionTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpClientOutputTest.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpClientOutputTest.java
index f9307a6..e7f1866 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpClientOutputTest.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpClientOutputTest.java
@@ -1,6 +1,6 @@
 /*******************************************************************************
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -21,8 +21,7 @@
 import java.util.List;
 
 import org.jacoco.agent.rt.internal.ExceptionRecorder;
-import org.jacoco.agent.rt.internal.output.IAgentOutput;
-import org.jacoco.agent.rt.internal.output.TcpClientOutput;
+import org.jacoco.agent.rt.internal.output.MockSocketConnection.MockSocket;
 import org.jacoco.core.data.ExecutionDataStore;
 import org.jacoco.core.data.SessionInfo;
 import org.jacoco.core.data.SessionInfoStore;
@@ -42,7 +41,8 @@
 
 	private IAgentOutput controller;
 
-	private Socket remoteSocket;
+	private MockSocket localSocket;
+	private MockSocket remoteSocket;
 
 	private RemoteControlWriter remoteWriter;
 
@@ -54,13 +54,14 @@
 	public void setup() throws Exception {
 		logger = new ExceptionRecorder();
 		final MockSocketConnection con = new MockSocketConnection();
+		localSocket = con.getSocketA();
 		remoteSocket = con.getSocketB();
 		remoteWriter = new RemoteControlWriter(remoteSocket.getOutputStream());
 		controller = new TcpClientOutput(logger) {
 			@Override
 			protected Socket createSocket(AgentOptions options)
 					throws IOException {
-				return con.getSocketA();
+				return localSocket;
 			}
 		};
 		data = new RuntimeData();
@@ -77,6 +78,8 @@
 
 	@Test
 	public void testRemoteClose() throws Exception {
+		localSocket.waitUntilInputBufferIsEmpty();
+
 		remoteSocket.close();
 		controller.shutdown();
 		logger.assertNoException();
@@ -84,16 +87,18 @@
 
 	@Test
 	public void testInvalidCommand() throws Exception {
+		// send invalid command to agent
 		remoteWriter.visitSessionInfo(new SessionInfo("info", 1, 2));
-		while (remoteReader.read()) {
-		}
+
+		localSocket.waitUntilInputBufferIsEmpty();
 		controller.shutdown();
 		logger.assertException(IOException.class, "No session info visitor.");
 	}
 
 	@Test
 	public void testWriteExecutionData() throws Exception {
-		data.getExecutionData(Long.valueOf(0x12345678), "Foo", 42);
+		data.getExecutionData(Long.valueOf(0x12345678), "Foo", 42)
+				.getProbes()[0] = true;
 		data.setSessionId("stubid");
 
 		controller.writeExecutionData(false);
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpConnectionTest.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpConnectionTest.java
index 4ea0b8d..34b5388 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpConnectionTest.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpConnectionTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -21,7 +21,6 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
 
-import org.jacoco.agent.rt.internal.output.TcpConnection;
 import org.jacoco.core.data.ExecutionDataStore;
 import org.jacoco.core.data.ExecutionDataWriter;
 import org.jacoco.core.data.SessionInfo;
@@ -67,8 +66,8 @@
 		final OutputStream remoteOut = mockConnection.getSocketB()
 				.getOutputStream();
 		new ExecutionDataWriter(remoteOut);
-		final TcpConnection con = new TcpConnection(
-				mockConnection.getSocketA(), data);
+		final TcpConnection con = new TcpConnection(mockConnection.getSocketA(),
+				data);
 		con.init();
 		remoteOut.write(123);
 		con.run();
@@ -83,8 +82,8 @@
 				.getOutputStream();
 		new ExecutionDataWriter(remoteOut);
 
-		final TcpConnection con = new TcpConnection(
-				mockConnection.getSocketA(), data);
+		final TcpConnection con = new TcpConnection(mockConnection.getSocketA(),
+				data);
 		con.init();
 
 		final Future<Void> f = executor.submit(new Callable<Void>() {
@@ -96,26 +95,7 @@
 
 		assertBlocks(f);
 
-		mockConnection.getSocketB().close();
-		f.get();
-	}
-
-	/**
-	 * Remote endpoint is closed before even a valid header was send.
-	 */
-	public void testRemoteCloseWithoutHeader() throws Throwable {
-		final TcpConnection con = new TcpConnection(
-				mockConnection.getSocketA(), data);
-
-		final Future<Void> f = executor.submit(new Callable<Void>() {
-			public Void call() throws Exception {
-				con.init();
-				return null;
-			}
-		});
-
-		assertBlocks(f);
-
+		mockConnection.getSocketA().waitUntilInputBufferIsEmpty();
 		mockConnection.getSocketB().close();
 		f.get();
 	}
@@ -131,8 +111,8 @@
 				.getOutputStream();
 		new ExecutionDataWriter(remoteOut);
 
-		final TcpConnection con = new TcpConnection(
-				mockConnection.getSocketA(), data);
+		final TcpConnection con = new TcpConnection(mockConnection.getSocketA(),
+				data);
 		con.init();
 
 		final Future<Void> f = executor.submit(new Callable<Void>() {
@@ -150,14 +130,15 @@
 
 	@Test
 	public void testRemoteDump() throws Exception {
-		data.getExecutionData(Long.valueOf(0x12345678), "Foo", 42);
+		data.getExecutionData(Long.valueOf(0x12345678), "Foo", 42)
+				.getProbes()[0] = true;
 		data.setSessionId("stubid");
 
 		final RemoteControlWriter remoteWriter = new RemoteControlWriter(
 				mockConnection.getSocketB().getOutputStream());
 
-		final TcpConnection con = new TcpConnection(
-				mockConnection.getSocketA(), data);
+		final TcpConnection con = new TcpConnection(mockConnection.getSocketA(),
+				data);
 		con.init();
 
 		final Future<Void> f = executor.submit(new Callable<Void>() {
@@ -178,13 +159,14 @@
 
 	@Test
 	public void testLocalDump() throws Exception {
-		data.getExecutionData(Long.valueOf(0x12345678), "Foo", 42);
+		data.getExecutionData(Long.valueOf(0x12345678), "Foo", 42)
+				.getProbes()[0] = true;
 		data.setSessionId("stubid");
 
 		new RemoteControlWriter(mockConnection.getSocketB().getOutputStream());
 
-		final TcpConnection con = new TcpConnection(
-				mockConnection.getSocketA(), data);
+		final TcpConnection con = new TcpConnection(mockConnection.getSocketA(),
+				data);
 		con.init();
 
 		final Future<Void> f = executor.submit(new Callable<Void>() {
@@ -205,13 +187,13 @@
 
 	@Test
 	public void testLocalDumpWithoutInit() throws Exception {
-		final TcpConnection con = new TcpConnection(
-				mockConnection.getSocketA(), data);
+		final TcpConnection con = new TcpConnection(mockConnection.getSocketA(),
+				data);
 		// Must not write any data as we're not initialized:
 		con.writeExecutionData(false);
 
-		assertEquals(0, mockConnection.getSocketB().getInputStream()
-				.available());
+		assertEquals(0,
+				mockConnection.getSocketB().getInputStream().available());
 	}
 
 	private void readAndAssertData() throws IOException {
@@ -234,13 +216,14 @@
 
 	@Test
 	public void testRemoteReset() throws Exception {
-		data.getExecutionData(Long.valueOf(123), "Foo", 1).getProbes()[0] = true;
+		data.getExecutionData(Long.valueOf(123), "Foo", 1)
+				.getProbes()[0] = true;
 
 		final RemoteControlWriter remoteWriter = new RemoteControlWriter(
 				mockConnection.getSocketB().getOutputStream());
 
-		final TcpConnection con = new TcpConnection(
-				mockConnection.getSocketA(), data);
+		final TcpConnection con = new TcpConnection(mockConnection.getSocketA(),
+				data);
 		con.init();
 
 		final Future<Void> f = executor.submit(new Callable<Void>() {
diff --git a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpServerOutputTest.java b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpServerOutputTest.java
index 7b49c74..21adb18 100644
--- a/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpServerOutputTest.java
+++ b/org.jacoco.agent.rt.test/src/org/jacoco/agent/rt/internal/output/TcpServerOutputTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -25,7 +25,6 @@
 import java.util.List;
 
 import org.jacoco.agent.rt.internal.ExceptionRecorder;
-import org.jacoco.agent.rt.internal.output.TcpServerOutput;
 import org.jacoco.core.data.ExecutionDataStore;
 import org.jacoco.core.data.ExecutionDataWriter;
 import org.jacoco.core.data.SessionInfo;
@@ -85,7 +84,7 @@
 
 	@Test
 	public void testWriteExecutionData() throws Exception {
-		data.getExecutionData(Long.valueOf(0x12345678), "Foo", 42);
+		data.getExecutionData(Long.valueOf(0x12345678), "Foo", 42).getProbes()[0] = true;
 		data.setSessionId("stubid");
 
 		final Socket socket = serverSocket.connect();
diff --git a/org.jacoco.agent.rt/.gitignore b/org.jacoco.agent.rt/.gitignore
deleted file mode 100644
index fefebc3..0000000
--- a/org.jacoco.agent.rt/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/bin
-/.settings
diff --git a/org.jacoco.agent.rt/build.properties b/org.jacoco.agent.rt/build.properties
deleted file mode 100644
index a657887..0000000
--- a/org.jacoco.agent.rt/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/

-output.. = bin/

-bin.includes = META-INF/,\

-               .,\

-               about.html

diff --git a/org.jacoco.agent.rt/pom.xml b/org.jacoco.agent.rt/pom.xml
index cacabc9..e978544 100644
--- a/org.jacoco.agent.rt/pom.xml
+++ b/org.jacoco.agent.rt/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.build</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.build</relativePath>
   </parent>
 
@@ -26,7 +26,6 @@
   <description>JaCoCo Java Agent</description>
 
   <properties>
-    <jarsigner.skip>true</jarsigner.skip>
     <maven.deploy.skip>true</maven.deploy.skip>
     <maven.javadoc.skip>true</maven.javadoc.skip>
   </properties>
@@ -73,6 +72,9 @@
                 <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                   <manifestEntries>
                     <Premain-Class>${jacoco.runtime.package.name}.PreMain</Premain-Class>
+                    <Implementation-Title>${project.description}</Implementation-Title>
+                    <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
+                    <Implementation-Version>${project.version}</Implementation-Version>
                   </manifestEntries>
                 </transformer>
               </transformers>
diff --git a/org.jacoco.agent.rt/src/com/vladium/emma/rt/RT.java b/org.jacoco.agent.rt/src/com/vladium/emma/rt/RT.java
index 4bb86be..1ec6c85 100644
--- a/org.jacoco.agent.rt/src/com/vladium/emma/rt/RT.java
+++ b/org.jacoco.agent.rt/src/com/vladium/emma/rt/RT.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/com/vladium/emma/rt/package-info.java b/org.jacoco.agent.rt/src/com/vladium/emma/rt/package-info.java
index 4394942..f744cd9 100644
--- a/org.jacoco.agent.rt/src/com/vladium/emma/rt/package-info.java
+++ b/org.jacoco.agent.rt/src/com/vladium/emma/rt/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/IAgent.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/IAgent.java
index 8e9f7a3..8dc9231 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/IAgent.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/IAgent.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/RT.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/RT.java
index b954769..783d879 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/RT.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/RT.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Agent.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Agent.java
index 69ffc01..e21371b 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Agent.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Agent.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/ClassFileDumper.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/ClassFileDumper.java
index a02007a..1f52b6a 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/ClassFileDumper.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/ClassFileDumper.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/ConfigLoader.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/ConfigLoader.java
index 4253e07..10bc598 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/ConfigLoader.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/ConfigLoader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java
index b268889..53d1238 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/CoverageTransformer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -45,7 +45,9 @@
 
 	private final ClassFileDumper classFileDumper;
 
-	private final boolean includeBootstrapClasses;
+	private final boolean inclBootstrapClasses;
+
+	private final boolean inclNoLocationClasses;
 
 	/**
 	 * New transformer with the given delegates.
@@ -66,7 +68,8 @@
 		excludes = new WildcardMatcher(toVMName(options.getExcludes()));
 		exclClassloader = new WildcardMatcher(options.getExclClassloader());
 		classFileDumper = new ClassFileDumper(options.getClassDumpDir());
-		includeBootstrapClasses = options.getInclBootstrapClasses();
+		inclBootstrapClasses = options.getInclBootstrapClasses();
+		inclNoLocationClasses = options.getInclNoLocationClasses();
 	}
 
 	public byte[] transform(final ClassLoader loader, final String classname,
@@ -79,12 +82,7 @@
 			return null;
 		}
 
-		// We exclude dynamically created non-bootstrap classes.
-		if (loader != null && !hasSourceLocation(protectionDomain)) {
-			return null;
-		}
-
-		if (!filter(loader, classname)) {
+		if (!filter(loader, classname, protectionDomain)) {
 			return null;
 		}
 
@@ -102,39 +100,26 @@
 	}
 
 	/**
-	 * Checks whether this protection domain is associated with a source
-	 * location.
-	 * 
-	 * @param protectionDomain
-	 *            protection domain to check (or <code>null</code>)
-	 * @return <code>true</code> if a source location is defined
-	 */
-	boolean hasSourceLocation(final ProtectionDomain protectionDomain) {
-		if (protectionDomain == null) {
-			return false;
-		}
-		final CodeSource codeSource = protectionDomain.getCodeSource();
-		if (codeSource == null) {
-			return false;
-		}
-		return codeSource.getLocation() != null;
-	}
-
-	/**
 	 * Checks whether this class should be instrumented.
 	 * 
 	 * @param loader
 	 *            loader for the class
 	 * @param classname
 	 *            VM name of the class to check
+	 * @param protectionDomain
+	 *            protection domain for the class
 	 * @return <code>true</code> if the class should be instrumented
 	 */
-	boolean filter(final ClassLoader loader, final String classname) {
+	boolean filter(final ClassLoader loader, final String classname,
+			final ProtectionDomain protectionDomain) {
 		if (loader == null) {
-			if (!includeBootstrapClasses) {
+			if (!inclBootstrapClasses) {
 				return false;
 			}
 		} else {
+			if (!inclNoLocationClasses && !hasSourceLocation(protectionDomain)) {
+				return false;
+			}
 			if (exclClassloader.matches(loader.getClass().getName())) {
 				return false;
 			}
@@ -147,6 +132,25 @@
 		!excludes.matches(classname);
 	}
 
+	/**
+	 * Checks whether this protection domain is associated with a source
+	 * location.
+	 * 
+	 * @param protectionDomain
+	 *            protection domain to check (or <code>null</code>)
+	 * @return <code>true</code> if a source location is defined
+	 */
+	private boolean hasSourceLocation(final ProtectionDomain protectionDomain) {
+		if (protectionDomain == null) {
+			return false;
+		}
+		final CodeSource codeSource = protectionDomain.getCodeSource();
+		if (codeSource == null) {
+			return false;
+		}
+		return codeSource.getLocation() != null;
+	}
+
 	private static String toVMName(final String srcName) {
 		return srcName.replace('.', '/');
 	}
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/IExceptionLogger.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/IExceptionLogger.java
index f7ed213..8b301ea 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/IExceptionLogger.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/IExceptionLogger.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/JmxRegistration.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/JmxRegistration.java
index c016b33..bdcdd1e 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/JmxRegistration.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/JmxRegistration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java
index 3db838d..68c47f4 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/PreMain.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/PreMain.java
index e87d203..68f5baf 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/PreMain.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/PreMain.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/FileOutput.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/FileOutput.java
index 3feff82..a15e207 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/FileOutput.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/FileOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/IAgentOutput.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/IAgentOutput.java
index 8b959a9..e79cb3d 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/IAgentOutput.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/IAgentOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/NoneOutput.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/NoneOutput.java
index 8838f2e..84e9fec 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/NoneOutput.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/NoneOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpClientOutput.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpClientOutput.java
index a32c906..83a415d 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpClientOutput.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpClientOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpConnection.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpConnection.java
index 9665434..e4187d8 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpConnection.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpConnection.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpServerOutput.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpServerOutput.java
index c446926..27bd5d3 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpServerOutput.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/output/TcpServerOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/package-info.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/package-info.java
index 6cef9dc..c1396a8 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/package-info.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent.test/.gitignore b/org.jacoco.agent.test/.gitignore
deleted file mode 100644
index fefebc3..0000000
--- a/org.jacoco.agent.test/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/bin
-/.settings
diff --git a/org.jacoco.agent.test/META-INF/MANIFEST.MF b/org.jacoco.agent.test/META-INF/MANIFEST.MF
deleted file mode 100644
index dd220a3..0000000
--- a/org.jacoco.agent.test/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,9 +0,0 @@
-Manifest-Version: 1.0

-Bundle-ManifestVersion: 2

-Bundle-Name: JaCoCo Agent Tests

-Bundle-SymbolicName: org.jacoco.agent.test

-Bundle-Version: 0.7.5.201505241946

-Fragment-Host: org.jacoco.agent

-Bundle-RequiredExecutionEnvironment: J2SE-1.5

-Bundle-Vendor: Mountainminds GmbH & Co. KG

-Import-Package: org.junit;version="[4.8.0,5.0.0)"

diff --git a/org.jacoco.agent.test/build.properties b/org.jacoco.agent.test/build.properties
deleted file mode 100644
index 17daa5b..0000000
--- a/org.jacoco.agent.test/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               about.html
diff --git a/org.jacoco.agent.test/pom.xml b/org.jacoco.agent.test/pom.xml
index e1a7d9f..8959d99 100644
--- a/org.jacoco.agent.test/pom.xml
+++ b/org.jacoco.agent.test/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.tests</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.tests</relativePath>
   </parent>
 
diff --git a/org.jacoco.agent.test/src/org/jacoco/agent/AgentJarTest.java b/org.jacoco.agent.test/src/org/jacoco/agent/AgentJarTest.java
index 596a900..a6640f2 100644
--- a/org.jacoco.agent.test/src/org/jacoco/agent/AgentJarTest.java
+++ b/org.jacoco.agent.test/src/org/jacoco/agent/AgentJarTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent/.gitignore b/org.jacoco.agent/.gitignore
deleted file mode 100644
index 4e21f0d..0000000
--- a/org.jacoco.agent/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target
-/bin
-/.settings
-/src/jacocoagent.jar
diff --git a/org.jacoco.agent/META-INF/MANIFEST.MF b/org.jacoco.agent/META-INF/MANIFEST.MF
deleted file mode 100644
index 755d81d..0000000
--- a/org.jacoco.agent/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Manifest-Version: 1.0

-Bundle-ManifestVersion: 2

-Bundle-Name: JaCoCo Agent

-Bundle-SymbolicName: org.jacoco.agent

-Bundle-Version: 0.7.5.201505241946

-Bundle-Vendor: Mountainminds GmbH & Co. KG

-Bundle-RequiredExecutionEnvironment: J2SE-1.5

-Export-Package: org.jacoco.agent;version="0.7.3"

diff --git a/org.jacoco.agent/build.properties b/org.jacoco.agent/build.properties
deleted file mode 100644
index 41eb6ad..0000000
--- a/org.jacoco.agent/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/

-output.. = bin/

-bin.includes = META-INF/,\

-               .

diff --git a/org.jacoco.agent/pom.xml b/org.jacoco.agent/pom.xml
index d606ddf..3120d38 100644
--- a/org.jacoco.agent/pom.xml
+++ b/org.jacoco.agent/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.build</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.build</relativePath>
   </parent>
 
@@ -78,6 +78,28 @@
           </execution>
         </executions>
       </plugin>
+
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>manifest</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/org.jacoco.agent/src/org/jacoco/agent/AgentJar.java b/org.jacoco.agent/src/org/jacoco/agent/AgentJar.java
index 9ab29db..671eae1 100644
--- a/org.jacoco.agent/src/org/jacoco/agent/AgentJar.java
+++ b/org.jacoco.agent/src/org/jacoco/agent/AgentJar.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.agent/src/org/jacoco/agent/package-info.java b/org.jacoco.agent/src/org/jacoco/agent/package-info.java
index c093e5d..43e921f 100644
--- a/org.jacoco.agent/src/org/jacoco/agent/package-info.java
+++ b/org.jacoco.agent/src/org/jacoco/agent/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/.gitignore b/org.jacoco.ant.test/.gitignore
deleted file mode 100644
index fefebc3..0000000
--- a/org.jacoco.ant.test/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/bin
-/.settings
diff --git a/org.jacoco.ant.test/META-INF/MANIFEST.MF b/org.jacoco.ant.test/META-INF/MANIFEST.MF
deleted file mode 100644
index a82ec47..0000000
--- a/org.jacoco.ant.test/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,9 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: JaCoCo Ant Tasks Tests
-Bundle-SymbolicName: org.jacoco.ant.test
-Bundle-Version: 0.7.5.201505241946
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: Mountainminds GmbH & Co. KG and Contributors
-Fragment-Host: org.jacoco.ant
-Import-Package: org.junit;version="[4.8.0,5.0.0)"
diff --git a/org.jacoco.ant.test/build.properties b/org.jacoco.ant.test/build.properties
deleted file mode 100644
index a657887..0000000
--- a/org.jacoco.ant.test/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/

-output.. = bin/

-bin.includes = META-INF/,\

-               .,\

-               about.html

diff --git a/org.jacoco.ant.test/pom.xml b/org.jacoco.ant.test/pom.xml
index 55b59bb..cd70f20 100644
--- a/org.jacoco.ant.test/pom.xml
+++ b/org.jacoco.ant.test/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.tests</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.tests</relativePath>
   </parent>
 
diff --git a/org.jacoco.ant.test/src/TestTargetInDefault.java b/org.jacoco.ant.test/src/TestTargetInDefault.java
index ba777b4..561385d 100644
--- a/org.jacoco.ant.test/src/TestTargetInDefault.java
+++ b/org.jacoco.ant.test/src/TestTargetInDefault.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/AgentTaskTest.java b/org.jacoco.ant.test/src/org/jacoco/ant/AgentTaskTest.java
index 9506c0a..a08f844 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/AgentTaskTest.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/AgentTaskTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/AgentTaskTest.xml b/org.jacoco.ant.test/src/org/jacoco/ant/AgentTaskTest.xml
index 5f6a252..dfa432c 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/AgentTaskTest.xml
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/AgentTaskTest.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -17,9 +17,10 @@
 			
 	<target name="testCoverageAgent">
 		<jacoco:agent property="jacocoagent" append="false" destfile="test.exec"
-			exclClassLoader="EvilClassLoader" includes="org.example.*"
-		    excludes="*Test" sessionid="testid" dumponexit="false"
-			output="file" address="remotehost" port="1234"
+			exclClassLoader="EvilClassLoader" includes="org.example.*" excludes="*Test"
+			inclbootstrapclasses="true" inclnolocationclasses="true"
+		    sessionid="testid" dumponexit="false"
+			output="file" address="remotehost" port="1234" jmx="true"
 			classdumpdir="target/dump"/>
 		<au:assertPropertySet name="jacocoagent"/>
 		<au:assertPropertyContains name="jacocoagent" value="-javaagent:"/>
@@ -29,11 +30,14 @@
 		<au:assertPropertyContains name="jacocoagent" value="exclclassloader=EvilClassLoader"/>
 		<au:assertPropertyContains name="jacocoagent" value="includes=org.example.*"/>
 		<au:assertPropertyContains name="jacocoagent" value="excludes=*Test"/>
+		<au:assertPropertyContains name="jacocoagent" value="inclbootstrapclasses=true"/>
+		<au:assertPropertyContains name="jacocoagent" value="inclnolocationclasses=true"/>
 		<au:assertPropertyContains name="jacocoagent" value="sessionid=testid"/>
 		<au:assertPropertyContains name="jacocoagent" value="dumponexit=false"/>
 		<au:assertPropertyContains name="jacocoagent" value="output=file"/>
 		<au:assertPropertyContains name="jacocoagent" value="address=remotehost"/>
 		<au:assertPropertyContains name="jacocoagent" value="port=1234"/>
+		<au:assertPropertyContains name="jacocoagent" value="jmx=true"/>
 		<property name="dump.dir" location="target/dump"/>
 		<au:assertPropertyContains name="jacocoagent" value="classdumpdir=${dump.dir}"/>
 	</target>
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/AntFilesLocatorTest.java b/org.jacoco.ant.test/src/org/jacoco/ant/AntFilesLocatorTest.java
index a9b5926..aee6fe8 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/AntFilesLocatorTest.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/AntFilesLocatorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/AntResourcesLocatorTest.java b/org.jacoco.ant.test/src/org/jacoco/ant/AntResourcesLocatorTest.java
index da2f05b..3e8600d 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/AntResourcesLocatorTest.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/AntResourcesLocatorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/CoverageTaskTest.java b/org.jacoco.ant.test/src/org/jacoco/ant/CoverageTaskTest.java
index ce59c1e..35f23ac 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/CoverageTaskTest.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/CoverageTaskTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/CoverageTaskTest.xml b/org.jacoco.ant.test/src/org/jacoco/ant/CoverageTaskTest.xml
index d314bec..ae47860 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/CoverageTaskTest.xml
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/CoverageTaskTest.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/CreateExecFiles.java b/org.jacoco.ant.test/src/org/jacoco/ant/CreateExecFiles.java
index cbe9f90..8e19325 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/CreateExecFiles.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/CreateExecFiles.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/DumpExecClassNames.java b/org.jacoco.ant.test/src/org/jacoco/ant/DumpExecClassNames.java
index 7b80713..9613faf 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/DumpExecClassNames.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/DumpExecClassNames.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskTest.java b/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskTest.java
index 7fa77b6..c0c38b8 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskTest.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskTest.xml b/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskTest.xml
index 9f96e64..496e671 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskTest.xml
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskTest.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -35,7 +35,12 @@
 	
 	<target name="testUnknownHost">
 		<au:expectfailure expectedMessage="Unable to dump coverage data">
-			<jacoco:dump dump="false" address="nosuchhost"/>
+			<!--
+			Note that malformed literal IPv6 address is used
+			to cause UnknownHostException from java.net.InetAddress.getByName
+			without DNS request.
+			-->
+			<jacoco:dump dump="false" address="[nosuchhost]"/>
 		</au:expectfailure>
 		<au:assertFileDoesntExist file="${exec.file}"/>
 	</target>
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskWithServerTest.java b/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskWithServerTest.java
index a0e17eb..01e3031 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskWithServerTest.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskWithServerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskWithServerTest.xml b/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskWithServerTest.xml
index 071b1b4..063c867 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskWithServerTest.xml
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/DumpTaskWithServerTest.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/InstrumentTaskTest.java b/org.jacoco.ant.test/src/org/jacoco/ant/InstrumentTaskTest.java
index 1c31519..16804f0 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/InstrumentTaskTest.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/InstrumentTaskTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/InstrumentTaskTest.xml b/org.jacoco.ant.test/src/org/jacoco/ant/InstrumentTaskTest.xml
index 79a21ba..bdac6cd 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/InstrumentTaskTest.xml
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/InstrumentTaskTest.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/MergeTaskTest.java b/org.jacoco.ant.test/src/org/jacoco/ant/MergeTaskTest.java
index 516d97f..be497cd 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/MergeTaskTest.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/MergeTaskTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/MergeTaskTest.xml b/org.jacoco.ant.test/src/org/jacoco/ant/MergeTaskTest.xml
index 62fc1c3..28ab902 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/MergeTaskTest.xml
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/MergeTaskTest.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/RemoveDebugInfos.java b/org.jacoco.ant.test/src/org/jacoco/ant/RemoveDebugInfos.java
index 0b48231..f5a8f64 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/RemoveDebugInfos.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/RemoveDebugInfos.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskLocaleTest.java b/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskLocaleTest.java
index 03f470f..6fd7396 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskLocaleTest.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskLocaleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.java b/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.java
index 31a96b8..ab2aeb1 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.xml b/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.xml
index f8ad694..cd986b3 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.xml
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/TestTarget.java b/org.jacoco.ant.test/src/org/jacoco/ant/TestTarget.java
index d3e4815..613bdb2 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/TestTarget.java
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/TestTarget.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant/.gitignore b/org.jacoco.ant/.gitignore
deleted file mode 100644
index fefebc3..0000000
--- a/org.jacoco.ant/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/bin
-/.settings
diff --git a/org.jacoco.ant/META-INF/MANIFEST.MF b/org.jacoco.ant/META-INF/MANIFEST.MF
deleted file mode 100644
index ed6eb9f..0000000
--- a/org.jacoco.ant/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0

-Bundle-ManifestVersion: 2

-Bundle-Name: JaCoCo Ant Tasks

-Bundle-SymbolicName: org.jacoco.ant

-Bundle-Version: 0.7.5.201505241946

-Bundle-RequiredExecutionEnvironment: J2SE-1.5

-Bundle-Vendor: Mountainminds GmbH & Co. KG and Contributors

-Require-Bundle: org.apache.ant;bundle-version="[1.7.0,2.0.0)"

-Import-Package: org.jacoco.agent;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.analysis;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.data;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.instr;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.runtime;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.tools;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.report;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.report.check;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.report.csv;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.report.html;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.report.xml;bundle-version="[0.7.5,0.7.6)",

- org.objectweb.asm;version="[5.0.1,5.1.0)"

diff --git a/org.jacoco.ant/build.properties b/org.jacoco.ant/build.properties
deleted file mode 100644
index a657887..0000000
--- a/org.jacoco.ant/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/

-output.. = bin/

-bin.includes = META-INF/,\

-               .,\

-               about.html

diff --git a/org.jacoco.ant/pom.xml b/org.jacoco.ant/pom.xml
index dece161..39f7042 100644
--- a/org.jacoco.ant/pom.xml
+++ b/org.jacoco.ant/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.build</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.build</relativePath>
   </parent>
 
@@ -67,6 +67,41 @@
                   <shadedPattern>org.jacoco.asm</shadedPattern>
                 </relocation>
               </relocations>
+              <transformers>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                  <manifestEntries>
+                    <Implementation-Title>${project.description}</Implementation-Title>
+                    <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
+                    <Implementation-Version>${project.version}</Implementation-Version>
+                  </manifestEntries>
+                </transformer>
+              </transformers>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <executions>
+          <execution>
+            <!--
+            None of resource tranformers from maven-shade-plugin
+            (including combination of DontIncludeResourceTransformer and ManifestResourceTransformer)
+            does not allow us to leave only desired entries and remove others from META-INF/MANIFEST.MF
+            So we use goal "bundle" instead of "manifest".
+            This introduces some redundant operations, but their cost is negligible.
+            -->
+            <phase>package</phase>
+            <goals>
+              <goal>bundle</goal>
+            </goals>
+            <configuration>
+              <excludeDependencies>true</excludeDependencies>
+              <instructions>
+                <Require-Bundle>org.apache.ant;bundle-version="[1.7.0,2.0.0)"</Require-Bundle>
+              </instructions>
             </configuration>
           </execution>
         </executions>
diff --git a/org.jacoco.ant/src/org/jacoco/ant/AbstractCoverageTask.java b/org.jacoco.ant/src/org/jacoco/ant/AbstractCoverageTask.java
index bd81f1c..1a4d8d7 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/AbstractCoverageTask.java
+++ b/org.jacoco.ant/src/org/jacoco/ant/AbstractCoverageTask.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -126,6 +126,17 @@
 	}
 
 	/**
+	 * Sets whether classes without source location should be instrumented.
+	 * 
+	 * @param include
+	 *            <code>true</code> if classes without source location should be
+	 *            instrumented
+	 */
+	public void setInclNoLocationClasses(final boolean include) {
+		agentOptions.setInclNoLocationClasses(include);
+	}
+
+	/**
 	 * Sets the session identifier. Default is a auto-generated id
 	 * 
 	 * @param id
diff --git a/org.jacoco.ant/src/org/jacoco/ant/AgentTask.java b/org.jacoco.ant/src/org/jacoco/ant/AgentTask.java
index 7be3817..30db642 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/AgentTask.java
+++ b/org.jacoco.ant/src/org/jacoco/ant/AgentTask.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant/src/org/jacoco/ant/AntFilesLocator.java b/org.jacoco.ant/src/org/jacoco/ant/AntFilesLocator.java
index 23b67fa..afc2839 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/AntFilesLocator.java
+++ b/org.jacoco.ant/src/org/jacoco/ant/AntFilesLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant/src/org/jacoco/ant/AntResourcesLocator.java b/org.jacoco.ant/src/org/jacoco/ant/AntResourcesLocator.java
index ba5d468..adda40e 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/AntResourcesLocator.java
+++ b/org.jacoco.ant/src/org/jacoco/ant/AntResourcesLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant/src/org/jacoco/ant/CoverageTask.java b/org.jacoco.ant/src/org/jacoco/ant/CoverageTask.java
index 5742f03..14d0b39 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/CoverageTask.java
+++ b/org.jacoco.ant/src/org/jacoco/ant/CoverageTask.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant/src/org/jacoco/ant/DumpTask.java b/org.jacoco.ant/src/org/jacoco/ant/DumpTask.java
index 2bb0467..f757015 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/DumpTask.java
+++ b/org.jacoco.ant/src/org/jacoco/ant/DumpTask.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant/src/org/jacoco/ant/InstrumentTask.java b/org.jacoco.ant/src/org/jacoco/ant/InstrumentTask.java
index 00f0958..ae99b15 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/InstrumentTask.java
+++ b/org.jacoco.ant/src/org/jacoco/ant/InstrumentTask.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant/src/org/jacoco/ant/MergeTask.java b/org.jacoco.ant/src/org/jacoco/ant/MergeTask.java
index 9f20b18..a3b2d94 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/MergeTask.java
+++ b/org.jacoco.ant/src/org/jacoco/ant/MergeTask.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant/src/org/jacoco/ant/ReportTask.java b/org.jacoco.ant/src/org/jacoco/ant/ReportTask.java
index edf7cef..3c19df8 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/ReportTask.java
+++ b/org.jacoco.ant/src/org/jacoco/ant/ReportTask.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.ant/src/org/jacoco/ant/antlib.xml b/org.jacoco.ant/src/org/jacoco/ant/antlib.xml
index a47aaa9..9252944 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/antlib.xml
+++ b/org.jacoco.ant/src/org/jacoco/ant/antlib.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/org.jacoco.build/.gitignore b/org.jacoco.build/.gitignore
deleted file mode 100644
index ea8c4bf..0000000
--- a/org.jacoco.build/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/target
diff --git a/org.jacoco.build/pom.xml b/org.jacoco.build/pom.xml
index c2e0913..e746d6a 100644
--- a/org.jacoco.build/pom.xml
+++ b/org.jacoco.build/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -14,7 +14,7 @@
 
   <groupId>org.jacoco</groupId>
   <artifactId>org.jacoco.build</artifactId>
-  <version>0.7.5.201505241946</version>
+  <version>0.7.10-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <name>JaCoCo</name>
@@ -83,6 +83,10 @@
     </contributor>
   </contributors>
 
+  <prerequisites>
+    <maven>3.0</maven>
+  </prerequisites>
+
   <modules>
     <!-- Order is important: org.jacoco.agent.rt embeds into org.jacoco.agent and JaCoCo Agent used during tests -->
     <module>../org.jacoco.core</module>
@@ -127,8 +131,8 @@
     <sonatypeOssDistMgmtSnapshotsUrl>https://oss.sonatype.org/content/repositories/snapshots/</sonatypeOssDistMgmtSnapshotsUrl>
 
     <maven.build.timestamp.format>yyyyMMddhhmm</maven.build.timestamp.format>
-    <jacoco.home.url>http://www.eclemma.org/jacoco</jacoco.home.url>
-    <copyright.years>${project.inceptionYear}, 2015</copyright.years>
+    <jacoco.home.url>http://www.jacoco.org/jacoco</jacoco.home.url>
+    <copyright.years>${project.inceptionYear}, 2017</copyright.years>
 
     <maven.compiler.source>1.5</maven.compiler.source>
     <maven.compiler.target>1.5</maven.compiler.target>
@@ -137,17 +141,13 @@
     <argLine>${jvm.args}</argLine>
 
     <!-- Dependencies versions -->
-    <asm.version>5.0.1</asm.version>
+    <asm.version>5.2</asm.version>
     <ant.version>1.7.1</ant.version>
     <junit.version>4.8.2</junit.version>
 
     <!-- ================== -->
-    <!-- For Sonar analysis -->
+    <!-- For SonarQube analysis -->
     <!-- ================== -->
-    <sonar.skippedModules>org.jacoco.tests,org.jacoco.doc</sonar.skippedModules>
-
-    <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
-    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
     <sonar.jacoco.reportPath>../${project.artifactId}.test/target/jacoco.exec</sonar.jacoco.reportPath>
     <sonar.surefire.reportsPath>../${project.artifactId}.test/target/surefire-reports/</sonar.surefire.reportsPath>
 
@@ -302,7 +302,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-invoker-plugin</artifactId>
-          <version>1.8</version>
+          <version>2.0.0</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
@@ -316,11 +316,6 @@
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-jarsigner-plugin</artifactId>
-          <version>1.2</version>
-        </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
           <version>2.8</version>
           <configuration>
@@ -356,7 +351,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-shade-plugin</artifactId>
-          <version>1.4</version>
+          <version>2.4.3</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
@@ -405,6 +400,12 @@
           <artifactId>gmaven-plugin</artifactId>
           <version>1.0</version>
         </plugin>
+        <plugin>
+          <groupId>org.apache.felix</groupId>
+          <artifactId>maven-bundle-plugin</artifactId>
+          <!-- newer versions require Java 7 -->
+          <version>2.5.4</version>
+        </plugin>
       </plugins>
     </pluginManagement>
 
@@ -448,15 +449,6 @@
               </excludes>
             </filter>
           </filters>
-          <transformers>
-            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-              <manifestEntries>
-                <Implementation-Title>${project.description}</Implementation-Title>
-                <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
-                <Implementation-Version>${project.version}</Implementation-Version>
-              </manifestEntries>
-            </transformer>
-          </transformers>
         </configuration>
       </plugin>
 
@@ -498,7 +490,7 @@
                 </requireReleaseDeps>
                 <requireMavenVersion>
                   <!-- Maven 3.0.3 contains bug - see http://jira.codehaus.org/browse/MINVOKER-107 -->
-                  <version>[2.2.1,3.0.0),[3.0.4,)</version>
+                  <version>[3.0.0,3.0.3),[3.0.4,)</version>
                 </requireMavenVersion>
               </rules>
             </configuration>
@@ -521,7 +513,7 @@
                 <fileset dir="${basedir}" includes="**/*.java,**/*.xml,**/*.bsh" excludes="target/**,.idea/**,nb-configuration.xml" id="missinglicense.fileset">
                   <not>
                     <and>
-                      <contains text="Copyright (c) 2009, 2015 Mountainminds GmbH &amp; Co. KG and Contributors"/>
+                      <contains text="Copyright (c) 2009, 2017 Mountainminds GmbH &amp; Co. KG and Contributors"/>
                       <contains text="All rights reserved. This program and the accompanying materials"/>
                       <contains text="are made available under the terms of the Eclipse Public License v1.0"/>
                       <contains text="which accompanies this distribution, and is available at"/>
@@ -603,6 +595,28 @@
           </execution>
         </executions>
       </plugin>
+
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <configuration>
+          <instructions>
+            <Bundle-Version>${qualified.bundle.version}</Bundle-Version>
+            <Bundle-Name>${project.description}</Bundle-Name>
+            <Export-Package>
+              !about.html,
+              *.internal*;x-internal:=true;version="${version;===;${Bundle-Version}}",
+              *;version="${version;===;${Bundle-Version}}"
+            </Export-Package>
+            <Import-Package>
+              org.jacoco.*;version="${range;[===,==+);${Bundle-Version}}",
+              org.objectweb.asm.*;version="${range;[===,=+);${asm.version}}"
+            </Import-Package>
+            <Bundle-RequiredExecutionEnvironment>J2SE-1.5</Bundle-RequiredExecutionEnvironment>
+            <Eclipse-SourceReferences>scm:git:git://github.com/jacoco/jacoco.git;path="${project.artifactId}";commitId=${buildNumber}</Eclipse-SourceReferences>
+          </instructions>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 
@@ -654,6 +668,58 @@
         <maven.compiler.target>${bytecode.version}</maven.compiler.target>
       </properties>
     </profile>
+    <profile>
+      <id>java9-validation</id>
+      <activation>
+        <property>
+          <name>bytecode.version</name>
+          <value>1.9</value>
+        </property>
+      </activation>
+      <properties>
+        <!--
+        Compile into bytecode version 8 by default,
+        because maven-shade-plugin and maven-plugin-plugin are unable to proceess bytecode version 9,
+        this is overridden for tests
+        -->
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+      </properties>
+    </profile>
+
+    <!-- This profile is used for compilation with ECJ. -->
+    <profile>
+      <id>ecj</id>
+      <activation>
+        <property>
+          <name>ecj</name>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-compiler-plugin</artifactId>
+            <version>3.6.0</version>
+            <configuration>
+              <compilerId>eclipse</compilerId>
+            </configuration>
+            <dependencies>
+              <dependency>
+                <groupId>org.eclipse.jdt.core.compiler</groupId>
+                <artifactId>ecj</artifactId>
+                <version>4.6.1</version>
+              </dependency>
+              <dependency>
+                <groupId>org.codehaus.plexus</groupId>
+                <artifactId>plexus-compiler-eclipse</artifactId>
+                <version>2.8.1</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
 
     <profile>
       <id>jdk16</id>
@@ -695,86 +761,16 @@
     </profile>
 
     <profile>
-      <id>sign</id>
+      <id>jdk9</id>
       <activation>
         <property>
-          <name>jarsigner.alias</name>
+          <name>jdk.version</name>
+          <value>1.9</value>
         </property>
       </activation>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-jarsigner-plugin</artifactId>
-            <executions>
-              <execution>
-                <id>sign</id>
-                <goals>
-                  <goal>sign</goal>
-                </goals>
-                <configuration>
-                  <arguments>
-                    <!-- TODO Godin: there is no parameters for TSA in plugin, so we use workaround - see http://jira.codehaus.org/browse/MJARSIGNER-16 -->
-                    <argument>-tsa</argument>
-                    <argument>${jarsigner.tsa}</argument>
-                    <argument>-tsacert</argument>
-                    <argument>${jarsigner.tsacert}</argument>
-                  </arguments>
-                </configuration>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-
-    <profile>
-      <id>manifest</id>
-      <activation>
-        <file>
-          <exists>META-INF/MANIFEST.MF</exists>
-        </file>
-      </activation>
       <properties>
-        <bundle-manifest>${project.build.directory}/META-INF/MANIFEST.MF</bundle-manifest>
+        <jvm.args>-XX:-FailOverToOldVerifier -Xverify:all</jvm.args>
       </properties>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-antrun-plugin</artifactId>
-            <executions>
-              <execution>
-                <id>translate-qualifier</id>
-                <phase>generate-resources</phase>
-                <configuration>
-                  <target>
-                    <copy file="META-INF/MANIFEST.MF" tofile="${bundle-manifest}" overwrite="true"/>
-                    <replace file="${bundle-manifest}">
-                      <replacefilter token=".qualifier" value=".${buildQualifier}"/>
-                    </replace>
-                  </target>
-                </configuration>
-                <goals>
-                  <goal>run</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-jar-plugin</artifactId>
-            <configuration>
-              <archive>
-                <manifestFile>${bundle-manifest}</manifestFile>
-                <manifestEntries>
-                  <Eclipse-SourceReferences>scm:git:git://github.com/jacoco/jacoco.git;path="${project.artifactId}";commitId=${buildNumber}</Eclipse-SourceReferences>
-                </manifestEntries>
-              </archive>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
     </profile>
 
     <profile>
@@ -835,12 +831,6 @@
                 </goals>
                 <configuration>
                   <rules>
-                    <!--
-                    <requireActiveProfile>
-                      <message>You must sign JARs during release.</message>
-                      <profiles>sign</profiles>
-                    </requireActiveProfile>
-                    -->
                     <requireReleaseVersion/>
                     <requireProperty>
                       <property>buildNumber</property>
diff --git a/org.jacoco.core.test/.classpath b/org.jacoco.core.test/.classpath
index 1dfb8d7..ebe550b 100644
--- a/org.jacoco.core.test/.classpath
+++ b/org.jacoco.core.test/.classpath
@@ -10,7 +10,7 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry excluding="org/jacoco/core/test/validation/java8/*.java" including="**/*.java" kind="src" output="target/classes" path="src">
+	<classpathentry kind="src" output="target/classes" path="src">
 		<attributes>
 			<attribute name="optional" value="true"/>
 			<attribute name="maven.pomderived" value="true"/>
diff --git a/org.jacoco.core.test/.gitignore b/org.jacoco.core.test/.gitignore
deleted file mode 100644
index 4dc0091..0000000
--- a/org.jacoco.core.test/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/target
-/bin
diff --git a/org.jacoco.core.test/META-INF/MANIFEST.MF b/org.jacoco.core.test/META-INF/MANIFEST.MF
deleted file mode 100644
index 99f569e..0000000
--- a/org.jacoco.core.test/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0

-Bundle-ManifestVersion: 2

-Bundle-Name: JaCoCo Core Tests

-Bundle-SymbolicName: org.jacoco.core.test

-Bundle-Version: 0.7.5.201505241946

-Bundle-Vendor: Mountainminds GmbH & Co. KG

-Fragment-Host: org.jacoco.core

-Bundle-RequiredExecutionEnvironment: J2SE-1.5

-Import-Package: org.junit;version="[4.8.0,5.0.0)",

- org.junit.rules;version="[4.8.0,5.0.0)",

- org.objectweb.asm.util;version="[5.0.1,5.1.0)"

diff --git a/org.jacoco.core.test/build.properties b/org.jacoco.core.test/build.properties
deleted file mode 100644
index a657887..0000000
--- a/org.jacoco.core.test/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/

-output.. = bin/

-bin.includes = META-INF/,\

-               .,\

-               about.html

diff --git a/org.jacoco.core.test/pom.xml b/org.jacoco.core.test/pom.xml
index 09c2c2e..31ef2e3 100644
--- a/org.jacoco.core.test/pom.xml
+++ b/org.jacoco.core.test/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.tests</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.tests</relativePath>
   </parent>
 
@@ -37,27 +37,107 @@
       <artifactId>junit</artifactId>
     </dependency>
   </dependencies>
-  
+
   <profiles>
     <profile>
-      <id>no-java8-validation</id>
+      <id>java7-validation</id>
       <activation>
-        <jdk>(,1.8)</jdk>
+        <property>
+          <name>bytecode.version</name>
+          <value>1.7</value>
+        </property>
       </activation>
       <build>
         <plugins>
           <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-compiler-plugin</artifactId>
-            <configuration>
-              <excludes>
-                <exclude>org/jacoco/core/test/validation/java8/*.java</exclude>
-              </excludes>
-            </configuration>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>build-helper-maven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>add-source</id>
+                <phase>generate-sources</phase>
+                <goals>
+                  <goal>add-source</goal>
+                </goals>
+                <configuration>
+                  <sources>
+                    <source>src-java7</source>
+                  </sources>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>java8-validation</id>
+      <activation>
+        <property>
+          <name>bytecode.version</name>
+          <value>1.8</value>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>build-helper-maven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>add-source</id>
+                <phase>generate-sources</phase>
+                <goals>
+                  <goal>add-source</goal>
+                </goals>
+                <configuration>
+                  <sources>
+                    <source>src-java7</source>
+                    <source>src-java8</source>
+                  </sources>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>java9-validation</id>
+      <activation>
+        <!-- for some reason activation should be presented here, even if already defined in parent -->
+        <property>
+          <name>bytecode.version</name>
+          <value>1.9</value>
+        </property>
+      </activation>
+      <properties>
+        <maven.compiler.target>1.9</maven.compiler.target>
+      </properties>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>build-helper-maven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>add-source</id>
+                <phase>generate-sources</phase>
+                <goals>
+                  <goal>add-source</goal>
+                </goals>
+                <configuration>
+                  <sources>
+                    <source>src-java7</source>
+                    <source>src-java8</source>
+                  </sources>
+                </configuration>
+              </execution>
+            </executions>
           </plugin>
         </plugins>
       </build>
     </profile>
   </profiles>
-  
+
 </project>
diff --git a/org.jacoco.core.test/src-java7/org/jacoco/core/test/filter/TryWithResourcesTest.java b/org.jacoco.core.test/src-java7/org/jacoco/core/test/filter/TryWithResourcesTest.java
new file mode 100644
index 0000000..1530505
--- /dev/null
+++ b/org.jacoco.core.test/src-java7/org/jacoco/core/test/filter/TryWithResourcesTest.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.filter;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.filter.targets.TryWithResources;
+import org.jacoco.core.test.validation.ValidationTestBase;
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Test of filtering of a bytecode that is generated for a try-with-resources
+ * statement.
+ */
+public class TryWithResourcesTest extends ValidationTestBase {
+
+	public TryWithResourcesTest() {
+		super("src-java7", TryWithResources.class);
+	}
+
+	/**
+	 * {@link TryWithResources#test()}
+	 */
+	@Test
+	public void test() {
+		assertLine("test.before", ICounter.FULLY_COVERED);
+		// without filter next line covered partly:
+		assertLine("test.try", ICounter.FULLY_COVERED);
+		assertLine("test.open1", ICounter.FULLY_COVERED);
+		assertLine("test.open2", ICounter.FULLY_COVERED);
+		assertLine("test.open3", ICounter.FULLY_COVERED);
+		assertLine("test.body", ICounter.FULLY_COVERED);
+		// without filter next line has branches:
+		assertLine("test.close", ICounter.EMPTY);
+		assertLine("test.catch", ICounter.NOT_COVERED);
+		assertLine("test.finally", ICounter.PARTLY_COVERED);
+	}
+
+	/**
+	 * {@link TryWithResources#test2()}
+	 */
+	@Test
+	public void test2() {
+		assertLine("test2.before", ICounter.FULLY_COVERED);
+		// without filter next line covered partly:
+		assertLine("test2.try", ICounter.FULLY_COVERED);
+		assertLine("test2.open1", ICounter.FULLY_COVERED);
+		assertLine("test2.open2", ICounter.FULLY_COVERED);
+		assertLine("test2.open3", ICounter.FULLY_COVERED);
+		assertLine("test2.body", ICounter.FULLY_COVERED);
+		// without filter next line has branches:
+		assertLine("test2.close", ICounter.EMPTY);
+		assertLine("test2.catch", ICounter.NOT_COVERED);
+		assertLine("test2.finally", ICounter.PARTLY_COVERED);
+		assertLine("test2.after", ICounter.FULLY_COVERED);
+	}
+
+	/**
+	 * {@link TryWithResources#returnInBody()}
+	 */
+	@Test
+	public void returnInBody() {
+		// without filter next line covered partly:
+		assertLine("returnInBody.try", ICounter.FULLY_COVERED);
+		assertLine("returnInBody.open", ICounter.FULLY_COVERED);
+
+		// without filter next line has branches:
+		if (isJDKCompiler) {
+			// https://bugs.openjdk.java.net/browse/JDK-8134759
+			// javac 7 and 8 up to 8u92 are affected
+			final String jdkVersion = System.getProperty("java.version");
+			final Matcher m = Pattern.compile("1\\.8\\.0_(\\d++)(-ea)?")
+					.matcher(jdkVersion);
+			if (jdkVersion.startsWith("1.7.0_")
+					|| (m.matches() && Integer.parseInt(m.group(1)) < 92)) {
+				assertLine("returnInBody.close", ICounter.FULLY_COVERED, 0, 0);
+			} else {
+				assertLine("returnInBody.close", ICounter.EMPTY);
+			}
+		} else {
+			assertLine("returnInBody.close", ICounter.EMPTY);
+		}
+
+		assertLine("returnInBody.return", ICounter.FULLY_COVERED);
+	}
+
+	/**
+	 * {@link TryWithResources#nested()}
+	 */
+	@Test
+	public void nested() {
+		// without filter next line covered partly:
+		assertLine("nested.try1", ICounter.FULLY_COVERED);
+		assertLine("nested.open1", ICounter.FULLY_COVERED);
+		assertLine("nested.catch1", ICounter.NOT_COVERED);
+
+		// without filter next line covered partly:
+		assertLine("nested.try2", ICounter.FULLY_COVERED);
+		assertLine("nested.body", ICounter.FULLY_COVERED);
+		assertLine("nested.catch2", ICounter.NOT_COVERED);
+		assertLine("nested.finally2", ICounter.PARTLY_COVERED);
+
+		// next lines not covered on exceptional path:
+		assertLine("nested.try3", ICounter.PARTLY_COVERED, 0, 0);
+		assertLine("nested.open3", ICounter.PARTLY_COVERED, 0, 0);
+		assertLine("nested.body3", ICounter.PARTLY_COVERED, 0, 0);
+		assertLine("nested.catch3", ICounter.NOT_COVERED);
+		assertLine("nested.finally3", ICounter.PARTLY_COVERED, 0, 0);
+
+		// without filter next lines have branches:
+		assertLine("nested.close3", ICounter.EMPTY);
+		assertLine("nested.close2", ICounter.EMPTY);
+		assertLine("nested.close1", ICounter.EMPTY);
+	}
+
+	/**
+	 * {@link TryWithResources#returnInCatch()}
+	 */
+	@Test
+	public void returnInCatch() {
+		// without filter next line covered partly:
+		assertLine("returnInCatch.try1", ICounter.FULLY_COVERED);
+		assertLine("returnInCatch.open", ICounter.FULLY_COVERED);
+		assertLine("returnInCatch.finally1", ICounter.PARTLY_COVERED, 5, 1);
+		// without filter next line has branches:
+		assertLine("returnInCatch.close", ICounter.EMPTY);
+
+		assertLine("returnInCatch.try2", ICounter.EMPTY);
+		assertLine("returnInCatch.finally2", ICounter.PARTLY_COVERED, 5, 1);
+	}
+
+	/*
+	 * Corner cases
+	 */
+
+	/**
+	 * {@link TryWithResources#handwritten()}
+	 */
+	@Test
+	public void handwritten() {
+		if (isJDKCompiler) {
+			assertLine("handwritten", /* partly when ECJ: */ICounter.EMPTY);
+		}
+	}
+
+	/**
+	 * {@link TryWithResources#empty()}
+	 */
+	@Test
+	public void empty() {
+		assertLine("empty.try", ICounter.FULLY_COVERED, 0, 0);
+		assertLine("empty.open", ICounter.FULLY_COVERED);
+		// empty when EJC:
+		if (isJDKCompiler) {
+			final String jdkVersion = System.getProperty("java.version");
+			if (jdkVersion.startsWith("9-")) {
+				assertLine("empty.close", ICounter.FULLY_COVERED, 0, 0);
+			} else {
+				// branches with javac 7 and 8
+				assertLine("empty.close", ICounter.PARTLY_COVERED);
+			}
+		}
+	}
+
+	/**
+	 * {@link TryWithResources#throwInBody()}
+	 */
+	@Test
+	public void throwInBody() {
+		// not filtered
+		assertLine("throwInBody.try", ICounter.NOT_COVERED);
+		assertLine("throwInBody.close", ICounter.NOT_COVERED);
+	}
+
+}
diff --git a/org.jacoco.core.test/src-java7/org/jacoco/core/test/filter/targets/TryWithResources.java b/org.jacoco.core.test/src-java7/org/jacoco/core/test/filter/targets/TryWithResources.java
new file mode 100644
index 0000000..19a4651
--- /dev/null
+++ b/org.jacoco.core.test/src-java7/org/jacoco/core/test/filter/targets/TryWithResources.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.filter.targets;
+
+import static org.jacoco.core.test.validation.targets.Stubs.f;
+import static org.jacoco.core.test.validation.targets.Stubs.nop;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+/**
+ * This test target is a try-with-resources statement.
+ */
+public class TryWithResources {
+
+	private static class Resource implements Closeable {
+		@Override
+		public void close() {
+		}
+	}
+
+	/**
+	 * Closing performed using {@link org.objectweb.asm.Opcodes#INVOKEVIRTUAL}
+	 * or {@link org.objectweb.asm.Opcodes#INVOKEINTERFACE} depending on a class
+	 * of resource.
+	 */
+	private static Object test() throws Exception {
+		nop(); // $line-test.before$
+		try ( // $line-test.try$
+				Resource r1 = new Resource(); // $line-test.open1$
+				Closeable r2 = new Resource(); // $line-test.open2$
+				AutoCloseable r3 = new Resource() // $line-test.open3$
+		) {
+			return read(r1, r2, r3); // $line-test.body$
+		} // $line-test.close$
+		catch (Exception e) {
+			nop(); // $line-test.catch$
+			throw e;
+		} finally {
+			nop(); // $line-test.finally$
+		}
+	}
+
+	private static void test2() throws Exception {
+		nop(); // $line-test2.before$
+		try ( // $line-test2.try$
+				Resource r1 = new Resource(); // $line-test2.open1$
+				Closeable r2 = new Resource(); // $line-test2.open2$
+				AutoCloseable r3 = new Resource() // $line-test2.open3$
+		) {
+			read(r1, r2, r3); // $line-test2.body$
+		} // $line-test2.close$
+		catch (Exception e) {
+			nop(); // $line-test2.catch$
+		} finally {
+			nop(); // $line-test2.finally$
+		}
+		nop(); // $line-test2.after$
+	}
+
+	private static Object returnInBody() throws IOException {
+		try ( // $line-returnInBody.try$
+				Closeable r = new Resource() // $line-returnInBody.open$
+		) {
+			return read(r); // $line-returnInBody.return$
+		} // $line-returnInBody.close$
+	}
+
+	private static void nested() {
+		try ( // $line-nested.try1$
+				Resource r1 = new Resource() // $line-nested.open1$
+		) {
+
+			try ( // $line-nested.try2$
+					Resource r2 = new Resource() // $line-nested.open2$
+			) {
+				nop(r1.toString() + r2.toString()); // $line-nested.body$
+			} // $line-nested.close2$
+			catch (Exception e) {
+				nop(); // $line-nested.catch2$
+			} finally {
+				nop(); // $line-nested.finally2$
+			}
+
+		} // $line-nested.close1$
+		catch (Exception e) {
+			nop(); // $line-nested.catch1$
+		} finally {
+
+			try ( // $line-nested.try3$
+					Resource r2 = new Resource() // $line-nested.open3$
+			) {
+				nop(r2); // $line-nested.body3$
+			} // $line-nested.close3$
+			catch (Exception e) {
+				nop(); // $line-nested.catch3$
+			} finally {
+				nop(); // $line-nested.finally3$
+			}
+
+		}
+	}
+
+	/**
+	 * In this case bytecode will contain 3 copies of <code>finally</code>
+	 * block, each containing 2 branches, resulting in 6 branches in total. One
+	 * could think that this is artifact of try-with-resources, but the same
+	 * happens without it.
+	 */
+	private static Object returnInCatch() {
+		try ( // $line-returnInCatch.try1$
+				Resource r = new Resource() // $line-returnInCatch.open$
+		) {
+			read(r);
+		} // $line-returnInCatch.close$
+		catch (Exception e) {
+			return null;
+		} finally {
+			nop(!f()); // $line-returnInCatch.finally1$
+		}
+
+		try { // $line-returnInCatch.try2$
+			read(new Resource());
+		} catch (Exception e) {
+			return null;
+		} finally {
+			nop(!f()); // $line-returnInCatch.finally2$
+		}
+
+		return null;
+	}
+
+	private static Object read(Object r1, Object r2, Object r3) {
+		return r1.toString() + r2.toString() + r3.toString();
+	}
+
+	private static Object read(Object r1) {
+		return r1.toString();
+	}
+
+	public static void main(String[] args) throws Exception {
+		test();
+		test2();
+		returnInBody();
+		nested();
+
+		returnInCatch();
+
+		empty();
+		handwritten();
+	}
+
+	/*
+	 * Corner cases
+	 */
+
+	private static void empty() throws Exception {
+		try ( // $line-empty.try$
+				Closeable r = new Resource() // $line-empty.open$
+		) {
+		} // $line-empty.close$
+	}
+
+	private static void handwritten() throws IOException {
+		Closeable r = new Resource();
+		Throwable primaryExc = null;
+		try {
+			nop(r);
+		} catch (Throwable t) {
+			primaryExc = t;
+			throw t;
+		} finally {
+			if (r != null) { // $line-handwritten$
+				if (primaryExc != null) {
+					try {
+						r.close();
+					} catch (Throwable suppressedExc) {
+						primaryExc.addSuppressed(suppressedExc);
+					}
+				} else {
+					r.close();
+				}
+			}
+		}
+	}
+
+	private static void throwInBody() throws IOException {
+		try ( // $line-throwInBody.try$
+				Closeable r = new Resource()) {
+			nop(r);
+			throw new RuntimeException();
+		} // $line-throwInBody.close$
+	}
+
+}
diff --git a/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/BadCycleInterfaceTest.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/BadCycleInterfaceTest.java
new file mode 100644
index 0000000..7b7c99a
--- /dev/null
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/BadCycleInterfaceTest.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.validation.targets.BadCycleInterface;
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Test of "bad cycles" with interfaces.
+ */
+public class BadCycleInterfaceTest extends ValidationTestBase {
+
+	public BadCycleInterfaceTest() throws Exception {
+		super("src-java8", BadCycleInterface.class);
+	}
+
+	@Test
+	public void test() throws Exception {
+		final Matcher m = Pattern.compile("1\\.8\\.0_(\\d++)(-ea)?")
+				.matcher(System.getProperty("java.version"));
+		if (m.matches() && Integer.parseInt(m.group(1)) < 152) {
+			// Incorrect interpetation of JVMS 5.5 in JDK 8 causes a default
+			// method to be called before the static initializer of an interface
+			// (see JDK-8098557 and JDK-8164302):
+			assertLine("baseclinit", ICounter.FULLY_COVERED);
+			assertLine("childdefault", ICounter.FULLY_COVERED);
+
+			assertLogEvents("baseclinit", "childdefaultmethod", "childclinit",
+					"childstaticmethod");
+		} else {
+			// This shouldn't happen with JDK 9 (see also JDK-8043275)
+			// and starting with JDK 8u152 (see JDK-8167607):
+			assertLine("baseclinit", ICounter.EMPTY);
+			assertLine("childdefault", ICounter.NOT_COVERED);
+			assertLogEvents("childclinit", "childstaticmethod");
+		}
+		assertLine("childclinit", ICounter.FULLY_COVERED);
+		assertLine("childstatic", ICounter.FULLY_COVERED);
+	}
+
+}
diff --git a/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/BootstrapMethodReferenceTest.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/BootstrapMethodReferenceTest.java
new file mode 100644
index 0000000..987d11e
--- /dev/null
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/BootstrapMethodReferenceTest.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation;
+
+import static org.junit.Assert.assertEquals;
+
+import java.lang.invoke.CallSite;
+import java.lang.invoke.ConstantCallSite;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+import java.lang.reflect.InvocationTargetException;
+
+import org.jacoco.core.instr.Instrumenter;
+import org.jacoco.core.runtime.IRuntime;
+import org.jacoco.core.runtime.RuntimeData;
+import org.jacoco.core.runtime.SystemPropertiesRuntime;
+import org.jacoco.core.test.TargetLoader;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+/**
+ * Test of ASM bug <a href=
+ * "http://forge.ow2.org/tracker/?func=detail&aid=317748&group_id=23&atid=100023">#317748</a>
+ * that caused
+ * {@code java.lang.ClassFormatError: Short length on BootstrapMethods in class file}
+ * during instrumentation.
+ */
+public class BootstrapMethodReferenceTest {
+
+	private final IRuntime runtime = new SystemPropertiesRuntime();
+	private final Instrumenter instrumenter = new Instrumenter(runtime);
+
+	@Before
+	public void setup() throws Exception {
+		runtime.startup(new RuntimeData());
+	}
+
+	@After
+	public void teardown() {
+		runtime.shutdown();
+	}
+
+	@Test
+	public void test() throws Exception {
+		final String className = "Example";
+
+		final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
+		cw.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC, className, null,
+				"java/lang/Object", null);
+
+		final MethodVisitor mv = cw.visitMethod(
+				Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "run", "()I", null,
+				null);
+		mv.visitCode();
+		addCauseOfResizeInstructions(mv);
+		final MethodType methodType = MethodType.methodType(CallSite.class,
+				MethodHandles.Lookup.class, String.class, MethodType.class);
+		final Handle handle = new Handle(Opcodes.H_INVOKESTATIC,
+				this.getClass().getCanonicalName().replace('.', '/'),
+				"bootstrap", methodType.toMethodDescriptorString(), false);
+		mv.visitInvokeDynamicInsn("invoke", "()I", handle);
+		mv.visitInsn(Opcodes.IRETURN);
+		mv.visitMaxs(1, 0);
+		mv.visitEnd();
+
+		cw.visitEnd();
+
+		final byte[] original = cw.toByteArray();
+		assertEquals(42, run(className, original));
+
+		final byte[] instrumented = instrumenter.instrument(original,
+				className);
+		assertEquals(42, run(className, instrumented));
+	}
+
+	private static int run(final String className, final byte[] bytes)
+			throws ClassNotFoundException, NoSuchMethodException,
+			InvocationTargetException, IllegalAccessException {
+		return (Integer) new TargetLoader().add(className, bytes)
+				.getMethod("run").invoke(null);
+	}
+
+	/**
+	 * Adds code that triggers usage of
+	 * {@link org.objectweb.asm.MethodWriter#INSERTED_FRAMES} during
+	 * instrumentation.
+	 */
+	private static void addCauseOfResizeInstructions(final MethodVisitor mv) {
+		mv.visitInsn(Opcodes.ICONST_0);
+		mv.visitInsn(Opcodes.ICONST_1);
+		final Label target = new Label();
+		mv.visitJumpInsn(Opcodes.IFLE, target);
+		for (int i = 0; i < Short.MAX_VALUE; i++) {
+			mv.visitInsn(Opcodes.NOP);
+		}
+		mv.visitLabel(target);
+	}
+
+	@SuppressWarnings("unused")
+	public static CallSite bootstrap(final MethodHandles.Lookup caller,
+			final String name, final MethodType type) throws Exception {
+		return new ConstantCallSite(caller.findStatic(BootstrapMethodReferenceTest.class,
+				"callTarget", MethodType.methodType(int.class)));
+	}
+
+	@SuppressWarnings("unused")
+	public static int callTarget() {
+		return 42;
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/InterfaceDefaultMethodsTest.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/InterfaceDefaultMethodsTest.java
similarity index 67%
rename from org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/InterfaceDefaultMethodsTest.java
rename to org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/InterfaceDefaultMethodsTest.java
index a7afcb3..f73a984 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/InterfaceDefaultMethodsTest.java
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/InterfaceDefaultMethodsTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -9,24 +9,19 @@
  *    Marc R. Hoffmann - initial API and implementation
  *    
  *******************************************************************************/
-package org.jacoco.core.test.validation.java8;
+package org.jacoco.core.test.validation;
 
 import org.jacoco.core.analysis.ICounter;
-import org.jacoco.core.test.validation.ValidationTestBase;
+import org.jacoco.core.test.validation.targets.InterfaceDefaultMethodsTarget;
 import org.junit.Test;
 
 /**
- * Tests of static initializer in interfaces.
+ * Tests of static initializer and default methods in interfaces.
  */
 public class InterfaceDefaultMethodsTest extends ValidationTestBase {
 
 	public InterfaceDefaultMethodsTest() {
-		super(InterfaceDefaultMethodsTarget.class);
-	}
-
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		loader.add(InterfaceDefaultMethodsTarget.Impl.class).newInstance();
+		super("src-java8", InterfaceDefaultMethodsTarget.class);
 	}
 
 	@Test
diff --git a/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/InterfaceOnlyDefaultMethodsTest.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/InterfaceOnlyDefaultMethodsTest.java
new file mode 100644
index 0000000..aeb5182
--- /dev/null
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/InterfaceOnlyDefaultMethodsTest.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.validation.targets.InterfaceOnlyDefaultMethodsTarget;
+import org.junit.Test;
+
+/**
+ * Tests of default methods in interfaces.
+ */
+public class InterfaceOnlyDefaultMethodsTest extends ValidationTestBase {
+
+	public InterfaceOnlyDefaultMethodsTest() {
+		super("src-java8", InterfaceOnlyDefaultMethodsTarget.class);
+	}
+
+	@Test
+	public void testCoverageResult() {
+		assertLine("m1", ICounter.FULLY_COVERED);
+		assertLine("m2", ICounter.NOT_COVERED);
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTest.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/LambdaExpressionsTest.java
similarity index 67%
rename from org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTest.java
rename to org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/LambdaExpressionsTest.java
index deb2d49..56bdb2b 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTest.java
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/LambdaExpressionsTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -9,25 +9,19 @@
  *    Marc R. Hoffmann - initial API and implementation
  *    
  *******************************************************************************/
-package org.jacoco.core.test.validation.java8;
+package org.jacoco.core.test.validation;
 
 import org.jacoco.core.analysis.ICounter;
-import org.jacoco.core.test.validation.ValidationTestBase;
+import org.jacoco.core.test.validation.targets.LambdaExpressionsTarget;
 import org.junit.Test;
 
 /**
- * Tests of basic Java control structures.
+ * Tests for different lambda expressions.
  */
 public class LambdaExpressionsTest extends ValidationTestBase {
 
 	public LambdaExpressionsTest() {
-		super(LambdaExpressionsTarget.class);
-	}
-
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		final Object instance = targetClass.newInstance();
-		((Runnable) instance).run();
+		super("src-java8", LambdaExpressionsTarget.class);
 	}
 
 	@Test
diff --git a/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/LambdaInInterfaceTest.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/LambdaInInterfaceTest.java
new file mode 100644
index 0000000..304f763
--- /dev/null
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/LambdaInInterfaceTest.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann - initial API and implementation
+ *    
+ *******************************************************************************/
+package org.jacoco.core.test.validation;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.validation.targets.LambdaInInterfaceTarget;
+import org.junit.Test;
+
+/**
+ * Tests a constant with a lambda value in an interface.
+ */
+public class LambdaInInterfaceTest extends ValidationTestBase {
+
+	public LambdaInInterfaceTest() {
+		super("src-java8", LambdaInInterfaceTarget.class);
+	}
+
+	@Override
+	protected void run(final Class<?> targetClass) throws Exception {
+		((Runnable) targetClass.getField("RUN").get(null)).run();
+	}
+
+	@Test
+	public void testCoverageResult() {
+
+		// Coverage of lambda body
+		assertLine("lambdabody", ICounter.FULLY_COVERED);
+
+	}
+
+}
diff --git a/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/BadCycleInterface.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/BadCycleInterface.java
new file mode 100644
index 0000000..e33bf0d
--- /dev/null
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/BadCycleInterface.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation.targets;
+
+public class BadCycleInterface {
+
+	public interface Base {
+		static final Object BASE_CONST = new Child() {
+			{
+				Stubs.logEvent("baseclinit"); // $line-baseclinit$
+			}
+		}.childDefaultMethod();
+
+		default void baseDefaultMethod() {
+		}
+	}
+
+	public interface Child extends Base {
+		static final Object CHILD_CONST = new Object() {
+			{
+				Stubs.logEvent("childclinit"); // $line-childclinit$
+			}
+		};
+
+		default Object childDefaultMethod() {
+			Stubs.logEvent("childdefaultmethod"); // $line-childdefault$
+			return null;
+		}
+
+		static void childStaticMethod() {
+			Stubs.logEvent("childstaticmethod"); // $line-childstatic$
+		}
+	}
+
+	public static void main(String[] args) {
+		Child.childStaticMethod();
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/InterfaceDefaultMethodsTarget.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/InterfaceDefaultMethodsTarget.java
similarity index 77%
rename from org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/InterfaceDefaultMethodsTarget.java
rename to org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/InterfaceDefaultMethodsTarget.java
index 7c40c89..ef43215 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/InterfaceDefaultMethodsTarget.java
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/InterfaceDefaultMethodsTarget.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -9,12 +9,12 @@
  *    Marc R. Hoffmann - initial API and implementation
  *    
  *******************************************************************************/
-package org.jacoco.core.test.validation.java8;
+package org.jacoco.core.test.validation.targets;
 
 import static org.jacoco.core.test.validation.targets.Stubs.i1;
 
 /**
- * This test target is an interface with a class initializer.
+ * This test target is an interface with a class initializer and default methods.
  */
 public interface InterfaceDefaultMethodsTarget {
 
@@ -34,5 +34,9 @@
 			m1();
 		}
 	}
+	
+	public static void main(String[] args) {
+		new Impl();
+	}
 
 }
diff --git a/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/InterfaceOnlyDefaultMethodsTarget.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/InterfaceOnlyDefaultMethodsTarget.java
new file mode 100644
index 0000000..f324cdf
--- /dev/null
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/InterfaceOnlyDefaultMethodsTarget.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation.targets;
+
+/**
+ * This test target is an interface with only default methods.
+ */
+public interface InterfaceOnlyDefaultMethodsTarget {
+
+	// no <clinit>, only default methods:
+
+	default void m1() {
+		return; // $line-m1$
+	}
+
+	default void m2() {
+		return; // $line-m2$
+	}
+
+	public class Impl implements InterfaceOnlyDefaultMethodsTarget {
+
+		public Impl() {
+			m1();
+		}
+	}
+
+	public static void main(String[] args) {
+		new Impl();
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTarget.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/LambdaExpressionsTarget.java
similarity index 78%
rename from org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTarget.java
rename to org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/LambdaExpressionsTarget.java
index e57f4bd..0d75b68 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/java8/LambdaExpressionsTarget.java
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/LambdaExpressionsTarget.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -9,7 +9,7 @@
  *    Marc R. Hoffmann - initial API and implementation
  *    
  *******************************************************************************/
-package org.jacoco.core.test.validation.java8;
+package org.jacoco.core.test.validation.targets;
 
 import static org.jacoco.core.test.validation.targets.Stubs.exec;
 import static org.jacoco.core.test.validation.targets.Stubs.noexec;
@@ -18,11 +18,10 @@
 /**
  * This test target contains different lambda expressions.
  */
-public class LambdaExpressionsTarget implements Runnable {
+public class LambdaExpressionsTarget {
 
-	@Override
-	public void run() {
-		
+	public static void main(String[] args) {
+
 		exec(() -> {
 			nop(); // $line-executedlambdabody$
 		});
@@ -30,11 +29,7 @@
 		noexec(() -> {
 			nop(); // $line-notexecutedlambdabody$
 		});
-		
-	}
 
-	public static void main(String[] args) {
-		new LambdaExpressionsTarget().run();
 	}
 
 }
diff --git a/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/LambdaInInterfaceTarget.java b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/LambdaInInterfaceTarget.java
new file mode 100644
index 0000000..a4b55dc
--- /dev/null
+++ b/org.jacoco.core.test/src-java8/org/jacoco/core/test/validation/targets/LambdaInInterfaceTarget.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann - initial API and implementation
+ *    
+ *******************************************************************************/
+package org.jacoco.core.test.validation.targets;
+
+import static org.jacoco.core.test.validation.targets.Stubs.nop;
+
+/**
+ * This test target builds a constant with a lambda value in an interface.
+ */
+public interface LambdaInInterfaceTarget {
+
+	public static final Runnable RUN = () -> {
+		nop(); // $line-lambdabody$
+	};
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/JaCoCoTest.java b/org.jacoco.core.test/src/org/jacoco/core/JaCoCoTest.java
index f026e32..80f8e05 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/JaCoCoTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/JaCoCoTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/analysis/AnalyzerTest.java b/org.jacoco.core.test/src/org/jacoco/core/analysis/AnalyzerTest.java
index 6a9275e..4d058e8 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/analysis/AnalyzerTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/analysis/AnalyzerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -21,6 +21,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.InputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Arrays;
@@ -35,6 +36,7 @@
 import java.util.zip.ZipOutputStream;
 
 import org.jacoco.core.data.ExecutionDataStore;
+import org.jacoco.core.internal.Java9Support;
 import org.jacoco.core.internal.data.CRC64;
 import org.jacoco.core.test.TargetLoader;
 import org.junit.Before;
@@ -90,8 +92,9 @@
 
 	@Test
 	public void testAnalyzeClassIdMatch() throws IOException {
-		final byte[] bytes = TargetLoader
-				.getClassDataAsBytes(AnalyzerTest.class);
+		// class IDs are always calculated after downgrade of the version
+		final byte[] bytes = Java9Support.downgradeIfRequired(
+				TargetLoader.getClassDataAsBytes(AnalyzerTest.class));
 		executionData.get(Long.valueOf(CRC64.checksum(bytes)),
 				"org/jacoco/core/analysis/AnalyzerTest", 200);
 		analyzer.analyzeClass(bytes, "Test");
@@ -115,10 +118,10 @@
 				.getClassDataAsBytes(AnalyzerTest.class);
 		brokenclass[10] = 0x23;
 		try {
-			analyzer.analyzeClass(brokenclass, "Broken");
-			fail();
+			analyzer.analyzeClass(brokenclass, "Broken.class");
+			fail("expected exception");
 		} catch (IOException e) {
-			assertEquals("Error while analyzing class Broken.", e.getMessage());
+			assertEquals("Error while analyzing Broken.class.", e.getMessage());
 		}
 	}
 
@@ -155,6 +158,40 @@
 		assertEquals(0, count);
 	}
 
+	/**
+	 * Triggers exception in
+	 * {@link Analyzer#analyzeAll(java.io.InputStream, String)}.
+	 */
+	@Test
+	public void testAnalyzeAll_Broken() throws IOException {
+		try {
+			analyzer.analyzeAll(new InputStream() {
+				@Override
+				public int read() throws IOException {
+					throw new IOException();
+				}
+			}, "Test");
+			fail("expected exception");
+		} catch (IOException e) {
+			assertEquals("Error while analyzing Test.", e.getMessage());
+		}
+	}
+
+	/**
+	 * Triggers exception in
+	 * {@link Analyzer#analyzeGzip(java.io.InputStream, String)}.
+	 */
+	@Test
+	public void testAnalyzeAll_BrokenGZ() {
+		final byte[] buffer = new byte[] { 0x1f, (byte) 0x8b, 0x00, 0x00 };
+		try {
+			analyzer.analyzeAll(new ByteArrayInputStream(buffer), "Test.gz");
+			fail("expected exception");
+		} catch (IOException e) {
+			assertEquals("Error while analyzing Test.gz.", e.getMessage());
+		}
+	}
+
 	@Test
 	public void testAnalyzeAll_Pack200() throws IOException {
 		final ByteArrayOutputStream zipbuffer = new ByteArrayOutputStream();
@@ -177,6 +214,23 @@
 		assertClasses("org/jacoco/core/analysis/AnalyzerTest");
 	}
 
+	/**
+	 * Triggers exception in
+	 * {@link Analyzer#analyzePack200(java.io.InputStream, String)}.
+	 */
+	@Test
+	public void testAnalyzeAll_BrokenPack200() {
+		final byte[] buffer = new byte[] { (byte) 0xca, (byte) 0xfe,
+				(byte) 0xd0, 0x0d };
+		try {
+			analyzer.analyzeAll(new ByteArrayInputStream(buffer),
+					"Test.pack200");
+			fail("expected exception");
+		} catch (IOException e) {
+			assertEquals("Error while analyzing Test.pack200.", e.getMessage());
+		}
+	}
+
 	@Test
 	public void testAnalyzeAll_Empty() throws IOException {
 		final int count = analyzer.analyzeAll(new ByteArrayInputStream(
@@ -204,17 +258,56 @@
 				"org/jacoco/core/analysis/AnalyzerTest");
 	}
 
-	@Test(expected = IOException.class)
-	public void testAnalyzeAll_BrokenZip() throws IOException {
+	/**
+	 * Triggers exception in
+	 * {@link Analyzer#nextEntry(java.util.zip.ZipInputStream, String)}.
+	 */
+	@Test
+	public void testAnalyzeAll_BrokenZip() {
+		final byte[] buffer = new byte[30];
+		buffer[0] = 0x50;
+		buffer[1] = 0x4b;
+		buffer[2] = 0x03;
+		buffer[3] = 0x04;
+		Arrays.fill(buffer, 4, buffer.length, (byte) 0x42);
+		try {
+			analyzer.analyzeAll(new ByteArrayInputStream(buffer), "Test.zip");
+			fail("expected exception");
+		} catch (IOException e) {
+			assertEquals("Error while analyzing Test.zip.", e.getMessage());
+		}
+	}
+
+	/**
+	 * With JDK 5 triggers exception in
+	 * {@link Analyzer#nextEntry(ZipInputStream, String)},
+	 * i.e. message will contain only "broken.zip".
+	 *
+	 * With JDK > 5 triggers exception in
+	 * {@link Analyzer#analyzeAll(java.io.InputStream, String)},
+	 * i.e. message will contain only "broken.zip@brokenentry.txt".
+	 */
+	@Test
+	public void testAnalyzeAll_BrokenZipEntry() throws IOException {
 		File file = new File(folder.getRoot(), "broken.zip");
 		OutputStream out = new FileOutputStream(file);
 		ZipOutputStream zip = new ZipOutputStream(out);
 		zip.putNextEntry(new ZipEntry("brokenentry.txt"));
 		out.write(0x23); // Unexpected data here
 		zip.close();
-		analyzer.analyzeAll(file);
+		try {
+			analyzer.analyzeAll(file);
+			fail("expected exception");
+		} catch (IOException e) {
+			assertTrue(e.getMessage().startsWith("Error while analyzing"));
+			assertTrue(e.getMessage().contains("broken.zip"));
+		}
 	}
 
+	/**
+	 * Triggers exception in
+	 * {@link Analyzer#analyzeClass(java.io.InputStream, String)}.
+	 */
 	@Test
 	public void testAnalyzeAll_BrokenClassFileInZip() throws IOException {
 		final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
@@ -230,10 +323,10 @@
 		try {
 			analyzer.analyzeAll(new ByteArrayInputStream(buffer.toByteArray()),
 					"test.zip");
-			fail();
+			fail("expected exception");
 		} catch (IOException e) {
 			assertEquals(
-					"Error while analyzing class test.zip@org/jacoco/core/analysis/AnalyzerTest.class.",
+					"Error while analyzing test.zip@org/jacoco/core/analysis/AnalyzerTest.class.",
 					e.getMessage());
 		}
 	}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/analysis/CounterComparatorTest.java b/org.jacoco.core.test/src/org/jacoco/core/analysis/CounterComparatorTest.java
index 2972ac3..bb73416 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/analysis/CounterComparatorTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/analysis/CounterComparatorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageBuilderTest.java b/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageBuilderTest.java
index d126499..277c8c9 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageBuilderTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageBuilderTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -165,6 +165,27 @@
 	}
 
 	@Test
+	public void testCreateSourceFileDuplicateClassNameIdentical() {
+		final MethodCoverageImpl method1 = new MethodCoverageImpl("doit",
+				"()V", null);
+		method1.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 3);
+		addClass(123L, false, "Sample", "Sample.java", method1);
+
+		final MethodCoverageImpl method2 = new MethodCoverageImpl("doit",
+				"()V", null);
+		method2.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 3);
+		addClass(123L, false, "Sample", "Sample.java", method2);
+
+		final Collection<ISourceFileCoverage> sourcefiles = coverageBuilder
+				.getSourceFiles();
+		assertEquals(1, sourcefiles.size());
+		ISourceFileCoverage s = sourcefiles.iterator().next();
+
+		assertEquals(1, s.getClassCounter().getTotalCount());
+		assertEquals(0, s.getClassCounter().getCoveredCount());
+	}
+
+	@Test
 	public void testGetBundle() {
 		final MethodCoverageImpl method1 = new MethodCoverageImpl("doit",
 				"()V", null);
@@ -237,7 +258,7 @@
 	private void addClass(long id, boolean nomatch, String name, String source,
 			MethodCoverageImpl... methods) {
 		final ClassCoverageImpl coverage = new ClassCoverageImpl(name, id,
-				nomatch, null, "java/lang/Object", new String[0]);
+				nomatch);
 		coverage.setSourceFileName(source);
 		for (MethodCoverageImpl m : methods) {
 			coverage.addMethod(m);
diff --git a/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageNodeImplTest.java b/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageNodeImplTest.java
index be4c13a..be0b581 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageNodeImplTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageNodeImplTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/analysis/NodeComparatorTest.java b/org.jacoco.core.test/src/org/jacoco/core/analysis/NodeComparatorTest.java
index b4f3c7f..a1c7ec1 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/analysis/NodeComparatorTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/analysis/NodeComparatorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataReaderWriterTest.java b/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataReaderWriterTest.java
index 0efcf7a..beb2df5 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataReaderWriterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataReaderWriterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -19,6 +19,7 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Arrays;
@@ -87,17 +88,17 @@
 
 	@Test
 	public void testCustomBlocks() throws IOException {
-		buffer.write(-22);
-		buffer.write(-33);
+		buffer.write(0x55);
+		buffer.write(0x66);
 		final ExecutionDataReader reader = new ExecutionDataReader(
 				new ByteArrayInputStream(buffer.toByteArray())) {
 
 			@Override
 			protected boolean readBlock(byte blocktype) throws IOException {
 				switch (blocktype) {
-				case -22:
+				case 0x55:
 					return true;
-				case -33:
+				case 0x66:
 					return false;
 				}
 				return super.readBlock(blocktype);
@@ -135,13 +136,13 @@
 		createReader().read();
 	}
 
-	@Test(expected = IOException.class)
-	public void testInvalidHeaderVersion() throws IOException {
+	@Test(expected = IncompatibleExecDataVersionException.class)
+	public void testInvalidVersion() throws IOException {
 		buffer = new ByteArrayOutputStream();
 		buffer.write(ExecutionDataWriter.BLOCK_HEADER);
 		buffer.write(0xC0);
 		buffer.write(0xC0);
-		final char version = ExecutionDataWriter.FORMAT_VERSION - 1;
+		final char version = (char) (ExecutionDataWriter.FORMAT_VERSION - 1);
 		buffer.write(version >> 8);
 		buffer.write(version & 0xFF);
 		createReader().read();
@@ -151,7 +152,7 @@
 	public void testMissingHeader() throws IOException {
 		buffer.reset();
 		writer.visitClassExecution(new ExecutionData(Long.MIN_VALUE, "Sample",
-				createData(0)));
+				createData(8)));
 		createReaderWithVisitors().read();
 	}
 
@@ -161,9 +162,19 @@
 		createReader().read();
 	}
 
+	@Test(expected = EOFException.class)
+	public void testTruncatedFile() throws IOException {
+		writer.visitClassExecution(new ExecutionData(Long.MIN_VALUE, "Sample",
+				createData(8)));
+		final byte[] content = buffer.toByteArray();
+		buffer.reset();
+		buffer.write(content, 0, content.length - 1);
+		createReaderWithVisitors().read();
+	}
+
 	@Test
 	public void testEmptyFile() throws IOException {
-		buffer = new ByteArrayOutputStream();
+		buffer.reset();
 		createReader().read();
 	}
 
@@ -206,13 +217,13 @@
 	@Test(expected = IOException.class)
 	public void testNoExecutionDataVisitor() throws IOException {
 		writer.visitClassExecution(new ExecutionData(Long.MIN_VALUE, "Sample",
-				createData(0)));
+				createData(8)));
 		createReader().read();
 	}
 
 	@Test
 	public void testMinClassId() throws IOException {
-		final boolean[] data = createData(0);
+		final boolean[] data = createData(8);
 		writer.visitClassExecution(new ExecutionData(Long.MIN_VALUE, "Sample",
 				data));
 		assertFalse(createReaderWithVisitors().read());
@@ -221,7 +232,7 @@
 
 	@Test
 	public void testMaxClassId() throws IOException {
-		final boolean[] data = createData(0);
+		final boolean[] data = createData(8);
 		writer.visitClassExecution(new ExecutionData(Long.MAX_VALUE, "Sample",
 				data));
 		assertFalse(createReaderWithVisitors().read());
@@ -233,12 +244,20 @@
 		final boolean[] data = createData(0);
 		writer.visitClassExecution(new ExecutionData(3, "Sample", data));
 		assertFalse(createReaderWithVisitors().read());
-		assertArrayEquals(data, store.get(3).getProbes());
+		assertTrue(store.getContents().isEmpty());
+	}
+
+	@Test
+	public void testNoHitClass() throws IOException {
+		final boolean[] data = new boolean[] { false, false, false };
+		writer.visitClassExecution(new ExecutionData(3, "Sample", data));
+		assertFalse(createReaderWithVisitors().read());
+		assertTrue(store.getContents().isEmpty());
 	}
 
 	@Test
 	public void testOneClass() throws IOException {
-		final boolean[] data = createData(5);
+		final boolean[] data = createData(15);
 		writer.visitClassExecution(new ExecutionData(3, "Sample", data));
 		assertFalse(createReaderWithVisitors().read());
 		assertArrayEquals(data, store.get(3).getProbes());
@@ -246,8 +265,8 @@
 
 	@Test
 	public void testTwoClasses() throws IOException {
-		final boolean[] data1 = createData(5);
-		final boolean[] data2 = createData(7);
+		final boolean[] data1 = createData(15);
+		final boolean[] data2 = createData(185);
 		writer.visitClassExecution(new ExecutionData(333, "Sample", data1));
 		writer.visitClassExecution(new ExecutionData(-45, "Sample", data2));
 		assertFalse(createReaderWithVisitors().read());
@@ -257,7 +276,7 @@
 
 	@Test
 	public void testBigClass() throws IOException {
-		final boolean[] data = createData(117);
+		final boolean[] data = createData(3599);
 		writer.visitClassExecution(new ExecutionData(123, "Sample", data));
 		assertFalse(createReaderWithVisitors().read());
 		assertArrayEquals(data, store.get(123).getProbes());
@@ -290,7 +309,7 @@
 	}
 
 	private boolean[] createData(final int probeCount) {
-		final boolean[] data = new boolean[random.nextInt(probeCount + 1)];
+		final boolean[] data = new boolean[probeCount];
 		for (int j = 0; j < data.length; j++) {
 			data[j] = random.nextBoolean();
 		}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataStoreTest.java b/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataStoreTest.java
index ba482f9..7185cd2 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataStoreTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataStoreTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -64,6 +64,20 @@
 	}
 
 	@Test
+	public void testReentrantAccept() {
+		final boolean[] probes = new boolean[] { false, false, true };
+		store.put(new ExecutionData(1000, "Sample0", probes));
+		store.put(new ExecutionData(1001, "Sample1", probes));
+		store.accept(new IExecutionDataVisitor() {
+			public void visitClassExecution(ExecutionData data) {
+				store.put(new ExecutionData(1002, "Sample2", probes));
+				ExecutionDataStoreTest.this.visitClassExecution(data);
+			}
+		});
+		assertEquals(2, dataOutput.size());
+	}
+
+	@Test
 	public void testGetContents() {
 		final boolean[] probes = new boolean[] {};
 		final ExecutionData a = new ExecutionData(1000, "A", probes);
diff --git a/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataTest.java b/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataTest.java
index 3b99dd8..eba3d7c 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -54,6 +54,22 @@
 	}
 
 	@Test
+	public void testHasHits() {
+		final boolean[] probes = new boolean[] { false, false, false };
+		final ExecutionData e = new ExecutionData(5, "Example", probes);
+		assertFalse(e.hasHits());
+		probes[1] = true;
+		assertTrue(e.hasHits());
+	}
+
+	@Test
+	public void testHasHits_empty() {
+		final boolean[] probes = new boolean[] {};
+		final ExecutionData e = new ExecutionData(5, "Example", probes);
+		assertFalse(e.hasHits());
+	}
+
+	@Test
 	public void testMerge() {
 		final ExecutionData a = new ExecutionData(5, "Example", new boolean[] {
 				false, true, false, true });
diff --git a/org.jacoco.core.test/src/org/jacoco/core/data/IncompatibleExecDataVersionExceptionTest.java b/org.jacoco.core.test/src/org/jacoco/core/data/IncompatibleExecDataVersionExceptionTest.java
new file mode 100644
index 0000000..4d4a3c8
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/data/IncompatibleExecDataVersionExceptionTest.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann - initial API and implementation
+ *    
+ *******************************************************************************/
+package org.jacoco.core.data;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for {@link IncompatibleExecDataVersionExceptionTest}.
+ */
+public class IncompatibleExecDataVersionExceptionTest {
+
+	private IncompatibleExecDataVersionException exception;
+
+	@Before
+	public void setup() {
+		exception = new IncompatibleExecDataVersionException(0x1234);
+	}
+
+	@Test
+	public void testGetMessage() {
+		String expected = "Cannot read execution data version 0x1234. "
+				+ "This version of JaCoCo uses execution data version 0x"
+				+ Integer.toHexString(ExecutionDataWriter.FORMAT_VERSION) + ".";
+		assertEquals(expected, exception.getMessage());
+	}
+
+	@Test
+	public void testGetActualVersion() {
+		assertEquals(0x1234, exception.getActualVersion());
+	}
+
+	@Test
+	public void testGetExpectedVersion() {
+		assertEquals(ExecutionDataWriter.FORMAT_VERSION,
+				exception.getExpectedVersion());
+	}
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/data/SessionInfoStoreTest.java b/org.jacoco.core.test/src/org/jacoco/core/data/SessionInfoStoreTest.java
index 4ea1dad..52846f4 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/data/SessionInfoStoreTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/data/SessionInfoStoreTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/data/SessionInfoTest.java b/org.jacoco.core.test/src/org/jacoco/core/data/SessionInfoTest.java
index 1a9eae1..2a2725c 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/data/SessionInfoTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/data/SessionInfoTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/instr/InstrumenterTest.java b/org.jacoco.core.test/src/org/jacoco/core/instr/InstrumenterTest.java
index 87e2c9a..f674c66 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/instr/InstrumenterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/instr/InstrumenterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -23,6 +23,7 @@
 import java.io.ObjectOutputStream;
 import java.io.OutputStream;
 import java.io.Serializable;
+import java.util.Arrays;
 import java.util.jar.JarInputStream;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Pack200;
@@ -91,31 +92,57 @@
 		assertEquals("org.jacoco.core.instr.InstrumenterTest", clazz.getName());
 	}
 
+	/**
+	 * Triggers exception in {@link Instrumenter#instrument(byte[], String)}.
+	 */
 	@Test
 	public void testInstrumentBrokenClass1() throws IOException {
 		final byte[] brokenclass = TargetLoader
 				.getClassDataAsBytes(AnalyzerTest.class);
 		brokenclass[10] = 0x23;
 		try {
-			instrumenter.instrument(brokenclass, "Broken");
+			instrumenter.instrument(brokenclass, "Broken.class");
 			fail();
 		} catch (IOException e) {
-			assertEquals("Error while instrumenting class Broken.",
+			assertEquals("Error while instrumenting Broken.class.",
 					e.getMessage());
 		}
 	}
 
+	private static class BrokenInputStream extends InputStream {
+		@Override
+		public int read() throws IOException {
+			throw new IOException();
+		}
+	}
+
+	/**
+	 * Triggers exception in
+	 * {@link Instrumenter#instrument(InputStream, String)}.
+	 */
 	@Test
-	public void testInstrumentBrokenClass2() throws IOException {
-		final byte[] brokenclass = TargetLoader
-				.getClassDataAsBytes(AnalyzerTest.class);
-		brokenclass[10] = 0x23;
+	public void testInstrumentBrokenStream() {
 		try {
-			instrumenter.instrument(new ByteArrayInputStream(brokenclass),
-					"Broken");
-			fail();
+			instrumenter.instrument(new BrokenInputStream(), "BrokenStream");
+			fail("exception expected");
 		} catch (IOException e) {
-			assertEquals("Error while instrumenting class Broken.",
+			assertEquals("Error while instrumenting BrokenStream.",
+					e.getMessage());
+		}
+	}
+
+	/**
+	 * Triggers exception in
+	 * {@link Instrumenter#instrument(InputStream, OutputStream, String)}.
+	 */
+	@Test
+	public void testInstrumentBrokenStream2() {
+		try {
+			instrumenter.instrument(new BrokenInputStream(),
+					new ByteArrayOutputStream(), "BrokenStream");
+			fail("exception expected");
+		} catch (IOException e) {
+			assertEquals("Error while instrumenting BrokenStream.",
 					e.getMessage());
 		}
 	}
@@ -169,6 +196,97 @@
 		assertNull(zipin.getNextEntry());
 	}
 
+	/**
+	 * Triggers exception in
+	 * {@link org.jacoco.core.internal.ContentTypeDetector#ContentTypeDetector(InputStream)}.
+	 */
+	@Test
+	public void testInstrumentAll_Broken() {
+		try {
+			instrumenter.instrumentAll(new BrokenInputStream(),
+					new ByteArrayOutputStream(), "Broken");
+			fail("exception expected");
+		} catch (IOException e) {
+			assertEquals("Error while instrumenting Broken.", e.getMessage());
+		}
+	}
+
+	/**
+	 * Triggers exception in
+	 * {@link Instrumenter#copy(InputStream, OutputStream)}.
+	 */
+	@Test
+	public void testInstrumentAll_Broken2() {
+		final InputStream inputStream = new InputStream() {
+			private int count;
+
+			@Override
+			public int read() throws IOException {
+				count++;
+				if (count > 4) {
+					throw new IOException();
+				}
+				return 0;
+			}
+		};
+
+		try {
+			instrumenter.instrumentAll(inputStream, new ByteArrayOutputStream(),
+					"Broken");
+		} catch (IOException e) {
+			assertEquals("Error while instrumenting Broken.", e.getMessage());
+		}
+	}
+
+	/**
+	 * Triggers exception in
+	 * {@link Instrumenter#nextEntry(ZipInputStream, String)}.
+	 */
+	@Test
+	public void testInstrumentAll_BrokenZip() {
+		final byte[] buffer = new byte[30];
+		buffer[0] = 0x50;
+		buffer[1] = 0x4b;
+		buffer[2] = 0x03;
+		buffer[3] = 0x04;
+		Arrays.fill(buffer, 4, buffer.length, (byte) 0x42);
+
+		try {
+			instrumenter.instrumentAll(new ByteArrayInputStream(buffer),
+					new ByteArrayOutputStream(), "Test.zip");
+			fail("exception expected");
+		} catch (IOException e) {
+			assertEquals("Error while instrumenting Test.zip.", e.getMessage());
+		}
+	}
+
+	/**
+	 * With JDK <= 6 triggers exception in
+	 * {@link Instrumenter#copy(InputStream, OutputStream)}.
+	 *
+	 * With JDK > 6 triggers exception in
+	 * {@link org.jacoco.core.internal.ContentTypeDetector#ContentTypeDetector(InputStream)}.
+	 */
+	@Test
+	public void testInstrumentAll_BrokenZipEntry() throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		ZipOutputStream zip = new ZipOutputStream(out);
+		zip.putNextEntry(new ZipEntry("brokenentry.txt"));
+		out.write(0x23); // Unexpected data here
+		zip.close();
+
+		try {
+			instrumenter.instrumentAll(
+					new ByteArrayInputStream(out.toByteArray()),
+					new ByteArrayOutputStream(), "broken.zip");
+			fail("exception expected");
+		} catch (IOException e) {
+			assertEquals(
+					"Error while instrumenting broken.zip@brokenentry.txt.",
+					e.getMessage());
+		}
+	}
+
 	@Test
 	public void testInstrumentAll_BrokenClassFileInZip() throws IOException {
 		ByteArrayOutputStream buffer = new ByteArrayOutputStream();
@@ -186,12 +304,28 @@
 					"test.zip");
 			fail();
 		} catch (IOException e) {
-			assertEquals(
-					"Error while instrumenting class test.zip@Test.class.",
+			assertEquals("Error while instrumenting test.zip@Test.class.",
 					e.getMessage());
 		}
 	}
 
+	/**
+	 * Triggers exception in
+	 * {@link Instrumenter#instrumentGzip(InputStream, OutputStream, String)}.
+	 */
+	@Test
+	public void testInstrumentAll_BrokenGZ() {
+		final byte[] buffer = new byte[] { 0x1f, (byte) 0x8b, 0x00, 0x00 };
+
+		try {
+			instrumenter.instrumentAll(new ByteArrayInputStream(buffer),
+					new ByteArrayOutputStream(), "Test.gz");
+			fail("exception expected");
+		} catch (IOException e) {
+			assertEquals("Error while instrumenting Test.gz.", e.getMessage());
+		}
+	}
+
 	@Test
 	public void testInstrumentAll_Pack200() throws IOException {
 		ByteArrayOutputStream jarbuffer = new ByteArrayOutputStream();
@@ -223,6 +357,24 @@
 		assertNull(zipin.getNextEntry());
 	}
 
+	/**
+	 * Triggers exception in
+	 * {@link Instrumenter#instrumentPack200(InputStream, OutputStream, String)}.
+	 */
+	@Test
+	public void testInstrumentAll_BrokenPack200() {
+		final byte[] buffer = new byte[] { (byte) 0xca, (byte) 0xfe,
+				(byte) 0xd0, 0x0d };
+
+		try {
+			instrumenter.instrumentAll(new ByteArrayInputStream(buffer),
+					new ByteArrayOutputStream(), "Test.pack200");
+		} catch (IOException e) {
+			assertEquals("Error while instrumenting Test.pack200.",
+					e.getMessage());
+		}
+	}
+
 	@Test
 	public void testInstrumentAll_Other() throws IOException {
 		InputStream in = new ByteArrayInputStream("text".getBytes());
diff --git a/org.jacoco.core.test/src/org/jacoco/core/instr/MethodRecorder.java b/org.jacoco.core.test/src/org/jacoco/core/instr/MethodRecorder.java
index 6410e6f..8aefa10 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/instr/MethodRecorder.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/instr/MethodRecorder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/ContentTypeDetectorTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/ContentTypeDetectorTest.java
index e84f778..b9e04d1 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/ContentTypeDetectorTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/ContentTypeDetectorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -108,6 +108,13 @@
 	}
 
 	@Test
+	public void testClassFile19() throws IOException {
+		initData(0xCA, 0xFE, 0xBA, 0xBE, 0x00, 0x00, 0x00, 0x35);
+		assertEquals(ContentTypeDetector.CLASSFILE, detector.getType());
+		assertContent();
+	}
+
+	@Test
 	public void testMachObjectFile() throws IOException {
 		initData(0xCA, 0xFE, 0xBA, 0xBE, 0x00, 0x00, 0x00, 0x02);
 		assertEquals(ContentTypeDetector.UNKNOWN, detector.getType());
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/Pack200StreamsTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/Pack200StreamsTest.java
index ee0018e..47980e7 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/Pack200StreamsTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/Pack200StreamsTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/BundleCoverageImplTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/BundleCoverageImplTest.java
index 82d3763..bd16d47 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/BundleCoverageImplTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/BundleCoverageImplTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -80,11 +80,9 @@
 
 	@Test
 	public void testGroupByPackage() {
-		ClassCoverageImpl ca = new ClassCoverageImpl("p1/A", 1, false, null,
-				"java/lang/Object", new String[0]);
+		ClassCoverageImpl ca = new ClassCoverageImpl("p1/A", 1, false);
 		ca.setSourceFileName("A.java");
-		ClassCoverageImpl cb = new ClassCoverageImpl("p2/B", 2, false, null,
-				"java/lang/Object", new String[0]);
+		ClassCoverageImpl cb = new ClassCoverageImpl("p2/B", 2, false);
 		cb.setSourceFileName("B.java");
 		ISourceFileCoverage sb = new SourceFileCoverageImpl("B.java", "p2");
 		ISourceFileCoverage sc = new SourceFileCoverageImpl("C.java", "p3");
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassAnalyzerTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassAnalyzerTest.java
index 4e66073..c990d53 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassAnalyzerTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassAnalyzerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,12 +12,7 @@
 package org.jacoco.core.internal.analysis;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
-import java.util.Collection;
-
-import org.jacoco.core.analysis.IMethodCoverage;
 import org.jacoco.core.internal.flow.MethodProbesVisitor;
 import org.jacoco.core.internal.instr.InstrSupport;
 import org.junit.Before;
@@ -30,10 +25,12 @@
 public class ClassAnalyzerTest {
 
 	private ClassAnalyzer analyzer;
+	private ClassCoverageImpl coverage;
 
 	@Before
 	public void setup() {
-		analyzer = new ClassAnalyzer(0x0000, false, null, new StringPool());
+		coverage = new ClassCoverageImpl("Foo", 0x0000, false);
+		analyzer = new ClassAnalyzer(coverage, null, new StringPool());
 		analyzer.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "Foo", null,
 				"java/lang/Object", null);
 	}
@@ -57,43 +54,7 @@
 		final MethodProbesVisitor mv = analyzer.visitMethod(0, "foo", "()V",
 				null, null);
 		mv.visitEnd();
-		Collection<IMethodCoverage> methods = analyzer.getCoverage()
-				.getMethods();
-		assertEquals(0, methods.size());
-	}
-
-	@Test
-	public void testMethodFilter_NonSynthetic() {
-		final MethodProbesVisitor mv = analyzer.visitMethod(0, "foo", "()V",
-				null, null);
-		mv.visitCode();
-		mv.visitInsn(Opcodes.RETURN);
-		mv.visitEnd();
-		Collection<IMethodCoverage> methods = analyzer.getCoverage()
-				.getMethods();
-		assertEquals(1, methods.size());
-	}
-
-	@Test
-	public void testMethodFilter_Synthetic() {
-		final MethodProbesVisitor mv = analyzer.visitMethod(
-				Opcodes.ACC_SYNTHETIC, "foo", "()V", null, null);
-		assertNull(mv);
-		Collection<IMethodCoverage> methods = analyzer.getCoverage()
-				.getMethods();
-		assertTrue(methods.isEmpty());
-	}
-
-	@Test
-	public void testMethodFilter_Lambda() {
-		final MethodProbesVisitor mv = analyzer.visitMethod(
-				Opcodes.ACC_SYNTHETIC, "lambda$1", "()V", null, null);
-		mv.visitCode();
-		mv.visitInsn(Opcodes.RETURN);
-		mv.visitEnd();
-		Collection<IMethodCoverage> methods = analyzer.getCoverage()
-				.getMethods();
-		assertEquals(1, methods.size());
+		assertEquals(0, coverage.getMethods().size());
 	}
 
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassCoverageImplTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassCoverageImplTest.java
index 5235aef..b55626a 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassCoverageImplTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/ClassCoverageImplTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,6 +11,7 @@
  *******************************************************************************/
 package org.jacoco.core.internal.analysis;
 
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -19,6 +20,7 @@
 
 import org.jacoco.core.analysis.ICoverageNode;
 import org.jacoco.core.analysis.ISourceNode;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
@@ -26,72 +28,88 @@
  */
 public class ClassCoverageImplTest {
 
+	private ClassCoverageImpl node;
+
+	@Before
+	public void setup() {
+		node = new ClassCoverageImpl("Sample", 12345, false);
+	}
+
 	@Test
-	public void testProperties() {
-		ClassCoverageImpl data = new ClassCoverageImpl("Sample", 12345, false,
-				"LSample;", "java/lang/Object", new String[0]);
-		data.setSourceFileName("Sample.java");
-		assertEquals(ICoverageNode.ElementType.CLASS, data.getElementType());
-		assertEquals("Sample", data.getName());
-		assertEquals(12345, data.getId());
-		assertFalse(data.isNoMatch());
-		assertEquals("LSample;", data.getSignature());
-		assertEquals("java/lang/Object", data.getSuperName());
-		assertEquals(0, data.getInterfaceNames().length);
-		assertEquals("Sample.java", data.getSourceFileName());
-		assertEquals(Collections.emptyList(), data.getMethods());
+	public void testDefaults() {
+		assertEquals(ICoverageNode.ElementType.CLASS, node.getElementType());
+		assertEquals("Sample", node.getName());
+		assertEquals(12345, node.getId());
+		assertFalse(node.isNoMatch());
+		assertEquals(Collections.emptyList(), node.getMethods());
+	}
+
+	@Test
+	public void testSignature() {
+		node.setSignature("LSample;");
+		assertEquals("LSample;", node.getSignature());
+	}
+
+	@Test
+	public void testSuperName() {
+		node.setSuperName("java/lang/Object");
+		assertEquals("java/lang/Object", node.getSuperName());
+	}
+
+	@Test
+	public void testInterfaces() {
+		node.setInterfaces(new String[] { "A", "B" });
+		assertArrayEquals(new String[] { "A", "B" }, node.getInterfaceNames());
+	}
+
+	@Test
+	public void testSourceFileName() {
+		node.setSourceFileName("Sample.java");
+		assertEquals("Sample.java", node.getSourceFileName());
 	}
 
 	@Test
 	public void testNoMatch() {
-		ClassCoverageImpl data = new ClassCoverageImpl("Sample", 12345, true,
-				"LSample;", "java/lang/Object", new String[0]);
-		assertTrue(data.isNoMatch());
+		ClassCoverageImpl node = new ClassCoverageImpl("Sample", 12345, true);
+		assertTrue(node.isNoMatch());
 	}
 
 	@Test
 	public void testGetPackageName1() {
-		ClassCoverageImpl data = new ClassCoverageImpl("ClassInDefaultPackage",
-				0, false, null, "java/lang/Object", new String[0]);
-		assertEquals("", data.getPackageName());
+		ClassCoverageImpl node = new ClassCoverageImpl("ClassInDefaultPackage",
+				0, false);
+		assertEquals("", node.getPackageName());
 	}
 
 	@Test
 	public void testGetPackageName2() {
 		ClassCoverageImpl data = new ClassCoverageImpl(
-				"org/jacoco/examples/Sample", 0, false, null,
-				"java/lang/Object", new String[0]);
+				"org/jacoco/examples/Sample", 0, false);
 		assertEquals("org/jacoco/examples", data.getPackageName());
 	}
 
 	@Test
 	public void testEmptyClass() {
-		ICoverageNode data = new ClassCoverageImpl("Sample", 0, false, null,
-				"java/lang/Object", new String[0]);
-		assertEquals(CounterImpl.COUNTER_0_0, data.getInstructionCounter());
-		assertEquals(CounterImpl.COUNTER_0_0, data.getBranchCounter());
-		assertEquals(CounterImpl.COUNTER_0_0, data.getMethodCounter());
-		assertEquals(CounterImpl.COUNTER_1_0, data.getClassCounter());
+		assertEquals(CounterImpl.COUNTER_0_0, node.getInstructionCounter());
+		assertEquals(CounterImpl.COUNTER_0_0, node.getBranchCounter());
+		assertEquals(CounterImpl.COUNTER_0_0, node.getMethodCounter());
+		assertEquals(CounterImpl.COUNTER_1_0, node.getClassCounter());
 	}
 
 	@Test
 	public void testAddMethodMissed() {
-		ClassCoverageImpl data = new ClassCoverageImpl("Sample", 0, false,
-				null, "java/lang/Object", new String[0]);
-		data.addMethod(createMethod(false));
-		assertEquals(CounterImpl.COUNTER_1_0, data.getInstructionCounter());
-		assertEquals(CounterImpl.COUNTER_1_0, data.getMethodCounter());
-		assertEquals(CounterImpl.COUNTER_1_0, data.getClassCounter());
+		node.addMethod(createMethod(false));
+		assertEquals(CounterImpl.COUNTER_1_0, node.getInstructionCounter());
+		assertEquals(CounterImpl.COUNTER_1_0, node.getMethodCounter());
+		assertEquals(CounterImpl.COUNTER_1_0, node.getClassCounter());
 	}
 
 	@Test
 	public void testAddMethodCovered() {
-		ClassCoverageImpl data = new ClassCoverageImpl("Sample", 0, false,
-				null, "java/lang/Object", new String[0]);
-		data.addMethod(createMethod(true));
-		assertEquals(CounterImpl.COUNTER_0_1, data.getInstructionCounter());
-		assertEquals(CounterImpl.COUNTER_0_1, data.getMethodCounter());
-		assertEquals(CounterImpl.COUNTER_0_1, data.getClassCounter());
+		node.addMethod(createMethod(true));
+		assertEquals(CounterImpl.COUNTER_0_1, node.getInstructionCounter());
+		assertEquals(CounterImpl.COUNTER_0_1, node.getMethodCounter());
+		assertEquals(CounterImpl.COUNTER_0_1, node.getClassCounter());
 	}
 
 	private MethodCoverageImpl createMethod(boolean covered) {
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/CounterImplTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/CounterImplTest.java
index b097f72..9aa3631 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/CounterImplTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/CounterImplTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/LineImplTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/LineImplTest.java
index 5aef6b0..1a3576b 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/LineImplTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/LineImplTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java
index 334e686..dbe0af6 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -26,6 +26,7 @@
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.tree.MethodNode;
 import org.objectweb.asm.tree.TryCatchBlockNode;
+import org.objectweb.asm.util.CheckMethodAdapter;
 
 /**
  * Unit tests for {@link MethodAnalyzer}.
@@ -55,9 +56,13 @@
 	// === Scenario: linear Sequence without branches ===
 
 	private void createLinearSequence() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		method.visitInsn(Opcodes.NOP);
-		method.visitLineNumber(1002, new Label());
+		final Label l1 = new Label();
+		method.visitLabel(l1);
+		method.visitLineNumber(1002, l1);
 		method.visitInsn(Opcodes.RETURN);
 	}
 
@@ -95,11 +100,15 @@
 	// === Scenario: simple if branch ===
 
 	private void createIfBranch() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		method.visitVarInsn(Opcodes.ILOAD, 1);
 		Label l1 = new Label();
 		method.visitJumpInsn(Opcodes.IFEQ, l1);
-		method.visitLineNumber(1002, new Label());
+		final Label l2 = new Label();
+		method.visitLabel(l2);
+		method.visitLineNumber(1002, l2);
 		method.visitLdcInsn("a");
 		method.visitInsn(Opcodes.ARETURN);
 		method.visitLabel(l1);
@@ -156,11 +165,15 @@
 	// === Scenario: branch which merges back ===
 
 	private void createIfBranchMerge() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		method.visitVarInsn(Opcodes.ILOAD, 1);
 		Label l1 = new Label();
 		method.visitJumpInsn(Opcodes.IFEQ, l1);
-		method.visitLineNumber(1002, new Label());
+		final Label l2 = new Label();
+		method.visitLabel(l2);
+		method.visitLineNumber(1002, l2);
 		method.visitInsn(Opcodes.NOP);
 		method.visitLabel(l1);
 		method.visitLineNumber(1003, l1);
@@ -216,7 +229,9 @@
 	// === Scenario: branch which jump backwards ===
 
 	private void createJumpBackwards() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		final Label l1 = new Label();
 		method.visitJumpInsn(Opcodes.GOTO, l1);
 		final Label l2 = new Label();
@@ -302,7 +317,9 @@
 	// === Scenario: table switch ===
 
 	private void createTableSwitch() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		method.visitVarInsn(Opcodes.ILOAD, 1);
 		Label l1 = new Label();
 		Label l2 = new Label();
@@ -312,14 +329,18 @@
 		method.visitLineNumber(1002, l1);
 		method.visitIntInsn(Opcodes.BIPUSH, 11);
 		method.visitVarInsn(Opcodes.ISTORE, 2);
-		method.visitLineNumber(1003, new Label());
+		final Label l4 = new Label();
+		method.visitLabel(l4);
+		method.visitLineNumber(1003, l4);
 		Label l5 = new Label();
 		method.visitJumpInsn(Opcodes.GOTO, l5);
 		method.visitLabel(l2);
 		method.visitLineNumber(1004, l2);
 		method.visitIntInsn(Opcodes.BIPUSH, 22);
 		method.visitVarInsn(Opcodes.ISTORE, 2);
-		method.visitLineNumber(1005, new Label());
+		final Label l6 = new Label();
+		method.visitLabel(l6);
+		method.visitLineNumber(1005, l6);
 		method.visitJumpInsn(Opcodes.GOTO, l5);
 		method.visitLabel(l3);
 		method.visitLineNumber(1006, l3);
@@ -402,10 +423,14 @@
 	// === Scenario: table switch with merge ===
 
 	private void createTableSwitchMerge() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		method.visitInsn(Opcodes.ICONST_0);
 		method.visitVarInsn(Opcodes.ISTORE, 2);
-		method.visitLineNumber(1002, new Label());
+		final Label l1 = new Label();
+		method.visitLabel(l1);
+		method.visitLineNumber(1002, l1);
 		method.visitVarInsn(Opcodes.ILOAD, 1);
 		Label l2 = new Label();
 		Label l3 = new Label();
@@ -555,11 +580,13 @@
 
 	private void runMethodAnalzer() {
 		LabelFlowAnalyzer.markLabels(method);
-		final MethodAnalyzer analyzer = new MethodAnalyzer("doit", "()V", null,
-				probes);
+		final MethodAnalyzer analyzer = new MethodAnalyzer("Foo",
+				"java/lang/Object", "doit", "()V", null, probes);
 		final MethodProbesAdapter probesAdapter = new MethodProbesAdapter(
 				analyzer, this);
-		method.accept(probesAdapter);
+		// note that CheckMethodAdapter verifies that this test does not violate
+		// contracts of ASM API
+		method.accept(new CheckMethodAdapter(probesAdapter));
 		result = analyzer.getCoverage();
 	}
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodCoverageImplTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodCoverageImplTest.java
index 60e48ce..d26adda 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodCoverageImplTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodCoverageImplTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/PackageCoverageTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/PackageCoverageTest.java
index b72f8a7..599ea4e 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/PackageCoverageTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/PackageCoverageTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -30,8 +30,7 @@
 	public void testProperties() {
 		Collection<IClassCoverage> classes = Collections
 				.singleton((IClassCoverage) new ClassCoverageImpl(
-						"org/jacoco/test/Sample", 0, false, null,
-						"java/lang/Object", new String[0]));
+						"org/jacoco/test/Sample", 0, false));
 		Collection<ISourceFileCoverage> sourceFiles = Collections
 				.singleton((ISourceFileCoverage) new SourceFileCoverageImpl(
 						"Sample.java", "org/jacoco/test/Sample"));
@@ -47,8 +46,7 @@
 	public void testCountersWithSources() {
 		// Classes with source reference will not considered for counters:
 		final ClassCoverageImpl classnode = new ClassCoverageImpl(
-				"org/jacoco/test/Sample", 0, false, null, "java/lang/Object",
-				new String[0]) {
+				"org/jacoco/test/Sample", 0, false) {
 			{
 				classCounter = CounterImpl.getInstance(9, 0);
 				methodCounter = CounterImpl.getInstance(9, 0);
@@ -81,8 +79,7 @@
 	public void testCountersWithoutSources() {
 		// Classes without source reference will be considered for counters:
 		final ClassCoverageImpl classnode = new ClassCoverageImpl(
-				"org/jacoco/test/Sample", 0, false, null, "java/lang/Object",
-				new String[0]) {
+				"org/jacoco/test/Sample", 0, false) {
 			{
 				classCounter = CounterImpl.getInstance(1, 0);
 				methodCounter = CounterImpl.getInstance(2, 0);
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/SourceFileCoverageImplTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/SourceFileCoverageImplTest.java
index 624dae7..5e5c8aa 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/SourceFileCoverageImplTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/SourceFileCoverageImplTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/SourceNodeImplTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/SourceNodeImplTest.java
index 037fb4a..3167e42 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/SourceNodeImplTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/SourceNodeImplTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/StringPoolTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/StringPoolTest.java
index b2bfc16..d629978 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/StringPoolTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/StringPoolTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/EnumFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/EnumFilterTest.java
new file mode 100644
index 0000000..149990f
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/EnumFilterTest.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.jacoco.core.internal.instr.InstrSupport;
+import org.junit.Test;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+public class EnumFilterTest implements IFilterOutput {
+
+	private final EnumFilter filter = new EnumFilter();
+
+	private AbstractInsnNode fromInclusive;
+	private AbstractInsnNode toInclusive;
+
+	@Test
+	public void testValues() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+				"values", "()[LFoo;", null, null);
+		m.visitInsn(Opcodes.NOP);
+
+		filter.filter("Foo", "java/lang/Enum", m, this);
+
+		assertEquals(m.instructions.getFirst(), fromInclusive);
+		assertEquals(m.instructions.getLast(), toInclusive);
+	}
+
+	@Test
+	public void testNonValues() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+				"values", "()V", null, null);
+		m.visitInsn(Opcodes.NOP);
+
+		filter.filter("Foo", "java/lang/Enum", m, this);
+
+		assertNull(fromInclusive);
+		assertNull(toInclusive);
+	}
+
+	@Test
+	public void testValueOf() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+				"valueOf", "(Ljava/lang/String;)LFoo;", null, null);
+		m.visitInsn(Opcodes.NOP);
+
+		filter.filter("Foo", "java/lang/Enum", m, this);
+
+		assertEquals(m.instructions.getFirst(), fromInclusive);
+		assertEquals(m.instructions.getLast(), toInclusive);
+	}
+
+	@Test
+	public void testNonValueOf() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+				"valueOf", "()V", null, null);
+		m.visitInsn(Opcodes.NOP);
+
+		filter.filter("Foo", "java/lang/Enum", m, this);
+
+		assertNull(fromInclusive);
+		assertNull(toInclusive);
+	}
+
+	@Test
+	public void testNonEnum() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+				"values", "()[LFoo;", null, null);
+		m.visitInsn(Opcodes.NOP);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertNull(fromInclusive);
+		assertNull(toInclusive);
+	}
+
+	public void ignore(final AbstractInsnNode fromInclusive,
+			final AbstractInsnNode toInclusive) {
+		assertNull(this.fromInclusive);
+		this.fromInclusive = fromInclusive;
+		this.toInclusive = toInclusive;
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilterTest.java
new file mode 100644
index 0000000..8fae5cc
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilterTest.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.jacoco.core.internal.instr.InstrSupport;
+import org.junit.Test;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+public class LombokGeneratedFilterTest implements IFilterOutput {
+
+	private final IFilter filter = new LombokGeneratedFilter();
+
+	private AbstractInsnNode fromInclusive;
+	private AbstractInsnNode toInclusive;
+
+	@Test
+	public void testNoAnnotations() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+				"hashCode", "()I", null, null);
+
+		m.visitInsn(Opcodes.ICONST_0);
+		m.visitInsn(Opcodes.IRETURN);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertNull(fromInclusive);
+		assertNull(toInclusive);
+	}
+
+	@Test
+	public void testOtherAnnotation() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+				"hashCode", "()I", null, null);
+		m.visitAnnotation("Lother/Annotation;", false);
+
+		m.visitInsn(Opcodes.ICONST_0);
+		m.visitInsn(Opcodes.IRETURN);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertNull(fromInclusive);
+		assertNull(toInclusive);
+	}
+
+	@Test
+	public void testLombokGeneratedAnnotation() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+				"hashCode", "()I", null, null);
+		m.visitAnnotation("Llombok/Generated;", false);
+
+		m.visitInsn(Opcodes.ICONST_0);
+		m.visitInsn(Opcodes.IRETURN);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertEquals(m.instructions.getFirst(), fromInclusive);
+		assertEquals(m.instructions.getLast(), toInclusive);
+	}
+
+	public void ignore(final AbstractInsnNode fromInclusive,
+			final AbstractInsnNode toInclusive) {
+		assertNull(this.fromInclusive);
+		this.fromInclusive = fromInclusive;
+		this.toInclusive = toInclusive;
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilterTest.java
new file mode 100644
index 0000000..9026208
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilterTest.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import org.jacoco.core.internal.instr.InstrSupport;
+import org.junit.Test;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import static org.junit.Assert.assertEquals;
+
+public class PrivateEmptyNoArgConstructorFilterTest implements IFilterOutput {
+
+	private final IFilter filter = new PrivateEmptyNoArgConstructorFilter();
+
+	private AbstractInsnNode fromInclusive;
+	private AbstractInsnNode toInclusive;
+
+	@Test
+	public void test() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION,
+				Opcodes.ACC_PRIVATE, "<init>", "()V", null, null);
+
+		m.visitVarInsn(Opcodes.ALOAD, 0);
+		m.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>",
+				"()V", false);
+		m.visitInsn(Opcodes.RETURN);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertEquals(m.instructions.getFirst(), fromInclusive);
+		assertEquals(m.instructions.getLast(), toInclusive);
+	}
+
+	public void ignore(final AbstractInsnNode fromInclusive,
+			final AbstractInsnNode toInclusive) {
+		this.fromInclusive = fromInclusive;
+		this.toInclusive = toInclusive;
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilterTest.java
new file mode 100644
index 0000000..b0f5d1b
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilterTest.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.jacoco.core.internal.instr.InstrSupport;
+import org.junit.Test;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.MethodNode;
+
+public class SynchronizedFilterTest implements IFilterOutput {
+
+	private final SynchronizedFilter filter = new SynchronizedFilter();
+
+	private final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+			"name", "()V", null, null);
+
+	private AbstractInsnNode fromInclusive;
+	private AbstractInsnNode toInclusive;
+
+	@Test
+	public void javac() {
+		final Label start = new Label();
+		final Label end = new Label();
+		final Label handler = new Label();
+		final Label handlerEnd = new Label();
+		m.visitTryCatchBlock(start, end, handler, null);
+		m.visitTryCatchBlock(handler, handlerEnd, handler, null);
+
+		m.visitVarInsn(Opcodes.ALOAD, 0);
+		m.visitFieldInsn(Opcodes.GETFIELD, "Fun", "lock", "Ljava/lang/Object;");
+		m.visitInsn(Opcodes.DUP);
+		m.visitVarInsn(Opcodes.ASTORE, 1);
+		m.visitInsn(Opcodes.MONITORENTER);
+		m.visitLabel(start);
+		m.visitInsn(Opcodes.NOP);
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitInsn(Opcodes.MONITOREXIT);
+		m.visitLabel(end);
+		final Label exit = new Label();
+		m.visitJumpInsn(Opcodes.GOTO, exit);
+		m.visitLabel(handler);
+		m.visitVarInsn(Opcodes.ASTORE, 2);
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitInsn(Opcodes.MONITOREXIT);
+		m.visitLabel(handlerEnd);
+		m.visitVarInsn(Opcodes.ALOAD, 2);
+		m.visitInsn(Opcodes.ATHROW);
+		m.visitLabel(exit);
+		m.visitInsn(Opcodes.RETURN);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+		assertEquals(handler.info, fromInclusive);
+		assertEquals(((LabelNode) exit.info).getPrevious(), toInclusive);
+	}
+
+	/**
+	 * <pre>
+	 *     try {
+	 *         ...
+	 *     } catch (Exception e) {
+	 *         ...
+	 *     } finally {
+	 *         ...
+	 *     }
+	 * </pre>
+	 */
+	@Test
+	public void javacTryCatchFinally() {
+		final Label start = new Label();
+		final Label end = new Label();
+		final Label catchHandler = new Label();
+		final Label finallyHandler = new Label();
+		final Label catchHandlerEnd = new Label();
+		m.visitTryCatchBlock(start, end, catchHandler, "java/lang/Exception");
+		m.visitTryCatchBlock(start, end, finallyHandler, null);
+		m.visitTryCatchBlock(catchHandler, catchHandlerEnd, finallyHandler,
+				null);
+
+		m.visitLabel(start);
+		// body
+		m.visitInsn(Opcodes.NOP);
+		m.visitLabel(end);
+		// finally
+		m.visitInsn(Opcodes.NOP);
+		final Label exit = new Label();
+		m.visitJumpInsn(Opcodes.GOTO, exit);
+		m.visitLabel(catchHandler);
+		m.visitVarInsn(Opcodes.ASTORE, 1);
+		// catch
+		m.visitInsn(Opcodes.NOP);
+		m.visitLabel(catchHandlerEnd);
+		// finally
+		m.visitInsn(Opcodes.NOP);
+		m.visitJumpInsn(Opcodes.GOTO, exit);
+		m.visitLabel(finallyHandler);
+		m.visitVarInsn(Opcodes.ASTORE, 2);
+		// finally
+		m.visitInsn(Opcodes.NOP);
+		m.visitVarInsn(Opcodes.ALOAD, 2);
+		m.visitInsn(Opcodes.ATHROW);
+		m.visitLabel(exit);
+		m.visitInsn(Opcodes.RETURN);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+		assertNull(fromInclusive);
+	}
+
+	@Test
+	public void ecj() {
+		final Label start = new Label();
+		final Label end = new Label();
+		final Label handler = new Label();
+		final Label handlerEnd = new Label();
+		m.visitTryCatchBlock(start, end, handler, null);
+		m.visitTryCatchBlock(handler, handlerEnd, handler, null);
+
+		m.visitVarInsn(Opcodes.ALOAD, 0);
+		m.visitFieldInsn(Opcodes.GETFIELD, "Target", "lock",
+				"Ljava/lang/Object;");
+		m.visitInsn(Opcodes.DUP);
+		m.visitVarInsn(Opcodes.ASTORE, 1);
+		m.visitInsn(Opcodes.MONITORENTER);
+		m.visitLabel(start);
+		m.visitVarInsn(Opcodes.ALOAD, 0);
+		m.visitInsn(Opcodes.NOP);
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitInsn(Opcodes.MONITOREXIT);
+		m.visitLabel(end);
+		final Label exit = new Label();
+		m.visitJumpInsn(Opcodes.GOTO, exit);
+		m.visitLabel(handler);
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitInsn(Opcodes.MONITOREXIT);
+		m.visitLabel(handlerEnd);
+		m.visitInsn(Opcodes.ATHROW);
+		m.visitLabel(exit);
+		m.visitInsn(Opcodes.RETURN);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+		assertEquals(handler.info, fromInclusive);
+		assertEquals(((LabelNode) exit.info).getPrevious(), toInclusive);
+	}
+
+	public void ignore(AbstractInsnNode fromInclusive,
+			AbstractInsnNode toInclusive) {
+		assertNull(this.fromInclusive);
+		this.fromInclusive = fromInclusive;
+		this.toInclusive = toInclusive;
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SyntheticFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SyntheticFilterTest.java
new file mode 100644
index 0000000..319caef
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/SyntheticFilterTest.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.jacoco.core.internal.instr.InstrSupport;
+import org.junit.Test;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+public class SyntheticFilterTest implements IFilterOutput {
+
+	private final SyntheticFilter filter = new SyntheticFilter();
+
+	private AbstractInsnNode fromInclusive;
+	private AbstractInsnNode toInclusive;
+
+	@Test
+	public void testNonSynthetic() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+				"name", "()V", null, null);
+		m.visitInsn(Opcodes.NOP);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertNull(fromInclusive);
+		assertNull(toInclusive);
+	}
+
+	@Test
+	public void testSynthetic() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION,
+				Opcodes.ACC_SYNTHETIC, "name", "()V", null, null);
+		m.visitInsn(Opcodes.NOP);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertEquals(m.instructions.getFirst(), fromInclusive);
+		assertEquals(m.instructions.getLast(), toInclusive);
+	}
+
+	@Test
+	public void testLambda() {
+		final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION,
+				Opcodes.ACC_SYNTHETIC, "lambda$1", "()V", null, null);
+		m.visitInsn(Opcodes.NOP);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertNull(fromInclusive);
+		assertNull(toInclusive);
+	}
+
+	public void ignore(final AbstractInsnNode fromInclusive,
+			final AbstractInsnNode toInclusive) {
+		assertNull(this.fromInclusive);
+		this.fromInclusive = fromInclusive;
+		this.toInclusive = toInclusive;
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilterTest.java
new file mode 100644
index 0000000..d372050
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilterTest.java
@@ -0,0 +1,624 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jacoco.core.internal.instr.InstrSupport;
+import org.junit.Test;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+public class TryWithResourcesEcjFilterTest implements IFilterOutput {
+
+	private final TryWithResourcesEcjFilter filter = new TryWithResourcesEcjFilter();
+
+	private final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+			"name", "()V", null, null);
+
+	/**
+	 * ECJ for
+	 *
+	 * <pre>
+	 *     try (r0 = ...; r1 = ...; r2= ...) {
+	 *         ...
+	 *     } finally (...) {
+	 *         ...
+	 *     }
+	 *     ...
+	 * </pre>
+	 *
+	 * generates
+	 *
+	 * <pre>
+	 *     ACONST_NULL
+	 *     ASTORE primaryExc
+	 *     ACONST_NULL
+	 *     ASTORE suppressedExc
+	 *     ...
+	 *     ASTORE r1
+	 *     ...
+	 *     ASTORE r2
+	 *     ...
+	 *     ASTORE r3
+	 *
+	 *     ... // body
+	 *
+	 *     ALOAD r3
+	 *     IFNULL r2_close
+	 *     ALOAD r3
+	 *     INVOKEVIRTUAL close:()V
+	 *     GOTO r2_close
+	 *
+	 *     ASTORE primaryExc
+	 *     ALOAD r3
+	 *     IFNULL n
+	 *     ALOAD r3
+	 *     INVOKEVIRTUAL close:()V
+	 *     n:
+	 *     ALOAD primaryExc
+	 *     ATHROW
+	 *
+	 *     r2_close:
+	 *     ALOAD r2
+	 *     IFNULL r1_close
+	 *     ALOAD r2
+	 *     INVOKEVIRTUAL close:()V
+	 *     GOTO r1_close
+	 *
+	 *     ASTORE suppressedExc
+	 *     ALOAD primaryExc
+	 *     IFNONNULL s
+	 *     ALOAD suppressedExc
+	 *     ASTORE primaryExc
+	 *     GOTO e
+	 *     s:
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     IF_ACMPEQ e
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     e:
+	 *
+	 *     ALOAD r2
+	 *     IFNULL n
+	 *     ALOAD r2
+	 *     INVOKEVIRTUAL close:()V
+	 *     n:
+	 *     ALOAD primaryExc
+	 *     ATHROW
+	 *
+	 *     r1_close:
+	 *     ALOAD r1
+	 *     IFNULL after
+	 *     ALOAD r1
+	 *     INVOKEVIRTUAL close:()V
+	 *     GOTO after
+	 *
+	 *     ASTORE suppressedExc
+	 *     ALOAD primaryExc
+	 *     IFNONNULL s
+	 *     ALOAD suppressedExc
+	 *     ASTORE primaryExc
+	 *     GOTO e
+	 *     s:
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     IF_ACMPEQ e
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     e:
+	 *
+	 *     ALOAD r1
+	 *     IFNULL n
+	 *     ALOAD r1
+	 *     INVOKEVIRTUAL close:()V
+	 *     n:
+	 *     ALOAD primaryExc
+	 *     ATHROW
+	 *
+	 *     ASTORE suppressedExc
+	 *     ALOAD primaryExc
+	 *     IFNONNULL s
+	 *     ALOAD suppressedExc
+	 *     ASTORE primaryExc
+	 *     GOTO e
+	 *     s:
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     IF_ACMPEQ e
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     e:
+	 *
+	 *     ALOAD primaryExc
+	 *     ATHROW
+	 *
+	 *     ... // additional handlers for catch blocks and finally on exceptional path
+	 *
+	 *     after:
+	 *     ... // finally on normal path
+	 *     ...
+	 * </pre>
+	 */
+	@Test
+	public void ecj() {
+		final Range range0 = new Range();
+		final Range range1 = new Range();
+
+		final Label handler = new Label();
+		m.visitTryCatchBlock(handler, handler, handler, null);
+
+		// primaryExc = null
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 1);
+		// suppressedExc = null
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 2);
+
+		// body
+		m.visitInsn(Opcodes.NOP);
+
+		final Label l4 = new Label();
+		final Label l7 = new Label();
+		final Label end = new Label();
+		{ // nextIsEcjClose("r0")
+			m.visitVarInsn(Opcodes.ALOAD, 5);
+			range0.fromInclusive = m.instructions.getLast();
+			m.visitJumpInsn(Opcodes.IFNULL, l4);
+			m.visitVarInsn(Opcodes.ALOAD, 5);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun2$Resource", "close",
+					"()V", false);
+		}
+		m.visitJumpInsn(Opcodes.GOTO, l4);
+		range0.toInclusive = m.instructions.getLast();
+		// catch (any primaryExc)
+		m.visitLabel(handler);
+		range1.fromInclusive = m.instructions.getLast();
+		m.visitVarInsn(Opcodes.ASTORE, 1);
+		{ // nextIsEcjCloseAndThrow("r0")
+			m.visitVarInsn(Opcodes.ALOAD, 5);
+			Label l11 = new Label();
+			m.visitJumpInsn(Opcodes.IFNULL, l11);
+			m.visitVarInsn(Opcodes.ALOAD, 5);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun2$Resource", "close",
+					"()V", false);
+			m.visitLabel(l11);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitInsn(Opcodes.ATHROW);
+		}
+		m.visitLabel(l4);
+		{ // nextIsEcjClose("r1")
+			m.visitVarInsn(Opcodes.ALOAD, 4);
+			m.visitJumpInsn(Opcodes.IFNULL, l7);
+			m.visitVarInsn(Opcodes.ALOAD, 4);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun2$Resource", "close",
+					"()V", false);
+		}
+		m.visitJumpInsn(Opcodes.GOTO, l7);
+		{ // nextIsEcjSuppress
+			m.visitVarInsn(Opcodes.ASTORE, 2);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			final Label suppressStart = new Label();
+			m.visitJumpInsn(Opcodes.IFNONNULL, suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitVarInsn(Opcodes.ASTORE, 1);
+			final Label suppressEnd = new Label();
+			m.visitJumpInsn(Opcodes.GOTO, suppressEnd);
+			m.visitLabel(suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitJumpInsn(Opcodes.IF_ACMPEQ, suppressEnd);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+					"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+			m.visitLabel(suppressEnd);
+		}
+		{ // nextIsEcjCloseAndThrow("r1")
+			m.visitVarInsn(Opcodes.ALOAD, 4);
+			final Label l14 = new Label();
+			m.visitJumpInsn(Opcodes.IFNULL, l14);
+			m.visitVarInsn(Opcodes.ALOAD, 4);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun2$Resource", "close",
+					"()V", false);
+			m.visitLabel(l14);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitInsn(Opcodes.ATHROW);
+		}
+		m.visitLabel(l7);
+		{ // nextIsEcjClose("r2")
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			m.visitJumpInsn(Opcodes.IFNULL, end);
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun2$Resource", "close",
+					"()V", false);
+			m.visitJumpInsn(Opcodes.GOTO, end);
+		}
+		{ // nextIsEcjSuppress
+			m.visitVarInsn(Opcodes.ASTORE, 2);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			final Label suppressStart = new Label();
+			m.visitJumpInsn(Opcodes.IFNONNULL, suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitVarInsn(Opcodes.ASTORE, 1);
+			final Label suppressEnd = new Label();
+			m.visitJumpInsn(Opcodes.GOTO, suppressEnd);
+			m.visitLabel(suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitJumpInsn(Opcodes.IF_ACMPEQ, suppressEnd);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+					"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+			m.visitLabel(suppressEnd);
+		}
+		{ // nextIsEcjCloseAndThrow("r2")
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			final Label l18 = new Label();
+			m.visitJumpInsn(Opcodes.IFNULL, l18);
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun2$Resource", "close",
+					"()V", false);
+			m.visitLabel(l18);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitInsn(Opcodes.ATHROW);
+		}
+		{ // nextIsEcjSuppress
+			m.visitVarInsn(Opcodes.ASTORE, 2);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			final Label suppressStart = new Label();
+			m.visitJumpInsn(Opcodes.IFNONNULL, suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitVarInsn(Opcodes.ASTORE, 1);
+			final Label suppressEnd = new Label();
+			m.visitJumpInsn(Opcodes.GOTO, suppressEnd);
+			m.visitLabel(suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitJumpInsn(Opcodes.IF_ACMPEQ, suppressEnd);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+					"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+			m.visitLabel(suppressEnd);
+		}
+		// throw primaryExc
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitInsn(Opcodes.ATHROW);
+		range1.toInclusive = m.instructions.getLast();
+
+		// additional handlers
+		m.visitInsn(Opcodes.NOP);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertEquals(2, from.size());
+
+		assertEquals(range0.fromInclusive, from.get(0));
+		assertEquals(range0.toInclusive, to.get(0));
+
+		assertEquals(range1.fromInclusive, from.get(1));
+		assertEquals(range1.toInclusive, to.get(1));
+	}
+
+	/**
+	 * ECJ for
+	 * 
+	 * <pre>
+	 *     try (r1 = ...; r2 = ...; r3 = ...) {
+	 *         return ...
+	 *     } finally {
+	 *         ...
+	 *     }
+	 * </pre>
+	 *
+	 * generates
+	 *
+	 * <pre>
+	 *     ACONST_NULL
+	 *     astore primaryExc
+	 *     ACONST_NULL
+	 *     astore suppressedExc
+	 *
+	 *     ...
+	 *     ASTORE r1
+	 *     ...
+	 *     ASTORE r2
+	 *     ...
+	 *     ASTORE r3
+	 *
+	 *     ... // body
+	 *
+	 *     ALOAD r3
+	 *     IFNULL n
+	 *     ALOAD r3
+	 *     INVOKEVIRTUAL close:()V
+	 *     n:
+	 *     ALOAD r2
+	 *     IFNULL n
+	 *     ALOAD r2
+	 *     INVOKEVIRTUAL close:()V
+	 *     n:
+	 *     ALOAD r1
+	 *     IFNULL n
+	 *     ALOAD r1
+	 *     INVOKEVIRTUAL close:()V
+	 *     n:
+	 *
+	 *     ... // finally on normal path
+	 *     ARETURN
+	 *
+	 *     ASTORE primaryExc
+	 *     ALOAD r3
+	 *     IFNULL n
+	 *     ALOAD r3
+	 *     INVOKEVIRTUAL close:()V
+	 *     n:
+	 *     ALOAD primaryExc
+	 *     ATHROW
+	 *
+	 *     ASTORE suppressedExc
+	 *     ALOAD primaryExc
+	 *     IFNONNULL s
+	 *     ALOAD suppressedExc
+	 *     ASTORE primaryExc
+	 *     GOTO  e
+	 *     s:
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     IF_ACMPEQ  e
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     e:
+	 *
+	 *     ALOAD r2
+	 *     IFNULL n
+	 *     ALOAD r2
+	 *     INVOKEVIRTUAL close:()V
+	 *     n:
+	 *     ALOAD primaryExc
+	 *     ATHROW
+	 *
+	 *     ASTORE suppressedExc
+	 *     ALOAD primaryExc
+	 *     IFNONNULL s
+	 *     ALOAD suppressedExc
+	 *     ASTORE primaryExc
+	 *     GOTO e
+	 *     s:
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     IF_ACMPEQ e
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     e:
+	 *
+	 *     ALOAD r1
+	 *     IFNULL n
+	 *     ALOAD r1
+	 *     INVOKEVIRTUAL close:()V
+	 *     n:
+	 *     ALOAD primaryExc
+	 *     ATHROW
+	 *
+	 *     ASTORE suppressedExc
+	 *     ALOAD primaryExc
+	 *     IFNONNULL s
+	 *     ALOAD suppressedExc
+	 *     ASTORE primaryExc
+	 *     GOTO e
+	 *     s:
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     IF_ACMPEQ e
+	 *     ALOAD primaryExc
+	 *     ALOAD suppressedExc
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     e:
+	 *
+	 *     ALOAD primaryExc
+	 *     ATHROW
+	 *
+	 *     ... // additional handlers for catch blocks and finally on exceptional path
+	 * </pre>
+	 */
+	@Test
+	public void ecj_noFlowOut() {
+		final Range range0 = new Range();
+		final Range range1 = new Range();
+
+		final Label handler = new Label();
+		m.visitTryCatchBlock(handler, handler, handler, null);
+
+		// primaryExc = null
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 1);
+		// suppressedExc = null
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 2);
+
+		// body
+		m.visitInsn(Opcodes.NOP);
+
+		{ // nextIsEcjClose("r0")
+			final Label label = new Label();
+			m.visitVarInsn(Opcodes.ALOAD, 5);
+			range0.fromInclusive = m.instructions.getLast();
+			m.visitJumpInsn(Opcodes.IFNULL, label);
+			m.visitVarInsn(Opcodes.ALOAD, 5);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource", "close",
+					"()V", false);
+			m.visitLabel(label);
+		}
+		{ // nextIsEcjClose("r1")
+			final Label label = new Label();
+			m.visitVarInsn(Opcodes.ALOAD, 4);
+			m.visitJumpInsn(Opcodes.IFNULL, label);
+			m.visitVarInsn(Opcodes.ALOAD, 4);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource", "close",
+					"()V", false);
+			m.visitLabel(label);
+		}
+		{ // nextIsEcjClose("r2")
+			final Label label = new Label();
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			m.visitJumpInsn(Opcodes.IFNULL, label);
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource", "close",
+					"()V", false);
+			range0.toInclusive = m.instructions.getLast();
+			m.visitLabel(label);
+		}
+
+		// finally
+		m.visitInsn(Opcodes.NOP);
+		m.visitInsn(Opcodes.ARETURN);
+
+		// catch (any primaryExc)
+		m.visitLabel(handler);
+		range1.fromInclusive = m.instructions.getLast();
+		m.visitVarInsn(Opcodes.ASTORE, 1);
+		{ // nextIsEcjCloseAndThrow("r0")
+			m.visitVarInsn(Opcodes.ALOAD, 5);
+			final Label throwLabel = new Label();
+			m.visitJumpInsn(Opcodes.IFNULL, throwLabel);
+			m.visitVarInsn(Opcodes.ALOAD, 5);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource", "close",
+					"()V", false);
+			m.visitLabel(throwLabel);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitInsn(Opcodes.ATHROW);
+		}
+		{ // nextIsEcjSuppress
+			m.visitVarInsn(Opcodes.ASTORE, 2);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			final Label suppressStart = new Label();
+			m.visitJumpInsn(Opcodes.IFNONNULL, suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitVarInsn(Opcodes.ASTORE, 1);
+			final Label suppressEnd = new Label();
+			m.visitJumpInsn(Opcodes.GOTO, suppressEnd);
+			m.visitLabel(suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitJumpInsn(Opcodes.IF_ACMPEQ, suppressEnd);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+					"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+			m.visitLabel(suppressEnd);
+		}
+		{ // nextIsEcjCloseAndThrow("r1")
+			m.visitVarInsn(Opcodes.ALOAD, 4);
+			final Label throwLabel = new Label();
+			m.visitJumpInsn(Opcodes.IFNULL, throwLabel);
+			m.visitVarInsn(Opcodes.ALOAD, 4);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource", "close",
+					"()V", false);
+			m.visitLabel(throwLabel);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitInsn(Opcodes.ATHROW);
+		}
+		{ // nextIsEcjSuppress
+			m.visitVarInsn(Opcodes.ASTORE, 2);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			final Label suppressStart = new Label();
+			m.visitJumpInsn(Opcodes.IFNONNULL, suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitVarInsn(Opcodes.ASTORE, 1);
+			final Label suppressEnd = new Label();
+			m.visitJumpInsn(Opcodes.GOTO, suppressEnd);
+			m.visitLabel(suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitJumpInsn(Opcodes.IF_ACMPEQ, suppressEnd);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+					"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+			m.visitLabel(suppressEnd);
+		}
+		{ // nextIsEcjCloseAndThrow("r2")
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			final Label throwLabel = new Label();
+			m.visitJumpInsn(Opcodes.IFNULL, throwLabel);
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource", "close",
+					"()V", false);
+			m.visitLabel(throwLabel);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitInsn(Opcodes.ATHROW);
+		}
+		{ // nextIsEcjSuppress
+			m.visitVarInsn(Opcodes.ASTORE, 2);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			final Label suppressStart = new Label();
+			m.visitJumpInsn(Opcodes.IFNONNULL, suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitVarInsn(Opcodes.ASTORE, 1);
+			final Label suppressEnd = new Label();
+			m.visitJumpInsn(Opcodes.GOTO, suppressEnd);
+			m.visitLabel(suppressStart);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitJumpInsn(Opcodes.IF_ACMPEQ, suppressEnd);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+					"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+			m.visitLabel(suppressEnd);
+		}
+		// throw primaryExc
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitInsn(Opcodes.ATHROW);
+		range1.toInclusive = m.instructions.getLast();
+
+		// additional handlers
+		m.visitInsn(Opcodes.NOP);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertEquals(2, from.size());
+
+		assertEquals(range0.fromInclusive, from.get(0));
+		assertEquals(range0.toInclusive, to.get(0));
+
+		assertEquals(range1.fromInclusive, from.get(1));
+		assertEquals(range1.toInclusive, to.get(1));
+	}
+
+	static class Range {
+		AbstractInsnNode fromInclusive;
+		AbstractInsnNode toInclusive;
+	}
+
+	private final List<AbstractInsnNode> from = new ArrayList<AbstractInsnNode>();
+	private final List<AbstractInsnNode> to = new ArrayList<AbstractInsnNode>();
+
+	public void ignore(AbstractInsnNode from, AbstractInsnNode to) {
+		this.from.add(from);
+		this.to.add(to);
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilterTest.java
new file mode 100644
index 0000000..26b4cfe
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilterTest.java
@@ -0,0 +1,814 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jacoco.core.internal.instr.InstrSupport;
+import org.junit.Test;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+public class TryWithResourcesJavacFilterTest implements IFilterOutput {
+
+	private final TryWithResourcesJavacFilter filter = new TryWithResourcesJavacFilter();
+
+	private final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+			"name", "()V", null, null);
+
+	/**
+	 * javac 9 for
+	 *
+	 * <pre>
+	 *     try (r0 = open(...); r1 = new ...) {
+	 *         return ...
+	 *     } finally {
+	 *         ...
+	 *     }
+	 * </pre>
+	 *
+	 * generates
+	 *
+	 * <pre>
+	 *     ...
+	 *     ASTORE r0
+	 *     ACONST_NULL
+	 *     ASTORE primaryExc0
+	 *
+	 *     ...
+	 *     ASTORE r1
+	 *     ACONST_NULL
+	 *     ASTORE primaryExc1
+	 *
+	 *     ... // body
+	 *
+	 *     ALOAD primaryExc1
+	 *     ALOAD r1
+	 *     INVOKESTATIC $closeResource:(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+	 *
+	 *     ALOAD r0
+	 *     IFNULL n
+	 *     ALOAD primaryExc0
+	 *     ALOAD r0
+	 *     INVOKESTATIC $closeResource:(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+	 *     n:
+	 *
+	 *     ... // finally on normal path
+	 *     ARETURN
+	 *
+	 *     ASTORE t
+	 *     ALOAD t
+	 *     ASTORE primaryExc1
+	 *     ALOAD t
+	 *     ATHROW
+	 *
+	 *     ASTORE t
+	 *     ALOAD primaryExc1
+	 *     ALOAD r1
+	 *     INVOKESTATIC  $closeResource:(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+	 *     ALOAD t
+	 *     ATHROW
+	 *
+	 *     ASTORE t
+	 *     ALOAD t
+	 *     ASTORE primaryExc0
+	 *     ALOAD t
+	 *     ATHROW
+	 *
+	 *     ASTORE t
+	 *     ALOAD r0
+	 *     IFNULL n
+	 *     ALOAD primaryExc0
+	 *     ALOAD r0
+	 *     INVOKESTATIC  $closeResource:(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+	 *     n:
+	 *     ALOAD t
+	 *     ATHROW
+	 *
+	 *     ... // additional handlers for catch blocks and finally on exceptional path
+	 * </pre>
+	 */
+	@Test
+	public void javac9() {
+		final Range range0 = new Range();
+		final Range range1 = new Range();
+		final Range range2 = new Range();
+		final Range range3 = new Range();
+
+		final Label handler1 = new Label();
+		m.visitTryCatchBlock(handler1, handler1, handler1,
+				"java/lang/Throwable");
+
+		final Label handler2 = new Label();
+		m.visitTryCatchBlock(handler2, handler2, handler2,
+				"java/lang/Throwable");
+
+		// r0 = open(...)
+		m.visitVarInsn(Opcodes.ASTORE, 1);
+
+		// primaryExc0 = null
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 2);
+
+		// r1 = new ..
+		m.visitVarInsn(Opcodes.ASTORE, 3);
+
+		// primaryExc1 = null
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 4);
+
+		// body
+		m.visitInsn(Opcodes.NOP);
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 5);
+
+		// $closeResource(primaryExc1, r1)
+		m.visitVarInsn(Opcodes.ALOAD, 4);
+		range0.fromInclusive = m.instructions.getLast();
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitMethodInsn(Opcodes.INVOKESTATIC, "Fun", "$closeResource",
+				"(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", false);
+		range0.toInclusive = m.instructions.getLast();
+
+		// if (r0 != null)
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		range2.fromInclusive = m.instructions.getLast();
+		final Label l11 = new Label();
+		m.visitJumpInsn(Opcodes.IFNULL, l11);
+		// $closeResource(primaryExc0, r0)
+		m.visitVarInsn(Opcodes.ALOAD, 2);
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitMethodInsn(Opcodes.INVOKESTATIC, "Fun", "$closeResource",
+				"(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", false);
+		range2.toInclusive = m.instructions.getLast();
+		m.visitLabel(l11);
+
+		// finally
+		m.visitInsn(Opcodes.NOP);
+		m.visitVarInsn(Opcodes.ALOAD, 5);
+		m.visitInsn(Opcodes.ARETURN);
+
+		// catch (Throwable t)
+		m.visitLabel(handler1);
+		range1.fromInclusive = m.instructions.getLast();
+		m.visitVarInsn(Opcodes.ASTORE, 5);
+		// primaryExc1 = t
+		m.visitVarInsn(Opcodes.ALOAD, 5);
+		m.visitVarInsn(Opcodes.ASTORE, 4);
+		// throw t
+		m.visitVarInsn(Opcodes.ALOAD, 5);
+		m.visitInsn(Opcodes.ATHROW);
+
+		// catch (any t)
+		m.visitVarInsn(Opcodes.ASTORE, 6);
+		// $closeResource(primaryExc1, r1)
+		m.visitVarInsn(Opcodes.ALOAD, 4);
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitMethodInsn(Opcodes.INVOKESTATIC, "Fun", "$closeResource",
+				"(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", false);
+		m.visitVarInsn(Opcodes.ALOAD, 6);
+		m.visitInsn(Opcodes.ATHROW);
+		range1.toInclusive = m.instructions.getLast();
+
+		// catch (Throwable t)
+		m.visitLabel(handler2);
+		range3.fromInclusive = m.instructions.getLast();
+		m.visitVarInsn(Opcodes.ASTORE, 3);
+		// primaryExc0 = t
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitVarInsn(Opcodes.ASTORE, 2);
+		// throw t
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitInsn(Opcodes.ATHROW);
+
+		// catch (any t)
+		m.visitVarInsn(Opcodes.ASTORE, 7);
+		// if (r0 != null)
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		final Label l14 = new Label();
+		m.visitJumpInsn(Opcodes.IFNULL, l14);
+		// $closeResource(primaryExc0, r0)
+		m.visitVarInsn(Opcodes.ALOAD, 2);
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitMethodInsn(Opcodes.INVOKESTATIC, "Fun", "$closeResource",
+				"(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", false);
+		m.visitLabel(l14);
+		// throw t
+		m.visitVarInsn(Opcodes.ALOAD, 7);
+		m.visitInsn(Opcodes.ATHROW);
+		range3.toInclusive = m.instructions.getLast();
+
+		m.visitVarInsn(Opcodes.ASTORE, 8);
+		// finally
+		m.visitInsn(Opcodes.NOP);
+		m.visitVarInsn(Opcodes.ALOAD, 8);
+		m.visitInsn(Opcodes.ATHROW);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertEquals(4, from.size());
+
+		assertEquals(range0.fromInclusive, from.get(0));
+		assertEquals(range0.toInclusive, to.get(0));
+
+		assertEquals(range1.fromInclusive, from.get(1));
+		assertEquals(range1.toInclusive, to.get(1));
+
+		assertEquals(range2.fromInclusive, from.get(2));
+		assertEquals(range2.toInclusive, to.get(2));
+
+		assertEquals(range3.fromInclusive, from.get(3));
+		assertEquals(range3.toInclusive, to.get(3));
+	}
+
+	/**
+	 * javac 7 and 8 for
+	 * 
+	 * <pre>
+	 *     try (r0 = ...; r1 = ...) {
+	 *         return ...
+	 *     } finally {
+	 *         ...
+	 *     }
+	 * </pre>
+	 *
+	 * generate
+	 *
+	 * <pre>
+	 *     ...
+	 *     ASTORE r0
+	 *     ACONST_NULL
+	 *     ASTORE primaryExc0
+	 *
+	 *     ...
+	 *     ASTORE r1
+	 *     ACONST_NULL
+	 *     ASTORE primaryExc1
+	 *
+	 *     ... // body
+	 *
+	 *     ALOAD r1
+	 *     IFNULL n
+	 *     ALOAD primaryExc1
+	 *     IFNULL c
+	 *     ALOAD r1
+	 *     INVOKEINTERFACE close:()V
+	 *     GOTO n
+	 *     ASTORE t
+	 *     ALOAD primaryExc1
+	 *     ALOAD t
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     GOTO n
+	 *     c:
+	 *     ALOAD r1
+	 *     INVOKEINTERFACE close:()V
+	 *     n:
+	 *
+	 *     ALOAD r0
+	 *     IFNULL n
+	 *     ALOAD primaryExc0
+	 *     IFNULL c
+	 *     ALOAD r0
+	 *     INVOKEVIRTUAL close:()V
+	 *     GOTO n
+	 *     ASTORE t
+	 *     ALOAD primaryExc0
+	 *     ALOAD t
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     GOTO n
+	 *     c:
+	 *     ALOAD r0
+	 *     INVOKEVIRTUAL close:()V
+	 *     n:
+	 *
+	 *     ... // finally on normal path
+	 *     ARETURN
+	 *
+	 *     ASTORE t
+	 *     ALOAD t
+	 *     ASTORE primaryExc1
+	 *     ALOAD t
+	 *     ATHROW
+	 *
+	 *     ASTORE t1
+	 *     ALOAD r1
+	 *     IFNULL e
+	 *     ALOAD primaryExc1
+	 *     IFNULL c
+	 *     ALOAD r1
+	 *     INVOKEINTERFACE close:()V
+	 *     GOTO e
+	 *     ASTORE t2
+	 *     ALOAD primaryExc1
+	 *     ALOAD t2
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     GOTO e
+	 *     c:
+	 *     ALOAD r1
+	 *     INVOKEINTERFACE close:()V
+	 *     e:
+	 *     ALOAD t1
+	 *     ATHROW
+	 *
+	 *     ASTORE t
+	 *     ALOAD t
+	 *     ASTORE primaryExc0
+	 *     ALOAD t
+	 *     ATHROW
+	 *
+	 *     ASTORE t1
+	 *     ALOAD r0
+	 *     IFNULL e
+	 *     ALOAD primaryExc0
+	 *     IFNULL c
+	 *     ALOAD r0
+	 *     INVOKEVIRTUAL close:()V
+	 *     GOTO e
+	 *     ASTORE t2
+	 *     ALOAD primaryExc0
+	 *     ALOAD t2
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     GOTO e
+	 *     c:
+	 *     ALOAD r0
+	 *     INVOKEVIRTUAL close:()V
+	 *     e:
+	 *     ALOAD t1
+	 *     ATHROW
+	 *
+	 *     ... // additional handlers for catch blocks and finally on exceptional path
+	 * </pre>
+	 */
+	@Test
+	public void javac_7_8() {
+		final Range range0 = new Range();
+		final Range range1 = new Range();
+		final Range range2 = new Range();
+		final Range range3 = new Range();
+
+		final Label handler1 = new Label();
+		m.visitTryCatchBlock(handler1, handler1, handler1,
+				"java/lang/Throwable");
+		final Label handler2 = new Label();
+		m.visitTryCatchBlock(handler2, handler2, handler2,
+				"java/lang/Throwable");
+
+		// r1 = ...
+		m.visitVarInsn(Opcodes.ASTORE, 1);
+
+		// primaryExc1 = null
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 2);
+
+		// r2 = ...
+		m.visitVarInsn(Opcodes.ASTORE, 3);
+		// primaryExc2 = null
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 4);
+
+		// body
+		m.visitInsn(Opcodes.NOP);
+
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 5);
+
+		final Label l15 = new Label();
+		// if (r2 != null)
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		range0.fromInclusive = m.instructions.getLast();
+		m.visitJumpInsn(Opcodes.IFNULL, l15);
+		// if (primaryExc2 != null)
+		m.visitVarInsn(Opcodes.ALOAD, 4);
+		final Label l26 = new Label();
+		m.visitJumpInsn(Opcodes.IFNULL, l26);
+		// r2.close
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Fun$Resource2", "close",
+				"()V", false);
+		m.visitJumpInsn(Opcodes.GOTO, l15);
+
+		m.visitVarInsn(Opcodes.ASTORE, 6);
+		m.visitVarInsn(Opcodes.ALOAD, 4);
+		m.visitVarInsn(Opcodes.ALOAD, 6);
+		m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+				"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+		m.visitJumpInsn(Opcodes.GOTO, l15);
+
+		m.visitLabel(l26);
+
+		// r2.close
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Fun$Resource2", "close",
+				"()V", false);
+		range0.toInclusive = m.instructions.getLast();
+		m.visitLabel(l15);
+
+		// if (r1 != null)
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		range2.fromInclusive = m.instructions.getLast();
+		final Label l23 = new Label();
+		m.visitJumpInsn(Opcodes.IFNULL, l23);
+		// if (primaryExc1 != null)
+		m.visitVarInsn(Opcodes.ALOAD, 2);
+		final Label l27 = new Label();
+		m.visitJumpInsn(Opcodes.IFNULL, l27);
+		// r1.close
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource1", "close",
+				"()V", false);
+		m.visitJumpInsn(Opcodes.GOTO, l23);
+
+		m.visitVarInsn(Opcodes.ASTORE, 6);
+		m.visitVarInsn(Opcodes.ALOAD, 2);
+		m.visitVarInsn(Opcodes.ALOAD, 6);
+		m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+				"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+		m.visitJumpInsn(Opcodes.GOTO, l23);
+
+		m.visitLabel(l27);
+		// r1.close
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource1", "close",
+				"()V", false);
+		range2.toInclusive = m.instructions.getLast();
+		m.visitLabel(l23);
+
+		// finally
+		m.visitInsn(Opcodes.NOP);
+		m.visitInsn(Opcodes.ARETURN);
+
+		// catch (Throwable t)
+		m.visitLabel(handler1);
+		range1.fromInclusive = m.instructions.getLast();
+		m.visitVarInsn(Opcodes.ASTORE, 5);
+		// primaryExc2 = t
+		m.visitVarInsn(Opcodes.ALOAD, 5);
+		m.visitVarInsn(Opcodes.ASTORE, 4);
+		// throw t
+		m.visitVarInsn(Opcodes.ALOAD, 5);
+		m.visitInsn(Opcodes.ATHROW);
+
+		// catch (any t)
+		m.visitVarInsn(Opcodes.ASTORE, 7);
+		// if (r2 != null)
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		final Label l28 = new Label();
+		m.visitJumpInsn(Opcodes.IFNULL, l28);
+		// if (primaryExc2 != null)
+		m.visitVarInsn(Opcodes.ALOAD, 4);
+		final Label l29 = new Label();
+		m.visitJumpInsn(Opcodes.IFNULL, l29);
+		// r2.close
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Fun$Resource2", "close",
+				"()V", false);
+		m.visitJumpInsn(Opcodes.GOTO, l28);
+
+		m.visitVarInsn(Opcodes.ASTORE, 8);
+		m.visitVarInsn(Opcodes.ALOAD, 4);
+		m.visitVarInsn(Opcodes.ALOAD, 8);
+		m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+				"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+		m.visitJumpInsn(Opcodes.GOTO, l28);
+
+		m.visitLabel(l29);
+		// r2.close
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Fun$Resource2", "close",
+				"()V", false);
+		m.visitLabel(l28);
+		// throw t
+		m.visitVarInsn(Opcodes.ALOAD, 7);
+		m.visitInsn(Opcodes.ATHROW);
+		range1.toInclusive = m.instructions.getLast();
+
+		// catch (Throwable t)
+		m.visitLabel(handler2);
+		range3.fromInclusive = m.instructions.getLast();
+		m.visitVarInsn(Opcodes.ASTORE, 3);
+		// primaryExc2 = t
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitVarInsn(Opcodes.ASTORE, 2);
+		// throw t
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitInsn(Opcodes.ATHROW);
+
+		// catch (any t)
+		m.visitVarInsn(Opcodes.ASTORE, 9);
+		// if (r1 != null)
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		final Label l30 = new Label();
+		m.visitJumpInsn(Opcodes.IFNULL, l30);
+		// if (primaryExc1 != null)
+		m.visitVarInsn(Opcodes.ALOAD, 2);
+		final Label l31 = new Label();
+		m.visitJumpInsn(Opcodes.IFNULL, l31);
+		// r1.close
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource1", "close",
+				"()V", false);
+		m.visitJumpInsn(Opcodes.GOTO, l30);
+
+		m.visitVarInsn(Opcodes.ASTORE, 10);
+		m.visitVarInsn(Opcodes.ALOAD, 2);
+		m.visitVarInsn(Opcodes.ALOAD, 10);
+		m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+				"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+		m.visitJumpInsn(Opcodes.GOTO, l30);
+
+		m.visitLabel(l31);
+		// r1.close
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource1", "close",
+				"()V", false);
+		m.visitLabel(l30);
+		// throw t
+		m.visitVarInsn(Opcodes.ALOAD, 9);
+		m.visitInsn(Opcodes.ATHROW);
+		range3.toInclusive = m.instructions.getLast();
+
+		m.visitVarInsn(Opcodes.ASTORE, 11);
+		// finally
+		m.visitInsn(Opcodes.NOP);
+		m.visitVarInsn(Opcodes.ALOAD, 11);
+		m.visitInsn(Opcodes.ATHROW);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertEquals(4, from.size());
+
+		assertEquals(range0.fromInclusive, from.get(0));
+		assertEquals(range0.toInclusive, to.get(0));
+
+		assertEquals(range1.fromInclusive, from.get(1));
+		assertEquals(range1.toInclusive, to.get(1));
+
+		assertEquals(range2.fromInclusive, from.get(2));
+		assertEquals(range2.toInclusive, to.get(2));
+
+		assertEquals(range3.fromInclusive, from.get(3));
+		assertEquals(range3.toInclusive, to.get(3));
+	}
+
+	/**
+	 * javac 9 for
+	 * 
+	 * <pre>
+	 *     try (r = new ...) {
+	 *         ...
+	 *     } finally {
+	 *         ...
+	 *     }
+	 * </pre>
+	 *
+	 * generates
+	 *
+	 * <pre>
+	 *     ...
+	 *     ASTORE r
+	 *     ACONST_NULL
+	 *     ASTORE primaryExc
+	 *
+	 *     ... // body
+	 *
+	 *     ALOAD primaryExc
+	 *     IFNULL c
+	 *     ALOAD r
+	 *     INVOKEVIRTUAL close:()V
+	 *     GOTO f
+	 *     ASTORE t
+	 *     ALOAD primaryExc
+	 *     ALOAD t
+	 *     NVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     GOTO f
+	 *     c:
+	 *     ALOAD r
+	 *     INVOKEVIRTUAL close:()V
+	 *     GOTO f
+	 *
+	 *     ASTORE t
+	 *     ALOAD t
+	 *     ASTORE primaryExc
+	 *     ALOAD t
+	 *     ATHROW
+	 *
+	 *     ASTORE t
+	 *     ALOAD primaryExc
+	 *     IFNULL c
+	 *     ALOAD r
+	 *     INVOKEVIRTUAL close:()V
+	 *     GOTO L78
+	 *     ASTORE t2
+	 *     ALOAD primaryExc
+	 *     ALOAD t2
+	 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
+	 *     goto e
+	 *     c:
+	 *     ALOAD r
+	 *     INVOKEVIRTUAL close:()V
+	 *     e:
+	 *     ALOAD t
+	 *     ATHROW
+	 *
+	 *     f:
+	 *     ... // finally on normal path
+	 *     ... // additional handlers for catch blocks and finally on exceptional path
+	 *     ...
+	 * </pre>
+	 */
+	@Test
+	public void javac9_omitted_null_check() {
+		final Range range0 = new Range();
+		final Range range1 = new Range();
+
+		final Label handler = new Label();
+		m.visitTryCatchBlock(handler, handler, handler, "java/lang/Throwable");
+
+		// primaryExc = null
+		m.visitInsn(Opcodes.ACONST_NULL);
+		m.visitVarInsn(Opcodes.ASTORE, 1);
+
+		// r = new ...
+		m.visitInsn(Opcodes.NOP);
+
+		final Label end = new Label();
+		// "finally" on a normal path
+		{
+			// if (primaryExc != null)
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			range0.fromInclusive = m.instructions.getLast();
+			final Label closeLabel = new Label();
+			m.visitJumpInsn(Opcodes.IFNULL, closeLabel);
+			// r.close
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Resource", "close", "()V",
+					false);
+			m.visitJumpInsn(Opcodes.GOTO, end);
+
+			// catch (Throwable t)
+			m.visitVarInsn(Opcodes.ASTORE, 3);
+			// primaryExc.addSuppressed(t)
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+					"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+			m.visitJumpInsn(Opcodes.GOTO, end);
+
+			m.visitLabel(closeLabel);
+			// r.close()
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Resource", "close", "()V",
+					false);
+		}
+		m.visitJumpInsn(Opcodes.GOTO, end);
+		range0.toInclusive = m.instructions.getLast();
+		// catch (Throwable t)
+		m.visitLabel(handler);
+		{
+			range1.fromInclusive = m.instructions.getLast();
+			m.visitVarInsn(Opcodes.ASTORE, 3);
+			// primaryExc = t
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			m.visitVarInsn(Opcodes.ASTORE, 2);
+			// throw t
+			m.visitVarInsn(Opcodes.ALOAD, 3);
+			m.visitInsn(Opcodes.ATHROW);
+		}
+		// catch (any t)
+		m.visitVarInsn(Opcodes.ASTORE, 4);
+		// "finally" on exceptional path
+		{
+			// if (primaryExc != null)
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			final Label closeLabel = new Label();
+			m.visitJumpInsn(Opcodes.IFNULL, closeLabel);
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Resource", "close", "()V",
+					false);
+			final Label finallyEndLabel = new Label();
+			m.visitJumpInsn(Opcodes.GOTO, finallyEndLabel);
+
+			// catch (Throwable t)
+			m.visitVarInsn(Opcodes.ASTORE, 5);
+			// primaryExc.addSuppressed(t)
+			m.visitVarInsn(Opcodes.ALOAD, 2);
+			m.visitVarInsn(Opcodes.ALOAD, 5);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable",
+					"addSuppressed", "(Ljava/lang/Throwable;)V", false);
+			m.visitJumpInsn(Opcodes.GOTO, finallyEndLabel);
+
+			m.visitLabel(closeLabel);
+			// r.close()
+			m.visitVarInsn(Opcodes.ALOAD, 1);
+			m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Resource", "close", "()V",
+					false);
+			m.visitLabel(finallyEndLabel);
+		}
+		// throw t
+		m.visitVarInsn(Opcodes.ALOAD, 4);
+		m.visitInsn(Opcodes.ATHROW);
+		range1.toInclusive = m.instructions.getLast();
+
+		m.visitLabel(end);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertEquals(2, from.size());
+
+		assertEquals(range0.fromInclusive, from.get(0));
+		assertEquals(range0.toInclusive, to.get(0));
+
+		assertEquals(range1.fromInclusive, from.get(1));
+		assertEquals(range1.toInclusive, to.get(1));
+	}
+
+	/**
+	 * javac 9 for
+	 * 
+	 * <pre>
+	 *     try (r = new ...) {
+	 *       throw ...
+	 *     }
+	 * </pre>
+	 *
+	 * generates
+	 *
+	 * <pre>
+	 *     ...
+	 *     ASTORE r
+	 *     ACONST_NULL
+	 *     ASTORE primaryExc
+	 *
+	 *     ...
+	 *     ATHROW
+	 *
+	 *     ASTORE t
+	 *     ALOAD t
+	 *     ASTORE primaryExc
+	 *     ALOAD t
+	 *     ATHROW
+	 *
+	 *     ASTORE t
+	 *     ALOAD primaryExc
+	 *     ALOAD r
+	 *     INVOKESTATIC  $closeResource:(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+	 *     ALOAD t
+	 *     ATHROW
+	 * </pre>
+	 */
+	@Test
+	public void only_exceptional_path() {
+		final Label start = new Label();
+		final Label handler = new Label();
+		m.visitTryCatchBlock(start, handler, handler, "java/lang/Throwable");
+
+		m.visitLabel(start);
+		m.visitInsn(Opcodes.ATHROW);
+		m.visitLabel(handler);
+		m.visitVarInsn(Opcodes.ASTORE, 3);
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitVarInsn(Opcodes.ASTORE, 2);
+		m.visitVarInsn(Opcodes.ALOAD, 3);
+		m.visitInsn(Opcodes.ATHROW);
+
+		m.visitVarInsn(Opcodes.ASTORE, 4);
+		m.visitVarInsn(Opcodes.ALOAD, 2);
+		m.visitVarInsn(Opcodes.ALOAD, 1);
+		m.visitMethodInsn(Opcodes.INVOKESTATIC, "Fun", "$closeResource",
+				"(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", false);
+		m.visitVarInsn(Opcodes.ALOAD, 4);
+		m.visitInsn(Opcodes.ATHROW);
+
+		filter.filter("Foo", "java/lang/Object", m, this);
+
+		assertEquals(0, from.size());
+	}
+
+	static class Range {
+		AbstractInsnNode fromInclusive;
+		AbstractInsnNode toInclusive;
+	}
+
+	private final List<AbstractInsnNode> from = new ArrayList<AbstractInsnNode>();
+	private final List<AbstractInsnNode> to = new ArrayList<AbstractInsnNode>();
+
+	public void ignore(AbstractInsnNode from, AbstractInsnNode to) {
+		this.from.add(from);
+		this.to.add(to);
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/data/CRC64Test.java b/org.jacoco.core.test/src/org/jacoco/core/internal/data/CRC64Test.java
index 895fb49..b8bed88 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/data/CRC64Test.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/data/CRC64Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/data/CompactDataInputOutputTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/data/CompactDataInputOutputTest.java
index f895a21..0f01875 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/data/CompactDataInputOutputTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/data/CompactDataInputOutputTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/ClassProbesAdapterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/ClassProbesAdapterTest.java
index 9ec69fa..a55615a 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/ClassProbesAdapterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/ClassProbesAdapterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/FrameSnapshotTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/FrameSnapshotTest.java
index d2dfa42..3aefe72 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/FrameSnapshotTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/FrameSnapshotTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/InstructionTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/InstructionTest.java
index 22bd438..1dc5fc2 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/InstructionTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/InstructionTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,9 +12,12 @@
 package org.jacoco.core.internal.flow;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
 
 import org.junit.Before;
 import org.junit.Test;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.InsnNode;
 
 /**
  * Unit tests for {@link Instruction}.
@@ -25,11 +28,14 @@
 
 	@Before
 	public void setup() {
-		instruction = new Instruction(123);
+		instruction = new Instruction(new InsnNode(Opcodes.NOP), 123);
 	}
 
 	@Test
 	public void testInit() {
+		final InsnNode node = new InsnNode(Opcodes.NOP);
+		instruction = new Instruction(node, 123);
+		assertSame(node, instruction.getNode());
 		assertEquals(123, instruction.getLine());
 		assertEquals(0, instruction.getBranches());
 		assertEquals(0, instruction.getCoveredBranches());
@@ -48,14 +54,16 @@
 
 	@Test
 	public void testSetPredecessor() {
-		final Instruction predecessor = new Instruction(122);
+		final Instruction predecessor = new Instruction(
+				new InsnNode(Opcodes.NOP), 122);
 		instruction.setPredecessor(predecessor);
 		assertEquals(1, predecessor.getBranches());
 	}
 
 	@Test
 	public void testSetCovered() {
-		final Instruction predecessor = new Instruction(122);
+		final Instruction predecessor = new Instruction(
+				new InsnNode(Opcodes.NOP), 122);
 		instruction.setPredecessor(predecessor);
 		instruction.setCovered();
 		assertEquals(1, instruction.getCoveredBranches());
@@ -68,10 +76,11 @@
 
 	@Test
 	public void testSetCoveredOnLongSequence() {
-		final Instruction first = new Instruction(0);
+		final Instruction first = new Instruction(new InsnNode(Opcodes.NOP), 0);
 		Instruction next = first;
 		for (int i = 0; i < 0x10000; i++) {
-			final Instruction insn = new Instruction(i);
+			final Instruction insn = new Instruction(new InsnNode(Opcodes.NOP),
+					i);
 			insn.setPredecessor(next);
 			next = insn;
 		}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/LabelFlowAnalyzerTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/LabelFlowAnalyzerTest.java
index 8081c67..8777c9b 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/LabelFlowAnalyzerTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/LabelFlowAnalyzerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/LabelInfoTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/LabelInfoTest.java
index d83bee6..b2fd0b5 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/LabelInfoTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/LabelInfoTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,6 +20,8 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.objectweb.asm.Label;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.InsnNode;
 
 /**
  * Unit tests for {@link LabelInfoTest}.
@@ -159,7 +161,8 @@
 
 	@Test
 	public void testSetInstruction() {
-		final Instruction instruction = new Instruction(123);
+		final Instruction instruction = new Instruction(
+				new InsnNode(Opcodes.NOP), 123);
 		LabelInfo.setInstruction(label, instruction);
 		assertSame(instruction, LabelInfo.getInstruction(label));
 	}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/MethodProbesAdapterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/MethodProbesAdapterTest.java
index 25da70c..083ec0a 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/MethodProbesAdapterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/MethodProbesAdapterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/MethodSanitizerTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/MethodSanitizerTest.java
index 57042eb..d246427 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/flow/MethodSanitizerTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/flow/MethodSanitizerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ClassInstrumenterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ClassInstrumenterTest.java
index dedb461..9700d9e 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ClassInstrumenterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ClassInstrumenterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,7 +13,6 @@
 
 import static org.junit.Assert.assertNull;
 
-import org.jacoco.core.JaCoCo;
 import org.junit.Before;
 import org.junit.Test;
 import org.objectweb.asm.ClassVisitor;
@@ -29,7 +28,7 @@
 	@Before
 	public void setup() {
 		instrumenter = new ClassInstrumenter(this, new ClassVisitor(
-				JaCoCo.ASM_API_VERSION) {
+				InstrSupport.ASM_API_VERSION) {
 		});
 	}
 
@@ -50,7 +49,7 @@
 	@Test
 	public void testNoMethodVisitor() {
 		instrumenter = new ClassInstrumenter(this, new ClassVisitor(
-				JaCoCo.ASM_API_VERSION) {
+				InstrSupport.ASM_API_VERSION) {
 			@Override
 			public MethodVisitor visitMethod(int access, String name,
 					String desc, String signature, String[] exceptions) {
@@ -62,7 +61,7 @@
 
 	// === IProbeArrayStrategy ===
 
-	public int storeInstance(MethodVisitor mv, int variable) {
+	public int storeInstance(MethodVisitor mv, boolean clinit, int variable) {
 		return 0;
 	}
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/DuplicateFrameEliminatorTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/DuplicateFrameEliminatorTest.java
index bd354d9..b1cc96b 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/DuplicateFrameEliminatorTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/DuplicateFrameEliminatorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -101,7 +101,7 @@
 	@Test
 	public void testInvokeDynamicInsn() {
 		testInstructionBetweenFrames(new InvokeDynamicInsnNode("foo", "()V",
-				new Handle(0, null, null, null)));
+				new Handle(0, null, null, null, false)));
 	}
 
 	@Test
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/InstrSupportTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/InstrSupportTest.java
index 57f7988..63a61b0 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/InstrSupportTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/InstrSupportTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/MethodInstrumenterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/MethodInstrumenterTest.java
index 0bd27d0..4110143 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/MethodInstrumenterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/MethodInstrumenterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactoryTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactoryTest.java
index 1d3fb6b..3341520 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactoryTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactoryTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,7 +12,12 @@
 package org.jacoco.core.internal.instr;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.List;
 
 import org.jacoco.core.runtime.IExecutionDataAccessorGenerator;
 import org.jacoco.core.runtime.OfflineInstrumentationAccessGenerator;
@@ -43,122 +48,196 @@
 
 	@Test
 	public void testClass1() {
-		test(Opcodes.V1_1, 0, false, true);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_1, 0, false, true,
+				true);
+		assertEquals(ClassFieldProbeArrayStrategy.class, strategy.getClass());
 		assertDataField(InstrSupport.DATAFIELD_ACC);
 		assertInitMethod(false);
 	}
 
 	@Test
 	public void testClass2() {
-		test(Opcodes.V1_2, 0, false, true);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_2, 0, false, true,
+				true);
+		assertEquals(ClassFieldProbeArrayStrategy.class, strategy.getClass());
 		assertDataField(InstrSupport.DATAFIELD_ACC);
 		assertInitMethod(false);
 	}
 
 	@Test
 	public void testClass3() {
-		test(Opcodes.V1_3, 0, false, true);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_3, 0, false, true,
+				true);
+		assertEquals(ClassFieldProbeArrayStrategy.class, strategy.getClass());
 		assertDataField(InstrSupport.DATAFIELD_ACC);
 		assertInitMethod(false);
 	}
 
 	@Test
 	public void testClass4() {
-		test(Opcodes.V1_4, 0, false, true);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_4, 0, false, true,
+				true);
+		assertEquals(ClassFieldProbeArrayStrategy.class, strategy.getClass());
 		assertDataField(InstrSupport.DATAFIELD_ACC);
 		assertInitMethod(false);
 	}
 
 	@Test
 	public void testClass5() {
-		test(Opcodes.V1_5, 0, false, true);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_5, 0, false, true,
+				true);
+		assertEquals(ClassFieldProbeArrayStrategy.class, strategy.getClass());
 		assertDataField(InstrSupport.DATAFIELD_ACC);
 		assertInitMethod(false);
 	}
 
 	@Test
 	public void testClass6() {
-		test(Opcodes.V1_6, 0, false, true);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_6, 0, false, true,
+				true);
+		assertEquals(ClassFieldProbeArrayStrategy.class, strategy.getClass());
 		assertDataField(InstrSupport.DATAFIELD_ACC);
 		assertInitMethod(true);
 	}
 
 	@Test
 	public void testClass7() {
-		test(Opcodes.V1_7, 0, false, true);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_7, 0, false, true,
+				true);
+		assertEquals(ClassFieldProbeArrayStrategy.class, strategy.getClass());
 		assertDataField(InstrSupport.DATAFIELD_ACC);
 		assertInitMethod(true);
 	}
 
 	@Test
 	public void testClass8() {
-		test(Opcodes.V1_8, 0, false, true);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_8, 0, false, true,
+				true);
+		assertEquals(ClassFieldProbeArrayStrategy.class, strategy.getClass());
 		assertDataField(InstrSupport.DATAFIELD_ACC);
 		assertInitMethod(true);
+
+		strategy.storeInstance(cv.visitMethod(0, null, null, null, null), false,
+				0);
 	}
 
 	@Test
 	public void testInterface7() {
-		test(Opcodes.V1_7, Opcodes.ACC_INTERFACE, true, false);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_7,
+				Opcodes.ACC_INTERFACE, true, false, true);
+		assertEquals(LocalProbeArrayStrategy.class, strategy.getClass());
 		assertNoDataField();
 		assertNoInitMethod();
 	}
 
 	@Test
 	public void testEmptyInterface7() {
-		test(Opcodes.V1_7, Opcodes.ACC_INTERFACE, false, false);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_7,
+				Opcodes.ACC_INTERFACE, false, false, false);
+		assertEquals(NoneProbeArrayStrategy.class, strategy.getClass());
 		assertNoDataField();
 		assertNoInitMethod();
 	}
 
 	@Test(expected = UnsupportedOperationException.class)
 	public void testEmptyInterface7StoreInstance() {
-		IProbeArrayStrategy strategy = test(Opcodes.V1_7,
-				Opcodes.ACC_INTERFACE, false, false);
-		strategy.storeInstance(null, 0);
+		IProbeArrayStrategy strategy = test(Opcodes.V1_7, Opcodes.ACC_INTERFACE,
+				false, false, false);
+		strategy.storeInstance(null, false, 0);
 	}
 
 	@Test
 	public void testInterface8() {
-		test(Opcodes.V1_8, Opcodes.ACC_INTERFACE, false, true);
+		cv.isInterface = true;
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_8,
+				Opcodes.ACC_INTERFACE, false, true, true);
+		assertEquals(InterfaceFieldProbeArrayStrategy.class,
+				strategy.getClass());
 		assertDataField(InstrSupport.DATAFIELD_INTF_ACC);
-		assertInitMethod(true);
+		assertInitAndClinitMethods();
+
+		strategy.storeInstance(cv.visitMethod(0, null, null, null, null), false,
+				0);
 	}
 
 	@Test
 	public void testEmptyInterface8() {
-		test(Opcodes.V1_8, Opcodes.ACC_INTERFACE, false, false);
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_8,
+				Opcodes.ACC_INTERFACE, false, false, false);
+		assertEquals(NoneProbeArrayStrategy.class, strategy.getClass());
+		assertNoDataField();
+		assertNoInitMethod();
+	}
+
+	@Test(expected = UnsupportedOperationException.class)
+	public void testEmptyInterface8StoreInstance() {
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_8,
+				Opcodes.ACC_INTERFACE, false, false, false);
+		strategy.storeInstance(null, false, 0);
+	}
+
+	@Test
+	public void testClinitAndAbstractMethodsInterface8() {
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_8,
+				Opcodes.ACC_INTERFACE, true, false, true);
+		assertEquals(LocalProbeArrayStrategy.class, strategy.getClass());
+		assertNoDataField();
+		assertNoInitMethod();
+
+		strategy.storeInstance(cv.visitMethod(0, null, null, null, null), false,
+				0);
+	}
+
+	@Test
+	public void testClinitInterface8() {
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_8,
+				Opcodes.ACC_INTERFACE, true, false, false);
+		assertEquals(LocalProbeArrayStrategy.class, strategy.getClass());
 		assertNoDataField();
 		assertNoInitMethod();
 	}
 
 	@Test
-	public void testClinitInterface8() {
-		test(Opcodes.V1_8, Opcodes.ACC_INTERFACE, true, false);
-		assertNoDataField();
-		assertNoInitMethod();
+	public void testClinitAndMethodsInterface8() {
+		cv.isInterface = true;
+		final IProbeArrayStrategy strategy = test(Opcodes.V1_8,
+				Opcodes.ACC_INTERFACE, true, true, true);
+		assertEquals(InterfaceFieldProbeArrayStrategy.class,
+				strategy.getClass());
+		assertDataField(InstrSupport.DATAFIELD_INTF_ACC);
+		assertInitAndClinitMethods();
+
+		strategy.storeInstance(cv.visitMethod(0, "<clinit>", null, null, null),
+				true, 0);
 	}
 
 	private IProbeArrayStrategy test(int version, int access, boolean clinit,
-			boolean method) {
-		ClassWriter writer = new ClassWriter(0);
+			boolean method, boolean abstractMethod) {
+		final ClassWriter writer = new ClassWriter(0);
 		writer.visit(version, access, "Foo", "java/lang/Object", null, null);
 		if (clinit) {
-			MethodVisitor mv = writer.visitMethod(Opcodes.ACC_PUBLIC
-					| Opcodes.ACC_STATIC, "<clinit>", "()V", null, null);
+			final MethodVisitor mv = writer.visitMethod(
+					Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "<clinit>", "()V",
+					null, null);
 			mv.visitCode();
 			mv.visitInsn(Opcodes.RETURN);
 			mv.visitMaxs(0, 0);
 			mv.visitEnd();
 		}
 		if (method) {
-			MethodVisitor mv = writer.visitMethod(Opcodes.ACC_PUBLIC
-					| Opcodes.ACC_STATIC, "doit", "()V", null, null);
+			final MethodVisitor mv = writer.visitMethod(
+					Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "doit", "()V",
+					null, null);
 			mv.visitCode();
 			mv.visitInsn(Opcodes.RETURN);
 			mv.visitMaxs(0, 0);
 			mv.visitEnd();
 		}
+		if (abstractMethod) {
+			final MethodVisitor mv = writer.visitMethod(Opcodes.ACC_ABSTRACT,
+					"foo", "()V", null, null);
+			mv.visitEnd();
+		}
 		writer.visitEnd();
 
 		final IProbeArrayStrategy strategy = ProbeArrayStrategyFactory
@@ -168,15 +247,40 @@
 		return strategy;
 	}
 
+	private static class AddedMethod {
+		private final int access;
+		private final String name;
+		private final String desc;
+		private boolean frames;
+
+		AddedMethod(int access, String name, String desc) {
+			this.access = access;
+			this.name = name;
+			this.desc = desc;
+		}
+
+		void assertInitMethod(boolean frames) {
+			assertEquals(InstrSupport.INITMETHOD_NAME, name);
+			assertEquals(InstrSupport.INITMETHOD_DESC, desc);
+			assertEquals(InstrSupport.INITMETHOD_ACC, access);
+			assertEquals(Boolean.valueOf(frames), Boolean.valueOf(frames));
+		}
+
+		void assertClinit() {
+			assertEquals(InstrSupport.CLINIT_NAME, name);
+			assertEquals(InstrSupport.CLINIT_DESC, desc);
+			assertEquals(InstrSupport.CLINIT_ACC, access);
+			assertEquals(Boolean.valueOf(false), Boolean.valueOf(frames));
+		}
+	}
+
 	private static class ClassVisitorMock extends ClassVisitor {
 
+		private boolean isInterface;
+
 		private int fieldAccess;
 		private String fieldName;
-
-		private int methodAccess;
-		private String methodName;
-
-		private boolean frames;
+		private final List<AddedMethod> methods = new ArrayList<AddedMethod>();
 
 		ClassVisitorMock() {
 			super(Opcodes.ASM5);
@@ -194,14 +298,52 @@
 		@Override
 		public MethodVisitor visitMethod(int access, String name, String desc,
 				String signature, String[] exceptions) {
-			assertNull(methodName);
-			methodAccess = access;
-			methodName = name;
+			final AddedMethod m = new AddedMethod(access, name, desc);
+			methods.add(m);
 			return new MethodVisitor(Opcodes.ASM5) {
 				@Override
 				public void visitFrame(int type, int nLocal, Object[] local,
 						int nStack, Object[] stack) {
-					frames = true;
+					m.frames = true;
+				}
+
+				@Override
+				public void visitFieldInsn(int opcode, String owner,
+						String name, String desc) {
+					assertEquals(InstrSupport.DATAFIELD_NAME, name);
+					assertEquals(InstrSupport.DATAFIELD_DESC, desc);
+
+					if (opcode == Opcodes.GETSTATIC) {
+						assertEquals(InstrSupport.INITMETHOD_NAME,
+								methods.get(methods.size() - 1).name);
+					} else if (opcode == Opcodes.PUTSTATIC) {
+						if (isInterface) {
+							assertEquals(InstrSupport.CLINIT_NAME,
+									methods.get(methods.size() - 1).name);
+						} else {
+							assertEquals(InstrSupport.INITMETHOD_NAME,
+									methods.get(methods.size() - 1).name);
+						}
+					} else {
+						fail();
+					}
+				}
+
+				@Override
+				public void visitMethodInsn(int opcode, String owner,
+						String name, String desc, boolean itf) {
+					if ("getProbes".equals(name)) {
+						// method's owner is not interface:
+						assertFalse(itf);
+						return;
+					}
+					assertEquals(Boolean.valueOf(itf),
+							Boolean.valueOf(isInterface));
+
+					assertEquals(Opcodes.INVOKESTATIC, opcode);
+					assertEquals("Foo", owner);
+					assertEquals(InstrSupport.INITMETHOD_NAME, name);
+					assertEquals(InstrSupport.INITMETHOD_DESC, desc);
 				}
 			};
 		}
@@ -217,13 +359,18 @@
 	}
 
 	void assertInitMethod(boolean frames) {
-		assertEquals(InstrSupport.INITMETHOD_NAME, cv.methodName);
-		assertEquals(InstrSupport.INITMETHOD_ACC, cv.methodAccess);
-		assertEquals(Boolean.valueOf(frames), Boolean.valueOf(cv.frames));
+		assertEquals(cv.methods.size(), 1);
+		cv.methods.get(0).assertInitMethod(frames);
+	}
+
+	void assertInitAndClinitMethods() {
+		assertEquals(2, cv.methods.size());
+		cv.methods.get(0).assertInitMethod(true);
+		cv.methods.get(1).assertClinit();
 	}
 
 	void assertNoInitMethod() {
-		assertNull(cv.methodName);
+		assertEquals(0, cv.methods.size());
 	}
 
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeCounterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeCounterTest.java
index 118eea2..c55f06d 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeCounterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeCounterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,6 +18,7 @@
 
 import org.junit.Before;
 import org.junit.Test;
+import org.objectweb.asm.Opcodes;
 
 /**
  * Unit tests for {@link ProbeCounter}.
@@ -50,6 +51,12 @@
 	}
 
 	@Test
+	public void testVisitAbstractMethod() {
+		counter.visitMethod(Opcodes.ACC_ABSTRACT, "foo", null, null, null);
+		assertFalse(counter.hasMethods());
+	}
+
+	@Test
 	public void testVisitMethod() {
 		assertNull(counter.visitMethod(0, "foo", null, null, null));
 		assertTrue(counter.hasMethods());
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeInserterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeInserterTest.java
index 7d30541..87f6ec6 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeInserterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/ProbeInserterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -39,9 +39,8 @@
 		expected = new MethodRecorder();
 		expectedVisitor = expected.getVisitor();
 		arrayStrategy = new IProbeArrayStrategy() {
-
-			public int storeInstance(MethodVisitor mv, int variable) {
-				mv.visitLdcInsn("init");
+			public int storeInstance(MethodVisitor mv, boolean clinit, int variable) {
+				mv.visitLdcInsn(clinit ? "clinit" : "init");
 				return 5;
 			}
 
@@ -57,7 +56,7 @@
 
 	@Test
 	public void testVariableStatic() {
-		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "()V",
+		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "m", "()V",
 				actualVisitor, arrayStrategy);
 		pi.insertProbe(0);
 
@@ -69,7 +68,7 @@
 
 	@Test
 	public void testVariableNonStatic() {
-		ProbeInserter pi = new ProbeInserter(0, "()V", actualVisitor,
+		ProbeInserter pi = new ProbeInserter(0, "m", "()V", actualVisitor,
 				arrayStrategy);
 		pi.insertProbe(0);
 
@@ -81,7 +80,7 @@
 
 	@Test
 	public void testVariableNonStatic_IZObject() {
-		ProbeInserter pi = new ProbeInserter(0, "(IZLjava/lang/Object;)V",
+		ProbeInserter pi = new ProbeInserter(0, "m", "(IZLjava/lang/Object;)V",
 				actualVisitor, arrayStrategy);
 		pi.insertProbe(0);
 
@@ -93,7 +92,7 @@
 
 	@Test
 	public void testVariableNonStatic_JD() {
-		ProbeInserter pi = new ProbeInserter(0, "(JD)V", actualVisitor,
+		ProbeInserter pi = new ProbeInserter(0, "m", "(JD)V", actualVisitor,
 				arrayStrategy);
 		pi.insertProbe(0);
 
@@ -105,7 +104,7 @@
 
 	@Test
 	public void testVisitCode() {
-		ProbeInserter pi = new ProbeInserter(0, "()V", actualVisitor,
+		ProbeInserter pi = new ProbeInserter(0, "m", "()V", actualVisitor,
 				arrayStrategy);
 		pi.visitCode();
 
@@ -113,8 +112,17 @@
 	}
 
 	@Test
+	public void testVisitClinit() {
+		ProbeInserter pi = new ProbeInserter(0, "<clinit>", "()V",
+				actualVisitor, arrayStrategy);
+		pi.visitCode();
+
+		expectedVisitor.visitLdcInsn("clinit");
+	}
+
+	@Test
 	public void testVisitVarIns() {
-		ProbeInserter pi = new ProbeInserter(0, "(II)V", actualVisitor,
+		ProbeInserter pi = new ProbeInserter(0, "m", "(II)V", actualVisitor,
 				arrayStrategy);
 
 		pi.visitVarInsn(Opcodes.ALOAD, 0);
@@ -135,7 +143,7 @@
 
 	@Test
 	public void testVisitIincInsn() {
-		ProbeInserter pi = new ProbeInserter(0, "(II)V", actualVisitor,
+		ProbeInserter pi = new ProbeInserter(0, "m", "(II)V", actualVisitor,
 				arrayStrategy);
 		pi.visitIincInsn(0, 100);
 		pi.visitIincInsn(1, 101);
@@ -155,7 +163,7 @@
 
 	@Test
 	public void testVisitLocalVariable() {
-		ProbeInserter pi = new ProbeInserter(0, "(II)V", actualVisitor,
+		ProbeInserter pi = new ProbeInserter(0, "m", "(II)V", actualVisitor,
 				arrayStrategy);
 
 		pi.visitLocalVariable(null, null, null, null, null, 0);
@@ -176,7 +184,7 @@
 
 	@Test
 	public void testVisitMaxs1() {
-		ProbeInserter pi = new ProbeInserter(0, "(II)V", actualVisitor,
+		ProbeInserter pi = new ProbeInserter(0, "m", "(II)V", actualVisitor,
 				arrayStrategy);
 		pi.visitCode();
 		pi.visitMaxs(0, 8);
@@ -187,7 +195,7 @@
 
 	@Test
 	public void testVisitMaxs2() {
-		ProbeInserter pi = new ProbeInserter(0, "(II)V", actualVisitor,
+		ProbeInserter pi = new ProbeInserter(0, "m", "(II)V", actualVisitor,
 				arrayStrategy);
 		pi.visitCode();
 		pi.visitMaxs(10, 8);
@@ -198,7 +206,7 @@
 
 	@Test
 	public void testVisitFrame() {
-		ProbeInserter pi = new ProbeInserter(0, "(J)V", actualVisitor,
+		ProbeInserter pi = new ProbeInserter(0, "m", "(J)V", actualVisitor,
 				arrayStrategy);
 
 		pi.visitFrame(Opcodes.F_NEW, 3, new Object[] { "Foo", Opcodes.LONG,
@@ -210,7 +218,7 @@
 
 	@Test
 	public void testVisitFrameNoLocals() {
-		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "()V",
+		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "m", "()V",
 				actualVisitor, arrayStrategy);
 
 		pi.visitFrame(Opcodes.F_NEW, 0, new Object[] {}, 0, new Object[0]);
@@ -221,7 +229,7 @@
 
 	@Test
 	public void testVisitFrameProbeAt0() {
-		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "()V",
+		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "m", "()V",
 				actualVisitor, arrayStrategy);
 
 		pi.visitFrame(Opcodes.F_NEW, 2, new Object[] { Opcodes.DOUBLE, "Foo" },
@@ -233,7 +241,7 @@
 
 	@Test
 	public void testFillOneWord() {
-		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "(I)V",
+		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "m", "(I)V",
 				actualVisitor, arrayStrategy);
 
 		pi.visitFrame(Opcodes.F_NEW, 0, new Object[] {}, 0, new Object[] {});
@@ -245,7 +253,7 @@
 
 	@Test
 	public void testFillTwoWord() {
-		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "(J)V",
+		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "m", "(J)V",
 				actualVisitor, arrayStrategy);
 
 		pi.visitFrame(Opcodes.F_NEW, 0, new Object[] {}, 0, new Object[] {});
@@ -257,7 +265,7 @@
 
 	@Test
 	public void testFillPartly() {
-		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "(DIJ)V",
+		ProbeInserter pi = new ProbeInserter(Opcodes.ACC_STATIC, "m", "(DIJ)V",
 				actualVisitor, arrayStrategy);
 
 		pi.visitFrame(Opcodes.F_NEW, 1, new Object[] { Opcodes.DOUBLE }, 0,
@@ -271,7 +279,7 @@
 
 	@Test(expected = IllegalArgumentException.class)
 	public void testVisitFrame_invalidType() {
-		ProbeInserter pi = new ProbeInserter(0, "()V", actualVisitor,
+		ProbeInserter pi = new ProbeInserter(0, "m", "()V", actualVisitor,
 				arrayStrategy);
 		pi.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
 	}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/SignatureRemoverTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/SignatureRemoverTest.java
index a698c93..899af15 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/instr/SignatureRemoverTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/instr/SignatureRemoverTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/AgentOptionsTest.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/AgentOptionsTest.java
index 078d069..9470e86 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/AgentOptionsTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/AgentOptionsTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -44,6 +44,7 @@
 		assertEquals("sun.reflect.DelegatingClassLoader",
 				options.getExclClassloader());
 		assertFalse(options.getInclBootstrapClasses());
+		assertFalse(options.getInclNoLocationClasses());
 		assertNull(options.getSessionId());
 		assertTrue(options.getDumpOnExit());
 		assertEquals(AgentOptions.OutputMode.file, options.getOutput());
@@ -76,6 +77,7 @@
 		properties.put("excludes", "*Test");
 		properties.put("exclclassloader", "org.jacoco.test.TestLoader");
 		properties.put("inclbootstrapclasses", "true");
+		properties.put("inclnolocationclasses", "true");
 		properties.put("sessionid", "testsession");
 		properties.put("dumponexit", "false");
 		properties.put("output", "tcpserver");
@@ -92,6 +94,7 @@
 		assertEquals("*Test", options.getExcludes());
 		assertEquals("org.jacoco.test.TestLoader", options.getExclClassloader());
 		assertTrue(options.getInclBootstrapClasses());
+		assertTrue(options.getInclNoLocationClasses());
 		assertEquals("testsession", options.getSessionId());
 		assertFalse(options.getDumpOnExit());
 		assertEquals(AgentOptions.OutputMode.tcpserver, options.getOutput());
@@ -102,6 +105,12 @@
 	}
 
 	@Test
+	public void testEmptyPropertiesOptions() {
+		AgentOptions options = new AgentOptions(new Properties());
+		assertEquals("", options.toString());
+	}
+
+	@Test
 	public void testGetDestile() {
 		AgentOptions options = new AgentOptions("destfile=/var/test.exec");
 		assertEquals("/var/test.exec", options.getDestfile());
@@ -188,19 +197,19 @@
 	}
 
 	@Test
-	public void testGetIncludeBootstrapClassesTrue() {
+	public void testGetInclBootstrapClassesTrue() {
 		AgentOptions options = new AgentOptions("inclbootstrapclasses=true");
 		assertTrue(options.getInclBootstrapClasses());
 	}
 
 	@Test
-	public void testGetIncludeBootstrapClassesFalse() {
+	public void testGetInclBootstrapClassesFalse() {
 		AgentOptions options = new AgentOptions("inclbootstrapclasses=false");
 		assertFalse(options.getInclBootstrapClasses());
 	}
 
 	@Test
-	public void testSetIncludeBootstrapClassesTrue() {
+	public void testSetInclBootstrapClassesTrue() {
 		AgentOptions options = new AgentOptions();
 		options.setInclBootstrapClasses(true);
 		assertTrue(options.getInclBootstrapClasses());
@@ -208,7 +217,7 @@
 	}
 
 	@Test
-	public void testSetIncludeBootstrapClassesFalse() {
+	public void testSetInclBootstrapClassesFalse() {
 		AgentOptions options = new AgentOptions();
 		options.setInclBootstrapClasses(false);
 		assertFalse(options.getInclBootstrapClasses());
@@ -216,6 +225,34 @@
 	}
 
 	@Test
+	public void testGetInclNoLocationClassesTrue() {
+		AgentOptions options = new AgentOptions("inclnolocationclasses=true");
+		assertTrue(options.getInclNoLocationClasses());
+	}
+
+	@Test
+	public void testGetInclNoLocationClassesFalse() {
+		AgentOptions options = new AgentOptions("inclnolocationclasses=false");
+		assertFalse(options.getInclNoLocationClasses());
+	}
+
+	@Test
+	public void testSetInclNoLocationClassesTrue() {
+		AgentOptions options = new AgentOptions();
+		options.setInclNoLocationClasses(true);
+		assertTrue(options.getInclNoLocationClasses());
+		assertEquals("inclnolocationclasses=true", options.toString());
+	}
+
+	@Test
+	public void testSetInclNoLocationClassesFalse() {
+		AgentOptions options = new AgentOptions();
+		options.setInclNoLocationClasses(false);
+		assertFalse(options.getInclNoLocationClasses());
+		assertEquals("inclnolocationclasses=false", options.toString());
+	}
+
+	@Test
 	public void testGetSessionId() {
 		AgentOptions options = new AgentOptions("sessionid=testsession");
 		assertEquals("testsession", options.getSessionId());
@@ -325,13 +362,7 @@
 
 	@Test(expected = IllegalArgumentException.class)
 	public void testInvalidOptionKey() {
-		new AgentOptions("destfile=test.exec,something=true");
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void testInvalidOptionValue() {
-		AgentOptions options = new AgentOptions();
-		options.setDestfile("invalid,name.exec");
+		new AgentOptions("destfile=test.exec,Some-thing_1=true");
 	}
 
 	@Test(expected = IllegalArgumentException.class)
@@ -436,4 +467,11 @@
 						defaultAgentJarFile.toString()), vmArgument);
 	}
 
+	@Test
+	public void testOptionValueWithSpecialCharacters() {
+		AgentOptions options = new AgentOptions(
+				"destfile=build/jacoco/foo, bar-1_0.exec");
+		assertEquals("build/jacoco/foo, bar-1_0.exec", options.getDestfile());
+	}
+
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/CommandLineSupportTest.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/CommandLineSupportTest.java
index acef0d1..bbf3129 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/CommandLineSupportTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/CommandLineSupportTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/LoggerRuntimeTest.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/LoggerRuntimeTest.java
index e1d4ea1..7a0e7cd 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/LoggerRuntimeTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/LoggerRuntimeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/ModifiedSystemClassRuntimeTest.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/ModifiedSystemClassRuntimeTest.java
index 40e6000..08a2289 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/ModifiedSystemClassRuntimeTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/ModifiedSystemClassRuntimeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,12 +17,13 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.lang.instrument.ClassDefinition;
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.Instrumentation;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.util.jar.JarFile;
+import java.lang.reflect.Proxy;
 
 import org.jacoco.core.test.TargetLoader;
 import org.junit.Test;
@@ -40,7 +41,7 @@
 
 	@Test(expected = RuntimeException.class)
 	public void testCreateForNegative() throws Exception {
-		InstrumentationMock inst = new InstrumentationMock();
+		Instrumentation inst = newInstrumentationMock();
 		ModifiedSystemClassRuntime.createFor(inst, TARGET_CLASS_NAME);
 	}
 
@@ -49,13 +50,26 @@
 
 	private static final String TARGET_CLASS_NAME = "org/jacoco/core/runtime/ModifiedSystemClassRuntimeTest";
 
-	private static class InstrumentationMock implements Instrumentation {
+	/**
+	 * Note that we use Proxy here to mock {@link Instrumentation}, because JDK
+	 * 9 adds new method "addModule", whose parameter depends on class
+	 * "java.lang.reflect.Module" introduced in JDK 9.
+	 */
+	private Instrumentation newInstrumentationMock() {
+		return (Instrumentation) Proxy.newProxyInstance(getClass()
+				.getClassLoader(), new Class[] { Instrumentation.class },
+				new MyInvocationHandler());
+	}
 
+	private static class MyInvocationHandler implements InvocationHandler {
 		boolean added = false;
 
 		boolean removed = false;
 
-		public void addTransformer(ClassFileTransformer transformer) {
+		/**
+		 * {@link Instrumentation#addTransformer(ClassFileTransformer)}
+		 */
+		void addTransformer(ClassFileTransformer transformer) {
 			assertFalse(added);
 			added = true;
 			try {
@@ -63,8 +77,8 @@
 				final byte[] data = TargetLoader
 						.getClassDataAsBytes(ModifiedSystemClassRuntimeTest.class);
 				verifyInstrumentedClass(TARGET_CLASS_NAME,
-						transformer.transform(null, TARGET_CLASS_NAME, null,
-								null, data));
+						transformer.transform((ClassLoader) null,
+								TARGET_CLASS_NAME, null, null, data));
 
 				// Other classes will not be instrumented:
 				assertNull(transformer.transform(getClass().getClassLoader(),
@@ -74,84 +88,29 @@
 			}
 		}
 
-		public boolean removeTransformer(ClassFileTransformer transformer) {
+		/**
+		 * {@link Instrumentation#removeTransformer(ClassFileTransformer)}
+		 */
+		Boolean removeTransformer() {
 			assertTrue(added);
 			assertFalse(removed);
 			removed = true;
-			return true;
+			return Boolean.TRUE;
 		}
 
-		public Class<?>[] getAllLoadedClasses() {
+		public Object invoke(Object proxy, Method method, Object[] args)
+				throws Throwable {
+			if (args.length == 1) {
+				if ("removeTransformer".equals(method.getName())) {
+					return removeTransformer();
+				} else if ("addTransformer".equals(method.getName())) {
+					addTransformer((ClassFileTransformer) args[0]);
+					return null;
+				}
+			}
 			fail();
 			return null;
 		}
-
-		public Class<?>[] getInitiatedClasses(ClassLoader loader) {
-			fail();
-			return null;
-		}
-
-		public long getObjectSize(Object objectToSize) {
-			fail();
-			return 0;
-		}
-
-		public boolean isRedefineClassesSupported() {
-			fail();
-			return false;
-		}
-
-		public void redefineClasses(ClassDefinition[] definitions) {
-			fail();
-		}
-
-		// JDK 1.6 Methods:
-
-		@SuppressWarnings("unused")
-		public void addTransformer(ClassFileTransformer transformer,
-				boolean canRetransform) {
-			fail();
-		}
-
-		@SuppressWarnings("unused")
-		public void appendToBootstrapClassLoaderSearch(JarFile jarfile) {
-			fail();
-		}
-
-		@SuppressWarnings("unused")
-		public void appendToSystemClassLoaderSearch(JarFile jarfile) {
-			fail();
-		}
-
-		@SuppressWarnings("unused")
-		public boolean isModifiableClass(Class<?> theClass) {
-			fail();
-			return false;
-		}
-
-		@SuppressWarnings("unused")
-		public boolean isNativeMethodPrefixSupported() {
-			fail();
-			return false;
-		}
-
-		@SuppressWarnings("unused")
-		public boolean isRetransformClassesSupported() {
-			fail();
-			return false;
-		}
-
-		@SuppressWarnings("unused")
-		public void retransformClasses(Class<?>... classes) {
-			fail();
-		}
-
-		@SuppressWarnings("unused")
-		public void setNativeMethodPrefix(ClassFileTransformer transformer,
-				String prefix) {
-			fail();
-		}
-
 	}
 
 	private static void verifyInstrumentedClass(String name, byte[] source)
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGeneratorTest.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGeneratorTest.java
index 10f2159..8f2ac4f 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGeneratorTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGeneratorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/RemoteControlReaderWriterTest.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/RemoteControlReaderWriterTest.java
index 7d71857..5497ef9 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/RemoteControlReaderWriterTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/RemoteControlReaderWriterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/RuntimeDataTest.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/RuntimeDataTest.java
index bca769f..fb3d48e 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/RuntimeDataTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/RuntimeDataTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/RuntimeTestBase.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/RuntimeTestBase.java
index c69ab25..2ed92fa 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/RuntimeTestBase.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/RuntimeTestBase.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -15,7 +15,6 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import org.jacoco.core.JaCoCo;
 import org.jacoco.core.internal.instr.InstrSupport;
 import org.jacoco.core.test.TargetLoader;
 import org.junit.After;
@@ -66,7 +65,7 @@
 	public void testNoLocalVariablesInDataAccessor()
 			throws InstantiationException, IllegalAccessException {
 		runtime.generateDataAccessor(1001, "Target", 5, new MethodVisitor(
-				JaCoCo.ASM_API_VERSION) {
+				InstrSupport.ASM_API_VERSION) {
 			@Override
 			public void visitVarInsn(int opcode, int var) {
 				fail("No usage of local variables allowed.");
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/SystemPropertiesRuntimeTest.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/SystemPropertiesRuntimeTest.java
index c30c188..f5b4719 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/SystemPropertiesRuntimeTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/SystemPropertiesRuntimeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/TestStorage.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/TestStorage.java
index 1fa0fe7..98d3563 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/TestStorage.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/TestStorage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/URLStreamHandlerRuntimeTest.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/URLStreamHandlerRuntimeTest.java
index add3f1a..bfed2f3 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/URLStreamHandlerRuntimeTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/URLStreamHandlerRuntimeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,6 +11,9 @@
  *******************************************************************************/
 package org.jacoco.core.runtime;
 
+import org.junit.Assume;
+import org.junit.BeforeClass;
+
 /**
  * Unit tests for {@link URLStreamHandlerRuntime}.
  */
@@ -21,4 +24,11 @@
 		return new URLStreamHandlerRuntime();
 	}
 
+	@BeforeClass
+	public static void checkJDK() {
+		final boolean jdk9 = System.getProperty("java.version")
+				.startsWith("9-");
+		Assume.assumeTrue(!jdk9);
+	}
+
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/runtime/WildcardMatcherTest.java b/org.jacoco.core.test/src/org/jacoco/core/runtime/WildcardMatcherTest.java
index f9777e7..10e012c 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/runtime/WildcardMatcherTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/runtime/WildcardMatcherTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/InstrumentingLoader.java b/org.jacoco.core.test/src/org/jacoco/core/test/InstrumentingLoader.java
new file mode 100644
index 0000000..d79ae62
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/InstrumentingLoader.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test;
+
+import java.io.IOException;
+
+import org.jacoco.core.data.ExecutionDataStore;
+import org.jacoco.core.data.SessionInfoStore;
+import org.jacoco.core.instr.Instrumenter;
+import org.jacoco.core.runtime.IRuntime;
+import org.jacoco.core.runtime.RuntimeData;
+import org.jacoco.core.runtime.SystemPropertiesRuntime;
+
+/**
+ * Class loader which loads classes from another class loader and instruments
+ * them.
+ */
+public final class InstrumentingLoader extends ClassLoader {
+
+	private final IRuntime runtime;
+	private final String scope;
+	private final ClassLoader delegate;
+
+	private final RuntimeData data;
+	private final Instrumenter instrumenter;
+
+	public InstrumentingLoader(IRuntime runtime, String scope,
+			ClassLoader delegate) throws Exception {
+		this.runtime = runtime;
+		this.scope = scope;
+		this.delegate = delegate;
+		this.data = new RuntimeData();
+		runtime.startup(data);
+		this.instrumenter = new Instrumenter(runtime);
+	}
+
+	public InstrumentingLoader(Class<?> target) throws Exception {
+		this(new SystemPropertiesRuntime(), target.getPackage().getName(),
+				target.getClassLoader());
+	}
+
+	@Override
+	protected synchronized Class<?> loadClass(String name, boolean resolve)
+			throws ClassNotFoundException {
+		if (name.startsWith(scope)) {
+			final byte[] bytes;
+			try {
+				bytes = TargetLoader.getClassDataAsBytes(delegate, name);
+			} catch (IOException e) {
+				throw new ClassNotFoundException("Unable to load", e);
+			}
+			final byte[] instrumented;
+			try {
+				instrumented = instrumenter.instrument(bytes, name);
+			} catch (IOException e) {
+				throw new ClassNotFoundException("Unable to instrument", e);
+			}
+			final Class<?> c = defineClass(name, instrumented, 0,
+					instrumented.length);
+			if (resolve) {
+				resolveClass(c);
+			}
+			return c;
+		}
+		return super.loadClass(name, resolve);
+	}
+
+	public ExecutionDataStore collect() {
+		final ExecutionDataStore store = new ExecutionDataStore();
+		data.collect(store, new SessionInfoStore(), false);
+		runtime.shutdown();
+		return store;
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/TargetLoader.java b/org.jacoco.core.test/src/org/jacoco/core/test/TargetLoader.java
index b467748..4c57fd8 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/TargetLoader.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/TargetLoader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,7 +18,7 @@
 import java.util.Map;
 
 /**
- * Loads a single class from a byte array.
+ * Loads given classes from a byte arrays.
  */
 public class TargetLoader extends ClassLoader {
 
@@ -38,10 +38,6 @@
 		return add(name.getName(), bytes);
 	}
 
-	public Class<?> add(final Class<?> source) throws IOException {
-		return add(source.getName(), getClassDataAsBytes(source));
-	}
-
 	private Class<?> load(final String sourcename) {
 		try {
 			return loadClass(sourcename);
@@ -52,13 +48,24 @@
 	}
 
 	public static InputStream getClassData(Class<?> clazz) {
-		final String resource = "/" + clazz.getName().replace('.', '/')
-				+ ".class";
-		return clazz.getResourceAsStream(resource);
+		return getClassData(clazz.getClassLoader(), clazz.getName());
+	}
+
+	public static InputStream getClassData(ClassLoader loader, String name) {
+		final String resource = name.replace('.', '/') + ".class";
+		return loader.getResourceAsStream(resource);
+	}
+
+	public static byte[] getClassDataAsBytes(ClassLoader loader, String name)
+			throws IOException {
+		return readBytes(getClassData(loader, name));
 	}
 
 	public static byte[] getClassDataAsBytes(Class<?> clazz) throws IOException {
-		InputStream in = getClassData(clazz);
+		return readBytes(getClassData(clazz));
+	}
+
+	private static byte[] readBytes(InputStream in) throws IOException {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		byte[] buffer = new byte[0x100];
 		int len;
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/filter/ConstructorTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/filter/ConstructorTest.java
new file mode 100644
index 0000000..a74d467
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/filter/ConstructorTest.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.filter;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.filter.targets.Constructor;
+import org.jacoco.core.test.validation.ValidationTestBase;
+import org.junit.Test;
+
+/**
+ * Test of filtering of a bytecode that is generated for a private empty
+ * constructors that do not have no arguments.
+ */
+public class ConstructorTest extends ValidationTestBase {
+
+	public ConstructorTest() {
+		super(Constructor.class);
+	}
+
+	@Test
+	public void testCoverageResult() {
+		// not filtered because not private:
+		assertLine("packageLocal", ICounter.FULLY_COVERED);
+
+		// not filtered because has argument:
+		assertLine("arg", ICounter.FULLY_COVERED);
+
+		// not filtered because not empty - prepares arguments for super
+		// constructor:
+		assertLine("super", ICounter.FULLY_COVERED);
+
+		// not filtered because contains initialization of a field to hold
+		// reference to an instance of outer class that is passed as an
+		// argument:
+		assertLine("inner", ICounter.FULLY_COVERED);
+
+		// not filtered because not empty - contains initialization of
+		// a field:
+		assertLine("innerStatic", ICounter.FULLY_COVERED);
+
+		// not filtered because default constructor for not private inner
+		// classes is not private:
+		assertLine("publicDefault", ICounter.FULLY_COVERED);
+		assertLine("packageLocalDefault", ICounter.FULLY_COVERED);
+
+		assertLine("privateDefault", ICounter.EMPTY);
+
+		assertLine("privateNonEmptyNoArg", ICounter.FULLY_COVERED);
+
+		assertLine("privateEmptyNoArg", ICounter.EMPTY);
+		assertLine("return", ICounter.EMPTY);
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/filter/SynchronizedTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/filter/SynchronizedTest.java
new file mode 100644
index 0000000..1cfce30
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/filter/SynchronizedTest.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.filter;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.filter.targets.Synchronized;
+import org.jacoco.core.test.validation.ValidationTestBase;
+import org.junit.Test;
+
+/**
+ * Test of filtering of a bytecode that is generated for a synchronized
+ * statement.
+ */
+public class SynchronizedTest extends ValidationTestBase {
+
+	public SynchronizedTest() {
+		super(Synchronized.class);
+	}
+
+	/**
+	 * {@link Synchronized#normal()}
+	 */
+	@Test
+	public void normal() {
+		assertLine("before", ICounter.FULLY_COVERED);
+		// when compiled with ECJ next line covered partly without filter:
+		assertLine("monitorEnter", ICounter.FULLY_COVERED);
+		assertLine("body", ICounter.FULLY_COVERED);
+		if (isJDKCompiler) {
+			// without filter next line covered partly:
+			assertLine("monitorExit", ICounter.FULLY_COVERED);
+		} else {
+			assertLine("monitorExit", ICounter.EMPTY);
+		}
+		assertLine("after", ICounter.FULLY_COVERED);
+	}
+
+	/**
+	 * {@link Synchronized#explicitException()}
+	 */
+	@Test
+	public void explicitException() {
+		assertLine("explicitException.monitorEnter", ICounter.FULLY_COVERED);
+		assertLine("explicitException.exception", ICounter.FULLY_COVERED);
+		// when compiled with javac next line covered fully without filter:
+		assertLine("explicitException.monitorExit", ICounter.EMPTY);
+	}
+
+	/**
+	 * {@link Synchronized#implicitException()}
+	 */
+	@Test
+	public void implicitException() {
+		assertLine("implicitException.monitorEnter", isJDKCompiler
+				? ICounter.FULLY_COVERED : ICounter.PARTLY_COVERED);
+		assertLine("implicitException.exception", ICounter.NOT_COVERED);
+		if (isJDKCompiler) {
+			// without filter next line covered partly:
+			assertLine("implicitException.monitorExit", ICounter.NOT_COVERED);
+		} else {
+			assertLine("implicitException.monitorExit", ICounter.EMPTY);
+		}
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/filter/SyntheticTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/filter/SyntheticTest.java
new file mode 100644
index 0000000..8f8d253
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/filter/SyntheticTest.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.filter;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.filter.targets.Synthetic;
+import org.jacoco.core.test.validation.ValidationTestBase;
+import org.junit.Test;
+
+/**
+ * Test of filtering of synthetic methods.
+ */
+public class SyntheticTest extends ValidationTestBase {
+
+	public SyntheticTest() {
+		super(Synthetic.class);
+	}
+
+	@Test
+	public void testCoverageResult() {
+		assertMethodCount(5);
+
+		assertLine("classdef", ICounter.EMPTY);
+		assertLine("field", ICounter.EMPTY);
+
+		assertLine("inner.classdef", ICounter.EMPTY);
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/filter/targets/Constructor.java b/org.jacoco.core.test/src/org/jacoco/core/test/filter/targets/Constructor.java
new file mode 100644
index 0000000..8623d2d
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/filter/targets/Constructor.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.filter.targets;
+
+import static org.jacoco.core.test.validation.targets.Stubs.nop;
+
+/**
+ * This test target is a constructors.
+ */
+public class Constructor {
+
+	Constructor() { // $line-packageLocal$
+	}
+
+	private Constructor(Object arg) { // $line-arg$
+	}
+
+	private static class Super extends Constructor {
+		private Super() {
+			super(null); // $line-super$
+		}
+	}
+
+	private class Inner {
+		private Inner() { // $line-inner$
+		}
+	}
+
+	private static class InnerStatic {
+		private Object field = this;
+
+		private InnerStatic() { // $line-innerStatic$
+		}
+	}
+
+	public static class PublicDefault { // $line-publicDefault$
+	}
+
+	static class PackageLocalDefault { // $line-packageLocalDefault$
+	}
+
+	private static class PrivateDefault { // $line-privateDefault$
+	}
+
+	private static class PrivateNonEmptyNoArg {
+		private PrivateNonEmptyNoArg() {
+			nop(); // $line-privateNonEmptyNoArg$
+		}
+	}
+
+	private static class PrivateEmptyNoArg {
+		private PrivateEmptyNoArg() { // $line-privateEmptyNoArg$
+		} // $line-return$
+	}
+
+	public static void main(String[] args) {
+		new Super();
+		new Constructor().new Inner();
+		new InnerStatic();
+		new PublicDefault();
+		new PackageLocalDefault();
+		new PrivateDefault();
+		new PrivateNonEmptyNoArg();
+		new PrivateEmptyNoArg();
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/filter/targets/Synchronized.java b/org.jacoco.core.test/src/org/jacoco/core/test/filter/targets/Synchronized.java
new file mode 100644
index 0000000..9403097
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/filter/targets/Synchronized.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.filter.targets;
+
+import static org.jacoco.core.test.validation.targets.Stubs.ex;
+import static org.jacoco.core.test.validation.targets.Stubs.nop;
+
+import org.jacoco.core.test.validation.targets.Stubs.StubException;
+
+/**
+ * This test target is a synchronized statement.
+ */
+public class Synchronized {
+
+	private static final Object lock = new Object();
+
+	private static void normal() {
+		nop(); // $line-before$
+		synchronized (lock) { // $line-monitorEnter$
+			nop(); // $line-body$
+		} // $line-monitorExit$
+		nop(); // $line-after$
+	}
+
+	private static void explicitException() {
+		synchronized (lock) { // $line-explicitException.monitorEnter$
+			throw new StubException(); // $line-explicitException.exception$
+		} // $line-explicitException.monitorExit$
+	}
+
+	private static void implicitException() {
+		synchronized (lock) { // $line-implicitException.monitorEnter$
+			ex(); // $line-implicitException.exception$
+		} // $line-implicitException.monitorExit$
+	}
+
+	public static void main(String[] args) {
+		normal();
+
+		try {
+			explicitException();
+		} catch (StubException e) {
+		}
+
+		try {
+			implicitException();
+		} catch (StubException e) {
+		}
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/filter/targets/Synthetic.java b/org.jacoco.core.test/src/org/jacoco/core/test/filter/targets/Synthetic.java
new file mode 100644
index 0000000..43826a8
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/filter/targets/Synthetic.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.filter.targets;
+
+/**
+ * This test target is synthetic methods.
+ */
+public class Synthetic { // $line-classdef$
+
+	private static int counter; // $line-field$
+
+	/**
+	 * {@link org.jacoco.core.test.validation.targets.Target06 Default
+	 * constructor will refer to a line of class definition}, so that we define
+	 * constructor explicitly in order to verify that we filter all other
+	 * constructions here that might refer to line of class definition.
+	 */
+	private Synthetic() {
+	}
+
+	static class Inner extends Synthetic { // $line-inner.classdef$
+
+		Inner() {
+		}
+
+		/**
+		 * Access to private field of outer class causes creation of synthetic
+		 * methods in it. In case of javac those methods refer to the line of
+		 * outer class definition, in case of ECJ - to the line of field.
+		 */
+		private static void inc() {
+			counter = counter + 2;
+		}
+
+		/**
+		 * Difference of return type with overridden method causes creation of
+		 * synthetic bridge method in this class. In case of javac this method
+		 * refers to the line of inner class definition, in case of EJC - to the
+		 * first line of file.
+		 */
+		@Override
+		public String get() {
+			return null;
+		}
+	}
+
+	public Object get() {
+		return null;
+	}
+
+	public static void main(String[] args) {
+		Inner.inc();
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/AnalysisTimeScenario.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/AnalysisTimeScenario.java
index ed5a196..0fcabb2 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/AnalysisTimeScenario.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/AnalysisTimeScenario.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/ExecuteInstrumentedCodeScenario.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/ExecuteInstrumentedCodeScenario.java
index f6b7bca..8e283ad 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/ExecuteInstrumentedCodeScenario.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/ExecuteInstrumentedCodeScenario.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/IPerfOutput.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/IPerfOutput.java
index 9eac131..e963392 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/IPerfOutput.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/IPerfOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/IPerfScenario.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/IPerfScenario.java
index b6fa509..42fa951 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/IPerfScenario.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/IPerfScenario.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/InstrumentationSizeSzenario.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/InstrumentationSizeSzenario.java
index 5427227..c2a7b99 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/InstrumentationSizeSzenario.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/InstrumentationSizeSzenario.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/InstrumentationTimeScenario.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/InstrumentationTimeScenario.java
index 18991b1..91c4a3f 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/InstrumentationTimeScenario.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/InstrumentationTimeScenario.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/PerfOutputWriter.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/PerfOutputWriter.java
index 99c28a3..ceabde9 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/PerfOutputWriter.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/PerfOutputWriter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/PerformanceSuite.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/PerformanceSuite.java
index 30e5812..5a689c4 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/PerformanceSuite.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/PerformanceSuite.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/TimedScenario.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/TimedScenario.java
index bc57dc9..6688faf 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/TimedScenario.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/TimedScenario.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target01.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target01.java
index 52e347d..2e79234 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target01.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target01.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target02.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target02.java
index 9e47571..441866b 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target02.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target02.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target03.java b/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target03.java
index 5ac4bad..46160c1 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target03.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/perf/targets/Target03.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/AnnotationInitializerTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/AnnotationInitializerTest.java
new file mode 100644
index 0000000..ce695d6
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/AnnotationInitializerTest.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.validation.targets.AnnotationInitializer;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test of initializer in annotations.
+ */
+public class AnnotationInitializerTest extends ValidationTestBase {
+
+	public AnnotationInitializerTest() {
+		super(AnnotationInitializer.class);
+	}
+
+	@Override
+	protected void run(Class<?> targetClass) throws Exception {
+		// Instrumentation should not add members,
+		// otherwise sun.reflect.annotation.AnnotationInvocationHandler
+		// can throw java.lang.annotation.AnnotationFormatError
+		assertEquals(1, targetClass.getDeclaredFields().length);
+		assertEquals(1, targetClass.getDeclaredMethods().length);
+
+		// Force initialization
+		targetClass.getField("CONST").get(null);
+	}
+
+	@Test
+	public void testCoverageResult() {
+		assertLine("const", ICounter.FULLY_COVERED);
+		assertLine("value", ICounter.EMPTY);
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/BadCycleClassTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/BadCycleClassTest.java
new file mode 100644
index 0000000..ab759c3
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/BadCycleClassTest.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.validation.targets.BadCycleClass;
+import org.junit.Test;
+
+/**
+ * Test of "bad cycles" with classes.
+ */
+public class BadCycleClassTest extends ValidationTestBase {
+
+	public BadCycleClassTest() throws Exception {
+		super(BadCycleClass.class);
+	}
+
+	@Test
+	public void test() throws Exception {
+		assertLine("childinit", ICounter.FULLY_COVERED);
+		assertLine("childsomeMethod", ICounter.FULLY_COVERED);
+		assertLine("childclinit", ICounter.FULLY_COVERED);
+
+		// The cycle causes a constructor and instance method to be called
+		// before the static initializer of a class:
+		assertLogEvents("childinit", "childsomeMethod", "childclinit",
+				"childinit");
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/BooleanExpressionsTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/BooleanExpressionsTest.java
index 53d61ce..bebd721 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/BooleanExpressionsTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/BooleanExpressionsTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,12 +24,6 @@
 		super(Target02.class);
 	}
 
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		final Object instance = targetClass.newInstance();
-		((Runnable) instance).run();
-	}
-
 	@Test
 	public void testCoverageResult() {
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ClassFileVersionsTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ClassFileVersionsTest.java
index 2f59546..1ec04de 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ClassFileVersionsTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ClassFileVersionsTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -28,8 +28,9 @@
 
 import java.io.IOException;
 
-import org.jacoco.core.JaCoCo;
 import org.jacoco.core.instr.Instrumenter;
+import org.jacoco.core.internal.Java9Support;
+import org.jacoco.core.internal.instr.InstrSupport;
 import org.jacoco.core.runtime.IRuntime;
 import org.jacoco.core.runtime.SystemPropertiesRuntime;
 import org.junit.Test;
@@ -83,6 +84,11 @@
 		testVersion(V1_8, true);
 	}
 
+	@Test
+	public void test_1_9() throws IOException {
+		testVersion(Java9Support.V1_9, true);
+	}
+
 	private void testVersion(int version, boolean frames) throws IOException {
 		final byte[] original = createClass(version);
 
@@ -95,13 +101,13 @@
 
 	private void assertFrames(byte[] source, boolean expected) {
 		final boolean[] hasFrames = new boolean[] { false };
-		new ClassReader(source).accept(
-				new ClassVisitor(JaCoCo.ASM_API_VERSION) {
+		new ClassReader(Java9Support.downgradeIfRequired(source)).accept(
+				new ClassVisitor(InstrSupport.ASM_API_VERSION) {
 
 					@Override
 					public MethodVisitor visitMethod(int access, String name,
 							String desc, String signature, String[] exceptions) {
-						return new MethodVisitor(JaCoCo.ASM_API_VERSION) {
+						return new MethodVisitor(InstrSupport.ASM_API_VERSION) {
 
 							@Override
 							public void visitFrame(int type, int nLocal,
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ClassInitializerTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ClassInitializerTest.java
index 446158b..2bae651 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ClassInitializerTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ClassInitializerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,12 +24,6 @@
 		super(Target05.class);
 	}
 
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		// Force class initialization
-		targetClass.getField("CONST1").get(null);
-	}
-
 	@Test
 	public void testCoverageResult() {
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/Compiler.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/Compiler.java
new file mode 100644
index 0000000..c15ae1f
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/Compiler.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation;
+
+/**
+ * Provides ability to detect compiler based on difference in generated bytecode
+ * for switch by enum.
+ */
+enum Compiler {
+
+	DETECT;
+
+	/**
+	 * @return <code>true</code> if this file was compiled by javac
+	 */
+	boolean isJDK() {
+		switch (DETECT) {
+		default:
+			try {
+				Compiler.class.getDeclaredField("$SWITCH_TABLE$"
+						+ Compiler.class.getName().replace('.', '$'));
+				return false;
+			} catch (NoSuchFieldException e) {
+				return true;
+			}
+		}
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ControlStructuresTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ControlStructuresTest.java
index 0e71777..1c33521 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ControlStructuresTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ControlStructuresTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,12 +24,6 @@
 		super(Target01.class);
 	}
 
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		final Object instance = targetClass.newInstance();
-		((Runnable) instance).run();
-	}
-
 	@Test
 	public void testCoverageResult() {
 
@@ -47,8 +41,7 @@
 		assertLine("missedelse", ICounter.NOT_COVERED);
 
 		// 4. Missed while block
-		// ECJ and javac produce different status here
-		assertLine("whilefalse", 1, 1);
+		assertLine("whilefalse", ICounter.FULLY_COVERED, 1, 1);
 		assertLine("missedwhile", ICounter.NOT_COVERED);
 
 		// 5. Always true while block
@@ -60,6 +53,7 @@
 
 		// 7. Executed do while block
 		assertLine("executeddowhile", ICounter.FULLY_COVERED);
+		assertLine("executeddowhilefalse", ICounter.FULLY_COVERED, 1, 1);
 
 		// 8. Missed for block
 		assertLine("missedforincrementer", ICounter.PARTLY_COVERED, 1, 1);
@@ -127,13 +121,17 @@
 		assertLine("executedcontinue", ICounter.FULLY_COVERED);
 		assertLine("missedaftercontinue", ICounter.NOT_COVERED);
 
-		// 20. Return statement
-		assertLine("return", ICounter.FULLY_COVERED);
-		assertLine("afterreturn", ICounter.NOT_COVERED);
+		// 20. Conditional return statement
+		assertLine("conditionalreturn", ICounter.FULLY_COVERED);
+		assertLine("afterconditionalreturn", ICounter.NOT_COVERED);
 
 		// 21. Implicit return
 		assertLine("implicitreturn", ICounter.FULLY_COVERED);
 
+		// 22. Explicit return
+		assertLine("explicitreturn", ICounter.FULLY_COVERED);
+		assertLine("afterexplicitreturn", ICounter.EMPTY);
+
 	}
 
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/CyclomaticComplexityTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/CyclomaticComplexityTest.java
index ff29cfb..575bf2e 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/CyclomaticComplexityTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/CyclomaticComplexityTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,6 +14,7 @@
 import static org.jacoco.core.test.validation.targets.Stubs.nop;
 import static org.junit.Assert.assertEquals;
 
+import java.io.IOException;
 import java.util.Collection;
 
 import org.jacoco.core.analysis.Analyzer;
@@ -32,7 +33,6 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.objectweb.asm.ClassReader;
 
 /**
  * Various tests for cyclomatic complexity of methods.
@@ -45,7 +45,7 @@
 
 	private RuntimeData data;
 	private IRuntime runtime;
-	private ClassReader reader;
+	private byte[] bytes;
 	private Target target;
 
 	@Before
@@ -253,18 +253,19 @@
 
 	private void instrument(final Class<? extends Target> clazz)
 			throws Exception {
-		reader = new ClassReader(TargetLoader.getClassData(clazz));
-		final byte[] bytes = new Instrumenter(runtime).instrument(reader);
+		bytes = TargetLoader.getClassDataAsBytes(clazz);
+		final byte[] instrumented = new Instrumenter(runtime).instrument(bytes,
+				"TestTarget");
 		final TargetLoader loader = new TargetLoader();
-		target = (Target) loader.add(clazz, bytes).newInstance();
+		target = (Target) loader.add(clazz, instrumented).newInstance();
 	}
 
-	private ICounter analyze() {
+	private ICounter analyze() throws IOException {
 		final CoverageBuilder builder = new CoverageBuilder();
 		final ExecutionDataStore store = new ExecutionDataStore();
 		data.collect(store, new SessionInfoStore(), false);
 		final Analyzer analyzer = new Analyzer(store, builder);
-		analyzer.analyzeClass(reader);
+		analyzer.analyzeClass(bytes, "TestTarget");
 		final Collection<IClassCoverage> classes = builder.getClasses();
 		assertEquals(1, classes.size(), 0.0);
 		final IClassCoverage classCoverage = classes.iterator().next();
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/EnumImplicitMethodsTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/EnumImplicitMethodsTest.java
new file mode 100644
index 0000000..643b599
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/EnumImplicitMethodsTest.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.test.validation.targets.EnumImplicitMethods;
+import org.junit.Test;
+
+/**
+ * Test of an implicit methods and static initializer in enums.
+ */
+public class EnumImplicitMethodsTest extends ValidationTestBase {
+
+    public EnumImplicitMethodsTest() {
+        super(EnumImplicitMethods.class);
+    }
+
+    @Test
+    public void testCoverageResult() {
+        assertMethodCount(5);
+
+        assertLine("classdef", ICounter.FULLY_COVERED);
+        assertLine("customValueOfMethod", ICounter.NOT_COVERED);
+        assertLine("customValuesMethod", ICounter.NOT_COVERED);
+
+        assertLine("const", ICounter.PARTLY_COVERED);
+        assertLine("staticblock", ICounter.FULLY_COVERED);
+        assertLine("super", ICounter.FULLY_COVERED);
+        assertLine("constructor", ICounter.FULLY_COVERED);
+    }
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ExceptionsTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ExceptionsTest.java
index 4008091..8fa8ee4 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ExceptionsTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ExceptionsTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,18 +24,18 @@
 		super(Target03.class);
 	}
 
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		final Object instance = targetClass.newInstance();
-		((Runnable) instance).run();
-	}
-
 	@Test
 	public void testCoverageResult() {
 
-		// 1. Implicit Exception
+		// 0. Implicit NullPointerException
 		// Currently no coverage at all, as we don't see when a block aborts
 		// somewhere in the middle.
+		assertLine("implicitNullPointerException.before", ICounter.NOT_COVERED);
+		assertLine("implicitNullPointerException.exception",
+				ICounter.NOT_COVERED);
+		assertLine("implicitNullPointerException.after", ICounter.NOT_COVERED);
+
+		// 1. Implicit Exception
 		assertLine("implicitException.before", ICounter.FULLY_COVERED);
 		assertLine("implicitException.exception", ICounter.NOT_COVERED);
 		assertLine("implicitException.after", ICounter.NOT_COVERED);
@@ -48,18 +48,27 @@
 		// 3. Try/Catch Block Without Exception Thrown
 		assertLine("noExceptionTryCatch.beforeBlock", ICounter.FULLY_COVERED);
 		assertLine("noExceptionTryCatch.tryBlock", ICounter.FULLY_COVERED);
+		assertLine("noExceptionTryCatch.catch",
+				isJDKCompiler ? ICounter.NOT_COVERED : ICounter.PARTLY_COVERED);
 		assertLine("noExceptionTryCatch.catchBlock", ICounter.NOT_COVERED);
+		assertLine("noExceptionTryCatch.catchBlockEnd",
+				isJDKCompiler ? ICounter.FULLY_COVERED : ICounter.EMPTY);
+		assertLine("noExceptionTryCatch.afterBlock", ICounter.FULLY_COVERED);
 
 		// 4. Try/Catch Block With Exception Thrown Implicitly
-		// As always with implicit exceptions we don't see when a block aborts
-		// somewhere in the middle.
 		assertLine("implicitExceptionTryCatch.beforeBlock",
 				ICounter.FULLY_COVERED);
 		assertLine("implicitExceptionTryCatch.before", ICounter.FULLY_COVERED);
 		assertLine("implicitExceptionTryCatch.exception", ICounter.NOT_COVERED);
 		assertLine("implicitExceptionTryCatch.after", ICounter.NOT_COVERED);
+		assertLine("implicitExceptionTryCatch.catch", isJDKCompiler
+				? ICounter.FULLY_COVERED : ICounter.PARTLY_COVERED);
 		assertLine("implicitExceptionTryCatch.catchBlock",
 				ICounter.FULLY_COVERED);
+		assertLine("implicitExceptionTryCatch.catchBlockEnd",
+				isJDKCompiler ? ICounter.NOT_COVERED : ICounter.EMPTY);
+		assertLine("implicitExceptionTryCatch.afterBlock",
+				ICounter.FULLY_COVERED);
 
 		// 5. Try/Catch Block With Exception Thrown Implicitly After Condition
 		// As the try/catch block is entered at one branch of the condition
@@ -76,14 +85,23 @@
 				ICounter.FULLY_COVERED);
 		assertLine("explicitExceptionTryCatch.before", ICounter.FULLY_COVERED);
 		assertLine("explicitExceptionTryCatch.throw", ICounter.FULLY_COVERED);
+		assertLine("explicitExceptionTryCatch.catch", ICounter.FULLY_COVERED);
 		assertLine("explicitExceptionTryCatch.catchBlock",
 				ICounter.FULLY_COVERED);
+		assertLine("explicitExceptionTryCatch.catchBlockEnd", ICounter.EMPTY);
+		assertLine("explicitExceptionTryCatch.afterBlock",
+				ICounter.FULLY_COVERED);
 
 		// 7. Finally Block Without Exception Thrown
 		// Finally block is yellow as the exception path is missing.
 		assertLine("noExceptionFinally.beforeBlock", ICounter.FULLY_COVERED);
 		assertLine("noExceptionFinally.tryBlock", ICounter.FULLY_COVERED);
+		assertLine("noExceptionFinally.finally",
+				isJDKCompiler ? ICounter.EMPTY : ICounter.PARTLY_COVERED);
 		assertLine("noExceptionFinally.finallyBlock", ICounter.PARTLY_COVERED);
+		assertLine("noExceptionFinally.finallyBlockEnd",
+				isJDKCompiler ? ICounter.FULLY_COVERED : ICounter.NOT_COVERED);
+		assertLine("noExceptionFinally.afterBlock", ICounter.FULLY_COVERED);
 
 		// 8. Finally Block With Implicit Exception
 		// Finally block is yellow as the non-exception path is missing.
@@ -92,16 +110,26 @@
 		assertLine("implicitExceptionFinally.before", ICounter.FULLY_COVERED);
 		assertLine("implicitExceptionFinally.exception", ICounter.NOT_COVERED);
 		assertLine("implicitExceptionFinally.after", ICounter.NOT_COVERED);
+		assertLine("implicitExceptionFinally.finally",
+				isJDKCompiler ? ICounter.EMPTY : ICounter.PARTLY_COVERED);
 		assertLine("implicitExceptionFinally.finallyBlock",
 				ICounter.PARTLY_COVERED);
+		assertLine("implicitExceptionFinally.finallyBlockEnd",
+				isJDKCompiler ? ICounter.NOT_COVERED : ICounter.FULLY_COVERED);
+		assertLine("implicitExceptionFinally.afterBlock", ICounter.NOT_COVERED);
 
 		// 9. Finally Block With Exception Thrown Explicitly
 		assertLine("explicitExceptionFinally.beforeBlock",
 				ICounter.FULLY_COVERED);
 		assertLine("explicitExceptionFinally.before", ICounter.FULLY_COVERED);
 		assertLine("explicitExceptionFinally.throw", ICounter.FULLY_COVERED);
+		assertLine("explicitExceptionFinally.finally",
+				isJDKCompiler ? ICounter.EMPTY : ICounter.FULLY_COVERED);
 		assertLine("explicitExceptionFinally.finallyBlock",
 				ICounter.FULLY_COVERED);
+		assertLine("explicitExceptionFinally.finallyBlockEnd",
+				isJDKCompiler ? ICounter.EMPTY : ICounter.FULLY_COVERED);
+		assertLine("explicitExceptionFinally.afterBlock", ICounter.EMPTY);
 
 	}
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ExplicitInitialFrameTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ExplicitInitialFrameTest.java
index 5d6e1f1..9045bee 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ExplicitInitialFrameTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ExplicitInitialFrameTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,12 +24,6 @@
 		super(Target11.class);
 	}
 
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		final Object instance = targetClass.newInstance();
-		((Runnable) instance).run();
-	}
-
 	@Test
 	public void testCoverageResult() {
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/FieldInitializationInTwoConstructorsTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/FieldInitializationInTwoConstructorsTest.java
index 2665557..67f9e83 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/FieldInitializationInTwoConstructorsTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/FieldInitializationInTwoConstructorsTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -25,11 +25,6 @@
 		super(Target09.class);
 	}
 
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		targetClass.newInstance();
-	}
-
 	@Test
 	public void testCoverageResult() {
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/FramesTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/FramesTest.java
index 7f852c6..9bea83a 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/FramesTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/FramesTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,8 +17,9 @@
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
-import org.jacoco.core.JaCoCo;
 import org.jacoco.core.instr.Instrumenter;
+import org.jacoco.core.internal.Java9Support;
+import org.jacoco.core.internal.instr.InstrSupport;
 import org.jacoco.core.runtime.IRuntime;
 import org.jacoco.core.runtime.SystemPropertiesRuntime;
 import org.jacoco.core.test.TargetLoader;
@@ -55,7 +56,7 @@
 	 */
 	private static class MaxStackEliminator extends ClassVisitor {
 		public MaxStackEliminator(ClassVisitor cv) {
-			super(JaCoCo.ASM_API_VERSION, cv);
+			super(InstrSupport.ASM_API_VERSION, cv);
 		}
 
 		@Override
@@ -63,7 +64,7 @@
 				String signature, String[] exceptions) {
 			final MethodVisitor mv = super.visitMethod(access, name, desc,
 					signature, exceptions);
-			return new MethodVisitor(JaCoCo.ASM_API_VERSION, mv) {
+			return new MethodVisitor(InstrSupport.ASM_API_VERSION, mv) {
 				@Override
 				public void visitMaxs(int maxStack, int maxLocals) {
 					super.visitMaxs(-1, maxLocals);
@@ -87,11 +88,12 @@
 	}
 
 	private byte[] calculateFrames(byte[] source) {
-		ClassReader rc = new ClassReader(source);
+		ClassReader rc = new ClassReader(
+				Java9Support.downgradeIfRequired(source));
 		ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
 
 		// Adjust Version to 1.6 to enable frames:
-		rc.accept(new ClassVisitor(JaCoCo.ASM_API_VERSION, cw) {
+		rc.accept(new ClassVisitor(InstrSupport.ASM_API_VERSION, cw) {
 
 			@Override
 			public void visit(int version, int access, String name,
@@ -106,8 +108,9 @@
 	private String dump(byte[] bytes) {
 		final StringWriter buffer = new StringWriter();
 		final PrintWriter writer = new PrintWriter(buffer);
-		new ClassReader(bytes).accept(new MaxStackEliminator(
-				new TraceClassVisitor(writer)), ClassReader.EXPAND_FRAMES);
+		new ClassReader(bytes).accept(
+				new MaxStackEliminator(new TraceClassVisitor(writer)),
+				ClassReader.EXPAND_FRAMES);
 		return buffer.toString();
 	}
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ImplicitDefaultConstructorTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ImplicitDefaultConstructorTest.java
index 7bca8b1..592623e 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ImplicitDefaultConstructorTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ImplicitDefaultConstructorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,6 +17,8 @@
 
 /**
  * Test of a implicit default constructor.
+ *
+ * @see PrivateEmptyDefaultConstructorTest
  */
 public class ImplicitDefaultConstructorTest extends ValidationTestBase {
 
@@ -24,11 +26,6 @@
 		super(Target06.class);
 	}
 
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		targetClass.newInstance();
-	}
-
 	@Test
 	public void testCoverageResult() {
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ImplicitFieldInitializationTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ImplicitFieldInitializationTest.java
index 4b0e730..b6bf91d 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ImplicitFieldInitializationTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ImplicitFieldInitializationTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,11 +24,6 @@
 		super(Target08.class);
 	}
 
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		targetClass.newInstance();
-	}
-
 	@Test
 	public void testCoverageResult() {
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/InterfaceClassInitializerTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/InterfaceClassInitializerTest.java
index 492ba0b..1f01887 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/InterfaceClassInitializerTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/InterfaceClassInitializerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/PrivateEmptyDefaultConstructorTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/PrivateEmptyDefaultConstructorTest.java
index adf3f83..ac9b927 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/PrivateEmptyDefaultConstructorTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/PrivateEmptyDefaultConstructorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,6 +17,8 @@
 
 /**
  * Test of a private empty default constructor.
+ *
+ * @see ImplicitDefaultConstructorTest
  */
 public class PrivateEmptyDefaultConstructorTest extends ValidationTestBase {
 
@@ -24,17 +26,12 @@
 		super(Target07.class);
 	}
 
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		// Force class initialization
-		targetClass.getField("CONST").get(null);
-	}
-
 	@Test
 	public void testCoverageResult() {
 
 		assertLine("classdef", ICounter.EMPTY);
-		assertLine("constructor", ICounter.NOT_COVERED);
+		assertLine("super", ICounter.EMPTY);
+		assertLine("constructor", ICounter.EMPTY);
 
 	}
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ProbesBeforeSuperConstructorTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ProbesBeforeSuperConstructorTest.java
index e29159e..95190dc 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ProbesBeforeSuperConstructorTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ProbesBeforeSuperConstructorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,11 +24,6 @@
 		super(Target10.class);
 	}
 
-	@Override
-	protected void run(final Class<?> targetClass) throws Exception {
-		targetClass.newInstance();
-	}
-
 	@Test
 	public void testCoverageResult() {
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ResizeInstructionsTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ResizeInstructionsTest.java
new file mode 100644
index 0000000..e148cf5
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ResizeInstructionsTest.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation;
+
+import static org.junit.Assert.assertTrue;
+
+import org.jacoco.core.instr.Instrumenter;
+import org.jacoco.core.runtime.IRuntime;
+import org.jacoco.core.runtime.RuntimeData;
+import org.jacoco.core.runtime.SystemPropertiesRuntime;
+import org.jacoco.core.test.TargetLoader;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+/**
+ * Test of ASM bug <a href=
+ * "http://forge.ow2.org/tracker/?func=detail&aid=317630&group_id=23&atid=100023">#317630</a>
+ * that caused {@code java.lang.ClassNotFoundException}.
+ */
+public class ResizeInstructionsTest {
+
+	private final IRuntime runtime = new SystemPropertiesRuntime();
+	private final Instrumenter instrumenter = new Instrumenter(runtime);
+
+	private boolean computedCommonSuperClass = false;
+
+	@Before
+	public void setup() throws Exception {
+		runtime.startup(new RuntimeData());
+	}
+
+	@After
+	public void teardown() {
+		runtime.shutdown();
+	}
+
+	@Test
+	public void test() throws Exception {
+		final String className = "Example";
+
+		final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES) {
+			@Override
+			protected String getCommonSuperClass(final String type1,
+					final String type2) {
+				computedCommonSuperClass |= className.equals(type1)
+						|| className.equals(type2);
+				return "java/lang/Object";
+			}
+		};
+		cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, className, null,
+				"java/lang/Object", null);
+		final MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "m", "()V",
+				null, null);
+		mv.visitCode();
+		addCauseOfResizeInstructions(mv);
+		addCauseOfGetCommonSuperClass(mv);
+		mv.visitMaxs(1, 1);
+		mv.visitEnd();
+		cw.visitEnd();
+		final byte[] original = cw.toByteArray();
+		assertTrue(computedCommonSuperClass);
+		new TargetLoader().add(className, original);
+
+		final byte[] instrumented = instrumenter.instrument(original,
+				className);
+		new TargetLoader().add(className, instrumented);
+	}
+
+	/**
+	 * Adds code that requires
+	 * {@link ClassWriter#getCommonSuperClass(String, String)}.
+	 * 
+	 * <pre>
+	 * Object o = this;
+	 * while (true) {
+	 * 	o = (Integer) null;
+	 * }
+	 * </pre>
+	 */
+	private static void addCauseOfGetCommonSuperClass(final MethodVisitor mv) {
+		mv.visitVarInsn(Opcodes.ALOAD, 0);
+		mv.visitVarInsn(Opcodes.ASTORE, 1);
+		Label label = new Label();
+		mv.visitLabel(label);
+		mv.visitInsn(Opcodes.ACONST_NULL);
+		mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Integer");
+		mv.visitVarInsn(Opcodes.ASTORE, 1);
+		mv.visitJumpInsn(Opcodes.GOTO, label);
+	}
+
+	/**
+	 * Adds code that triggers usage of
+	 * {@link org.objectweb.asm.MethodWriter#INSERTED_FRAMES} during
+	 * instrumentation.
+	 */
+	private static void addCauseOfResizeInstructions(final MethodVisitor mv) {
+		mv.visitInsn(Opcodes.ICONST_0);
+		mv.visitInsn(Opcodes.ICONST_1);
+		final Label target = new Label();
+		mv.visitJumpInsn(Opcodes.IFLE, target);
+		for (int i = 0; i < Short.MAX_VALUE; i++) {
+			mv.visitInsn(Opcodes.NOP);
+		}
+		mv.visitLabel(target);
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/Source.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/Source.java
index f28efa2..5bf4f86 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/Source.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/Source.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,6 +12,7 @@
 package org.jacoco.core.test.validation;
 
 import java.io.BufferedReader;
+import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.Reader;
@@ -31,16 +32,18 @@
 public class Source {
 
 	/**
-	 * Reads the source for the given type from the <code>./src/</code> folder
-	 * relative to the working directory.
+	 * Reads the source for the given type from the given source folder relative
+	 * to the working directory.
 	 * 
+	 * @param srcFolder
+	 *            source folder
 	 * @param type
 	 *            type to load the source file for
-	 * @throws IOException
-	 * @throws
 	 */
-	public static Source getSourceFor(final Class<?> type) throws IOException {
-		String file = "src/" + type.getName().replace('.', '/') + ".java";
+	public static Source getSourceFor(final String srcFolder,
+			final Class<?> type) throws IOException {
+		File folder = new File(srcFolder);
+		File file = new File(folder, type.getName().replace('.', '/') + ".java");
 		return new Source(new FileReader(file));
 	}
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/SourceTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/SourceTest.java
index 06b137b..a5a78e9 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/SourceTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/SourceTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -78,7 +78,7 @@
 
 	@Test
 	public void testGetSourceFor() throws IOException {
-		final Source s = Source.getSourceFor(SourceTest.class);
+		final Source s = Source.getSourceFor("src", SourceTest.class);
 		// Here we are. $line-testGetSourceFor$
 		final String l = s.getLine(s.getLineNumber("testGetSourceFor"));
 		assertTrue(l, l.contains("Here we are."));
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/StructuredLockingTest.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/StructuredLockingTest.java
index bba4c5f..9aa67a6 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/StructuredLockingTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/StructuredLockingTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,6 +20,7 @@
 import java.util.Set;
 
 import org.jacoco.core.instr.Instrumenter;
+import org.jacoco.core.internal.Java9Support;
 import org.jacoco.core.runtime.IRuntime;
 import org.jacoco.core.runtime.SystemPropertiesRuntime;
 import org.jacoco.core.test.TargetLoader;
@@ -63,7 +64,8 @@
 		byte[] instrumented = instrumenter.instrument(source, "TestTarget");
 
 		ClassNode cn = new ClassNode();
-		new ClassReader(instrumented).accept(cn, 0);
+		new ClassReader(Java9Support.downgradeIfRequired(instrumented))
+				.accept(cn, 0);
 		for (MethodNode mn : cn.methods) {
 			assertStructuredLocking(cn.name, mn);
 		}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ValidationTestBase.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ValidationTestBase.java
index e98afd2..c8693f9 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/ValidationTestBase.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/ValidationTestBase.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,25 +12,24 @@
 package org.jacoco.core.test.validation;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
-import java.util.Collection;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
 
 import org.jacoco.core.analysis.Analyzer;
 import org.jacoco.core.analysis.CoverageBuilder;
-import org.jacoco.core.analysis.IClassCoverage;
 import org.jacoco.core.analysis.ICounter;
 import org.jacoco.core.analysis.ILine;
 import org.jacoco.core.analysis.ISourceFileCoverage;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.ExecutionDataStore;
-import org.jacoco.core.data.SessionInfoStore;
-import org.jacoco.core.instr.Instrumenter;
 import org.jacoco.core.internal.analysis.CounterImpl;
-import org.jacoco.core.runtime.IRuntime;
-import org.jacoco.core.runtime.RuntimeData;
-import org.jacoco.core.runtime.SystemPropertiesRuntime;
+import org.jacoco.core.test.InstrumentingLoader;
 import org.jacoco.core.test.TargetLoader;
+import org.jacoco.core.test.validation.targets.Stubs;
 import org.junit.Before;
-import org.objectweb.asm.ClassReader;
 
 /**
  * Base class for validation tests. It executes the given class under code
@@ -38,65 +37,81 @@
  */
 public abstract class ValidationTestBase {
 
+	protected static final boolean isJDKCompiler = Compiler.DETECT.isJDK();
+
 	private static final String[] STATUS_NAME = new String[4];
 
 	{
-		STATUS_NAME[ICounter.EMPTY] = "NO_CODE";
+		STATUS_NAME[ICounter.EMPTY] = "EMPTY";
 		STATUS_NAME[ICounter.NOT_COVERED] = "NOT_COVERED";
 		STATUS_NAME[ICounter.FULLY_COVERED] = "FULLY_COVERED";
 		STATUS_NAME[ICounter.PARTLY_COVERED] = "PARTLY_COVERED";
 	}
 
-	protected final Class<?> target;
+	private final String srcFolder;
 
-	protected IClassCoverage classCoverage;
+	private final Class<?> target;
 
-	protected ISourceFileCoverage sourceCoverage;
+	private ISourceFileCoverage sourceCoverage;
 
-	protected Source source;
+	private Source source;
 
-	protected TargetLoader loader;
+	private InstrumentingLoader loader;
+
+	protected ValidationTestBase(final String srcFolder, final Class<?> target) {
+		this.srcFolder = srcFolder;
+		this.target = target;
+	}
 
 	protected ValidationTestBase(final Class<?> target) {
-		this.target = target;
+		this("src", target);
 	}
 
 	@Before
 	public void setup() throws Exception {
-		loader = new TargetLoader();
-		final ClassReader reader = new ClassReader(
-				TargetLoader.getClassData(target));
-		final ExecutionDataStore store = execute(reader);
-		analyze(reader, store);
-		source = Source.getSourceFor(target);
+		final ExecutionDataStore store = execute();
+		analyze(store);
+		source = Source.getSourceFor(srcFolder, target);
 	}
 
-	private ExecutionDataStore execute(final ClassReader reader)
-			throws Exception {
-		RuntimeData data = new RuntimeData();
-		IRuntime runtime = new SystemPropertiesRuntime();
-		runtime.startup(data);
-		final byte[] bytes = new Instrumenter(runtime).instrument(reader);
-		run(loader.add(target, bytes));
-		final ExecutionDataStore store = new ExecutionDataStore();
-		data.collect(store, new SessionInfoStore(), false);
-		runtime.shutdown();
-		return store;
+	private ExecutionDataStore execute() throws Exception {
+		loader = new InstrumentingLoader(target);
+		run(loader.loadClass(target.getName()));
+		return loader.collect();
 	}
 
-	protected abstract void run(final Class<?> targetClass) throws Exception;
+	protected void run(final Class<?> targetClass) throws Exception {
+		targetClass.getMethod("main", String[].class).invoke(null,
+				(Object) new String[0]);
+	}
 
-	private void analyze(final ClassReader reader,
-			final ExecutionDataStore store) {
+	private void analyze(final ExecutionDataStore store) throws IOException {
 		final CoverageBuilder builder = new CoverageBuilder();
 		final Analyzer analyzer = new Analyzer(store, builder);
-		analyzer.analyzeClass(reader);
-		final Collection<IClassCoverage> classes = builder.getClasses();
-		assertEquals(1, classes.size(), 0.0);
-		classCoverage = classes.iterator().next();
-		final Collection<ISourceFileCoverage> files = builder.getSourceFiles();
-		assertEquals(1, files.size(), 0.0);
-		sourceCoverage = files.iterator().next();
+		for (ExecutionData data : store.getContents()) {
+			analyze(analyzer, data);
+		}
+
+		String srcName = target.getName().replace('.', '/') + ".java";
+		for (ISourceFileCoverage file : builder.getSourceFiles()) {
+			if (srcName.equals(file.getPackageName() + "/" + file.getName())) {
+				sourceCoverage = file;
+				return;
+			}
+		}
+		fail("No source node found for " + srcName);
+	}
+
+	private void analyze(final Analyzer analyzer, final ExecutionData data)
+			throws IOException {
+		final byte[] bytes = TargetLoader.getClassDataAsBytes(
+				target.getClassLoader(), data.getName());
+		analyzer.analyzeClass(bytes, data.getName());
+	}
+
+	protected void assertMethodCount(final int expectedTotal) {
+		assertEquals(expectedTotal,
+				sourceCoverage.getMethodCounter().getTotalCount());
 	}
 
 	protected void assertLine(final String tag, final int status) {
@@ -108,8 +123,9 @@
 		assertEquals(msg, STATUS_NAME[status], STATUS_NAME[insnStatus]);
 	}
 
-	protected void assertLine(final String tag, final int missedBranches,
-			final int coveredBranches) {
+	protected void assertLine(final String tag, final int status,
+			final int missedBranches, final int coveredBranches) {
+		assertLine(tag, status);
 		final int nr = source.getLineNumber(tag);
 		final ILine line = sourceCoverage.getLine(nr);
 		final String msg = String.format("Branches in line %s: %s",
@@ -119,10 +135,10 @@
 				line.getBranchCounter());
 	}
 
-	protected void assertLine(final String tag, final int status,
-			final int missedBranches, final int coveredBranches) {
-		assertLine(tag, status);
-		assertLine(tag, missedBranches, coveredBranches);
+	protected void assertLogEvents(String... events) throws Exception {
+		final Method getter = Class.forName(Stubs.class.getName(), false,
+				loader).getMethod("getLogEvents");
+		assertEquals("Log events", Arrays.asList(events), getter.invoke(null));
 	}
 
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/AnnotationInitializer.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/AnnotationInitializer.java
new file mode 100644
index 0000000..9efae8c
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/AnnotationInitializer.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation.targets;
+
+/**
+ * This test target is an annotation with an initializer.
+ */
+public @interface AnnotationInitializer {
+
+	Object CONST = new Object(); // $line-const$
+
+	int value() default 0; // $line-value$
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/BadCycleClass.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/BadCycleClass.java
new file mode 100644
index 0000000..0044004
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/BadCycleClass.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation.targets;
+
+public class BadCycleClass {
+
+	public static class Base {
+		static final Child b = new Child();
+
+		static {
+			b.someMethod();
+		}
+	}
+
+	public static class Child extends Base {
+
+		static {
+			Stubs.logEvent("childclinit"); // $line-childclinit$
+		}
+
+		public Child() {
+			Stubs.logEvent("childinit"); // $line-childinit$
+		}
+
+		void someMethod() {
+			Stubs.logEvent("childsomeMethod"); // $line-childsomeMethod$
+		}
+
+	}
+
+	public static void main(String[] args) {
+		new Child();
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/EnumImplicitMethods.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/EnumImplicitMethods.java
new file mode 100644
index 0000000..69a2ed9
--- /dev/null
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/EnumImplicitMethods.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.test.validation.targets;
+
+public enum EnumImplicitMethods { // $line-classdef$
+
+	CONST(Stubs.f() ? new Object() : new Object()); // $line-const$
+
+	static {
+	} // $line-staticblock$
+
+	/**
+	 * Unlike in {@link Target07 regular classes}, even if enum has explicit
+	 * constructor, {@code clinit} method in any case has a reference to the
+	 * line of enum definition.
+	 */
+	EnumImplicitMethods(Object o) { // $line-super$
+	} // $line-constructor$
+
+	/**
+	 * This method should not be excluded from analysis unlike implicitly
+	 * created {@link #valueOf(String)} method that refers to the line of enum
+	 * definition in case of javac and to the first line in case of ECJ.
+	 */
+	public void valueOf() {
+	} // $line-customValueOfMethod$
+
+	/**
+	 * This method should not be excluded from analysis unlike implicitly
+	 * created {@link #values()} method that refers to the line of enum
+	 * definition in case of javac and to the first line in case of ECJ.
+	 */
+	public void values(Object o) {
+	} // $line-customValuesMethod$
+
+	public static void main(String[] args) {
+	}
+
+}
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Stubs.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Stubs.java
index 6f2e698..97b49e4 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Stubs.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Stubs.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,6 +11,9 @@
  *******************************************************************************/
 package org.jacoco.core.test.validation.targets;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Collection of stub methods that are called from the coverage targets. *
  */
@@ -117,4 +120,24 @@
 	public static void noexec(Runnable task) {
 	}
 
+	/**
+	 * List of logged events. Using a static member here works as this class is
+	 * loaded in a new class loader for every test case.
+	 */
+	private static List<String> events = new ArrayList<String>();
+
+	/**
+	 * Records a event with the given id for later verification.
+	 */
+	public static void logEvent(String id) {
+		events.add(id);
+	}
+
+	/**
+	 * Returns a list of all recorded events in the sequence of recording.
+	 */
+	public static List<String> getLogEvents() {
+		return events;
+	}
+
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target01.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target01.java
index f67f5b3..411691b 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target01.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target01.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -21,71 +21,130 @@
 /**
  * This target exercises a set of common Java control structures.
  */
-public class Target01 implements Runnable {
+public class Target01 {
 
-	public void run() {
+	public static void main(String[] args) {
 
-		// 1. Unconditional execution
+		unconditionalExecution();
+		missedIfBlock();
+		executedIfBlock();
+		missedWhileBlock();
+		alwaysExecutedWhileBlock();
+		executedWhileBlock();
+		executedDoWhileBlock();
+		missedForBlock();
+		executedForBlock();
+		missedForEachBlock();
+		executedForEachBlock();
+		tableSwitchWithHit();
+		continuedTableSwitchWithHit();
+		tableSwitchWithoutHit();
+		lookupSwitchWithHit();
+		continuedLookupSwitchWithHit();
+		lookupSwitchWithoutHit();
+		breakStatement();
+		continueStatement();
+		conditionalReturn();
+		implicitReturn();
+		explicitReturn();
+
+	}
+
+	private static void unconditionalExecution() {
+
 		nop(); // $line-unconditional$
 
-		// 2. Missed if block
+	}
+
+	private static void missedIfBlock() {
+
 		if (f()) { // $line-iffalse$
 			nop(); // $line-missedif$
 		} else {
 			nop(); // $line-executedelse$
 		}
 
-		// 3. Executed if block
+	}
+
+	private static void executedIfBlock() {
+
 		if (t()) { // $line-iftrue$
 			nop(); // $line-executedif$
 		} else {
 			nop(); // $line-missedelse$
 		}
 
-		// 4. Missed while block
+	}
+
+	private static void missedWhileBlock() {
+
 		while (f()) { // $line-whilefalse$
 			nop(); // $line-missedwhile$
 		}
 
-		// 5. Always executed while block
+	}
+
+	private static void alwaysExecutedWhileBlock() {
+
 		while (t()) { // $line-whiletrue$
 			if (t()) {
 				break;
 			}
 		}
 
-		// 6. Executed while block
+	}
+
+	private static void executedWhileBlock() {
+
 		int i = 0;
 		while (i++ < 3) { // $line-whiletruefalse$
 			nop(); // $line-executedwhile$
 		}
 
-		// 7. Executed do while block
+	}
+
+	private static void executedDoWhileBlock() {
+
 		do {
 			nop(); // $line-executeddowhile$
-		} while (f());
+		} while (f()); // $line-executeddowhilefalse$
 
-		// 8. Missed for block
+	}
+
+	private static void missedForBlock() {
+
 		for (nop(); f(); nop()) { // $line-missedforincrementer$
 			nop(); // $line-missedfor$
 		}
 
-		// 9. Executed for block
+	}
+
+	private static void executedForBlock() {
+
 		for (int j = 0; j < 1; j++) { // $line-executedforincrementer$
 			nop(); // $line-executedfor$
 		}
 
-		// 10. Missed for each block
+	}
+
+	private static void missedForEachBlock() {
+
 		for (Object o : Collections.emptyList()) { // $line-missedforeachincrementer$
 			nop(o); // $line-missedforeach$
 		}
 
-		// 11. Executed for each block
+	}
+
+	private static void executedForEachBlock() {
+
 		for (Object o : Collections.singleton(new Object())) { // $line-executedforeachincrementer$
 			nop(o); // $line-executedforeach$
 		}
 
-		// 12. Table switch with hit
+	}
+
+	private static void tableSwitchWithHit() {
+
 		switch (i2()) { // $line-tswitch1$
 		case 1:
 			nop(); // $line-tswitch1case1$
@@ -101,7 +160,10 @@
 			break;
 		}
 
-		// 13. Continued table switch with hit
+	}
+
+	private static void continuedTableSwitchWithHit() {
+
 		switch (i2()) { // $line-tswitch2$
 		case 1:
 			nop(); // $line-tswitch2case1$
@@ -113,7 +175,10 @@
 			nop(); // $line-tswitch2default$
 		}
 
-		// 14. Table switch without hit
+	}
+
+	private static void tableSwitchWithoutHit() {
+
 		switch (i2()) { // $line-tswitch3$
 		case 3:
 			nop(); // $line-tswitch3case1$
@@ -129,7 +194,10 @@
 			break;
 		}
 
-		// 15. Lookup switch with hit
+	}
+
+	private static void lookupSwitchWithHit() {
+
 		switch (i2()) { // $line-lswitch1$
 		case -123:
 			nop(); // $line-lswitch1case1$
@@ -145,7 +213,10 @@
 			break;
 		}
 
-		// 16. Continued lookup switch with hit
+	}
+
+	private static void continuedLookupSwitchWithHit() {
+
 		switch (i2()) { // $line-lswitch2$
 		case -123:
 			nop(); // $line-lswitch2case1$
@@ -157,7 +228,10 @@
 			nop(); // $line-lswitch2default$
 		}
 
-		// 17. Lookup switch without hit
+	}
+
+	private static void lookupSwitchWithoutHit() {
+
 		switch (i2()) { // $line-lswitch3$
 		case -123:
 			nop(); // $line-lswitch3case1$
@@ -173,7 +247,10 @@
 			break;
 		}
 
-		// 18. Break statement
+	}
+
+	private static void breakStatement() {
+
 		while (true) {
 			if (t()) {
 				break; // $line-executedbreak$
@@ -181,7 +258,10 @@
 			nop(); // $line-missedafterbreak$
 		}
 
-		// 19. Continue statement
+	}
+
+	private static void continueStatement() {
+
 		for (int j = 0; j < 1; j++) {
 			if (t()) {
 				continue; // $line-executedcontinue$
@@ -189,28 +269,25 @@
 			nop(); // $line-missedaftercontinue$
 		}
 
-		runReturn();
-		runImplicitReturn();
-
 	}
 
-	private void runReturn() {
+	private static void conditionalReturn() {
 
-		// 20. Return statement
 		if (t()) {
-			return; // $line-return$
+			return; // $line-conditionalreturn$
 		}
-		nop(); // $line-afterreturn$
+		nop(); // $line-afterconditionalreturn$
 
 	}
 
-	private void runImplicitReturn() {
+	private static void implicitReturn() {
 
-		// 21. Implicit return
 	} // $line-implicitreturn$
 
-	public static void main(String[] args) {
-		new Target01().run();
-	}
+	private static void explicitReturn() {
+
+		return; // $line-explicitreturn$
+
+	} // $line-afterexplicitreturn$
 
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target02.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target02.java
index 7a6b788..e8ca4da 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target02.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target02.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,9 +20,9 @@
 /**
  * This target exercises boolean expressions.
  */
-public class Target02 implements Runnable {
+public class Target02 {
 
-	public void run() {
+	public static void main(String[] args) {
 
 		// 1. Boolean comparison result (one case)
 		nop(i2() > 3); // $line-booleancmp1$
@@ -117,8 +117,4 @@
 
 	}
 
-	public static void main(String[] args) {
-		new Target02().run();
-	}
-
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target03.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target03.java
index 41dfbe0..195d1f3 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target03.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target03.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,9 +20,14 @@
 /**
  * This target produces exception based control flow examples.
  */
-public class Target03 implements Runnable {
+public class Target03 {
 
-	public void run() {
+	public static void main(String[] args) {
+
+		try {
+			implicitNullPointerException(null);
+		} catch (NullPointerException e) {
+		}
 		try {
 			implicitException();
 		} catch (StubException e) {
@@ -46,27 +51,33 @@
 		}
 	}
 
-	private void implicitException() {
+	private static void implicitNullPointerException(int[] a) {
+		nop(); // $line-implicitNullPointerException.before$
+		a[0] = 0; // $line-implicitNullPointerException.exception$
+		nop(); // $line-implicitNullPointerException.after$
+	}
+
+	private static void implicitException() {
 		nop(); // $line-implicitException.before$
 		ex(); // $line-implicitException.exception$
 		nop(); // $line-implicitException.after$
 	}
 
-	private void explicitException() {
+	private static void explicitException() {
 		nop(); // $line-explicitException.before$
 		throw new StubException(); // $line-explicitException.throw$
 	}
 
-	private void noExceptionTryCatch() {
+	private static void noExceptionTryCatch() {
 		nop(); // $line-noExceptionTryCatch.beforeBlock$
 		try {
 			nop(); // $line-noExceptionTryCatch.tryBlock$
 		} catch (StubException e) { // $line-noExceptionTryCatch.catch$
 			nop(); // $line-noExceptionTryCatch.catchBlock$
-		}
-	}
+		} // $line-noExceptionTryCatch.catchBlockEnd$
+	} // $line-noExceptionTryCatch.afterBlock$
 
-	private void implicitExceptionTryCatch() {
+	private static void implicitExceptionTryCatch() {
 		nop(); // $line-implicitExceptionTryCatch.beforeBlock$
 		try {
 			nop(); // $line-implicitExceptionTryCatch.before$
@@ -74,10 +85,10 @@
 			nop(); // $line-implicitExceptionTryCatch.after$
 		} catch (StubException e) { // $line-implicitExceptionTryCatch.catch$
 			nop(); // $line-implicitExceptionTryCatch.catchBlock$
-		}
-	}
+		} // $line-implicitExceptionTryCatch.catchBlockEnd$
+	} // $line-implicitExceptionTryCatch.afterBlock$
 
-	private void implicitExceptionTryCatchAfterCondition() {
+	private static void implicitExceptionTryCatchAfterCondition() {
 		if (f()) { // $line-implicitExceptionTryCatchAfterCondition.condition$
 			return;
 		}
@@ -88,26 +99,26 @@
 		}
 	}
 
-	private void explicitExceptionTryCatch() {
+	private static void explicitExceptionTryCatch() {
 		nop(); // $line-explicitExceptionTryCatch.beforeBlock$
 		try {
 			nop(); // $line-explicitExceptionTryCatch.before$
 			throw new StubException(); // $line-explicitExceptionTryCatch.throw$
 		} catch (StubException e) { // $line-explicitExceptionTryCatch.catch$
 			nop(); // $line-explicitExceptionTryCatch.catchBlock$
-		}
-	}
+		} // $line-explicitExceptionTryCatch.catchBlockEnd$
+	} // $line-explicitExceptionTryCatch.afterBlock$
 
-	private void noExceptionFinally() {
+	private static void noExceptionFinally() {
 		nop(); // $line-noExceptionFinally.beforeBlock$
 		try {
 			nop(); // $line-noExceptionFinally.tryBlock$
-		} finally { // $line-noExceptionFinallyFinally$
+		} finally { // $line-noExceptionFinally.finally$
 			nop(); // $line-noExceptionFinally.finallyBlock$
-		}
-	}
+		} // $line-noExceptionFinally.finallyBlockEnd$
+	} // $line-noExceptionFinally.afterBlock$
 
-	private void implicitExceptionFinally() {
+	private static void implicitExceptionFinally() {
 		nop(); // $line-implicitExceptionFinally.beforeBlock$
 		try {
 			nop(); // $line-implicitExceptionFinally.before$
@@ -115,21 +126,17 @@
 			nop(); // $line-implicitExceptionFinally.after$
 		} finally { // $line-implicitExceptionFinally.finally$
 			nop(); // $line-implicitExceptionFinally.finallyBlock$
-		}
-	}
+		} // $line-implicitExceptionFinally.finallyBlockEnd$
+	} // $line-implicitExceptionFinally.afterBlock$
 
-	private void explicitExceptionFinally() {
+	private static void explicitExceptionFinally() {
 		nop(); // $line-explicitExceptionFinally.beforeBlock$
 		try {
 			nop(); // $line-explicitExceptionFinally.before$
 			throw new StubException(); // $line-explicitExceptionFinally.throw$
 		} finally { // $line-explicitExceptionFinally.finally$
 			nop(); // $line-explicitExceptionFinally.finallyBlock$
-		}
-	}
-
-	public static void main(String[] args) {
-		new Target03().run();
-	}
+		} // $line-explicitExceptionFinally.finallyBlockEnd$
+	} // $line-explicitExceptionFinally.afterBlock$
 
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target04.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target04.java
index aeae65b..d64d25d 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target04.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target04.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target05.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target05.java
index 8d7aa88..fc06538 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target05.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target05.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,7 +16,7 @@
 /**
  * This test target is a class with a static initializer.
  */
-public class Target05 { // $line-classdef$
+public class Target05 {
 
 	// No code required to initialize these fields:
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target06.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target06.java
index 924b0bd..64a283b 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target06.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target06.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,6 +13,8 @@
 
 /**
  * This test target is a class with a implicit default constructor.
+ *
+ * @see Target07 explicit constructor
  */
 public class Target06 { // $line-classdef$
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target07.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target07.java
index 5780fc1..96a7c58 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target07.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target07.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,14 +13,14 @@
 
 /**
  * This test target is a private empty default constructor.
+ *
+ * @see Target06 implicit constructor
  */
 public class Target07 { // $line-classdef$
 
-	private Target07() {
+	private Target07() { // $line-super$
 	} // $line-constructor$
 
-	public static final int CONST = 42;
-
 	public static void main(String[] args) {
 	}
 
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target08.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target08.java
index 1a63ed5..bdece3f 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target08.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target08.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target09.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target09.java
index 536ea2c..444d89d 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target09.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target09.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target10.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target10.java
index e8d25b7..d07981e 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target10.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target10.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target11.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target11.java
index 02a7a18..b03d952 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target11.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target11.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,16 +18,14 @@
  * This test target needs an explicit initial frame as the first instruction
  * already is a jump target.
  */
-public class Target11 implements Runnable {
+public class Target11 {
 
-	public void run() {
+	public static void main(String[] args) {
+
 		do {
 			nop(); // $line-dowhilebody$
 		} while (f());
-	}
 
-	public static void main(String[] args) {
-		new Target11().run();
 	}
 
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target12.java b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target12.java
index 29c5ef5..5c7bc57 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target12.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/test/validation/targets/Target12.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,20 +16,16 @@
 /**
  * This target uses synchronized blocks which compile to try/catch statements.
  */
-public class Target12 implements Runnable {
+public class Target12 {
 
-	public void run() {
-		simple();
-		nested();
-	}
-
-	void simple() {
-		synchronized (this) {
+	static void simple() {
+		Object lock1 = new Object();
+		synchronized (lock1) {
 			nop();
 		}
 	}
 
-	void nested() {
+	static void nested() {
 		Object lock1 = new Object();
 		synchronized (lock1) {
 			nop();
@@ -43,7 +39,8 @@
 	}
 
 	public static void main(String[] args) {
-		new Target12().run();
+		simple();
+		nested();
 	}
 
 }
diff --git a/org.jacoco.core.test/src/org/jacoco/core/tools/ExecDumpClientTest.java b/org.jacoco.core.test/src/org/jacoco/core/tools/ExecDumpClientTest.java
index 8d483d8..3fe1688 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/tools/ExecDumpClientTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/tools/ExecDumpClientTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core.test/src/org/jacoco/core/tools/ExecFileLoaderTest.java b/org.jacoco.core.test/src/org/jacoco/core/tools/ExecFileLoaderTest.java
index 0cddd8e..dc2d44e 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/tools/ExecFileLoaderTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/tools/ExecFileLoaderTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -28,7 +28,6 @@
 import org.jacoco.core.data.ExecutionDataWriter;
 import org.jacoco.core.data.SessionInfo;
 import org.jacoco.core.data.SessionInfoStore;
-import org.jacoco.core.tools.ExecFileLoader;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -119,7 +118,8 @@
 		final FileOutputStream out = new FileOutputStream(file);
 		final ExecutionDataWriter writer = new ExecutionDataWriter(out);
 		final int value = id.length();
-		writer.visitClassExecution(new ExecutionData(value, id, new boolean[0]));
+		writer.visitClassExecution(new ExecutionData(value, id,
+				new boolean[] { true }));
 		writer.visitSessionInfo(new SessionInfo(id, value, value));
 		out.close();
 		return file;
diff --git a/org.jacoco.core/.gitignore b/org.jacoco.core/.gitignore
deleted file mode 100644
index 4dc0091..0000000
--- a/org.jacoco.core/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/target
-/bin
diff --git a/org.jacoco.core/META-INF/MANIFEST.MF b/org.jacoco.core/META-INF/MANIFEST.MF
deleted file mode 100644
index ff1a56c..0000000
--- a/org.jacoco.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0

-Bundle-ManifestVersion: 2

-Bundle-Name: JaCoCo Core

-Bundle-SymbolicName: org.jacoco.core

-Bundle-Version: 0.7.5.201505241946

-Bundle-Vendor: Mountainminds GmbH & Co. KG

-Bundle-RequiredExecutionEnvironment: J2SE-1.5

-Export-Package: org.jacoco.core;version="0.7.5",

- org.jacoco.core.analysis;version="0.7.5",

- org.jacoco.core.data;version="0.7.5",

- org.jacoco.core.instr;version="0.7.5",

- org.jacoco.core.internal.analysis;version="0.7.5";x-internal=true,

- org.jacoco.core.runtime;version="0.7.5",

- org.jacoco.core.tools;version="0.7.5"

-Import-Package: org.objectweb.asm;version="[5.0.1,5.1.0)",

- org.objectweb.asm.tree;version="[5.0.1,5.1.0)",

- org.objectweb.asm.commons;version="[5.0.1,5.1.0)"

diff --git a/org.jacoco.core/build.properties b/org.jacoco.core/build.properties
deleted file mode 100644
index a657887..0000000
--- a/org.jacoco.core/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/

-output.. = bin/

-bin.includes = META-INF/,\

-               .,\

-               about.html

diff --git a/org.jacoco.core/pom.xml b/org.jacoco.core/pom.xml
index f9bcd7b..2f8f94c 100644
--- a/org.jacoco.core/pom.xml
+++ b/org.jacoco.core/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.build</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.build</relativePath>
   </parent>
 
@@ -33,5 +33,29 @@
 
   <build>
     <sourceDirectory>src</sourceDirectory>
+
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>manifest</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+    </plugins>
   </build>
 </project>
diff --git a/org.jacoco.core/src/org/jacoco/core/JaCoCo.java b/org.jacoco.core/src/org/jacoco/core/JaCoCo.java
index d6b4d5d..0887bc9 100644
--- a/org.jacoco.core/src/org/jacoco/core/JaCoCo.java
+++ b/org.jacoco.core/src/org/jacoco/core/JaCoCo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,8 +13,6 @@
 
 import java.util.ResourceBundle;
 
-import org.objectweb.asm.Opcodes;
-
 /**
  * Static Meta information about JaCoCo.
  */
@@ -29,9 +27,6 @@
 	/** Name of the runtime package of this build */
 	public static final String RUNTIMEPACKAGE;
 
-	/** ASM API version */
-	public static final int ASM_API_VERSION = Opcodes.ASM5;
-
 	static {
 		final ResourceBundle bundle = ResourceBundle
 				.getBundle("org.jacoco.core.jacoco");
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java b/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
index 623a1b6..e5a06a4 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -23,8 +23,10 @@
 import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.ExecutionDataStore;
 import org.jacoco.core.internal.ContentTypeDetector;
+import org.jacoco.core.internal.Java9Support;
 import org.jacoco.core.internal.Pack200Streams;
 import org.jacoco.core.internal.analysis.ClassAnalyzer;
+import org.jacoco.core.internal.analysis.ClassCoverageImpl;
 import org.jacoco.core.internal.analysis.StringPool;
 import org.jacoco.core.internal.data.CRC64;
 import org.jacoco.core.internal.flow.ClassProbesAdapter;
@@ -84,12 +86,14 @@
 			probes = data.getProbes();
 			noMatch = false;
 		}
-		final ClassAnalyzer analyzer = new ClassAnalyzer(classid, noMatch,
-				probes, stringPool) {
+		final ClassCoverageImpl coverage = new ClassCoverageImpl(className,
+				classid, noMatch);
+		final ClassAnalyzer analyzer = new ClassAnalyzer(coverage, probes,
+				stringPool) {
 			@Override
 			public void visitEnd() {
 				super.visitEnd();
-				coverageVisitor.visitCoverage(getCoverage());
+				coverageVisitor.visitCoverage(coverage);
 			}
 		};
 		return new ClassProbesAdapter(analyzer, false);
@@ -112,17 +116,18 @@
 	 * 
 	 * @param buffer
 	 *            class definitions
-	 * @param name
-	 *            a name used for exception messages
+	 * @param location
+	 *            a location description used for exception messages
 	 * @throws IOException
 	 *             if the class can't be analyzed
 	 */
-	public void analyzeClass(final byte[] buffer, final String name)
+	public void analyzeClass(final byte[] buffer, final String location)
 			throws IOException {
 		try {
-			analyzeClass(new ClassReader(buffer));
+			analyzeClass(
+					new ClassReader(Java9Support.downgradeIfRequired(buffer)));
 		} catch (final RuntimeException cause) {
-			throw analyzerError(name, cause);
+			throw analyzerError(location, cause);
 		}
 	}
 
@@ -131,24 +136,24 @@
 	 * 
 	 * @param input
 	 *            stream to read class definition from
-	 * @param name
-	 *            a name used for exception messages
+	 * @param location
+	 *            a location description used for exception messages
 	 * @throws IOException
 	 *             if the stream can't be read or the class can't be analyzed
 	 */
-	public void analyzeClass(final InputStream input, final String name)
+	public void analyzeClass(final InputStream input, final String location)
 			throws IOException {
 		try {
-			analyzeClass(new ClassReader(input));
+			analyzeClass(Java9Support.readFully(input), location);
 		} catch (final RuntimeException e) {
-			throw analyzerError(name, e);
+			throw analyzerError(location, e);
 		}
 	}
 
-	private IOException analyzerError(final String name,
-			final RuntimeException cause) {
+	private IOException analyzerError(final String location,
+			final Exception cause) {
 		final IOException ex = new IOException(String.format(
-				"Error while analyzing class %s.", name));
+				"Error while analyzing %s.", location));
 		ex.initCause(cause);
 		return ex;
 	}
@@ -161,25 +166,30 @@
 	 * 
 	 * @param input
 	 *            input data
-	 * @param name
-	 *            a name used for exception messages
+	 * @param location
+	 *            a location description used for exception messages
 	 * @return number of class files found
 	 * @throws IOException
 	 *             if the stream can't be read or a class can't be analyzed
 	 */
-	public int analyzeAll(final InputStream input, final String name)
+	public int analyzeAll(final InputStream input, final String location)
 			throws IOException {
-		final ContentTypeDetector detector = new ContentTypeDetector(input);
+		final ContentTypeDetector detector;
+		try {
+			detector = new ContentTypeDetector(input);
+		} catch (IOException e) {
+			throw analyzerError(location, e);
+		}
 		switch (detector.getType()) {
 		case ContentTypeDetector.CLASSFILE:
-			analyzeClass(detector.getInputStream(), name);
+			analyzeClass(detector.getInputStream(), location);
 			return 1;
 		case ContentTypeDetector.ZIPFILE:
-			return analyzeZip(detector.getInputStream(), name);
+			return analyzeZip(detector.getInputStream(), location);
 		case ContentTypeDetector.GZFILE:
-			return analyzeGzip(detector.getInputStream(), name);
+			return analyzeGzip(detector.getInputStream(), location);
 		case ContentTypeDetector.PACK200FILE:
-			return analyzePack200(detector.getInputStream(), name);
+			return analyzePack200(detector.getInputStream(), location);
 		default:
 			return 0;
 		}
@@ -230,32 +240,54 @@
 	public int analyzeAll(final String path, final File basedir)
 			throws IOException {
 		int count = 0;
-		final StringTokenizer st = new StringTokenizer(path, File.pathSeparator);
+		final StringTokenizer st = new StringTokenizer(path,
+				File.pathSeparator);
 		while (st.hasMoreTokens()) {
 			count += analyzeAll(new File(basedir, st.nextToken()));
 		}
 		return count;
 	}
 
-	private int analyzeZip(final InputStream input, final String name)
+	private int analyzeZip(final InputStream input, final String location)
 			throws IOException {
 		final ZipInputStream zip = new ZipInputStream(input);
 		ZipEntry entry;
 		int count = 0;
-		while ((entry = zip.getNextEntry()) != null) {
-			count += analyzeAll(zip, name + "@" + entry.getName());
+		while ((entry = nextEntry(zip, location)) != null) {
+			count += analyzeAll(zip, location + "@" + entry.getName());
 		}
 		return count;
 	}
 
-	private int analyzeGzip(final InputStream input, final String name)
+	private ZipEntry nextEntry(ZipInputStream input, String location)
 			throws IOException {
-		return analyzeAll(new GZIPInputStream(input), name);
+		try {
+			return input.getNextEntry();
+		} catch (IOException e) {
+			throw analyzerError(location, e);
+		}
 	}
 
-	private int analyzePack200(final InputStream input, final String name)
+	private int analyzeGzip(final InputStream input, final String location)
 			throws IOException {
-		return analyzeAll(Pack200Streams.unpack(input), name);
+		GZIPInputStream gzipInputStream;
+		try {
+			gzipInputStream = new GZIPInputStream(input);
+		} catch (IOException e) {
+			throw analyzerError(location, e);
+		}
+		return analyzeAll(gzipInputStream, location);
+	}
+
+	private int analyzePack200(final InputStream input, final String location)
+			throws IOException {
+		InputStream unpackedInput;
+		try {
+			unpackedInput = Pack200Streams.unpack(input);
+		} catch (IOException e) {
+			throw analyzerError(location, e);
+		}
+		return analyzeAll(unpackedInput, location);
 	}
 
 }
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/CounterComparator.java b/org.jacoco.core/src/org/jacoco/core/analysis/CounterComparator.java
index d2f02df..ee425d7 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/CounterComparator.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/CounterComparator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/CoverageBuilder.java b/org.jacoco.core/src/org/jacoco/core/analysis/CoverageBuilder.java
index 723cf7b..a5e7d0d 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/CoverageBuilder.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/CoverageBuilder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -102,15 +102,19 @@
 		if (coverage.getInstructionCounter().getTotalCount() > 0) {
 			final String name = coverage.getName();
 			final IClassCoverage dup = classes.put(name, coverage);
-			if (dup != null && dup.getId() != coverage.getId()) {
-				throw new IllegalStateException(
-						"Can't add different class with same name: " + name);
-			}
-			final String source = coverage.getSourceFileName();
-			if (source != null) {
-				final SourceFileCoverageImpl sourceFile = getSourceFile(source,
-						coverage.getPackageName());
-				sourceFile.increment(coverage);
+			if (dup != null) {
+				if (dup.getId() != coverage.getId()) {
+					throw new IllegalStateException(
+							"Can't add different class with same name: "
+									+ name);
+				}
+			} else {
+				final String source = coverage.getSourceFileName();
+				if (source != null) {
+					final SourceFileCoverageImpl sourceFile = getSourceFile(
+							source, coverage.getPackageName());
+					sourceFile.increment(coverage);
+				}
 			}
 		}
 	}
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/CoverageNodeImpl.java b/org.jacoco.core/src/org/jacoco/core/analysis/CoverageNodeImpl.java
index e8e352f..1b19336 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/CoverageNodeImpl.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/CoverageNodeImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/IBundleCoverage.java b/org.jacoco.core/src/org/jacoco/core/analysis/IBundleCoverage.java
index d77b807..db797bd 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/IBundleCoverage.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/IBundleCoverage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/IClassCoverage.java b/org.jacoco.core/src/org/jacoco/core/analysis/IClassCoverage.java
index 1469394..12913d8 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/IClassCoverage.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/IClassCoverage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -55,7 +55,7 @@
 	public String getSuperName();
 
 	/**
-	 * Returns the VM names of implemented/extended interfaces
+	 * Returns the VM names of implemented/extended interfaces.
 	 * 
 	 * @return VM names of implemented/extended interfaces
 	 */
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/ICounter.java b/org.jacoco.core/src/org/jacoco/core/analysis/ICounter.java
index d4ed462..65ed001 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/ICounter.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/ICounter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/ICoverageNode.java b/org.jacoco.core/src/org/jacoco/core/analysis/ICoverageNode.java
index 7ece8e4..0d1aba3 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/ICoverageNode.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/ICoverageNode.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/ICoverageVisitor.java b/org.jacoco.core/src/org/jacoco/core/analysis/ICoverageVisitor.java
index eaa7909..71a3161 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/ICoverageVisitor.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/ICoverageVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/ILine.java b/org.jacoco.core/src/org/jacoco/core/analysis/ILine.java
index 908bcd6..c54ecff 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/ILine.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/ILine.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/IMethodCoverage.java b/org.jacoco.core/src/org/jacoco/core/analysis/IMethodCoverage.java
index 1752b3b..693c33c 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/IMethodCoverage.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/IMethodCoverage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/IPackageCoverage.java b/org.jacoco.core/src/org/jacoco/core/analysis/IPackageCoverage.java
index 2a00d13..77ce407 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/IPackageCoverage.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/IPackageCoverage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/ISourceFileCoverage.java b/org.jacoco.core/src/org/jacoco/core/analysis/ISourceFileCoverage.java
index c79a9f0..dd01265 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/ISourceFileCoverage.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/ISourceFileCoverage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/ISourceNode.java b/org.jacoco.core/src/org/jacoco/core/analysis/ISourceNode.java
index a3274ce..ad5cb7c 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/ISourceNode.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/ISourceNode.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/NodeComparator.java b/org.jacoco.core/src/org/jacoco/core/analysis/NodeComparator.java
index 9804ac0..e1b3716 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/NodeComparator.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/NodeComparator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/package-info.java b/org.jacoco.core/src/org/jacoco/core/analysis/package-info.java
index 092efc4..0f6a3a5 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/package-info.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java b/org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java
index e2a49ce..3f098b1 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -99,6 +99,20 @@
 	}
 
 	/**
+	 * Checks whether any probe has been hit.
+	 * 
+	 * @return <code>true</code>, if at least one probe has been hit
+	 */
+	public boolean hasHits() {
+		for (final boolean p : probes) {
+			if (p) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
 	 * Merges the given execution data into the probe data of this object. I.e.
 	 * a probe entry in this object is marked as executed (<code>true</code>) if
 	 * this probe or the corresponding other probe was executed. So the result
@@ -189,4 +203,5 @@
 		return String.format("ExecutionData[name=%s, id=%016x]", name,
 				Long.valueOf(id));
 	}
+
 }
diff --git a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataReader.java b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataReader.java
index 0a8aa41..c6fc7a8 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataReader.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataReader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,7 +13,6 @@
 
 import static java.lang.String.format;
 
-import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
 
@@ -74,21 +73,24 @@
 	 *         stream has been reached.
 	 * @throws IOException
 	 *             might be thrown by the underlying input stream
+	 * @throws IncompatibleExecDataVersionException
+	 *             incompatible data version from different JaCoCo release
 	 */
-	public boolean read() throws IOException {
-		try {
-			byte type;
-			do {
-				type = in.readByte();
-				if (firstBlock && type != ExecutionDataWriter.BLOCK_HEADER) {
-					throw new IOException("Invalid execution data file.");
-				}
-				firstBlock = false;
-			} while (readBlock(type));
-			return true;
-		} catch (final EOFException e) {
-			return false;
-		}
+	public boolean read() throws IOException,
+			IncompatibleExecDataVersionException {
+		byte type;
+		do {
+			int i = in.read();
+			if (i == -1) {
+				return false; // EOF
+			}
+			type = (byte) i;
+			if (firstBlock && type != ExecutionDataWriter.BLOCK_HEADER) {
+				throw new IOException("Invalid execution data file.");
+			}
+			firstBlock = false;
+		} while (readBlock(type));
+		return true;
 	}
 
 	/**
@@ -124,8 +126,7 @@
 		}
 		final char version = in.readChar();
 		if (version != ExecutionDataWriter.FORMAT_VERSION) {
-			throw new IOException(format("Incompatible version %x.",
-					Integer.valueOf(version)));
+			throw new IncompatibleExecDataVersionException(version);
 		}
 	}
 
diff --git a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
index d48ce3b..759fe3b 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,6 +11,7 @@
  *******************************************************************************/
 package org.jacoco.core.data;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -154,7 +155,7 @@
 	 * @return current contents
 	 */
 	public Collection<ExecutionData> getContents() {
-		return entries.values();
+		return new ArrayList<ExecutionData>(entries.values());
 	}
 
 	/**
@@ -164,7 +165,7 @@
 	 *            interface to write content to
 	 */
 	public void accept(final IExecutionDataVisitor visitor) {
-		for (final ExecutionData data : entries.values()) {
+		for (final ExecutionData data : getContents()) {
 			visitor.visitClassExecution(data);
 		}
 	}
diff --git a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java
index 1095d95..51b9d1a 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,7 +24,12 @@
 		IExecutionDataVisitor {
 
 	/** File format version, will be incremented for each incompatible change. */
-	public static final char FORMAT_VERSION = 0x1007;
+	public static final char FORMAT_VERSION;
+
+	static {
+		// Runtime initialize to ensure javac does not inline the value.
+		FORMAT_VERSION = 0x1007;
+	}
 
 	/** Magic number in header for file format identification. */
 	public static final char MAGIC_NUMBER = 0xC0C0;
@@ -90,13 +95,15 @@
 	}
 
 	public void visitClassExecution(final ExecutionData data) {
-		try {
-			out.writeByte(BLOCK_EXECUTIONDATA);
-			out.writeLong(data.getId());
-			out.writeUTF(data.getName());
-			out.writeBooleanArray(data.getProbes());
-		} catch (final IOException e) {
-			throw new RuntimeException(e);
+		if (data.hasHits()) {
+			try {
+				out.writeByte(BLOCK_EXECUTIONDATA);
+				out.writeLong(data.getId());
+				out.writeUTF(data.getName());
+				out.writeBooleanArray(data.getProbes());
+			} catch (final IOException e) {
+				throw new RuntimeException(e);
+			}
 		}
 	}
 
diff --git a/org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java b/org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java
index 3457486..91581f6 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/data/ISessionInfoVisitor.java b/org.jacoco.core/src/org/jacoco/core/data/ISessionInfoVisitor.java
index f04eac2..ca812c3 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ISessionInfoVisitor.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ISessionInfoVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/data/IncompatibleExecDataVersionException.java b/org.jacoco.core/src/org/jacoco/core/data/IncompatibleExecDataVersionException.java
new file mode 100644
index 0000000..4ca373d
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/data/IncompatibleExecDataVersionException.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann, somechris - initial API and implementation
+ *    
+ *******************************************************************************/
+package org.jacoco.core.data;
+
+import java.io.IOException;
+
+/**
+ * Signals that execution data in an incompatible version was tried to read.
+ */
+public class IncompatibleExecDataVersionException extends IOException {
+
+	private static final long serialVersionUID = 1L;
+
+	private final int actualVersion;
+
+	/**
+	 * Creates a new exception to flag version mismatches in execution data.
+	 * 
+	 * @param actualVersion
+	 *            version found in the exec data
+	 */
+	public IncompatibleExecDataVersionException(final int actualVersion) {
+		super(String.format("Cannot read execution data version 0x%x. "
+				+ "This version of JaCoCo uses execution data version 0x%x.",
+				Integer.valueOf(actualVersion),
+				Integer.valueOf(ExecutionDataWriter.FORMAT_VERSION)));
+		this.actualVersion = actualVersion;
+	}
+
+	/**
+	 * Gets the version expected in the execution data which can be read by this
+	 * version of JaCoCo.
+	 * 
+	 * @return expected version in execution data
+	 */
+	public int getExpectedVersion() {
+		return ExecutionDataWriter.FORMAT_VERSION;
+	}
+
+	/**
+	 * Gets the actual version found in the execution data.
+	 * 
+	 * @return actual version in execution data
+	 */
+	public int getActualVersion() {
+		return actualVersion;
+	}
+
+}
\ No newline at end of file
diff --git a/org.jacoco.core/src/org/jacoco/core/data/SessionInfo.java b/org.jacoco.core/src/org/jacoco/core/data/SessionInfo.java
index 705c812..3a1c71d 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/SessionInfo.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/SessionInfo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/data/SessionInfoStore.java b/org.jacoco.core/src/org/jacoco/core/data/SessionInfoStore.java
index 6669841..da5e497 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/SessionInfoStore.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/SessionInfoStore.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/data/package-info.java b/org.jacoco.core/src/org/jacoco/core/data/package-info.java
index 569faa2..f06648f 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/package-info.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/instr/Instrumenter.java b/org.jacoco.core/src/org/jacoco/core/instr/Instrumenter.java
index 11aa3df..eb91f56 100644
--- a/org.jacoco.core/src/org/jacoco/core/instr/Instrumenter.java
+++ b/org.jacoco.core/src/org/jacoco/core/instr/Instrumenter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -22,6 +22,7 @@
 import java.util.zip.ZipOutputStream;
 
 import org.jacoco.core.internal.ContentTypeDetector;
+import org.jacoco.core.internal.Java9Support;
 import org.jacoco.core.internal.Pack200Streams;
 import org.jacoco.core.internal.flow.ClassProbesAdapter;
 import org.jacoco.core.internal.instr.ClassInstrumenter;
@@ -75,7 +76,13 @@
 	 * 
 	 */
 	public byte[] instrument(final ClassReader reader) {
-		final ClassWriter writer = new ClassWriter(reader, 0);
+		final ClassWriter writer = new ClassWriter(reader, 0) {
+			@Override
+			protected String getCommonSuperClass(final String type1,
+					final String type2) {
+				throw new IllegalStateException();
+			}
+		};
 		final IProbeArrayStrategy strategy = ProbeArrayStrategyFactory
 				.createFor(reader, accessorGenerator);
 		final ClassVisitor visitor = new ClassProbesAdapter(
@@ -93,12 +100,19 @@
 	 *            a name used for exception messages
 	 * @return instrumented definition
 	 * @throws IOException
-	 *             if the class can't be analyzed
+	 *             if the class can't be instrumented
 	 */
 	public byte[] instrument(final byte[] buffer, final String name)
 			throws IOException {
 		try {
-			return instrument(new ClassReader(buffer));
+			if (Java9Support.isPatchRequired(buffer)) {
+				final byte[] result = instrument(
+						new ClassReader(Java9Support.downgrade(buffer)));
+				Java9Support.upgrade(result);
+				return result;
+			} else {
+				return instrument(new ClassReader(buffer));
+			}
 		} catch (final RuntimeException e) {
 			throw instrumentError(name, e);
 		}
@@ -118,11 +132,13 @@
 	 */
 	public byte[] instrument(final InputStream input, final String name)
 			throws IOException {
+		final byte[] bytes;
 		try {
-			return instrument(new ClassReader(input));
-		} catch (final RuntimeException e) {
+			bytes = Java9Support.readFully(input);
+		} catch (final IOException e) {
 			throw instrumentError(name, e);
 		}
+		return instrument(bytes, name);
 	}
 
 	/**
@@ -140,17 +156,13 @@
 	 */
 	public void instrument(final InputStream input, final OutputStream output,
 			final String name) throws IOException {
-		try {
-			output.write(instrument(new ClassReader(input)));
-		} catch (final RuntimeException e) {
-			throw instrumentError(name, e);
-		}
+		output.write(instrument(input, name));
 	}
 
 	private IOException instrumentError(final String name,
-			final RuntimeException cause) {
-		final IOException ex = new IOException(String.format(
-				"Error while instrumenting class %s.", name));
+			final Exception cause) {
+		final IOException ex = new IOException(
+				String.format("Error while instrumenting %s.", name));
 		ex.initCause(cause);
 		return ex;
 	}
@@ -173,7 +185,12 @@
 	 */
 	public int instrumentAll(final InputStream input,
 			final OutputStream output, final String name) throws IOException {
-		final ContentTypeDetector detector = new ContentTypeDetector(input);
+		final ContentTypeDetector detector;
+		try {
+			detector = new ContentTypeDetector(input);
+		} catch (IOException e) {
+			throw instrumentError(name, e);
+		}
 		switch (detector.getType()) {
 		case ContentTypeDetector.CLASSFILE:
 			instrument(detector.getInputStream(), output, name);
@@ -185,7 +202,7 @@
 		case ContentTypeDetector.PACK200FILE:
 			return instrumentPack200(detector.getInputStream(), output, name);
 		default:
-			copy(detector.getInputStream(), output);
+			copy(detector.getInputStream(), output, name);
 			return 0;
 		}
 	}
@@ -196,7 +213,7 @@
 		final ZipOutputStream zipout = new ZipOutputStream(output);
 		ZipEntry entry;
 		int count = 0;
-		while ((entry = zipin.getNextEntry()) != null) {
+		while ((entry = nextEntry(zipin, name)) != null) {
 			final String entryName = entry.getName();
 			if (signatureRemover.removeEntry(entryName)) {
 				continue;
@@ -212,30 +229,59 @@
 		return count;
 	}
 
+	private ZipEntry nextEntry(ZipInputStream input, String location)
+			throws IOException {
+		try {
+			return input.getNextEntry();
+		} catch (IOException e) {
+			throw instrumentError(location, e);
+		}
+	}
+
 	private int instrumentGzip(final InputStream input,
 			final OutputStream output, final String name) throws IOException {
+		final GZIPInputStream gzipInputStream;
+		try {
+			gzipInputStream = new GZIPInputStream(input);
+		} catch (IOException e) {
+			throw instrumentError(name, e);
+		}
 		final GZIPOutputStream gzout = new GZIPOutputStream(output);
-		final int count = instrumentAll(new GZIPInputStream(input), gzout, name);
+		final int count = instrumentAll(gzipInputStream, gzout, name);
 		gzout.finish();
 		return count;
 	}
 
 	private int instrumentPack200(final InputStream input,
 			final OutputStream output, final String name) throws IOException {
+		final InputStream unpackedInput;
+		try {
+			unpackedInput = Pack200Streams.unpack(input);
+		} catch (IOException e) {
+			throw instrumentError(name, e);
+		}
 		final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-		final int count = instrumentAll(Pack200Streams.unpack(input), buffer,
-				name);
+		final int count = instrumentAll(unpackedInput, buffer, name);
 		Pack200Streams.pack(buffer.toByteArray(), output);
 		return count;
 	}
 
-	private void copy(final InputStream input, final OutputStream output)
-			throws IOException {
+	private void copy(final InputStream input, final OutputStream output,
+			final String name) throws IOException {
 		final byte[] buffer = new byte[1024];
 		int len;
-		while ((len = input.read(buffer)) != -1) {
+		while ((len = read(input, buffer, name)) != -1) {
 			output.write(buffer, 0, len);
 		}
 	}
 
+	private int read(final InputStream input, final byte[] buffer,
+			final String name) throws IOException {
+		try {
+			return input.read(buffer);
+		} catch (IOException e) {
+			throw instrumentError(name, e);
+		}
+	}
+
 }
diff --git a/org.jacoco.core/src/org/jacoco/core/instr/package-info.java b/org.jacoco.core/src/org/jacoco/core/instr/package-info.java
index 102bcba..bd2b080 100644
--- a/org.jacoco.core/src/org/jacoco/core/instr/package-info.java
+++ b/org.jacoco.core/src/org/jacoco/core/instr/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/ContentTypeDetector.java b/org.jacoco.core/src/org/jacoco/core/internal/ContentTypeDetector.java
index 868e165..2d7362b 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/ContentTypeDetector.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/ContentTypeDetector.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -82,6 +82,7 @@
 			case Opcodes.V1_6:
 			case Opcodes.V1_7:
 			case Opcodes.V1_8:
+			case Java9Support.V1_9:
 				return CLASSFILE;
 			}
 		}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/Java9Support.java b/org.jacoco.core/src/org/jacoco/core/internal/Java9Support.java
new file mode 100644
index 0000000..726f698
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/Java9Support.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.objectweb.asm.Opcodes;
+
+/**
+ * Patching for Java 9 classes, so that ASM can read them.
+ */
+public final class Java9Support {
+
+	/**
+	 * Version of the Java 9 class file format.
+	 */
+	public static final int V1_9 = Opcodes.V1_8 + 1;
+
+	private Java9Support() {
+	}
+
+	/**
+	 * Reads all bytes from an input stream into a byte array.
+	 *
+	 * @param is
+	 *             the input stream to read from
+	 * @return a byte array containing all the bytes from the stream
+	 * @throws IOException
+	 *             if an I/O error occurs
+	 */
+	public static byte[] readFully(final InputStream is)
+			throws IOException {
+		if (is == null) {
+			throw new IllegalArgumentException();
+		}
+		final byte[] buf = new byte[1024];
+		final ByteArrayOutputStream out = new ByteArrayOutputStream();
+		while (true) {
+			int r = is.read(buf);
+			if (r == -1) {
+				break;
+			}
+			out.write(buf, 0, r);
+		}
+		return out.toByteArray();
+	}
+
+	private static void putShort(byte[] b, int index, int s) {
+		b[index] = (byte) (s >>> 8);
+		b[index + 1] = (byte) s;
+	}
+
+	private static short readShort(byte[] b, int index) {
+		return (short) (((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF));
+	}
+
+	/**
+	 * Determines whether class definition contains {@link #V1_9} version.
+	 *
+	 * @param buffer
+	 *             definition of the class
+	 * @return <code>true</code> if class definition contains Java 9 version
+	 */
+	public static boolean isPatchRequired(byte[] buffer) {
+		return readShort(buffer, 6) == V1_9;
+	}
+
+	/**
+	 * Returns new definition of class with version {@link Opcodes#V1_8},
+	 * if it has version {@link #V1_9}.
+	 *
+	 * @param buffer
+	 *             definition of the class
+	 * @return new definition of the class
+	 */
+	public static byte[] downgradeIfRequired(byte[] buffer) {
+		return isPatchRequired(buffer) ? downgrade(buffer) : buffer;
+	}
+
+	/**
+	 * Replaces version in the definition of class on {@link Opcodes#V1_8}.
+	 *
+	 * @param b
+	 *             definition of the class
+	 * @return new definition of the class
+	 */
+	public static byte[] downgrade(byte[] b) {
+		byte[] result = new byte[b.length];
+		System.arraycopy(b, 0, result, 0, b.length);
+		putShort(result, 6, Opcodes.V1_8);
+		return result;
+	}
+
+	/**
+	 * Replaces version in the definition of class on {@link #V1_9}.
+	 *
+	 * @param b
+	 *             definition of the class
+	 */
+	public static void upgrade(byte[] b) {
+		putShort(b, 6, V1_9);
+	}
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/Pack200Streams.java b/org.jacoco.core/src/org/jacoco/core/internal/Pack200Streams.java
index a271cb3..817e9f5 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/Pack200Streams.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/Pack200Streams.java
@@ -1,5 +1,5 @@
 /*******************************************************************************

- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors

+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors

  * All rights reserved. This program and the accompanying materials

  * are made available under the terms of the Eclipse Public License v1.0

  * which accompanies this distribution, and is available at

diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/BundleCoverageImpl.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/BundleCoverageImpl.java
index aed9ab5..0ca816c 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/BundleCoverageImpl.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/BundleCoverageImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java
index 2df27fb..fa3517b 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,63 +16,45 @@
 import org.jacoco.core.internal.flow.MethodProbesVisitor;
 import org.jacoco.core.internal.instr.InstrSupport;
 import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Opcodes;
 
 /**
  * Analyzes the structure of a class.
  */
 public class ClassAnalyzer extends ClassProbesVisitor {
 
-	private final long classid;
-	private final boolean noMatch;
+	private final ClassCoverageImpl coverage;
 	private final boolean[] probes;
 	private final StringPool stringPool;
 
-	private ClassCoverageImpl coverage;
-
 	/**
 	 * Creates a new analyzer that builds coverage data for a class.
 	 * 
-	 * @param classid
-	 *            id of the class
-	 * @param noMatch
-	 *            <code>true</code> if class id does not match with execution
-	 *            data
+	 * @param coverage
+	 *            coverage node for the analyzed class data
 	 * @param probes
 	 *            execution data for this class or <code>null</code>
 	 * @param stringPool
 	 *            shared pool to minimize the number of {@link String} instances
 	 */
-	public ClassAnalyzer(final long classid, final boolean noMatch,
+	public ClassAnalyzer(final ClassCoverageImpl coverage,
 			final boolean[] probes, final StringPool stringPool) {
-		this.classid = classid;
-		this.noMatch = noMatch;
+		this.coverage = coverage;
 		this.probes = probes;
 		this.stringPool = stringPool;
 	}
 
-	/**
-	 * Returns the coverage data for this class after this visitor has been
-	 * processed.
-	 * 
-	 * @return coverage data for this class
-	 */
-	public ClassCoverageImpl getCoverage() {
-		return coverage;
-	}
-
 	@Override
 	public void visit(final int version, final int access, final String name,
 			final String signature, final String superName,
 			final String[] interfaces) {
-		this.coverage = new ClassCoverageImpl(stringPool.get(name), classid,
-				noMatch, stringPool.get(signature), stringPool.get(superName),
-				stringPool.get(interfaces));
+		coverage.setSignature(stringPool.get(signature));
+		coverage.setSuperName(stringPool.get(superName));
+		coverage.setInterfaces(stringPool.get(interfaces));
 	}
 
 	@Override
 	public void visitSource(final String source, final String debug) {
-		this.coverage.setSourceFileName(stringPool.get(source));
+		coverage.setSourceFileName(stringPool.get(source));
 	}
 
 	@Override
@@ -81,11 +63,8 @@
 
 		InstrSupport.assertNotInstrumented(name, coverage.getName());
 
-		if (isMethodFiltered(access, name)) {
-			return null;
-		}
-
-		return new MethodAnalyzer(stringPool.get(name), stringPool.get(desc),
+		return new MethodAnalyzer(coverage.getName(), coverage.getSuperName(),
+				stringPool.get(name), stringPool.get(desc),
 				stringPool.get(signature), probes) {
 			@Override
 			public void visitEnd() {
@@ -99,12 +78,6 @@
 		};
 	}
 
-	// TODO: Use filter hook in future
-	private boolean isMethodFiltered(final int access, final String name) {
-		return (access & Opcodes.ACC_SYNTHETIC) != 0
-				&& !name.startsWith("lambda$");
-	}
-
 	@Override
 	public FieldVisitor visitField(final int access, final String name,
 			final String desc, final String signature, final Object value) {
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassCoverageImpl.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassCoverageImpl.java
index fe42f5d..0bd85d8 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassCoverageImpl.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassCoverageImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,38 +24,28 @@
 
 	private final long id;
 	private final boolean noMatch;
-	private final String signature;
-	private final String superName;
-	private final String[] interfaces;
 	private final Collection<IMethodCoverage> methods;
+	private String signature;
+	private String superName;
+	private String[] interfaces;
 	private String sourceFileName;
 
 	/**
 	 * Creates a class coverage data object with the given parameters.
 	 * 
 	 * @param name
-	 *            vm name of the class
+	 *            VM name of the class
 	 * @param id
 	 *            class identifier
 	 * @param noMatch
 	 *            <code>true</code>, if class id does not match with execution
 	 *            data
-	 * @param signature
-	 *            vm signature of the class
-	 * @param superName
-	 *            vm name of the superclass of this class
-	 * @param interfaces
-	 *            vm names of interfaces of this class
 	 */
 	public ClassCoverageImpl(final String name, final long id,
-			final boolean noMatch, final String signature,
-			final String superName, final String[] interfaces) {
+			final boolean noMatch) {
 		super(ElementType.CLASS, name);
 		this.id = id;
 		this.noMatch = noMatch;
-		this.signature = signature;
-		this.superName = superName;
-		this.interfaces = interfaces;
 		this.methods = new ArrayList<IMethodCoverage>();
 		this.classCounter = CounterImpl.COUNTER_1_0;
 	}
@@ -77,6 +67,37 @@
 	}
 
 	/**
+	 * Sets the VM signature of the class.
+	 * 
+	 * @param signature
+	 *            VM signature of the class (may be <code>null</code>)
+	 */
+	public void setSignature(final String signature) {
+		this.signature = signature;
+	}
+
+	/**
+	 * Sets the VM name of the superclass.
+	 * 
+	 * @param superName
+	 *            VM name of the super class (may be <code>null</code>, i.e.
+	 *            <code>java/lang/Object</code>)
+	 */
+	public void setSuperName(final String superName) {
+		this.superName = superName;
+	}
+
+	/**
+	 * Sets the VM names of implemented/extended interfaces.
+	 * 
+	 * @param interfaces
+	 *            VM names of implemented/extended interfaces
+	 */
+	public void setInterfaces(final String[] interfaces) {
+		this.interfaces = interfaces;
+	}
+
+	/**
 	 * Sets the name of the corresponding source file for this class.
 	 * 
 	 * @param sourceFileName
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/CounterImpl.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/CounterImpl.java
index ac6a3e1..3722d49 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/CounterImpl.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/CounterImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/LineImpl.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/LineImpl.java
index 481869d..62cecf4 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/LineImpl.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/LineImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodAnalyzer.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodAnalyzer.java
index 08deb5b..8e07e56 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodAnalyzer.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodAnalyzer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,23 +12,48 @@
 package org.jacoco.core.internal.analysis;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.jacoco.core.analysis.ICounter;
 import org.jacoco.core.analysis.IMethodCoverage;
 import org.jacoco.core.analysis.ISourceNode;
+import org.jacoco.core.internal.analysis.filter.EnumFilter;
+import org.jacoco.core.internal.analysis.filter.IFilter;
+import org.jacoco.core.internal.analysis.filter.IFilterOutput;
+import org.jacoco.core.internal.analysis.filter.LombokGeneratedFilter;
+import org.jacoco.core.internal.analysis.filter.PrivateEmptyNoArgConstructorFilter;
+import org.jacoco.core.internal.analysis.filter.SynchronizedFilter;
+import org.jacoco.core.internal.analysis.filter.SyntheticFilter;
+import org.jacoco.core.internal.analysis.filter.TryWithResourcesEcjFilter;
+import org.jacoco.core.internal.analysis.filter.TryWithResourcesJavacFilter;
 import org.jacoco.core.internal.flow.IFrame;
 import org.jacoco.core.internal.flow.Instruction;
 import org.jacoco.core.internal.flow.LabelInfo;
 import org.jacoco.core.internal.flow.MethodProbesVisitor;
 import org.objectweb.asm.Handle;
 import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.TryCatchBlockNode;
 
 /**
  * A {@link MethodProbesVisitor} that analyzes which statements and branches of
  * a method have been executed based on given probe data.
  */
-public class MethodAnalyzer extends MethodProbesVisitor {
+public class MethodAnalyzer extends MethodProbesVisitor
+		implements IFilterOutput {
+
+	private static final IFilter[] FILTERS = new IFilter[] { new EnumFilter(),
+			new SyntheticFilter(), new SynchronizedFilter(),
+			new TryWithResourcesJavacFilter(), new TryWithResourcesEcjFilter(),
+			new PrivateEmptyNoArgConstructorFilter(), new LombokGeneratedFilter() };
+
+	private final String className;
+
+	private final String superClassName;
 
 	private final boolean[] probes;
 
@@ -58,6 +83,10 @@
 	/**
 	 * New Method analyzer for the given probe data.
 	 * 
+	 * @param className
+	 *            class name
+	 * @param superClassName
+	 *            superclass name
 	 * @param name
 	 *            method name
 	 * @param desc
@@ -69,9 +98,12 @@
 	 *            recorded probe date of the containing class or
 	 *            <code>null</code> if the class is not executed at all
 	 */
-	public MethodAnalyzer(final String name, final String desc,
-			final String signature, final boolean[] probes) {
+	public MethodAnalyzer(final String className, final String superClassName,
+			final String name, final String desc, final String signature,
+			final boolean[] probes) {
 		super();
+		this.className = className;
+		this.superClassName = superClassName;
 		this.probes = probes;
 		this.coverage = new MethodCoverageImpl(name, desc, signature);
 	}
@@ -86,6 +118,40 @@
 		return coverage;
 	}
 
+	/**
+	 * {@link MethodNode#accept(MethodVisitor)}
+	 */
+	@Override
+	public void accept(final MethodNode methodNode,
+			final MethodVisitor methodVisitor) {
+		this.ignored.clear();
+		for (final IFilter filter : FILTERS) {
+			filter.filter(className, superClassName, methodNode, this);
+		}
+
+		for (final TryCatchBlockNode n : methodNode.tryCatchBlocks) {
+			n.accept(methodVisitor);
+		}
+		currentNode = methodNode.instructions.getFirst();
+		while (currentNode != null) {
+			currentNode.accept(methodVisitor);
+			currentNode = currentNode.getNext();
+		}
+		methodVisitor.visitEnd();
+	}
+
+	private final Set<AbstractInsnNode> ignored = new HashSet<AbstractInsnNode>();
+	private AbstractInsnNode currentNode;
+
+	public void ignore(final AbstractInsnNode fromInclusive,
+			final AbstractInsnNode toInclusive) {
+		for (AbstractInsnNode i = fromInclusive; i != toInclusive; i = i
+				.getNext()) {
+			ignored.add(i);
+		}
+		ignored.add(toInclusive);
+	}
+
 	@Override
 	public void visitLabel(final Label label) {
 		currentLabel.add(label);
@@ -106,7 +172,7 @@
 	}
 
 	private void visitInsn() {
-		final Instruction insn = new Instruction(currentLine);
+		final Instruction insn = new Instruction(currentNode, currentLine);
 		instructions.add(insn);
 		if (lastInsn != null) {
 			insn.setPredecessor(lastInsn);
@@ -272,12 +338,17 @@
 		// Report result:
 		coverage.ensureCapacity(firstLine, lastLine);
 		for (final Instruction i : instructions) {
+			if (ignored.contains(i.getNode())) {
+				continue;
+			}
+
 			final int total = i.getBranches();
 			final int covered = i.getCoveredBranches();
 			final ICounter instrCounter = covered == 0 ? CounterImpl.COUNTER_1_0
 					: CounterImpl.COUNTER_0_1;
-			final ICounter branchCounter = total > 1 ? CounterImpl.getInstance(
-					total - covered, covered) : CounterImpl.COUNTER_0_0;
+			final ICounter branchCounter = total > 1
+					? CounterImpl.getInstance(total - covered, covered)
+					: CounterImpl.COUNTER_0_0;
 			coverage.increment(instrCounter, branchCounter, i.getLine());
 		}
 		coverage.incrementMethodCounter();
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodCoverageImpl.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodCoverageImpl.java
index b3388d3..c478f0a 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodCoverageImpl.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodCoverageImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/PackageCoverageImpl.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/PackageCoverageImpl.java
index 8816879..aeede71 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/PackageCoverageImpl.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/PackageCoverageImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/SourceFileCoverageImpl.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/SourceFileCoverageImpl.java
index 621e333..1fb656e 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/SourceFileCoverageImpl.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/SourceFileCoverageImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/SourceNodeImpl.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/SourceNodeImpl.java
index cac0ae0..155c2ed 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/SourceNodeImpl.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/SourceNodeImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -43,7 +43,7 @@
 	/**
 	 * Make sure that the internal buffer can keep lines from first to last.
 	 * While the buffer is also incremented automatically, this method allows
-	 * optimization in case the total range in known in advance.
+	 * optimization in case the total range is known in advance.
 	 * 
 	 * @param first
 	 *            first line number or {@link ISourceNode#UNKNOWN_LINE}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/StringPool.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/StringPool.java
index a92c203..f6c1197 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/StringPool.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/StringPool.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java
new file mode 100644
index 0000000..50a295d
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.VarInsnNode;
+
+abstract class AbstractMatcher {
+
+	final Map<String, VarInsnNode> vars = new HashMap<String, VarInsnNode>();
+
+	AbstractInsnNode cursor;
+
+	final void nextIsAddSuppressed() {
+		nextIs(Opcodes.INVOKEVIRTUAL);
+		if (cursor == null) {
+			return;
+		}
+		final MethodInsnNode m = (MethodInsnNode) cursor;
+		if ("java/lang/Throwable".equals(m.owner)
+				&& "addSuppressed".equals(m.name)) {
+			return;
+		}
+		cursor = null;
+	}
+
+	final void nextIsVar(final int opcode, final String name) {
+		nextIs(opcode);
+		if (cursor == null) {
+			return;
+		}
+		final VarInsnNode actual = (VarInsnNode) cursor;
+		final VarInsnNode expected = vars.get(name);
+		if (expected == null) {
+			vars.put(name, actual);
+		} else if (expected.var != actual.var) {
+			cursor = null;
+		}
+	}
+
+	/**
+	 * Moves {@link #cursor} to next instruction if it has given opcode,
+	 * otherwise sets it to <code>null</code>.
+	 */
+	final void nextIs(final int opcode) {
+		next();
+		if (cursor == null) {
+			return;
+		}
+		if (cursor.getOpcode() != opcode) {
+			cursor = null;
+		}
+	}
+
+	/**
+	 * Moves {@link #cursor} to next instruction.
+	 */
+	final void next() {
+		if (cursor == null) {
+			return;
+		}
+		cursor = cursor.getNext();
+		skipNonOpcodes();
+	}
+
+	final void skipNonOpcodes() {
+		while (cursor != null && (cursor.getType() == AbstractInsnNode.FRAME
+				|| cursor.getType() == AbstractInsnNode.LABEL
+				|| cursor.getType() == AbstractInsnNode.LINE)) {
+			cursor = cursor.getNext();
+		}
+	}
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumFilter.java
new file mode 100644
index 0000000..852008e
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumFilter.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+ * Filters methods <code>values</code> and <code>valueOf</code> that compiler
+ * creates for enums.
+ */
+public final class EnumFilter implements IFilter {
+
+	public void filter(final String className, final String superClassName,
+			final MethodNode methodNode, final IFilterOutput output) {
+		if (isMethodFiltered(className, superClassName, methodNode.name,
+				methodNode.desc)) {
+			output.ignore(methodNode.instructions.getFirst(),
+					methodNode.instructions.getLast());
+		}
+	}
+
+	private boolean isMethodFiltered(final String className,
+			final String superClassName, final String methodName,
+			final String methodDesc) {
+		if ("java/lang/Enum".equals(superClassName)) {
+			if ("values".equals(methodName)
+					&& ("()[L" + className + ";").equals(methodDesc)) {
+				return true;
+			}
+			if ("valueOf".equals(methodName)
+					&& ("(Ljava/lang/String;)L" + className + ";")
+							.equals(methodDesc)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilter.java
new file mode 100644
index 0000000..39cf5c7
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilter.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+ * Interface for filter implementations. Instances of filters are reused and so
+ * must be stateless.
+ */
+public interface IFilter {
+
+	/**
+	 * This method is called for every method. The filter implementation is
+	 * expected to inspect the provided method and report its result to the
+	 * given {@link IFilterOutput} instance.
+	 *
+	 * @param className
+	 *            class name
+	 * @param superClassName
+	 *            superclass name
+	 * @param methodNode
+	 *            method to inspect
+	 * @param output
+	 *            callback to report filtering results to
+	 */
+	void filter(String className, String superClassName, MethodNode methodNode,
+			IFilterOutput output);
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilterOutput.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilterOutput.java
new file mode 100644
index 0000000..c24dc03
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilterOutput.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import org.objectweb.asm.tree.AbstractInsnNode;
+
+/**
+ * Interface used by filters to mark filtered items.
+ */
+public interface IFilterOutput {
+
+	/**
+	 * Marks sequence of instructions that should be ignored during computation
+	 * of coverage.
+	 *
+	 * @param fromInclusive
+	 *            first instruction that should be ignored, inclusive
+	 * @param toInclusive
+	 *            last instruction coming after <code>fromInclusive</code> that
+	 *            should be ignored, inclusive
+	 */
+	void ignore(AbstractInsnNode fromInclusive, AbstractInsnNode toInclusive);
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilter.java
new file mode 100644
index 0000000..571e464
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilter.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import java.util.List;
+
+import org.objectweb.asm.tree.AnnotationNode;
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+ * Filters methods annotated with <code>@lombok.Generated</code>.
+ */
+public class LombokGeneratedFilter implements IFilter {
+
+	public void filter(final String className, final String superClassName,
+			final MethodNode methodNode, final IFilterOutput output) {
+		if (hasLombokGeneratedAnnotation(methodNode)) {
+			output.ignore(methodNode.instructions.getFirst(),
+					methodNode.instructions.getLast());
+		}
+	}
+
+	private boolean hasLombokGeneratedAnnotation(final MethodNode methodNode) {
+		final List<AnnotationNode> runtimeInvisibleAnnotations = methodNode.invisibleAnnotations;
+		if (runtimeInvisibleAnnotations != null) {
+			for (final AnnotationNode annotation : runtimeInvisibleAnnotations) {
+				if ("Llombok/Generated;".equals(annotation.desc)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java
new file mode 100644
index 0000000..9e1bd43
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.VarInsnNode;
+
+/**
+ * Filters private empty constructors that do not have arguments.
+ */
+public final class PrivateEmptyNoArgConstructorFilter implements IFilter {
+
+	public void filter(final String className, final String superClassName,
+			final MethodNode methodNode, final IFilterOutput output) {
+		if ((methodNode.access & Opcodes.ACC_PRIVATE) != 0
+				&& "<init>".equals(methodNode.name)
+				&& "()V".equals(methodNode.desc)
+				&& new Matcher().match(methodNode, superClassName)) {
+			output.ignore(methodNode.instructions.getFirst(),
+					methodNode.instructions.getLast());
+		}
+	}
+
+	private static class Matcher extends AbstractMatcher {
+		private boolean match(final MethodNode methodNode,
+				final String superClassName) {
+			cursor = methodNode.instructions.getFirst();
+			skipNonOpcodes();
+			if (cursor.getOpcode() != Opcodes.ALOAD
+					|| ((VarInsnNode) cursor).var != 0) {
+				return false;
+			}
+			nextIs(Opcodes.INVOKESPECIAL);
+			MethodInsnNode m = (MethodInsnNode) cursor;
+			if (m != null && superClassName.equals(m.owner)
+					&& "<init>".equals(m.name) && ("()V").equals(m.desc)) {
+				nextIs(Opcodes.RETURN);
+				return cursor != null;
+			}
+			return false;
+		}
+	}
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilter.java
new file mode 100644
index 0000000..eec0094
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilter.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.TryCatchBlockNode;
+
+/**
+ * Filters code that is generated for synchronized statement.
+ */
+public final class SynchronizedFilter implements IFilter {
+
+	public void filter(final String className, final String superClassName,
+			final MethodNode methodNode, final IFilterOutput output) {
+		for (TryCatchBlockNode tryCatch : methodNode.tryCatchBlocks) {
+			if (tryCatch.type != null) {
+				continue;
+			}
+			if (tryCatch.start == tryCatch.handler) {
+				continue;
+			}
+			final AbstractInsnNode to = new Matcher(tryCatch.handler).match();
+			if (to == null) {
+				continue;
+			}
+			output.ignore(tryCatch.handler, to);
+		}
+	}
+
+	private static class Matcher extends AbstractMatcher {
+		private final AbstractInsnNode start;
+
+		private Matcher(final AbstractInsnNode start) {
+			this.start = start;
+		}
+
+		private AbstractInsnNode match() {
+			if (nextIsEcj() || nextIsJavac()) {
+				return cursor;
+			}
+			return null;
+		}
+
+		private boolean nextIsJavac() {
+			cursor = start;
+			nextIsVar(Opcodes.ASTORE, "t");
+			nextIs(Opcodes.ALOAD);
+			nextIs(Opcodes.MONITOREXIT);
+			nextIsVar(Opcodes.ALOAD, "t");
+			nextIs(Opcodes.ATHROW);
+			return cursor != null;
+		}
+
+		private boolean nextIsEcj() {
+			cursor = start;
+			nextIs(Opcodes.ALOAD);
+			nextIs(Opcodes.MONITOREXIT);
+			nextIs(Opcodes.ATHROW);
+			return  cursor != null;
+		}
+	}
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SyntheticFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SyntheticFilter.java
new file mode 100644
index 0000000..454ec80
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SyntheticFilter.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+ * Filters synthetic methods unless they represent bodies of lambda expressions.
+ */
+public final class SyntheticFilter implements IFilter {
+
+	public void filter(final String className, final String superClassName,
+			final MethodNode methodNode, final IFilterOutput output) {
+		if ((methodNode.access & Opcodes.ACC_SYNTHETIC) != 0
+				&& !methodNode.name.startsWith("lambda$")) {
+			output.ignore(methodNode.instructions.getFirst(),
+					methodNode.instructions.getLast());
+		}
+	}
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilter.java
new file mode 100644
index 0000000..7d7d396
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilter.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.JumpInsnNode;
+import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.TryCatchBlockNode;
+
+/**
+ * Filters code that ECJ generates for try-with-resources statement.
+ */
+public final class TryWithResourcesEcjFilter implements IFilter {
+
+	public void filter(final String className, final String superClassName,
+			final MethodNode methodNode, final IFilterOutput output) {
+		if (methodNode.tryCatchBlocks.isEmpty()) {
+			return;
+		}
+		final Matcher matcher = new Matcher(output);
+		for (TryCatchBlockNode t : methodNode.tryCatchBlocks) {
+			if (t.type == null) {
+				matcher.start(t.handler);
+				if (!matcher.matchEcj()) {
+					matcher.start(t.handler);
+					matcher.matchEcjNoFlowOut();
+				}
+			}
+		}
+	}
+
+	static class Matcher extends AbstractMatcher {
+
+		private final IFilterOutput output;
+
+		private final Map<String, String> owners = new HashMap<String, String>();
+		private final Map<String, LabelNode> labels = new HashMap<String, LabelNode>();
+
+		private AbstractInsnNode start;
+
+		Matcher(final IFilterOutput output) {
+			this.output = output;
+		}
+
+		private void start(final AbstractInsnNode start) {
+			this.start = start;
+			cursor = start.getPrevious();
+			vars.clear();
+			labels.clear();
+			owners.clear();
+		}
+
+		private boolean matchEcj() {
+			// "catch (any primaryExc)"
+			nextIsVar(Opcodes.ASTORE, "primaryExc");
+			nextIsEcjCloseAndThrow("r0");
+
+			AbstractInsnNode c;
+			int resources = 1;
+			String r = "r" + resources;
+			c = cursor;
+			while (nextIsEcjClose(r)) {
+				nextIsJump(Opcodes.GOTO, r + ".end");
+				nextIsEcjSuppress(r);
+				nextIsEcjCloseAndThrow(r);
+				resources++;
+				r = "r" + resources;
+				c = cursor;
+			}
+			cursor = c;
+			nextIsEcjSuppress("last");
+			// "throw primaryExc"
+			nextIsVar(Opcodes.ALOAD, "primaryExc");
+			nextIs(Opcodes.ATHROW);
+			if (cursor == null) {
+				return false;
+			}
+			final AbstractInsnNode end = cursor;
+
+			AbstractInsnNode startOnNonExceptionalPath = start.getPrevious();
+			cursor = startOnNonExceptionalPath;
+			while (!nextIsEcjClose("r0")) {
+				startOnNonExceptionalPath = startOnNonExceptionalPath
+						.getPrevious();
+				cursor = startOnNonExceptionalPath;
+				if (cursor == null) {
+					return false;
+				}
+			}
+			startOnNonExceptionalPath = startOnNonExceptionalPath.getNext();
+
+			next();
+			if (cursor == null || cursor.getOpcode() != Opcodes.GOTO) {
+				return false;
+			}
+
+			output.ignore(startOnNonExceptionalPath, cursor);
+			output.ignore(start, end);
+			return true;
+		}
+
+		private boolean matchEcjNoFlowOut() {
+			// "catch (any primaryExc)"
+			nextIsVar(Opcodes.ASTORE, "primaryExc");
+
+			AbstractInsnNode c;
+			int resources = 0;
+			String r = "r" + resources;
+			c = cursor;
+			while (nextIsEcjCloseAndThrow(r) && nextIsEcjSuppress(r)) {
+				resources++;
+				r = "r" + resources;
+				c = cursor;
+			}
+			cursor = c;
+			// "throw primaryExc"
+			nextIsVar(Opcodes.ALOAD, "primaryExc");
+			nextIs(Opcodes.ATHROW);
+			if (cursor == null) {
+				return false;
+			}
+			final AbstractInsnNode end = cursor;
+
+			AbstractInsnNode startOnNonExceptionalPath = start.getPrevious();
+			cursor = startOnNonExceptionalPath;
+			while (!nextIsEcjClose("r0")) {
+				startOnNonExceptionalPath = startOnNonExceptionalPath
+						.getPrevious();
+				cursor = startOnNonExceptionalPath;
+				if (cursor == null) {
+					return false;
+				}
+			}
+			startOnNonExceptionalPath = startOnNonExceptionalPath.getNext();
+			for (int i = 1; i < resources; i++) {
+				if (!nextIsEcjClose("r" + i)) {
+					return false;
+				}
+			}
+
+			output.ignore(startOnNonExceptionalPath, cursor);
+			output.ignore(start, end);
+			return true;
+		}
+
+		private boolean nextIsEcjClose(final String name) {
+			nextIsVar(Opcodes.ALOAD, name);
+			// "if (r != null)"
+			nextIsJump(Opcodes.IFNULL, name + ".end");
+			// "r.close()"
+			nextIsClose(name);
+			return cursor != null;
+		}
+
+		private boolean nextIsEcjCloseAndThrow(final String name) {
+			nextIsVar(Opcodes.ALOAD, name);
+			// "if (r != null)"
+			nextIsJump(Opcodes.IFNULL, name);
+			// "r.close()"
+			nextIsClose(name);
+			nextIsLabel(name);
+			nextIsVar(Opcodes.ALOAD, "primaryExc");
+			nextIs(Opcodes.ATHROW);
+			return cursor != null;
+		}
+
+		private boolean nextIsEcjSuppress(final String name) {
+			final String suppressedExc = name + ".t";
+			final String startLabel = name + ".suppressStart";
+			final String endLabel = name + ".suppressEnd";
+			nextIsVar(Opcodes.ASTORE, suppressedExc);
+			// "suppressedExc = t"
+			// "if (primaryExc != null)"
+			nextIsVar(Opcodes.ALOAD, "primaryExc");
+			nextIsJump(Opcodes.IFNONNULL, startLabel);
+			// "primaryExc = suppressedExc"
+			nextIsVar(Opcodes.ALOAD, suppressedExc);
+			nextIsVar(Opcodes.ASTORE, "primaryExc");
+			nextIsJump(Opcodes.GOTO, endLabel);
+			// "if (primaryExc == suppressedExc)"
+			nextIsLabel(startLabel);
+			nextIsVar(Opcodes.ALOAD, "primaryExc");
+			nextIsVar(Opcodes.ALOAD, suppressedExc);
+			nextIsJump(Opcodes.IF_ACMPEQ, endLabel);
+			// "primaryExc.addSuppressed(suppressedExc)"
+			nextIsVar(Opcodes.ALOAD, "primaryExc");
+			nextIsVar(Opcodes.ALOAD, suppressedExc);
+			nextIsAddSuppressed();
+			nextIsLabel(endLabel);
+			return cursor != null;
+		}
+
+		private void nextIsClose(final String name) {
+			nextIsVar(Opcodes.ALOAD, name);
+			next();
+			if (cursor == null) {
+				return;
+			}
+			if (cursor.getOpcode() != Opcodes.INVOKEINTERFACE
+					&& cursor.getOpcode() != Opcodes.INVOKEVIRTUAL) {
+				cursor = null;
+				return;
+			}
+			final MethodInsnNode m = (MethodInsnNode) cursor;
+			if (!"close".equals(m.name) || !"()V".equals(m.desc)) {
+				cursor = null;
+				return;
+			}
+			final String actual = m.owner;
+			final String expected = owners.get(name);
+			if (expected == null) {
+				owners.put(name, actual);
+			} else if (!expected.equals(actual)) {
+				cursor = null;
+			}
+		}
+
+		private void nextIsJump(final int opcode, final String name) {
+			nextIs(opcode);
+			if (cursor == null) {
+				return;
+			}
+			final LabelNode actual = ((JumpInsnNode) cursor).label;
+			final LabelNode expected = labels.get(name);
+			if (expected == null) {
+				labels.put(name, actual);
+			} else if (expected != actual) {
+				cursor = null;
+			}
+		}
+
+		private void nextIsLabel(final String name) {
+			if (cursor == null) {
+				return;
+			}
+			cursor = cursor.getNext();
+			if (cursor.getType() != AbstractInsnNode.LABEL) {
+				cursor = null;
+				return;
+			}
+			final LabelNode actual = (LabelNode) cursor;
+			final LabelNode expected = labels.get(name);
+			if (expected != actual) {
+				cursor = null;
+			}
+		}
+
+	}
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilter.java
new file mode 100644
index 0000000..02ed47e
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilter.java
@@ -0,0 +1,253 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.TryCatchBlockNode;
+
+/**
+ * Filters code that javac generates for try-with-resources statement.
+ */
+public final class TryWithResourcesJavacFilter implements IFilter {
+
+	public void filter(final String className, final String superClassName,
+			final MethodNode methodNode, final IFilterOutput output) {
+		if (methodNode.tryCatchBlocks.isEmpty()) {
+			return;
+		}
+		final Matcher matcher = new Matcher(output);
+		for (TryCatchBlockNode t : methodNode.tryCatchBlocks) {
+			if ("java/lang/Throwable".equals(t.type)) {
+				for (Matcher.JavacPattern p : Matcher.JavacPattern.values()) {
+					matcher.start(t.handler);
+					if (matcher.matchJavac(p)) {
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * javac from JDK 7 and 8 generates bytecode that is equivalent to the
+	 * compilation of source code that is described in <a href=
+	 * "http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.3.1">JLS
+	 * 14.20.3. try-with-resources</a>:
+	 * 
+	 * <pre>
+	 *     Resource r = ...;
+	 *     Throwable primaryExc = null;
+	 *     try {
+	 *         ...
+	 *     } finally {
+	 *         if (r != null) {
+	 *             if (primaryExc != null) {
+	 *                 try {
+	 *                     r.close();
+	 *                 } catch (Throwable suppressedExc) {
+	 *                     primaryExc.addSuppressed(suppressedExc);
+	 *                 }
+	 *             } else {
+	 *                 r.close();
+	 *             }
+	 *         }
+	 *     }
+	 * </pre>
+	 *
+	 * Case of multiple resources looks like multiple nested try-with-resources
+	 * statements. javac from JDK 9 EA b160 does the same, but with some
+	 * optimizations (see <a href=
+	 * "https://bugs.openjdk.java.net/browse/JDK-7020499">JDK-7020499</a>):
+	 * <ul>
+	 * <li><code>null</code> check for resource is omitted when it is
+	 * initialized using <code>new</code></li>
+	 * <li>synthetic method <code>$closeResource</code> containing
+	 * <code>null</code> check of primaryExc and calls to methods
+	 * <code>addSuppressed</code> and <code>close</code> is used when number of
+	 * copies of closing logic reaches threshold, <code>null</code> check of
+	 * resource (if present) is done before call of this method</li>
+	 * </ul>
+	 * During matching association between resource and slot of variable is done
+	 * on exceptional path and is used to find close of resource on normal path.
+	 * Order of loading variables primaryExc and r is different in different
+	 * cases, which implies that this order should be determined before
+	 * association. So {@link JavacPattern} defines all possible variants that
+	 * will be tried sequentially.
+	 */
+	static class Matcher extends AbstractMatcher {
+		private final IFilterOutput output;
+
+		private String expectedOwner;
+
+		private AbstractInsnNode start;
+
+		Matcher(final IFilterOutput output) {
+			this.output = output;
+		}
+
+		private enum JavacPattern {
+			/**
+			 * resource is loaded after primaryExc, <code>null</code> check of
+			 * resource is omitted, method <code>$closeResource</code> is used
+			 */
+			OPTIMAL,
+			/**
+			 * resource is loaded before primaryExc and both are checked on
+			 * <code>null</code>
+			 */
+			FULL,
+			/**
+			 * resource is loaded after primaryExc, <code>null</code> check of
+			 * resource is omitted
+			 */
+			OMITTED_NULL_CHECK,
+			/**
+			 * resource is loaded before primaryExc and checked on
+			 * <code>null</code>, method <code>$closeResource</code> is used
+			 */
+			METHOD,
+		}
+
+		private void start(final AbstractInsnNode start) {
+			this.start = start;
+			cursor = start.getPrevious();
+			vars.clear();
+			expectedOwner = null;
+		}
+
+		private boolean matchJavac(final JavacPattern p) {
+			// "catch (Throwable t)"
+			nextIsVar(Opcodes.ASTORE, "t1");
+			// "primaryExc = t"
+			nextIsVar(Opcodes.ALOAD, "t1");
+			nextIsVar(Opcodes.ASTORE, "primaryExc");
+			// "throw t"
+			nextIsVar(Opcodes.ALOAD, "t1");
+			nextIs(Opcodes.ATHROW);
+
+			// "catch (any t)"
+			nextIsVar(Opcodes.ASTORE, "t2");
+			nextIsJavacClose(p, "e");
+			// "throw t"
+			nextIsVar(Opcodes.ALOAD, "t2");
+			nextIs(Opcodes.ATHROW);
+			if (cursor == null) {
+				return false;
+			}
+			final AbstractInsnNode end = cursor;
+
+			AbstractInsnNode startOnNonExceptionalPath = start.getPrevious();
+			cursor = startOnNonExceptionalPath;
+			while (!nextIsJavacClose(p, "n")) {
+				startOnNonExceptionalPath = startOnNonExceptionalPath
+						.getPrevious();
+				cursor = startOnNonExceptionalPath;
+				if (cursor == null) {
+					return false;
+				}
+			}
+			startOnNonExceptionalPath = startOnNonExceptionalPath.getNext();
+
+			final AbstractInsnNode m = cursor;
+			next();
+			if (cursor.getOpcode() != Opcodes.GOTO) {
+				cursor = m;
+			}
+
+			output.ignore(startOnNonExceptionalPath, cursor);
+			output.ignore(start, end);
+			return true;
+		}
+
+		/**
+		 * On a first invocation will associate variables with names "r" and
+		 * "primaryExc", on subsequent invocations will use those associations
+		 * for checks.
+		 */
+		private boolean nextIsJavacClose(final JavacPattern p,
+				final String ctx) {
+			switch (p) {
+			case METHOD:
+			case FULL:
+				// "if (r != null)"
+				nextIsVar(Opcodes.ALOAD, "r");
+				nextIs(Opcodes.IFNULL);
+			}
+			switch (p) {
+			case METHOD:
+			case OPTIMAL:
+				nextIsVar(Opcodes.ALOAD, "primaryExc");
+				nextIsVar(Opcodes.ALOAD, "r");
+				nextIs(Opcodes.INVOKESTATIC);
+				if (cursor != null) {
+					final MethodInsnNode m = (MethodInsnNode) cursor;
+					if ("$closeResource".equals(m.name)
+							&& "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V"
+							.equals(m.desc)) {
+						return true;
+					}
+					cursor = null;
+				}
+				return false;
+			case FULL:
+			case OMITTED_NULL_CHECK:
+				nextIsVar(Opcodes.ALOAD, "primaryExc");
+				// "if (primaryExc != null)"
+				nextIs(Opcodes.IFNULL);
+				// "r.close()"
+				nextIsClose();
+				nextIs(Opcodes.GOTO);
+				// "catch (Throwable t)"
+				nextIsVar(Opcodes.ASTORE, ctx + "t");
+				// "primaryExc.addSuppressed(t)"
+				nextIsVar(Opcodes.ALOAD, "primaryExc");
+				nextIsVar(Opcodes.ALOAD, ctx + "t");
+				nextIsAddSuppressed();
+				nextIs(Opcodes.GOTO);
+				// "r.close()"
+				nextIsClose();
+				return cursor != null;
+			default:
+				throw new AssertionError();
+			}
+		}
+
+		private void nextIsClose() {
+			nextIsVar(Opcodes.ALOAD, "r");
+			next();
+			if (cursor == null) {
+				return;
+			}
+			if (cursor.getOpcode() != Opcodes.INVOKEINTERFACE
+					&& cursor.getOpcode() != Opcodes.INVOKEVIRTUAL) {
+				cursor = null;
+				return;
+			}
+			final MethodInsnNode m = (MethodInsnNode) cursor;
+			if (!"close".equals(m.name) || !"()V".equals(m.desc)) {
+				cursor = null;
+				return;
+			}
+			final String actual = m.owner;
+			if (expectedOwner == null) {
+				expectedOwner = actual;
+			} else if (!expectedOwner.equals(actual)) {
+				cursor = null;
+			}
+		}
+
+	}
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/data/CRC64.java b/org.jacoco.core/src/org/jacoco/core/internal/data/CRC64.java
index 7f14572..64cb18a 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/data/CRC64.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/data/CRC64.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/data/CompactDataInput.java b/org.jacoco.core/src/org/jacoco/core/internal/data/CompactDataInput.java
index d7bf9dd..0c36c78 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/data/CompactDataInput.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/data/CompactDataInput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/data/CompactDataOutput.java b/org.jacoco.core/src/org/jacoco/core/internal/data/CompactDataOutput.java
index 2f87757..d92a3f1 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/data/CompactDataOutput.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/data/CompactDataOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesAdapter.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesAdapter.java
index cd147ed..c30b768 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesAdapter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,7 @@
  *******************************************************************************/
 package org.jacoco.core.internal.flow;
 
-import org.jacoco.core.JaCoCo;
+import org.jacoco.core.internal.instr.InstrSupport;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.commons.AnalyzerAdapter;
@@ -44,7 +44,7 @@
 	 */
 	public ClassProbesAdapter(final ClassProbesVisitor cv,
 			final boolean trackFrames) {
-		super(JaCoCo.ASM_API_VERSION, cv);
+		super(InstrSupport.ASM_API_VERSION, cv);
 		this.cv = cv;
 		this.trackFrames = trackFrames;
 	}
@@ -84,9 +84,9 @@
 							ClassProbesAdapter.this.name, access, name, desc,
 							probesAdapter);
 					probesAdapter.setAnalyzer(analyzer);
-					this.accept(analyzer);
+					methodProbes.accept(this, analyzer);
 				} else {
-					this.accept(probesAdapter);
+					methodProbes.accept(this, probesAdapter);
 				}
 			}
 		};
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesVisitor.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesVisitor.java
index d576c8d..837ff3e 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesVisitor.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/ClassProbesVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,7 @@
  *******************************************************************************/
 package org.jacoco.core.internal.flow;
 
-import org.jacoco.core.JaCoCo;
+import org.jacoco.core.internal.instr.InstrSupport;
 import org.objectweb.asm.ClassVisitor;
 
 /**
@@ -34,7 +34,7 @@
 	 *            optional next visitor in chain
 	 */
 	public ClassProbesVisitor(final ClassVisitor cv) {
-		super(JaCoCo.ASM_API_VERSION, cv);
+		super(InstrSupport.ASM_API_VERSION, cv);
 	}
 
 	/**
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/FrameSnapshot.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/FrameSnapshot.java
index c126355..3e38a61 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/FrameSnapshot.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/FrameSnapshot.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/IFrame.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/IFrame.java
index 3b94c68..ae966f2 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/IFrame.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/IFrame.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/IProbeIdGenerator.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/IProbeIdGenerator.java
index a922cdd..0d3eb11 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/IProbeIdGenerator.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/IProbeIdGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/Instruction.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/Instruction.java
index 1b08233..e41ca46 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/Instruction.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/Instruction.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,12 +11,16 @@
  *******************************************************************************/
 package org.jacoco.core.internal.flow;
 
+import org.objectweb.asm.tree.AbstractInsnNode;
+
 /**
  * Representation of a byte code instruction for analysis. Internally used for
  * analysis.
  */
 public class Instruction {
 
+	private final AbstractInsnNode node;
+
 	private final int line;
 
 	private int branches;
@@ -28,16 +32,26 @@
 	/**
 	 * New instruction at the given line.
 	 * 
+	 * @param node
+	 *            corresponding node
 	 * @param line
 	 *            source line this instruction belongs to
 	 */
-	public Instruction(final int line) {
+	public Instruction(final AbstractInsnNode node, final int line) {
+		this.node = node;
 		this.line = line;
 		this.branches = 0;
 		this.coveredBranches = 0;
 	}
 
 	/**
+	 * @return corresponding node
+	 */
+	public AbstractInsnNode getNode() {
+		return node;
+	}
+
+	/**
 	 * Adds an branch to this instruction.
 	 */
 	public void addBranch() {
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelFlowAnalyzer.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelFlowAnalyzer.java
index 157416a..a58f152 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelFlowAnalyzer.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelFlowAnalyzer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,7 @@
  *******************************************************************************/
 package org.jacoco.core.internal.flow;
 
-import org.jacoco.core.JaCoCo;
+import org.jacoco.core.internal.instr.InstrSupport;
 import org.objectweb.asm.Handle;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
@@ -62,7 +62,7 @@
 	 * Create new instance.
 	 */
 	public LabelFlowAnalyzer() {
-		super(JaCoCo.ASM_API_VERSION);
+		super(InstrSupport.ASM_API_VERSION);
 	}
 
 	@Override
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelInfo.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelInfo.java
index c6f1b76..55d84d5 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelInfo.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/LabelInfo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java
index 5081fff..cff8911 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,7 +14,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.jacoco.core.JaCoCo;
+import org.jacoco.core.internal.instr.InstrSupport;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
@@ -44,7 +44,7 @@
 	 */
 	public MethodProbesAdapter(final MethodProbesVisitor probesVisitor,
 			final IProbeIdGenerator idGenerator) {
-		super(JaCoCo.ASM_API_VERSION, probesVisitor);
+		super(InstrSupport.ASM_API_VERSION, probesVisitor);
 		this.probesVisitor = probesVisitor;
 		this.idGenerator = idGenerator;
 		this.tryCatchProbeLabels = new HashMap<Label, Label>();
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesVisitor.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesVisitor.java
index cdb721b..a509406 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesVisitor.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodProbesVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,9 +11,10 @@
  *******************************************************************************/
 package org.jacoco.core.internal.flow;
 
-import org.jacoco.core.JaCoCo;
+import org.jacoco.core.internal.instr.InstrSupport;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.tree.MethodNode;
 
 /**
  * A {@link MethodVisitor} with additional methods to get probe insertion
@@ -35,7 +36,7 @@
 	 *            optional next visitor in chain
 	 */
 	public MethodProbesVisitor(final MethodVisitor mv) {
-		super(JaCoCo.ASM_API_VERSION, mv);
+		super(InstrSupport.ASM_API_VERSION, mv);
 	}
 
 	/**
@@ -147,4 +148,20 @@
 			final int[] keys, final Label[] labels, final IFrame frame) {
 	}
 
+	/**
+	 * This method can be overwritten to hook into the process of emitting the
+	 * instructions of this method as <code>visitX()</code> events.
+	 *
+	 * @param methodNode
+	 *            the content to emit
+	 * @param methodVisitor
+	 *            A visitor to emit the content to. Note that this is not
+	 *            necessarily this visitor instance but some wrapper which
+	 *            calculates the probes.
+	 */
+	public void accept(final MethodNode methodNode,
+			final MethodVisitor methodVisitor) {
+		methodNode.accept(methodVisitor);
+	}
+
 }
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodSanitizer.java b/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodSanitizer.java
index 1400b63..d8df775 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodSanitizer.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/flow/MethodSanitizer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,7 @@
  *******************************************************************************/
 package org.jacoco.core.internal.flow;
 
-import org.jacoco.core.JaCoCo;
+import org.jacoco.core.internal.instr.InstrSupport;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.commons.JSRInlinerAdapter;
@@ -33,7 +33,7 @@
 	MethodSanitizer(final MethodVisitor mv, final int access,
 			final String name, final String desc, final String signature,
 			final String[] exceptions) {
-		super(JaCoCo.ASM_API_VERSION, mv, access, name, desc, signature,
+		super(InstrSupport.ASM_API_VERSION, mv, access, name, desc, signature,
 				exceptions);
 	}
 
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/FieldProbeArrayStrategy.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/ClassFieldProbeArrayStrategy.java
similarity index 84%
rename from org.jacoco.core/src/org/jacoco/core/internal/instr/FieldProbeArrayStrategy.java
rename to org.jacoco.core/src/org/jacoco/core/internal/instr/ClassFieldProbeArrayStrategy.java
index 6259aa3..33cf379 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/FieldProbeArrayStrategy.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/ClassFieldProbeArrayStrategy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,11 +18,11 @@
 import org.objectweb.asm.Opcodes;
 
 /**
- * The strategy for regular classes and Java 8 interfaces which adds a static
- * field to hold the probe array and a static initialization method requesting
- * the probe array from the runtime.
+ * The strategy for regular classes adds a static field to hold the probe array
+ * and a static initialization method requesting the probe array from the
+ * runtime.
  */
-class FieldProbeArrayStrategy implements IProbeArrayStrategy {
+class ClassFieldProbeArrayStrategy implements IProbeArrayStrategy {
 
 	/**
 	 * Frame stack with a single boolean array.
@@ -37,20 +37,19 @@
 	private final String className;
 	private final long classId;
 	private final boolean withFrames;
-	private final int fieldAccess;
 	private final IExecutionDataAccessorGenerator accessorGenerator;
 
-	FieldProbeArrayStrategy(final String className, final long classId,
-			final boolean withFrames, final int fieldAccess,
+	ClassFieldProbeArrayStrategy(final String className, final long classId,
+			final boolean withFrames,
 			final IExecutionDataAccessorGenerator accessorGenerator) {
 		this.className = className;
 		this.classId = classId;
 		this.withFrames = withFrames;
-		this.fieldAccess = fieldAccess;
 		this.accessorGenerator = accessorGenerator;
 	}
 
-	public int storeInstance(final MethodVisitor mv, final int variable) {
+	public int storeInstance(final MethodVisitor mv, final boolean clinit,
+			final int variable) {
 		mv.visitMethodInsn(Opcodes.INVOKESTATIC, className,
 				InstrSupport.INITMETHOD_NAME, InstrSupport.INITMETHOD_DESC,
 				false);
@@ -64,7 +63,7 @@
 	}
 
 	private void createDataField(final ClassVisitor cv) {
-		cv.visitField(fieldAccess, InstrSupport.DATAFIELD_NAME,
+		cv.visitField(InstrSupport.DATAFIELD_ACC, InstrSupport.DATAFIELD_NAME,
 				InstrSupport.DATAFIELD_DESC, null, null);
 	}
 
@@ -134,4 +133,4 @@
 		return Math.max(size, 2); // Maximum local stack size is 2
 	}
 
-}
\ No newline at end of file
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/ClassInstrumenter.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/ClassInstrumenter.java
index 6c64abe..7c5bc9c 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/ClassInstrumenter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/ClassInstrumenter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -70,7 +70,7 @@
 		}
 		final MethodVisitor frameEliminator = new DuplicateFrameEliminator(mv);
 		final ProbeInserter probeVariableInserter = new ProbeInserter(access,
-				desc, frameEliminator, probeArrayStrategy);
+				name, desc, frameEliminator, probeArrayStrategy);
 		return new MethodInstrumenter(probeVariableInserter,
 				probeVariableInserter);
 	}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/DuplicateFrameEliminator.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/DuplicateFrameEliminator.java
index b40796c..e31d563 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/DuplicateFrameEliminator.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/DuplicateFrameEliminator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,6 @@
  *******************************************************************************/
 package org.jacoco.core.internal.instr;
 
-import org.jacoco.core.JaCoCo;
 import org.objectweb.asm.Handle;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
@@ -27,7 +26,7 @@
 	private boolean instruction;
 
 	public DuplicateFrameEliminator(final MethodVisitor mv) {
-		super(JaCoCo.ASM_API_VERSION, mv);
+		super(InstrSupport.ASM_API_VERSION, mv);
 		instruction = true;
 	}
 
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/IProbeArrayStrategy.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/IProbeArrayStrategy.java
index d556940..baaffc1 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/IProbeArrayStrategy.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/IProbeArrayStrategy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -26,11 +26,13 @@
 	 * 
 	 * @param mv
 	 *            visitor to create code
+	 * @param clinit
+	 *            true in case of {@code <clinit>} method
 	 * @param variable
 	 *            variable index to store probe array to
 	 * @return maximum stack size required by the generated code
 	 */
-	int storeInstance(MethodVisitor mv, int variable);
+	int storeInstance(MethodVisitor mv, boolean clinit, int variable);
 
 	/**
 	 * Adds additional class members required by this strategy. This method is
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/IProbeInserter.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/IProbeInserter.java
index b23dea5..5f91f7e 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/IProbeInserter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/IProbeInserter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/InstrSupport.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/InstrSupport.java
index cb17ab8..c38094f 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/InstrSupport.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/InstrSupport.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,6 +24,9 @@
 	private InstrSupport() {
 	}
 
+	/** ASM API version */
+	public static final int ASM_API_VERSION = Opcodes.ASM5;
+
 	// === Data Field ===
 
 	/**
@@ -34,14 +37,37 @@
 	/**
 	 * Access modifiers of the field that stores coverage information of a
 	 * class.
+	 *
+	 * According to Java Virtual Machine Specification <a href=
+	 * "https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.putstatic">
+	 * §6.5.putstatic</a> this field must not be final:
+	 *
+	 * <blockquote>
+	 * <p>
+	 * if the field is final, it must be declared in the current class, and the
+	 * instruction must occur in the {@code <clinit>} method of the current
+	 * class.
+	 * </p>
+	 * </blockquote>
 	 */
 	public static final int DATAFIELD_ACC = Opcodes.ACC_SYNTHETIC
-			| Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_TRANSIENT
-			| Opcodes.ACC_FINAL;
+			| Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_TRANSIENT;
 
 	/**
 	 * Access modifiers of the field that stores coverage information of a Java
 	 * 8 interface.
+	 *
+	 * According to Java Virtual Machine Specification <a href=
+	 * "https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.5-200-A.3">
+	 * §4.5</a>:
+	 *
+	 * <blockquote>
+	 * <p>
+	 * Fields of interfaces must have their ACC_PUBLIC, ACC_STATIC, and
+	 * ACC_FINAL flags set; they may have their ACC_SYNTHETIC flag set and must
+	 * not have any of the other flags.
+	 * </p>
+	 * </blockquote>
 	 */
 	public static final int DATAFIELD_INTF_ACC = Opcodes.ACC_SYNTHETIC
 			| Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL;
@@ -71,6 +97,67 @@
 			| Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC;
 
 	/**
+	 * Name of the interface initialization method.
+	 *
+	 * According to Java Virtual Machine Specification <a href=
+	 * "https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.9-200">
+	 * §2.9</a>:
+	 *
+	 * <blockquote>
+	 * <p>
+	 * A class or interface has at most one class or interface initialization
+	 * method and is initialized by invoking that method. The initialization
+	 * method of a class or interface has the special name {@code <clinit>},
+	 * takes no arguments, and is void.
+	 * </p>
+	 * <p>
+	 * Other methods named {@code <clinit>} in a class file are of no
+	 * consequence. They are not class or interface initialization methods. They
+	 * cannot be invoked by any Java Virtual Machine instruction and are never
+	 * invoked by the Java Virtual Machine itself.
+	 * </p>
+	 * <p>
+	 * In a class file whose version number is 51.0 or above, the method must
+	 * additionally have its ACC_STATIC flag set in order to be the class or
+	 * interface initialization method.
+	 * </p>
+	 * <p>
+	 * This requirement was introduced in Java SE 7. In a class file whose
+	 * version number is 50.0 or below, a method named {@code <clinit>} that is
+	 * void and takes no arguments is considered the class or interface
+	 * initialization method regardless of the setting of its ACC_STATIC flag.
+	 * </p>
+	 * </blockquote>
+	 *
+	 * And <a href=
+	 * "https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.6-200-A.6">
+	 * §4.6</a>:
+	 *
+	 * <blockquote>
+	 * <p>
+	 * Class and interface initialization methods are called implicitly by the
+	 * Java Virtual Machine. The value of their access_flags item is ignored
+	 * except for the setting of the ACC_STRICT flag.
+	 * </p>
+	 * </blockquote>
+	 */
+	static final String CLINIT_NAME = "<clinit>";
+
+	/**
+	 * Descriptor of the interface initialization method.
+	 *
+	 * @see #CLINIT_NAME
+	 */
+	static final String CLINIT_DESC = "()V";
+
+	/**
+	 * Access flags of the interface initialization method generated by JaCoCo.
+	 *
+	 * @see #CLINIT_NAME
+	 */
+	static final int CLINIT_ACC = Opcodes.ACC_SYNTHETIC | Opcodes.ACC_STATIC;
+
+	/**
 	 * Ensures that the given member does not correspond to a internal member
 	 * created by the instrumentation process. This would mean that the class is
 	 * already instrumented.
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/InterfaceFieldProbeArrayStrategy.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/InterfaceFieldProbeArrayStrategy.java
new file mode 100644
index 0000000..d1e0028
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/InterfaceFieldProbeArrayStrategy.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.instr;
+
+import org.jacoco.core.runtime.IExecutionDataAccessorGenerator;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+/**
+ * This strategy for Java 8 interfaces adds a static method requesting the probe
+ * array from the runtime, a static field to hold the probe array and adds code
+ * for its initialization into interface initialization method.
+ */
+class InterfaceFieldProbeArrayStrategy implements IProbeArrayStrategy {
+
+	/**
+	 * Frame stack with a single boolean array.
+	 */
+	private static final Object[] FRAME_STACK_ARRZ = new Object[] { InstrSupport.DATAFIELD_DESC };
+
+	/**
+	 * Empty frame locals.
+	 */
+	private static final Object[] FRAME_LOCALS_EMPTY = new Object[0];
+
+	private final String className;
+	private final long classId;
+	private final int probeCount;
+	private final IExecutionDataAccessorGenerator accessorGenerator;
+
+	private boolean seenClinit = false;
+
+	InterfaceFieldProbeArrayStrategy(final String className, final long classId,
+			final int probeCount,
+			final IExecutionDataAccessorGenerator accessorGenerator) {
+		this.className = className;
+		this.classId = classId;
+		this.probeCount = probeCount;
+		this.accessorGenerator = accessorGenerator;
+	}
+
+	public int storeInstance(final MethodVisitor mv, final boolean clinit,
+			final int variable) {
+		if (clinit) {
+			final int maxStack = accessorGenerator.generateDataAccessor(classId,
+					className, probeCount, mv);
+
+			// Stack[0]: [Z
+
+			mv.visitInsn(Opcodes.DUP);
+
+			// Stack[1]: [Z
+			// Stack[0]: [Z
+
+			mv.visitFieldInsn(Opcodes.PUTSTATIC, className,
+					InstrSupport.DATAFIELD_NAME, InstrSupport.DATAFIELD_DESC);
+
+			// Stack[0]: [Z
+
+			mv.visitVarInsn(Opcodes.ASTORE, variable);
+
+			seenClinit = true;
+			return Math.max(maxStack, 2);
+		} else {
+			mv.visitMethodInsn(Opcodes.INVOKESTATIC, className,
+					InstrSupport.INITMETHOD_NAME, InstrSupport.INITMETHOD_DESC,
+					true);
+			mv.visitVarInsn(Opcodes.ASTORE, variable);
+			return 1;
+		}
+	}
+
+	public void addMembers(final ClassVisitor cv, final int probeCount) {
+		createDataField(cv);
+		createInitMethod(cv, probeCount);
+		if (!seenClinit) {
+			createClinitMethod(cv, probeCount);
+		}
+	}
+
+	private void createDataField(final ClassVisitor cv) {
+		cv.visitField(InstrSupport.DATAFIELD_INTF_ACC,
+				InstrSupport.DATAFIELD_NAME, InstrSupport.DATAFIELD_DESC, null,
+				null);
+	}
+
+	private void createInitMethod(final ClassVisitor cv, final int probeCount) {
+		final MethodVisitor mv = cv.visitMethod(InstrSupport.INITMETHOD_ACC,
+				InstrSupport.INITMETHOD_NAME, InstrSupport.INITMETHOD_DESC,
+				null, null);
+		mv.visitCode();
+
+		// Load the value of the static data field:
+		mv.visitFieldInsn(Opcodes.GETSTATIC, className,
+				InstrSupport.DATAFIELD_NAME, InstrSupport.DATAFIELD_DESC);
+		mv.visitInsn(Opcodes.DUP);
+
+		// Stack[1]: [Z
+		// Stack[0]: [Z
+
+		// Skip initialization when we already have a data array:
+		final Label alreadyInitialized = new Label();
+		mv.visitJumpInsn(Opcodes.IFNONNULL, alreadyInitialized);
+
+		// Stack[0]: [Z
+
+		mv.visitInsn(Opcodes.POP);
+		final int size = accessorGenerator.generateDataAccessor(classId,
+				className, probeCount, mv);
+
+		// Stack[0]: [Z
+
+		// Return the class' probe array:
+		mv.visitFrame(Opcodes.F_NEW, 0, FRAME_LOCALS_EMPTY, 1,
+				FRAME_STACK_ARRZ);
+		mv.visitLabel(alreadyInitialized);
+		mv.visitInsn(Opcodes.ARETURN);
+
+		mv.visitMaxs(Math.max(size, 2), 0); // Maximum local stack size is 2
+		mv.visitEnd();
+	}
+
+	private void createClinitMethod(final ClassVisitor cv,
+			final int probeCount) {
+		final MethodVisitor mv = cv.visitMethod(InstrSupport.CLINIT_ACC,
+				InstrSupport.CLINIT_NAME, InstrSupport.CLINIT_DESC, null, null);
+		mv.visitCode();
+
+		final int maxStack = accessorGenerator.generateDataAccessor(classId,
+				className, probeCount, mv);
+
+		// Stack[0]: [Z
+
+		mv.visitFieldInsn(Opcodes.PUTSTATIC, className,
+				InstrSupport.DATAFIELD_NAME, InstrSupport.DATAFIELD_DESC);
+
+		mv.visitInsn(Opcodes.RETURN);
+
+		mv.visitMaxs(maxStack, 0);
+		mv.visitEnd();
+	}
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/LocalProbeArrayStrategy.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/LocalProbeArrayStrategy.java
index 1f7785b..b70c099 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/LocalProbeArrayStrategy.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/LocalProbeArrayStrategy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -38,7 +38,8 @@
 		this.accessorGenerator = accessorGenerator;
 	}
 
-	public int storeInstance(final MethodVisitor mv, final int variable) {
+	public int storeInstance(final MethodVisitor mv, final boolean clinit,
+			final int variable) {
 		final int maxStack = accessorGenerator.generateDataAccessor(classId,
 				className, probeCount, mv);
 		mv.visitVarInsn(Opcodes.ASTORE, variable);
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/MethodInstrumenter.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/MethodInstrumenter.java
index 9d8e0da..b9173e1 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/MethodInstrumenter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/MethodInstrumenter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/NoneProbeArrayStrategy.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/NoneProbeArrayStrategy.java
index 0477113..ac67d2d 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/NoneProbeArrayStrategy.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/NoneProbeArrayStrategy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,7 +20,8 @@
  */
 class NoneProbeArrayStrategy implements IProbeArrayStrategy {
 
-	public int storeInstance(final MethodVisitor mv, final int variable) {
+	public int storeInstance(final MethodVisitor mv, final boolean clinit,
+			final int variable) {
 		throw new UnsupportedOperationException();
 	}
 
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactory.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactory.java
index e49c1d4..a537b81 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactory.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeArrayStrategyFactory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -28,7 +28,8 @@
 
 	/**
 	 * Creates a suitable strategy instance for the class described by the given
-	 * reader.
+	 * reader. Created instance must be used only to process a class or
+	 * interface for which it has been created and must be used only once.
 	 * 
 	 * @param reader
 	 *            reader to get information about the class
@@ -50,16 +51,15 @@
 				return new NoneProbeArrayStrategy();
 			}
 			if (version >= Opcodes.V1_8 && counter.hasMethods()) {
-				return new FieldProbeArrayStrategy(className, classId,
-						withFrames, InstrSupport.DATAFIELD_INTF_ACC,
-						accessorGenerator);
+				return new InterfaceFieldProbeArrayStrategy(className, classId,
+						counter.getCount(), accessorGenerator);
 			} else {
 				return new LocalProbeArrayStrategy(className, classId,
 						counter.getCount(), accessorGenerator);
 			}
 		} else {
-			return new FieldProbeArrayStrategy(className, classId, withFrames,
-					InstrSupport.DATAFIELD_ACC, accessorGenerator);
+			return new ClassFieldProbeArrayStrategy(className, classId,
+					withFrames, accessorGenerator);
 		}
 	}
 
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeCounter.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeCounter.java
index 152b735..9ed2109 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeCounter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeCounter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,6 +13,7 @@
 
 import org.jacoco.core.internal.flow.ClassProbesVisitor;
 import org.jacoco.core.internal.flow.MethodProbesVisitor;
+import org.objectweb.asm.Opcodes;
 
 /**
  * Internal class to remember the total number of probes required for a class.
@@ -30,7 +31,8 @@
 	@Override
 	public MethodProbesVisitor visitMethod(final int access, final String name,
 			final String desc, final String signature, final String[] exceptions) {
-		if (!"<clinit>".equals(name)) {
+		if (!InstrSupport.CLINIT_NAME.equals(name)
+				&& (access & Opcodes.ACC_ABSTRACT) == 0) {
 			methods = true;
 		}
 		return null;
@@ -46,8 +48,8 @@
 	}
 
 	/**
-	 * @return <code>true</code> if the class has other methods than a static
-	 *         initializer
+	 * @return <code>true</code> if the class has non-abstract methods other
+	 *         than a static initializer
 	 */
 	boolean hasMethods() {
 		return methods;
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeInserter.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeInserter.java
index f9c080f..c91df11 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeInserter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/ProbeInserter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,6 @@
  *******************************************************************************/
 package org.jacoco.core.internal.instr;
 
-import org.jacoco.core.JaCoCo;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
@@ -27,6 +26,12 @@
 
 	private final IProbeArrayStrategy arrayStrategy;
 
+	/**
+	 * <code>true</code> if method is a class or interface initialization
+	 * method.
+	 */
+	private final boolean clinit;
+
 	/** Position of the inserted variable. */
 	private final int variable;
 
@@ -37,7 +42,9 @@
 	 * Creates a new {@link ProbeInserter}.
 	 * 
 	 * @param access
-	 *            access flags of the adapted method.
+	 *            access flags of the adapted method
+	 * @param name
+	 *            the method's name
 	 * @param desc
 	 *            the method's descriptor
 	 * @param mv
@@ -46,9 +53,10 @@
 	 *            callback to create the code that retrieves the reference to
 	 *            the probe array
 	 */
-	ProbeInserter(final int access, final String desc, final MethodVisitor mv,
+	ProbeInserter(final int access, final String name, final String desc, final MethodVisitor mv,
 			final IProbeArrayStrategy arrayStrategy) {
-		super(JaCoCo.ASM_API_VERSION, mv);
+		super(InstrSupport.ASM_API_VERSION, mv);
+		this.clinit = InstrSupport.CLINIT_NAME.equals(name);
 		this.arrayStrategy = arrayStrategy;
 		int pos = (Opcodes.ACC_STATIC & access) == 0 ? 1 : 0;
 		for (final Type t : Type.getArgumentTypes(desc)) {
@@ -82,7 +90,7 @@
 
 	@Override
 	public void visitCode() {
-		accessorStackSize = arrayStrategy.storeInstance(mv, variable);
+		accessorStackSize = arrayStrategy.storeInstance(mv, clinit, variable);
 		mv.visitCode();
 	}
 
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/instr/SignatureRemover.java b/org.jacoco.core/src/org/jacoco/core/internal/instr/SignatureRemover.java
index 806f593..fc66c16 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/instr/SignatureRemover.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/instr/SignatureRemover.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/package-info.java b/org.jacoco.core/src/org/jacoco/core/package-info.java
index f1de21c..1633053 100644
--- a/org.jacoco.core/src/org/jacoco/core/package-info.java
+++ b/org.jacoco.core/src/org/jacoco/core/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/AbstractRuntime.java b/org.jacoco.core/src/org/jacoco/core/runtime/AbstractRuntime.java
index 213abe9..42505ba 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/AbstractRuntime.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/AbstractRuntime.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/AgentOptions.java b/org.jacoco.core/src/org/jacoco/core/runtime/AgentOptions.java
index c5be0a0..cf57512 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/AgentOptions.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/AgentOptions.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -21,6 +21,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.regex.Pattern;
 
 /**
  * Utility to create and parse options for the runtime agent. Options are
@@ -84,6 +85,14 @@
 	public static final String INCLBOOTSTRAPCLASSES = "inclbootstrapclasses";
 
 	/**
+	 * Specifies whether also classes without a source location should be
+	 * instrumented. Normally such classes are generated at runtime e.g. by
+	 * mocking frameworks and are therefore excluded by default. Default is
+	 * <code>false</code>.
+	 */
+	public static final String INCLNOLOCATIONCLASSES = "inclnolocationclasses";
+
+	/**
 	 * Specifies a session identifier that is written with the execution data.
 	 * Without this parameter a random identifier is created by the agent.
 	 */
@@ -105,6 +114,9 @@
 	 */
 	public static final String OUTPUT = "output";
 
+	private static final Pattern OPTION_SPLIT = Pattern
+			.compile(",(?=[a-zA-Z0-9_\\-]+=)");
+
 	/**
 	 * Possible values for {@link AgentOptions#OUTPUT}.
 	 */
@@ -178,8 +190,8 @@
 
 	private static final Collection<String> VALID_OPTIONS = Arrays.asList(
 			DESTFILE, APPEND, INCLUDES, EXCLUDES, EXCLCLASSLOADER,
-			INCLBOOTSTRAPCLASSES, SESSIONID, DUMPONEXIT, OUTPUT, ADDRESS, PORT,
-			CLASSDUMPDIR, JMX);
+			INCLBOOTSTRAPCLASSES, INCLNOLOCATIONCLASSES, SESSIONID, DUMPONEXIT,
+			OUTPUT, ADDRESS, PORT, CLASSDUMPDIR, JMX);
 
 	private final Map<String, String> options;
 
@@ -199,7 +211,7 @@
 	public AgentOptions(final String optionstr) {
 		this();
 		if (optionstr != null && optionstr.length() > 0) {
-			for (final String entry : optionstr.split(",")) {
+			for (final String entry : OPTION_SPLIT.split(optionstr)) {
 				final int pos = entry.indexOf('=');
 				if (pos == -1) {
 					throw new IllegalArgumentException(format(
@@ -351,7 +363,8 @@
 	 * Returns whether classes from the bootstrap classloader should be
 	 * instrumented.
 	 * 
-	 * @return <code>true</code> if coverage data will be written on VM exit
+	 * @return <code>true</code> if classes from the bootstrap classloader
+	 *         should be instrumented
 	 */
 	public boolean getInclBootstrapClasses() {
 		return getOption(INCLBOOTSTRAPCLASSES, false);
@@ -369,6 +382,27 @@
 	}
 
 	/**
+	 * Returns whether classes without source location should be instrumented.
+	 * 
+	 * @return <code>true</code> if classes without source location should be
+	 *         instrumented
+	 */
+	public boolean getInclNoLocationClasses() {
+		return getOption(INCLNOLOCATIONCLASSES, false);
+	}
+
+	/**
+	 * Sets whether classes without source location should be instrumented.
+	 * 
+	 * @param include
+	 *            <code>true</code> if classes without source location should be
+	 *            instrumented
+	 */
+	public void setInclNoLocationClasses(final boolean include) {
+		setOption(INCLNOLOCATIONCLASSES, include);
+	}
+
+	/**
 	 * Returns the session identifier.
 	 * 
 	 * @return session identifier
@@ -534,10 +568,6 @@
 	}
 
 	private void setOption(final String key, final String value) {
-		if (value.contains(",")) {
-			throw new IllegalArgumentException(format(
-					"Invalid character in option argument \"%s\"", value));
-		}
 		options.put(key, value);
 	}
 
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/CommandLineSupport.java b/org.jacoco.core/src/org/jacoco/core/runtime/CommandLineSupport.java
index f5238da..bc72489 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/CommandLineSupport.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/CommandLineSupport.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/IExecutionDataAccessorGenerator.java b/org.jacoco.core/src/org/jacoco/core/runtime/IExecutionDataAccessorGenerator.java
index 63f8177..86d8bb6 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/IExecutionDataAccessorGenerator.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/IExecutionDataAccessorGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/IRemoteCommandVisitor.java b/org.jacoco.core/src/org/jacoco/core/runtime/IRemoteCommandVisitor.java
index e46c4a7..6a493be 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/IRemoteCommandVisitor.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/IRemoteCommandVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/IRuntime.java b/org.jacoco.core/src/org/jacoco/core/runtime/IRuntime.java
index 4c82690..670d0f0 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/IRuntime.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/IRuntime.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java b/org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java
index 13e186a..bbe3870 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/ModifiedSystemClassRuntime.java b/org.jacoco.core/src/org/jacoco/core/runtime/ModifiedSystemClassRuntime.java
index 2a06339..e4ec31b 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/ModifiedSystemClassRuntime.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/ModifiedSystemClassRuntime.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -19,7 +19,8 @@
 import java.lang.reflect.Field;
 import java.security.ProtectionDomain;
 
-import org.jacoco.core.JaCoCo;
+import org.jacoco.core.internal.Java9Support;
+import org.jacoco.core.internal.instr.InstrSupport;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
@@ -28,7 +29,7 @@
 
 /**
  * This {@link IRuntime} implementation works with a modified system class. A
- * new static method is added to a bootstrap class that will be used by
+ * new static field is added to a bootstrap class that will be used by
  * instrumented classes. As the system class itself needs to be instrumented
  * this runtime requires a Java agent.
  */
@@ -83,7 +84,7 @@
 
 	/**
 	 * Creates a new {@link ModifiedSystemClassRuntime} using the given class as
-	 * the data container. Members are creates with internal default names. The
+	 * the data container. Member is created with internal default name. The
 	 * given class must not have been loaded before by the agent.
 	 * 
 	 * @param inst
@@ -143,8 +144,7 @@
 	}
 
 	/**
-	 * Adds the static access method and data field to the given class
-	 * definition.
+	 * Adds the static data field to the given class definition.
 	 * 
 	 * @param source
 	 *            class definition source
@@ -154,9 +154,9 @@
 	 */
 	public static byte[] instrument(final byte[] source,
 			final String accessFieldName) {
-		final ClassReader reader = new ClassReader(source);
+		final ClassReader reader = new ClassReader(Java9Support.downgradeIfRequired(source));
 		final ClassWriter writer = new ClassWriter(reader, 0);
-		reader.accept(new ClassVisitor(JaCoCo.ASM_API_VERSION, writer) {
+		reader.accept(new ClassVisitor(InstrSupport.ASM_API_VERSION, writer) {
 
 			@Override
 			public void visitEnd() {
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java b/org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java
index 08aba06..cce6960 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/RemoteControlReader.java b/org.jacoco.core/src/org/jacoco/core/runtime/RemoteControlReader.java
index cb6d518..a1175ec 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/RemoteControlReader.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/RemoteControlReader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/RemoteControlWriter.java b/org.jacoco.core/src/org/jacoco/core/runtime/RemoteControlWriter.java
index 6886e72..efc2564 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/RemoteControlWriter.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/RemoteControlWriter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java b/org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java
index 6af7065..7bb5d18 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/SystemPropertiesRuntime.java b/org.jacoco.core/src/org/jacoco/core/runtime/SystemPropertiesRuntime.java
index d2b6a62..7844d2d 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/SystemPropertiesRuntime.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/SystemPropertiesRuntime.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/URLStreamHandlerRuntime.java b/org.jacoco.core/src/org/jacoco/core/runtime/URLStreamHandlerRuntime.java
index 48610db..c208ad9 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/URLStreamHandlerRuntime.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/URLStreamHandlerRuntime.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/WildcardMatcher.java b/org.jacoco.core/src/org/jacoco/core/runtime/WildcardMatcher.java
index 56fb72c..221e6ea 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/WildcardMatcher.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/WildcardMatcher.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/runtime/package-info.java b/org.jacoco.core/src/org/jacoco/core/runtime/package-info.java
index 4930387..fad0126 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/package-info.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/tools/ExecDumpClient.java b/org.jacoco.core/src/org/jacoco/core/tools/ExecDumpClient.java
index c200f24..39fd8f3 100644
--- a/org.jacoco.core/src/org/jacoco/core/tools/ExecDumpClient.java
+++ b/org.jacoco.core/src/org/jacoco/core/tools/ExecDumpClient.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/tools/ExecFileLoader.java b/org.jacoco.core/src/org/jacoco/core/tools/ExecFileLoader.java
index 5b4e72c..b898462 100644
--- a/org.jacoco.core/src/org/jacoco/core/tools/ExecFileLoader.java
+++ b/org.jacoco.core/src/org/jacoco/core/tools/ExecFileLoader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.core/src/org/jacoco/core/tools/package-info.java b/org.jacoco.core/src/org/jacoco/core/tools/package-info.java
index 4f5c1be..b42f81a 100644
--- a/org.jacoco.core/src/org/jacoco/core/tools/package-info.java
+++ b/org.jacoco.core/src/org/jacoco/core/tools/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.doc/.gitignore b/org.jacoco.doc/.gitignore
deleted file mode 100644
index ea8c4bf..0000000
--- a/org.jacoco.doc/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/target
diff --git a/org.jacoco.doc/META-INF/MANIFEST.MF b/org.jacoco.doc/META-INF/MANIFEST.MF
deleted file mode 100644
index e6a7c84..0000000
--- a/org.jacoco.doc/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,6 +0,0 @@
-Manifest-Version: 1.0

-Bundle-ManifestVersion: 2

-Bundle-Name: JaCoCo Documentation

-Bundle-SymbolicName: org.jacoco.doc

-Bundle-Version: 0.7.5.201505241946

-Bundle-Vendor: Mountainminds GmbH & Co. KG

diff --git a/org.jacoco.doc/build.properties b/org.jacoco.doc/build.properties
deleted file mode 100644
index 58e347f..0000000
--- a/org.jacoco.doc/build.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-bin.includes = META-INF/,\

-               about.html

diff --git a/org.jacoco.doc/docroot/doc/agent.html b/org.jacoco.doc/docroot/doc/agent.html
index 0710bce..59f0cdd 100644
--- a/org.jacoco.doc/docroot/doc/agent.html
+++ b/org.jacoco.doc/docroot/doc/agent.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Java Agent</title>
 </head>
 <body>
@@ -33,7 +33,7 @@
 
 <p>
   The JaCoCo agent collects execution information and dumps it on request or
-  when the JVM exits. There are three different modes for execution data ouput:
+  when the JVM exits. There are three different modes for execution data output:
 </p>
 
 <ul>
@@ -125,6 +125,14 @@
       <td><code>false</code></td>
     </tr>
     <tr>
+      <td><code>inclnolocationclasses</code></td>
+      <td>Specifies whether also classes without a source location should be
+          instrumented. Normally such classes are generated at runtime e.g. by
+          mocking frameworks and are therefore excluded by default. 
+      </td>
+      <td><code>false</code></td>
+    </tr>
+    <tr>
       <td><code>sessionid</code></td>
       <td>A session identifier that is written with the execution data. Without
           this parameter a random identifier is created by the agent.
diff --git a/org.jacoco.doc/docroot/doc/ant.html b/org.jacoco.doc/docroot/doc/ant.html
index 74dedfa..2e463d6 100644
--- a/org.jacoco.doc/docroot/doc/ant.html
+++ b/org.jacoco.doc/docroot/doc/ant.html
@@ -3,10 +3,10 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="stylesheet" href="../coverage/.resources/prettify.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
-  <script type="text/javascript" src="../coverage/.resources/prettify.js"></script>
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="stylesheet" href="../coverage/jacoco-resources/prettify.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
+  <script type="text/javascript" src="../coverage/jacoco-resources/prettify.js"></script>
   <title>JaCoCo - Ant Tasks</title>
 </head>
 <body onload="prettyPrint()">
@@ -28,7 +28,7 @@
   <a href="#agent"><code>agent</code></a>,
   <a href="#dump"><code>dump</code></a> and
   <a href="#merge"><code>merge</code></a>. Reports in different formats are
-  creates with the <a href="#report"><code>report</code></a> task. For 
+  created with the <a href="#report"><code>report</code></a> task. For 
   <a href="offline.html">offline instrumentation</a> the task
   <a href="#instrument"><code>instrument</code></a> can be used to prepare class
   files.  
@@ -46,7 +46,7 @@
   The JaCoCo distribution contains a simple example how code coverage can be
   added to a Ant based build. The
   <a href="examples/build/build.xml">build script</a> compiles Java sources,
-  runs an simple Java programm and creates a coverage report. The complete
+  runs an simple Java program and creates a coverage report. The complete
   example is located in the <code>./doc/examples/build</code> folder of the
   distribution.
 </p>
@@ -137,7 +137,10 @@
   In addition the <code>junit</code> task should declare
   <code>forkmode="once"</code> to avoid starting a new JVM for every single test
   case and decreasing execution performance dramatically (unless this is
-  required by the nature of the test cases).
+  required by the nature of the test cases). Note that
+  <code>forkmode="perTest"</code> or <code>forkmode="perBatch"</code> should not
+  be combined with <code>append="false"</code> as the execution data file is
+  overwritten with the execution of every test.
 </p>
 
 <p>
@@ -213,6 +216,14 @@
       <td><code>false</code></td>
     </tr>
     <tr>
+      <td><code>inclnolocationclasses</code></td>
+      <td>Specifies whether also classes without a source location should be
+          instrumented. Normally such classes are generated at runtime e.g. by
+          mocking frameworks and are therefore excluded by default. 
+      </td>
+      <td><code>false</code></td>
+    </tr>
+    <tr>
       <td><code>sessionid</code></td>
       <td>A session identifier that is written with the execution data. Without
           this parameter a random identifier is created by the agent.
@@ -658,7 +669,7 @@
     <tr>
       <td><code>locale</code></td>
       <td>Locale specified as ISO code (en, fr, jp, ...) used for number
-      formating. Locale country and variant can be separated with an underscore
+      formatting. Locale country and variant can be separated with an underscore
       (de_CH).</td>
       <td><i>platform locale</i></td>
     </tr>
@@ -789,9 +800,9 @@
     <tr>
       <td><code>element</code></td>
       <td>The elements this rule applies to. Possible values are
-          <code>BUNLDE</code>, <code>PACKAGE</code>, <code>CLASS</code>,
+          <code>BUNDLE</code>, <code>PACKAGE</code>, <code>CLASS</code>,
           <code>SOURCEFILE</code> and <code>METHOD</code>.</td>
-      <td><code>BUNLDE</code></td>
+      <td><code>BUNDLE</code></td>
     </tr>
     <tr>
       <td><code>includes</code></td>
@@ -845,7 +856,7 @@
     </tr>
     <tr>
       <td><code>minimum</code></td>
-      <td>Expected minmimum value. If the minimum refers to a ratio the range is
+      <td>Expected minimum value. If the minimum refers to a ratio the range is
           from 0.0 to 1.0 where the number of decimal places will also determine
           the precision in error messages.</td>
       <td><i>none</i></td>
diff --git a/org.jacoco.doc/docroot/doc/api.html b/org.jacoco.doc/docroot/doc/api.html
index bf5f996..1cdec7a 100644
--- a/org.jacoco.doc/docroot/doc/api.html
+++ b/org.jacoco.doc/docroot/doc/api.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - API Usage Examples</title>
 </head>
 <body>
diff --git a/org.jacoco.doc/docroot/doc/build.html b/org.jacoco.doc/docroot/doc/build.html
index 8a19e73..89df34c 100644
--- a/org.jacoco.doc/docroot/doc/build.html
+++ b/org.jacoco.doc/docroot/doc/build.html
@@ -3,10 +3,10 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="stylesheet" href="../coverage/.resources/prettify.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
-  <script type="text/javascript" src="../coverage/.resources/prettify.js"></script>
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="stylesheet" href="../coverage/jacoco-resources/prettify.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
+  <script type="text/javascript" src="../coverage/jacoco-resources/prettify.js"></script>
   <title>JaCoCo - Build</title>
 </head>
 <body onload="prettyPrint()">
@@ -21,14 +21,12 @@
 <h1>Build</h1>
 
 <p>
-  The JaCoCo build is fully based on <a href="http://maven.apache.org/">Maven</a>
-  and its extension <a href="http://www.eclipse.org/tycho/">Tycho</a> to build
-  OSGi bundles based on the declations in their <code>MANIFEST.MF</code> file
-  ("manfest-first" approach). The build can be locally executed on every machine
-  with a proper <a href="environment.html">environment setup</a>. In particular
-  you need a <a href="http://maven.apache.org/">Maven 3</a> installation. 
-  Developers are encouraged to run the build before every commit to ensure
-  consistency of the source tree.
+  The JaCoCo build is based on <a href="http://maven.apache.org/">Maven</a> and
+  can be locally executed on every machine with a proper
+  <a href="environment.html">environment setup</a>. In particular you need a
+  <a href="http://maven.apache.org/">Maven 3</a> installation.  Developers are
+  encouraged to run the build before every commit to ensure consistency of the
+  source tree.
 </p>
 
 
@@ -50,7 +48,7 @@
 </p>
 
 <pre>
-  ./org.jacoco.doc/target/jacoco-<i>x.y.z.qualifier</i>.zip
+  ./jacoco/target/jacoco-<i>x.y.z.qualifier</i>.zip
 </pre>
 
 
@@ -123,6 +121,17 @@
       &lt;jdkHome&gt;/usr/lib/jvm/sun-jdk-1.8&lt;/jdkHome&gt;
     &lt;/configuration&gt;
   &lt;/toolchain&gt;
+  &lt;toolchain&gt;
+    &lt;type&gt;jdk&lt;/type&gt;
+    &lt;provides&gt;
+      &lt;id&gt;java19&lt;/id&gt;
+      &lt;version&gt;1.9&lt;/version&gt;
+      &lt;vendor&gt;sun&lt;/vendor&gt;
+    &lt;/provides&gt;
+    &lt;configuration&gt;
+      &lt;jdkHome&gt;/usr/lib/jvm/sun-jdk-1.9&lt;/jdkHome&gt;
+    &lt;/configuration&gt;
+  &lt;/toolchain&gt;
 &lt;/toolchains&gt;
 </pre>
 
@@ -143,6 +152,14 @@
 </pre>
 
 <p>
+  Also Eclipse Compiler for Java can be used for compilation:
+</p>
+
+<pre>
+  mvn clean install -Decj
+</pre>
+
+<p>
   In addition JaCoCo can be compiled for higher class file versions than 1.5
   specifying the property <code>bytecode.version</code>. Note that in this case
   the version of the JVM running Maven must be at least the version of the
@@ -155,6 +172,8 @@
   <li>Maven with 1.6 JDK: <code>mvn clean install -Djdk.version=1.6 -Dbytecode.version=1.6</code></li>
   <li>Maven with 1.7 JDK: <code>mvn clean install -Djdk.version=1.7 -Dbytecode.version=1.7</code></li>
   <li>Maven with 1.8 JDK: <code>mvn clean install -Djdk.version=1.8 -Dbytecode.version=1.8</code></li>
+  <li>Maven with 1.8 JDK: <code>mvn clean install -Djdk.version=1.8 -Dbytecode.version=1.8 -Decj</code></li>
+  <li>Maven with 1.9 JDK: <code>mvn clean install -Djdk.version=1.9 -Dbytecode.version=1.9</code></li>
 </ul>
 
 
diff --git a/org.jacoco.doc/docroot/doc/changes.html b/org.jacoco.doc/docroot/doc/changes.html
index 8aa1f20..8d2e4f8 100644
--- a/org.jacoco.doc/docroot/doc/changes.html
+++ b/org.jacoco.doc/docroot/doc/changes.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Change History</title>
 </head>
 <body>
@@ -18,6 +18,179 @@
 
 <h1>Change History</h1>
 
+<h2>Snapshot Build @qualified.bundle.version@ (@build.date@)</h2>
+
+<h3>New Features</h3>
+<ul>
+  <li>Exclude from a report enum methods <code>valueOf</code> and <code>values</code>
+      that are created by compiler
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/491">#491</a>).</li>
+  <li>Exclude from a report a part of bytecode that compiler generates for a
+      synchronized statement
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/501">#501</a>).</li>
+  <li>Exclude from a report a part of bytecode that compiler generates for a
+      try-with-resources statement
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/500">#500</a>).</li>
+  <li>Exclude from a report methods which are annotated with <code>@lombok.Generated</code>.
+      Initial analysis and contribution by Rüdiger zu Dohna.
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/513">#513</a>).</li>
+  <li>Exclude from a report private empty constructors that do not have arguments
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/529">#529</a>).</li>
+  <li>Maven aggregated reports will now also include modules of runtime dependencies
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/498">#498</a>).</li>
+</ul>
+
+<h3>Non-functional Changes</h3>
+<ul>
+  <li>More information about context is provided when unable to read input during
+      instrumentation
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/527">#527</a>).</li>
+</ul>
+
+<h2>Release 0.7.9 (2017/02/05)</h2>
+
+<h3>Fixed Bugs</h3>
+<ul>
+  <li>"<code>java.lang.ClassFormatError: Short length on BootstrapMethods in class file</code>"
+      caused by bug in ASM library
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/462">#462</a>).</li>
+  <li>Do not recompute frames in case of large methods, otherwise
+      <code>java.lang.ClassNotFoundException</code> might be thrown
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/177">#177</a>).</li>
+  <li><code>ExecutionDataWriter.FORMAT_VERSION</code> is not a compile-time constant
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/474">#474</a>).</li>
+  <li>Maven goal "prepare-agent" should not overwrite existing property value if execution was skipped
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/486">#486</a>).</li>
+</ul>
+
+<h3>API Changes</h3>
+<ul>
+  <li><code>JaCoCo.ASM_API_VERSION</code> removed
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/474">#474</a>).</li>
+</ul>
+
+<h3>Non-functional Changes</h3>
+<ul>
+  <li>JaCoCo now depends on ASM 5.2.</li>
+  <li>OSGi metadata now generated automatically and additionally include
+      <code>uses</code> directives, <code>Require-Capability</code> attribute,
+      and export of all internal packages with <code>x-internal:=true</code> directive
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/211">#211</a>).</li>
+  <li>Removed OSGi attributes that were mistakenly added in version 0.6.1 into
+      <code>jacocoant.jar</code> that contains all dependencies
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/211">#211</a>).</li>
+</ul>
+
+<h2>Release 0.7.8 (2016/12/09)</h2>
+
+<h3>New Features</h3>
+<ul>
+  <li>User property <code>jacoco.dataFile</code> for parameter <code>dataFile</code>
+      of Maven <code>report</code> goal
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/322">#322</a>).</li>
+</ul>
+
+<h3>Fixed Bugs</h3>
+<ul>
+  <li>Use <code>RoundingMode#FLOOR</code> instead of
+      <code>RoundingMode#HALF_EVEN</code> for percentages in HTML report, so that
+      "99.5" is displayed as "99%", not as "100%"
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/452">#452</a>).</li>
+  <li>Do not add useless members into Java 8 interfaces that have only interface
+      initialization and abstract methods
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/441">#441</a>).</li>
+  <li>Fix instrumentation to not violate Java Virtual Machine Specification regarding
+      initialization of final fields, otherwise <code>IllegalAccessError</code>
+      will be thrown starting from OpenJDK 9 EA b127
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/434">#434</a>).</li>
+  <li>Fix instrumentation of interfaces with default methods to not create incorrect
+      constant pool entries, which lead to <code>IncompatibleClassChangeError</code>
+      starting from OpenJDK 9 EA b122
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/428">#428</a>).</li>
+  <li>Add Maven goal <code>report-aggregate</code> to lifecycle-mapping-metadata.xml
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/427">#427</a>).</li>
+</ul>
+
+<h3>Non-functional Changes</h3>
+<ul>
+  <li>Released JaCoCo JARs are not signed any more. Signed versions of JaCoCo are
+      now available from the Eclipse Orbit project
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/466">#466</a>).</li>
+  <li>Simplified numbering of versions - JaCoCo JARs in Maven Central repository
+      do not have qualifier any more
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/468">#468</a>).</li>
+</ul>
+
+<h2>Release 0.7.7 (2016/06/06)</h2>
+
+<h3>New Features</h3>
+<ul>
+  <li>New Maven goal <code>report-aggregate</code> to create reports for
+      multi-module projects
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/388">#388</a>).</li>
+  <li>New parameters <code>title</code> and <code>footer</code> for Maven
+      reporting goals allow customization of generated reports.</li>
+  <li>Renamed "dot" resources in generated HTML reports to become more web
+      hosting friendly
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/401">#401</a>).</li>
+  <li>Experimental support for Java 9 class files
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/406">#406</a>).</li>
+</ul>
+
+<h3>Fixed Bugs</h3>
+<ul>
+  <li>Don't suppress EOF errors in case of truncated execution data files
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/397">#397</a>).</li>
+</ul>
+
+<h3>Non-functional Changes</h3>
+<ul>
+  <li>JaCoCo now depends on ASM 5.1.</li>
+  <li>Empty probe arrays are not written to execution data files any more. This
+      reduces exec file size significantly for per-test data dumps.
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/387">#387</a>).</li>
+  <li>More information about context is provided when unable to read input during
+      analysis.
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/400">#400</a>).</li>
+  <li>Require at least Maven 3.0 for build of JaCoCo.</li>
+</ul>
+
+
+<h2>Release 0.7.6 (2016/02/18)</h2>
+
+<h3>New Features</h3>
+<ul>
+  <li>New agent option <code>inclnolocationclasses</code> to support execution
+      environments like Android where no source location is provided with classes
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/288">#288</a>).</li>
+  <li>Improved error message in case of incompatible execution data files.
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/319">#319</a>).</li>
+  <li>Command line agent options now supports comma in file names. Contributed
+      by Jochen Berger.
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/358">#358</a>).</li>
+</ul>
+
+<h3>Fixed Bugs</h3>
+<ul>
+  <li>Fix <code>MBeanClient</code> example
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/333">#333</a>).</li>
+  <li>Avoid <code>ConcurrentModificationException</code> during shutdown
+      (GitHub <a href="https://github.com/jacoco/jacoco/issues/364">#364</a>).</li>
+</ul>
+
+<h3>API Changes</h3>
+<ul>
+  <li>In case of incompatible execution data formats read from another JaCoCo
+  version <code>ExecutionDataReader.read()</code> now throws a 
+  <code>IncompatibleExecDataVersionException</code>.</li>
+</ul>
+
+<h3>Non-functional Changes</h3>
+<ul>
+  <li>JaCoCo now depends on ASM 5.0.4.</li>
+</ul>
+
+
 <h2>Release 0.7.5 (2015/05/24)</h2>
 
 <h3>New Features</h3>
diff --git a/org.jacoco.doc/docroot/doc/classids.html b/org.jacoco.doc/docroot/doc/classids.html
index b59fec2..10394ee 100644
--- a/org.jacoco.doc/docroot/doc/classids.html
+++ b/org.jacoco.doc/docroot/doc/classids.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Class Ids</title>
 </head>
 <body>
diff --git a/org.jacoco.doc/docroot/doc/conventions.html b/org.jacoco.doc/docroot/doc/conventions.html
index d357e63..a3e7190 100644
--- a/org.jacoco.doc/docroot/doc/conventions.html
+++ b/org.jacoco.doc/docroot/doc/conventions.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Development Conventions</title>
 </head>
 <body>
@@ -26,8 +26,14 @@
 <h2>Consistent Source Tree</h2>
 
 <p>
-  Update your sources and run the build locally before every check-in. Commit
-  only if the build succeeds.  
+  Follow the existing coding style and formatting rules. The projects contain
+  auto-formatting rules for the Eclipse IDE.
+</p>
+
+<p>
+  Update your local branches and run the build locally before every push. Push
+  only if the build succeeds and the configured compiler settings do not show
+  any warnings in the Eclipse IDE.
 </p>
 
 <p>
@@ -38,7 +44,7 @@
 </p>
 
 <ul>
-  <li>Corresponding JavaDoc.</li>
+  <li>Corresponding JavaDoc, every public type and member requires JavaDoc.</li>
   <li>Documentation referring to the modified concepts, interfaces or
     implementation.</li>
   <li>New features, bug fixes and modified behavior should be enlisted in the
@@ -129,6 +135,41 @@
   </li>
 </ul>
 
+<h2>Contribution process</h2>
+
+<p>
+  All changes on the JaCoCo code base are handled via
+  <a href="https://github.com/jacoco/jacoco/pulls">GitHub pull requests</a> and
+  always reviewed by a second developer. This applies for external contributors
+  as well as for project members. Beside functional correctness every pull
+  request needs to fulfill the conventions above.
+</p>
+
+<p>
+  For external contributors the following recommendations will help the project
+  to incorporate their precious work:
+</p>
+
+<ul>
+  <li>
+    <b>Get in touch</b>: Before you start a bigger contribution
+    please get in touch through our <a href="support.html">mailing list</a> to
+    make sure the JaCoCo project considers this in scope and the approach fits
+    in the overall architecture.
+  </li>
+  <li>
+    <b>Clear scope</b>: We track and review every semantical change through a
+    separate pull request. Pull requests handling various topics ("I fixed this
+    and that") are typically difficult in handling and are therefore declined.
+  </li>
+  <li>
+    <b>No technical debt</b>: We are committed to maintain JaCoCo in the long
+    run with on a high quality level. Therefore we will not accept contributions
+    as long as they add technical debt to the project (e.g. lack of tests or
+    design issues).
+  </li>
+</ul>
+
 </div>
 <div class="footer">
   <span class="right"><a href="@jacoco.home.url@">JaCoCo</a> @qualified.bundle.version@</span>
diff --git a/org.jacoco.doc/docroot/doc/counters.html b/org.jacoco.doc/docroot/doc/counters.html
index a46a66f..8e2e219 100644
--- a/org.jacoco.doc/docroot/doc/counters.html
+++ b/org.jacoco.doc/docroot/doc/counters.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Coverage Counter</title>
 </head>
 <body>
diff --git a/org.jacoco.doc/docroot/doc/empty.html b/org.jacoco.doc/docroot/doc/empty.html
index 1061871..ad73399 100644
--- a/org.jacoco.doc/docroot/doc/empty.html
+++ b/org.jacoco.doc/docroot/doc/empty.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - XXX TITLE XXX</title>
 </head>
 <body>
diff --git a/org.jacoco.doc/docroot/doc/environment.html b/org.jacoco.doc/docroot/doc/environment.html
index 1e6da54..33df73a 100644
--- a/org.jacoco.doc/docroot/doc/environment.html
+++ b/org.jacoco.doc/docroot/doc/environment.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Development Environment</title>
 </head>
 <body>
@@ -18,19 +18,34 @@
 
 <h1>Development Environment</h1>
 
+<h2>Project Hosting</h2>
+
 <p>
-  JaCoCo is currently hosted at
-  <a href="https://github.com/jacoco/jacoco">GitHub</a>. This document provides
-  an overview of the local and shared tools used for JaCoCo development.
+  The JaCoCo project is hosted on
+  <a href="https://github.com/jacoco/jacoco">GitHub</a> and can be cloned from
+  this URL:
 </p>
 
+<pre>
+  https://github.com/jacoco/jacoco.git
+</pre>
+
+<p>
+  We also track all
+  <a href="https://github.com/jacoco/jacoco/issues">issues</a> and
+  <a href="https://github.com/jacoco/jacoco/pulls">pull requests</a>
+  on the GitHub project.
+</p>
+
+
 <h3>IDE</h3>
 
 <p>
   JaCoCo development is done with the latest version of
   <a href="http://www.eclipse.org/">Eclipse</a>. Please make sure to install
   the <a href="http://www.eclipse.org/m2e/">m2e plug-in</a> to get all
-  dependencies resolved properly.
+  dependencies resolved properly. The source tree is organized as a list of
+  Eclipse projects that can be imported in a Eclipse workspace.
 </p>
 
 <p>  
@@ -43,70 +58,64 @@
   <li><code>org.jacoco.core.test</code></li>
 </ul>
 
+<p>
+  These settings specify various compiler warnings and the standard Eclipse
+  source formatting rules.
+</p>
+
 <h3>JRE/JDK</h3>
 
 <p>
-  The minimum JRE version to execute JaCoCo is Java 1.5. To guarantee
+  The minimum supported JRE version for JaCoCo is Java 1.5. To guarantee
   compatibility JaCoCo builds should always be executed against Java 1.5 JDK. In
-  addition we run builds with 1.6, 1.7 and 1.8 JDKs. 
+  addition we run builds with 1.6, 1.7, 1.8 and 1.9 JDKs.
 </p>
 
 <h3>Build</h3>
 
 <p>
   The JaCoCo build is based on <a href="http://maven.apache.org/">Maven 3</a>.
-  We have a <a href="https://jacoco.ci.cloudbees.com/">continuous build</a>
-  which is kindly provided by <a href="http://www.cloudbees.com/">CloudBees</a>.
-  Continuous builds from the master branch are directly published to the
-  <a href="repo.html">snapshot repository</a>.
+  See the <a href="build.html">build description</a> for details.
 </p>
 
+<h3>Continuous Integration</h3>
+
 <p>
-  We do also use
-  <a href="http://nemo.sonarqube.org/dashboard/index/org.jacoco:org.jacoco.build">continuous inspection</a>
-  with <a href="http://www.sonarqube.org/">SonarQube</a>.
+  We have a list of CI tools directly integrated with our source repository:
 </p>
 
-<h3>Source Rules</h3>
-
 <ul>
-  <li>
-    <b>Encoding:</b> All source files and HTML documents are encoded in UTF-8
-    unless an alternative encoding is required by the file format specification.
-    For example Java property files are always encoded in ISO-8859-1.
-  </li>
-  <li>
-    <b>Formatting:</b> The Eclipse project settings define auto-formatter
-    settings for all Java classes. Make sure you apply the Eclipse formatter to
-    source files before committing.
-  </li>
-  <li>
-    <b>Warnings:</b> The Eclipse project settings define several compiler
-    warnings. JaCoCo projects must not show any Eclipse warnings.
-  </li>
+  <li><a href="https://travis-ci.org/jacoco/jacoco/">Travis CI</a></li>
+  <li><a href="https://ci.appveyor.com/project/JaCoCo/jacoco">AppVeyor</a></li>
 </ul>
 
-<h3>Source Control</h3>
-
 <p>
-  The JaCoCo source code is maintained in a Git repository at
-  <a href="https://github.com/jacoco/jacoco">GitHub</a> and can be cloned from
+  CI builds run for master and every pull request.
 </p>
 
-<pre>
-  https://github.com/jacoco/jacoco.git
-</pre>
+<h3>Development Build Artifacts</h3>
 
 <p>
-  The source tree is organized as a plain list of Eclipse projects that can be
-  imported in a Eclipse workspace.
+  Beside the <a href="http://search.maven.org/#search|ga|1|g%3Aorg.jacoco"> JaCoCo releases</a>
+  the following build artifacts are automatically available during the
+  development cycle:
 </p>
 
-<h3>Issue Tracking</h3>
+<ul>
+  <li><b>Master:</b> The current master is available through the Maven
+    <a href="repo.html">snapshot repository</a>.</li>
+  <li><b>Pull Requests:</b> For every pull request the
+    <a href="https://ci.appveyor.com/project/JaCoCo/jacoco">AppVeyor builds</a>
+    provide the corresponding all-in-one zip for download. To access the
+    artifacts follow the check <code>continuous-integration/appveyor/branch</code>
+    on the corresponding GitHub pull request page.</li>
+</ul>
+
+<h3>Continuous Inspection</h3>
 
 <p>
-  This GitHub <a href="https://github.com/jacoco/jacoco/issues">issue tracker</a>
-  is used for bug and enhancement tracking.
+  We track quality issues with our source code with
+  <a href="http://nemo.sonarqube.org/dashboard/index/org.jacoco:org.jacoco.build">SonarQube</a>.
 </p>
 
 <h3>Communication</h3>
diff --git a/org.jacoco.doc/docroot/doc/epl-v10.html b/org.jacoco.doc/docroot/doc/epl-v10.html
index 5709a8e..c6a49b5 100644
--- a/org.jacoco.doc/docroot/doc/epl-v10.html
+++ b/org.jacoco.doc/docroot/doc/epl-v10.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Eclipse Public License - Version 1.0</title>
 <style type="text/css">
   p.list {
diff --git a/org.jacoco.doc/docroot/doc/faq.html b/org.jacoco.doc/docroot/doc/faq.html
index 62d8114..5c5275a 100644
--- a/org.jacoco.doc/docroot/doc/faq.html
+++ b/org.jacoco.doc/docroot/doc/faq.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - FAQ</title>
 </head>
 <body>
@@ -141,6 +141,29 @@
   <code>-Xshareclasses:none</code>.
 </p>
 
+<h3>Why do I get an error "<code>ClassNotFoundException: org.jacoco.agent[...]Offline</code>"?</h3>
+<p>
+  If you use <a href="offline.html">offline instrumentation</a> the instrumented
+  classes get a direct dependency on the JaCoCo runtime. Therefore
+  <code>jacocoagent.jar</code> of the same JaCoCo version must be on the
+  classpath and accessible from by the instrumented classes. 
+</p>
+
+<h3>Why do I get a <code>StackOverflowError</code> during code coverage analysis?</h3>
+<p>
+  There are two known reasons for this:
+</p>
+<ul>
+  <li>Misconfiguration: If you configure two JaCoCo agents of different releases
+      they will instrument each other and cause a endless recursion. Check the
+      effective java command line and avoid such configurations.</li>
+  <li>Heavy stack usage: JaCoCo instrumentation adds a small runtime overhead
+      by adding a local variable to each method. If your application is already
+      close to the maximum stack size this can eventually lead to an
+      <code>StackOverflowError</code>. Increase the maximum java stack size with
+      the <code>-Xss</code> JVM option.</li>
+</ul>
+
 </div>
 <div class="footer">
   <span class="right"><a href="@jacoco.home.url@">JaCoCo</a> @qualified.bundle.version@</span>
diff --git a/org.jacoco.doc/docroot/doc/flow.html b/org.jacoco.doc/docroot/doc/flow.html
index 98678bb..b73c070 100644
--- a/org.jacoco.doc/docroot/doc/flow.html
+++ b/org.jacoco.doc/docroot/doc/flow.html
@@ -3,10 +3,10 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="stylesheet" href="../coverage/.resources/prettify.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
-  <script type="text/javascript" src="../coverage/.resources/prettify.js"></script>
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="stylesheet" href="../coverage/jacoco-resources/prettify.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
+  <script type="text/javascript" src="../coverage/jacoco-resources/prettify.js"></script>
   <title>JaCoCo - Control Flow Analysis</title>
 </head>
 <body onload="prettyPrint()">
@@ -77,7 +77,7 @@
   example is shown in the left box of this diagram:
 </p>
 
-<img src=".resources/flow-example.png" alt="Bytecode Control Flow"/>
+<img src="resources/flow-example.png" alt="Bytecode Control Flow"/>
 
 
 <h3>Flow Edges</h3>
@@ -208,8 +208,8 @@
   <tbody>
     <tr>
       <td>SEQUENCE</td>
-      <td><img src=".resources/flow-sequence.png" alt="Sequence"/></td>
-      <td><img src=".resources/flow-sequence-probe.png" alt="Sequence with Probe"/></td>
+      <td><img src="resources/flow-sequence.png" alt="Sequence"/></td>
+      <td><img src="resources/flow-sequence-probe.png" alt="Sequence with Probe"/></td>
       <td>
         In case of a simple sequence the probe is simply inserted between the
         two instructions. 
@@ -217,8 +217,8 @@
     </tr>
     <tr>
       <td>JUMP (unconditional)</td>
-      <td><img src=".resources/flow-goto.png" alt="Unconditional Jump"/></td>
-      <td><img src=".resources/flow-goto-probe.png" alt="Unconditional Jump with Probe"/></td>
+      <td><img src="resources/flow-goto.png" alt="Unconditional Jump"/></td>
+      <td><img src="resources/flow-goto-probe.png" alt="Unconditional Jump with Probe"/></td>
       <td>
         As an unconditional jump is executed in any case, we can also insert the
         probe just before the GOTO instruction.
@@ -226,8 +226,8 @@
     </tr>
     <tr>
       <td>JUMP (conditional)</td>
-      <td><img src=".resources/flow-cond.png" alt="Conditional Jump"/></td>
-      <td><img src=".resources/flow-cond-probe.png" alt="Conditional Jump with Probe"/></td>
+      <td><img src="resources/flow-cond.png" alt="Conditional Jump"/></td>
+      <td><img src="resources/flow-cond-probe.png" alt="Conditional Jump with Probe"/></td>
       <td>
         Adding a probe to an conditional jump is little bit more tricky. We
         invert the semantic of the opcode and add the probe right after the
@@ -239,8 +239,8 @@
     </tr>
     <tr>
       <td>EXIT</td>
-      <td><img src=".resources/flow-exit.png" alt="Exit"/></td>
-      <td><img src=".resources/flow-exit-probe.png" alt="Exit with Probe"/></td>
+      <td><img src="resources/flow-exit.png" alt="Exit"/></td>
+      <td><img src="resources/flow-exit-probe.png" alt="Exit with Probe"/></td>
       <td>
         As is is the nature of RETURN and THROW statements to actually leave the
         method we add the probe right before these statements.
diff --git a/org.jacoco.doc/docroot/doc/implementation.html b/org.jacoco.doc/docroot/doc/implementation.html
index 72175d5..bea6f73 100644
--- a/org.jacoco.doc/docroot/doc/implementation.html
+++ b/org.jacoco.doc/docroot/doc/implementation.html
@@ -3,10 +3,10 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="stylesheet" href="../coverage/.resources/prettify.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
-  <script type="text/javascript" src="../coverage/.resources/prettify.js"></script>
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="stylesheet" href="../coverage/jacoco-resources/prettify.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
+  <script type="text/javascript" src="../coverage/jacoco-resources/prettify.js"></script>
   <title>JaCoCo - Implementation Design</title>
 </head>
 <body onload="prettyPrint()">
@@ -47,7 +47,7 @@
   diagram gives an overview with the techniques used by JaCoCo highlighted:
 </p>
 
-<img src=".resources/implementation.png" alt="Coverage Implementation Techniques"/>
+<img src="resources/implementation.png" alt="Coverage Implementation Techniques"/>
 
 <p>
   Byte code instrumentation is very fast, can be implemented in pure Java and
@@ -215,7 +215,7 @@
 <p>
   The current JaCoCo Java agent implementation uses the 
   <code>ModifiedSystemClassRuntime</code> adding a field to the class
-  <code>java.sql.Types</code>.
+  <code>java.util.UUID</code>.
 </p>
 
 
diff --git a/org.jacoco.doc/docroot/doc/index.html b/org.jacoco.doc/docroot/doc/index.html
index 1929b8f..4de1a58 100644
--- a/org.jacoco.doc/docroot/doc/index.html
+++ b/org.jacoco.doc/docroot/doc/index.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Documentation</title>
 </head>
 <body>
diff --git a/org.jacoco.doc/docroot/doc/integrations.html b/org.jacoco.doc/docroot/doc/integrations.html
index 75cbdcf..992417c 100644
--- a/org.jacoco.doc/docroot/doc/integrations.html
+++ b/org.jacoco.doc/docroot/doc/integrations.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Integration Matrix</title>
 </head>
 <body>
@@ -76,6 +76,14 @@
       <td>Java EE testing framework, <a href="http://arquillian.org/modules/jacoco-extension/">JaCoCo extension</a></td>
     </tr>
     <tr>
+      <td><a href="https://codecov.io/">Codecov</a></td>
+      <td>Web service to track code coverage, see <a href="https://github.com/codecov/example-java">example</a></td>
+    </tr>
+    <tr>
+      <td><a href="https://coveralls.io/">Coveralls</a></td>
+      <td>Web service to track code coverage, see <a href="https://github.com/trautonen/coveralls-maven-plugin">coveralls-maven-plugin</a></td>
+    </tr>
+    <tr>
       <td><a href="http://www.gradle.org/">Gradle</a></td>
       <td>Build System with JaCoCo plug-in, see <a href="http://www.gradle.org/docs/current/userguide/jacoco_plugin.html">documentation</a></td>
     </tr>
@@ -92,6 +100,10 @@
       <td>GSoC project of Ognjen Bubalo, see <a href="https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin">documentation</a></td>
     </tr>
     <tr>
+      <td><a href="http://java.visualstudio.com/">Visual Studio Team Services</a></td>
+      <td>Cloud-powered collaboration tools by Microsoft, see <a href="https://blogs.msdn.microsoft.com/visualstudioalm/2015/11/24/testing-java-applications-with-visual-studio-team-services/">blog entry</a></td>
+    </tr>
+    <tr>
       <td><a href="http://netbeans.org/">NetBeans</a></td>
       <td>Since version 7.2, see <a href="http://wiki.netbeans.org/MavenCodeCoverage">documentation</a>,
           <a href="http://plugins.netbeans.org/plugin/48570/tikione-jacocoverage">plug-in</a> for Ant based projects</td>
@@ -102,7 +114,7 @@
     </tr>
     <tr>
       <td><a href="http://www.sonarqube.org/">SonarQube</a></td>
-      <td>Continuous inspection platform with JaCoCo support, see <a href="http://docs.codehaus.org/display/SONAR/Code+Coverage+by+Unit+Tests+for+Java+Project">documentation</a></td>
+      <td>Continuous inspection platform with JaCoCo support, see <a href="http://docs.sonarqube.org/display/PLUG/Code+Coverage+by+Unit+Tests+for+Java+Project">documentation</a></td>
     </tr>
     <tr>
       <td><a href="http://www.jetbrains.com/teamcity/">TeamCity</a></td>
diff --git a/org.jacoco.doc/docroot/doc/license.html b/org.jacoco.doc/docroot/doc/license.html
index 52f548a..f5717d8 100644
--- a/org.jacoco.doc/docroot/doc/license.html
+++ b/org.jacoco.doc/docroot/doc/license.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - License</title>
 </head>
 <body>
diff --git a/org.jacoco.doc/docroot/doc/maven.html b/org.jacoco.doc/docroot/doc/maven.html
index 8e786c5..0546c1b 100644
--- a/org.jacoco.doc/docroot/doc/maven.html
+++ b/org.jacoco.doc/docroot/doc/maven.html
@@ -3,10 +3,10 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="stylesheet" href="../coverage/.resources/prettify.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
-  <script type="text/javascript" src="../coverage/.resources/prettify.js"></script>
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="stylesheet" href="../coverage/jacoco-resources/prettify.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
+  <script type="text/javascript" src="../coverage/jacoco-resources/prettify.js"></script>
   <title>JaCoCo - Maven Plug-in</title>
 </head>
 <body onload="prettyPrint()">
@@ -103,6 +103,33 @@
 mvn help:describe -Dplugin=org.jacoco:jacoco-maven-plugin -Ddetail
 </pre>
 
+<p>
+  Usage of plugin together with <tt>maven-site-plugin</tt> without
+  <a href="https://maven.apache.org/plugins/maven-site-plugin/examples/configuring-reports.html#Selecting_Reports_from_a_Plugin:_Configuring_Report_Sets">explicit selection of reports</a>
+  might lead to generation of redundant aggregate reports.
+  Specify <tt>reportSets</tt> explicitly to avoid this:
+</p>
+<pre class="source lang-xml linenums">
+&lt;project&gt;
+  &lt;reporting&gt;
+    &lt;plugins&gt;
+      &lt;plugin&gt;
+        &lt;groupId&gt;org.jacoco&lt;/groupId&gt;
+        &lt;artifactId&gt;jacoco-maven-plugin&lt;/artifactId&gt;
+        &lt;reportSets&gt;
+          &lt;reportSet&gt;
+            &lt;reports&gt;
+              &lt;!-- select non-aggregate reports --&gt;
+              &lt;report&gt;report&lt;/report&gt;
+            &lt;/reports&gt;
+          &lt;/reportSet&gt;
+        &lt;/reportSets&gt;
+      &lt;/plugin&gt;
+    &lt;/plugins&gt;
+  &lt;/reporting&gt;
+&lt;/project&gt;
+</pre>
+
 <h2>Goals</h2>
 
 <p>
@@ -116,6 +143,7 @@
   <li><a href="merge-mojo.html">merge</a></li>
   <li><a href="report-mojo.html">report</a></li>
   <li><a href="report-integration-mojo.html">report-integration</a></li>
+  <li><a href="report-aggregate-mojo.html">report-aggregate</a></li>
   <li><a href="check-mojo.html">check</a></li>
   <li><a href="dump-mojo.html">dump</a></li>
   <li><a href="instrument-mojo.html">instrument</a></li>
diff --git a/org.jacoco.doc/docroot/doc/mission.html b/org.jacoco.doc/docroot/doc/mission.html
index ed50f83..d4ce146 100644
--- a/org.jacoco.doc/docroot/doc/mission.html
+++ b/org.jacoco.doc/docroot/doc/mission.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Mission</title>
 </head>
 <body>
diff --git a/org.jacoco.doc/docroot/doc/offline.html b/org.jacoco.doc/docroot/doc/offline.html
index 9b39038..1621137 100644
--- a/org.jacoco.doc/docroot/doc/offline.html
+++ b/org.jacoco.doc/docroot/doc/offline.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Offline Instrumentation</title>
 </head>
 <body>
diff --git a/org.jacoco.doc/docroot/doc/repo.html b/org.jacoco.doc/docroot/doc/repo.html
index f7cdd9e..b95d7f6 100644
--- a/org.jacoco.doc/docroot/doc/repo.html
+++ b/org.jacoco.doc/docroot/doc/repo.html
@@ -3,10 +3,10 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="stylesheet" href="../coverage/.resources/prettify.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
-  <script type="text/javascript" src="../coverage/.resources/prettify.js"></script>
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="stylesheet" href="../coverage/jacoco-resources/prettify.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
+  <script type="text/javascript" src="../coverage/jacoco-resources/prettify.js"></script>
   <title>JaCoCo - Maven Repository</title>
 </head>
 <body onload="prettyPrint()">
diff --git a/org.jacoco.doc/docroot/doc/.resources/doc.css b/org.jacoco.doc/docroot/doc/resources/doc.css
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/doc.css
rename to org.jacoco.doc/docroot/doc/resources/doc.css
diff --git a/org.jacoco.doc/docroot/doc/.resources/extern.gif b/org.jacoco.doc/docroot/doc/resources/extern.gif
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/extern.gif
rename to org.jacoco.doc/docroot/doc/resources/extern.gif
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/flow-cond-probe.png b/org.jacoco.doc/docroot/doc/resources/flow-cond-probe.png
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/flow-cond-probe.png
rename to org.jacoco.doc/docroot/doc/resources/flow-cond-probe.png
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/flow-cond.png b/org.jacoco.doc/docroot/doc/resources/flow-cond.png
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/flow-cond.png
rename to org.jacoco.doc/docroot/doc/resources/flow-cond.png
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/flow-example.png b/org.jacoco.doc/docroot/doc/resources/flow-example.png
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/flow-example.png
rename to org.jacoco.doc/docroot/doc/resources/flow-example.png
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/flow-exit-probe.png b/org.jacoco.doc/docroot/doc/resources/flow-exit-probe.png
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/flow-exit-probe.png
rename to org.jacoco.doc/docroot/doc/resources/flow-exit-probe.png
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/flow-exit.png b/org.jacoco.doc/docroot/doc/resources/flow-exit.png
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/flow-exit.png
rename to org.jacoco.doc/docroot/doc/resources/flow-exit.png
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/flow-goto-probe.png b/org.jacoco.doc/docroot/doc/resources/flow-goto-probe.png
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/flow-goto-probe.png
rename to org.jacoco.doc/docroot/doc/resources/flow-goto-probe.png
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/flow-goto.png b/org.jacoco.doc/docroot/doc/resources/flow-goto.png
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/flow-goto.png
rename to org.jacoco.doc/docroot/doc/resources/flow-goto.png
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/flow-sequence-probe.png b/org.jacoco.doc/docroot/doc/resources/flow-sequence-probe.png
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/flow-sequence-probe.png
rename to org.jacoco.doc/docroot/doc/resources/flow-sequence-probe.png
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/flow-sequence.png b/org.jacoco.doc/docroot/doc/resources/flow-sequence.png
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/flow-sequence.png
rename to org.jacoco.doc/docroot/doc/resources/flow-sequence.png
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/group.gif b/org.jacoco.doc/docroot/doc/resources/group.gif
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/group.gif
rename to org.jacoco.doc/docroot/doc/resources/group.gif
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/implementation.png b/org.jacoco.doc/docroot/doc/resources/implementation.png
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/implementation.png
rename to org.jacoco.doc/docroot/doc/resources/implementation.png
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/jar.gif b/org.jacoco.doc/docroot/doc/resources/jar.gif
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/jar.gif
rename to org.jacoco.doc/docroot/doc/resources/jar.gif
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/report.gif b/org.jacoco.doc/docroot/doc/resources/report.gif
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/report.gif
rename to org.jacoco.doc/docroot/doc/resources/report.gif
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/source.gif b/org.jacoco.doc/docroot/doc/resources/source.gif
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/source.gif
rename to org.jacoco.doc/docroot/doc/resources/source.gif
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/test.gif b/org.jacoco.doc/docroot/doc/resources/test.gif
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/test.gif
rename to org.jacoco.doc/docroot/doc/resources/test.gif
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/.resources/testsuite.gif b/org.jacoco.doc/docroot/doc/resources/testsuite.gif
similarity index 100%
rename from org.jacoco.doc/docroot/doc/.resources/testsuite.gif
rename to org.jacoco.doc/docroot/doc/resources/testsuite.gif
Binary files differ
diff --git a/org.jacoco.doc/docroot/doc/support.html b/org.jacoco.doc/docroot/doc/support.html
index 987ee46..4655c01 100644
--- a/org.jacoco.doc/docroot/doc/support.html
+++ b/org.jacoco.doc/docroot/doc/support.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Support and Feedback</title>
 </head>
 <body>
diff --git a/org.jacoco.doc/docroot/doc/team.html b/org.jacoco.doc/docroot/doc/team.html
index 82f7618..8edc3ce 100644
--- a/org.jacoco.doc/docroot/doc/team.html
+++ b/org.jacoco.doc/docroot/doc/team.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
   <title>JaCoCo - Team</title>
 </head>
 <body>
diff --git a/org.jacoco.doc/docroot/index.html b/org.jacoco.doc/docroot/index.html
index cf607c0..9a7991a 100644
--- a/org.jacoco.doc/docroot/index.html
+++ b/org.jacoco.doc/docroot/index.html
@@ -3,8 +3,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <link rel="stylesheet" href="doc/.resources/doc.css" charset="UTF-8" type="text/css" />
-  <link rel="shortcut icon" href="doc/.resources/report.gif" type="image/gif" />
+  <link rel="stylesheet" href="doc/resources/doc.css" charset="UTF-8" type="text/css" />
+  <link rel="shortcut icon" href="doc/resources/report.gif" type="image/gif" />
   <title>JaCoCo - Java Code Coverage Library</title>
 </head>
 <body>
@@ -34,8 +34,8 @@
   <li><a href="doc/index.html">Documentation</a></li>
   <li><a href="test/index.html">JUnit Test Results</a></li>
   <li><a href="coverage/index.html">Code Coverage Report</a>
-      (<a href="coverage/coverage.csv">CSV</a>, 
-       <a href="coverage/coverage.xml">XML</a>)</li>
+      (<a href="coverage/jacoco.csv">CSV</a>,
+       <a href="coverage/jacoco.xml">XML</a>)</li>
   <li><a href="doc/changes.html">Change History</a></li>
   <li><a href="doc/license.html">License</a></li>
 </ul>
diff --git a/org.jacoco.doc/javadoc/stylesheet.css b/org.jacoco.doc/javadoc/stylesheet.css
index 896f4a9..a45a6f5 100644
--- a/org.jacoco.doc/javadoc/stylesheet.css
+++ b/org.jacoco.doc/javadoc/stylesheet.css
@@ -45,7 +45,7 @@
 a[href^='http://'], a[href^='https://'] {

 	display:inline-block;

 	padding-left:15px;

-	background:transparent url(../.resources/extern.gif) center left no-repeat;

+	background:transparent url(../resources/extern.gif) center left no-repeat;

 }

 

 hr {

diff --git a/org.jacoco.doc/pom.xml b/org.jacoco.doc/pom.xml
index 9b1407f..505eb10 100644
--- a/org.jacoco.doc/pom.xml
+++ b/org.jacoco.doc/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.build</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.build</relativePath>
   </parent>
 
@@ -36,21 +36,39 @@
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
+      <artifactId>org.jacoco.core.test</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
       <artifactId>org.jacoco.report</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
+      <artifactId>org.jacoco.report.test</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
       <artifactId>org.jacoco.agent</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
+      <artifactId>org.jacoco.agent.test</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
       <artifactId>org.jacoco.agent.rt</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
-      <artifactId>org.jacoco.agent</artifactId>
+      <artifactId>org.jacoco.agent.rt.test</artifactId>
       <version>${project.version}</version>
-      <classifier>runtime</classifier>
+      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
@@ -58,14 +76,31 @@
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
-      <artifactId>org.jacoco.ant</artifactId>
-      <classifier>nodeps</classifier>
+      <artifactId>org.jacoco.ant.test</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>org.jacoco.examples</artifactId>
       <version>${project.version}</version>
-      <type>zip</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>org.jacoco.examples.test</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>jacoco-maven-plugin</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>jacoco-maven-plugin.test</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
     </dependency>
   </dependencies>
 
@@ -74,6 +109,32 @@
 
     <plugins>
       <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>report-aggregate</id>
+            <phase>prepare-package</phase>
+            <goals>
+              <goal>report-aggregate</goal>
+            </goals>
+            <configuration>
+              <title>JaCoCo</title>
+              <footer>Code Coverage Report for JaCoCo ${project.version}</footer>
+              <includes>
+                <!-- Analyze class files only to exclude shaded agent JAR from report -->
+                <include>**/*.class</include>
+              </includes>
+              <excludes>
+                <exclude>**/HelpMojo.class</exclude>
+              </excludes>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-antrun-plugin</artifactId>
         <executions>
@@ -85,84 +146,6 @@
             </goals>
             <configuration>
               <target>
-                <typedef resource="org/jacoco/ant/antlib.xml"/>
-                <echo message="Coverage report"/>
-                <report>
-                  <executiondata>
-                    <fileset dir="../org.jacoco.agent.test/target" includes="jacoco.exec"/>
-                    <fileset dir="../org.jacoco.agent.rt.test/target" includes="jacoco.exec"/>
-                    <fileset dir="../org.jacoco.ant.test/target" includes="jacoco.exec"/>
-                    <fileset dir="../org.jacoco.core.test/target" includes="jacoco.exec"/>
-                    <fileset dir="../org.jacoco.examples.test/target" includes="jacoco.exec"/>
-                    <fileset dir="../org.jacoco.report.test/target" includes="jacoco.exec"/>
-                    <fileset dir="../jacoco-maven-plugin.test/target" includes="jacoco.exec"/>
-                  </executiondata>
-                  <structure name="JaCoCo">
-                    <group name="org.jacoco.agent">
-                      <classfiles>
-                        <!-- Process class files only, ignore jacocoagent.jar -->
-                        <fileset dir="../org.jacoco.agent/target/classes" includes="**/*.class"/>
-                      </classfiles>
-                      <sourcefiles>
-                        <fileset dir="../org.jacoco.agent/src"/>
-                      </sourcefiles>
-                    </group>
-                    <group name="org.jacoco.agent.rt">
-                      <classfiles>
-                        <fileset dir="../org.jacoco.agent.rt/target/classes"/>
-                      </classfiles>
-                      <sourcefiles>
-                        <fileset dir="../org.jacoco.agent.rt/src"/>
-                      </sourcefiles>
-                    </group>
-                    <group name="org.jacoco.ant">
-                      <classfiles>
-                        <fileset dir="../org.jacoco.ant/target/classes"/>
-                      </classfiles>
-                      <sourcefiles>
-                        <fileset dir="../org.jacoco.ant/src"/>
-                      </sourcefiles>
-                    </group>
-                    <group name="org.jacoco.core">
-                      <classfiles>
-                        <fileset dir="../org.jacoco.core/target/classes"/>
-                      </classfiles>
-                      <sourcefiles>
-                        <fileset dir="../org.jacoco.core/src"/>
-                      </sourcefiles>
-                    </group>
-                    <group name="org.jacoco.examples">
-                      <classfiles>
-                        <fileset dir="../org.jacoco.examples/target/classes"/>
-                      </classfiles>
-                      <sourcefiles>
-                        <fileset dir="../org.jacoco.examples/src"/>
-                      </sourcefiles>
-                    </group>
-                    <group name="org.jacoco.report">
-                      <classfiles>
-                        <fileset dir="../org.jacoco.report/target/classes"/>
-                      </classfiles>
-                      <sourcefiles>
-                        <fileset dir="../org.jacoco.report/src"/>
-                      </sourcefiles>
-                    </group>
-                    <group name="jacoco-maven-plugin">
-                      <classfiles>
-                        <fileset dir="../jacoco-maven-plugin/target/classes" excludes="**/HelpMojo.class"/>
-                      </classfiles>
-                      <sourcefiles>
-                        <fileset dir="../jacoco-maven-plugin/src"/>
-                      </sourcefiles>
-                    </group>
-                  </structure>
-                  <html destdir="${project.build.directory}/coverage"
-                        footer="Code Coverage Report for JaCoCo ${project.version}"
-                        locale="en"/>
-                  <csv destfile="${project.build.directory}/coverage/coverage.csv"/>
-                  <xml destfile="${project.build.directory}/coverage/coverage.xml"/>
-                </report>
-
                 <echo message="JUnit report"/>
                 <mkdir dir="${project.build.directory}/junit"/>
                 <junitreport todir="${project.build.directory}/junit">
@@ -185,11 +168,6 @@
         </executions>
         <dependencies>
           <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>org.jacoco.ant</artifactId>
-            <version>${project.version}</version>
-          </dependency>
-          <dependency>
             <groupId>org.apache.ant</groupId>
             <artifactId>ant-junit</artifactId>
             <version>1.8.2</version>
@@ -210,7 +188,7 @@
             <configuration>
               <reportOutputDirectory>${project.build.directory}/apidocs</reportOutputDirectory>
               <includeDependencySources>true</includeDependencySources>
-              <excludePackageNames>*.internal,org.jacoco.ant</excludePackageNames>
+              <excludePackageNames>*.internal,org.jacoco.ant,org.jacoco.maven,org.jacoco.examples</excludePackageNames>
               <dependencySourceIncludes>
                 <dependencySourceInclude>org.jacoco:*</dependencySourceInclude>
               </dependencySourceIncludes>
diff --git a/org.jacoco.doc/xsl/junit-noframes.xsl b/org.jacoco.doc/xsl/junit-noframes.xsl
index 9e5af2c..24ee130 100644
--- a/org.jacoco.doc/xsl/junit-noframes.xsl
+++ b/org.jacoco.doc/xsl/junit-noframes.xsl
@@ -37,8 +37,8 @@
     <html>

         <head>

             <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

-            <link rel="stylesheet" href="../doc/.resources/doc.css" charset="UTF-8" type="text/css" />

-            <link rel="shortcut icon" href="../doc/.resources/report.gif" type="image/gif" />

+            <link rel="stylesheet" href="../doc/resources/doc.css" charset="UTF-8" type="text/css" />

+            <link rel="shortcut icon" href="../doc/resources/report.gif" type="image/gif" />

             <title>JaCoCo - JUnit Test Results</title>

             

     <style type="text/css">

diff --git a/org.jacoco.doc/xsl/maven-goal.xsl b/org.jacoco.doc/xsl/maven-goal.xsl
index b282a8d..901caee 100644
--- a/org.jacoco.doc/xsl/maven-goal.xsl
+++ b/org.jacoco.doc/xsl/maven-goal.xsl
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -27,9 +27,9 @@
 		<html>
 			<head>
 				<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-				<link rel="stylesheet" href=".resources/doc.css" charset="UTF-8"
+				<link rel="stylesheet" href="resources/doc.css" charset="UTF-8"
 					type="text/css" />
-				<link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+				<link rel="shortcut icon" href="resources/report.gif" type="image/gif" />
 				<title>
 					JaCoCo -
 					<xsl:value-of select="xdoc:document/xdoc:properties/xdoc:title" />
diff --git a/org.jacoco.examples.test/.gitignore b/org.jacoco.examples.test/.gitignore
deleted file mode 100644
index fefebc3..0000000
--- a/org.jacoco.examples.test/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/bin
-/.settings
diff --git a/org.jacoco.examples.test/META-INF/MANIFEST.MF b/org.jacoco.examples.test/META-INF/MANIFEST.MF
deleted file mode 100644
index c045482..0000000
--- a/org.jacoco.examples.test/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: JaCoCo Examples Tests
-Bundle-SymbolicName: org.jacoco.examples.test
-Bundle-Version: 0.7.5.201505241946
-Bundle-Vendor: Mountainminds GmbH & Co. KG
-Fragment-Host: org.jacoco.examples
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: org.junit;version="[4.8.0,5.0.0)",
- org.junit.matchers;version="[4.8.0,5.0.0)",
- org.junit.rules;version="[4.8.0,5.0.0)"
-Require-Bundle: org.hamcrest.core;bundle-version="[1.1.0,2.0.0)"
diff --git a/org.jacoco.examples.test/build.properties b/org.jacoco.examples.test/build.properties
deleted file mode 100644
index 34d2e4d..0000000
--- a/org.jacoco.examples.test/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/org.jacoco.examples.test/pom.xml b/org.jacoco.examples.test/pom.xml
index 3b740ea..72b7dca 100644
--- a/org.jacoco.examples.test/pom.xml
+++ b/org.jacoco.examples.test/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.tests</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.tests</relativePath>
   </parent>
 
@@ -34,6 +34,10 @@
       <artifactId>org.jacoco.examples</artifactId>
     </dependency>
     <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>org.jacoco.agent.rt</artifactId>
+    </dependency>
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
     </dependency>
diff --git a/org.jacoco.examples.test/src/org/jacoco/examples/ClassInfoTest.java b/org.jacoco.examples.test/src/org/jacoco/examples/ClassInfoTest.java
index 2f84567..031f8a6 100644
--- a/org.jacoco.examples.test/src/org/jacoco/examples/ClassInfoTest.java
+++ b/org.jacoco.examples.test/src/org/jacoco/examples/ClassInfoTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples.test/src/org/jacoco/examples/ConsoleOutput.java b/org.jacoco.examples.test/src/org/jacoco/examples/ConsoleOutput.java
index 1db0631..91135cf 100644
--- a/org.jacoco.examples.test/src/org/jacoco/examples/ConsoleOutput.java
+++ b/org.jacoco.examples.test/src/org/jacoco/examples/ConsoleOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples.test/src/org/jacoco/examples/CoreTutorialTest.java b/org.jacoco.examples.test/src/org/jacoco/examples/CoreTutorialTest.java
index 42d1675..aac96ff 100644
--- a/org.jacoco.examples.test/src/org/jacoco/examples/CoreTutorialTest.java
+++ b/org.jacoco.examples.test/src/org/jacoco/examples/CoreTutorialTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples.test/src/org/jacoco/examples/ExecDumpTest.java b/org.jacoco.examples.test/src/org/jacoco/examples/ExecDumpTest.java
index 190ae9f..fcfb7b2 100644
--- a/org.jacoco.examples.test/src/org/jacoco/examples/ExecDumpTest.java
+++ b/org.jacoco.examples.test/src/org/jacoco/examples/ExecDumpTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples.test/src/org/jacoco/examples/MBeanClientTest.java b/org.jacoco.examples.test/src/org/jacoco/examples/MBeanClientTest.java
new file mode 100644
index 0000000..ebf0889
--- /dev/null
+++ b/org.jacoco.examples.test/src/org/jacoco/examples/MBeanClientTest.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Marc R. Hoffmann - initial API and implementation
+ *    
+ *******************************************************************************/
+package org.jacoco.examples;
+
+import static org.junit.Assert.assertEquals;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jacoco.agent.rt.IAgent;
+import org.junit.Test;
+
+/**
+ * Tests for {@link MBeanClient}.
+ */
+public class MBeanClientTest {
+
+	@Test
+	public void testMBeanInterfaceCompatibility() {
+		Set<String> expected = getDeclaredMethods(IAgent.class);
+		Set<String> actual = getDeclaredMethods(MBeanClient.IProxy.class);
+		assertEquals(expected, actual);
+	}
+
+	private Set<String> getDeclaredMethods(Class<?> clazz) {
+		Set<String> methods = new HashSet<String>();
+		for (Method m : clazz.getDeclaredMethods()) {
+			methods.add(String.format("%s %s(%s)", m.getReturnType().getName(),
+					m.getName(), Arrays.asList(m.getParameterTypes())));
+		}
+		return methods;
+	}
+
+}
diff --git a/org.jacoco.examples/.gitignore b/org.jacoco.examples/.gitignore
deleted file mode 100644
index fefebc3..0000000
--- a/org.jacoco.examples/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/bin
-/.settings
diff --git a/org.jacoco.examples/META-INF/MANIFEST.MF b/org.jacoco.examples/META-INF/MANIFEST.MF
deleted file mode 100644
index 3b2c42f..0000000
--- a/org.jacoco.examples/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,15 +0,0 @@
-Manifest-Version: 1.0

-Bundle-ManifestVersion: 2

-Bundle-Name: JaCoCo API Usage Examples

-Bundle-SymbolicName: org.jacoco.examples

-Bundle-Version: 0.7.5.201505241946

-Bundle-RequiredExecutionEnvironment: J2SE-1.5

-Bundle-Vendor: Mountainminds GmbH & Co. KG

-Import-Package: org.jacoco.core.analysis;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.data;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.instr;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.runtime;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.tools;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.report;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.report.html;bundle-version="[0.7.5,0.7.6)",

- org.objectweb.asm;version="[5.0.1,5.1.0)"

diff --git a/org.jacoco.examples/assembly.xml b/org.jacoco.examples/assembly.xml
index aede48e..53ea684 100644
--- a/org.jacoco.examples/assembly.xml
+++ b/org.jacoco.examples/assembly.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build.properties b/org.jacoco.examples/build.properties
deleted file mode 100644
index 34d2e4d..0000000
--- a/org.jacoco.examples/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/org.jacoco.examples/build/build-offline.xml b/org.jacoco.examples/build/build-offline.xml
index 329f8e9..23b8742 100644
--- a/org.jacoco.examples/build/build-offline.xml
+++ b/org.jacoco.examples/build/build-offline.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/build.xml b/org.jacoco.examples/build/build.xml
index 4d75aad..c066214 100644
--- a/org.jacoco.examples/build/build.xml
+++ b/org.jacoco.examples/build/build.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/pom-it.xml b/org.jacoco.examples/build/pom-it.xml
index 69ea314..a9f0550 100644
--- a/org.jacoco.examples/build/pom-it.xml
+++ b/org.jacoco.examples/build/pom-it.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -20,7 +20,7 @@
   <packaging>jar</packaging>
 
   <name>JaCoCo Maven plug-in example</name>
-  <url>http://www.eclemma.org/jacoco</url>
+  <url>http://www.jacoco.org/jacoco</url>
 
   <dependencies>
     <dependency>
diff --git a/org.jacoco.examples/build/pom-offline.xml b/org.jacoco.examples/build/pom-offline.xml
index 7d48373..b14e9f8 100644
--- a/org.jacoco.examples/build/pom-offline.xml
+++ b/org.jacoco.examples/build/pom-offline.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -19,7 +19,7 @@
   <packaging>jar</packaging>
 
   <name>JaCoCo Maven plug-in example with Offline Instrumentation</name>
-  <url>http://www.eclemma.org/jacoco</url>
+  <url>http://www.jacoco.org/jacoco</url>
 
   <dependencies>
     <dependency>
diff --git a/org.jacoco.examples/build/pom.xml b/org.jacoco.examples/build/pom.xml
index 2750b7b..16e6f5b 100644
--- a/org.jacoco.examples/build/pom.xml
+++ b/org.jacoco.examples/build/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -20,7 +20,7 @@
   <packaging>jar</packaging>
 
   <name>JaCoCo Maven plug-in example</name>
-  <url>http://www.eclemma.org/jacoco</url>
+  <url>http://www.jacoco.org/jacoco</url>
 
   <dependencies>
     <dependency>
diff --git a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Add.java b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Add.java
index 774b60c..99c7354 100644
--- a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Add.java
+++ b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Add.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Const.java b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Const.java
index 8429961..c5597ba 100644
--- a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Const.java
+++ b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Const.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Div.java b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Div.java
index 70d306d..4fc3d38 100644
--- a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Div.java
+++ b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Div.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/IExpression.java b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/IExpression.java
index 216c6ed..efbcceb 100644
--- a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/IExpression.java
+++ b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/IExpression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Mul.java b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Mul.java
index 3c97905..69c5c58 100644
--- a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Mul.java
+++ b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Mul.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Sub.java b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Sub.java
index b88efd1..2671221 100644
--- a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Sub.java
+++ b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/expressions/Sub.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/parser/ExpressionParser.java b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/parser/ExpressionParser.java
index 9ea066a..b92dd14 100644
--- a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/parser/ExpressionParser.java
+++ b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/parser/ExpressionParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/parser/Main.java b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/parser/Main.java
index fe9037d..19d2964 100644
--- a/org.jacoco.examples/build/src/main/java/org/jacoco/examples/parser/Main.java
+++ b/org.jacoco.examples/build/src/main/java/org/jacoco/examples/parser/Main.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/src/test/java/org/jacoco/examples/parser/ExpressionParserIT.java b/org.jacoco.examples/build/src/test/java/org/jacoco/examples/parser/ExpressionParserIT.java
index f2e7cd4..5fb3510 100644
--- a/org.jacoco.examples/build/src/test/java/org/jacoco/examples/parser/ExpressionParserIT.java
+++ b/org.jacoco.examples/build/src/test/java/org/jacoco/examples/parser/ExpressionParserIT.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/build/src/test/java/org/jacoco/examples/parser/ExpressionParserTest.java b/org.jacoco.examples/build/src/test/java/org/jacoco/examples/parser/ExpressionParserTest.java
index 4e171c4..e789e0a 100755
--- a/org.jacoco.examples/build/src/test/java/org/jacoco/examples/parser/ExpressionParserTest.java
+++ b/org.jacoco.examples/build/src/test/java/org/jacoco/examples/parser/ExpressionParserTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/pom.xml b/org.jacoco.examples/pom.xml
index 01471b8..925576b 100644
--- a/org.jacoco.examples/pom.xml
+++ b/org.jacoco.examples/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.build</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.build</relativePath>
   </parent>
 
diff --git a/org.jacoco.examples/src/org/jacoco/examples/ClassInfo.java b/org.jacoco.examples/src/org/jacoco/examples/ClassInfo.java
index 6c105fc..1d4b528 100644
--- a/org.jacoco.examples/src/org/jacoco/examples/ClassInfo.java
+++ b/org.jacoco.examples/src/org/jacoco/examples/ClassInfo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/src/org/jacoco/examples/CoreTutorial.java b/org.jacoco.examples/src/org/jacoco/examples/CoreTutorial.java
index b62278d..0f42ee0 100644
--- a/org.jacoco.examples/src/org/jacoco/examples/CoreTutorial.java
+++ b/org.jacoco.examples/src/org/jacoco/examples/CoreTutorial.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/src/org/jacoco/examples/ExecDump.java b/org.jacoco.examples/src/org/jacoco/examples/ExecDump.java
index 30a29ee..aeaa4f6 100644
--- a/org.jacoco.examples/src/org/jacoco/examples/ExecDump.java
+++ b/org.jacoco.examples/src/org/jacoco/examples/ExecDump.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/src/org/jacoco/examples/ExecutionDataClient.java b/org.jacoco.examples/src/org/jacoco/examples/ExecutionDataClient.java
index 45c2bcf..48f794c 100644
--- a/org.jacoco.examples/src/org/jacoco/examples/ExecutionDataClient.java
+++ b/org.jacoco.examples/src/org/jacoco/examples/ExecutionDataClient.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/src/org/jacoco/examples/ExecutionDataServer.java b/org.jacoco.examples/src/org/jacoco/examples/ExecutionDataServer.java
index bcc57c2..343c3de 100644
--- a/org.jacoco.examples/src/org/jacoco/examples/ExecutionDataServer.java
+++ b/org.jacoco.examples/src/org/jacoco/examples/ExecutionDataServer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.examples/src/org/jacoco/examples/MBeanClient.java b/org.jacoco.examples/src/org/jacoco/examples/MBeanClient.java
index 1563a20..1526288 100644
--- a/org.jacoco.examples/src/org/jacoco/examples/MBeanClient.java
+++ b/org.jacoco.examples/src/org/jacoco/examples/MBeanClient.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -39,36 +39,39 @@
 	 */
 	public static void main(final String[] args) throws Exception {
 		// Open connection to the coverage agent:
-		JMXServiceURL url = new JMXServiceURL(SERVICE_URL);
-		JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
-		MBeanServerConnection connection = jmxc.getMBeanServerConnection();
+		final JMXServiceURL url = new JMXServiceURL(SERVICE_URL);
+		final JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
+		final MBeanServerConnection connection = jmxc
+				.getMBeanServerConnection();
 
-		IProxy proxy = (IProxy) MBeanServerInvocationHandler.newProxyInstance(
-				connection, new ObjectName("org.jacoco:type=Runtime"),
-				IProxy.class, false);
+		final IProxy proxy = (IProxy) MBeanServerInvocationHandler
+				.newProxyInstance(connection, new ObjectName(
+						"org.jacoco:type=Runtime"), IProxy.class, false);
 
 		// Retrieve JaCoCo version and session id:
 		System.out.println("Version: " + proxy.getVersion());
 		System.out.println("Session: " + proxy.getSessionId());
 
 		// Retrieve dump and write to file:
-		byte[] dump = proxy.dump(false);
+		final byte[] data = proxy.getExecutionData(false);
 		final FileOutputStream localFile = new FileOutputStream(DESTFILE);
-		localFile.write(dump);
+		localFile.write(data);
 		localFile.close();
 
 		// Close connection:
 		jmxc.close();
 	}
 
-	private interface IProxy {
+	interface IProxy {
 		String getVersion();
 
 		String getSessionId();
 
 		void setSessionId(String id);
 
-		byte[] dump(boolean reset);
+		byte[] getExecutionData(boolean reset);
+
+		void dump(boolean reset);
 
 		void reset();
 	}
diff --git a/org.jacoco.examples/src/org/jacoco/examples/ReportGenerator.java b/org.jacoco.examples/src/org/jacoco/examples/ReportGenerator.java
index 50e3be2..fcb7efc 100644
--- a/org.jacoco.examples/src/org/jacoco/examples/ReportGenerator.java
+++ b/org.jacoco.examples/src/org/jacoco/examples/ReportGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/.gitignore b/org.jacoco.report.test/.gitignore
deleted file mode 100644
index fefebc3..0000000
--- a/org.jacoco.report.test/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/bin
-/.settings
diff --git a/org.jacoco.report.test/META-INF/MANIFEST.MF b/org.jacoco.report.test/META-INF/MANIFEST.MF
deleted file mode 100644
index 121a629..0000000
--- a/org.jacoco.report.test/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0

-Bundle-ManifestVersion: 2

-Bundle-Name: JaCoCo Report Tests

-Bundle-SymbolicName: org.jacoco.report.test

-Bundle-Version: 0.7.5.201505241946

-Fragment-Host: org.jacoco.report

-Bundle-RequiredExecutionEnvironment: J2SE-1.5

-Bundle-Vendor: Mountainminds GmbH & Co. KG

-Import-Package: org.jacoco.core.internal.analysis;bundle-version="[0.7.5,0.7.6)",

- org.junit;version="[4.8.0,5.0.0)",

- org.junit.rules;version="[4.8.0,5.0.0)"

diff --git a/org.jacoco.report.test/build.properties b/org.jacoco.report.test/build.properties
deleted file mode 100644
index a657887..0000000
--- a/org.jacoco.report.test/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/

-output.. = bin/

-bin.includes = META-INF/,\

-               .,\

-               about.html

diff --git a/org.jacoco.report.test/pom.xml b/org.jacoco.report.test/pom.xml
index 4533fd5..4015c99 100644
--- a/org.jacoco.report.test/pom.xml
+++ b/org.jacoco.report.test/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.tests</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.tests</relativePath>
   </parent>
 
diff --git a/org.jacoco.report.test/src/org/jacoco/report/DirectorySourceFileLocatorTest.java b/org.jacoco.report.test/src/org/jacoco/report/DirectorySourceFileLocatorTest.java
index bd93029..e4c4f4d 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/DirectorySourceFileLocatorTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/DirectorySourceFileLocatorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/FileMultiReportOutputTest.java b/org.jacoco.report.test/src/org/jacoco/report/FileMultiReportOutputTest.java
index 1922eca..e92224b 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/FileMultiReportOutputTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/FileMultiReportOutputTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/InputStreamSourceFileLocatorTest.java b/org.jacoco.report.test/src/org/jacoco/report/InputStreamSourceFileLocatorTest.java
index c3676ee..d81e845 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/InputStreamSourceFileLocatorTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/InputStreamSourceFileLocatorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/JavaNamesTest.java b/org.jacoco.report.test/src/org/jacoco/report/JavaNamesTest.java
index f25cf42..67454ea 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/JavaNamesTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/JavaNamesTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/MemoryMultiReportOutput.java b/org.jacoco.report.test/src/org/jacoco/report/MemoryMultiReportOutput.java
index b4a5111..d35c09d 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/MemoryMultiReportOutput.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/MemoryMultiReportOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/MemoryOutput.java b/org.jacoco.report.test/src/org/jacoco/report/MemoryOutput.java
index 464a841..88b4d1d 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/MemoryOutput.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/MemoryOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/MultiReportVisitorTest.java b/org.jacoco.report.test/src/org/jacoco/report/MultiReportVisitorTest.java
index 42a4ab1..a766618 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/MultiReportVisitorTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/MultiReportVisitorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/MultiSourceFileLocatorTest.java b/org.jacoco.report.test/src/org/jacoco/report/MultiSourceFileLocatorTest.java
index e6db19d..d2daff9 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/MultiSourceFileLocatorTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/MultiSourceFileLocatorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/ReportStructureTestDriver.java b/org.jacoco.report.test/src/org/jacoco/report/ReportStructureTestDriver.java
index 540e568..d168fa1 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/ReportStructureTestDriver.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/ReportStructureTestDriver.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -74,8 +74,7 @@
 		methodCoverage = m;
 
 		final ClassCoverageImpl classCoverageImpl = new ClassCoverageImpl(
-				"org/jacoco/example/FooClass", 1001, false, null,
-				"java/lang/Object", new String[0]);
+				"org/jacoco/example/FooClass", 1001, false);
 		classCoverageImpl.setSourceFileName("FooClass.java");
 		classCoverageImpl.addMethod(methodCoverage);
 		classCoverage = classCoverageImpl;
diff --git a/org.jacoco.report.test/src/org/jacoco/report/ZipMultiReportOutputTest.java b/org.jacoco.report.test/src/org/jacoco/report/ZipMultiReportOutputTest.java
index 1c5cb0e..10099ea 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/ZipMultiReportOutputTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/ZipMultiReportOutputTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/check/BundleCheckerTest.java b/org.jacoco.report.test/src/org/jacoco/report/check/BundleCheckerTest.java
index a9d913f..9f7ce58 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/check/BundleCheckerTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/check/BundleCheckerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -134,8 +134,7 @@
 		m.incrementMethodCounter();
 
 		final ClassCoverageImpl c = new ClassCoverageImpl(
-				"org/jacoco/example/FooClass", 1001, false, null,
-				"java/lang/Object", new String[0]);
+				"org/jacoco/example/FooClass", 1001, false);
 		c.setSourceFileName("FooClass.java");
 		c.addMethod(m);
 
diff --git a/org.jacoco.report.test/src/org/jacoco/report/check/LimitTest.java b/org.jacoco.report.test/src/org/jacoco/report/check/LimitTest.java
index 0dc3960..7b9405c 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/check/LimitTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/check/LimitTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/check/RuleTest.java b/org.jacoco.report.test/src/org/jacoco/report/check/RuleTest.java
index 2e27f68..35747a3 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/check/RuleTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/check/RuleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/check/RulesCheckerTest.java b/org.jacoco.report.test/src/org/jacoco/report/check/RulesCheckerTest.java
index 6a0a2a7..19f7559 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/check/RulesCheckerTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/check/RulesCheckerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/csv/CSVFormatterTest.java b/org.jacoco.report.test/src/org/jacoco/report/csv/CSVFormatterTest.java
index 9b8b657..3b9de72 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/csv/CSVFormatterTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/csv/CSVFormatterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/csv/CSVGroupHandlerTest.java b/org.jacoco.report.test/src/org/jacoco/report/csv/CSVGroupHandlerTest.java
index 7a5fcaa..7550357 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/csv/CSVGroupHandlerTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/csv/CSVGroupHandlerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/csv/ClassRowWriterTest.java b/org.jacoco.report.test/src/org/jacoco/report/csv/ClassRowWriterTest.java
index 7140fde..1d5dda4 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/csv/ClassRowWriterTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/csv/ClassRowWriterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -74,7 +74,7 @@
 	@Test
 	public void TestRow() throws Exception {
 		IClassCoverage node = new ClassCoverageImpl("test/package/Foo", 123,
-				false, null, "java/lang/Object", null) {
+				false) {
 			{
 				instructionCounter = CounterImpl.getInstance(1, 11);
 				branchCounter = CounterImpl.getInstance(2, 22);
diff --git a/org.jacoco.report.test/src/org/jacoco/report/csv/DelimitedWriterTest.java b/org.jacoco.report.test/src/org/jacoco/report/csv/DelimitedWriterTest.java
index 3cb2dac..a500d84 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/csv/DelimitedWriterTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/csv/DelimitedWriterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/HTMLFormatterTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/HTMLFormatterTest.java
index 8e48151..f7588f4 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/HTMLFormatterTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/HTMLFormatterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/NormalizedFileNamesTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/NormalizedFileNamesTest.java
index a3af6f5..1d889d6 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/NormalizedFileNamesTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/NormalizedFileNamesTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/ReportOutputFolderTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/ReportOutputFolderTest.java
index 6eb7700..041faf7 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/ReportOutputFolderTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/ReportOutputFolderTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLDocumentTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLDocumentTest.java
index 4049cb6..68e9a4b 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLDocumentTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLDocumentTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLElementTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLElementTest.java
index 4375a8a..159826c 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLElementTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLElementTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLSupport.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLSupport.java
index 84ba47e..a888cf7 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLSupport.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/HTMLSupport.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/LinkableStub.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/LinkableStub.java
index d31f77a..c365714 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/LinkableStub.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/LinkableStub.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/ClassPageTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/ClassPageTest.java
index f892b46..67df76a 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/ClassPageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/ClassPageTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -35,8 +35,7 @@
 	@Override
 	public void setup() throws Exception {
 		super.setup();
-		node = new ClassCoverageImpl("org/jacoco/example/Foo", 123, false,
-				null, "java/lang/Object", null);
+		node = new ClassCoverageImpl("org/jacoco/example/Foo", 123, false);
 		node.addMethod(new MethodCoverageImpl("a", "()V", null));
 		node.addMethod(new MethodCoverageImpl("b", "()V", null));
 		node.addMethod(new MethodCoverageImpl("c", "()V", null));
@@ -66,8 +65,7 @@
 
 	@Test
 	public void testGetFileNameDefault() throws IOException {
-		IClassCoverage defaultNode = new ClassCoverageImpl("Foo", 123, false,
-				null, "java/lang/Object", null);
+		IClassCoverage defaultNode = new ClassCoverageImpl("Foo", 123, false);
 		page = new ClassPage(defaultNode, null, null, rootFolder, context);
 		assertEquals("Foo.html", page.getFileName());
 	}
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/MethodItemTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/MethodItemTest.java
index f4436c7..eab414e 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/MethodItemTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/MethodItemTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/NodePageTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/NodePageTest.java
index af91b04..aea6314 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/NodePageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/NodePageTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PackagePageTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PackagePageTest.java
index 91cb2ce..b25b643 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PackagePageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PackagePageTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -59,11 +59,9 @@
 	@Test
 	public void testContentsWithSource() throws Exception {
 		IClassCoverage class1 = new ClassCoverageImpl(
-				"org/jacoco/example/Foo1", 0x1000, false, null,
-				"java/lang/Object", null);
+				"org/jacoco/example/Foo1", 0x1000, false);
 		IClassCoverage class2 = new ClassCoverageImpl(
-				"org/jacoco/example/Foo2", 0x2000, false, null,
-				"java/lang/Object", null);
+				"org/jacoco/example/Foo2", 0x2000, false);
 		ISourceFileCoverage src1 = new SourceFileCoverageImpl("Src1.java",
 				"org/jacoco/example");
 		node = new PackageCoverageImpl("org/jacoco/example", Arrays.asList(
@@ -96,11 +94,9 @@
 	@Test
 	public void testContentsNoSource() throws Exception {
 		IClassCoverage class1 = new ClassCoverageImpl(
-				"org/jacoco/example/Foo1", 0x1000, false, null,
-				"java/lang/Object", null);
+				"org/jacoco/example/Foo1", 0x1000, false);
 		IClassCoverage class2 = new ClassCoverageImpl(
-				"org/jacoco/example/Foo2", 0x2000, false, null,
-				"java/lang/Object", null);
+				"org/jacoco/example/Foo2", 0x2000, false);
 		node = new PackageCoverageImpl("org/jacoco/example", Arrays.asList(
 				class1, class2), Collections.<ISourceFileCoverage> emptyList());
 
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PackageSourcePageTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PackageSourcePageTest.java
index 2f2ad83..a79763c 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PackageSourcePageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PackageSourcePageTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PageTestBase.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PageTestBase.java
index c084d84..4ec3988 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PageTestBase.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/PageTestBase.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/ReportPageTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/ReportPageTest.java
index 665439b..97b7fa2 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/ReportPageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/ReportPageTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -98,7 +98,7 @@
 		assertEquals("en", support.findStr(doc, "/html/@lang"));
 
 		// style sheet
-		assertEquals(".resources/report.css", support.findStr(doc,
+		assertEquals("jacoco-resources/report.css", support.findStr(doc,
 				"/html/head/link[@rel='stylesheet']/@href"));
 
 		// bread crumb
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SessionsPageTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SessionsPageTest.java
index 8203675..2f3f7d3 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SessionsPageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SessionsPageTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -57,7 +57,7 @@
 	public void testGetFileName() {
 		final SessionsPage page = new SessionsPage(noSessions, noExecutionData,
 				index, null, rootFolder, context);
-		assertEquals(".sessions.html", page.getFileName());
+		assertEquals("jacoco-sessions.html", page.getFileName());
 	}
 
 	@Test
@@ -72,7 +72,8 @@
 		final SessionsPage page = new SessionsPage(noSessions, noExecutionData,
 				index, null, rootFolder, context);
 		page.render();
-		final Document doc = support.parse(output.getFile(".sessions.html"));
+		final Document doc = support.parse(output
+				.getFile("jacoco-sessions.html"));
 		assertEquals("No session information available.",
 				support.findStr(doc, "/html/body/p[1]"));
 		assertEquals("No execution data available.",
@@ -88,7 +89,8 @@
 		final SessionsPage page = new SessionsPage(sessions, noExecutionData,
 				index, null, rootFolder, context);
 		page.render();
-		final Document doc = support.parse(output.getFile(".sessions.html"));
+		final Document doc = support.parse(output
+				.getFile("jacoco-sessions.html"));
 		assertEquals("el_session", support.findStr(doc,
 				"/html/body/table[1]/tbody/tr[1]/td[1]/span/@class"));
 		assertEquals("Session-A", support.findStr(doc,
@@ -128,7 +130,8 @@
 		final SessionsPage page = new SessionsPage(noSessions, data, index,
 				null, rootFolder, context);
 		page.render();
-		final Document doc = support.parse(output.getFile(".sessions.html"));
+		final Document doc = support.parse(output
+				.getFile("jacoco-sessions.html"));
 		assertEquals("el_class", support.findStr(doc,
 				"/html/body/table[1]/tbody/tr[1]/td[1]/a/@class"));
 		assertEquals("Foo.html", support.findStr(doc,
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SourceFilePageTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SourceFilePageTest.java
index 8a1caf9..16a7aca 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SourceFilePageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SourceFilePageTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -52,15 +52,15 @@
 				.getFile("SourceFilePageTest.java.html"));
 
 		// additional style sheet
-		assertEquals(".resources/report.css", support.findStr(result,
+		assertEquals("jacoco-resources/report.css", support.findStr(result,
 				"/html/head/link[@rel='stylesheet'][1]/@href"));
-		assertEquals(".resources/prettify.css", support.findStr(result,
+		assertEquals("jacoco-resources/prettify.css", support.findStr(result,
 				"/html/head/link[@rel='stylesheet'][2]/@href"));
 
 		// highlighting script
 		assertEquals("text/javascript",
 				support.findStr(result, "/html/head/script/@type"));
-		assertEquals(".resources/prettify.js",
+		assertEquals("jacoco-resources/prettify.js",
 				support.findStr(result, "/html/head/script/@src"));
 		assertEquals("window['PR_TAB_WIDTH']=4;prettyPrint()",
 				support.findStr(result, "/html/body/@onload"));
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SourceHighlighterTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SourceHighlighterTest.java
index d0e10f4..d42a27a 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SourceHighlighterTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/page/SourceHighlighterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/resources/ResourcesTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/resources/ResourcesTest.java
index e36003b..5f3cdb8 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/resources/ResourcesTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/resources/ResourcesTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -42,7 +42,7 @@
 	@Test
 	public void testGetLink() {
 		ReportOutputFolder base = root.subFolder("f1").subFolder("f2");
-		assertEquals("../../.resources/test.png",
+		assertEquals("../../jacoco-resources/test.png",
 				resources.getLink(base, "test.png"));
 
 	}
@@ -50,25 +50,25 @@
 	@Test
 	public void testCopyResources() throws IOException {
 		resources.copyResources();
-		output.assertFile(".resources/branchfc.gif");
-		output.assertFile(".resources/branchnc.gif");
-		output.assertFile(".resources/branchpc.gif");
-		output.assertFile(".resources/bundle.gif");
-		output.assertFile(".resources/class.gif");
-		output.assertFile(".resources/down.gif");
-		output.assertFile(".resources/greenbar.gif");
-		output.assertFile(".resources/group.gif");
-		output.assertFile(".resources/method.gif");
-		output.assertFile(".resources/package.gif");
-		output.assertFile(".resources/prettify.css");
-		output.assertFile(".resources/prettify.js");
-		output.assertFile(".resources/redbar.gif");
-		output.assertFile(".resources/report.css");
-		output.assertFile(".resources/report.gif");
-		output.assertFile(".resources/class.gif");
-		output.assertFile(".resources/sort.js");
-		output.assertFile(".resources/source.gif");
-		output.assertFile(".resources/up.gif");
+		output.assertFile("jacoco-resources/branchfc.gif");
+		output.assertFile("jacoco-resources/branchnc.gif");
+		output.assertFile("jacoco-resources/branchpc.gif");
+		output.assertFile("jacoco-resources/bundle.gif");
+		output.assertFile("jacoco-resources/class.gif");
+		output.assertFile("jacoco-resources/down.gif");
+		output.assertFile("jacoco-resources/greenbar.gif");
+		output.assertFile("jacoco-resources/group.gif");
+		output.assertFile("jacoco-resources/method.gif");
+		output.assertFile("jacoco-resources/package.gif");
+		output.assertFile("jacoco-resources/prettify.css");
+		output.assertFile("jacoco-resources/prettify.js");
+		output.assertFile("jacoco-resources/redbar.gif");
+		output.assertFile("jacoco-resources/report.css");
+		output.assertFile("jacoco-resources/report.gif");
+		output.assertFile("jacoco-resources/class.gif");
+		output.assertFile("jacoco-resources/sort.js");
+		output.assertFile("jacoco-resources/source.gif");
+		output.assertFile("jacoco-resources/up.gif");
 	}
 
 	@Test
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/resources/StylesTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/resources/StylesTest.java
index 966b525..d43788d 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/resources/StylesTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/resources/StylesTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/BarColumnTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/BarColumnTest.java
index 1ac430f..8f0671b 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/BarColumnTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/BarColumnTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -101,7 +101,7 @@
 				support.findStr(doc, "count(/html/body/table/tr[1]/td/img)"));
 
 		// red bar
-		assertEquals(".resources/redbar.gif",
+		assertEquals("jacoco-resources/redbar.gif",
 				support.findStr(doc, "/html/body/table/tr[1]/td/img[1]/@src"));
 		assertEquals("15",
 				support.findStr(doc, "/html/body/table/tr[1]/td/img[1]/@alt"));
@@ -109,7 +109,7 @@
 				support.findStr(doc, "/html/body/table/tr[1]/td/img[1]/@width"));
 
 		// green bar
-		assertEquals(".resources/greenbar.gif",
+		assertEquals("jacoco-resources/greenbar.gif",
 				support.findStr(doc, "/html/body/table/tr[1]/td/img[2]/@src"));
 		assertEquals("5",
 				support.findStr(doc, "/html/body/table/tr[1]/td/img[2]/@alt"));
@@ -129,7 +129,7 @@
 				support.findStr(doc, "count(/html/body/table/tr[1]/td/img)"));
 
 		// red bar
-		assertEquals(".resources/redbar.gif",
+		assertEquals("jacoco-resources/redbar.gif",
 				support.findStr(doc, "/html/body/table/tr[1]/td/img[1]/@src"));
 		assertEquals("20",
 				support.findStr(doc, "/html/body/table/tr[1]/td/img[1]/@alt"));
@@ -149,7 +149,7 @@
 				support.findStr(doc, "count(/html/body/table/tr[1]/td/img)"));
 
 		// red bar
-		assertEquals(".resources/greenbar.gif",
+		assertEquals("jacoco-resources/greenbar.gif",
 				support.findStr(doc, "/html/body/table/tr[1]/td/img[1]/@src"));
 		assertEquals("20",
 				support.findStr(doc, "/html/body/table/tr[1]/td/img[1]/@alt"));
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/CounterColumnTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/CounterColumnTest.java
index 110ccb4..34d30d5 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/CounterColumnTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/CounterColumnTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/LabelColumnTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/LabelColumnTest.java
index 926c5e8..9ec4a30 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/LabelColumnTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/LabelColumnTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/PercentageColumnTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/PercentageColumnTest.java
index 4d6bb4d..730154b 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/PercentageColumnTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/PercentageColumnTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -98,6 +98,16 @@
 	}
 
 	@Test
+	public void testRounding() throws Exception {
+		final ITableItem item = createItem(1, 199);
+		column.item(td, item, resources, root);
+		doc.close();
+		final Document doc = support.parse(output.getFile("Test.html"));
+		assertEquals("99%",
+				support.findStr(doc, "/html/body/table/tr/td[1]/text()"));
+	}
+
+	@Test
 	public void testLocale() throws Exception {
 		IColumnRenderer column = new PercentageColumn(CounterEntity.LINE,
 				Locale.FRENCH);
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/SortIndexTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/SortIndexTest.java
index 5067273..39b32c8 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/SortIndexTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/SortIndexTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/TableTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/TableTest.java
index 2e1f802..87a09de 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/TableTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/html/table/TableTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/xml/LocalEntityResolver.java b/org.jacoco.report.test/src/org/jacoco/report/internal/xml/LocalEntityResolver.java
index a36093d..808deb4 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/xml/LocalEntityResolver.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/xml/LocalEntityResolver.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLDocumentTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLDocumentTest.java
index 7d73d7d..a1c1a94 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLDocumentTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLDocumentTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLElementTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLElementTest.java
index ddc98f9..735f88b 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLElementTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLElementTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLGroupVisitorTest.java b/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLGroupVisitorTest.java
index 80432bd..1f5a2a4 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLGroupVisitorTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLGroupVisitorTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLSupport.java b/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLSupport.java
index 8c512cd..00d5d25 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLSupport.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/internal/xml/XMLSupport.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report.test/src/org/jacoco/report/xml/XMLFormatterTest.java b/org.jacoco.report.test/src/org/jacoco/report/xml/XMLFormatterTest.java
index e86be92..b96815e 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/xml/XMLFormatterTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/xml/XMLFormatterTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/.gitignore b/org.jacoco.report/.gitignore
deleted file mode 100644
index fefebc3..0000000
--- a/org.jacoco.report/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/bin
-/.settings
diff --git a/org.jacoco.report/META-INF/MANIFEST.MF b/org.jacoco.report/META-INF/MANIFEST.MF
deleted file mode 100644
index 3f23b99..0000000
--- a/org.jacoco.report/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0

-Bundle-ManifestVersion: 2

-Bundle-Name: JaCoCo Report

-Bundle-SymbolicName: org.jacoco.report

-Bundle-Version: 0.7.5.201505241946

-Bundle-RequiredExecutionEnvironment: J2SE-1.5

-Bundle-Vendor: Mountainminds GmbH & Co. KG

-Export-Package: org.jacoco.report;version="0.7.5",

- org.jacoco.report.check;version="0.7.5",

- org.jacoco.report.csv;version="0.7.5",

- org.jacoco.report.html;version="0.7.5",

- org.jacoco.report.xml;version="0.7.5"

-Import-Package: org.jacoco.core;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.analysis;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.data;bundle-version="[0.7.5,0.7.6)",

- org.jacoco.core.runtime;bundle-version="[0.7.5,0.7.6)",

- org.objectweb.asm;version="[5.0.1,5.1.0)"

diff --git a/org.jacoco.report/build.properties b/org.jacoco.report/build.properties
deleted file mode 100644
index a657887..0000000
--- a/org.jacoco.report/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/

-output.. = bin/

-bin.includes = META-INF/,\

-               .,\

-               about.html

diff --git a/org.jacoco.report/pom.xml b/org.jacoco.report/pom.xml
index 08dd8db..19907e9 100644
--- a/org.jacoco.report/pom.xml
+++ b/org.jacoco.report/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -15,14 +15,14 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.build</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.build</relativePath>
   </parent>
 
   <artifactId>org.jacoco.report</artifactId>
 
   <name>JaCoCo :: Report</name>
-  <description>JaCoCo Reporting</description>
+  <description>JaCoCo Report</description>
 
   <dependencies>
     <dependency>
@@ -37,5 +37,29 @@
 
   <build>
     <sourceDirectory>src</sourceDirectory>
+
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>manifest</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+    </plugins>
   </build>
 </project>
diff --git a/org.jacoco.report/src/org/jacoco/report/DirectorySourceFileLocator.java b/org.jacoco.report/src/org/jacoco/report/DirectorySourceFileLocator.java
index 7866ea0..11657f8 100644
--- a/org.jacoco.report/src/org/jacoco/report/DirectorySourceFileLocator.java
+++ b/org.jacoco.report/src/org/jacoco/report/DirectorySourceFileLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/FileMultiReportOutput.java b/org.jacoco.report/src/org/jacoco/report/FileMultiReportOutput.java
index d26c196..1494cc7 100644
--- a/org.jacoco.report/src/org/jacoco/report/FileMultiReportOutput.java
+++ b/org.jacoco.report/src/org/jacoco/report/FileMultiReportOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/ILanguageNames.java b/org.jacoco.report/src/org/jacoco/report/ILanguageNames.java
index 9a0ae72..7881218 100644
--- a/org.jacoco.report/src/org/jacoco/report/ILanguageNames.java
+++ b/org.jacoco.report/src/org/jacoco/report/ILanguageNames.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/IMultiReportOutput.java b/org.jacoco.report/src/org/jacoco/report/IMultiReportOutput.java
index fdadb75..96daad8 100644
--- a/org.jacoco.report/src/org/jacoco/report/IMultiReportOutput.java
+++ b/org.jacoco.report/src/org/jacoco/report/IMultiReportOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/IReportGroupVisitor.java b/org.jacoco.report/src/org/jacoco/report/IReportGroupVisitor.java
index ae99919..01a8132 100644
--- a/org.jacoco.report/src/org/jacoco/report/IReportGroupVisitor.java
+++ b/org.jacoco.report/src/org/jacoco/report/IReportGroupVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java b/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java
index ae3edf8..c11ce4b 100644
--- a/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java
+++ b/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/ISourceFileLocator.java b/org.jacoco.report/src/org/jacoco/report/ISourceFileLocator.java
index 918b200..1e4049d 100644
--- a/org.jacoco.report/src/org/jacoco/report/ISourceFileLocator.java
+++ b/org.jacoco.report/src/org/jacoco/report/ISourceFileLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/InputStreamSourceFileLocator.java b/org.jacoco.report/src/org/jacoco/report/InputStreamSourceFileLocator.java
index 924f092..deab8fb 100644
--- a/org.jacoco.report/src/org/jacoco/report/InputStreamSourceFileLocator.java
+++ b/org.jacoco.report/src/org/jacoco/report/InputStreamSourceFileLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/JavaNames.java b/org.jacoco.report/src/org/jacoco/report/JavaNames.java
index 6813cdb..fcb7cc0 100644
--- a/org.jacoco.report/src/org/jacoco/report/JavaNames.java
+++ b/org.jacoco.report/src/org/jacoco/report/JavaNames.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java b/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java
index 5ed34ec..3a69673 100644
--- a/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java
+++ b/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/MultiSourceFileLocator.java b/org.jacoco.report/src/org/jacoco/report/MultiSourceFileLocator.java
index 8029727..a059747 100644
--- a/org.jacoco.report/src/org/jacoco/report/MultiSourceFileLocator.java
+++ b/org.jacoco.report/src/org/jacoco/report/MultiSourceFileLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/ZipMultiReportOutput.java b/org.jacoco.report/src/org/jacoco/report/ZipMultiReportOutput.java
index b61e75f..51ae2e6 100644
--- a/org.jacoco.report/src/org/jacoco/report/ZipMultiReportOutput.java
+++ b/org.jacoco.report/src/org/jacoco/report/ZipMultiReportOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/check/BundleChecker.java b/org.jacoco.report/src/org/jacoco/report/check/BundleChecker.java
index cf7b35d..a17872e 100644
--- a/org.jacoco.report/src/org/jacoco/report/check/BundleChecker.java
+++ b/org.jacoco.report/src/org/jacoco/report/check/BundleChecker.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/check/IViolationsOutput.java b/org.jacoco.report/src/org/jacoco/report/check/IViolationsOutput.java
index 29639a4..ae6a2be 100644
--- a/org.jacoco.report/src/org/jacoco/report/check/IViolationsOutput.java
+++ b/org.jacoco.report/src/org/jacoco/report/check/IViolationsOutput.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/check/Limit.java b/org.jacoco.report/src/org/jacoco/report/check/Limit.java
index 0ce50e2..fb5a722 100644
--- a/org.jacoco.report/src/org/jacoco/report/check/Limit.java
+++ b/org.jacoco.report/src/org/jacoco/report/check/Limit.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/check/Rule.java b/org.jacoco.report/src/org/jacoco/report/check/Rule.java
index 342fa29..f34c6cd 100644
--- a/org.jacoco.report/src/org/jacoco/report/check/Rule.java
+++ b/org.jacoco.report/src/org/jacoco/report/check/Rule.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java b/org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java
index 7215973..9975638 100644
--- a/org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java
+++ b/org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/check/package-info.java b/org.jacoco.report/src/org/jacoco/report/check/package-info.java
index ac2bad2..8ef8452 100644
--- a/org.jacoco.report/src/org/jacoco/report/check/package-info.java
+++ b/org.jacoco.report/src/org/jacoco/report/check/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java b/org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java
index f62313a..3aabd67 100644
--- a/org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java
+++ b/org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/csv/CSVGroupHandler.java b/org.jacoco.report/src/org/jacoco/report/csv/CSVGroupHandler.java
index 9b4444b..41eac04 100644
--- a/org.jacoco.report/src/org/jacoco/report/csv/CSVGroupHandler.java
+++ b/org.jacoco.report/src/org/jacoco/report/csv/CSVGroupHandler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/csv/ClassRowWriter.java b/org.jacoco.report/src/org/jacoco/report/csv/ClassRowWriter.java
index e5ba079..2e10fd6 100644
--- a/org.jacoco.report/src/org/jacoco/report/csv/ClassRowWriter.java
+++ b/org.jacoco.report/src/org/jacoco/report/csv/ClassRowWriter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/csv/DelimitedWriter.java b/org.jacoco.report/src/org/jacoco/report/csv/DelimitedWriter.java
index 8feea79..198ce51 100644
--- a/org.jacoco.report/src/org/jacoco/report/csv/DelimitedWriter.java
+++ b/org.jacoco.report/src/org/jacoco/report/csv/DelimitedWriter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/csv/package-info.java b/org.jacoco.report/src/org/jacoco/report/csv/package-info.java
index 0ba2815..82ee865 100644
--- a/org.jacoco.report/src/org/jacoco/report/csv/package-info.java
+++ b/org.jacoco.report/src/org/jacoco/report/csv/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java b/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
index 55b7ea9..b99e050 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/html/package-info.java b/org.jacoco.report/src/org/jacoco/report/html/package-info.java
index 33a844c..381ecde 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/package-info.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/AbstractGroupVisitor.java b/org.jacoco.report/src/org/jacoco/report/internal/AbstractGroupVisitor.java
index d57d1b6..0a51fca 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/AbstractGroupVisitor.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/AbstractGroupVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/NormalizedFileNames.java b/org.jacoco.report/src/org/jacoco/report/internal/NormalizedFileNames.java
index 12f9f0a..b70e1d2 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/NormalizedFileNames.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/NormalizedFileNames.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/ReportOutputFolder.java b/org.jacoco.report/src/org/jacoco/report/internal/ReportOutputFolder.java
index 6b78d5e..78f4fee 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/ReportOutputFolder.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/ReportOutputFolder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLDocument.java b/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLDocument.java
index 2eab071..f1c45f2 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLDocument.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLDocument.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLElement.java b/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLElement.java
index 797e23b..ae8b9a3 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLElement.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLElement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLGroupVisitor.java b/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLGroupVisitor.java
index 8d42326..bcc949a 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLGroupVisitor.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/HTMLGroupVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/IHTMLReportContext.java b/org.jacoco.report/src/org/jacoco/report/internal/html/IHTMLReportContext.java
index f5fc741..ac8b5cc 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/IHTMLReportContext.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/IHTMLReportContext.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/ILinkable.java b/org.jacoco.report/src/org/jacoco/report/internal/html/ILinkable.java
index 9f5779a..e5cef48 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/ILinkable.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/ILinkable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/index/ElementIndex.java b/org.jacoco.report/src/org/jacoco/report/internal/html/index/ElementIndex.java
index 3f7d355..4ef3aaa 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/index/ElementIndex.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/index/ElementIndex.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/index/IIndexUpdate.java b/org.jacoco.report/src/org/jacoco/report/internal/html/index/IIndexUpdate.java
index 4ba8a77..716b64e 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/index/IIndexUpdate.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/index/IIndexUpdate.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/index/package-info.java b/org.jacoco.report/src/org/jacoco/report/internal/html/index/package-info.java
index cdeb1ec..b9ceb09 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/index/package-info.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/index/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/BundlePage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/BundlePage.java
index 57b56bb..b0a076e 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/BundlePage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/BundlePage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/ClassPage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/ClassPage.java
index 4518903..deec30d 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/ClassPage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/ClassPage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/GroupPage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/GroupPage.java
index 40aaca0..5634e20 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/GroupPage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/GroupPage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/MethodItem.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/MethodItem.java
index 5a0cf54..88a443e 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/MethodItem.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/MethodItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/NodePage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/NodePage.java
index e73db90..609176b 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/NodePage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/NodePage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/PackagePage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/PackagePage.java
index 2146e4c..0968598 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/PackagePage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/PackagePage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/PackageSourcePage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/PackageSourcePage.java
index 4d591cc..822496a 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/PackageSourcePage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/PackageSourcePage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/ReportPage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/ReportPage.java
index ceb2d15..44e8fe8 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/ReportPage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/ReportPage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/SessionsPage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/SessionsPage.java
index c60bb3f..5b7a6e4 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/SessionsPage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/SessionsPage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -146,7 +146,7 @@
 
 	@Override
 	protected String getFileName() {
-		return ".sessions.html";
+		return "jacoco-sessions.html";
 	}
 
 	public String getLinkStyle() {
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceFileItem.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceFileItem.java
index 48f2854..9a6f774 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceFileItem.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceFileItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceFilePage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceFilePage.java
index a5f87a6..074b01d 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceFilePage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceFilePage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceHighlighter.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceHighlighter.java
index 1d34bda..3439cd4 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceHighlighter.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/SourceHighlighter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/page/TablePage.java b/org.jacoco.report/src/org/jacoco/report/internal/html/page/TablePage.java
index c3cfac9..ad62dba 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/page/TablePage.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/page/TablePage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/resources/Resources.java b/org.jacoco.report/src/org/jacoco/report/internal/html/resources/Resources.java
index cd56531..2110de1 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/resources/Resources.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/resources/Resources.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -51,7 +51,7 @@
 	 *            root folder of the report
 	 */
 	public Resources(final ReportOutputFolder root) {
-		folder = root.subFolder(".resources");
+		folder = root.subFolder("jacoco-resources");
 	}
 
 	/**
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/resources/Styles.java b/org.jacoco.report/src/org/jacoco/report/internal/html/resources/Styles.java
index 717110e..0a3d866 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/resources/Styles.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/resources/Styles.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/resources/package-info.java b/org.jacoco.report/src/org/jacoco/report/internal/html/resources/package-info.java
index f95b657..4d2e5c6 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/resources/package-info.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/resources/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/resources/sort.js b/org.jacoco.report/src/org/jacoco/report/internal/html/resources/sort.js
index 511e47c..26668cc 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/resources/sort.js
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/resources/sort.js
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/table/BarColumn.java b/org.jacoco.report/src/org/jacoco/report/internal/html/table/BarColumn.java
index a98c7ea..48fc7a2 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/table/BarColumn.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/table/BarColumn.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/table/CounterColumn.java b/org.jacoco.report/src/org/jacoco/report/internal/html/table/CounterColumn.java
index 3d37a42..8129ea4 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/table/CounterColumn.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/table/CounterColumn.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/table/IColumnRenderer.java b/org.jacoco.report/src/org/jacoco/report/internal/html/table/IColumnRenderer.java
index 5d49572..9a6b598 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/table/IColumnRenderer.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/table/IColumnRenderer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/table/ITableItem.java b/org.jacoco.report/src/org/jacoco/report/internal/html/table/ITableItem.java
index 5ede860..6566d0e 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/table/ITableItem.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/table/ITableItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/table/LabelColumn.java b/org.jacoco.report/src/org/jacoco/report/internal/html/table/LabelColumn.java
index 04ec798..c04797a 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/table/LabelColumn.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/table/LabelColumn.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/table/PercentageColumn.java b/org.jacoco.report/src/org/jacoco/report/internal/html/table/PercentageColumn.java
index 5e586f2..d93ce8b 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/table/PercentageColumn.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/table/PercentageColumn.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,7 +12,8 @@
 package org.jacoco.report.internal.html.table;
 
 import java.io.IOException;
-import java.text.DecimalFormat;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.NumberFormat;
 import java.util.Comparator;
 import java.util.List;
@@ -50,7 +51,7 @@
 	 */
 	public PercentageColumn(final CounterEntity entity, final Locale locale) {
 		this.entity = entity;
-		this.percentageFormat = DecimalFormat.getPercentInstance(locale);
+		this.percentageFormat = NumberFormat.getPercentInstance(locale);
 		comparator = new TableItemComparator(
 				CounterComparator.MISSEDRATIO.on(entity));
 	}
@@ -79,10 +80,21 @@
 		if (total == 0) {
 			td.text("n/a");
 		} else {
-			td.text(percentageFormat.format(counter.getCoveredRatio()));
+			td.text(format(counter.getCoveredRatio()));
 		}
 	}
 
+	/**
+	 * Ratio 199/(1+199)=0.995 must be displayed as "99%", not as "100%".
+	 * Unfortunately {@link NumberFormat} uses {@link RoundingMode#HALF_EVEN} by
+	 * default and ability to change available only starting from JDK 6, so
+	 * perform rounding using {@link RoundingMode#FLOOR} before formatting.
+	 */
+	private String format(double ratio) {
+		return percentageFormat.format(
+				BigDecimal.valueOf(ratio).setScale(2, RoundingMode.FLOOR));
+	}
+
 	public Comparator<ITableItem> getComparator() {
 		return comparator;
 	}
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/table/SortIndex.java b/org.jacoco.report/src/org/jacoco/report/internal/html/table/SortIndex.java
index 009caee..d46397b 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/table/SortIndex.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/table/SortIndex.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/table/Table.java b/org.jacoco.report/src/org/jacoco/report/internal/html/table/Table.java
index 3a31e8a..57325ee 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/table/Table.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/table/Table.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/table/TableItemComparator.java b/org.jacoco.report/src/org/jacoco/report/internal/html/table/TableItemComparator.java
index 442d1fc..7398298 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/table/TableItemComparator.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/table/TableItemComparator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/html/table/package-info.java b/org.jacoco.report/src/org/jacoco/report/internal/html/table/package-info.java
index 08dd984..63bb9f5 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/html/table/package-info.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/html/table/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLCoverageWriter.java b/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLCoverageWriter.java
index 97a246c..a969636 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLCoverageWriter.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLCoverageWriter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLDocument.java b/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLDocument.java
index e9fc237..2ae8a16 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLDocument.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLDocument.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLElement.java b/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLElement.java
index 0266be0..91fe95b 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLElement.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLElement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLGroupVisitor.java b/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLGroupVisitor.java
index 5dd7dde..004003f 100644
--- a/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLGroupVisitor.java
+++ b/org.jacoco.report/src/org/jacoco/report/internal/xml/XMLGroupVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/package-info.java b/org.jacoco.report/src/org/jacoco/report/package-info.java
index f625e05..a3c7bf9 100644
--- a/org.jacoco.report/src/org/jacoco/report/package-info.java
+++ b/org.jacoco.report/src/org/jacoco/report/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java b/org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java
index 59c96a5..dc303c5 100644
--- a/org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java
+++ b/org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/xml/package-info.java b/org.jacoco.report/src/org/jacoco/report/xml/package-info.java
index 870ee80..099166a 100644
--- a/org.jacoco.report/src/org/jacoco/report/xml/package-info.java
+++ b/org.jacoco.report/src/org/jacoco/report/xml/package-info.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/org.jacoco.report/src/org/jacoco/report/xml/report.dtd b/org.jacoco.report/src/org/jacoco/report/xml/report.dtd
index 3be680c..70ce1cf 100644
--- a/org.jacoco.report/src/org/jacoco/report/xml/report.dtd
+++ b/org.jacoco.report/src/org/jacoco/report/xml/report.dtd
@@ -1,5 +1,5 @@
 <!-- 
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
diff --git a/org.jacoco.tests/.gitignore b/org.jacoco.tests/.gitignore
deleted file mode 100644
index ea8c4bf..0000000
--- a/org.jacoco.tests/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/target
diff --git a/org.jacoco.tests/pom.xml b/org.jacoco.tests/pom.xml
index beb66b7..d363212 100644
--- a/org.jacoco.tests/pom.xml
+++ b/org.jacoco.tests/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
+   Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.jacoco</groupId>
     <artifactId>org.jacoco.build</artifactId>
-    <version>0.7.5.201505241946</version>
+    <version>0.7.10-SNAPSHOT</version>
     <relativePath>../org.jacoco.build</relativePath>
   </parent>
 
@@ -38,6 +38,7 @@
   <properties>
     <maven.deploy.skip>true</maven.deploy.skip>
     <maven.javadoc.skip>true</maven.javadoc.skip>
+    <sonar.skip>true</sonar.skip>
   </properties>
 
   <build>
@@ -49,7 +50,7 @@
         <artifactId>jacoco-maven-plugin</artifactId>
         <version>${project.version}</version>
         <configuration>
-          <exclClassLoaders>sun.reflect.DelegatingClassLoader:org.jacoco.core.test.TargetLoader</exclClassLoaders>
+          <exclClassLoaders>sun.reflect.DelegatingClassLoader:org.jacoco.core.test.TargetLoader:org.jacoco.core.test.InstrumentingLoader</exclClassLoaders>
           <sessionId>${project.artifactId}</sessionId>
           <includes>
             <include>${jacoco.includes}</include>
diff --git a/pom.xml b/pom.xml
index b916c58..9919cd6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
 
   <groupId>org.jacoco</groupId>
   <artifactId>root</artifactId>
-  <version>0.7.5.201505241946</version>
+  <version>0.7.10-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <modules>