diff --git a/compiler/cpp/src/generate/t_cocoa_generator.cc b/compiler/cpp/src/generate/t_cocoa_generator.cc
index 14e0e61..c44d061 100644
--- a/compiler/cpp/src/generate/t_cocoa_generator.cc
+++ b/compiler/cpp/src/generate/t_cocoa_generator.cc
@@ -66,14 +66,23 @@
  * @return List of imports necessary for thrift runtime
  */
 string t_cocoa_generator::cocoa_thrift_imports() {
-  return
-    string() +
+  string result = string() +
     "#import <TProtocol.h>\n" +
     "#import <TApplicationException.h>\n" +
     "#import <TProtocolUtil.h>\n" +
     "\n";
+
+  // Include other Thrift includes
+  const vector<t_program*>& includes = program_->get_includes();
+  for (size_t i = 0; i < includes.size(); ++i) {
+    result += "#import \"" + includes[i]->get_name() + ".h\"" + "\n";
+  }
+  result += "\n";
+
+  return result;
 }
 
+
 /**
  * Finish up generation.
  */
@@ -276,6 +285,11 @@
   }
   out << endl;
 
+  // read and write
+  out << "- (void) read: (id <TProtocol>) inProtocol;" << endl;
+  out << "- (void) write: (id <TProtocol>) outProtocol;" << endl;
+  out << endl;
+
   // getters and setters
   generate_cocoa_struct_field_accessor_declarations(out, tstruct, is_exception);
 
@@ -430,7 +444,7 @@
   indent(out) << "int fieldID;" << endl;
   out << endl;
 
-  indent(out) << "[inProtocol readStructBeginWithName: NULL];" << endl;
+  indent(out) << "[inProtocol readStructBeginReturningName: NULL];" << endl;
   
   // Loop over reading in fields
   indent(out) <<
@@ -439,7 +453,7 @@
     
     // Read beginning field marker
     indent(out) <<
-      "[inProtocol readFieldBeginWithName: &fieldName type: &fieldType fieldID: &fieldID];" << endl;
+      "[inProtocol readFieldBeginReturningName: &fieldName type: &fieldType fieldID: &fieldID];" << endl;
     
     // Check for field STOP marker and break
     indent(out) <<
@@ -525,6 +539,9 @@
     indent() << "[outProtocol writeStructBeginWithName: @\"" << name << "\"];" << endl;
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
+    out <<
+      indent() << "if (__" << (*f_iter)->get_name() << "_isset) {" << endl;
+    indent_up();
     bool null_allowed = type_can_be_null((*f_iter)->get_type());
     if (null_allowed) {
       out <<
@@ -544,9 +561,9 @@
       "[outProtocol writeFieldEnd];" << endl;
     
     if (null_allowed) {
-      indent_down();
-      indent(out) << "}" << endl;
+      scope_down(out);
     }
+    scope_down(out);
   }
   // Write the struct map
   out <<
@@ -950,7 +967,7 @@
       // check for an exception
       out <<
         indent() << "int msgType = 0;" << endl <<
-        indent() << "[inProtocol readMessageBeginWithName: nil type: &msgType sequenceID: NULL];" << endl <<
+        indent() << "[inProtocol readMessageBeginReturningName: nil type: &msgType sequenceID: NULL];" << endl <<
         indent() << "if (msgType == TMessageType_EXCEPTION) {" << endl <<
         indent() << "  TApplicationException * x = [TApplicationException read: inProtocol];" << endl <<
         indent() << "  [inProtocol readMessageEnd];" << endl <<
@@ -990,7 +1007,7 @@
       } else {
         out <<
           indent() << "@throw [TApplicationException exceptionWithType: TApplicationException_MISSING_RESULT" << endl <<
-          indent() << "                                        message: @\"" << (*f_iter)->get_name() << " failed: unknown result\"];" << endl;
+          indent() << "                                         reason: @\"" << (*f_iter)->get_name() << " failed: unknown result\"];" << endl;
       }
       
       // Close function
@@ -1130,18 +1147,18 @@
   // Declare variables, read header
   if (ttype->is_map()) {
     indent(out) 
-      << "[inProtocol readMapBeginWithKeyType: NULL valueType: NULL size: &" <<
+      << "[inProtocol readMapBeginReturningKeyType: NULL valueType: NULL size: &" <<
       size << "];" << endl;
     indent(out) << "NSMutableDictionary * " << fieldName << 
       " = [[NSMutableDictionary alloc] initWithCapacity: " << size << "];" << endl;
   } else if (ttype->is_set()) {
     indent(out) 
-      << "[inProtocol readSetBeginWithElementType: NULL size: &" << size << "];" << endl;
+      << "[inProtocol readSetBeginReturningElementType: NULL size: &" << size << "];" << endl;
     indent(out) << "NSMutableSet * " << fieldName << 
       " = [[NSMutableSet alloc] initWithCapacity: " << size << "];" << endl;
   } else if (ttype->is_list()) {
     indent(out) 
-      << "[inProtocol readListBeginWithElementType: NULL size: &" << size << "];" << endl;
+      << "[inProtocol readListBeginReturningElementType: NULL size: &" << size << "];" << endl;
     indent(out) << "NSMutableArray * " << fieldName << 
       " = [[NSMutableArray alloc] initWithCapacity: " << size << "];" << endl;
   }
diff --git a/compiler/cpp/src/generate/t_cocoa_generator.h b/compiler/cpp/src/generate/t_cocoa_generator.h
index 1696c20..b34ba8b 100644
--- a/compiler/cpp/src/generate/t_cocoa_generator.h
+++ b/compiler/cpp/src/generate/t_cocoa_generator.h
@@ -55,21 +55,21 @@
   void generate_cocoa_struct_interface(std::ofstream& out, t_struct* tstruct, bool is_xception=false);
   void generate_cocoa_struct_implementation(std::ofstream& out, t_struct* tstruct, bool is_xception=false, bool is_result=false);
   void generate_cocoa_struct_initializer_signature(std::ofstream& out,
-                                                  t_struct* tstruct);
+                                                   t_struct* tstruct);
   void generate_cocoa_struct_field_accessor_declarations(std::ofstream& out,
-                                                        t_struct* tstruct,
-                                                        bool is_exception);
+                                                         t_struct* tstruct,
+                                                         bool is_exception);
   void generate_cocoa_struct_field_accessor_implementations(std::ofstream& out,
-                                                           t_struct* tstruct,
-                                                           bool is_exception);
+                                                            t_struct* tstruct,
+                                                            bool is_exception);
   void generate_cocoa_struct_reader(std::ofstream& out, t_struct* tstruct);
   void generate_cocoa_struct_result_writer(std::ofstream& out, t_struct* tstruct);
   void generate_cocoa_struct_writer(std::ofstream& out, t_struct* tstruct);
   void generate_cocoa_struct_description(std::ofstream& out, t_struct* tstruct);
-
+  
   std::string function_result_helper_struct_type(t_function* tfunction);
   void generate_function_helpers(t_function* tfunction);
-
+  
   /**
    * Service-level generation functions
    */
diff --git a/lib/cocoa/TApplicationException.h b/lib/cocoa/TApplicationException.h
index bb64282..1fee06e 100644
--- a/lib/cocoa/TApplicationException.h
+++ b/lib/cocoa/TApplicationException.h
@@ -1,3 +1,6 @@
+#import "TException.h"
+#import "TProtocol.h"
+
 enum {
   TApplicationException_UNKNOWN = 0,
   TApplicationException_UNKNOWN_METHOD = 1,
@@ -8,12 +11,13 @@
 };
 
 // FIXME
-@interface TApplicationException : NSException {
+@interface TApplicationException : TException {
+  int mType;
 }
 
 + (TApplicationException *) read: (id <TProtocol>) protocol;
 
 + (TApplicationException *) exceptionWithType: (int) type
-                                      message: (NSString *) message;
+                                       reason: (NSString *) message;
 
 @end
diff --git a/lib/cocoa/TBinaryProtocol.m b/lib/cocoa/TBinaryProtocol.m
index cd239de..2d2ca8e 100644
--- a/lib/cocoa/TBinaryProtocol.m
+++ b/lib/cocoa/TBinaryProtocol.m
@@ -1,4 +1,5 @@
 #import "TBinaryProtocol.h"
+#import "TProtocolException.h"
 
 int32_t VERSION_1 = 0x80010000;
 int32_t VERSION_MASK = 0xffff0000;
@@ -38,17 +39,15 @@
 }
 
 
-- (void) readMessageBeginWithName: (NSString **) name
-                             type: (int *) type
-                       sequenceID: (int *) sequenceID
+- (void) readMessageBeginReturningName: (NSString **) name
+                                  type: (int *) type
+                            sequenceID: (int *) sequenceID
 {
   int size = [self readI32];
   if (size < 0) {
     int version = size & VERSION_MASK;
     if (version != VERSION_1) {
-      @throw [NSException exceptionWithName: @"TProtocolException"
-                          reason: @"Bad version in readMessageBegin"
-                          userInfo: nil];
+      @throw [TProtocolException exceptionWithName: @"Bad version in readMessageBegin"];
     }
     if (type != NULL) {
       *type = version & 0x00FF;
@@ -63,9 +62,7 @@
     }
   } else {
     if (mStrictRead) {
-      @throw [NSException exceptionWithName: @"TProtocolException"
-                          reason: @"Missing version in readMessageBegin, old client?"
-                          userInfo: nil];
+      @throw [TProtocolException exceptionWithName: @"Missing version in readMessageBegin, old client?"];
     }
     NSString * messageName = [self readStringBody: size];
     if (name != NULL) {
@@ -86,7 +83,7 @@
 - (void) readMessageEnd {}
 
 
-- (void) readStructBeginWithName: (NSString **) name
+- (void) readStructBeginReturningName: (NSString **) name
 {
   if (name != NULL) {
     *name = nil;
@@ -97,9 +94,9 @@
 - (void) readStructEnd {}
 
 
-- (void) readFieldBeginWithName: (NSString **) name
-                           type: (int *) fieldType
-                        fieldID: (int *) fieldID
+- (void) readFieldBeginReturningName: (NSString **) name
+                                type: (int *) fieldType
+                             fieldID: (int *) fieldID
 {
   if (name != NULL) {
     *name = nil;
@@ -189,19 +186,19 @@
   int32_t size = [self readI32];
   uint8_t * buff = malloc(size);
   if (buff == NULL) {
-    @throw [NSException exceptionWithName: @"Out of memory" 
-                        reason: [NSString stringWithFormat: @"Unable to allocate %d bytes trying to read binary data.",
-                                          size]
-                        userInfo: nil];
+    @throw [TProtocolException 
+             exceptionWithName: @"Out of memory" 
+             reason: [NSString stringWithFormat: @"Unable to allocate %d bytes trying to read binary data.",
+                               size]];
   }
   [mTransport readAll: buff offset: 0 length: size];
   return [NSData dataWithBytesNoCopy: buff length: size];
 }
 
 
-- (void) readMapBeginWithKeyType: (int *) keyType
-                       valueType: (int *) valueType
-                            size: (int *) size
+- (void) readMapBeginReturningKeyType: (int *) keyType
+                            valueType: (int *) valueType
+                                 size: (int *) size
 {
   int kt = [self readByte];
   int vt = [self readByte];
@@ -220,8 +217,8 @@
 - (void) readMapEnd {}
 
 
-- (void) readSetBeginWithElementType: (int *) elementType
-                                size: (int *) size
+- (void) readSetBeginReturningElementType: (int *) elementType
+                                     size: (int *) size
 {
   int et = [self readByte];
   int s = [self readI32];
@@ -237,8 +234,8 @@
 - (void) readSetEnd {}
 
 
-- (void) readListBeginWithElementType: (int *) elementType
-                                 size: (int *) size
+- (void) readListBeginReturningElementType: (int *) elementType
+                                      size: (int *) size
 {
   int et = [self readByte];
   int s = [self readI32];
diff --git a/lib/cocoa/TException.h b/lib/cocoa/TException.h
index 95eaa83..ce3b4a5 100644
--- a/lib/cocoa/TException.h
+++ b/lib/cocoa/TException.h
@@ -3,7 +3,13 @@
 @interface TException : NSException {
 }
 
-- (id) initWithType: (int) type
-            message: (NSString *) message;
++ (id) exceptionWithName: (NSString *) name;
+
++ (id) exceptionWithName: (NSString *) name
+                  reason: (NSString *) reason;
+
++ (id) exceptionWithName: (NSString *) name
+                  reason: (NSString *) reason
+                   error: (NSError *) error;
 
 @end
diff --git a/lib/cocoa/TProtocol.h b/lib/cocoa/TProtocol.h
index 96d3af6..bc64789 100644
--- a/lib/cocoa/TProtocol.h
+++ b/lib/cocoa/TProtocol.h
@@ -30,17 +30,17 @@
 
 - (id <TTransport>) transport;
 
-- (void) readMessageBeginWithName: (NSString **) name
-                             type: (int *) type
-                       sequenceID: (int *) sequenceID;
+- (void) readMessageBeginReturningName: (NSString **) name
+                                  type: (int *) type
+                            sequenceID: (int *) sequenceID;
 - (void) readMessageEnd;
 
-- (void) readStructBeginWithName: (NSString **) name;
+- (void) readStructBeginReturningName: (NSString **) name;
 - (void) readStructEnd;
 
-- (void) readFieldBeginWithName: (NSString **) name
-                           type: (int *) fieldType
-                        fieldID: (int *) fieldID;
+- (void) readFieldBeginReturningName: (NSString **) name
+                                type: (int *) fieldType
+                             fieldID: (int *) fieldID;
 - (void) readFieldEnd;
 
 - (NSString *) readString;
@@ -59,19 +59,19 @@
 
 - (NSData *) readBinary;
 
-- (void) readMapBeginWithKeyType: (int *) keyType
-                       valueType: (int *) valueType
-                            size: (int *) size;
+- (void) readMapBeginReturningKeyType: (int *) keyType
+                            valueType: (int *) valueType
+                                 size: (int *) size;
 - (void) readMapEnd;
 
 
-- (void) readSetBeginWithElementType: (int *) elementType
-                                size: (int *) size;
+- (void) readSetBeginReturningElementType: (int *) elementType
+                                     size: (int *) size;
 - (void) readSetEnd;
 
 
-- (void) readListBeginWithElementType: (int *) elementType
-                                 size: (int *) size;
+- (void) readListBeginReturningElementType: (int *) elementType
+                                      size: (int *) size;
 - (void) readListEnd;
 
 
@@ -99,6 +99,8 @@
 
 - (void) writeDouble: (double) value;
 
+- (void) writeBool: (BOOL) value;
+
 - (void) writeBinary: (NSData *) data;
 
 - (void) writeFieldStop;
diff --git a/lib/cocoa/TProtocolUtil.m b/lib/cocoa/TProtocolUtil.m
index 746790f..cf32aad 100644
--- a/lib/cocoa/TProtocolUtil.m
+++ b/lib/cocoa/TProtocolUtil.m
@@ -27,10 +27,10 @@
     [protocol readString];
     break;
   case TType_STRUCT:
-    [protocol readStructBeginWithName: NULL];
+    [protocol readStructBeginReturningName: NULL];
     while (true) {
       int fieldType;
-      [protocol readFieldBeginWithName: nil type: &fieldType fieldID: nil];
+      [protocol readFieldBeginReturningName: nil type: &fieldType fieldID: nil];
       if (fieldType == TType_STOP) {
         break;
       }
@@ -44,7 +44,7 @@
     int keyType;
     int valueType;
     int size;
-    [protocol readMapBeginWithKeyType: &keyType valueType: &valueType size: &size];
+    [protocol readMapBeginReturningKeyType: &keyType valueType: &valueType size: &size];
     int i;
     for (i = 0; i < size; i++) {
       [TProtocolUtil skipType: keyType onProtocol: protocol];
@@ -57,7 +57,7 @@
     {
       int elemType;
       int size;
-      [protocol readSetBeginWithElementType: &elemType size: &size];
+      [protocol readSetBeginReturningElementType: &elemType size: &size];
       int i;
       for (i = 0; i < size; i++) {
         [TProtocolUtil skipType: elemType onProtocol: protocol];
@@ -69,7 +69,7 @@
     {
       int elemType;
       int size;
-      [protocol readListBeginWithElementType: &elemType size: &size];
+      [protocol readListBeginReturningElementType: &elemType size: &size];
       int i;
       for (i = 0; i < size; i++) {
         [TProtocolUtil skipType: elemType onProtocol: protocol];
diff --git a/lib/cocoa/TTransport.h b/lib/cocoa/TTransport.h
index bb0270e..1fa04f4 100644
--- a/lib/cocoa/TTransport.h
+++ b/lib/cocoa/TTransport.h
@@ -1,10 +1,10 @@
 @protocol TTransport <NSObject>
 
   /**
-   * Guarantees that all of len bytes are 
+   * Guarantees that all of len bytes are read
    *
-   * @param buf Array to read into
-   * @param off Index to start reading at
+   * @param buf Buffer to read into
+   * @param off Index in buffer to start storing bytes at
    * @param len Maximum number of bytes to read
    * @return The number of bytes actually read, which must be equal to len
    * @throws TTransportException if there was an error reading data
