low level validation