Tried to stablize the API but still not perfect...