preliminary fully abstracted version