reduction now abstracted again