divided into components
added requirements