fleshed out, needs reducing still