We are interested in problem-solving domains, like engineering and most "exact science" disciplines. In these domains, the knowledge to be acquired by the student is twofold: the domain knowledge itself, but also and mainly the knowledge necessary to solve problems in that domain. As a result, an educationoriented system in such a domain must encompass three knowledge types: the domain knowledge and the problem-solving knowledge, constituting the knowledge to be acquired and mastered by the student, and the tutoring knowledge, used by the system to facilitate the student's learning process. In this paper, we show how these three knowledge types can be modelled, how they should interact with one another in order to fulfil the system educational purpose, and above all how the abstraction and complexity levels can shed a uniformizing light on the system operation and make it more userfriendly. We thus hope to bring some contribution to the general and important problem of finding a generic architecture to intelligent tutoring systems.