further generalization (tested)