huge validation refactor
tests passing