restructured into components