Working with models can lead to inconsistencies due to erroneous or contradictory actions during concurrent modeling processes. Modern modeling environments typically tolerate inconsistencies and support their detection. However, at a later stage of development, models are expected to be consistent, which means that their inconsistencies should be considered and resolved. The process of resolving model inconsistencies is commonly referred to as model repair. Our approach to model repair is semi-automatic in the sense that the system computes appropriate repair plans and the modeler decides which path to take. The speciality of our approach is that the repair process can register any small improvement in the model. This allows the interaction with the user to be optimized, resulting in an approach with a high level of automation on the one hand and flexible configuration options on the other. The approach is able to provide repair plans that do not have side effects, i.e., the computed repair plans do not inadvertently introduce a new inconsistency of already repaired constraints into the model. Since models often have a graph-like structure, we present our approach to model repair based on graphs. Our approach is completely formal and uses the algebraic graph transformation approach to prove its correctness.