Software applications that are more than a toy tend to accrete various features. Over the years I've noticed a few common features that are present in many applications and it might be worth taking a note of them.
If you've ever had to add any of these features without much warning you'll know it can be quite painful.
The good thing about this list is that a lot of them are related. Versioning and Undo, for example, could be coded as inverse operations.