You *always* have a View, VM and Model. None of the parts are optional. View - Strictly 100% XAML (in fact, I prefer to delete the code behind entirely to prevent lazy programmers from uglifying the code). Some people will argue this is not a requirement, but IMO, it should be, it keeps the code cleaner. If you need to do something "complex" with a control, it shouldn't be done in the code behind, but rather broken out into a reusable UserControl. ViewModel - View binds to this class. Someone will now argue: but how do I set the VM since you have deleted the code behind? -- Answer: ViewLocator & DI. DI plays a second part in this class. It is used to inject the model into the constructor. ViewModel just wraps the Model with lazy load style properties and exposes commands that operate on the model, etc. Model - This is the API / storage layer of your objects. I like to break this out into its own assembly that a single programmer is managing for consistency. This is the *only* assembly that should even know what a database is. No database / persistence code of any kind is allowed anywhere else in the project. I like breaking the model out into its own assembly to keep things clean and in one place. Model should implement INPC and INCC.