completed, mostly tested