Major rework: now uses two level driver model