This is the simpler version, will probably do implementations based on this