clean up and use self instead of bind()