Add initial fully(ish) functional version