Overall design: 1. Use "interop" to get function declarations 2. Functions take parameters and return a "packet" object (what to do with pointers? bundle all data into the packet?) 3. Packet object can be sent over the wire. 4. When you get a response packet, you can call another generated function, to get the actual data. import webservice; interop ws = "ws" ("blabla.wsdl"); int main() { webservice:connection conn = ...; // Low level way of sending a packet. Allows asynchronous sending. webservice:packet pkt = ws:list_customers_by_name:build_packet("John"); webservice:response_packet respkt = webservice:send_packet(conn, pkt); // could be asynchrounous, and you could also send multiple "webservice:packet"s in one physical packet (pipelining) ws:person p1 = ws:list_customers_by_name:extract_result(respkt); // (own qualifiers? of both the packet and the person object) // Synchrounous high-level way of sending a packet ws:person p2 = ws:list_customers_by_name(conn, "John"); // Asynchrounous high-level way of sending a packet webservice:future[ws:person] = ws:list_customers_by_name:send_async(conn, "John"); // TODO think about this return 0; }