#5 restructure some dependencies
#8 adding some custom implementations