milestone 2: client framework done!