Index: source/common/udata.cpp
===================================================================
--- source/common/udata.cpp	(revision 259715)
+++ source/common/udata.cpp	(working copy)
@@ -621,7 +621,7 @@
  *      our common data.                                                *
  *                                                                      *
  *----------------------------------------------------------------------*/
-extern "C" const DataHeader U_DATA_API U_ICUDATA_ENTRY_POINT;
+extern "C" const ICU_Data_Header U_DATA_API U_ICUDATA_ENTRY_POINT;
 
 /*
  * This would be a good place for weak-linkage declarations of
@@ -667,7 +667,7 @@
         if(gCommonICUDataArray[commonDataIndex] == NULL) {
             int32_t i;
             for(i = 0; i < commonDataIndex; ++i) {
-                if(gCommonICUDataArray[i]->pHeader == &U_ICUDATA_ENTRY_POINT) {
+                if(gCommonICUDataArray[i]->pHeader == &U_ICUDATA_ENTRY_POINT.hdr) {
                     /* The linked-in data is already in the list. */
                     return NULL;
                 }
@@ -686,7 +686,7 @@
                 setCommonICUDataPointer(uprv_getICUData_conversion(), FALSE, pErrorCode);
             }
             */
-            setCommonICUDataPointer(&U_ICUDATA_ENTRY_POINT, FALSE, pErrorCode);
+            setCommonICUDataPointer(&U_ICUDATA_ENTRY_POINT.hdr, FALSE, pErrorCode);
         }
         return gCommonICUDataArray[commonDataIndex];
     }
Index: source/common/ucmndata.h
===================================================================
--- source/common/ucmndata.h	(revision 68397)
+++ source/common/ucmndata.h	(working copy)
@@ -44,6 +44,20 @@
 } DataHeader;
 
 typedef struct {
+    DataHeader hdr;
+    char padding[8];
+    uint32_t count, reserved;
+    /*
+    const struct {
+    const char *const name; 
+    const void *const data;
+    } toc[1];
+    */
+   int   fakeNameAndData[4];       /* TODO:  Change this header type from */
+                                   /*        pointerTOC to OffsetTOC.     */
+} ICU_Data_Header;
+
+typedef struct {
     uint32_t nameOffset;
     uint32_t dataOffset;
 } UDataOffsetTOCEntry;
Index: source/stubdata/stubdata.c
===================================================================
--- source/stubdata/stubdata.c	(revision 68397)
+++ source/stubdata/stubdata.c	(working copy)
@@ -20,45 +20,34 @@
 #include "unicode/utypes.h"
 #include "unicode/udata.h"
 #include "unicode/uversion.h"
+#include "ucmndata.h"
 
 
-typedef struct {
-    uint16_t headerSize;
-    uint8_t magic1, magic2;
-    UDataInfo info;
-    char padding[8];
-    uint32_t count, reserved;
-    /*
-    const struct {
-    const char *const name; 
-    const void *const data;
-    } toc[1];
-    */
-   int   fakeNameAndData[4];       /* TODO:  Change this header type from */
-                                   /*        pointerTOC to OffsetTOC.     */
-} ICU_Data_Header;
-
 U_EXPORT const ICU_Data_Header U_ICUDATA_ENTRY_POINT = {
-    32,          /* headerSize */
-    0xda,        /* magic1,  (see struct MappedData in udata.c)  */
-    0x27,        /* magic2     */
-    {            /*UDataInfo   */
-        sizeof(UDataInfo),      /* size        */
-        0,                      /* reserved    */
+    {            /* DataHeader */
+        {            /* MappedData */
+            32,          /* headerSize */
+            0xda,        /* magic1,  (see struct MappedData in udata.c)  */
+            0x27,        /* magic2     */
+        },
+        {            /*UDataInfo   */
+            sizeof(UDataInfo),      /* size        */
+            0,                      /* reserved    */
 
 #if U_IS_BIG_ENDIAN
-        1,
+            1,
 #else
-        0,
+            0,
 #endif
 
-        U_CHARSET_FAMILY,
-        sizeof(UChar),   
-        0,               /* reserved      */
-        {                /* data format identifier */
-           0x54, 0x6f, 0x43, 0x50}, /* "ToCP" */
-           {1, 0, 0, 0},   /* format version major, minor, milli, micro */
-           {0, 0, 0, 0}    /* dataVersion   */
+            U_CHARSET_FAMILY,
+            sizeof(UChar),   
+            0,               /* reserved      */
+            {                /* data format identifier */
+               0x54, 0x6f, 0x43, 0x50}, /* "ToCP" */
+               {1, 0, 0, 0},   /* format version major, minor, milli, micro */
+               {0, 0, 0, 0}    /* dataVersion   */
+        },
     },
     {0,0,0,0,0,0,0,0},  /* Padding[8]   */ 
     0,                  /* count        */
