diff --git a/daemons/ganeti-cleaner.in b/daemons/ganeti-cleaner.in
index 7902c52a91e352eb735a3a4c4f42b7131a44afd4..ec5d8f7cb1e369b719b5e8dde85efed64b30abc6 100644
--- a/daemons/ganeti-cleaner.in
+++ b/daemons/ganeti-cleaner.in
@@ -1,7 +1,7 @@
 #!/bin/bash
 #
 
-# Copyright (C) 2009, 2010 Google Inc.
+# Copyright (C) 2009, 2010, 2011 Google Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,9 +20,13 @@
 
 set -e
 
+in_cluster() {
+  [[ -e $DATA_DIR/ssconf_master_node ]]
+}
+
 cleanup_master() {
   # Return if machine is not part of a cluster
-  [[ -e $DATA_DIR/ssconf_master_node ]] || return 0
+  in_cluster || return 0
 
   # Return if queue archive directory doesn't exist
   [[ -d $QUEUE_ARCHIVE_DIR ]] || return 0
@@ -45,6 +49,16 @@ cleanup_node() {
   done
 }
 
+cleanup_watcher() {
+  # Return if machine is not part of a cluster
+  in_cluster || return 0
+
+  # Remove old watcher files
+  find $DATA_DIR -maxdepth 1 -type f -mtime +$REMOVE_AFTER \
+    -name 'watcher.*-*-*-*.data' -print0 | \
+  xargs -r0 rm -vf
+}
+
 # Overridden by unittest
 : ${LOCALSTATEDIR:=@LOCALSTATEDIR@}
 : ${CHECK_CERT_EXPIRED:=@PKGLIBDIR@/check-cert-expired}
@@ -77,5 +91,6 @@ xargs -r rm -vf
 
 cleanup_master
 cleanup_node
+cleanup_watcher
 
 exit 0
diff --git a/test/ganeti-cleaner_unittest.bash b/test/ganeti-cleaner_unittest.bash
index 208ec08241e5f7bd44874f54608fd8e7108c3cb9..367a27c3b7bc0794398e6c5e9703cf45f96b628a 100755
--- a/test/ganeti-cleaner_unittest.bash
+++ b/test/ganeti-cleaner_unittest.bash
@@ -55,6 +55,13 @@ count_jobs() {
   [[ "$count" -eq "$n" ]] || err "Found $count jobs instead of $n"
 }
 
+count_watcher() {
+  local n=$1
+  local count=$(find $watcherdir -maxdepth 1 -type f \
+                  -name 'watcher.*.data' | wc -l)
+  [[ "$count" -eq "$n" ]] || err "Found $count watcher files instead of $n"
+}
+
 count_and_check_certs() {
   local n=$1
   local count=$(find $cryptodir -mindepth 1 -type f -name cert | wc -l)
@@ -97,6 +104,28 @@ create_archived_jobs() {
   done
 }
 
+create_watcher_state() {
+  local uuids=(
+    6792a0d5-f8b6-4531-8d8c-3680c86b8a53
+    ab74da37-f5f7-44c4-83ad-074159772593
+    fced2e48-ffff-43ae-919e-2b77d37ecafa
+    6e89ac57-2eb1-4a16-85a1-94daa815d643
+    8714e8f5-59c4-47db-b2cb-196ec37978e5
+    91763d73-e1f3-47c7-a735-57025d4e2a7d
+    e27d3ff8-9546-4e86-86a4-04151223e140
+    aa3f63dd-be17-4ac8-bd01-d71790e124cb
+    05b6d7e2-003b-40d9-a6d6-ab61bf123a15
+    54c93e4c-61fe-40de-b47e-2a8e6c805d02
+    )
+
+  i=0
+  for uuid in ${uuids[@]}; do
+    touch -d "$(( 5 * i )) days ago" $watcherdir/watcher.$uuid.data
+
+    let ++i
+  done
+}
+
 create_certdirs() {
   local cert=$1; shift
   local certdir
@@ -117,6 +146,7 @@ trap "rm -rf $tmpdir" EXIT
 tmpls=$tmpdir/var
 queuedir=$tmpls/lib/ganeti/queue
 cryptodir=$tmpls/run/ganeti/crypto
+watcherdir=$tmpls/lib/ganeti
 
 mkdir -p $tmpls/{lib,log,run}/ganeti $queuedir/archive $cryptodir
 
@@ -165,4 +195,10 @@ count_and_check_certs 5
 check_logfiles $maxlog
 count_jobs 31
 
+upto 'Watcher status files'
+create_watcher_state
+count_watcher 10
+run_cleaner
+count_watcher 5
+
 exit 0