diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java
index 9da7146a77e8571f779809b53f47f643763d043e..afd81ddf317b067eb3561ada0eaa6a463d5ece97 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java
@@ -1,5 +1,6 @@
 package ch.systemsx.cisd.etlserver;
 
+import java.util.Date;
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -31,13 +32,21 @@ public class MaintenancePlugin
     {
         final String timerThreadName = parameters.getPluginName() + " - Maintenance Plugin";
         final Timer workerTimer = new Timer(timerThreadName);
-        workerTimer.schedule(new TimerTask()
+        TimerTask timerTask = new TimerTask()
             {
                 @Override
                 public void run()
                 {
                     task.execute();
                 }
-            }, parameters.getStartDate(), parameters.getIntervalSeconds() * 1000);
+            };
+        Date startDate = parameters.getStartDate();
+        if (parameters.isExecuteOnlyOnce())
+        {
+            workerTimer.schedule(timerTask, startDate);
+        } else
+        {
+            workerTimer.schedule(timerTask, startDate, parameters.getIntervalSeconds() * 1000);
+        }
     }
 }
\ No newline at end of file
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenanceTaskParameters.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenanceTaskParameters.java
index f3061cbe9c3142f5cdb5c0b82447fd4320121ee4..939605d887c68f0aca562c4b2d86e10af98524b8 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenanceTaskParameters.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenanceTaskParameters.java
@@ -44,6 +44,10 @@ public class MaintenanceTaskParameters
 
     private static final String START_KEY = "start";
 
+    // If true the task will be executed exactly one, interval will be ignored. By default set to
+    // false.
+    private static final String ONE_TIME_EXECUTION_KEY = "execute-only-once";
+
     private final String pluginName;
 
     private final long interval;
@@ -54,6 +58,8 @@ public class MaintenanceTaskParameters
 
     private final Date startDate;
 
+    private final boolean executeOnlyOnce;
+
     public MaintenanceTaskParameters(Properties properties, String pluginName)
     {
         this.properties = properties;
@@ -61,6 +67,7 @@ public class MaintenanceTaskParameters
         interval = PropertyUtils.getLong(properties, INTERVAL_KEY, ONE_DAY_IN_SEC);
         className = PropertyUtils.getMandatoryProperty(properties, CLASS_KEY);
         startDate = extractStartDate(PropertyUtils.getProperty(properties, START_KEY));
+        executeOnlyOnce = PropertyUtils.getBoolean(properties, ONE_TIME_EXECUTION_KEY, false);
     }
 
     private static Date extractStartDate(String timeOrNull)
@@ -92,6 +99,11 @@ public class MaintenanceTaskParameters
         }
     }
 
+    public boolean isExecuteOnlyOnce()
+    {
+        return executeOnlyOnce;
+    }
+
     public long getIntervalSeconds()
     {
         return interval;