Change all classes to be generic and accept ICell