Index: simplerunner/pom.xml
===================================================================
--- simplerunner/pom.xml	(revision 32)
+++ simplerunner/pom.xml	(revision 33)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>simplerunner</artifactId>
-	<version>1.6.1</version> <!-- must equal ${geniusweb.version} -->
+	<version>2.0.0</version> <!-- must equal ${geniusweb.version} -->
 	<packaging>jar</packaging>
 
@@ -16,6 +16,6 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.9.10</jackson-2-version>
-		<geniusweb.version>1.6.1</geniusweb.version>
+		<jackson-2-version>2.12.3</jackson-2-version>
+		<geniusweb.version>2.0.0</geniusweb.version>
 	</properties>
 
@@ -97,10 +97,5 @@
 		<pluginRepository>
 			<id>central</id>
-			<url>https://repo1.maven.org/</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>jfrog-plugins-release</id>
-			<name>plugins-release</name>
-			<url>https://oss.jfrog.org/artifactory/plugins-release</url>
+			<url>https://repo1.maven.org/maven2</url>
 		</pluginRepository>
 	</pluginRepositories>
@@ -168,5 +163,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>2.6.1</version>
+				<version>3.2.3</version>
 				<executions>
 					<execution>
Index: simplerunner/src/main/java/geniusweb/simplerunner/BasicConnection.java
===================================================================
--- simplerunner/src/main/java/geniusweb/simplerunner/BasicConnection.java	(revision 32)
+++ simplerunner/src/main/java/geniusweb/simplerunner/BasicConnection.java	(revision 33)
@@ -3,9 +3,10 @@
 import java.io.IOException;
 import java.net.URI;
+import java.util.List;
 import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import geniusweb.connection.ConnectionEnd;
 import geniusweb.references.Reference;
-import tudelft.utilities.listener.DefaultListenable;
 import tudelft.utilities.listener.Listener;
 
@@ -17,12 +18,15 @@
  * @param <OUT> the type of outgoing data
  */
-public class BasicConnection<IN, OUT> extends DefaultListenable<IN>
-		implements ConnectionEnd<IN, OUT> {
+public class BasicConnection<IN, OUT> implements ConnectionEnd<IN, OUT> {
+	private List<Listener<IN>> listeners = new CopyOnWriteArrayList<Listener<IN>>();
+
+	private final Info<OUT> EOS = new EOS<OUT>();
 	private final Reference reference;
 	private final URI uri;
 	// to be initialized
 	private Listener<OUT> handler = null;
-	private Thread handlerThread;
-	private ArrayBlockingQueue<OUT> messages = new ArrayBlockingQueue<OUT>(4);
+	private ArrayBlockingQueue<Info<OUT>> messages = new ArrayBlockingQueue<>(
+			4);
+	private Throwable error;
 
 	/**
@@ -36,6 +40,4 @@
 		this.reference = reference;
 		this.uri = uri;
-		System.out.println("opening " + this);
-
 	}
 
@@ -53,5 +55,5 @@
 		this.handler = newhandler;
 
-		handlerThread = new Thread(new Runnable() {
+		Thread handlerThread = new Thread(new Runnable() {
 
 			@Override
@@ -59,13 +61,31 @@
 				try {
 					while (true) {
-						handler.notifyChange(messages.take());
+						Info<OUT> mess = messages.take();
+						if (mess instanceof EOS)
+							break;
+						handler.notifyChange(((Data<OUT>) mess).get());
 					}
-				} catch (InterruptedException e) {
-					System.out.println("connection handler interrupted");
+				} catch (Exception e) {
+					setError(e);
 				}
+				handler = null;
+				System.out.println("BasicConnection closed");
 			}
 		});
+		handlerThread.start();
+	}
 
-		handlerThread.start();
+	/**
+	 * Error condition occurs. Record error and close connection
+	 * 
+	 * @param e
+	 */
+	protected synchronized void setError(Throwable e) {
+		if (error != null) {
+			// maybe log instead?
+			e.printStackTrace();
+			error = e;
+			close();
+		}
 	}
 
@@ -74,10 +94,10 @@
 		if (handler == null) {
 			throw new IllegalStateException(
-					"BasicConnection has not been initialized");
+					"BasicConnection has not been initialized or was closed");
 		}
 		try {
-			messages.put(data);
+			messages.put(new Data<OUT>(data));
 		} catch (InterruptedException e) {
-			throw new IOException(e);
+			setError(e);
 		}
 	}
@@ -95,14 +115,81 @@
 	@Override
 	public void close() {
-		System.out.println("closing " + this);
-		handlerThread.interrupt();
-		handlerThread = null;
-		handler = null;
+		System.out.println("flushing and terminating " + this);
+		if (handler == null || messages.contains(EOS))
+			return;
+		try {
+			messages.put(EOS);
+		} catch (InterruptedException e) {
+			setError(e);
+		}
 	}
 
 	@Override
-	public Error getError() {
-		return null;
+	public String toString() {
+		return "BasicConnection[" + reference + "]";
+	}
+
+	@Override
+	public Throwable getError() {
+		return error;
+	}
+
+	/**
+	 * 
+	 * @return true iff this connection is open
+	 */
+	public boolean isOpen() {
+		return handler != null;
+	}
+
+	/****************** implements listenable ****************/
+	// override because notifyListeners should throw exceptions.
+	@Override
+	public void addListener(Listener<IN> l) {
+		listeners.add(l);
+	}
+
+	@Override
+	public void removeListener(Listener<IN> l) {
+		listeners.remove(l);
+	}
+
+	public void notifyListeners(IN data) {
+		for (Listener<IN> l : listeners) {
+			l.notifyChange(data);
+		}
 	}
 
 }
+
+/**
+ * Wrapper around data so that we can put Null end EOS in a
+ * {@link ArrayBlockingQueue}
+ *
+ * @param <S> the type of contained data.
+ */
+
+interface Info<S> {
+
+}
+
+class Data<S> implements Info<S> {
+	private final S data;
+
+	public Data(S data) {
+		this.data = data;
+	}
+
+	public S get() {
+		return data;
+	}
+}
+
+/**
+ * End of stream.
+ * 
+ * @author wouter
+ *
+ */
+class EOS<S> implements Info<S> {
+}
Index: simplerunner/src/main/java/geniusweb/simplerunner/ClassPathConnectionFactory.java
===================================================================
--- simplerunner/src/main/java/geniusweb/simplerunner/ClassPathConnectionFactory.java	(revision 32)
+++ simplerunner/src/main/java/geniusweb/simplerunner/ClassPathConnectionFactory.java	(revision 33)
@@ -24,34 +24,133 @@
  */
 public class ClassPathConnectionFactory implements ProtocolToPartyConnFactory {
+	private List<ConnectionPair> allConnections = new LinkedList<>();
+
+	/**
+	 * @param reference the party class path reference4
+	 */
+	@Override
+	public ProtocolToPartyConn connect(Reference reference) {
+		ConnectionPair connpair = new ConnectionPair(reference);
+		allConnections.add(connpair);
+		return connpair.getProtocolToPartyConn();
+	}
+
+	@Override
+	public List<ProtocolToPartyConn> connect(List<Reference> references)
+			throws IOException, NoResourcesNowException {
+		List<ProtocolToPartyConn> connections = new LinkedList<>();
+		for (Reference partyref : references) {
+			connections.add(connect(partyref));
+		}
+		return connections;
+	}
+
+	/**
+	 * @return list of connections that are still open.
+	 */
+	public List<BasicConnection> getOpenConnections() {
+		List<BasicConnection> open = new LinkedList<>();
+		for (ConnectionPair connpair : allConnections) {
+			open.addAll(connpair.getOpenConnections());
+		}
+		return open;
+	}
+
+}
+
+class BasicConnectionWithParty extends BasicConnection<Action, Inform>
+		implements ProtocolToPartyConn {
+
+	private PartyId id;
+
+	public BasicConnectionWithParty(Reference reference, URI uri) {
+		super(reference, uri);
+		this.id = new PartyId(uri.toString().replace("classpath:", "")
+				.replaceAll("\\.", "_"));
+	}
+
+	@Override
+	public PartyId getParty() {
+		return id;
+	}
+
+	@Override
+	public String toString() {
+		return "WP" + super.toString();
+	}
+
+}
+
+/**
+ * Contains the connection from protocol to party and from party to protocol.
+ * These two are dependent on each other, and must close together.
+ *
+ */
+class ConnectionPair {
+	private static int serialcounter = 1;
 	private static final String SCHEME = "classpath";
-	private static int serialcounter = 1;
 	private final static URI PROTOCOLURI = uri("protocol:protocol");
 
-	@Override
-	public ProtocolToPartyConn connect(Reference reference) {
+	private final BasicConnection<Inform, Action> party2protocol;
+	private final BasicConnectionWithParty protocol2party;
+
+	/**
+	 * 
+	 * @param reference the party class path reference4
+	 * 
+	 */
+	public ConnectionPair(Reference reference) {
 		// set up the whole other party including the connection to it.
 		String classpath = getClassPath(reference.getURI());
 		Party party = instantiate(classpath);
 
-		BasicConnection<Inform, Action> party2protocol = new BasicConnection<Inform, Action>(
-				reference, PROTOCOLURI);
-		BasicConnectionWithParty protocol2party = new BasicConnectionWithParty(
-				reference,
+		// if call to protocol would fail, we should also close the
+		// protocol2party connection. But we assume that will work fine.
+		party2protocol = new BasicConnection<Inform, Action>(reference,
+				PROTOCOLURI) {
+			@Override
+			protected synchronized void setError(Throwable e) {
+				super.setError(e); // closes party2protocol
+				protocol2party.close();
+			}
+
+		};
+
+		// if callback from protocol to party fails, then also close the
+		// other direction.
+		protocol2party = new BasicConnectionWithParty(reference,
 				uri("classpath:" + reference.getURI().getSchemeSpecificPart()
-						+ "." + (serialcounter++)));
+						+ "." + (serialcounter++))) {
+			@Override
+			protected synchronized void setError(Throwable e) {
+				super.setError(e); // closes protocol2party
+				party2protocol.close();
+			}
+
+		};
+
 		party2protocol.init(action -> protocol2party.notifyListeners(action));
+
 		protocol2party.init(info -> party2protocol.notifyListeners(info));
 
 		party.connect(party2protocol);
 
+	}
+
+	/**
+	 * 
+	 * @return the open connections
+	 */
+	public List<BasicConnection> getOpenConnections() {
+		List<BasicConnection> open = new LinkedList<>();
+		if (party2protocol.isOpen())
+			open.add(party2protocol);
+		if (protocol2party.isOpen())
+			open.add(protocol2party);
+		return open;
+	}
+
+	public ProtocolToPartyConn getProtocolToPartyConn() {
 		return protocol2party;
-	}
-
-	private static URI uri(String ref) {
-		try {
-			return new URI(ref);
-		} catch (URISyntaxException e) {
-			throw new IllegalStateException("failed to create basic URI", e);
-		}
 	}
 
@@ -81,7 +180,15 @@
 				| InvocationTargetException e) {
 			throw new IllegalArgumentException(
-					"Failed to create party connection", e);
-		}
-
+					"Failed to create connection to party " + classpath, e);
+		}
+
+	}
+
+	private static URI uri(String ref) {
+		try {
+			return new URI(ref);
+		} catch (URISyntaxException e) {
+			throw new IllegalStateException("failed to create basic URI", e);
+		}
 	}
 
@@ -99,31 +206,3 @@
 	}
 
-	@Override
-	public List<ProtocolToPartyConn> connect(List<Reference> references)
-			throws IOException, NoResourcesNowException {
-		List<ProtocolToPartyConn> connections = new LinkedList<>();
-		for (Reference partyref : references) {
-			connections.add(connect(partyref));
-		}
-		return connections;
-	}
-
 }
-
-class BasicConnectionWithParty extends BasicConnection<Action, Inform>
-		implements ProtocolToPartyConn {
-
-	private PartyId id;
-
-	public BasicConnectionWithParty(Reference reference, URI uri) {
-		super(reference, uri);
-		this.id = new PartyId(uri.toString().replace("classpath:", "")
-				.replaceAll("\\.", "_"));
-	}
-
-	@Override
-	public PartyId getParty() {
-		return id;
-	}
-
-}
Index: simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java
===================================================================
--- simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java	(revision 32)
+++ simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java	(revision 33)
@@ -5,4 +5,5 @@
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.List;
 import java.util.logging.Level;
 
@@ -22,14 +23,26 @@
  * All referred files and classes need to be stored locally (or be in the
  * dependency list if you use maven).
- * 
+ * <p>
+ * <em>IMPORTANT</em> SimpleRunner has a number of restrictions, compared to a
+ * run using a runserver and partyserver
+ * <ul>
+ * <li>With stand-alone runner, your parties are run together in a single
+ * classloader. The main implication is that there may arise version conflicts
+ * between parties.
+ * <li>Stand-alone runner does NOT enforce the time deadline. Parties may
+ * continue running indefinitely and thus bog down the JVM and stalling
+ * tournaments.
+ * </ul>
  */
 public class NegoRunner implements Runnable {
+	private final static ObjectMapper jackson = new ObjectMapper();
+
 	private final NegoSettings settings;
 	private final NegoProtocol protocol;
-	private final ProtocolToPartyConnFactory connectionfactory;
+	private final ClassPathConnectionFactory connectionfactory;
 	protected final Reporter log;
 	private boolean properlyStopped = false;
-	private final static ObjectMapper jackson = new ObjectMapper();
 	private final int LOOPTIME = 200;// ms
+	private final int FINALWAITTIME = 5000;// ms
 	private long maxruntime;
 
@@ -42,5 +55,5 @@
 	 */
 	public NegoRunner(NegoSettings settings,
-			ProtocolToPartyConnFactory connectionfactory, Reporter logger,
+			ClassPathConnectionFactory connectionfactory, Reporter logger,
 			long maxruntime) {
 		if (settings == null || connectionfactory == null) {
@@ -75,5 +88,21 @@
 			}
 		}
-		System.out.println("end run");
+		log.log(Level.INFO, "Waiting for connection closure");
+
+		remainingtime = FINALWAITTIME;
+		while (remainingtime > 0
+				&& !connectionfactory.getOpenConnections().isEmpty()) {
+			try {
+				Thread.sleep(LOOPTIME);
+				remainingtime -= LOOPTIME;
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+		List<BasicConnection> openconn = connectionfactory.getOpenConnections();
+		if (!openconn.isEmpty())
+			log.log(Level.WARNING, "Connections " + openconn
+					+ " did not close properly at end of run");
+		log.log(Level.INFO, "end run");
 	}
 
@@ -146,13 +175,15 @@
 
 class StdOutReporter implements Reporter {
-
 	@Override
-	public void log(Level arg0, String arg1) {
-		System.out.println(arg0 + ":" + arg1);
+	public void log(Level level, String msg) {
+		if (level == Level.WARNING || level == Level.SEVERE)
+			System.err.println(level + ":" + msg);
+		else
+			System.out.println(level + ":" + msg);
 	}
 
 	@Override
-	public void log(Level arg0, String arg1, Throwable arg2) {
-		System.out.println(arg0 + ">" + arg1);
+	public void log(Level arg0, String msg, Throwable arg2) {
+		log(arg0, msg);
 	}
 
Index: simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerE2ETest.java
===================================================================
--- simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerE2ETest.java	(revision 32)
+++ simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerE2ETest.java	(revision 33)
@@ -2,4 +2,9 @@
 
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
 import java.io.IOException;
@@ -9,4 +14,5 @@
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.logging.Level;
 
 import org.junit.Before;
@@ -32,5 +38,5 @@
 	private final ObjectMapper jackson = new ObjectMapper();
 	private NegoRunner runner;
-	private Reporter logger = new ReportToLogger("test");
+	private Reporter logger = spy(new ReportToLogger("test"));
 	private String filename;
 
@@ -40,4 +46,5 @@
 				.asList(new Object[][] { { "src/test/resources/settings.json" },
 						{ "src/test/resources/settings2.json" },
+						{ "src/test/resources/settingsbadprofile.json" },
 						{ "src/test/resources/shaoptoursettings.json" },
 						{ "src/test/resources/mopac.json" },
@@ -69,6 +76,8 @@
 	public void runTest() throws IOException {
 		runner.run();
+		System.out.println("Final state:\n" + runner.getProtocol().getState());
 		assertTrue(runner.isProperlyStopped());
-		System.out.println("Final state:\n" + runner.getProtocol().getState());
+		verify(logger, times(0)).log(eq(Level.WARNING), any());
+		verify(logger, times(0)).log(eq(Level.SEVERE), any());
 	}
 
Index: simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerTest.java
===================================================================
--- simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerTest.java	(revision 32)
+++ simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerTest.java	(revision 33)
@@ -20,5 +20,4 @@
 import geniusweb.protocol.NegoState;
 import geniusweb.protocol.ProtocolException;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
 import geniusweb.protocol.session.SessionProtocol;
 import geniusweb.protocol.session.SessionSettings;
@@ -48,5 +47,5 @@
 	public void smokeTest() {
 		new NegoRunner(mock(SessionSettings.class),
-				mock(ProtocolToPartyConnFactory.class), logger, 5000);
+				mock(ClassPathConnectionFactory.class), logger, 5000);
 	}
 
@@ -57,6 +56,6 @@
 		when(settings.getProtocol(logger)).thenReturn(protocol);
 		@SuppressWarnings("unchecked")
-		ProtocolToPartyConnFactory factory = mock(
-				ProtocolToPartyConnFactory.class);
+		ClassPathConnectionFactory factory = mock(
+				ClassPathConnectionFactory.class);
 
 		NegoRunner runner = spy(
@@ -80,6 +79,6 @@
 		Reporter logger = mock(Reporter.class);
 		@SuppressWarnings("unchecked")
-		ProtocolToPartyConnFactory factory = mock(
-				ProtocolToPartyConnFactory.class);
+		ClassPathConnectionFactory factory = mock(
+				ClassPathConnectionFactory.class);
 		NegoRunner runner = spy(
 				new NegoRunner(settings, factory, logger, 5000) {
@@ -98,5 +97,5 @@
 		listener.getValue().notifyChange(finishedEvent);
 		verify(runner, times(1)).stop();
-		verify(logger, times(1)).log(eq(Level.INFO), any(String.class));
+		verify(logger, times(0)).log(eq(Level.WARNING), any(String.class));
 
 	}
@@ -111,6 +110,6 @@
 		when(protocol.getState()).thenReturn(state);
 		@SuppressWarnings("unchecked")
-		ProtocolToPartyConnFactory factory = mock(
-				ProtocolToPartyConnFactory.class);
+		ClassPathConnectionFactory factory = mock(
+				ClassPathConnectionFactory.class);
 		NegoRunner runner = spy(
 				new NegoRunner(settings, factory, logger, 5000) {
Index: simplerunner/src/test/resources/jobs/jobs1.json
===================================================================
--- simplerunner/src/test/resources/jobs/jobs1.json	(revision 32)
+++ simplerunner/src/test/resources/jobs/jobs1.json	(revision 33)
@@ -3,5 +3,5 @@
 		"issueUtilities": {
 			"salary": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"2000": 0,
@@ -14,5 +14,5 @@
 			},
 			"fte": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"0.6": 0.25,
@@ -23,5 +23,5 @@
 			},
 			"work from home": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"0": 0.333333333,
@@ -32,5 +32,5 @@
 			},
 			"lease car": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"yes": 1,
@@ -40,5 +40,5 @@
 			},
 			"permanent contract": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"yes": 1,
@@ -48,5 +48,5 @@
 			},
 			"career development opportunities": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"low": 0,
Index: simplerunner/src/test/resources/jobs/jobs2.json
===================================================================
--- simplerunner/src/test/resources/jobs/jobs2.json	(revision 32)
+++ simplerunner/src/test/resources/jobs/jobs2.json	(revision 33)
@@ -3,5 +3,5 @@
 		"issueUtilities": {
 			"salary": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"2000": 1.0,
@@ -14,5 +14,5 @@
 			},
 			"fte": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"0.6": 0.363636363636363636,
@@ -23,5 +23,5 @@
 			},
 			"work from home": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"0": 1.0,
@@ -32,5 +32,5 @@
 			},
 			"lease car": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"yes": 0,
@@ -40,5 +40,5 @@
 			},
 			"permanent contract": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"yes": 0.23809523809523808,
@@ -48,5 +48,5 @@
 			},
 			"career development opportunities": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"low": 1.0,
Index: simplerunner/src/test/resources/mopac.json
===================================================================
--- simplerunner/src/test/resources/mopac.json	(revision 32)
+++ simplerunner/src/test/resources/mopac.json	(revision 33)
@@ -14,5 +14,5 @@
 		} ]}} ],
 		"deadline": {
-			"deadlinetime": {
+			"DeadlineTime": {
 				"durationms": 2000000
 			}
Index: simplerunner/src/test/resources/party/party1.json
===================================================================
--- simplerunner/src/test/resources/party/party1.json	(revision 32)
+++ simplerunner/src/test/resources/party/party1.json	(revision 33)
@@ -4,5 +4,5 @@
 		"issueUtilities": {
 			"Food": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Chips and Nuts": 0.75,
@@ -14,5 +14,5 @@
 			},
 			"Drinks": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Non-Alcoholic": 0.263,
@@ -24,5 +24,5 @@
 			},
 			"Location": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Party Tent": 0.52,
@@ -34,5 +34,5 @@
 			},
 			"Invitations": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Plain": 0.24,
@@ -44,5 +44,5 @@
 			},
 			"Music": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"MP3": 0.65,
@@ -53,5 +53,5 @@
 			},
 			"Cleanup": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Water and Soap": 0.65,
Index: simplerunner/src/test/resources/party/party2.json
===================================================================
--- simplerunner/src/test/resources/party/party2.json	(revision 32)
+++ simplerunner/src/test/resources/party/party2.json	(revision 33)
@@ -4,5 +4,5 @@
 		"issueUtilities": {
 			"Food": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Chips and Nuts": 0.24,
@@ -14,5 +14,5 @@
 			},
 			"Drinks": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Non-Alcoholic": 0.33,
@@ -24,5 +24,5 @@
 			},
 			"Location": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Party Tent": 0.3,
@@ -34,5 +34,5 @@
 			},
 			"Invitations": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Plain": 0.84,
@@ -44,5 +44,5 @@
 			},
 			"Music": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"MP3": 0.94,
@@ -53,5 +53,5 @@
 			},
 			"Cleanup": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Water and Soap": 1,
Index: simplerunner/src/test/resources/party/party3.json
===================================================================
--- simplerunner/src/test/resources/party/party3.json	(revision 32)
+++ simplerunner/src/test/resources/party/party3.json	(revision 33)
@@ -4,5 +4,5 @@
 		"issueUtilities": {
 			"Food": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Chips and Nuts": 1,
@@ -14,5 +14,5 @@
 			},
 			"Drinks": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Non-Alcoholic": 0.99,
@@ -24,5 +24,5 @@
 			},
 			"Location": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Party Tent": 0.98,
@@ -34,5 +34,5 @@
 			},
 			"Invitations": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Plain": 0.99,
@@ -44,5 +44,5 @@
 			},
 			"Music": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"MP3": 0.9,
@@ -53,5 +53,5 @@
 			},
 			"Cleanup": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Water and Soap": 1,
Index: simplerunner/src/test/resources/party/party4.json
===================================================================
--- simplerunner/src/test/resources/party/party4.json	(revision 32)
+++ simplerunner/src/test/resources/party/party4.json	(revision 33)
@@ -4,5 +4,5 @@
 		"issueUtilities": {
 			"Food": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Chips and Nuts": 0.98,
@@ -14,5 +14,5 @@
 			},
 			"Drinks": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Non-Alcoholic": 0.99,
@@ -24,5 +24,5 @@
 			},
 			"Location": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Party Tent": 0.58,
@@ -34,5 +34,5 @@
 			},
 			"Invitations": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Plain": 0.99,
@@ -44,5 +44,5 @@
 			},
 			"Music": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"MP3": 0.65,
@@ -53,5 +53,5 @@
 			},
 			"Cleanup": {
-				"discreteutils": {
+				"DiscreteValueSetUtilities": {
 					"valueUtilities": {
 						"Water and Soap": 0.27,
Index: simplerunner/src/test/resources/settings.json
===================================================================
--- simplerunner/src/test/resources/settings.json	(revision 32)
+++ simplerunner/src/test/resources/settings.json	(revision 33)
@@ -14,5 +14,5 @@
 		],
 		"deadline": {
-			"deadlinetime": {
+			"DeadlineTime": {
 				"durationms": 100
 			}
Index: simplerunner/src/test/resources/settings2.json
===================================================================
--- simplerunner/src/test/resources/settings2.json	(revision 32)
+++ simplerunner/src/test/resources/settings2.json	(revision 33)
@@ -15,5 +15,5 @@
 		],
 		"deadline": {
-			"deadlinetime": {
+			"DeadlineTime": {
 				"durationms": 100
 			}
Index: simplerunner/src/test/resources/settingsbadprofile.json
===================================================================
--- simplerunner/src/test/resources/settingsbadprofile.json	(revision 33)
+++ simplerunner/src/test/resources/settingsbadprofile.json	(revision 33)
@@ -0,0 +1,23 @@
+{
+	"SAOPSettings": {
+		"participants": [
+		{"TeamInfo":{"parties":[
+		{
+			"party": {"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty", "parameters":{}},
+			"profile": "file:src/test/resources/jobs/jobs1.json"
+		} ]}}
+		, 
+		{"TeamInfo":{"parties":[
+		{
+			"party": {"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty","parameters":{}},
+			"profile": "file:src/test/resources/jobs/nosuchprofile.json"
+		} ]}}
+		],
+		"deadline": {
+			"DeadlineTime": {
+				"durationms": 100
+			}
+		}
+		
+	}
+}
Index: simplerunner/src/test/resources/shaoptoursettings.json
===================================================================
--- simplerunner/src/test/resources/shaoptoursettings.json	(revision 32)
+++ simplerunner/src/test/resources/shaoptoursettings.json	(revision 33)
@@ -53,5 +53,5 @@
 				],
 				"deadline": {
-					"deadlinerounds": {
+					"DeadlineRounds": {
 						"rounds": 10,
 						"durationms": 1000
Index: simplerunner/src/test/resources/tournament.json
===================================================================
--- simplerunner/src/test/resources/tournament.json	(revision 32)
+++ simplerunner/src/test/resources/tournament.json	(revision 33)
@@ -54,5 +54,5 @@
 				],
 				"deadline": {
-					"deadlinerounds": {
+					"DeadlineRounds": {
 						"rounds": 10,
 						"durationms": 1000
