works from end to end. needs speed