Refactored to abstractions described in 2.9a