Teaching software modeling and software design presents a different and difficult set of problems than teaching some of the other aspects of software engineering such as testing and requirements. As we point out this is partly due to the inherent complexity of the concepts involved in software modeling and design that requires a different approach in teaching them. The science of software modeling and design is also not quite as fully developed and mature although some major progress have been made recently. The lack of a good collection of practical and yet small enough examples of modeling and design problems for classroom use for illustrating both the science part of modeling and design principles and the engineering applications of those principles makes the teaching of these principles a significant challenge. We present a stepwise refinement approach for creating finite-state models that is better suited for classroom teaching.