public boolean check_for_zombies() {
		check();
		boolean change=false;
	    Iterator<Entry<String, FileState>> it = m.entrySet().iterator();
	    while (it.hasNext()) {
	        Entry<String,FileState> pair = it.next();
	        FileState fs=pair.getValue();
	        String repo_filename=pair.getKey();
	        File f = new File(fs.local_filename);
	    	//OpenBox.log(0, "Zombie checking "+repo_filename + " " +fs.local_filename + " " +fs);
	        if (!fs.deleted && !f.exists()) {
	        	OpenBox.log(0, "ZOMBIE: "+ fs.local_filename);
	        	fs.earliest_deleted_time=(new Date()).getTime()-OpenBox.poll_delay;
	        	fs.deleted=true;
	        	change=true;
	        } if (fs.deleted && f.exists()) {
	        	if (fs.earliest_deleted_time<f.lastModified()) {
	        		OpenBox.log(0, "Ressurecting a zombie file that should be dead!" + repo_filename);
	        		//keep the file!
	        		fs.last_modified=f.lastModified();
	        		fs.deleted=false;
	        		//if we keep this file we should make sure its parent folders are undeleted
	        		File repo_root=new File(repo_path);
	        		File parent = f.getParentFile();
	        		try {
						while(!parent.getCanonicalPath().equals(repo_root.getCanonicalPath())) {
							String repo_parent_filename=parent.getCanonicalPath().replace(repo_path, "");
							if (m.containsKey(repo_parent_filename)) {
								m.get(repo_parent_filename).deleted=false;
							}
							parent=parent.getParentFile();
						}
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
	        	} else {
	        		//remove the file!
	        		OpenBox.log(0, "Removing a zombie file that should be dead!" + repo_filename);
	        		f.delete();
	        	}
	        }
	    }
		check();
	    return change;
	}