unified drive function