Structural Equality on Condition does not Work
Because of the fairly complicated `equals` method in some of the subclasses of `AbstractCondition`, I decided to create some tests.

These show that the current implementation does not work. Looking a little closer at this issue:
- Calls to `super.equals`, `super.hashCode`, and `super.toString` revert back to the methods from the `Object` class, resulting in pointer equivalence instead of the desired structural equivalence.
- The four anonymous subclasses of `AbstractCondition` in `Logic` need to be made explicit, and require an equivalence equality as well.

I'm working on these issues in the `testing-conditions` branch.

diff --git a/core/src/main/java/com/crawljax/core/state/Eventable.java b/core/src/main/java/com/crawljax/core/state/Eventable.java
index f114e935..63156551 100644
--- a/core/src/main/java/com/crawljax/core/state/Eventable.java
+++ b/core/src/main/java/com/crawljax/core/state/Eventable.java
@@ -4,12 +4,9 @@
 package com.crawljax.core.state;
 
 import java.io.Serializable;
-import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Field;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.jgrapht.graph.DefaultEdge;
 import org.w3c.dom.Node;
 
@@ -17,6 +14,8 @@ import com.crawljax.core.CandidateElement;
 import com.crawljax.core.CrawljaxException;
 import com.crawljax.forms.FormInput;
 import com.crawljax.util.XPathHelper;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Objects;
 
 /**
  * Eventable class: an element having an event attached to it (onclick, onmouseover, ...) so that it
@@ -106,57 +105,6 @@ public class Eventable extends DefaultEdge implements Serializable {
 		this.relatedFrame = candidateElement.getRelatedFrame();
 	}
 
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * @return the String representation of this Eventable
-	 */
-	@Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		if (this.element != null) {
-			sb.append(this.getElement());
-		}
-		sb.append(' ').append(this.eventType).append(' ').append(this.identification);
-		return sb.toString();
-	}
-
-	/**
-	 * Returns a hashcode. Uses reflection to determine the fields to test.
-	 * 
-	 * @return the hashCode
-	 */
-	@Override
-	public int hashCode() {
-		String[] exclude = new String[1];
-		exclude[0] = "id";
-
-		return HashCodeBuilder.reflectionHashCode(this, exclude);
-	}
-
-	/**
-	 * Return true if equal. Uses reflection.
-	 * 
-	 * @param obj
-	 *            the object to compare to of type Eventable
-	 * @return true if both Objects are equal
-	 */
-
-	@Override
-	public boolean equals(Object obj) {
-		if (!(obj instanceof Eventable)) {
-			return false;
-		}
-
-		if (this == obj) {
-			return true;
-		}
-
-		Eventable rhs = (Eventable) obj;
-
-		return new EqualsBuilder().append(toString(), rhs.toString()).isEquals();
-	}
-
 	/**
 	 * @return the eventType.
 	 */
@@ -236,15 +184,13 @@ public class Eventable extends DefaultEdge implements Serializable {
 		this.relatedFormInputs = relatedFormInputs;
 	}
 
-	/* Horrible stuff happening below, don't look at it! */
-
 	/**
 	 * @return the source state.
 	 * @throws CrawljaxException
 	 *             if the source cannot be found.
 	 */
-	public StateVertex getSourceStateVertex() throws CrawljaxException {
-		return getSuperField("source");
+	public StateVertex getSourceStateVertex() {
+		return (StateVertex) getSource();
 
 	}
 
@@ -253,40 +199,65 @@ public class Eventable extends DefaultEdge implements Serializable {
 	 * @throws CrawljaxException
 	 *             if the target cannot be found.
 	 */
-	public StateVertex getTargetStateVertex() throws CrawljaxException {
-		return getSuperField("target");
+	public StateVertex getTargetStateVertex() {
+		return (StateVertex) getTarget();
 	}
 
-	private StateVertex getSuperField(String name) throws CrawljaxException {
+	/**
+	 * @return the relatedFrame
+	 */
+	public String getRelatedFrame() {
+		return relatedFrame;
+	}
+
+	@VisibleForTesting
+	void setSource(StateVertex source) {
+		setField("source", source);
+	}
+
+	private void setField(String fieldName, StateVertex source) {
+		Class<?> superclass = Eventable.class.getSuperclass().getSuperclass();
 		try {
-			return (StateVertex) searchSuperField(name).get(this);
-		} catch (IllegalArgumentException e) {
-			throw new CrawljaxException(e.getMessage(), e);
-		} catch (IllegalAccessException e) {
-			throw new CrawljaxException(e.getMessage(), e);
+			Field f = superclass.getDeclaredField(fieldName);
+			f.setAccessible(true);
+			f.set(this, source);
+		} catch (ReflectiveOperationException e) {
+			throw new CrawljaxException("Could not set the source field", e);
 		}
-
 	}
 
-	private Field searchSuperField(String name) {
-		Class<?> clazz = this.getClass().getSuperclass().getSuperclass();
-		Field[] fields = clazz.getDeclaredFields();
-		AccessibleObject.setAccessible(fields, true);
+	@VisibleForTesting
+	void setTarget(StateVertex target) {
+		setField("target", target);
+	}
 
-		for (Field field : fields) {
-			String fieldName = field.getName();
+	@Override
+	public String toString() {
+		return Objects.toStringHelper(this)
+		        .add("eventType", eventType)
+		        .add("identification", identification)
+		        .add("element", element)
+		        .add("source", getSource())
+		        .add("target", getTarget())
+		        .toString();
+	}
 
-			if (name.equals(fieldName)) {
-				return field;
-			}
-		}
-		throw new InternalError("Field was not found!");
+	@Override
+	public int hashCode() {
+		return Objects.hashCode(eventType, identification, element,
+		        this.getSource(), this.getTarget());
 	}
 
-	/**
-	 * @return the relatedFrame
-	 */
-	public String getRelatedFrame() {
-		return relatedFrame;
+	@Override
+	public boolean equals(Object object) {
+		if (object instanceof Eventable) {
+			Eventable that = (Eventable) object;
+			return Objects.equal(this.eventType, that.eventType)
+			        && Objects.equal(this.identification, that.identification)
+			        && Objects.equal(this.element, that.element)
+			        && Objects.equal(this.getSource(), that.getSource())
+			        && Objects.equal(this.getTarget(), that.getTarget());
+		}
+		return false;
 	}
 }
diff --git a/core/src/main/java/com/crawljax/core/state/StateFlowGraph.java b/core/src/main/java/com/crawljax/core/state/StateFlowGraph.java
index 1312ab2e..5b3c9fdb 100644
--- a/core/src/main/java/com/crawljax/core/state/StateFlowGraph.java
+++ b/core/src/main/java/com/crawljax/core/state/StateFlowGraph.java
@@ -164,13 +164,10 @@ public class StateFlowGraph implements Serializable {
 	 */
 	@GuardedBy("sfg")
 	public boolean addEdge(StateVertex sourceVert, StateVertex targetVert, Eventable clickable) {
+		clickable.setSource(sourceVert);
+		clickable.setTarget(targetVert);
 		synchronized (sfg) {
-			if (sfg.containsEdge(sourceVert, targetVert)
-			        && sfg.getAllEdges(sourceVert, targetVert).contains(clickable)) {
-				return false;
-			} else {
-				return sfg.addEdge(sourceVert, targetVert, clickable);
-			}
+			return sfg.addEdge(sourceVert, targetVert, clickable);
 		}
 	}
 
diff --git a/core/src/main/java/com/crawljax/core/state/StateVertex.java b/core/src/main/java/com/crawljax/core/state/StateVertex.java
index e6b6d5db..a936ac2e 100644
--- a/core/src/main/java/com/crawljax/core/state/StateVertex.java
+++ b/core/src/main/java/com/crawljax/core/state/StateVertex.java
@@ -4,12 +4,10 @@ import java.io.IOException;
 import java.io.Serializable;
 import java.util.Collection;
 
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.w3c.dom.Document;
 
 import com.crawljax.util.DomUtils;
-import com.google.common.base.Strings;
+import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Queues;
 
@@ -108,54 +106,26 @@ public class StateVertex implements Serializable {
 		return url;
 	}
 
-	/**
-	 * Returns a hashcode. Uses reflection to determine the fields to test.
-	 * 
-	 * @return the hashCode of this StateVertex
-	 */
 	@Override
 	public int hashCode() {
-		HashCodeBuilder builder = new HashCodeBuilder();
-		if (Strings.isNullOrEmpty(strippedDom)) {
-			builder.append(dom);
-		} else {
-			builder.append(strippedDom);
-		}
-
-		return builder.toHashCode();
+		return Objects.hashCode(strippedDom);
 	}
 
-	/**
-	 * Compare this vertex to a other StateVertex.
-	 * 
-	 * @param obj
-	 *            the Object to compare this vertex
-	 * @return Return true if equal. Uses reflection.
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
 	@Override
-	public boolean equals(Object obj) {
-		if (!(obj instanceof StateVertex)) {
-			return false;
+	public boolean equals(Object object) {
+		if (object instanceof StateVertex) {
+			StateVertex that = (StateVertex) object;
+			return Objects.equal(this.strippedDom, that.strippedDom);
 		}
-
-		if (this == obj) {
-			return true;
-		}
-		final StateVertex rhs = (StateVertex) obj;
-
-		return new EqualsBuilder().append(this.strippedDom, rhs.getStrippedDom())
-		        .isEquals();
+		return false;
 	}
 
-	/**
-	 * Returns the name of this state as string.
-	 * 
-	 * @return a string representation of the current StateVertex
-	 */
 	@Override
 	public String toString() {
-		return name;
+		return Objects.toStringHelper(this)
+		        .add("id", id)
+		        .add("name", name)
+		        .toString();
 	}
 
 	/**
diff --git a/core/src/test/java/com/crawljax/core/state/EventableTest.java b/core/src/test/java/com/crawljax/core/state/EventableTest.java
index ca37ef6c..73c5d5a3 100644
--- a/core/src/test/java/com/crawljax/core/state/EventableTest.java
+++ b/core/src/test/java/com/crawljax/core/state/EventableTest.java
@@ -5,6 +5,7 @@ package com.crawljax.core.state;
 
 import static com.crawljax.core.state.Identification.How.xpath;
 import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -16,7 +17,9 @@ import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
 
+import org.junit.Ignore;
 import org.junit.Test;
+import org.mockito.Mockito;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.xml.sax.SAXException;
@@ -45,6 +48,25 @@ public class EventableTest {
 		assertNotSame(temp.hashCode(), c.hashCode());
 	}
 
+	@Test
+	public void EventablesWithDifferentStatesAreNotEqual() throws IllegalArgumentException,
+	        IllegalAccessException, NoSuchFieldException, SecurityException {
+		Identification id = new Identification(Identification.How.xpath, "/DIV");
+		Eventable event1 = new Eventable(id, EventType.click);
+		Eventable event2 = new Eventable(id, EventType.click);
+		assertThat(event1, is(event2));
+
+		StateVertex source = Mockito.mock(StateVertex.class);
+		StateVertex target1 = Mockito.mock(StateVertex.class);
+		StateVertex target2 = Mockito.mock(StateVertex.class);
+		event1.setSource(source);
+		event2.setSource(source);
+		assertThat(event1, is(event2));
+		event1.setTarget(target1);
+		event2.setTarget(target2);
+		assertThat(event1, is(not(event2)));
+	}
+
 	@Test
 	public void testToString() {
 		Eventable c =
@@ -75,6 +97,7 @@ public class EventableTest {
 	}
 
 	@Test
+	@Ignore("seems redundant")
 	public void testGetInfo() {
 		Eventable c =
 		        new Eventable(new Identification(Identification.How.xpath, "/body/div[3]"),
diff --git a/core/src/test/java/com/crawljax/core/state/PostCrawlStateGraphChecker.java b/core/src/test/java/com/crawljax/core/state/PostCrawlStateGraphChecker.java
index e604c484..9f22ce85 100644
--- a/core/src/test/java/com/crawljax/core/state/PostCrawlStateGraphChecker.java
+++ b/core/src/test/java/com/crawljax/core/state/PostCrawlStateGraphChecker.java
@@ -1,9 +1,8 @@
 package com.crawljax.core.state;
 
-import static org.hamcrest.collection.IsEmptyCollection.empty;
 import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.IsNot.not;
 import static org.hamcrest.core.IsNull.notNullValue;
+import static org.hamcrest.number.OrderingComparison.greaterThanOrEqualTo;
 import static org.junit.Assert.assertThat;
 
 import com.crawljax.core.CrawlSession;
@@ -25,15 +24,16 @@ public class PostCrawlStateGraphChecker implements PostCrawlingPlugin {
 		allEdgesConnectTwoStates(stateFlowGraph);
 	}
 
-	private void allEdgesConnectTwoStates(StateFlowGraph stateFlowGraph) {
+	private void allStatesHaveOneOreMoreIncomingEdges(StateFlowGraph stateFlowGraph) {
 		for (StateVertex state : stateFlowGraph.getAllStates()) {
 			if (stateFlowGraph.getInitialState().getId() != state.getId()) {
-				assertThat(stateFlowGraph.getIncomingClickable(state), is(not(empty())));
+				assertThat(stateFlowGraph.getIncomingClickable(state).size(),
+				        is(greaterThanOrEqualTo(1)));
 			}
 		}
 	}
 
-	private void allStatesHaveOneOreMoreIncomingEdges(StateFlowGraph stateFlowGraph) {
+	private void allEdgesConnectTwoStates(StateFlowGraph stateFlowGraph) {
 		for (Eventable eventable : stateFlowGraph.getAllEdges()) {
 			assertThat(eventable.getSourceStateVertex(), is(notNullValue()));
 			assertThat(eventable.getTargetStateVertex(), is(notNullValue()));
diff --git a/core/src/test/java/com/crawljax/core/state/StateFlowGraphTest.java b/core/src/test/java/com/crawljax/core/state/StateFlowGraphTest.java
index f63b933f..bc042e7e 100644
--- a/core/src/test/java/com/crawljax/core/state/StateFlowGraphTest.java
+++ b/core/src/test/java/com/crawljax/core/state/StateFlowGraphTest.java
@@ -1,7 +1,9 @@
 package com.crawljax.core.state;
 
-import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNot.not;
+import static org.hamcrest.core.IsNull.nullValue;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -41,31 +43,20 @@ public class StateFlowGraphTest {
 	}
 
 	@Test
-	public void testSFG() throws Exception {
-		StateVertex DOUBLE =
-		        new StateVertex(StateVertex.INDEX_ID, "index", "<table><div>index</div></table>");
-		assertTrue(graph.putIfAbsent(state2) == null);
-		assertTrue(graph.putIfAbsent(state3) == null);
-		assertTrue(graph.putIfAbsent(state4) == null);
-		assertTrue(graph.putIfAbsent(state5) == null);
-
-		assertFalse(graph.putIfAbsent(DOUBLE) == null);
-
-		assertTrue(graph.addEdge(index, state2, new Eventable(new Identification(How.xpath,
-		        "/body/div[4]"), EventType.click)));
-
-		assertTrue(graph.addEdge(state2, index, new Eventable(new Identification(How.xpath,
-		        "/body/div[89]"), EventType.click)));
+	public void testDuplicationAdding() throws Exception {
+		assertThat(graph.putIfAbsent(index), is(not(nullValue())));
+		assertThat(graph.putIfAbsent(state2), is(nullValue()));
+		assertThat(graph.putIfAbsent(state3), is(nullValue()));
+		assertThat(graph.putIfAbsent(state4), is(nullValue()));
+		assertThat(graph.putIfAbsent(state5), is(nullValue()));
 
-		assertTrue(graph.addEdge(state2, state3, new Eventable(new Identification(How.xpath,
-		        "/home/a"), EventType.click)));
-		assertTrue(graph.addEdge(index, state4, new Eventable(new Identification(How.xpath,
-		        "/body/div[2]/div"), EventType.click)));
-		assertTrue(graph.addEdge(state2, state5, new Eventable(new Identification(How.xpath,
-		        "/body/div[5]"), EventType.click)));
+		assertTrue(graph.addEdge(index, state2, newXpathEventable("/body/div[4]")));
+		assertTrue(graph.addEdge(state2, index, newXpathEventable("/body/div[89]")));
+		assertTrue(graph.addEdge(state2, state3, newXpathEventable("/home/a")));
+		assertTrue(graph.addEdge(index, state4, newXpathEventable("/body/div[2]/div")));
+		assertTrue(graph.addEdge(state2, state5, newXpathEventable("/body/div[5]")));
 
-		assertFalse(graph.addEdge(state2, state5, new Eventable(new Identification(How.xpath,
-		        "/body/div[5]"), EventType.click)));
+		assertFalse(graph.addEdge(state2, state5, newXpathEventable("/body/div[5]")));
 
 		Set<Eventable> clickables = graph.getOutgoingClickables(state2);
 		assertEquals(3, clickables.size());
@@ -111,6 +102,10 @@ public class StateFlowGraphTest {
 		assertTrue(allStates.size() == 5);
 	}
 
+	private Eventable newXpathEventable(String xPath) {
+		return new Eventable(new Identification(How.xpath, xPath), EventType.click);
+	}
+
 	@Test
 	public void testCloneStates() throws Exception {
 		StateVertex state3clone2 =
@@ -119,8 +114,7 @@ public class StateFlowGraphTest {
 		assertTrue(graph.putIfAbsent(state2) == null);
 		assertTrue(graph.putIfAbsent(state4) == null);
 		// assertFalse(graph.addState(state3));
-		assertTrue(graph.addEdge(index, state2, new Eventable(new Identification(How.xpath,
-		        "/body/div[4]"), EventType.click)));
+		assertTrue(graph.addEdge(index, state2, newXpathEventable("/body/div[4]")));
 
 		// if (graph.containsVertex(state3)) {
 		// StateVertix state_clone = graph.getStateInGraph(state3);
@@ -157,11 +151,8 @@ public class StateFlowGraphTest {
 
 	@Test
 	public void testDoubleEvents() {
-		Eventable c1 =
-		        new Eventable(new Identification(How.xpath, "/body/div[4]"), EventType.click);
-		Eventable c2 =
-		        new Eventable(new Identification(How.xpath, "/body/div[4]/div[2]"),
-		                EventType.click);
+		Eventable c1 = newXpathEventable("/body/div[4]");
+		Eventable c2 = newXpathEventable("/body/div[4]/div[2]");
 		graph.putIfAbsent(index);
 		graph.putIfAbsent(state2);
 
@@ -177,27 +168,17 @@ public class StateFlowGraphTest {
 		graph.putIfAbsent(state4);
 		graph.putIfAbsent(state5);
 
-		graph.addEdge(index, state2, new Eventable(new Identification(How.xpath, "/index/2"),
-		        EventType.click));
-		graph.addEdge(state2, index, new Eventable(new Identification(How.xpath, "/2/index"),
-		        EventType.click));
-		graph.addEdge(state2, state3, new Eventable(new Identification(How.xpath, "/2/3"),
-		        EventType.click));
-		graph.addEdge(index, state4, new Eventable(new Identification(How.xpath, "/index/4"),
-		        EventType.click));
-		graph.addEdge(state2, state5, new Eventable(new Identification(How.xpath, "/2/5"),
-		        EventType.click));
-		graph.addEdge(state4, index, new Eventable(new Identification(How.xpath, "/4/index"),
-		        EventType.click));
-		graph.addEdge(index, state5, new Eventable(new Identification(How.xpath, "/index/5"),
-		        EventType.click));
-		graph.addEdge(state4, state2, new Eventable(new Identification(How.xpath, "/4/2"),
-		        EventType.click));
-		graph.addEdge(state3, state5, new Eventable(new Identification(How.xpath, "/3/5"),
-		        EventType.click));
-
-		graph.addEdge(state3, state4, new Eventable(new Identification(How.xpath, "/3/4"),
-		        EventType.click));
+		graph.addEdge(index, state2, newXpathEventable("/index/2"));
+		graph.addEdge(state2, index, newXpathEventable("/2/index"));
+		graph.addEdge(state2, state3, newXpathEventable("/2/3"));
+		graph.addEdge(index, state4, newXpathEventable("/index/4"));
+		graph.addEdge(state2, state5, newXpathEventable("/2/5"));
+		graph.addEdge(state4, index, newXpathEventable("/4/index"));
+		graph.addEdge(index, state5, newXpathEventable("/index/5"));
+		graph.addEdge(state4, state2, newXpathEventable("/4/2"));
+		graph.addEdge(state3, state5, newXpathEventable("/3/5"));
+
+		graph.addEdge(state3, state4, newXpathEventable("/3/4"));
 
 		List<List<GraphPath<StateVertex, Eventable>>> results = graph.getAllPossiblePaths(index);
 
@@ -224,24 +205,15 @@ public class StateFlowGraphTest {
 		graph.putIfAbsent(state4);
 		graph.putIfAbsent(state5);
 
-		graph.addEdge(index, state2, new Eventable(new Identification(How.xpath, "/index/2"),
-		        EventType.click));
-		graph.addEdge(state2, index, new Eventable(new Identification(How.xpath, "/2/index"),
-		        EventType.click));
-		graph.addEdge(state2, state3, new Eventable(new Identification(How.xpath, "/2/3"),
-		        EventType.click));
-		graph.addEdge(index, state4, new Eventable(new Identification(How.xpath, "/index/4"),
-		        EventType.click));
-		graph.addEdge(state2, state5, new Eventable(new Identification(How.xpath, "/2/5"),
-		        EventType.click));
-		graph.addEdge(state4, index, new Eventable(new Identification(How.xpath, "/4/index"),
-		        EventType.click));
-		graph.addEdge(index, state5, new Eventable(new Identification(How.xpath, "/index/5"),
-		        EventType.click));
-		graph.addEdge(state4, state2, new Eventable(new Identification(How.xpath, "/4/2"),
-		        EventType.click));
-		graph.addEdge(state3, state5, new Eventable(new Identification(How.xpath, "/3/5"),
-		        EventType.click));
+		graph.addEdge(index, state2, newXpathEventable("/index/2"));
+		graph.addEdge(state2, index, newXpathEventable("/2/index"));
+		graph.addEdge(state2, state3, newXpathEventable("/2/3"));
+		graph.addEdge(index, state4, newXpathEventable("/index/4"));
+		graph.addEdge(state2, state5, newXpathEventable("/2/5"));
+		graph.addEdge(state4, index, newXpathEventable("/4/index"));
+		graph.addEdge(index, state5, newXpathEventable("/index/5"));
+		graph.addEdge(state4, state2, newXpathEventable("/4/2"));
+		graph.addEdge(state3, state5, newXpathEventable("/3/5"));
 
 		List<List<GraphPath<StateVertex, Eventable>>> results = graph.getAllPossiblePaths(index);
 
@@ -276,23 +248,23 @@ public class StateFlowGraphTest {
 		assertTrue(graph.putIfAbsent(state3) == null);
 		assertTrue(graph.putIfAbsent(state4) == null);
 
-		Eventable e1 = new Eventable(new Identification(How.xpath, "/4/index"), EventType.click);
+		Eventable e1 = newXpathEventable("/4/index");
 
-		Eventable e2 = new Eventable(new Identification(How.xpath, "/4/index"), EventType.click);
+		Eventable e2 = newXpathEventable("/4/index");
 
-		Eventable e3 = new Eventable(new Identification(How.xpath, "/4/index"), EventType.click);
+		Eventable e3 = newXpathEventable("/4/index");
 
-		Eventable e4 = new Eventable(new Identification(How.xpath, "/5/index"), EventType.click);
+		Eventable e4 = newXpathEventable("/5/index");
 
-		Eventable e5 = new Eventable(new Identification(How.xpath, "/4/index"), EventType.click);
-		Eventable e6 = new Eventable(new Identification(How.xpath, "/5/index"), EventType.click);
+		Eventable e5 = newXpathEventable("/4/index");
+		Eventable e6 = newXpathEventable("/5/index");
 
 		assertTrue(graph.addEdge(index, state2, e1));
 		assertFalse(graph.addEdge(index, state2, e1));
 		assertFalse(graph.addEdge(index, state2, e3));
 
-		assertFalse(graph.addEdge(state2, state3, e1));
 		assertTrue(graph.addEdge(state2, state3, e2));
+		assertFalse(graph.addEdge(state2, state3, e1));
 
 		assertTrue(graph.addEdge(index, state4, e3));
 		assertTrue(graph.addEdge(index, state4, e4));
diff --git a/plugins/crawloverview-plugin/src/main/java/com/crawljax/plugins/crawloverview/CrawlOverview.java b/plugins/crawloverview-plugin/src/main/java/com/crawljax/plugins/crawloverview/CrawlOverview.java
index d8395ddf..e87aa14b 100644
--- a/plugins/crawloverview-plugin/src/main/java/com/crawljax/plugins/crawloverview/CrawlOverview.java
+++ b/plugins/crawloverview-plugin/src/main/java/com/crawljax/plugins/crawloverview/CrawlOverview.java
@@ -150,8 +150,7 @@ public class CrawlOverview implements OnNewStatePlugin, PreStateCrawlingPlugin,
 			// element.getXpath()
 			return browser.getWebElement(element.getIdentification());
 		} catch (WebDriverException e) {
-			LOG.info("Could not locate element for positioning {}",
-			        element.getElement());
+			LOG.info("Could not locate element for positioning {}", element);
 			return null;
 		}
 	}
diff --git a/plugins/crawloverview-plugin/src/main/java/com/crawljax/plugins/crawloverview/StateWriter.java b/plugins/crawloverview-plugin/src/main/java/com/crawljax/plugins/crawloverview/StateWriter.java
index ba15ed72..18115bb0 100644
--- a/plugins/crawloverview-plugin/src/main/java/com/crawljax/plugins/crawloverview/StateWriter.java
+++ b/plugins/crawloverview-plugin/src/main/java/com/crawljax/plugins/crawloverview/StateWriter.java
@@ -72,8 +72,8 @@ class StateWriter {
 			Map<String, String> elementMap = new HashMap<String, String>();
 			elementMap.put("xpath", element.getXpath());
 			elementMap
-			        .put("left", "" + (element.getLeft() - 3 + state.getScreenshotOffsetLeft()));
-			elementMap.put("top", "" + (element.getTop() - 3 + state.getScreenshotOffsetTop()));
+			        .put("left", "" + (element.getLeft() - 3));
+			elementMap.put("top", "" + (element.getTop() - 3));
 			elementMap.put("width", "" + (element.getWidth() + 2));
 			elementMap.put("height", "" + (element.getHeight() + 2));
 			LOG.debug("State {} has offset {} {} for element {}", new Object[] { state.getName(),
diff --git a/plugins/crawloverview-plugin/src/test/resources/hover-test-site/c.html b/plugins/crawloverview-plugin/src/test/resources/hover-test-site/c.html
index 52c4ad37..b39976e1 100644
--- a/plugins/crawloverview-plugin/src/test/resources/hover-test-site/c.html
+++ b/plugins/crawloverview-plugin/src/test/resources/hover-test-site/c.html
@@ -1,4 +1,3 @@
-<!DOCTYPE html>
 <html>
 <head>
 <title>C</title>
['core/src/main/java/com/crawljax/core/state/Eventable.java', 'core/src/test/java/com/crawljax/core/state/StateFlowGraphTest.java', 'plugins/crawloverview-plugin/src/main/java/com/crawljax/plugins/crawloverview/StateWriter.java', 'core/src/main/java/com/crawljax/core/state/StateFlowGraph.java', 'plugins/crawloverview-plugin/src/main/java/com/crawljax/plugins/crawloverview/CrawlOverview.java', 'core/src/test/java/com/crawljax/core/state/PostCrawlStateGraphChecker.java', 'core/src/main/java/com/crawljax/core/state/StateVertex.java', 'plugins/crawloverview-plugin/src/test/resources/hover-test-site/c.html', 'core/src/test/java/com/crawljax/core/state/EventableTest.java']