add new features and unit tests