This course is an introduction to autonomic and self-aware computing systems. It surveys the field of autonomic computing from its first introductory vision to the current time. The course describes autonomic computing and how it provides self-managing systems with their ability to adapt to unpredictable changes in an environment. It concentrates on the self-awareness properties of autonomic systems, the architecture, the monitoring systems that provide the self-awareness, and the adaptation and decision making needed to adapt to changing environments. The course covers the vision of autonomic computing and how autonomic computing differs from automated and autonomous systems. It discusses the self-awareness properties of autonomic systems and their biological inspiration. Architectures of autonomic systems are covered, which includes autonomic managers that are the core of autonomic systems that provide the self-managing nature of autonomic systems. Adaptation, another important aspect of autonomic computing, is discussed as well as what makes an autonomic system self-aware. The course ends with evaluation and assurance of autonomic systems, and future trends in the field. There will be weekly readings and discussions, approximately bi-weekly assignments that go into depth on selected topics, and a final project or research paper. The project can be an implementation of a part of an autonomic computing system, or a research paper that goes into depth on one of the topics covered or a topic that is of interest to the student.