implement most features