reworks internals of Surface; interface is the same.