Initial commit. Still have a few bugs.