Many Changes.

Refer to pull request for details.