added some new ideas on how to generalize the project