This document discusses approaches for improving interoperability between different query engines in a data lake. It introduces Coral, an intermediate representation that can capture query semantics in a common format. Coral allows translating queries between different SQL dialects and engines. It also introduces Transport, which allows defining user-defined functions (UDFs) in a portable way so they can be used across multiple query engines without reimplementation. Transport generates engine-specific UDF implementations from a common portable definition. These approaches aim to improve composability between data sources, query engines and languages in a data lake architecture.