Added almost all the requested features; still need to implement programmatic shuffle.