add collection listener and extract base class