implementing core classes