user functions complete