diff --git a/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/ExperimentList.java b/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/ExperimentList.java
index 1a8d1f4884de6fbff1613a891fc1ab97b7dadfa8..65789f2d2f344561418d921337e777deeb766abf 100644
--- a/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/ExperimentList.java
+++ b/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/ExperimentList.java
@@ -226,13 +226,21 @@ class ExperimentList extends JFrame
 		JPanel selectPanel = new JPanel(new FlowLayout());
 		topPanel.add(selectPanel, BorderLayout.SOUTH);
 
-		final JButton submitSelectionBtn = new JButton("select experiments and click the button to import");
-		selectPanel.add(submitSelectionBtn);
-		submitSelectionBtn.setVisible(false);
+		final JButton importExperimentBtn = new JButton("import selected experiments");
+		selectPanel.add(importExperimentBtn);
+		importExperimentBtn.setVisible(false);
 
-		final JButton submitSelectionStartExpBtn = new JButton("select experiments and click the button to import and start");
-		selectPanel.add(submitSelectionStartExpBtn);
-		submitSelectionStartExpBtn.setVisible(false);
+		final JButton importAndStartExperimentBtn = new JButton("import and start selected experiments");
+		selectPanel.add(importAndStartExperimentBtn);
+		importAndStartExperimentBtn.setVisible(false);
+		
+		final JButton startExperimentBtn = new JButton("start selected experiments");
+		selectPanel.add(startExperimentBtn);
+		startExperimentBtn.setVisible(false);
+		
+		final JButton stopExperimentBtn = new JButton("stop selected experiments");
+		selectPanel.add(stopExperimentBtn);
+		stopExperimentBtn.setVisible(false);
 		
 		submitDatesBtn.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent e)
@@ -240,8 +248,10 @@ class ExperimentList extends JFrame
 				try {
 					entryLabel.setVisible(true);
 					submitDatesBtn.setVisible(true);
-					submitSelectionBtn.setVisible(true);
-					submitSelectionStartExpBtn.setVisible(true);
+					importExperimentBtn.setVisible(true);
+					importAndStartExperimentBtn.setVisible(true);
+					stopExperimentBtn.setVisible(true);
+					startExperimentBtn.setVisible(true);
 
 					DateLabelFormatter df = new DateLabelFormatter();
 					final Date startSelectedDate = (Date) startDatePicker.getModel().getValue();
@@ -269,7 +279,7 @@ class ExperimentList extends JFrame
 			}			
 		});
 
-		submitSelectionBtn.addActionListener(new ActionListener() {
+		importExperimentBtn.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent e)
 			{
 				int[] selection = table.getSelectedRows();
@@ -287,30 +297,111 @@ class ExperimentList extends JFrame
 			}			
 		});
 
-		submitSelectionStartExpBtn.addActionListener(new ActionListener() {
+		importAndStartExperimentBtn.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent e)
 			{
 				int[] selection = table.getSelectedRows();
-//				if ((selection.length > 0) && (dconnection.init() == ServiceConnectionStatus.SUCCESS) && (dconnection.login() == ServiceConnectionStatus.SUCCESS)) {
-					for (int i = 0; i < selection.length; i++) {
-						String experimentName = EXPERIMENT_PREFIX+(String)table.getModel().getValueAt(selection[i], Column.NAME.ordinal());
-						String description = (String)table.getModel().getValueAt(selection[i], Column.DESCRIPTION.ordinal());
-						if (sconnection.addExperiment(experimentName, description) != ServiceConnection.ServiceConnectionStatus.SUCCESS) {
-							continue;
-						}
-						addRole((String)table.getModel().getValueAt(selection[i], Column.MANAGER.ordinal()), experimentName, Role.MANAGER);
-						//					addRole((String)table.getModel().getValueAt(selection[i], Column.PI.ordinal()), experimentName, Role.PI);
-						addRole((String)table.getModel().getValueAt(selection[i], Column.USER.ordinal()), experimentName, Role.USER);
-						if (sconnection.startExperiment(experimentName) == ServiceConnection.ServiceConnectionStatus.SUCCESS) {
-							dconnection.startDaq(experimentName, experimentName);						
-						} else {
-							System.out.println("didn't start");
-						}
+				if (selection.length > 0) {
+					if (dconnection.isSessionValid()) {
+						importAndStartExperiments(selection, dconnection);
+					} 
+					else if (dconnection.isInitialized()) {
+						JOptionPane.showMessageDialog(null,"Session expired. Restart the tools.",
+								"Info",JOptionPane.WARNING_MESSAGE);						
+					} 
+					else if ((dconnection.init() == ServiceConnection.ServiceConnectionStatus.SUCCESS) 
+							&& (dconnection.login() == ServiceConnection.ServiceConnectionStatus.SUCCESS)) {
+						importAndStartExperiments(selection, dconnection);
+					} else {
+						JOptionPane.showMessageDialog(null,"Check Data acquisition service configuration, or invalid credentials.",
+								"Info",JOptionPane.WARNING_MESSAGE);						
 					}
-//				}
-				table.clearSelection();
+				}
+			}
+		});
+
+		startExperimentBtn.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e)
+			{
+				int[] selection = table.getSelectedRows();
+				if (selection.length > 0) {
+					if (dconnection.isSessionValid()) {
+						startExperiments(selection, dconnection);
+					} 
+					else if (dconnection.isInitialized()) {
+						JOptionPane.showMessageDialog(null,"Session expired. Restart the tools.",
+								"Info",JOptionPane.WARNING_MESSAGE);						
+					} 
+					else if ((dconnection.init() == ServiceConnection.ServiceConnectionStatus.SUCCESS) 
+							&& (dconnection.login() == ServiceConnection.ServiceConnectionStatus.SUCCESS)) {
+						startExperiments(selection, dconnection);
+					} else {
+						JOptionPane.showMessageDialog(null,"Check Data acquisition service configuration, or invalid credentials.",
+								"Info",JOptionPane.WARNING_MESSAGE);						
+					}
+				}
 			}
 		});
+
+		stopExperimentBtn.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e)
+			{
+				int[] selection = table.getSelectedRows();
+				if (selection.length > 0) {
+					if (dconnection.isSessionValid()) {
+						stopExperiments(selection, dconnection);
+					} 
+					else if (dconnection.isInitialized()) {
+						JOptionPane.showMessageDialog(null,"Session expired. Restart the tools.",
+								"Info",JOptionPane.WARNING_MESSAGE);						
+					} 
+					else if ((dconnection.init() == ServiceConnection.ServiceConnectionStatus.SUCCESS) 
+							&& (dconnection.login() == ServiceConnection.ServiceConnectionStatus.SUCCESS)) {
+						stopExperiments(selection, dconnection);
+					} else {
+						JOptionPane.showMessageDialog(null,"Check Data acquisition service configuration, or invalid credentials.",
+								"Info",JOptionPane.WARNING_MESSAGE);						
+					}
+				}
+			}
+		});
+
+	}
+
+	private void importAndStartExperiments(int[] selection, DaqServiceConnection dconnection) {
+		for (int i = 0; i < selection.length; i++) {
+			String experimentName = EXPERIMENT_PREFIX+(String)table.getModel().getValueAt(selection[i], Column.NAME.ordinal());
+			String description = (String)table.getModel().getValueAt(selection[i], Column.DESCRIPTION.ordinal());
+			if (sconnection.addExperiment(experimentName, description) != ServiceConnection.ServiceConnectionStatus.SUCCESS) {
+				continue;
+			}
+			addRole((String)table.getModel().getValueAt(selection[i], Column.MANAGER.ordinal()), experimentName, Role.MANAGER);
+			//					addRole((String)table.getModel().getValueAt(selection[i], Column.PI.ordinal()), experimentName, Role.PI);
+			addRole((String)table.getModel().getValueAt(selection[i], Column.USER.ordinal()), experimentName, Role.USER);
+			if (sconnection.startExperiment(experimentName) == ServiceConnection.ServiceConnectionStatus.SUCCESS) {
+				dconnection.startDaq(experimentName);						
+			} else {
+				JOptionPane.showMessageDialog(null,"The experiment "+ experimentName +" did not start",
+						"Info",JOptionPane.WARNING_MESSAGE);
+			}
+		}
+		table.clearSelection();		
+	}
+	
+	private void startExperiments(int[] selection, DaqServiceConnection dconnection) {
+		for (int i = 0; i < selection.length; i++) {
+			String experimentName = EXPERIMENT_PREFIX+(String)table.getModel().getValueAt(selection[i], Column.NAME.ordinal());
+			dconnection.startDaq(experimentName);						
+		}
+		table.clearSelection();		
+	}
+
+	private void stopExperiments(int[] selection, DaqServiceConnection dconnection) {
+		for (int i = 0; i < selection.length; i++) {
+			String experimentName = EXPERIMENT_PREFIX+(String)table.getModel().getValueAt(selection[i], Column.NAME.ordinal());
+			dconnection.stopDaq(experimentName);
+		}
+		table.clearSelection();		
 	}
 
 	private void addRole(String userList, String experimentName, Role role) {
diff --git a/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/Gui.java b/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/Gui.java
index 300f340a603486dcbc1d1b86bc331813cbcf750e..14a68ead15901fb0e0c31dd97f5ea25380083079 100644
--- a/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/Gui.java
+++ b/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/Gui.java
@@ -20,7 +20,6 @@ class Gui
 {
 	public static void main(String arg[])
 	{
-
 		String configFile = arg[0];
 		final Properties configProperties = new Properties();
 		setConfig(configFile, configProperties);
@@ -46,7 +45,7 @@ class Gui
 		if (sconnection.init(configProperties.getProperty("dm.storageServ.connection")) != ServiceConnection.ServiceConnectionStatus.SUCCESS) {
 			System.exit(0);
 		}
-		DaqServiceConnection dconnection = new DaqServiceConnection(configProperties.getProperty("dm.daqServ.connection"));
+		DaqServiceConnection dconnection = new DaqServiceConnection(configProperties);
 		try
 		{
 			LoginWindow frame = new LoginWindow(sconnection, oconnection, dconnection);
diff --git a/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/DaqServiceConnection.java b/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/DaqServiceConnection.java
index 0c4da47e023b2d4260d87e40656c3f30c815eb1f..bc62267f1a2bc0357b5ffa3856a4060b6cd50751 100644
--- a/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/DaqServiceConnection.java
+++ b/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/DaqServiceConnection.java
@@ -1,7 +1,11 @@
 package gov.anl.dm.esafsync.serviceconn;
 
+import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Properties;
+
+import javax.swing.JOptionPane;
 
 public class DaqServiceConnection extends ServiceConnection{
 
@@ -12,23 +16,56 @@ public class DaqServiceConnection extends ServiceConnection{
 	
 	class StorageServUrl {
 		static final String START_DAQ = "/experiments/startDaq";
+		static final String STOP_DAQ = "/experiments/stopDaq";
 	}
 
-	private final String url;
+	private final Properties config;
 
-	public DaqServiceConnection(String url) {
-		this.url = url;
+	public DaqServiceConnection(Properties configProperties) {
+		this.config = configProperties;
 	}
 	
     public final int init() {
+		String url = config.getProperty("dm.daqServ.connection");
 		return super.init(url);
 	}
 
-	public void startDaq(String experimentName, String directory) {
+	public void startDaq(String experimentName) {
+		String dataDir = config.getProperty("dm.daq.datadir");
+		String directory;
+		if (dataDir.endsWith("/")) {
+			directory = dataDir + experimentName;
+		} else {
+			directory = dataDir + "/" + experimentName;
+		}
+		
     	Map<String, String> data = new HashMap<>();
     	data.put(Keyword.DAQ_EXPERIMENT_NAME, experimentName);
     	data.put(Keyword.DAQ_DATA_DIRECTORY, directory);
-		invokeSessionPostRequest(StorageServUrl.START_DAQ, data);    	
+
+    	if ((new File(dataDir)).exists()) {
+			if ((new File(directory)).exists()) {
+		    	invokeSessionPostRequest(StorageServUrl.START_DAQ, data);    					
+			} else if (new File(directory).mkdir()) {
+				invokeSessionPostRequest(StorageServUrl.START_DAQ, data); 
+			} else {
+				JOptionPane.showMessageDialog(null,"Can't start experiment " + experimentName + " in DAQ service. The experiment directory can't be created.",
+						"Warning",JOptionPane.WARNING_MESSAGE);									
+			}
+		} else {
+			if ((new File(dataDir).mkdir()) && (new File(directory).mkdir())) {
+				invokeSessionPostRequest(StorageServUrl.START_DAQ, data); 
+			} else {
+				JOptionPane.showMessageDialog(null,"Can't start experiment " + experimentName + " in DAQ service. The configured data directory does not exist and can't be created.",
+						"Error",JOptionPane.ERROR_MESSAGE);									
+			}
+		}
+    }
+    
+	public void stopDaq(String experimentName) {
+    	Map<String, String> data = new HashMap<>();
+    	data.put(Keyword.DAQ_EXPERIMENT_NAME, encode(experimentName));
+		invokeSessionPostRequest(StorageServUrl.STOP_DAQ, data); 
     }
     
 }
diff --git a/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/ServiceConnection.java b/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/ServiceConnection.java
index db8fa154a09eaa06b4d5ad8d1271d1d2386220a3..c9f10ada1e339ea3f5f477120feab265bbc7f425 100644
--- a/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/ServiceConnection.java
+++ b/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/ServiceConnection.java
@@ -98,6 +98,7 @@ public class ServiceConnection {
     protected URL serviceUrl;
     private Session session = new Session();
     private Login login;
+    private boolean initialized = false;
 
     public final int init(String serviceUrl) {
         if (serviceUrl == null) {
@@ -120,8 +121,17 @@ public class ServiceConnection {
         
         HttpsURLConnection.setDefaultSSLSocketFactory(new NoServerVerificationSSLSocketFactory());
         
+        initialized = true;
         return ServiceConnectionStatus.SUCCESS;
     }
+    
+    public boolean isInitialized() {
+    	return initialized;
+    }
+
+    public boolean isSessionValid() {
+    	return session.isValid();
+    }
 
     private URL getServiceUrl() {
         return serviceUrl;
@@ -512,7 +522,6 @@ public class ServiceConnection {
 
             int resp = sendPostData(loginData, connection);
             if (resp != ServiceConnectionStatus.SUCCESS) {
-            	System.out.println("here a");
             	return resp;
             }
             resp = checkHttpResponse(connection);
diff --git a/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/Session.java b/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/Session.java
index 3934f8df0dd9e9034b3a8b156c34110ddd901091..caa4dd50308be59554d081796bac222e24dad91a 100644
--- a/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/Session.java
+++ b/tools/ExperimentSynchronizer/src/gov/anl/dm/esafsync/serviceconn/Session.java
@@ -87,6 +87,18 @@ public class Session implements Serializable {
         }
         return cookie;
     }
+    
+    public boolean isValid() {
+        if (cookie == null) {
+        	return false;
+        } else {
+            HttpCookie httpCookie = HttpCookie.parse(cookie).get(0);
+            if (httpCookie.hasExpired()) {
+            	return false;
+            }
+        }
+        return true;    	
+    }
 
     public Role getRole() {
         return role;