duration==0 means go forever
update