diff --git a/Android.bp b/Android.bp
index 7b7d3f4..0641bde 100644
--- a/Android.bp
+++ b/Android.bp
@@ -66,10 +66,7 @@
 // Generates stubs containing the classes that will be referenced by instrumented bytecode.
 droidstubs {
     name: "jacoco-stubs-gen",
-    srcs: [
-        "org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java",
-        "org.jacoco.core/src/org/jacoco/core/data/IExecutionData.java",
-    ],
+    srcs: ["org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java"],
 }
 
 // A stubs target containing the parts of JaCoCo that we need to add to the hidden API whitelist.
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 ee9d40b..69a9909 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
@@ -16,7 +16,6 @@
 import java.util.Properties;
 
 import org.jacoco.core.data.ExecutionData;
-import org.jacoco.core.data.IExecutionData;
 import org.jacoco.core.data.ExecutionDataStore;
 import org.jacoco.core.runtime.AgentOptions;
 import org.jacoco.core.runtime.RuntimeData;
@@ -29,7 +28,7 @@
 
 	// BEGIN android-change
 	// private static final RuntimeData DATA;
-	private static final Map<Long, IExecutionData> DATA = new HashMap<Long, IExecutionData>();
+	private static final Map<Long, ExecutionData> DATA = new HashMap<Long, ExecutionData>();
 	// END android-change
 	private static final String CONFIG_RESOURCE = "/jacoco-agent.properties";
 
@@ -45,7 +44,6 @@
 		// no instances
 	}
 
-	// BEGIN android-change
 	/**
 	 * API for offline instrumented classes.
 	 * 
@@ -55,25 +53,27 @@
 	 *            VM class name
 	 * @param probecount
 	 *            probe count for this class
-	 * @return IExecutionData instance for this class
+	 * @return probe array instance for this class
 	 */
-	public static IExecutionData getExecutionData(final long classid,
+	public static boolean[] getProbes(final long classid,
 			final String classname, final int probecount) {
+		// BEGIN android-change
 		// return DATA.getExecutionData(Long.valueOf(classid), classname,
 		//		probecount).getProbes();
 		synchronized (DATA) {
-			IExecutionData entry = DATA.get(classid);
+			ExecutionData entry = DATA.get(classid);
 			if (entry == null) {
 				entry = new ExecutionData(classid, classname, probecount);
 				DATA.put(classid, entry);
 			} else {
 				entry.assertCompatibility(classid, classname, probecount);
 			}
-			return entry;
+			return entry.getProbes();
 		}
+		// END android-change
 	}
-	// END android-change
 
+	// BEGIN android-change
 	/**
 	 * Creates a default agent, using config loaded from the classpath resource and the system
 	 * properties, and a runtime data instance populated with the execution data accumulated by
@@ -87,7 +87,7 @@
 				System.getProperties());
 		synchronized (DATA) {
 			ExecutionDataStore store = new ExecutionDataStore();
-			for (IExecutionData data : DATA.values()) {
+			for (ExecutionData data : DATA.values()) {
 				store.put(data);
 			}
 			return Agent.getInstance(new AgentOptions(config), new RuntimeData(store));
diff --git a/org.jacoco.cli/src/org/jacoco/cli/internal/commands/ExecInfo.java b/org.jacoco.cli/src/org/jacoco/cli/internal/commands/ExecInfo.java
index 4519d28..cacf4cb 100644
--- a/org.jacoco.cli/src/org/jacoco/cli/internal/commands/ExecInfo.java
+++ b/org.jacoco.cli/src/org/jacoco/cli/internal/commands/ExecInfo.java
@@ -20,7 +20,7 @@
 import java.util.List;
 
 import org.jacoco.cli.internal.Command;
-import org.jacoco.core.data.IExecutionData;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.ExecutionDataReader;
 import org.jacoco.core.data.IExecutionDataVisitor;
 import org.jacoco.core.data.ISessionInfoVisitor;
@@ -68,15 +68,13 @@
 			}
 		});
 		reader.setExecutionDataVisitor(new IExecutionDataVisitor() {
-			// BEGIN android-change
-			public void visitClassExecution(final IExecutionData data) {
+			public void visitClassExecution(final ExecutionData data) {
 				out.printf("%016x  %3d of %3d   %s%n",
 						Long.valueOf(data.getId()),
-						Integer.valueOf(getHitCount(data.getProbesCopy())),
-						Integer.valueOf(data.getProbeCount()),
+						Integer.valueOf(getHitCount(data.getProbes())),
+						Integer.valueOf(data.getProbes().length),
 						data.getName());
 			}
-			// END android-change
 		});
 		reader.read();
 		in.close();
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 7759b89..76b7be3 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/Analyzer.java
@@ -20,7 +20,7 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
-import org.jacoco.core.data.IExecutionData;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.ExecutionDataStore;
 import org.jacoco.core.internal.ContentTypeDetector;
 import org.jacoco.core.internal.InputStreams;
@@ -78,18 +78,16 @@
 	 */
 	private ClassVisitor createAnalyzingVisitor(final long classid,
 			final String className) {
-		// BEGIN android-change
-		final IExecutionData data = executionData.get(classid);
+		final ExecutionData data = executionData.get(classid);
 		final boolean[] probes;
 		final boolean noMatch;
 		if (data == null) {
 			probes = null;
 			noMatch = executionData.contains(className);
 		} else {
-			probes = data.getProbesCopy();
+			probes = data.getProbes();
 			noMatch = false;
 		}
-		// END android-change
 		final ClassCoverageImpl coverage = new ClassCoverageImpl(className,
 				classid, noMatch);
 		final ClassAnalyzer analyzer = new ClassAnalyzer(coverage, probes,
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 a728e03..d98775e 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionData.java
@@ -20,9 +20,7 @@
  * has to be taken about the probe data array of type <code>boolean[]</code>
  * which can be modified.
  */
-// BEGIN android-change
-public final class ExecutionData implements IExecutionData {
-// END android-change
+public final class ExecutionData {
 
 	private final long id;
 
@@ -83,45 +81,17 @@
 		return name;
 	}
 
-	// BEGIN android-change
 	/**
-	 * Returns a copy of the current probe values.
-	 *
-	 * @return copy of the probe array
-	 */
-	public boolean[] getProbesCopy() {
-		return Arrays.copyOf(probes, probes.length);
-	}
-
-	/**
-	 * The number of probes in this ExecutionData.
-	 *
-	 * @return the number of probes
-	 */
-	public int getProbeCount() {
-		return probes.length;
-	}
-
-	/**
-	 * Returns the execution data probe for a given index. A value of
-	 * <code>true</code> indicates that the corresponding probe was
-	 * executed.
+	 * Returns the execution data probes. A value of <code>true</code> indicates
+	 * that the corresponding probe was executed.
 	 * 
 	 * @return probe data
 	 */
-	public boolean getProbe(final int index) {
-		return probes[index];
+	public boolean[] getProbes() {
+		return probes;
 	}
 
 	/**
-	 * Sets the execution data probe for a given index to <code>true</code>.
-	 */
-	public void setProbe(final int index) {
-		probes[index] = true;
-	}
-	// END android-change
-
-	/**
 	 * Sets all probes to <code>false</code>.
 	 */
 	public void reset() {
@@ -157,9 +127,7 @@
 	 * @param other
 	 *            execution data to merge
 	 */
-	// BEGIN android-change
-	public void merge(final IExecutionData other) {
-	// END android-change
+	public void merge(final ExecutionData other) {
 		merge(other, true);
 	}
 
@@ -186,12 +154,10 @@
 	 * @param flag
 	 *            merge mode
 	 */
-	public void merge(final IExecutionData other, final boolean flag) {
-		// BEGIN android-change
+	public void merge(final ExecutionData other, final boolean flag) {
 		assertCompatibility(other.getId(), other.getName(),
-				other.getProbeCount());
-		final boolean[] otherData = other.getProbesCopy();
-		// END android-change
+				other.getProbes().length);
+		final boolean[] otherData = other.getProbes();
 		for (int i = 0; i < probes.length; i++) {
 			if (otherData[i]) {
 				probes[i] = flag;
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 ce0bec4..3e567a3 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
@@ -28,9 +28,7 @@
  */
 public final class ExecutionDataStore implements IExecutionDataVisitor {
 
-	// BEGIN android-change
-	private final Map<Long, IExecutionData> entries = new HashMap<Long, IExecutionData>();
-	// END android-change
+	private final Map<Long, ExecutionData> entries = new HashMap<Long, ExecutionData>();
 
 	private final Set<String> names = new HashSet<String>();
 
@@ -46,11 +44,9 @@
 	 *             to a corresponding one, that is already contained
 	 * @see ExecutionData#assertCompatibility(long, String, int)
 	 */
-	// BEGIN android-change
-	public void put(final IExecutionData data) throws IllegalStateException {
+	public void put(final ExecutionData data) throws IllegalStateException {
 		final Long id = Long.valueOf(data.getId());
-		final IExecutionData entry = entries.get(id);
-		// END android-change
+		final ExecutionData entry = entries.get(id);
 		if (entry == null) {
 			entries.put(id, data);
 			names.add(data.getName());
@@ -72,11 +68,9 @@
 	 *             to a corresponding one, that is already contained
 	 * @see ExecutionData#assertCompatibility(long, String, int)
 	 */
-	// BEGIN android-change
-	public void subtract(final IExecutionData data) throws IllegalStateException {
+	public void subtract(final ExecutionData data) throws IllegalStateException {
 		final Long id = Long.valueOf(data.getId());
-		final IExecutionData entry = entries.get(id);
-		// END android-change
+		final ExecutionData entry = entries.get(id);
 		if (entry != null) {
 			entry.merge(data, false);
 		}
@@ -90,9 +84,7 @@
 	 * @see #subtract(ExecutionData)
 	 */
 	public void subtract(final ExecutionDataStore store) {
-		// BEGIN android-change
-		for (final IExecutionData data : store.getContents()) {
-		// END android-change
+		for (final ExecutionData data : store.getContents()) {
 			subtract(data);
 		}
 	}
@@ -105,9 +97,7 @@
 	 *            class id
 	 * @return execution data or <code>null</code>
 	 */
-	// BEGIN android-change
-	public IExecutionData get(final long id) {
-	// END android-change
+	public ExecutionData get(final long id) {
 		return entries.get(Long.valueOf(id));
 	}
 
@@ -136,11 +126,9 @@
 	 *            probe data length
 	 * @return execution data
 	 */
-	// BEGIN android-change
-	public IExecutionData get(final Long id, final String name,
+	public ExecutionData get(final Long id, final String name,
 			final int probecount) {
-		IExecutionData entry = entries.get(id);
-		// END android-change
+		ExecutionData entry = entries.get(id);
 		if (entry == null) {
 			entry = new ExecutionData(id.longValue(), name, probecount);
 			entries.put(id, entry);
@@ -156,9 +144,7 @@
 	 * execution data objects itself are not removed.
 	 */
 	public void reset() {
-		// BEGIN android-change
-		for (final IExecutionData executionData : this.entries.values()) {
-		// END android-change
+		for (final ExecutionData executionData : this.entries.values()) {
 			executionData.reset();
 		}
 	}
@@ -168,11 +154,9 @@
 	 * 
 	 * @return current contents
 	 */
-	// BEGIN android-change
-	public Collection<IExecutionData> getContents() {
-		return new ArrayList<IExecutionData>(entries.values());
+	public Collection<ExecutionData> getContents() {
+		return new ArrayList<ExecutionData>(entries.values());
 	}
-	// END android-change
 
 	/**
 	 * Writes the content of the store to the given visitor interface.
@@ -181,18 +165,14 @@
 	 *            interface to write content to
 	 */
 	public void accept(final IExecutionDataVisitor visitor) {
-		// BEGIN android-change
-		for (final IExecutionData data : getContents()) {
-		// END android-change
+		for (final ExecutionData data : getContents()) {
 			visitor.visitClassExecution(data);
 		}
 	}
 
 	// === IExecutionDataVisitor ===
 
-	// BEGIN android-change
-	public void visitClassExecution(final IExecutionData data) {
-	// END android-change
+	public void visitClassExecution(final ExecutionData data) {
 		put(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 bdf3445..e697dda 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataWriter.java
@@ -94,17 +94,13 @@
 		}
 	}
 
-	// BEGIN android-change
-	public void visitClassExecution(final IExecutionData data) {
-	// END android-change
+	public void visitClassExecution(final ExecutionData data) {
 		if (data.hasHits()) {
 			try {
 				out.writeByte(BLOCK_EXECUTIONDATA);
 				out.writeLong(data.getId());
 				out.writeUTF(data.getName());
-				// BEGIN android-change
-				out.writeBooleanArray(data.getProbesCopy());
-				// END android-change
+				out.writeBooleanArray(data.getProbes());
 			} catch (final IOException e) {
 				throw new RuntimeException(e);
 			}
diff --git a/org.jacoco.core/src/org/jacoco/core/data/IExecutionData.java b/org.jacoco.core/src/org/jacoco/core/data/IExecutionData.java
deleted file mode 100644
index 289c372..0000000
--- a/org.jacoco.core/src/org/jacoco/core/data/IExecutionData.java
+++ /dev/null
@@ -1,129 +0,0 @@
-// BEGIN android-change
-package org.jacoco.core.data;
-
-/**
- * Interface for interacting with execution data for a single Java class.
- */
-public interface IExecutionData {
-
-	/**
-	 * Return the unique identifier for this class. The identifier is the CRC64
-	 * checksum of the raw class file definition.
-	 * 
-	 * @return class identifier
-	 */
-	public abstract long getId();
-
-	/**
-	 * The VM name of the class.
-	 * 
-	 * @return VM name
-	 */
-	public abstract String getName();
-
-	/**
-	 * The number of instrumentation probes for this class.
-	 * 
-	 * @return number of probes
-	 */
-	public abstract int getProbeCount();
-
-	/**
-	 * Returns a copy of the probe data as a boolean array.
-	 *
-	 * Changes to the returned array will not be reflected in the execution data.
-	 * 
-	 * @return copy of the probe data
-	 */
-	public abstract boolean[] getProbesCopy();
-
-	/**
-	 * Sets all probes to <code>false</code>.
-	 */
-	public abstract void reset();
-
-	/**
-	 * Checks whether any probe has been hit.
-	 * 
-	 * @return <code>true</code>, if at least one probe has been hit
-	 */
-	public abstract boolean hasHits();
-
-	/**
-	 * 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
-	 * is
-	 * 
-	 * <pre>
-	 * A or B
-	 * </pre>
-	 * 
-	 * The probe array of the other object is not modified.
-	 * 
-	 * @param other
-	 *            execution data to merge
-	 */
-	public abstract void merge(final IExecutionData other);
-
-	/**
-	 * Merges the given execution data into the probe data of this object. A
-	 * probe in this object is set to the value of <code>flag</code> if the
-	 * corresponding other probe was executed. For <code>flag==true</code> this
-	 * corresponds to
-	 * 
-	 * <pre>
-	 * A or B
-	 * </pre>
-	 * 
-	 * For <code>flag==false</code> this can be considered as a subtraction
-	 * 
-	 * <pre>
-	 * A and not B
-	 * </pre>
-	 * 
-	 * The probe array of the other object is not modified.
-	 * 
-	 * @param other
-	 *            execution data to merge
-	 * @param flag
-	 *            merge mode
-	 */
-	public abstract void merge(final IExecutionData other, boolean flag);
-
-	/**
-	 * Asserts that this execution data object is compatible with the given
-	 * parameters. The purpose of this check is to detect a very unlikely class
-	 * id collision.
-	 * 
-	 * @param id
-	 *            other class id, must be the same
-	 * @param name
-	 *            other name, must be equal to this name
-	 * @param probecount
-	 *            probe data length, must be the same as for this data
-	 * @throws IllegalStateException
-	 *             if the given parameters do not match this instance
-	 */
-	public abstract void assertCompatibility(final long id, final String name, final int probeCount) throws IllegalStateException;
-
-	/**
-	 * Returns the execution data probe for a given index. A value of
-	 * <code>true</code> indicates that the corresponding probe was
-	 * executed.
-	 *
-	 * @param index  the probe's index to look up
-	 * 
-	 * @return probe data
-	 */
-	public abstract boolean getProbe(final int index);
-
-	/**
-	 * Sets the execution data probe at the given index to <code>true</code>.
-	 *
-	 * @param index  the probe's index to set
-	 * @param value  the value to set the probe to
-	 */
-	public abstract void setProbe(final int index);
-}
-// END android-change
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 14eabbe..6cea7c5 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/IExecutionDataVisitor.java
@@ -24,8 +24,6 @@
 	 * @param data
 	 *            execution data for a class
 	 */
-	// BEGIN android-change
-	void visitClassExecution(IExecutionData data);
-	// END android-change
+	void visitClassExecution(ExecutionData data);
 
 }
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 4d4e1ba..85e83a3 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
@@ -77,9 +77,7 @@
 	 * Data type of the field that stores coverage information for a class (
 	 * <code>boolean[]</code>).
 	 */
-	// BEGIN android-change
-	public static final String DATAFIELD_DESC = "Lorg/jacoco/core/data/IExecutionData;";
-	// END android-change
+	public static final String DATAFIELD_DESC = "[Z";
 
 	// === Init Method ===
 
@@ -91,9 +89,7 @@
 	/**
 	 * Descriptor of the initialization method.
 	 */
-	// BEGIN android-change
-	public static final String INITMETHOD_DESC = "()Lorg/jacoco/core/data/IExecutionData;";
-	// END android-change
+	public static final String INITMETHOD_DESC = "()[Z";
 
 	/**
 	 * Access modifiers of the initialization method.
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 0cac8f8..63fbf76 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
@@ -67,20 +67,25 @@
 
 	public void insertProbe(final int id) {
 
-		// BEGIN android-change
-		// For a probe we call setProbe on the IExecutionData object.
+		// For a probe we set the corresponding position in the boolean[] array
+		// to true.
 
 		mv.visitVarInsn(Opcodes.ALOAD, variable);
 
-		// Stack[0]: Lorg/jacoco/core/data/IExecutionData;
+		// Stack[0]: [Z
 
 		InstrSupport.push(mv, id);
 
 		// Stack[1]: I
-		// Stack[0]: Lorg/jacoco/core/data/IExecutionData;
+		// Stack[0]: [Z
 
-		mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "org/jacoco/core/data/IExecutionData", "setProbe", "(I)V", true);
-		// END android-change
+		mv.visitInsn(Opcodes.ICONST_1);
+
+		// Stack[2]: I
+		// Stack[1]: I
+		// Stack[0]: [Z
+
+		mv.visitInsn(Opcodes.BASTORE);
 	}
 
 	@Override
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 bef4203..7255395 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/LoggerRuntime.java
@@ -168,9 +168,7 @@
 		@Override
 		public void publish(final LogRecord record) {
 			if (key.equals(record.getMessage())) {
-				// BEGIN android-change
-				data.getExecutionData(record.getParameters());
-				// END android-change
+				data.getProbes(record.getParameters());
 			}
 		}
 
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 a5e88b6..af6671e 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/OfflineInstrumentationAccessGenerator.java
@@ -50,10 +50,8 @@
 		mv.visitLdcInsn(Long.valueOf(classid));
 		mv.visitLdcInsn(classname);
 		InstrSupport.push(mv, probecount);
-		// BEGIN android-change
-		mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeClassName, "getExecutionData",
-				"(JLjava/lang/String;I)Lorg/jacoco/core/data/IExecutionData;", false);
-		// END android-change
+		mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeClassName, "getProbes",
+				"(JLjava/lang/String;I)[Z", false);
 		return 4;
 	}
 
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 c0fbb65..afb5b7f 100644
--- a/org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java
+++ b/org.jacoco.core/src/org/jacoco/core/runtime/RuntimeData.java
@@ -11,7 +11,7 @@
  *******************************************************************************/
 package org.jacoco.core.runtime;
 
-import org.jacoco.core.data.IExecutionData;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.ExecutionDataStore;
 import org.jacoco.core.data.IExecutionDataVisitor;
 import org.jacoco.core.data.ISessionInfoVisitor;
@@ -128,18 +128,15 @@
 	 *            probe data length
 	 * @return execution data
 	 */
-	// BEGIN android-change
-	public IExecutionData getExecutionData(final Long id, final String name,
+	public ExecutionData getExecutionData(final Long id, final String name,
 			final int probecount) {
-	// END android-change
 		synchronized (store) {
 			return store.get(id, name, probecount);
 		}
 	}
 
-	// BEGIN android-change
 	/**
-	 * Retrieves the execution data for a given class. The passed
+	 * Retrieves the execution probe array for a given class. The passed
 	 * {@link Object} array instance is used for parameters and the return value
 	 * as follows. Call parameters:
 	 * 
@@ -152,19 +149,18 @@
 	 * Return value:
 	 * 
 	 * <ul>
-	 * <li>args[0]: execution data ({@link IExecutionData})
+	 * <li>args[0]: probe array (<code>boolean[]</code>)
 	 * </ul>
 	 * 
 	 * @param args
 	 *            parameter array of length 3
 	 */
-	public void getExecutionData(final Object[] args) {
+	public void getProbes(final Object[] args) {
 		final Long classid = (Long) args[0];
 		final String name = (String) args[1];
 		final int probecount = ((Integer) args[2]).intValue();
-		args[0] = getExecutionData(classid, name, probecount);
+		args[0] = getExecutionData(classid, name, probecount).getProbes();
 	}
-	// END android-change
 
 	/**
 	 * In violation of the regular semantic of {@link Object#equals(Object)}
@@ -177,9 +173,7 @@
 	@Override
 	public boolean equals(final Object args) {
 		if (args instanceof Object[]) {
-			// BEGIN android-change
-			getExecutionData((Object[]) args);
-			// END android-change
+			getProbes((Object[]) args);
 		}
 		return super.equals(args);
 	}
diff --git a/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java b/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java
index 1cf4aed..db36796 100644
--- a/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java
+++ b/org.jacoco.report/src/org/jacoco/report/IReportVisitor.java
@@ -15,7 +15,7 @@
 import java.util.Collection;
 import java.util.List;
 
-import org.jacoco.core.data.IExecutionData;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.SessionInfo;
 
 /**
@@ -39,9 +39,7 @@
 	 *             in case of IO problems with the report writer
 	 */
 	void visitInfo(List<SessionInfo> sessionInfos,
-			// BEGIN android-change
-			Collection<IExecutionData> executionData) throws IOException;
-			// END android-change
+			Collection<ExecutionData> executionData) throws IOException;
 
 	/**
 	 * Has to be called after all report data has been emitted.
diff --git a/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java b/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java
index f4fefa8..3cd5e55 100644
--- a/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java
+++ b/org.jacoco.report/src/org/jacoco/report/MultiReportVisitor.java
@@ -17,7 +17,7 @@
 import java.util.List;
 
 import org.jacoco.core.analysis.IBundleCoverage;
-import org.jacoco.core.data.IExecutionData;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.SessionInfo;
 
 /**
@@ -41,9 +41,7 @@
 	}
 
 	public void visitInfo(final List<SessionInfo> sessionInfos,
-			// BEGIN android-change
-			final Collection<IExecutionData> executionData) throws IOException {
-			// END android-chnage
+			final Collection<ExecutionData> executionData) throws IOException {
 		for (final IReportVisitor v : visitors) {
 			v.visitInfo(sessionInfos, executionData);
 		}
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 f743560..cc6acf0 100644
--- a/org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java
+++ b/org.jacoco.report/src/org/jacoco/report/check/RulesChecker.java
@@ -17,7 +17,7 @@
 import java.util.List;
 
 import org.jacoco.core.analysis.IBundleCoverage;
-import org.jacoco.core.data.IExecutionData;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.SessionInfo;
 import org.jacoco.report.ILanguageNames;
 import org.jacoco.report.IReportGroupVisitor;
@@ -86,9 +86,7 @@
 			}
 
 			public void visitInfo(final List<SessionInfo> sessionInfos,
-					// BEGIN android-change
-					final Collection<IExecutionData> executionData)
-					// END android-change
+					final Collection<ExecutionData> executionData)
 					throws IOException {
 			}
 
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 42939da..793e215 100644
--- a/org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java
+++ b/org.jacoco.report/src/org/jacoco/report/csv/CSVFormatter.java
@@ -17,7 +17,7 @@
 import java.util.Collection;
 import java.util.List;
 
-import org.jacoco.core.data.IExecutionData;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.SessionInfo;
 import org.jacoco.report.ILanguageNames;
 import org.jacoco.report.IReportVisitor;
@@ -84,9 +84,7 @@
 			}
 
 			public void visitInfo(final List<SessionInfo> sessionInfos,
-					// BEGIN android-change
-					final Collection<IExecutionData> executionData)
-					// END android-change
+					final Collection<ExecutionData> executionData)
 					throws IOException {
 				// Info not used for CSV report
 			}
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 ce8cd2d..9994ced 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
@@ -18,7 +18,7 @@
 
 import org.jacoco.core.analysis.IBundleCoverage;
 import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
-import org.jacoco.core.data.IExecutionData;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.SessionInfo;
 import org.jacoco.report.ILanguageNames;
 import org.jacoco.report.IMultiReportOutput;
@@ -193,16 +193,12 @@
 		return new IReportVisitor() {
 
 			private List<SessionInfo> sessionInfos;
-			// BEGIN android-change
-			private Collection<IExecutionData> executionData;
-			// END android-change
+			private Collection<ExecutionData> executionData;
 
 			private HTMLGroupVisitor groupHandler;
 
 			public void visitInfo(final List<SessionInfo> sessionInfos,
-					// BEGIN android-change
-					final Collection<IExecutionData> executionData)
-					// END android-change
+					final Collection<ExecutionData> executionData)
 					throws IOException {
 				this.sessionInfos = sessionInfos;
 				this.executionData = executionData;
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 3a48902..67de494 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
@@ -20,7 +20,7 @@
 import java.util.Date;
 import java.util.List;
 
-import org.jacoco.core.data.IExecutionData;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.SessionInfo;
 import org.jacoco.report.ILanguageNames;
 import org.jacoco.report.internal.ReportOutputFolder;
@@ -48,7 +48,7 @@
 
 	private final DateFormat dateFormat;
 
-	private final List<IExecutionData> executionData;
+	private final List<ExecutionData> executionData;
 
 	private final ElementIndex index;
 
@@ -69,24 +69,18 @@
 	 *            settings context
 	 */
 	public SessionsPage(final List<SessionInfo> sessionInfos,
-			// BEGIN android-change
-			final Collection<IExecutionData> executionData,
-			// END android-change
+			final Collection<ExecutionData> executionData,
 			final ElementIndex index, final ReportPage parent,
 			final ReportOutputFolder folder, final IHTMLReportContext context) {
 		super(parent, folder, context);
 		this.sessionInfos = sessionInfos;
-		// BEGIN android-change
-		this.executionData = new ArrayList<IExecutionData>(executionData);
-		// END android-change
+		this.executionData = new ArrayList<ExecutionData>(executionData);
 		this.index = index;
 		this.dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT,
 				DateFormat.DEFAULT, context.getLocale());
 		final ILanguageNames names = context.getLanguageNames();
-		// BEGIN android-change
-		Collections.sort(this.executionData, new Comparator<IExecutionData>() {
-			public int compare(final IExecutionData e1, final IExecutionData e2) {
-			// END android-change
+		Collections.sort(this.executionData, new Comparator<ExecutionData>() {
+			public int compare(final ExecutionData e1, final ExecutionData e2) {
 				return names.getQualifiedClassName(e1.getName()).compareTo(
 						names.getQualifiedClassName(e2.getName()));
 			}
@@ -135,9 +129,7 @@
 		}
 		final HTMLElement tbody = table.tbody();
 		final ILanguageNames names = context.getLanguageNames();
-		// BEGIN android-change
-		for (final IExecutionData e : executionData) {
-		// END android-change
+		for (final ExecutionData e : executionData) {
 			final HTMLElement tr = tbody.tr();
 			final String link = index.getLinkToClass(e.getId());
 			final String qualifiedName = names.getQualifiedClassName(e
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 3bda5ed..a1fee86 100644
--- a/org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java
+++ b/org.jacoco.report/src/org/jacoco/report/xml/XMLFormatter.java
@@ -17,7 +17,7 @@
 import java.util.List;
 
 import org.jacoco.core.analysis.IBundleCoverage;
-import org.jacoco.core.data.IExecutionData;
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.SessionInfo;
 import org.jacoco.report.IReportGroupVisitor;
 import org.jacoco.report.IReportVisitor;
@@ -61,9 +61,7 @@
 			private XMLGroupVisitor groupVisitor;
 
 			public void visitInfo(final List<SessionInfo> sessionInfos,
-					// BEGIN android-change
-					final Collection<IExecutionData> executionData)
-					// END android-change
+					final Collection<ExecutionData> executionData)
 					throws IOException {
 				this.sessionInfos = sessionInfos;
 			}
