diff --git a/bin/dm-upload-data b/bin/dm-start-upload
similarity index 79%
rename from bin/dm-upload-data
rename to bin/dm-start-upload
index 5c48db6f3ca8480d5721d2d326cee021b130dac3..982fde120c9886b5e20341743480f711fb3ca0a3 100755
--- a/bin/dm-upload-data
+++ b/bin/dm-start-upload
@@ -12,6 +12,6 @@ if [ -z $DM_ROOT_DIR ]; then
     source $setupFile > /dev/null
 fi
 
-$DM_ROOT_DIR/src/python/dm/daq_web_service/cli/uploadDataCli.py $@
+$DM_ROOT_DIR/src/python/dm/daq_web_service/cli/startUploadCli.py $@
 
 
diff --git a/src/python/dm/daq_web_service/api/experimentRestApi.py b/src/python/dm/daq_web_service/api/experimentRestApi.py
index 036f940379e6a5f965beb2d8fa880e7bdb034f8f..07222dfdf8b260398fb9c8cdd48a1e24170e137e 100755
--- a/src/python/dm/daq_web_service/api/experimentRestApi.py
+++ b/src/python/dm/daq_web_service/api/experimentRestApi.py
@@ -34,6 +34,18 @@ class ExperimentRestApi(DaqRestApi):
         responseDict = self.sendSessionRequest(url=url, method='POST')
         return Experiment(responseDict)
 
+    @DaqRestApi.execute
+    def startUpload(self, name, dataDirectory):
+        url = '%s/experiments/startUpload' % (self.getContextRoot())
+        if name is None or not len(name):
+            raise InvalidRequest('Experiment name must be provided.')
+        url += '?name=%s' % Encoder.encode(name)
+        if dataDirectory is None or not len(dataDirectory):
+            raise InvalidRequest('Experiment data directory must be provided.')
+        url += '&dataDirectory=%s' % Encoder.encode(dataDirectory)
+        responseDict = self.sendSessionRequest(url=url, method='POST')
+        return Experiment(responseDict)
+
 #######################################################################
 # Testing.
 
diff --git a/src/python/dm/daq_web_service/cli/uploadDataCli.py b/src/python/dm/daq_web_service/cli/startUploadCli.py
similarity index 83%
rename from src/python/dm/daq_web_service/cli/uploadDataCli.py
rename to src/python/dm/daq_web_service/cli/startUploadCli.py
index 79371f689dfc3980933ae8b49f1bca9a8c0fbdbe..ad11e36d2f54c951fb3166ab4e56210cf1a16974 100755
--- a/src/python/dm/daq_web_service/cli/uploadDataCli.py
+++ b/src/python/dm/daq_web_service/cli/startUploadCli.py
@@ -4,9 +4,9 @@ from daqWebServiceSessionCli import DaqWebServiceSessionCli
 from dm.daq_web_service.api.experimentRestApi import ExperimentRestApi
 from dm.common.exceptions.invalidRequest import InvalidRequest
 
-class UploadDataCli(DaqWebServiceSessionCli):
+class StartUploadCli(DaqWebServiceSessionCli):
     def __init__(self):
-        DaqWebServiceCli.__init__(self)
+        DaqWebServiceSessionCli.__init__(self)
         self.addOption('', '--experiment', dest='experimentName', help='Experiment name.')
         self.addOption('', '--data-directory', dest='dataDirectory', help='Experiment data directory.')
 
@@ -24,19 +24,19 @@ class UploadDataCli(DaqWebServiceSessionCli):
 
     def runCommand(self):
         self.parseArgs(usage="""
-    dm-upload-data --name=EXPERIMENTNAME --data-directory=DATADIRECTORY
+    dm-start-upload --name=EXPERIMENTNAME --data-directory=DATADIRECTORY
 
 Description:
     Schedules data upload for a given experiment. 
         """)
         self.checkArgs()
         api = ExperimentRestApi(self.getLoginUsername(), self.getLoginPassword(), self.getServiceHost(), self.getServicePort(), self.getServiceProtocol())
-        experiment = api.uploadData(self.getExperimentName(), self.getDataDirectory())
+        experiment = api.startUpload(self.getExperimentName(), self.getDataDirectory())
         print experiment.getDisplayString(self.getDisplayKeys(), self.getDisplayFormat())
 
 #######################################################################
 # Run command.
 if __name__ == '__main__':
-    cli = UploadDataCli()
+    cli = StartUploadCli()
     cli.run()
 
diff --git a/src/python/dm/daq_web_service/service/experimentRouteDescriptor.py b/src/python/dm/daq_web_service/service/experimentRouteDescriptor.py
index 615e072c7dfd98758a141c6acdfbddac272728ab..982d0f50fb50929804ad5f3dbf95ea2eee2cce00 100755
--- a/src/python/dm/daq_web_service/service/experimentRouteDescriptor.py
+++ b/src/python/dm/daq_web_service/service/experimentRouteDescriptor.py
@@ -37,6 +37,15 @@ class ExperimentRouteDescriptor:
                 'method' : ['POST']
             },
 
+            # Start experiment data upload
+            {
+                'name' : 'startUpload',
+                'path' : '%s/experiments/startUpload' % contextRoot,
+                'controller' : experimentSessionController,
+                'action' : 'startUpload',
+                'method' : ['POST']
+            },
+
         ]
        
         return routes
diff --git a/src/python/dm/daq_web_service/service/experimentSessionController.py b/src/python/dm/daq_web_service/service/experimentSessionController.py
index bf36488e3658d36d6256ee294e546f3b4497d63c..532e663c559eeb5ad63efc6a51f55164f5588613 100755
--- a/src/python/dm/daq_web_service/service/experimentSessionController.py
+++ b/src/python/dm/daq_web_service/service/experimentSessionController.py
@@ -43,3 +43,19 @@ class ExperimentSessionController(DmSessionController):
         self.logger.debug('Returning: %s' % response)
         return response
 
+    @cherrypy.expose
+    @DmSessionController.require(DmSessionController.isLoggedIn())
+    @DmSessionController.execute
+    def startUpload(self, **kwargs):
+        name = kwargs.get('name')
+        if name is None or not len(name):
+            raise InvalidRequest('Missing experiment name.')
+        name = Encoder.decode(name)
+        dataDirectory = kwargs.get('dataDirectory')
+        if dataDirectory is None or not len(dataDirectory):
+            raise InvalidRequest('Missing experiment data directory.')
+        dataDirectory = Encoder.decode(dataDirectory)
+        response = self.experimentSessionControllerImpl.startUpload(name, dataDirectory).getFullJsonRep()
+        self.logger.debug('Returning: %s' % response)
+        return response
+
diff --git a/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py b/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py
index e5d73a5af4092efd81023976cc379c371e1a713c..83242c0a56796feb0a4c80eb82dbf60226bac76b 100755
--- a/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py
+++ b/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py
@@ -9,9 +9,12 @@ import time
 from dm.common.objects.experiment import Experiment
 from dm.common.objects.dmObjectManager import DmObjectManager
 from dm.common.exceptions.invalidRequest import InvalidRequest
+from dm.common.utility.osUtility import OsUtility
+from dm.common.objects.observedFile import ObservedFile
 from dm.ds_web_service.api.dsRestApiFactory import DsRestApiFactory
 from experimentTracker import ExperimentTracker
 from fileSystemObserver import FileSystemObserver
+from fileProcessingManager import FileProcessingManager
 
 class ExperimentSessionControllerImpl(DmObjectManager):
     """ Experiment session controller implementation class. """
@@ -40,3 +43,17 @@ class ExperimentSessionControllerImpl(DmObjectManager):
         experiment['daqEndTime'] = time.time()
         FileSystemObserver.getInstance().stopObservingPath(dataDirectory, experiment)
         return experiment
+
+    def startUpload(self, name, dataDirectory):
+        experiment = self.dsExperimentApi.getExperimentByName(name)
+        storageDirectory = experiment.get('storageDirectory')
+        if storageDirectory is None:
+            raise InvalidRequest('Experiment %s has not been started.' % name)
+        filePaths = OsUtility.findFiles(dataDirectory)
+        fileProcessingManager = FileProcessingManager.getInstance()
+        for filePath in filePaths:
+            observedFile = ObservedFile(filePath=filePath, daqPath=dataDirectory, experiment=experiment)
+            fileProcessingManager.processObservedFile(observedFile)
+        ExperimentTracker.getInstance().put(name, experiment)
+        return experiment
+