Switch to using a Semigroup