Modern life depends on large software systems based on communication. Different programming techniques already help developers to produce error-free communicating software; unfortunately we know little about how these techniques relate to and complement each other. This project will discover the fundamental connections between these techniques and validate them in practice.