return false on failure