Index: src/Fragmentation/Automation/FragmentScheduler.cpp
===================================================================
--- src/Fragmentation/Automation/FragmentScheduler.cpp	(revision 306f6062be599f351119d201e27f00dfb9a90c1e)
+++ src/Fragmentation/Automation/FragmentScheduler.cpp	(revision ff60cfa6d1a9d5d02c5383a60a027b1843d6e0b6)
@@ -34,4 +34,5 @@
 #include "CodePatterns/Info.hpp"
 #include "CodePatterns/Log.hpp"
+#include "Jobs/MPQCCommandJob.hpp"
 #include "Jobs/SystemCommandJob.hpp"
 #include "JobId.hpp"
@@ -39,5 +40,13 @@
 #include "FragmentScheduler.hpp"
 
-FragmentJob::ptr FragmentScheduler::NoJob(new SystemCommandJob(std::string("/bin/false"), std::string("NoJob"), JobId::NoJob));
+FragmentJob::ptr FragmentScheduler::NoJob(new SystemCommandJob(std::string("/bin/true"), std::string("dosomething"), JobId::NoJob));
+
+/** Helper function to enforce binding of FragmentWorker to possible derived
+ * FragmentJob classes.
+ */
+void dummyInit() {
+  SystemCommandJob("/bin/false", "something", JobId::IllegalJob);
+  MPQCCommandJob("nofile", JobId::IllegalJob);
+}
 
 /** Constructor of class FragmentScheduler.
Index: src/Fragmentation/Automation/GlobalJobId.cpp
===================================================================
--- src/Fragmentation/Automation/GlobalJobId.cpp	(revision ff60cfa6d1a9d5d02c5383a60a027b1843d6e0b6)
+++ src/Fragmentation/Automation/GlobalJobId.cpp	(revision ff60cfa6d1a9d5d02c5383a60a027b1843d6e0b6)
@@ -0,0 +1,35 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2012 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * GlobalJobId.cpp
+ *
+ *  Created on: Feb 14, 2012
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "GlobalJobId.hpp"
+
+GlobalJobId::GlobalJobId() :
+    JobId(0)
+{}
+
+GlobalJobId::~GlobalJobId()
+{}
+
+JobId_t GlobalJobId::getNextId()
+{
+  setId(getId()+1);
+  return getId();
+}
Index: src/Fragmentation/Automation/GlobalJobId.hpp
===================================================================
--- src/Fragmentation/Automation/GlobalJobId.hpp	(revision ff60cfa6d1a9d5d02c5383a60a027b1843d6e0b6)
+++ src/Fragmentation/Automation/GlobalJobId.hpp	(revision ff60cfa6d1a9d5d02c5383a60a027b1843d6e0b6)
@@ -0,0 +1,27 @@
+/*
+ * GlobalJobId.hpp
+ *
+ *  Created on: Feb 14, 2012
+ *      Author: heber
+ */
+
+#ifndef GLOBALJOBID_HPP_
+#define GLOBALJOBID_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "JobId.hpp"
+
+class GlobalJobId : private JobId
+{
+public:
+  GlobalJobId();
+  ~GlobalJobId();
+
+  JobId_t getNextId();
+};
+
+#endif /* GLOBALJOBID_HPP_ */
Index: src/Fragmentation/Automation/Makefile.am
===================================================================
--- src/Fragmentation/Automation/Makefile.am	(revision 306f6062be599f351119d201e27f00dfb9a90c1e)
+++ src/Fragmentation/Automation/Makefile.am	(revision ff60cfa6d1a9d5d02c5383a60a027b1843d6e0b6)
@@ -50,5 +50,6 @@
   Controller/Commands/ReceiveJobsOperation.cpp \
   Controller/Commands/SendResultsOperation.cpp \
-  Controller/Commands/ShutdownOperation.cpp
+  Controller/Commands/ShutdownOperation.cpp \
+  GlobalJobId.cpp
 
 FRAGMENTATIONAUTOMATIONHEADER = \
@@ -62,5 +63,6 @@
   Controller/Commands/ReceiveJobsOperation.hpp \
   Controller/Commands/SendResultsOperation.hpp \
-  Controller/Commands/ShutdownOperation.hpp
+  Controller/Commands/ShutdownOperation.hpp \
+  GlobalJobId.hpp
 
 noinst_LTLIBRARIES += libMolecuilderFragmentationAutomation.la
Index: src/Fragmentation/Automation/controller.cpp
===================================================================
--- src/Fragmentation/Automation/controller.cpp	(revision 306f6062be599f351119d201e27f00dfb9a90c1e)
+++ src/Fragmentation/Automation/controller.cpp	(revision ff60cfa6d1a9d5d02c5383a60a027b1843d6e0b6)
@@ -27,7 +27,10 @@
 #include "CodePatterns/MemDebug.hpp"
 
+#include <fstream>
 #include <iostream>
+#include <map>
+#include <sstream>
+#include <streambuf>
 #include <vector>
-#include <map>
 
 #include "atexit.hpp"
@@ -39,4 +42,6 @@
 #include "Controller/Commands/SendResultsOperation.hpp"
 #include "Controller/Commands/ShutdownOperation.hpp"
+#include "GlobalJobId.hpp"
+#include "Jobs/MPQCCommandJob.hpp"
 #include "Jobs/SystemCommandJob.hpp"
 #include "Results/FragmentResult.hpp"
@@ -44,16 +49,33 @@
 enum CommandIndices {
   UnknownCommandIndex = 0,
-  SendJobsIndex = 1,
-  CheckResultsIndex = 2,
-  ReceiveResultsIndex = 3,
-  ShutdownIndex = 4
+  AddJobsIndex = 1,
+  CreateJobsIndex = 2,
+  CheckResultsIndex = 3,
+  ReceiveResultsIndex = 4,
+  ShutdownIndex = 5
 };
 
+// TODO: replace this instance by a IdPool owned by controller.
+GlobalJobId globalId;
+
 void createjobs(std::vector<FragmentJob::ptr> &jobs)
 {
-  FragmentJob::ptr testJob( new SystemCommandJob( std::string("cat"), std::string("Nothing"), 1) );
-  FragmentJob::ptr othertestJob( new SystemCommandJob( std::string("cat"), std::string("Nothing"), 2) );
+  FragmentJob::ptr testJob( new SystemCommandJob( std::string("cat"), std::string("Nothing"), globalId.getNextId()) );
+  FragmentJob::ptr othertestJob( new SystemCommandJob( std::string("cat"), std::string("Nothing"), globalId.getNextId()) );
   jobs.push_back(testJob);
   jobs.push_back(othertestJob);
+}
+
+void parsejob(std::vector<FragmentJob::ptr> &jobs, const std::string &filename)
+{
+  std::ifstream file;
+  file.open(filename.c_str());
+  ASSERT( file.good(), "parsejob() - file "+filename+" does not exist.");
+  std::string output((std::istreambuf_iterator<char>(file)),
+      std::istreambuf_iterator<char>());
+  FragmentJob::ptr testJob( new MPQCCommandJob(output, globalId.getNextId()) );
+  jobs.push_back(testJob);
+  file.close();
+  LOG(1, "INFO: Added MPQCCommandJob from file "+filename+".");
 }
 
@@ -136,6 +158,8 @@
 
   size_t Exitflag = 0;
-  std::map<std::string, CommandIndices> CommandsMap;
-  CommandsMap.insert( std::make_pair("sendjobs", SendJobsIndex) );
+  typedef std::map<std::string, CommandIndices> CommandsMap_t;
+  CommandsMap_t CommandsMap;
+  CommandsMap.insert( std::make_pair("addjobs", AddJobsIndex) );
+  CommandsMap.insert( std::make_pair("createjobs", CreateJobsIndex) );
   CommandsMap.insert( std::make_pair("checkresults", CheckResultsIndex) );
   CommandsMap.insert( std::make_pair("receiveresults", ReceiveResultsIndex) );
@@ -144,7 +168,12 @@
   {
     // Check command line arguments.
-    if (argc != 4)
+    if (argc < 4)
     {
-      std::cerr << "Usage: " << argv[0] << " <host> <port> <command>" << std::endl;
+      std::cerr << "Usage: " << argv[0] << " <host> <port> <command> [options to command]" << std::endl;
+      std::cerr << "List of available commands:" << std::endl;
+      for(CommandsMap_t::const_iterator iter = CommandsMap.begin();
+          iter != CommandsMap.end(); ++iter) {
+        std::cerr << "\t" << iter->first << std::endl;
+      }
       return 1;
     }
@@ -154,5 +183,20 @@
 
     switch(getCommandIndex(CommandsMap, argv[3])) {
-      case SendJobsIndex:
+      case AddJobsIndex:
+      {
+        std::vector<FragmentJob::ptr> jobs;
+        if (argc == 4) {
+          ELOG(1, "Please add a filename for the MPQCCommandJob.");
+        } else {
+          for (int argcount = 4; argcount < argc; ++argcount) {
+            LOG(1, "INFO: Parsing job for file " << argv[argcount] << ".");
+            parsejob(jobs, argv[argcount]);
+          }
+          addjobs(controller, jobs);
+          sendjobs(controller, argv[1], argv[2]);
+        }
+        break;
+      }
+      case CreateJobsIndex:
       {
         std::vector<FragmentJob::ptr> jobs;
@@ -189,5 +233,6 @@
 
     switch(getCommandIndex(CommandsMap, argv[3])) {
-      case SendJobsIndex:
+      case AddJobsIndex:
+      case CreateJobsIndex:
         break;
       case CheckResultsIndex:
