API: Separated course logic from core to shared