added all the possible features, separated some features into smaller ones