Add Features

The commit messages describe what each change is.

If you'd rather have me pull request each feature separately, let me know.