In this talk, we review the available semantics for aspect-oriented programming (AOP), and we connect this theme of recent research to pre-AOP age. Most AOP semantics are operational or compiler-oriented in style, and they focus on idioms of AspectJ, which is the trend-setting, Java-based AOP language. A typical AOP semantics is based on a down-scaled Java, or perhaps on a simple functional language. The AOP-specific parts of the semantics are normally related to some form of aspect registry to keep track of intercepted join points and associated advice. Still these semantics differ with regard to the cunning peculiarities of describing pointcuts and managing the aspect registry. Furthermore, the semantics might or might not address static typing issues and other static guarantees. In addition to semantics, there are also foundational issues that are being studied, e.g., interpretations of AOP using process algebra (CSP) or the pi-calculus, and the static analysis of aspects for interference. In fact, AOP foundations have been studied before the existence of AOP: think of structural and behavioural reflection as the most obvious example. Such imports from pre-AOP age also include continuation-passing style, wrapping, parallel programming, algorithmic debugging, and dynamic scoping. Ongoing work on the semantics of AOP aims at ``fluid'' AOP, simpler semantical concepts, coverage of practical languages, modular reasoning, aspect composition, and semantics-preserving transformations of aspect-oriented programs.