Integration is difficult. Why? It is the part of development where there are a lot of opportunities to simplify, and if they are not taken when they present themself, complexity explodes. Basically if you find yourself paving over interface problems in a lower layer, you should fix them in the lower layer instead. If you don't do this, software tetris happens.