diff --git a/ChangeLog b/ChangeLog
index 26541b35a11a585e429d1117377d67c31b43ff8b..ecf973b85d9aa653c0acd174184c01c1840ee480 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2006-12-19  Per Cederqvist  <ceder@sedesopim.lysator.liu.se>
 
+	Added a top-level script that runs backups repeatedly.
+	* backup-repeatedly: New file.
+
 	Get rid of obsolete status files and backups.
 	* lysrdiff-move-obsolete: New script.  Move backups that are no
 	longer mentioned in the task file to a separate place.
diff --git a/Makefile b/Makefile
index 7a48eb95b4ecb21227e4e6e4e3e8257788acff91..067d0fc22406eb4fee119ddc469e869fbeb4e59f 100644
--- a/Makefile
+++ b/Makefile
@@ -4,6 +4,7 @@ all:;
 
 install: install-one-task
 	cp backup-all $(BINDIR)/
+	cp backup-repeatedly $(BINDIR)/
 	cp distribute-tasks $(BINDIR)/
 	cp fetch-backup-work $(BINDIR)/
 	cp lysrdiff-status $(BINDIR)/
diff --git a/backup-repeatedly b/backup-repeatedly
new file mode 100755
index 0000000000000000000000000000000000000000..ea691f7b6cd222cbc4d34b975828c1d96e658ca9
--- /dev/null
+++ b/backup-repeatedly
@@ -0,0 +1,31 @@
+#!/bin/sh
+while [ ! -f /nobackup/backup.lysator/etc/stop ]
+do
+  echo
+  echo Running all jobs.
+  echo
+  /nobackup/backup.lysator/bin/backup-all 0 1
+
+  [ -f /nobackup/backup.lysator/etc/finish ] && break
+
+  echo
+  echo Retrying failed jobs.
+  echo
+  /nobackup/backup.lysator/bin/backup-all --failed 0 1
+
+  [ -f /nobackup/backup.lysator/etc/finish ] && break
+
+  echo
+  echo Retrying jobs with warnings.
+  echo
+  /nobackup/backup.lysator/bin/backup-all --retry 0 1
+
+  [ -f /nobackup/backup.lysator/etc/finish ] && break
+
+  echo
+  echo Sleeping one hour.
+  echo
+  sleep 3600
+
+  [ -f /nobackup/backup.lysator/etc/finish ] && break
+done