Index: simplerunner/pom.xml
===================================================================
--- simplerunner/pom.xml	(revision 43)
+++ simplerunner/pom.xml	(revision 44)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>simplerunner</artifactId>
-	<version>2.0.7</version> 
+	<version>2.0.8</version> 
 	<packaging>jar</packaging>
 
Index: simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java
===================================================================
--- simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java	(revision 43)
+++ simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java	(revision 44)
@@ -17,4 +17,5 @@
 import geniusweb.protocol.NegoState;
 import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
+import geniusweb.simplerunner.gui.GUI;
 import tudelft.utilities.logging.Reporter;
 
@@ -142,4 +143,8 @@
 	 */
 	public static void main(String[] args) throws IOException {
+		if (args.length == 0) {
+			GUI.main(args);
+			return;
+		}
 		if (args.length != 1) {
 			showusage();
Index: simplerunner/src/main/java/geniusweb/simplerunner/gui/GUI.java
===================================================================
--- simplerunner/src/main/java/geniusweb/simplerunner/gui/GUI.java	(revision 44)
+++ simplerunner/src/main/java/geniusweb/simplerunner/gui/GUI.java	(revision 44)
@@ -0,0 +1,75 @@
+package geniusweb.simplerunner.gui;
+
+import java.awt.BorderLayout;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.logging.Level;
+
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+
+import geniusweb.simplerunner.ClassPathConnectionFactory;
+import geniusweb.simplerunner.NegoRunner;
+import tudelft.utilities.logging.Reporter;
+
+/**
+ * Simple GUI allowing users to create the settings interactively, much like on
+ * the runserver
+ *
+ */
+public class GUI extends JPanel {
+	private JTextArea resultarea = new JTextArea(
+			"Results will appear here after run", 9, 40);
+	private final SettingsPanel settingsPanel;
+
+	public GUI() {
+		setLayout(new BorderLayout());
+		settingsPanel = new SettingsPanel();
+		add(settingsPanel, BorderLayout.CENTER);
+		add(startPanel(), BorderLayout.SOUTH);
+	}
+
+	private JPanel startPanel() {
+		JPanel startpanel = new JPanel();
+		startpanel.setLayout(new BorderLayout());
+		JButton startbutton = new JButton("Start Session");
+		startpanel.add(startbutton, BorderLayout.NORTH);
+		startpanel.add(new JScrollPane(resultarea), BorderLayout.CENTER);
+
+		startbutton.addActionListener(evt -> runsession());
+		return startpanel;
+	}
+
+	private void runsession() {
+		resultarea.setText("");
+		Reporter myreporter = new Reporter() {
+
+			@Override
+			public void log(Level level, String msg) {
+				resultarea.append("[" + level + "] " + msg + "\n");
+			}
+
+			@Override
+			public void log(Level level, String msg, Throwable thrown) {
+				resultarea.append("[" + level + "] throws " + msg + "\n");
+				StringWriter errors = new StringWriter();
+				thrown.printStackTrace(new PrintWriter(errors));
+				resultarea.append(errors.toString() + "\n");
+			}
+		};
+		NegoRunner runner = new NegoRunner(settingsPanel.getSettings(),
+				new ClassPathConnectionFactory(), myreporter, 0);
+		runner.run();
+	}
+
+	public static void main(String[] args) {
+		JFrame frame = new JFrame("GeniusWeb SimpleRunner GUI");
+		frame.add(new GUI());
+		frame.pack();
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		frame.setVisible(true);
+	}
+}
Index: simplerunner/src/main/java/geniusweb/simplerunner/gui/MyFileChooser.java
===================================================================
--- simplerunner/src/main/java/geniusweb/simplerunner/gui/MyFileChooser.java	(revision 44)
+++ simplerunner/src/main/java/geniusweb/simplerunner/gui/MyFileChooser.java	(revision 44)
@@ -0,0 +1,44 @@
+package geniusweb.simplerunner.gui;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+/**
+ * one-line panel with on left the chosen file and on the right a "Browse"
+ * button. If you click browse button you can browse for a file. You can also
+ * just type the file location.
+ *
+ */
+public class MyFileChooser extends JPanel {
+	private JTextField filenamearea = new JTextField("select a file");
+	private JButton browsebutton = new JButton("Browse");
+
+	public MyFileChooser() {
+		setLayout(new BorderLayout());
+		add(filenamearea, BorderLayout.CENTER);
+		add(browsebutton, BorderLayout.EAST);
+		browsebutton.addActionListener(new ActionListener() {
+
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				JFileChooser fc = new JFileChooser();
+				int returnVal = fc.showOpenDialog(browsebutton);
+				if (returnVal == JFileChooser.APPROVE_OPTION) {
+					filenamearea
+							.setText(fc.getSelectedFile().getAbsolutePath());
+				}
+			}
+		});
+
+	}
+
+	public String getFile() {
+		return filenamearea.getText();
+	}
+}
Index: simplerunner/src/main/java/geniusweb/simplerunner/gui/SelectionModel.java
===================================================================
--- simplerunner/src/main/java/geniusweb/simplerunner/gui/SelectionModel.java	(revision 44)
+++ simplerunner/src/main/java/geniusweb/simplerunner/gui/SelectionModel.java	(revision 44)
@@ -0,0 +1,94 @@
+package geniusweb.simplerunner.gui;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.TableModel;
+
+import geniusweb.protocol.session.TeamInfo;
+import geniusweb.references.PartyWithProfile;
+
+/**
+ * The selected parties, profiles etc
+ *
+ */
+public class SelectionModel implements TableModel {
+	private final List<TeamInfo> teams = new LinkedList<>();
+	private final List<TableModelListener> listeners = new LinkedList<>();
+
+	private final List<String> colnames = Arrays.asList("Party", "Parameters",
+			"Profile");
+
+	public List<TeamInfo> getTeams() {
+		return teams;
+	}
+
+	public void addTeam(TeamInfo team) {
+		teams.add(team);
+		notifyListeners();
+	}
+
+	private void notifyListeners() {
+		for (TableModelListener l : listeners) {
+			l.tableChanged(new TableModelEvent(this));
+		}
+	}
+
+	@Override
+	public int getRowCount() {
+		return teams.size();
+	}
+
+	@Override
+	public int getColumnCount() {
+		return 3;
+	}
+
+	@Override
+	public String getColumnName(int columnIndex) {
+		return colnames.get(columnIndex);
+	}
+
+	@Override
+	public Class<?> getColumnClass(int columnIndex) {
+		return String.class;
+	}
+
+	@Override
+	public boolean isCellEditable(int rowIndex, int columnIndex) {
+		return false;
+	}
+
+	@Override
+	public Object getValueAt(int rowIndex, int columnIndex) {
+		PartyWithProfile party = teams.get(rowIndex).getParties().get(0);
+		switch (columnIndex) {
+		case 0:
+			return party.getParty().getPartyRef().getURI().toString();
+		case 1:
+			return party.getParty().getParameters().toString();
+		case 2:
+			return party.getProfile().getURI().toString();
+		}
+		return null;
+	}
+
+	@Override
+	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public void addTableModelListener(TableModelListener l) {
+		listeners.add(l);
+	}
+
+	@Override
+	public void removeTableModelListener(TableModelListener l) {
+		listeners.remove(l);
+	}
+
+}
Index: simplerunner/src/main/java/geniusweb/simplerunner/gui/SettingsPanel.java
===================================================================
--- simplerunner/src/main/java/geniusweb/simplerunner/gui/SettingsPanel.java	(revision 44)
+++ simplerunner/src/main/java/geniusweb/simplerunner/gui/SettingsPanel.java	(revision 44)
@@ -0,0 +1,142 @@
+package geniusweb.simplerunner.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.TextField;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JSpinner;
+import javax.swing.JTable;
+import javax.swing.JTextArea;
+import javax.swing.SpinnerModel;
+import javax.swing.SpinnerNumberModel;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.deadline.Deadline;
+import geniusweb.deadline.DeadlineRounds;
+import geniusweb.deadline.DeadlineTime;
+import geniusweb.protocol.NegoSettings;
+import geniusweb.protocol.session.TeamInfo;
+import geniusweb.protocol.session.saop.SAOPSettings;
+import geniusweb.references.Parameters;
+import geniusweb.references.PartyRef;
+import geniusweb.references.PartyWithParameters;
+import geniusweb.references.PartyWithProfile;
+import geniusweb.references.ProfileRef;
+
+public class SettingsPanel extends JPanel {
+	private final ObjectMapper jackson = new ObjectMapper();
+	private final JComboBox<String> protocolcombo = new JComboBox<>(
+			new String[] { "SAOP" });
+
+	private final TimePanel timepanel = new TimePanel();
+	private final TextField nextparty = new TextField(30);
+	private final TextField nextparameters = new TextField(30);
+	private final MyFileChooser nextprofile = new MyFileChooser();
+	private final JButton addButton = new JButton("add");
+	private final SelectionModel selectedparties = new SelectionModel();
+
+	public SettingsPanel() {
+		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+		add(new WithLabel("protocol", protocolcombo));
+		add(new WithLabel("deadline", timepanel));
+		add(new JSeparator());
+		add(new JLabel("participants"));
+		add(new WithLabel("party:", nextparty));
+		add(new WithLabel("parameters:", nextparameters));
+		add(new WithLabel("profile:", nextprofile));
+		add(new JSeparator());
+		add(addButton);
+		add(new JLabel("Selected Profiles, parties for the session"));
+		add(new JScrollPane(new JTable(selectedparties)));
+		addButton.addActionListener(evt -> addparty());
+	}
+
+	private void addparty() {
+		try {
+			addparty1();
+		} catch (IllegalArgumentException e) {
+			JScrollPane message = new JScrollPane(
+					new JTextArea(e.getMessage(), 10, 40));
+			JOptionPane.showMessageDialog(this, message, "Failed to add party",
+					JOptionPane.WARNING_MESSAGE, null);
+		}
+	}
+
+	private void addparty1() {
+		PartyRef partyref;
+		try {
+			partyref = new PartyRef("classpath:" + nextparty.getText());
+		} catch (URISyntaxException e) {
+			throw new IllegalArgumentException("Party not set correctly:" + e);
+		}
+		Parameters parameters;
+		try {
+			parameters = jackson.readValue("{" + nextparameters.getText() + "}",
+					Parameters.class);
+		} catch (JsonProcessingException e) {
+			throw new IllegalArgumentException(
+					"Parameters not set correctly:" + e);
+		}
+		ProfileRef profile;
+		try {
+			profile = new ProfileRef("file:" + nextprofile.getFile());
+		} catch (URISyntaxException e) {
+			throw new IllegalArgumentException(
+					"Profile not set correctly:" + e);
+		}
+		PartyWithParameters partywithparams = new PartyWithParameters(partyref,
+				parameters);
+		PartyWithProfile partywithprofile = new PartyWithProfile(
+				partywithparams, profile);
+		TeamInfo teaminfo = new TeamInfo(Arrays.asList(partywithprofile));
+		selectedparties.addTeam(teaminfo);
+	}
+
+	public NegoSettings getSettings() {
+		return new SAOPSettings(selectedparties.getTeams(),
+				timepanel.getDeadline());
+	}
+
+}
+
+/**
+ * adds label to left of component
+ */
+class WithLabel extends JPanel {
+	public WithLabel(String label, Component component) {
+		setLayout(new BorderLayout());
+		add(new JLabel(label), BorderLayout.WEST);
+		add(component, BorderLayout.CENTER);
+	}
+}
+
+class TimePanel extends JPanel {
+	private static final long DEFAULTDEADLINE = 10000;
+	JComboBox<String> unitcombo = new JComboBox<String>(
+			new String[] { "seconds", "rounds" });
+	private SpinnerModel time = new SpinnerNumberModel(10, 1, 1000, 1);
+
+	public TimePanel() {
+		setLayout(new BorderLayout());
+		add(new JSpinner(time), BorderLayout.CENTER);
+		add(unitcombo, BorderLayout.EAST);
+	}
+
+	public Deadline getDeadline() {
+		if (unitcombo.getSelectedIndex() == 0)
+			return new DeadlineTime((int) time.getValue() * 1000);
+		return new DeadlineRounds((int) time.getValue(), DEFAULTDEADLINE);
+	}
+}
