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 {
Index: src/py/avro/ipc.py
===================================================================
--- src/py/avro/ipc.py	(revision 790310)
+++ src/py/avro/ipc.py	(working copy)
@@ -79,6 +79,13 @@
 _REMOTE_HASHES = dict()
 _REMOTE_PROTOCOLS = dict()
 
+_META_SCHEMA = schema.parse(
+                     open(_HANDSHAKE_FILE_DIR +
+		          "Meta.avsc").read())
+
+_META_READER = reflectio.ReflectDatumReader(_PKGNAME, _META_SCHEMA)
+_META_WRITER = reflectio.ReflectDatumWriter(_PKGNAME, _META_SCHEMA)
+
 class RequestorBase(object):
   """Base class for the client side of a protocol interaction."""
 
@@ -110,6 +117,8 @@
       m = self.__localproto.getmessages().get(msgname)
       if m is None:
         raise schema.AvroException("Not a local message: "+msgname.__str__())
+      meta = {}
+      _META_WRITER.write(meta, encoder)
       encoder.writeutf8(m.getname())
       self.writerequest(m.getrequest(), req, encoder)
       response = self.__transceiver.transceive(buf.getvalue())
@@ -119,6 +128,7 @@
     m = self.getremote().getmessages().get(msgname)
     if m is None:
       raise schema.AvroException("Not a remote message: "+msgname.__str__())
+    meta = _META_READER.read(decoder)
     if not decoder.readboolean():
       return self.readresponse(m.getresponse(), decoder)
     else:
@@ -204,6 +214,7 @@
         return buf.getvalue()
       
       #read request using remote protocol specification
+      meta = _META_READER.read(decoder)
       msgname = decoder.readutf8()
       m = remoteproto.getmessages().get(msgname)
       if m is None:
@@ -220,6 +231,8 @@
         error = e
       except Exception, e:
         error = AvroRemoteException(unicode(e.__str__()))
+      meta = {}
+      _META_WRITER.write(meta, encoder)
       encoder.writeboolean(error is not None)
       if error is None:
         self.writeresponse(m.getresponse(), response, encoder)
