added source_check and optional is_first arg