this is quite the difficult class