almost all basic functionality implemented