Erlang has the ability to keep two versions of a compiled module in memory at once (but only two, not three or more), making it possible to do hot code updates and achieve zero downtime upgrades. The message passing architecture makes this possible by swapping the old code out at a message processing boundary (letting the current cycle complete before loading the new code in). This can be seen as a limited implementation of a version-aware runtime.