added background information, and implementation details