Feature Oriented Programming (FOP) is a design methodology and tools for program synthesis in software product lines. Programs are specified declaratively in terms of features. FOP has been used to develop product-lines in widely varying domains, including compilers for extensible Java dialects [6], fire support simulators for the U.S. Army [4], network protocols [1], web portlets [8], and program verification tools [9].The fundamental units of modularization in FOP are program extensions (aspects, mixins, or traits) that encapsulate the implementation of an individual feature. An FOP model of a product-line is an algebra: base programs are constants and program extensions are functions (that add a specified feature to an input program). Program designs are expressions -compositions of functions and constants -that are amenable to optimization and analysis.FOP is at the confluence of many different areas of research: product lines, aspect oriented programming, metaprogramming (program design as a computation), layered designs [1], declarative domain specific languages [2], automatic programming (i.e., mapping a declarative specification of a program to an efficient implementation) [3], and multidimensional separation of concerns [5].This tutorial reviews core results on FOP:• compositional models of software development and program synthesis [6],• models and tools for synthesizing code and non-code artifacts [6],• formal representations of feature models and automatic algorithms for verifying feature compositions [2],• relationships between metaprogramming, product lines, and model driven engineering (MDE) [7], and • tool demonstrations of the above.