diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m
index d3095a9..73653d7 100644
--- a/ActiveSync/SOGoMailObject+ActiveSync.m
+++ b/ActiveSync/SOGoMailObject+ActiveSync.m
@@ -91,7 +91,7 @@ struct GlobalObjectId {
   FILETIME                  CreationTime;
   uint8_t                   X[8];
   uint32_t                  Size;
-  uint8_t*                  Data;
+  uint8_t Data[0];
 };
 
 @implementation SOGoMailObject (ActiveSync)
@@ -123,30 +123,34 @@ struct GlobalObjectId {
   NSData *binPrefix, *globalObjectId, *uidAsASCII;
   NSString *prefix, *uid;
 
-  struct GlobalObjectId newGlobalId;
+  struct GlobalObjectId *newGlobalId;
   const char *bytes;
-  
-  prefix = @"040000008200e00074c5b7101a82e008";
 
   // dataPrefix is "vCal-Uid %x01 %x00 %x00 %x00"
-  uint8_t dataPrefix[] = { 0x76, 0x43, 0x61, 0x6c, 0x2d, 0x55, 0x69, 0x64, 0x01, 0x00, 0x00, 0x00 };
   uid = [event uid];
+  uidAsASCII = [uid dataUsingEncoding: NSASCIIStringEncoding];
+  newGlobalId = (struct GlobalObjectId *)calloc(
+          sizeof(uint8_t),
+          sizeof(struct GlobalObjectId) + 0x0c + [uidAsASCII length]);
+
+  prefix = @"040000008200e00074c5b7101a82e008";
+  uint8_t dataPrefix[] = { 0x76, 0x43, 0x61, 0x6c, 0x2d, 0x55, 0x69, 0x64, 0x01, 0x00, 0x00, 0x00 };
 
   binPrefix = [prefix convertHexStringToBytes];
-  [binPrefix getBytes: &newGlobalId.ByteArrayID];
-  [self _setInstanceDate: &newGlobalId
+  [binPrefix getBytes:&newGlobalId->ByteArrayID];
+  [self _setInstanceDate: newGlobalId
                 fromDate: [event recurrenceId]];
-  uidAsASCII = [uid dataUsingEncoding: NSASCIIStringEncoding];
   bytes = [uidAsASCII bytes];
 
   // 0x0c is the size of our dataPrefix
-  newGlobalId.Size = 0x0c + [uidAsASCII length];
-  newGlobalId.Data = malloc(newGlobalId.Size * sizeof(uint8_t));
-  memcpy(newGlobalId.Data, dataPrefix, 0x0c);
-  memcpy(newGlobalId.Data + 0x0c, bytes, newGlobalId.Size - 0x0c);
-
-  globalObjectId = [[NSData alloc] initWithBytes: &newGlobalId  length: 40 + newGlobalId.Size*sizeof(uint8_t)];
-  free(newGlobalId.Data);
+  newGlobalId->Size = 0x0c + [uidAsASCII length];
+  memcpy(newGlobalId->Data, dataPrefix, 0x0c);
+  memcpy(newGlobalId->Data + 0x0c, bytes, newGlobalId->Size - 0x0c);
+
+  globalObjectId =
+      [[NSData alloc] initWithBytes:newGlobalId
+                             length:40 + newGlobalId->Size * sizeof(uint8_t)];
+  free(newGlobalId);
   
   return [globalObjectId autorelease];
 }
