main interface implemented