add complete callback