Index: src/edu/ucsb/nceas/shared/xsd/IOException.java
===================================================================
--- src/edu/ucsb/nceas/shared/xsd/IOException.java	(nonexistent)
+++ src/edu/ucsb/nceas/shared/xsd/IOException.java	(revision 4967)
@@ -0,0 +1,86 @@
+/**
+ * IOException.java
+ *
+ * This file was auto-generated from WSDL
+ * by the Apache Axis 1.3 Oct 05, 2005 (05:23:37 EDT) WSDL2Java emitter.
+ */
+
+package edu.ucsb.nceas.shared.xsd;
+
+public class IOException  extends org.kepler.executionWS.xsd.Exception  implements java.io.Serializable {
+    public IOException() {
+    }
+
+    public IOException(
+           java.lang.Object exception) {
+        super(
+            exception);
+    }
+
+    private java.lang.Object __equalsCalc = null;
+    public synchronized boolean equals(java.lang.Object obj) {
+        if (!(obj instanceof IOException)) return false;
+        IOException other = (IOException) obj;
+        if (obj == null) return false;
+        if (this == obj) return true;
+        if (__equalsCalc != null) {
+            return (__equalsCalc == obj);
+        }
+        __equalsCalc = obj;
+        boolean _equals;
+        _equals = super.equals(obj);
+        __equalsCalc = null;
+        return _equals;
+    }
+
+    private boolean __hashCodeCalc = false;
+    public synchronized int hashCode() {
+        if (__hashCodeCalc) {
+            return 0;
+        }
+        __hashCodeCalc = true;
+        int _hashCode = super.hashCode();
+        __hashCodeCalc = false;
+        return _hashCode;
+    }
+
+    // Type metadata
+    private static org.apache.axis.description.TypeDesc typeDesc =
+        new org.apache.axis.description.TypeDesc(IOException.class, true);
+
+    static {
+        typeDesc.setXmlType(new javax.xml.namespace.QName("http://io.java/xsd", "IOException"));
+    }
+
+    /**
+     * Return type metadata object
+     */
+    public static org.apache.axis.description.TypeDesc getTypeDesc() {
+        return typeDesc;
+    }
+
+    /**
+     * Get Custom Serializer
+     */
+    public static org.apache.axis.encoding.Serializer getSerializer(
+           java.lang.String mechType, 
+           java.lang.Class _javaType,  
+           javax.xml.namespace.QName _xmlType) {
+        return 
+          new  org.apache.axis.encoding.ser.BeanSerializer(
+            _javaType, _xmlType, typeDesc);
+    }
+
+    /**
+     * Get Custom Deserializer
+     */
+    public static org.apache.axis.encoding.Deserializer getDeserializer(
+           java.lang.String mechType, 
+           java.lang.Class _javaType,  
+           javax.xml.namespace.QName _xmlType) {
+        return 
+          new  org.apache.axis.encoding.ser.BeanDeserializer(
+            _javaType, _xmlType, typeDesc);
+    }
+
+}
Index: src/edu/ucsb/nceas/shared/xsd/FileNotFoundException.java
===================================================================
--- src/edu/ucsb/nceas/shared/xsd/FileNotFoundException.java	(nonexistent)
+++ src/edu/ucsb/nceas/shared/xsd/FileNotFoundException.java	(revision 4967)
@@ -0,0 +1,89 @@
+/**
+ * FileNotFoundException.java
+ *
+ * This file was auto-generated from WSDL
+ * by the Apache Axis 1.3 Oct 05, 2005 (05:23:37 EDT) WSDL2Java emitter.
+ */
+
+package edu.ucsb.nceas.shared.xsd;
+
+public class FileNotFoundException  extends edu.ucsb.nceas.shared.xsd.IOException  implements java.io.Serializable {
+
+	private static final long serialVersionUID = -9077623505512220104L;
+	
+	public FileNotFoundException() {
+    }
+
+    public FileNotFoundException(
+           java.lang.Object exception) {
+        super(
+            exception);
+    }
+
+    private java.lang.Object __equalsCalc = null;
+    public synchronized boolean equals(java.lang.Object obj) {
+        if (!(obj instanceof FileNotFoundException)) return false;
+        FileNotFoundException other = (FileNotFoundException) obj;
+        if (obj == null) return false;
+        if (this == obj) return true;
+        if (__equalsCalc != null) {
+            return (__equalsCalc == obj);
+        }
+        __equalsCalc = obj;
+        boolean _equals;
+        _equals = super.equals(obj);
+        __equalsCalc = null;
+        return _equals;
+    }
+
+    private boolean __hashCodeCalc = false;
+    public synchronized int hashCode() {
+        if (__hashCodeCalc) {
+            return 0;
+        }
+        __hashCodeCalc = true;
+        int _hashCode = super.hashCode();
+        __hashCodeCalc = false;
+        return _hashCode;
+    }
+
+    // Type metadata
+    private static org.apache.axis.description.TypeDesc typeDesc =
+        new org.apache.axis.description.TypeDesc(FileNotFoundException.class, true);
+
+    static {
+        typeDesc.setXmlType(new javax.xml.namespace.QName("http://io.java/xsd", "FileNotFoundException"));
+    }
+
+    /**
+     * Return type metadata object
+     */
+    public static org.apache.axis.description.TypeDesc getTypeDesc() {
+        return typeDesc;
+    }
+
+    /**
+     * Get Custom Serializer
+     */
+    public static org.apache.axis.encoding.Serializer getSerializer(
+           java.lang.String mechType, 
+           java.lang.Class _javaType,  
+           javax.xml.namespace.QName _xmlType) {
+        return 
+          new  org.apache.axis.encoding.ser.BeanSerializer(
+            _javaType, _xmlType, typeDesc);
+    }
+
+    /**
+     * Get Custom Deserializer
+     */
+    public static org.apache.axis.encoding.Deserializer getDeserializer(
+           java.lang.String mechType, 
+           java.lang.Class _javaType,  
+           javax.xml.namespace.QName _xmlType) {
+        return 
+          new  org.apache.axis.encoding.ser.BeanDeserializer(
+            _javaType, _xmlType, typeDesc);
+    }
+
+}
Index: src/edu/ucsb/nceas/metacat/ArchiveHandler.java
===================================================================
--- src/edu/ucsb/nceas/metacat/ArchiveHandler.java	(revision 4966)
+++ src/edu/ucsb/nceas/metacat/ArchiveHandler.java	(revision 4967)
@@ -39,6 +39,8 @@
 import edu.ucsb.nceas.metacat.util.MetacatUtilException;
 import edu.ucsb.nceas.metacat.util.ResponseUtil;
 import edu.ucsb.nceas.utilities.FileUtil;
+import edu.ucsb.nceas.utilities.LSIDUtil;
+import edu.ucsb.nceas.utilities.ParseLSIDException;
 import edu.ucsb.nceas.utilities.PropertyNotFoundException;
 import edu.ucsb.nceas.utilities.UtilException;
 
@@ -80,8 +82,12 @@
             if (params.containsKey("docid")) {
                 docs = params.get("docid");
                 docid = docs[0];
+                if (docid.startsWith("urn:")) {
+                	docid = LSIDUtil.getDocId(docid, true);               	
+                }
             } else { 
-            	throw new HandlerException("Could not find doc id in params when reading archive entry");
+            	throw new HandlerException("ArchiveHandler.readArchiveEntry - Could not find doc " 
+            			+ "id in params when reading archive entry");
             } 
             
             // read the archive file entry name from params
@@ -89,7 +95,8 @@
             	archiveEntryNames = params.get("archiveEntryName");
             	archiveEntryName = archiveEntryNames[0];
             } else { 
-            	throw new HandlerException("Could not find archiveEntryName in params when reading archive entry");
+            	throw new HandlerException("ArchiveHandler.readArchiveEntry - Could not find " 
+            			+ "archiveEntryName in params when reading archive entry");
             } 
             
             // qformat is used to hold the type of archive and the format of the content that we wish to 
@@ -102,21 +109,23 @@
             	qformat = "jar-file";
             }       
             
-            //check the permission for read
-            try {
-            	if (!DocumentImpl.hasReadPermission(user, groups, docid)) {
-            		String errorString = "User " + user + " does not have permission"
-    					+ " to read the document with the docid " + docid;
-            		ResponseUtil.sendErrorXML(response, ResponseUtil.NO_READ_PERMISSION, errorString);
-            		return;
-            	}
-            } catch (McdbException mcdbe) {
-            	throw new HandlerException("Error getting permissions for docid: " 
-            			+ docid + " for user: " + user + " : " + mcdbe.getMessage());
-            } catch (SQLException sqle) {
-            	throw new HandlerException("SQL error getting permissions for docid: " 
-            			+ docid + " for user: " + user + " : " + sqle.getMessage());
-            } 
+//            //check the permission for read
+//            try {
+//            	if (!DocumentImpl.hasReadPermission(user, groups, docid)) {
+//            		String errorString = "User " + user + " does not have permission"
+//    					+ " to read the document with the docid " + docid;
+//            		ResponseUtil.sendErrorXML(response, ResponseUtil.NO_READ_PERMISSION, errorString);
+//            		return;
+//            	}
+//            } catch (McdbException mcdbe) {
+//            	throw new HandlerException("ArchiveHandler.readArchiveEntry - Error getting " 
+//            			+ "permissions for docid: " + docid + " for user: " + user 
+//            			+ " : " + mcdbe.getMessage());
+//            } catch (SQLException sqle) {
+//            	throw new HandlerException("ArchiveHandler.readArchiveEntry - SQL error getting " 
+//            			+ "permissions for docid: " + docid + " for user: " + user 
+//            			+ " : " + sqle.getMessage());
+//            } 
             
             // Get the path to the archive file
             String archiveFileBasePath = PropertyService.getProperty("application.datafilepath");
@@ -148,21 +157,26 @@
             ResponseUtil.writeFileToOutput(response, expandedArchivePath, archiveEntryName);            
                         
         } catch (UtilException ue) {
-        	String errorString = "Utility error reading archive entry for docid: " 
+        	String errorString = "ArchiveHandler.readArchiveEntry - Utility error reading archive entry for docid: " 
     			+ docid + " : " + ue.getMessage();
         	ResponseUtil.sendErrorXML(response, ResponseUtil.GENERAL_UTILITY_ERROR, errorString);
         	throw new ErrorHandledException(null);
         } catch (PropertyNotFoundException pnfe) {
-        	String errorString = "Property error reading archive entry for docid: " 
+        	String errorString = "ArchiveHandler.readArchiveEntry -  Property error reading archive entry for docid: " 
         		+ docid + " : " + pnfe.getMessage();
         	ResponseUtil.sendErrorXML(response, ResponseUtil.PROPERTY_NOT_FOUND, errorString);
         	throw new ErrorHandledException(null);
         } catch (MetacatUtilException mue) {
-        	String errorString = "Metacat utility error reading archive entry for docid: " 
+        	String errorString = "ArchiveHandler.readArchiveEntry -  Metacat utility error reading archive entry for docid: " 
         		+ docid + " : " + mue.getMessage();
         	ResponseUtil.sendErrorXML(response, ResponseUtil.METACAT_UTILITY_ERROR, errorString);
         	throw new ErrorHandledException(null);
-        } 
+        } catch (ParseLSIDException ple) {
+        	String errorString = "ArchiveHandler.readArchiveEntry -  LSID parsing error reading archive entry for docid: " 
+        		+ docid + " : " + ple.getMessage();
+        	ResponseUtil.sendErrorXML(response, ResponseUtil.METACAT_UTILITY_ERROR, errorString);
+        	throw new ErrorHandledException(null);
+        }
 	}
 
 }
Index: src/edu/ucsb/nceas/metacat/MetaCatServlet.java
===================================================================
--- src/edu/ucsb/nceas/metacat/MetaCatServlet.java	(revision 4966)
+++ src/edu/ucsb/nceas/metacat/MetaCatServlet.java	(revision 4967)
@@ -246,12 +246,9 @@
 			ServiceService.registerService("XMLSchemaService", XMLSchemaService.getInstance());
 			ServiceService.registerService("SchedulerService", SchedulerService.getInstance());
 
-			// check if eml201 document were corrected or not. if not, correct
-			// eml201 documents.
-			// Before Metacat 1.8.1, metacat uses tag RELEASE_EML_2_0_1_UPDATE_6
-			// as eml
-			// schema, which accidentily points to wrong version of
-			// eml-resource.xsd.
+			// check if eml201 document were corrected or not. if not, correct eml201 documents.
+			// Before Metacat 1.8.1, metacat uses tag RELEASE_EML_2_0_1_UPDATE_6 as eml
+			// schema, which accidentily points to wrong version of eml-resource.xsd.
 			String correctedEML201Doc = PropertyService
 					.getProperty("document.eml201DocumentCorrected");
 			if (correctedEML201Doc != null && correctedEML201Doc.equals(FALSE)) {
@@ -877,24 +874,38 @@
 					return;
 				} else if (action.equals("scheduleWorkflow")) {
 					try {
-						String resultString = 
-							WorkflowScheduler.getInstance().scheduleJob(params, request, response, 
-								userName, groupNames);
-						ResponseUtil.sendSuccessXML(response, resultString);
+						WorkflowScheduler.getInstance().scheduleJob(request, response, params, 
+							userName, groupNames);
 						return;
 					} catch (BaseException be) {
 						ResponseUtil.sendErrorXML(response, ResponseUtil.SCHEDULE_WORKFLOW_ERROR, be);
 						return;						
 					}
+				} else if (action.equals("unscheduleWorkflow")) {
+					try {
+						WorkflowScheduler.getInstance().unScheduleJob(request, response, params, 
+							userName, groupNames);
+						return;
+					} catch (BaseException be) {
+						ResponseUtil.sendErrorXML(response, ResponseUtil.UNSCHEDULE_WORKFLOW_ERROR, be);
+						return;						
+					}
+				} else if (action.equals("rescheduleWorkflow")) {
+					try {
+						WorkflowScheduler.getInstance().reScheduleJob(request, response, params, 
+							userName, groupNames);
+						return;
+					} catch (BaseException be) {
+						ResponseUtil.sendErrorXML(response, ResponseUtil.RESCHEDULE_WORKFLOW_ERROR, be);
+						return;						
+					}
 				} else if (action.equals("getScheduledWorkflow")) {
 					try {
-						String resultString = 
-							WorkflowScheduler.getInstance().getJobs(params, request, response, 
-								userName, groupNames);
-						ResponseUtil.sendSuccessXML(response, resultString);
+						WorkflowScheduler.getInstance().getJobs(request, response, params, 
+								userName, groupNames);				
 						return;
 					} catch (BaseException be) {
-						ResponseUtil.sendErrorXML(response, ResponseUtil.SCHEDULE_WORKFLOW_ERROR, be);
+						ResponseUtil.sendErrorXML(response, ResponseUtil.GET_SCHEDULED_WORKFLOW_ERROR, be);
 						return;						
 					}
 				} else {
Index: src/edu/ucsb/nceas/metacat/workflow/WorkflowJob.java
===================================================================
--- src/edu/ucsb/nceas/metacat/workflow/WorkflowJob.java	(revision 4966)
+++ src/edu/ucsb/nceas/metacat/workflow/WorkflowJob.java	(revision 4967)
@@ -25,31 +25,65 @@
  */
 package edu.ucsb.nceas.metacat.workflow;
 
-import java.util.Calendar;
+import java.rmi.RemoteException;
+import javax.xml.rpc.ServiceException;
 
 import org.apache.log4j.Logger;
 
 import org.quartz.InterruptableJob;
+import org.quartz.JobDetail;
+import org.quartz.JobDataMap;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 
-import edu.ucsb.nceas.utilities.FileUtil;
-import edu.ucsb.nceas.utilities.UtilException;
+import org.kepler.executionWS.KeplerWebServiceLocator;
+import org.kepler.executionWS.KeplerWebServicePortType;
 
 public class WorkflowJob implements InterruptableJob {
 	
 	private static Logger logMetacat = Logger.getLogger(WorkflowJob.class);
 	
-	public void execute(JobExecutionContext context) throws JobExecutionException {
+	public void execute(JobExecutionContext executionContext) throws JobExecutionException {
 		try {
-			FileUtil.createFile("/tmp/worflowJob.txt");
-			FileUtil.writeFile("/tmp/worflowJob.txt", Calendar.getInstance().getTime().toString());			
-		} catch (UtilException ue) {
-			String errorstr = "Util Exception writing to file" + ue.getMessage();
-			logMetacat.error(errorstr);
-			throw new JobExecutionException(errorstr);
+			JobDetail jobDetail = executionContext.getJobDetail();
+			if (jobDetail == null) {
+				throw new JobExecutionException("WorkflowJob.execute - Could not get job detail from execution context"); 
+			}
+			
+			JobDataMap jobDataMap = jobDetail.getJobDataMap();
+			if (jobDataMap == null) {
+				throw new JobExecutionException("WorkflowJob.execute - Could not get job data map from job detail"); 
+			}
+			
+			String karLSID = jobDataMap.getString("karid");
+			if (karLSID == null) {
+				throw new JobExecutionException("WorkflowJob.execute - Could not get kar LSID from job data map");
+			}
+			
+			logMetacat.debug("WorkflowJob.execute - Getting serviceLocator");
+			KeplerWebServiceLocator serviceLocator = new KeplerWebServiceLocator();
+			
+			logMetacat.debug("WorkflowJob.execute - Getting service");
+			KeplerWebServicePortType serviceEndpoint = serviceLocator.getKeplerWebServiceHttpSoap11Endpoint();
+			
+			logMetacat.debug("WorkflowJob.execute - Executing with kar lsid:" + karLSID);
+			String status = serviceEndpoint.execute(karLSID);
+			//String status = serviceEndpoint.getStatus(karLSID);		
+			logMetacat.debug("WorkflowJob.execute - Status: " + status);
+			
+		} catch (RemoteException re) {
+			String errorStr = "WorkflowJob.execute - Remote problem when trying to execute task: " + re.getMessage();
+			logMetacat.error(errorStr);
+			throw new JobExecutionException(errorStr); 
+		} catch (ServiceException se) {
+			String errorStr = "WorkflowJob.execute - Service problem when trying to execute task: " + se.getMessage();
+			logMetacat.error(errorStr);
+			throw new JobExecutionException(errorStr); 
+		} catch (Exception e) {
+			String errorStr = "WorkflowJob.execute - General problem when trying to execute task: " + e.getMessage();
+			logMetacat.error(errorStr);
+			throw new JobExecutionException(errorStr); 
 		}
-	
 	}
 	
 	public void interrupt() {
Index: src/edu/ucsb/nceas/metacat/workflow/WorkflowScheduler.java
===================================================================
--- src/edu/ucsb/nceas/metacat/workflow/WorkflowScheduler.java	(revision 4966)
+++ src/edu/ucsb/nceas/metacat/workflow/WorkflowScheduler.java	(revision 4967)
@@ -26,7 +26,8 @@
 
 package edu.ucsb.nceas.metacat.workflow;
 
-import java.text.DateFormat;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
 import java.text.ParseException;
 import java.util.Calendar;
 import java.util.Date;
@@ -36,13 +37,22 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletException;
 
 import org.apache.log4j.Logger;
 
+import edu.ucsb.nceas.metacat.MetaCatServlet;
 import edu.ucsb.nceas.metacat.scheduler.BaseScheduler;
+import edu.ucsb.nceas.metacat.scheduler.ScheduledJobAccess;
+import edu.ucsb.nceas.metacat.scheduler.ScheduledJobDAO;
+import edu.ucsb.nceas.metacat.scheduler.ScheduledJobParamDAO;
 import edu.ucsb.nceas.metacat.scheduler.SchedulerService;
 import edu.ucsb.nceas.metacat.scheduler.MetacatSchedulerException;
 import edu.ucsb.nceas.metacat.service.ServiceException;
+import edu.ucsb.nceas.metacat.util.ErrorSendingErrorException;
+import edu.ucsb.nceas.metacat.util.ResponseUtil;
+import edu.ucsb.nceas.metacat.util.RequestUtil;
+import edu.ucsb.nceas.shared.AccessException;
 
 public class WorkflowScheduler extends BaseScheduler {
 	
@@ -50,8 +60,8 @@
 	
 	private static Logger logMetacat = Logger.getLogger(WorkflowScheduler.class);
 	
-	private static String SCHEDULED_JOB_GROUP = "workflow";
-	private static String SCHEDULED_JOB_CLASS = "edu.ucsb.nceas.metacat.workflow.WorkflowJob";
+	private static String WORKFLOW_JOB_GROUP = "workflow";
+	private static String WORKFLOW_JOB_CLASS = "edu.ucsb.nceas.metacat.workflow.WorkflowJob";
 
 	/**
 	 * private constructor since this is a singleton
@@ -70,10 +80,10 @@
 		return workflowScheduler;
 	}
 	
-	public String scheduleJob(Hashtable<String, String[]> params,
-			HttpServletRequest request, HttpServletResponse response, String username,
+	public void scheduleJob(HttpServletRequest request, HttpServletResponse response, 
+			Hashtable<String, String[]> params, String username,
 			String[] groups) throws MetacatSchedulerException {
-		
+		 		
 		String delays[] = params.get("delay");
 		String startTimes[] = params.get("starttime");
 		HashMap<String, String> jobParams = new HashMap<String, String>();
@@ -85,7 +95,8 @@
 			if (delays != null && delays.length > 0) {
 				startCal = schedulerService.getStartDateFromDelay(delays[0]);
 			} else if (startTimes != null && startTimes.length > 0) {
-				Date startDate = DateFormat.getInstance().parse(startTimes[0]);
+				SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z");
+				Date startDate = dateFormat.parse(startTimes[0]);
 				startCal = Calendar.getInstance();
 				startCal.setTime(startDate);
 			} else {
@@ -93,13 +104,20 @@
 				startCal = Calendar.getInstance();
 			}
 
-			String intervals[] = params.get("interval");
-			if (intervals == null || intervals.length == 0) {
-				throw new MetacatSchedulerException(
-						"SchedulerService.scheduleHandler - Interval field must be populated "
+			String intervalValues[] = params.get("intervalvalue");
+			if (intervalValues == null || intervalValues.length == 0) {
+				throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - intervalvalue field must be populated "
 								+ "in scheduler parameters when scheduling job.");
 			}
-			String interval = intervals[0];
+			String intervalStrValue = intervalValues[0];
+			int intervalValue = Integer.parseInt(intervalStrValue);
+			
+			String intervalUnits[] = params.get("intervalunit");
+			if (intervalUnits == null || intervalUnits.length == 0) {
+				throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - intervalunit field must be populated "
+								+ "in scheduler parameters when scheduling job.");
+			}
+			String intervalUnit = intervalUnits[0];
 
 			Enumeration<String> paramNames = params.keys();
 			while (paramNames.hasMoreElements()) {
@@ -109,45 +127,194 @@
 				}
 			}
 
-			String jobName = SCHEDULED_JOB_GROUP
+			String jobName = WORKFLOW_JOB_GROUP
 					+ Calendar.getInstance().getTimeInMillis();
 
-			return schedulerService.scheduleJob(jobName, startCal, interval,
-					SCHEDULED_JOB_CLASS, SCHEDULED_JOB_GROUP, jobParams);
+			String xmlResult = schedulerService.scheduleJob(jobName, startCal, intervalValue, intervalUnit,
+					WORKFLOW_JOB_CLASS, WORKFLOW_JOB_GROUP, jobParams, username, groups);
+
+			String forwardtos[] = params.get("forwardto");
+			String forwardto = null;
+			if (forwardtos != null && forwardtos.length > 0) {
+				forwardto = forwardtos[0];
+			}
+			
+			if (forwardto != null) {
+				String qformats[] = params.get("qformat");
+				String qformat = null;
+				if (qformats != null && qformats.length > 0) {
+					qformat = qformats[0];
+				}
+				
+				String destination = "/style/skins/" + qformat + "/" + forwardto
+					+ "?workflowid=" + jobParams.get("workflowid");			
+				RequestUtil.forwardRequest(request, response, destination.toString());
+			} else {
+				ResponseUtil.sendSuccessXML(response, xmlResult);
+			}
+			
 		} catch (ParseException pe) {
-			throw new MetacatSchedulerException("WorkflowScheduler.scheduleHandler - Could not " + "schedule job  : " 
+			throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - Could not " + "schedule job  : " 
 					+ pe.getMessage());
 		} catch (ServiceException se) {
-			throw new MetacatSchedulerException("WorkflowScheduler.scheduleHandler - Service issue scheduling job", se);
+			throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - Service issue scheduling job", se);
+		} catch (IOException ioe) {
+			throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - I/O issue scheduling job: " + ioe.getMessage());
+		} catch (ServletException se) {
+			throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - Servlet issue scheduling job: " + se.getMessage());
+		} catch (ErrorSendingErrorException esee) {
+			throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - Issue sending erro when scheduling job: " + esee.getMessage());			
 		}
 	}
 	
-	public String unScheduleJob(Hashtable<String, String[]> params,
-            HttpServletRequest request, HttpServletResponse response,
-            String username, String[] groups) throws MetacatSchedulerException {
-		return "";
+	public void unScheduleJob(HttpServletRequest request, HttpServletResponse response,
+			Hashtable<String, String[]> params, String username, String[] groups)
+			throws MetacatSchedulerException {
+		try {
+			String jobNames[] = params.get("workflowjobid");
+			if (jobNames == null || jobNames.length == 0) {
+				throw new MetacatSchedulerException("SchedulerService.unScheduleJob - workflowjobid " 
+						+ "field must be populated in scheduler parameters when unscheduling job.");
+			}
+			String jobName = jobNames[0];
+
+			SchedulerService schedulerService = SchedulerService.getInstance();
+			String xmlResult = schedulerService.unScheduleJob(jobName, username, groups);
+			
+			String forwardtos[] = params.get("forwardto");
+			String forwardto = null;
+			if (forwardtos != null && forwardtos.length > 0) {
+				forwardto = forwardtos[0];
+			}
+			
+			if (forwardto != null) {
+				String qformats[] = params.get("qformat");
+				String qformat = null;
+				if (qformats != null && qformats.length > 0) {
+					qformat = qformats[0];
+				}
+				
+				ScheduledJobAccess jobAccess = new ScheduledJobAccess();
+				ScheduledJobDAO jobDAO = jobAccess.getJobByName(jobName);
+				
+				String workflowId = null;
+				ScheduledJobParamDAO jobParamDAO = jobDAO.getJobParam("workflowid");
+				if (jobParamDAO != null) {
+					workflowId = jobParamDAO.getValue();
+				}				 
+				
+				String destination = "/style/skins/" + qformat + "/" + forwardto
+					+ "?workflowid=" + workflowId;			
+				RequestUtil.forwardRequest(request, response, destination.toString());
+			} else {
+				ResponseUtil.sendSuccessXML(response, xmlResult);
+			}
+			ResponseUtil.sendSuccessXML(response, xmlResult);
+		} catch (ServiceException se) {
+			throw new MetacatSchedulerException(
+					"WorkflowScheduler.unScheduleJob - Service issue unscheduling job",
+					se);
+		} catch (Exception e) {
+			throw new MetacatSchedulerException(
+					"WorkflowScheduler.unScheduleJob - Generic issue unscheduling job: "
+							+ e.getMessage());
+		}
 	}
 	
-	public String deleteJob(Hashtable<String, String[]> params,
-            HttpServletRequest request, HttpServletResponse response,
-            String username, String[] groups) throws MetacatSchedulerException {
-		return "";
+	public void reScheduleJob(HttpServletRequest request, HttpServletResponse response, 
+			Hashtable<String, String[]> params, String username,
+			String[] groups) throws MetacatSchedulerException {
+		 		
+		try {
+			String jobNames[] = params.get("workflowjobid");
+	
+			if (jobNames == null || jobNames.length == 0) {
+				throw new MetacatSchedulerException("WorkflowScheduler.reScheduleJob - workflowjobid field must be populated "
+						+ "in scheduler parameters when rescheduling job.");
+			}
+			
+			String jobName = jobNames[0];
+	
+			ScheduledJobAccess jobAccess = new ScheduledJobAccess();
+			ScheduledJobDAO jobDAO = jobAccess.getJobByName(jobName);
+			
+			SchedulerService schedulerService = SchedulerService.getInstance();
+			String result = schedulerService.rescheduleJob(jobDAO, username, groups);
+
+			String forwardtos[] = params.get("forwardto");
+			String forwardto = null;
+			if (forwardtos != null && forwardtos.length > 0) {
+				forwardto = forwardtos[0];
+			}
+			
+			if (forwardto != null) {
+				String qformats[] = params.get("qformat");
+				String qformat = null;
+				if (qformats != null && qformats.length > 0) {
+					qformat = qformats[0];
+				}
+				
+				String workflowId = null;
+				ScheduledJobParamDAO jobParamDAO = jobDAO.getAllJobParams().get("workflowid");
+				if (jobParamDAO != null) {
+					workflowId = jobParamDAO.getValue();
+				}
+				
+				String destination = "/style/skins/" + qformat + "/" + forwardto
+					+ "?workflowid=" + workflowId;			
+				RequestUtil.forwardRequest(request, response, destination.toString());
+			} else {
+				ResponseUtil.sendSuccessXML(response, result);
+			}
+			
+		} catch (AccessException ae) {
+			throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - DB access issue when scheduling job  : ", ae);
+		} catch (ServiceException se) {
+			throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - Service issue scheduling job", se);
+		} catch (IOException ioe) {
+			throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - I/O issue scheduling job: " + ioe.getMessage());
+		} catch (ServletException se) {
+			throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - Servlet issue scheduling job: " + se.getMessage());
+		} catch (ErrorSendingErrorException esee) {
+			throw new MetacatSchedulerException("WorkflowScheduler.scheduleJob - Issue sending erro when scheduling job: " + esee.getMessage());			
+		}
 	}
 	
-	public String getJobs(Hashtable<String, String[]> params,
-            HttpServletRequest request, HttpServletResponse response,
-            String username, String[] groups) throws MetacatSchedulerException {
+	public void deleteJob(HttpServletRequest request, HttpServletResponse response, 
+			Hashtable<String, String[]> params, String username, String[] groups) throws MetacatSchedulerException {
 		
-		String groupName = null;
-		String groupNames[] = params.get("groupName");
-		if (groupNames != null && groupNames.length != 0) {
-			groupName = groupNames[0];
+	}
+	
+	public void getJobs(HttpServletRequest request, HttpServletResponse response, 
+			Hashtable<String, String[]> params, String username, String[] groups) throws MetacatSchedulerException {
+		
+		String workFlowId = null;
+		String qformat = "";
+		
+		String workFlowIds[] = params.get("workflowid");
+		if (workFlowIds != null && workFlowIds.length != 0) {
+			workFlowId = workFlowIds[0];
 		}
 		
+        if (params.containsKey("qformat")) {
+            qformat = params.get("qformat")[0];
+        }
+		
 		try {
-			return SchedulerService.getInstance().getJobsInfoXML(groupName);
+			String xmlResult = SchedulerService.getInstance().getJobsInfoXML(WORKFLOW_JOB_GROUP, "workflowid", workFlowId);
+			logMetacat.debug("WorkflowScheduler.getJobs - xmlResult: " + xmlResult);
+			
+			if (qformat == null || qformat.equals(MetaCatServlet.XMLFORMAT)) {
+				ResponseUtil.send(response, xmlResult);
+			} else {				
+				ResponseUtil.transformAndSendXML(response, xmlResult, "-//NCEAS//scheduledWorkflowResultset//EN", 
+					"-//W3C//HTML//EN", qformat, params);
+			}
 		} catch (ServiceException se) {
 			throw new MetacatSchedulerException("WorkflowScheduler.getJobs - Service issue getting jobs", se);
+		} catch (Exception e) {
+			throw new MetacatSchedulerException("WorkflowScheduler.getJobs - Generic issue getting jobs: " 
+					+ e.getMessage());
 		}		
 	}	
 }
Index: src/edu/ucsb/nceas/metacat/util/ResponseUtil.java
===================================================================
--- src/edu/ucsb/nceas/metacat/util/ResponseUtil.java	(revision 4966)
+++ src/edu/ucsb/nceas/metacat/util/ResponseUtil.java	(revision 4967)
@@ -32,6 +32,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintWriter;
+import java.sql.SQLException;
 import java.util.Hashtable;
 
 import javax.servlet.http.HttpServletRequest;
@@ -39,8 +40,10 @@
 
 import org.apache.log4j.Logger;
 
+import edu.ucsb.nceas.metacat.DBTransform;
 import edu.ucsb.nceas.shared.BaseException;
 import edu.ucsb.nceas.utilities.FileUtil;
+import edu.ucsb.nceas.utilities.PropertyNotFoundException;
 
 public class ResponseUtil {
 	
@@ -53,7 +56,11 @@
 	public static Long NO_READ_PERMISSION = new Long(105001);
 	// 130XXX - scheduler errors
 	public static Long SCHEDULE_WORKFLOW_ERROR = new Long(130001);
+	public static Long UNSCHEDULE_WORKFLOW_ERROR = new Long(130002);
+	public static Long RESCHEDULE_WORKFLOW_ERROR = new Long(130003);
+	public static Long GET_SCHEDULED_WORKFLOW_ERROR = new Long(130004);
 	
+	
 	// errorCodes is a lookup table for generic messages for each code.  It
 	// is better to use the sendError() versions that accept an explicit 
 	// error message;
@@ -64,6 +71,9 @@
 		errorCodes.put(PROPERTY_NOT_FOUND, "Property not found");
 		errorCodes.put(NO_READ_PERMISSION, "Read permission denied for user");
 		errorCodes.put(SCHEDULE_WORKFLOW_ERROR, "Schedule workflow error");
+		errorCodes.put(UNSCHEDULE_WORKFLOW_ERROR, "Unschedule workflow error");
+		errorCodes.put(RESCHEDULE_WORKFLOW_ERROR, "Reschedule workflow error");
+		errorCodes.put(GET_SCHEDULED_WORKFLOW_ERROR, "Get scheduled workflow error");
 	}
 	
 	private static Logger logMetacat = Logger.getLogger(ResponseUtil.class);
@@ -129,6 +139,25 @@
 		}
 	}
 	
+	public static void send(HttpServletResponse response, String content) throws ErrorSendingErrorException {
+
+		PrintWriter out = null;
+		try {
+			out = response.getWriter();
+			response.setContentType("text/xml");
+
+			out.print(content);
+
+		} catch (IOException ioe) {
+			throw new ErrorSendingErrorException("I/O error when sending content: "
+					+ content + " : " + ioe.getMessage());
+		} finally {
+			if (out != null) {
+				out.close();
+			}
+		}
+	}
+	
 	public static void sendErrorXML(HttpServletResponse response, Long errorCode,
 			BaseException be) throws ErrorSendingErrorException {
 
@@ -204,4 +233,38 @@
 			}
 		}
 	}
+	
+	public static boolean isSuccessXML(String message) {
+
+		return message.indexOf("<success>") != -1;
+	}
+	
+	public static void transformAndSendXML(HttpServletResponse response, String xmlDoc,
+			String sourceType, String targetType, String qformat, 
+			Hashtable<String, String[]> params) throws ErrorSendingErrorException {
+
+		PrintWriter out = null;
+		try {
+			out = response.getWriter();
+			DBTransform dbTransform = new DBTransform();
+
+			dbTransform.transformXMLDocument(xmlDoc, sourceType, targetType, qformat, out, params);
+		} catch (PropertyNotFoundException pnfe) {
+			throw new ErrorSendingErrorException("Property error when transforming XML: "
+					+ xmlDoc + " : " + pnfe.getMessage());
+		} catch (ClassNotFoundException cnfe) {
+			throw new ErrorSendingErrorException("Class error when transforming XML: "
+					+ xmlDoc + " : " + cnfe.getMessage());
+		} catch (SQLException sqle) {
+			throw new ErrorSendingErrorException("SQL error when transforming XML: "
+					+ xmlDoc + " : " + sqle.getMessage());
+		} catch (IOException ioe) {
+			throw new ErrorSendingErrorException("I/O error when transforming XML: "
+					+ xmlDoc + " : " + ioe.getMessage());
+		} finally {
+			if (out != null) {
+				out.close();
+			}
+		}
+	}
 }
Index: src/edu/ucsb/nceas/metacat/DBEntityResolver.java
===================================================================
--- src/edu/ucsb/nceas/metacat/DBEntityResolver.java	(revision 4966)
+++ src/edu/ucsb/nceas/metacat/DBEntityResolver.java	(revision 4967)
@@ -44,7 +44,6 @@
 import java.io.InputStream;
 import java.io.IOException;
 import java.net.URL;
-import java.net.URLConnection;
 import java.net.MalformedURLException;
 
 /**
@@ -179,7 +178,7 @@
         istream.close();
       } catch (IOException e) {
         throw new SAXException
-        ("DBEntityResolver.resolveEntity(): " + e.getMessage());
+        ("DBEntityResolver.resolveEntity - I/O issue when resolving entity: " + e.getMessage());
       }
       istream = checkURLConnection(dbSystemID);
       is.setByteStream(istream);
@@ -226,10 +225,10 @@
       stmt.close();
     } catch (SQLException e) {
       throw new SAXException
-      ("DBEntityResolver.getDTDSystemID(): " + e.getMessage());
+      ("DBEntityResolver.getDTDSystemID - SQL error when getting DTD system ID: " + e.getMessage());
     } catch (PropertyNotFoundException pnfe) {
         throw new SAXException
-        ("DBEntityResolver.getDTDSystemID(): " + pnfe.getMessage());
+        ("DBEntityResolver.getDTDSystemID - Property error when getting DTD system ID:  " + pnfe.getMessage());
       }
     finally
     {
@@ -239,7 +238,7 @@
       }//try
       catch (SQLException sqlE)
       {
-        logMetacat.error("Error in DBEntityReolver.getDTDSystemId: "
+        logMetacat.error("SQL error in DBEntityReolver.getDTDSystemId: "
                                   +sqlE.getMessage());
       }//catch
       finally
@@ -290,7 +289,7 @@
       pstmt.close();
     } catch (SQLException e) {
       throw new SAXException
-      ("DBEntityResolver.registerDTD(): " + e.getMessage());
+      ("DBEntityResolver.registerDTD - SQL issue when registering DTD: " + e.getMessage());
     }
     finally
     {
@@ -300,7 +299,7 @@
       }//try
       catch (SQLException sqlE)
       {
-        logMetacat.error("Error in DBEntityReolver.registerDTD: "
+        logMetacat.error("SQL error in DBEntityReolver.registerDTD: "
                                     +sqlE.getMessage());
       }//catch
       //DBConnectionPool.returnDBConnection(conn, serialNumber);
@@ -373,11 +372,11 @@
 				fw.close();
 			} // end of synchronized
 		} catch (MalformedURLException e) {
-			throw new SAXException("DBEntityResolver.uploadDTD(): " + e.getMessage());
+			throw new SAXException("DBEntityResolver.uploadDTD() - Malformed URL when uploading DTD: " + e.getMessage());
 		} catch (IOException e) {
-			throw new SAXException("DBEntityResolver.uploadDTD(): " + e.getMessage());
+			throw new SAXException("DBEntityResolver.uploadDTD - I/O issue when uploading DTD: " + e.getMessage());
 		} catch (SecurityException e) {
-			throw new SAXException("DBEntityResolver.uploadDTD(): " + e.getMessage());
+			throw new SAXException("DBEntityResolver.uploadDTD() - Security issue when uploading DTD: " + e.getMessage());
 		}
 
 		// String dtdURL = "http://dev.nceas.ucsb.edu/bojilova/dtd/";
@@ -396,7 +395,7 @@
 			dtdPath = SystemUtil.getContextDir() + "/dtd/";
 			dtdURL = SystemUtil.getContextURL() + "/dtd/";
 		} catch (PropertyNotFoundException pnfe) {
-			throw new SAXException("DBEntityResolver.uploadDTDFromURL: "
+			throw new SAXException("DBEntityResolver.uploadDTDFromURL - Property issue when uploading DTD from URL: "
 					+ pnfe.getMessage());
 		}
 
@@ -452,13 +451,13 @@
 				fw.close();
 			} // end of synchronized
 		} catch (MalformedURLException e) {
-			throw new SAXException("DBEntityResolver.uploadDTDFromURL(): "
+			throw new SAXException("DBEntityResolver.uploadDTDFromURL - Malformed URL when uploading DTD from URL: "
 					+ e.getMessage());
 		} catch (IOException e) {
-			throw new SAXException("DBEntityResolver.uploadDTDFromURL(): "
+			throw new SAXException("DBEntityResolver.uploadDTDFromURL - I/O issue when uploading DTD from URL:  "
 					+ e.getMessage());
 		} catch (SecurityException e) {
-			throw new SAXException("DBEntityResolver.uploadDTDFromURL(): "
+			throw new SAXException("DBEntityResolver.uploadDTDFromURL - Security issue when uploading DTD from URL:  "
 					+ e.getMessage());
 		}
 
@@ -478,10 +477,10 @@
 			return (new URL(systemId).openStream());
 
 		} catch (MalformedURLException e) {
-			throw new SAXException("DBEntityResolver.checkURLConnection(): "
+			throw new SAXException("DBEntityResolver.checkURLConnection - Malformed URL when checking URL Connection: "
 					+ e.getMessage());
 		} catch (IOException e) {
-			throw new SAXException("DBEntityResolver.checkURLConnection(): "
+			throw new SAXException("DBEntityResolver.checkURLConnection - I/O issue when checking URL Connection: "
 					+ e.getMessage());
 		}
 	}
Index: src/edu/ucsb/nceas/metacat/scheduler/SchedulerService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/scheduler/SchedulerService.java	(revision 4966)
+++ src/edu/ucsb/nceas/metacat/scheduler/SchedulerService.java	(revision 4967)
@@ -26,7 +26,6 @@
 
 package edu.ucsb.nceas.metacat.scheduler;
 
-import java.util.Arrays;
 import java.util.Calendar;
 import java.util.HashMap;
 import java.util.Vector;
@@ -87,11 +86,23 @@
 			SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
 			
 			sched = schedFact.getScheduler();
-			// read jobs from db here.
-			// then add jobs to sched.
 			sched.start();
+			
+			ScheduledJobAccess jobAccess = new ScheduledJobAccess();
+			HashMap<Long, ScheduledJobDAO> allJobsMap = jobAccess.getAllJobs(null);
+			
+			for (Long jobId : allJobsMap.keySet()) {
+				ScheduledJobDAO jobDAO = allJobsMap.get(jobId);
+				String[] groups = {"scheduler_group"};
+				if (jobDAO.getStatus().equals(StatusUtil.SCHEDULED)) {
+					rescheduleJob(jobDAO, "scheduler_user", groups, false);
+				}
+			}			
+			
+		} catch (AccessException ae) {
+			throw new ServiceException("DB Access issue when starting scheduler: ", ae);
 		} catch (SchedulerException se) {
-			throw new ServiceException("Could not start scheduler: " + se.getMessage());
+			throw new ServiceException("Scheduler engine issue when starting scheduler: " + se.getMessage());
 		}		
 	}
 	
@@ -108,9 +119,25 @@
 		return new Vector<String>();
 	}
 	
-	public String scheduleJob(String jobName, Calendar startCal, String interval,
-			String jobClassName, String jobGroup, HashMap<String, String> jobParams) throws ServiceException {
+	public String scheduleJob(ScheduledJobDAO jobDAO, String username, String[] groups) throws ServiceException {
         
+		Calendar startTimeCal = Calendar.getInstance();
+        startTimeCal.setTime(jobDAO.getStartTime());
+        
+        HashMap<String, String> jobParams = new HashMap<String, String>();
+        HashMap<String, ScheduledJobParamDAO> jobParamDAOs = jobDAO.getAllJobParams();
+        for (String paramName : jobParamDAOs.keySet()) {
+        	jobParams.put(paramName, jobParamDAOs.get(paramName).getValue());   	
+        }
+        
+		return scheduleJob(jobDAO.getName(), startTimeCal, jobDAO.getIntervalValue(), jobDAO.getIntervalUnit(),
+				jobDAO.getClassName(), jobDAO.getGroupName(), jobParams, username, groups);
+	}
+	
+	public String scheduleJob(String jobName, Calendar startCal, int intervalValue, String intervalUnit,
+			String jobClassName, String jobGroup, HashMap<String, String> jobParams, 
+			String username, String[] groups) throws ServiceException {
+        
         Class<Job> jobClass = null;
         try {        	
         	jobClass = (Class<Job>)Class.forName(jobClassName);     	
@@ -120,26 +147,17 @@
         } 
         
         logMetacat.info("Scheduling job -- name: " + jobName + ", class: " + jobClassName 
-        		+ ", start time: " + startCal.toString() + ", interval: " + interval);  
-        
-		char intervalUnit = interval.trim().charAt(interval.length() - 1);
-		String intervalStrValue = interval.trim().substring(0, interval.length() - 1);
-		int intervalValue;
-		try {
-			intervalValue = Integer.parseInt(intervalStrValue);
-		} catch (NumberFormatException nfe) {
-			throw new ServiceException("SchedulerService.scheduleJob - Could not parse interval value " 
-					+ "into an integer: " + intervalStrValue + " : " + nfe.getMessage());
-		}
+        		+ ", start time: " + startCal.toString() + ", interval value: " + intervalValue 
+        		+ ", interval unit: " + intervalUnit);  
 		
 		startJob(jobName, startCal, intervalValue, intervalUnit, jobClass, jobGroup, jobParams);
 		
 		try {
 			ScheduledJobAccess jobAccess = new ScheduledJobAccess();
-			jobAccess.createJob(jobName, jobName, jobGroup, jobClass, startCal, intervalValue, Character.toString(intervalUnit), jobParams);
+			jobAccess.createJob(jobName, jobName, jobGroup, jobClass, startCal, intervalValue, intervalUnit, jobParams);
 		} catch (AccessException ae) {
 			try {
-				deleteJob(jobName);
+				deleteJob(jobName, username, groups);
 			} catch (Exception e) {
 				// Not much we can do here but log this
 				logMetacat.error("An access exception was thrown when writing job: " + jobName 
@@ -149,17 +167,24 @@
 			throw new ServiceException("SchedulerService.scheduleJob - Error accessing db: ", ae);
 		}
 		
-		return jobName;
+		return "Scheduled: " + jobName;
 	}
 	
-	public void unscheduleJob(String jobName) throws ServiceException {
+
+	
+	public String unScheduleJob(String jobName, String username,
+			String[] groups) throws ServiceException {
 		try {
 			ScheduledJobAccess jobAccess = new ScheduledJobAccess();
 			ScheduledJobDAO jobDAO = jobAccess.getJobByName(jobName);
+			if (jobDAO == null) {
+				throw new ServiceException("SchedulerService.unscheduleJob - Could " 
+						+ "not find job with name: " + jobName);
+			}
 
-			sched.unscheduleJob(jobDAO.getName(), jobDAO.getGroupName());
+			sched.deleteJob(jobDAO.getName(), jobDAO.getGroupName());
 
-			jobDAO.setStatus(StatusUtil.UNSHCEDULED);
+			jobDAO.setStatus(StatusUtil.UNSCHEDULED);
 			jobAccess.updateJobStatus(jobDAO);
 		} catch (SchedulerException se) {
 			throw new ServiceException("SchedulerService.unscheduleJob - Could not create "
@@ -168,11 +193,67 @@
 			throw new ServiceException("SchedulerService.unscheduleJob - Could not create "
 							+ "scheduled job because of db access issue: ", ae);
 		}
+		
+		return "Unscheduled: " + jobName;
 	}
 	
-	public void deleteJob(String jobName) throws ServiceException {
+	public String rescheduleJob(ScheduledJobDAO jobDAO, String username, String[] groups) throws ServiceException {
+		return rescheduleJob(jobDAO, username, groups, true);
+	}
+	
+	public String rescheduleJob(ScheduledJobDAO jobDAO, String username, String[] groups, boolean checkStatus) throws ServiceException {
+		
+		try {
+			ScheduledJobAccess jobAccess = new ScheduledJobAccess();
+        
+			if (jobDAO == null) {
+				throw new ServiceException("SchedulerService.reScheduleJob - Cannot reschedule nonexistant job.");
+			}
+        
+			if (checkStatus && !jobDAO.getStatus().equals(StatusUtil.UNSCHEDULED)) {
+				throw new ServiceException("SchedulerService.reScheduleJob - Cannot reschedule a job with status: " 
+						+ jobDAO.getStatus() + ". Status must be 'unscheduled'.");
+			}
+        
+			Calendar startCal = Calendar.getInstance();
+	        startCal.setTime(jobDAO.getStartTime());
+	        
+	        HashMap<String, String> jobParams = new HashMap<String, String>();
+	        HashMap<String, ScheduledJobParamDAO> jobParamDAOs = jobDAO.getAllJobParams();
+	        for (String paramName : jobParamDAOs.keySet()) {
+	        	jobParams.put(paramName, jobParamDAOs.get(paramName).getValue());   	
+	        }
+	        
+	        Class<Job> jobClass = null;
+	        String jobClassName = jobDAO.getClassName();
+	        try {        	
+	        	jobClass = (Class<Job>)Class.forName(jobClassName);     	
+	        } catch (ClassNotFoundException cnfe) {
+	        	throw new ServiceException("SchedulerService.scheduleJob - Could not find class with name: " 
+	        			+ jobDAO.getClassName() + " : " + cnfe.getMessage());
+	        } 
+	        
+	        logMetacat.info("SchedulerService.rescheduleJob - name: " + jobDAO.getName() + ", class: " + jobClassName 
+	        		+ ", start time: " + startCal.toString() + ", interval value: " + jobDAO.getIntervalValue() 
+	        		+ ", interval unit: " + jobDAO.getIntervalUnit());  
+			
+			startJob(jobDAO.getName(), startCal, jobDAO.getIntervalValue(), jobDAO.getIntervalUnit(), jobClass, jobDAO.getGroupName(), jobParams);
+	        
+			jobDAO.setStatus(StatusUtil.SCHEDULED);
+			jobAccess.updateJobStatus(jobDAO);
+			
+		} catch (AccessException ae) {
+			throw new ServiceException("SchedulerService.reScheduleJob - Could not reschedule "
+					+ "job because of db access issue: ", ae);
+		}
+        		
+		return "Resheduled: " + jobDAO.getName();
+	}
+	
+	public String deleteJob(String jobName, String username,
+			String[] groups) throws ServiceException {
+
 		String groupName = "";
-
 		try {
 			ScheduledJobAccess jobAccess = new ScheduledJobAccess();
 			ScheduledJobDAO jobDAO = jobAccess.getJobByName(jobName);
@@ -179,6 +260,9 @@
 			groupName = jobDAO.getGroupName();
 
 			sched.deleteJob(jobName, groupName);
+			
+			jobDAO.setStatus(StatusUtil.DELETED);
+			jobAccess.updateJobStatus(jobDAO);
 		} catch (SchedulerException se) {
 			throw new ServiceException("SchedulerService.deleteJob - Could not delete job: " + jobName
 							+ " for group: " + groupName + " : " + se.getMessage());
@@ -186,26 +270,8 @@
 			throw new ServiceException("SchedulerService.deleteJob - Could not delete "
 					+ "scheduled job because of db access issue: ", ae);
 		}
-	}
-	
-	public Vector<String> getJobInfo(String groupName) throws ServiceException {
-		Vector<String> returnVector = new Vector<String>();
 		
-		try {
-			if (groupName.equalsIgnoreCase("All")) {
-				String[] groupNames = sched.getJobGroupNames();
-				for (int i = 0; i < groupNames.length; i++) {
-					returnVector.addAll(Arrays.asList(sched.getJobNames(groupNames[i])));
-				}
-			} else {
-				returnVector.addAll(Arrays.asList(sched.getJobNames(groupName)));
-			}
-		} catch (SchedulerException se) {
-			throw new ServiceException("SchedulerService.getJobNames - Could not get job names for group: " 
-					+ groupName + " : " + se.getMessage());
-		}
-
-		return returnVector;
+		return "Deleted: " + jobName;
 	}
 	
 	public String getJobInfoXML(Long jobId) throws ServiceException {
@@ -226,18 +292,24 @@
 		return jobInfoXML;
 	}
 	
-	public String getJobsInfoXML(String groupName) throws ServiceException {
+	public String getJobsInfoXML(String groupName, String paramName, String paramValue) throws ServiceException {
 		String jobInfoXML = "";
 		
 		try {
 			ScheduledJobAccess jobAccess = new ScheduledJobAccess();
-			HashMap<Long, ScheduledJobDAO> JobDAOMap = jobAccess.getAllJobs(groupName);
+			HashMap<Long, ScheduledJobDAO> JobDAOMap = jobAccess.getJobsWithParameter(groupName, paramName, paramValue);
 			
-			jobInfoXML += "<scheduledJobs>";
+			jobInfoXML += "<scheduledWorkflowResultset>";
 			for (Long jobDAOId : JobDAOMap.keySet()) {
-				jobInfoXML +=  jobToXML(JobDAOMap.get(jobDAOId)); 
+				ScheduledJobDAO jobDAO = JobDAOMap.get(jobDAOId); 
+				if (paramValue != null && paramName != null) {
+					ScheduledJobParamDAO jobParamDAO = jobDAO.getJobParam(paramName);
+					if(jobParamDAO != null && jobParamDAO.getValue().equals(paramValue)) {
+						jobInfoXML +=  jobToXML(JobDAOMap.get(jobDAOId)); 
+					}
+				}
 			}				
-			jobInfoXML += "</scheduledJobs>";
+			jobInfoXML += "</scheduledWorkflowResultset>";
 			
 		} catch (AccessException ae) {
 			throw new ServiceException("SchedulerService.getJobInfoXML - Could not get jobs info for group: " 
@@ -247,7 +319,7 @@
 		return jobInfoXML;
 	}
 	
-	private String jobToXML(ScheduledJobDAO scheduledJobDAO) {
+	public String jobToXML(ScheduledJobDAO scheduledJobDAO) throws ServiceException {
 		String jobXML = "";
 
 		if (scheduledJobDAO != null) {
@@ -259,7 +331,7 @@
 			jobXML += "<name>" + scheduledJobDAO.getName() + "</name>";
 			jobXML += "<triggerName>" + scheduledJobDAO.getName() + "</triggerName>";
 			jobXML += "<groupName>" + scheduledJobDAO.getGroupName() + "</groupName>";
-			jobXML += "<className>" + scheduledJobDAO.getName() + "</className>";
+			jobXML += "<className>" + scheduledJobDAO.getClassName() + "</className>";
 			jobXML += "<startTime>" + scheduledJobDAO.getStartTime().toString()
 					+ "</startTime>";
 			jobXML += "<intervalValue>" + scheduledJobDAO.getIntervalValue()
@@ -270,7 +342,7 @@
 			HashMap<String, ScheduledJobParamDAO> jobParams = scheduledJobDAO
 					.getAllJobParams();
 			for (String jobParamKey : jobParams.keySet()) {
-				jobXML += "<jobParam>";
+				jobXML += "<jobParam name='" + jobParams.get(jobParamKey).getKey() + "'>";
 				jobXML += "<id>" + jobParams.get(jobParamKey).getId() + "</id>";
 				jobXML += "<createTime>" + jobParams.get(jobParamKey).getCreateTime()
 						+ "</createTime>";
@@ -290,13 +362,15 @@
 	}
 	
 	
-	private void startJob(String jobName, Calendar startCal, int intervalValue, char intervalUnit,
+	private void startJob(String jobName, Calendar startCal, int intervalValue, String intervalUnit,
 			Class<Job> jobClass, String jobGroup, HashMap<String, String> jobParams) throws ServiceException { 
 		
 		JobDetail jobDetail = new JobDetail(jobName, jobGroup, jobClass);
 		jobDetail.setJobDataMap(new JobDataMap(jobParams));
 		
-		switch (intervalUnit) {
+		char intervalChar = intervalUnit.charAt(0);
+		
+		switch (intervalChar) {
 		case 's':
 		case 'S':
 			scheduleSecondlyJob(jobName, jobClass, startCal, intervalValue, jobGroup, jobDetail);
Index: src/edu/ucsb/nceas/metacat/scheduler/BaseScheduler.java
===================================================================
--- src/edu/ucsb/nceas/metacat/scheduler/BaseScheduler.java	(revision 4966)
+++ src/edu/ucsb/nceas/metacat/scheduler/BaseScheduler.java	(revision 4967)
@@ -33,19 +33,15 @@
 
 public abstract class BaseScheduler {
 	
-	public abstract String scheduleJob(Hashtable<String, String[]> params,
-            HttpServletRequest request, HttpServletResponse response,
-            String username, String[] groups) throws MetacatSchedulerException;
+	public abstract void scheduleJob(HttpServletRequest request, HttpServletResponse response, 
+            Hashtable<String, String[]> params, String username, String[] groups) throws MetacatSchedulerException;
 	
-	public abstract String unScheduleJob(Hashtable<String, String[]> params,
-            HttpServletRequest request, HttpServletResponse response,
-            String username, String[] groups) throws MetacatSchedulerException;
+	public abstract void unScheduleJob(HttpServletRequest request, HttpServletResponse response, 
+			Hashtable<String, String[]> params, String username, String[] groups) throws MetacatSchedulerException;
 	
-	public abstract String deleteJob(Hashtable<String, String[]> params,
-            HttpServletRequest request, HttpServletResponse response,
-            String username, String[] groups) throws MetacatSchedulerException;
+	public abstract void deleteJob(HttpServletRequest request, HttpServletResponse response, 
+			Hashtable<String, String[]> params, String username, String[] groups) throws MetacatSchedulerException;
 	
-	public abstract String getJobs(Hashtable<String, String[]> params,
-            HttpServletRequest request, HttpServletResponse response,
-            String username, String[] groups) throws MetacatSchedulerException;
+	public abstract void getJobs(HttpServletRequest request, HttpServletResponse response, 
+			Hashtable<String, String[]> params, String username, String[] groups) throws MetacatSchedulerException;
 }
Index: src/edu/ucsb/nceas/metacat/scheduler/ScheduledJobAccess.java
===================================================================
--- src/edu/ucsb/nceas/metacat/scheduler/ScheduledJobAccess.java	(revision 4966)
+++ src/edu/ucsb/nceas/metacat/scheduler/ScheduledJobAccess.java	(revision 4967)
@@ -101,7 +101,7 @@
 
 		PreparedStatement pstmt = null;
 		try {
-			String sql = "SELECT * FROM scheduled_job WHERE name = ? status != 'deleted'"; 
+			String sql = "SELECT * FROM scheduled_job WHERE name = ? AND status != 'deleted'"; 
 			pstmt = conn.prepareStatement(sql);
 
 			pstmt.setString(1, jobName);
@@ -141,6 +141,24 @@
 		return jobDAO;		
 	}
 	
+	public HashMap<Long, ScheduledJobDAO> getJobsWithParameter(String groupName, String paramName, String paramValue) throws AccessException {
+
+		HashMap<Long, ScheduledJobDAO> allJobsMap = getAllJobs(groupName);
+		HashMap<Long, ScheduledJobDAO> jobsWithParamMap = new HashMap<Long, ScheduledJobDAO>();
+		
+		for (Long jobDAOId : allJobsMap.keySet()) {
+			ScheduledJobDAO jobDAO = allJobsMap.get(jobDAOId); 
+			if (paramValue != null && paramName != null) {
+				ScheduledJobParamDAO jobParamDAO = jobDAO.getJobParam(paramName);
+				if(jobParamDAO != null && jobParamDAO.getValue().equals(paramValue)) {
+					jobsWithParamMap.put(jobDAOId, jobDAO);
+				}
+			}
+		}		
+		
+		return jobsWithParamMap;
+	}
+	
 	public HashMap<Long, ScheduledJobDAO> getAllJobs(String groupName) throws AccessException {
 		ScheduledJobDAO jobDAO = null;
 		
@@ -275,7 +293,8 @@
 				scheduledJobParamsAccess.createJobParams(updatedJobDAO.getId(), jobParams);
 			} catch (AccessException ae) {
 				if (updatedJobDAO != null) {
-					deleteJob(updatedJobDAO);
+					updatedJobDAO.setStatus(StatusUtil.DELETED);
+					updateJobStatus(updatedJobDAO);
 					scheduledJobParamsAccess.deleteJobParams(updatedJobDAO.getId());
 				} else {
 					logMetacat.warn("ScheduledJobAccess.createJob - Tried to delete non-existant scheduled job: " 
@@ -285,44 +304,6 @@
 		}
 	}
 	
-	public void deleteJob(ScheduledJobDAO jobDAO) throws AccessException {	
-		ScheduledJobParamAccess scheduledJobParamsAccess = new ScheduledJobParamAccess();
-		
-		if (jobDAO == null) {
-			throw new AccessException("ScheduledJobAccess.deleteJob - job DAO cannot be null.");
-		}
-		scheduledJobParamsAccess.deleteJobParams(jobDAO.getId());
-		
-		PreparedStatement pstmt = null;
-		
-		try {
-			String sql = "UPDATE scheduled_job SET status = ? WHERE id = ?";	
-			pstmt.setString(1, StatusUtil.DELETED);
-			pstmt.setLong(2, jobDAO.getId());
-			
-			logMetacat.info("ScheduledJobAccess.deleteJob - " + sql);
-			
-			logMetacat.info("SQL params:  [" + StatusUtil.DELETED + ","
-					+ jobDAO.getId() + "]");
-
-			pstmt.execute();
-		} catch (SQLException sqle) {
-			throw new AccessException("ScheduledJobAccess.deleteJob - SQL error when " 
-					+ "deleting scheduled job " + jobDAO.getName()  + " : "  + sqle.getMessage());
-		} finally {
-			try {
-				if (pstmt != null) {
-					pstmt.close();
-				}
-			} catch (SQLException sqle) {
-				logMetacat.error("ScheduledJobAccess.deleteJob - An error occurred " 
-						+ "closing prepared statement: " + sqle.getMessage());
-			} finally {
-				DBConnectionPool.returnDBConnection(conn, serialNumber);
-			}
-		}				
-	}
-	
 	public void updateJobStatus(ScheduledJobDAO jobDAO) throws AccessException {	
 		
 		if (jobDAO == null) {
@@ -333,6 +314,8 @@
 		
 		try {
 			String sql = "UPDATE scheduled_job SET status = ? WHERE id = ?";	
+			
+			pstmt = conn.prepareStatement(sql);
 			pstmt.setString(1, jobDAO.getStatus());
 			pstmt.setLong(2, jobDAO.getId());
 			
Index: src/edu/ucsb/nceas/metacat/scheduler/ScheduledJobParamAccess.java
===================================================================
--- src/edu/ucsb/nceas/metacat/scheduler/ScheduledJobParamAccess.java	(revision 4966)
+++ src/edu/ucsb/nceas/metacat/scheduler/ScheduledJobParamAccess.java	(revision 4967)
@@ -132,7 +132,7 @@
 		PreparedStatement pstmt = null;
 		ScheduledJobParamDAO jobParamDAO = null;
 		try {
-			String sql = "SELECT * FROM scheduled_job_params WHERE job_id = ? status != 'deleted'"; 
+			String sql = "SELECT * FROM scheduled_job_params WHERE job_id = ? AND status != 'deleted'"; 
 			pstmt = conn.prepareStatement(sql);
 
 			pstmt.setLong(1, jobId);
@@ -152,7 +152,7 @@
 			return jobParamList;
 			
 		} catch (SQLException sqle) {
-			throw new AccessException("ScheduledJobAccess.getJobByName - SQL error when getting " 
+			throw new AccessException("ScheduledJobAccess.getJobParamsForJobId - SQL error when getting " 
 					+ "scheduled job parameter for job id: " + jobId  + " : "  + sqle.getMessage());
 		} finally {
 			try {
@@ -160,7 +160,7 @@
 					pstmt.close();
 				}
 			} catch (SQLException sqle) {
-				logMetacat.error("ScheduledJobAccess.getJobByName - An error occurred " 
+				logMetacat.error("ScheduledJobParamAccess.getJobParamsForJobId - An error occurred " 
 						+ "closing prepared statement: " + sqle.getMessage());
 			} finally {
 				DBConnectionPool.returnDBConnection(conn, serialNumber);
@@ -193,7 +193,7 @@
 			return jobParamList;
 			
 		} catch (SQLException sqle) {
-			throw new AccessException("ScheduledJobAccess.getJobByName - SQL error when getting " 
+			throw new AccessException("ScheduledJobParamAccess.getAllJobParams - SQL error when getting " 
 					+ "scheduled job parameters : "  + sqle.getMessage());
 		} finally {
 			try {
@@ -201,7 +201,7 @@
 					pstmt.close();
 				}
 			} catch (SQLException sqle) {
-				logMetacat.error("ScheduledJobAccess.getJobByName - An error occurred " 
+				logMetacat.error("ScheduledJobParamsAccess.getAllJobParams - An error occurred " 
 						+ "closing prepared statement: " + sqle.getMessage());
 			} finally {
 				DBConnectionPool.returnDBConnection(conn, serialNumber);
