In this paper, we address the problem of specifying and generating preferred plans using rich, qualitative user preferences. We propose a logical language for specifying non-Markovian preferences over the evolution of states and actions associated with a plan. The semantics for our first-order preference language is defined in the situation calculus. Unlike other recent temporal preference languages, our preferences are qualitative rather than just ordinal, affording greater expressivity and less incomparability. We propose an approach to computing preferred plans via bounded best-first search in a forward-chaining planner. Key components of our approach are the exploitation of progression to efficiently evaluate levels of preference satisfaction over partial plans, and development of an admissible evaluation function that establishes the optimality of best-first search. We have implemented our planner PPLAN and evaluated it experimentally. Our preference language and planning approach is amenable to integration with several existing planners, and beyond planning, can be used to support arbitrary dynamical reasoning tasks involving preferences.