Index: src/java/org/apache/avro/ipc/Responder.java
===================================================================
--- src/java/org/apache/avro/ipc/Responder.java	(revision 790310)
+++ src/java/org/apache/avro/ipc/Responder.java	(working copy)
@@ -28,6 +28,8 @@
 import org.apache.avro.*;
 import org.apache.avro.Protocol.Message;
 import org.apache.avro.util.*;
+import org.apache.avro.generic.GenericDatumReader;
+import org.apache.avro.generic.GenericDatumWriter;
 import org.apache.avro.io.*;
 import org.apache.avro.specific.*;
 
@@ -35,6 +37,13 @@
 public abstract class Responder {
   private static final Logger LOG = LoggerFactory.getLogger(Responder.class);
 
+  private static final Schema META =
+    Schema.createMap(Schema.create(Schema.Type.BYTES));
+  private static final GenericDatumReader<Map<Utf8,ByteBuffer>> META_READER =
+    new GenericDatumReader<Map<Utf8,ByteBuffer>>(META);
+  private static final GenericDatumWriter<Map<Utf8,ByteBuffer>> META_WRITER =
+    new GenericDatumWriter<Map<Utf8,ByteBuffer>>(META);
+
   private Map<Transceiver,Protocol> remotes
     = Collections.synchronizedMap(new WeakHashMap<Transceiver,Protocol>());
   private Map<MD5,Protocol> protocols
@@ -69,6 +78,7 @@
         return bbo.getBufferList();
 
       // read request using remote protocol specification
+      Map<Utf8,ByteBuffer> requestMeta = META_READER.read(null, in);
       String messageName = in.readString(null).toString();
       Message m = remote.getMessages().get(messageName);
       if (m == null)
@@ -90,6 +100,8 @@
         error = new AvroRemoteException(new Utf8(e.toString()));
       }
 
+      Map<Utf8,ByteBuffer> responseMeta = new HashMap<Utf8,ByteBuffer>();
+      META_WRITER.write(responseMeta, out);
       out.writeBoolean(error != null);
       if (error == null)
         writeResponse(m.getResponse(), response, out);
Index: src/java/org/apache/avro/ipc/Requestor.java
===================================================================
--- src/java/org/apache/avro/ipc/Requestor.java	(revision 790310)
+++ src/java/org/apache/avro/ipc/Requestor.java	(working copy)
@@ -29,6 +29,8 @@
 import org.apache.avro.Protocol;
 import org.apache.avro.Schema;
 import org.apache.avro.Protocol.Message;
+import org.apache.avro.generic.GenericDatumReader;
+import org.apache.avro.generic.GenericDatumWriter;
 import org.apache.avro.io.Decoder;
 import org.apache.avro.io.Encoder;
 import org.apache.avro.io.BinaryEncoder;
@@ -43,6 +45,13 @@
 public abstract class Requestor {
   private static final Logger LOG = LoggerFactory.getLogger(Requestor.class);
 
+  private static final Schema META =
+    Schema.createMap(Schema.create(Schema.Type.BYTES));
+  private static final GenericDatumReader<Map<Utf8,ByteBuffer>> META_READER =
+    new GenericDatumReader<Map<Utf8,ByteBuffer>>(META);
+  private static final GenericDatumWriter<Map<Utf8,ByteBuffer>> META_WRITER =
+    new GenericDatumWriter<Map<Utf8,ByteBuffer>>(META);
+
   private Protocol local;
   private Protocol remote;
   private boolean established, sendLocalText;
@@ -63,6 +72,7 @@
     throws IOException {
     Decoder in;
     Message m;
+    Map<Utf8,ByteBuffer> requestMeta = new HashMap<Utf8,ByteBuffer>();
     do {
       ByteBufferOutputStream bbo = new ByteBufferOutputStream();
       Encoder out = new BinaryEncoder(bbo);
@@ -75,6 +85,7 @@
       if (m == null)
         throw new AvroRuntimeException("Not a local message: "+messageName);
       
+      META_WRITER.write(requestMeta, out);
       out.writeString(m.getName());       // write message name
       writeRequest(m.getRequest(), request, out); // write request payload
       
@@ -91,6 +102,7 @@
     m = getRemote().getMessages().get(messageName);
     if (m == null)
       throw new AvroRuntimeException("Not a remote message: "+messageName);
+    Map<Utf8,ByteBuffer> responseMeta = META_READER.read(null, in);
     if (!in.readBoolean()) {                      // no error
       return readResponse(m.getResponse(), in);
     } else {
