The aim of this work is to provide a robust way for peers with heterogeneous data sources to exchange information in an unreliable network. We address this problem in two ways. Firstly, we define a set of application-layer data exchange protocols to facilitate the discovery of, and communication between, peers. Secondly provide a query processing component with a cache-driven query processor that allows nodes on the network to cache queries and their results on demand, and to use the data caches to give partial or complete answers to a query if the original data sources are unavailable.