abstract factory
Merge origin/master