Testing of programs has dominated the last 50 years of software development, but the next 50 will see an increased demand for provably correct software. This is partly because modern applications are increasingly safety critical, partly because testing is by its very nature only a partial correctness guarantee, and partly because programming language technology has now advanced to the stage where it is feasible to formally verify critical programs. Language-based verification uses a language's type system to guarantee program correctness, so that type-checking a program becomes tantamount to verifying its correctness. Thus, the more program properties a type system can express, the more the compiler can automatically verify. Indexed programming is a key technique for using a language's type system to express more and more sophisticated properties of programs. Indexed programming uses the extra information present in type indices to help close the so-called "semantic gap" between what programmers know about their programs and what type systems can express about them. The intellectual merits of this project lie in providing a principled methodology for transferring knowledge about effective programming and proving between languages supporting type-indexing of types and those supporting term-indexing of types, developing a semantic framework that enhances researchers' and practitioners' understanding of the nature of indexed types in general, and opening the way for new forms of indexing that can enforce even greater correctness guarantees. The broader impact of this project is to use indexed types to develop better and more widely applicable formal program verification methods, and, thereby, to help ensure that even large and sophisticated software systems are safe and reliable. Because it will lead to provably correct and secure software, this project has the potential to impact any application area, and thus any sector of the economy, for which such software is paramount.<br/><br/>This project will use the algebraic structure of indexing to guide the way programmers program with indexed types. Specifically, it will advance the state-of-the-art by providing an axiomatic framework for indexed programming that is principled, conceptually simple, comprehensive, uniform, and predictive. It will use the categorical notion of a fibration to ensure that the framework is general enough both to describe traditional type- and term-indexing of types, and to prescribe approaches to indexed programming when indices have more sophisticated and computationally useful algebraic structure. To this end, it will develop analogues of the adjoint structure present in the fibrations underlying traditional type- and term-indexing for more general fibrations interpreting programs, their types, and their properties. Because fibrations can uniformly model very general notions of "index" and "program property" in very general computational settings, they are indeed a promising foundation for the new framework. The development of the framework will drive both theory and practice forward by transferring knowledge between the traditional type- and term-indexed settings, solving state-of-the-art problems in each of these settings, and providing an understanding of the conceptual essence of indexed programming that allows problem solutions from these traditional settings to be extended to new ones.