adding control flow and object factory for provider
Merge branch 'master', remote branch 'origin' into azhar
Merge branch 'azhar', remote branch 'origin'