We present design aspects of the algebraic-functional language OPAL 2a]]>, which features flexible modularization to support programming in the large. OPAL 2a]]> provides parameterized structures and theories as part of packages . Parameterized theories serve to specify properties of functions and are shown -- along with partial instantiations -- to play a similar role to type classes in HASKELL. Structures can be viewed as (mere) interfaces or as concrete implementations. A realization relation between structures tells us which implementation realizes which interface. A package is a kind of folder for structures and theories. Packages establish flexible name spaces via an import relation. Name spaces, overloading and instance derivation are based on a well-established annotation concept.