major modification is add authentication, extends DI container