Split ds2ds using an abstract superclass, in order to be able to reuse its utility methods. Closes #184.