some optimization; added watch()