finished implementation, refatoring remaining