Refactor to generic factory
Update interface inheritance