Complete rewrite of DoRead().