initial commit, needs other implementations and tests