diff --git a/README b/README
index 5a5a2a828004a1e31f80de7ea948cfee67fa0e06..e361ba74773da467b8834bac812d94a200a5f615 100644
--- a/README
+++ b/README
@@ -28,6 +28,7 @@ The following options are available:
 -f <file>  Use <file> for the main configuration instead of
            /etc/backupninja.conf
  
+
 CONFIGURATION FILES
 ===================
 
@@ -77,6 +78,42 @@ For example:
    pear = no thanks \
    i will not have a pear.
 
+
+SCHEDULING
+==========
+
+By default, each configuration file is processed everyday at 01:00 (1
+AM). This can be changed by specifying the 'when' option in a config
+file.
+
+For example:
+
+  when = sundays at 02:00
+  when = 30th at 22
+  when = 30 at 22:00
+  when = everyday at 01            <-- the default
+  when = Tuesday at 05:00
+
+A configuration file will be processed at the time(s) specified by the
+"when" option. If multiple "when" options are present, then they all
+apply. If two configurations files are scheduled to run in the same
+hour, then we fall back on the alphabetical ordering specified above.
+If two configurations files are scheduled close to one another in
+time, it is possible to have multiple copies of backupninja running if
+the first instance is not finished before the next one starts.
+
+These values for 'when' are equivalent:
+
+  when = tuesday at 05:30
+  when = TUESDAYS at 05
+
+These values for 'when' are invalid:
+  
+  when = tuesday at 2am
+  when = tuesday at 2
+  when = tues at 02
+
+
 REAL WORLD USAGE
 ================
 
@@ -101,6 +138,7 @@ the backup server must have root on the production server, and (3)
 rdiff-backup is more space efficient and featureful than using rsync +
 hard links. 
 
+
 SSH KEYS
 ========
 
@@ -117,6 +155,7 @@ user 'backup' on desthost without specifying a password.
 Note: when prompted for a password by ssh-keygen, just leave it
 blank by hitting return.
 
+
 INSTALLATION
 ============
    
diff --git a/backupninja b/backupninja
index 921cb96754d3e76673b51ab080d2281bd359b9c4..c8764ab651d3ea3402d1a4192ee47d5070ab28fc 100755
--- a/backupninja
+++ b/backupninja
@@ -133,6 +133,77 @@ function getconf() {
 	eval $1='$ret'
 }
 
+#
+# enforces very strict permissions on configuration file $file.
+#
+
+function check_perms() {
+	local file=$1
+	local perms=`ls -ld $file`
+	perms=${perms:4:6}
+	if [ "$perms" != "------" ]; then
+		fatal "Configuration files must not be group or world readable! Dying on file $file"
+	fi
+	if [ `ls -ld $file | awk '{print $3}'` != "root" ]; then
+		fatal "Configuration files must be owned by root! Dying on file $file"
+	fi
+}
+
+# simple lowercase function
+function tolower() {
+	echo "$1" | tr [:upper:] [:lower:]
+}
+
+# simple to integer function
+function toint() {
+	echo "$1" | tr [:alpha:] -d 
+}
+
+#
+# function isnow(): returns 1 if the time/day passed as $1 matches
+# the current time/day.
+#
+# format is <day> at <time>:
+#   sunday at 16
+#   8th at 01
+#   everyday at 22
+#
+
+# we grab the current time once, since processing
+# all the configs might take more than an hour.
+nowtime=`date +%H`
+nowday=`date +%d`
+nowdayofweek=`date +%A`
+nowdayofweek=`tolower "$nowdayofweek"`
+
+function isnow() {
+	local when="$1"
+	set -- $when
+	whendayofweek=$1; at=$2; whentime=$3;
+	whenday=`toint "$whendayofweek"`
+	whendayofweek=`tolower "$whendayofweek"`
+	whentime=`echo "$whentime" | sed 's/:[0-9][0-9]$//'`
+
+	if [ "$whendayofweek" == "everyday" ]; then
+		whendayofweek=$nowdayofweek
+	fi
+
+	if [ "$whenday" == "" ]; then
+		if [ "$whendayofweek" != "$nowdayofweek" ]; then
+			whendayofweek=${whendayofweek%s}
+			if [ "$whendayofweek" != "$nowdayofweek" ]; then
+				return 0
+			fi
+		fi
+	elif [ "$whenday" != "$nowday" ]; then
+		return 0
+	fi
+
+	[ "$at" == "at" ] || return 0
+	[ "$whentime" == "$nowtime" ] || return 0
+
+	return 1
+}
 
 #####################################################
 ## MAIN
@@ -195,6 +266,8 @@ getconf reportemail
 getconf reportsuccess yes
 getconf reportwarning yes
 getconf loglevel 3
+getconf when "Everyday at 01:00"
+defaultwhen=$when
 getconf logfile /var/log/backupninja.log
 getconf SLAPCAT /usr/sbin/slapcat
 getconf RDIFFBACKUP /usr/bin/rdiff-backup
@@ -213,17 +286,12 @@ debug 1 "====== starting at "`date`" ======"
 # by default, don't make files which are world or group readable.
 umask 077
 
+errors=0
+
 for file in $configdirectory/*; do
 	[ -f $file ] || continue;
 
-	perms=`ls -ld $file`
-	perms=${perms:4:6}
-	if [ "$perms" != "------" ]; then
-		fatal "Configuration files must not be group or world readable! Dying on file $file"
-	fi
-	if [ `ls -ld $file | awk '{print $3}'` != "root" ]; then
-		fatal "Configuration files must be owned by root! Dying on file $file"
-	fi
+	check_perms $file
 	suffix="${file##*.}"
 	base=`basename $file`
 	if [ "${base:0:1}" == "0" ]; then
@@ -235,7 +303,28 @@ for file in $configdirectory/*; do
 
 	if [ -e "$scriptdir/$suffix" ]; then
 		setfile $file
+
+		# skip over this config if "when" option
+		# is not set to the current time.
+		getconf when "$defaultwhen"
+		IFS=$'\t\n'
+		for w in $when; do
+			IFS=$' \t\n'
+			isnow "$w"
+			ret=$?
+			IFS=$'\t\n'
+			if [ $ret == 0 ]; then
+				debug 0 "skipping $file because it is not $w"
+				continue
+			else
+				debug 0 "running $file because it is $w"
+				continue
+			fi		
+		done
+		IFS=$' \t\n'
+
 		echo_debug_msg=1
+		# call the handler:
 		ret=`( . $scriptdir/$suffix $file )`
 		retcode="$?"
 		warnings=`echo $ret | grep -e "^Warning: " | wc -l`
diff --git a/changelog b/changelog
index a2a8a880189482b6582fccfc85d895f36a73be5b..0111e7c8396b3ed0a461c9f1369aebbdc72851ce 100644
--- a/changelog
+++ b/changelog
@@ -1,5 +1,8 @@
-version 0.3.5 -- Dec 16 2004
-    added reportsuccess and reportwarning config options
+version 0.4 -- Dec 26 2004
+	added "when" option, so that all configs can specify when
+      they are to be run.
+	added reportsuccess and reportwarning config options
+	added .sys handler (hardware, packages, partitions).
 
 version 0.3.4 -- Dec 8 2004
 	fixed numerical variable quoting compatibility with older wc	
diff --git a/etc/cron.d/backupninja b/etc/cron.d/backupninja
index e7dde82d75334e772fa7a538842e9a4338186b3d..0e9fd589b0e23cbed7acc85ca4010bcb055c6444 100644
--- a/etc/cron.d/backupninja
+++ b/etc/cron.d/backupninja
@@ -1,2 +1,2 @@
-# cron job for backupninja (once a day)
-00 01 * * * root if [ -x /usr/sbin/backupninja -a -f /etc/backupninja.conf ]; then /usr/sbin/backupninja; fi
+# cron job for backupninja (every hour, on the hour)
+00 * * * * root if [ -x /usr/sbin/backupninja -a -f /etc/backupninja.conf ]; then /usr/sbin/backupninja; fi