re-use watcher logic