Refactored the interfaces to better suit our aims,
implemented some of the concrete methods,
added lots of template code.