Revert "Abstraction"

This reverts commit 7f95f5cc2d5338d94be2380c1d70bd5a8c776b83.
Revert "Revert "Abstraction""

This reverts commit 228265f203ecd59318d03393f6aed4524fe8d6d1.