Issue #2: Implement OAuth, additional cleanup