Implement most of missing functionality