diff -Naur --exclude=CVS ORBit2/src/orb/orb-core/allocators.c ORBit2.patched/src/orb/orb-core/allocators.c
--- ORBit2/src/orb/orb-core/allocators.c	2003-07-07 09:11:31.000000000 -0400
+++ ORBit2.patched/src/orb/orb-core/allocators.c	2004-06-17 13:13:07.563883105 -0400
@@ -59,6 +59,7 @@
 	}
 	case CORBA_tk_except:
 	case CORBA_tk_struct:
+		mem = ALIGN_ADDRESS (mem, tc->c_align);
 		for (i = 0; i < tc->sub_parts; i++) {
 			subtc = tc->subtypes [i];
 			mem = ALIGN_ADDRESS (mem, subtc->c_align);
diff -Naur --exclude=CVS ORBit2/src/orb/orb-core/corba-any.c ORBit2.patched/src/orb/orb-core/corba-any.c
--- ORBit2/src/orb/orb-core/corba-any.c	2004-01-16 08:56:12.000000000 -0500
+++ ORBit2.patched/src/orb/orb-core/corba-any.c	2004-06-17 13:13:07.565882999 -0400
@@ -102,6 +102,7 @@
 		     CORBA_TypeCode  tc)
 {
 	CORBA_unsigned_long i, ulval;
+	CORBA_TypeCode      subtc;
 	gconstpointer       subval;
 
 	SKIP_ALIAS (tc);
@@ -168,12 +169,14 @@
 	case CORBA_tk_except:
 	case CORBA_tk_struct:
 		*val = ALIGN_ADDRESS (*val, tc->c_align);
-		for (i = 0; i < tc->sub_parts; i++)
-			ORBit_marshal_value (buf, val, tc->subtypes[i]);
+		for (i = 0; i < tc->sub_parts; i++) {
+			subtc = tc->subtypes[i];
+			*val = ALIGN_ADDRESS (*val, subtc->c_align);
+			ORBit_marshal_value (buf, val, subtc);
+		}
 		break;
 	case CORBA_tk_union: {
 		gconstpointer	discrim, body;
-		CORBA_TypeCode 	subtc;
 		int             sz = 0;
 
 		discrim = *val = ALIGN_ADDRESS (*val, MAX (tc->discriminator->c_align, tc->c_align));
@@ -388,6 +391,7 @@
 		       CORBA_ORB       orb)
 {
 	CORBA_long i;
+	CORBA_TypeCode subtc;
 
 	SKIP_ALIAS (tc);
 
@@ -551,12 +555,13 @@
 	case CORBA_tk_struct:
 		*val = ALIGN_ADDRESS (*val, tc->c_align);
 		for (i = 0; i < tc->sub_parts; i++) {
-			if (ORBit_demarshal_value (tc->subtypes[i], val, buf, orb))
+			subtc = tc->subtypes[i];
+			*val = ALIGN_ADDRESS (*val, subtc->c_align);
+			if (ORBit_demarshal_value (subtc, val, buf, orb))
 				return TRUE;
 		}
 		break;
 	case CORBA_tk_union: {
-		CORBA_TypeCode  subtc;
 		gpointer        discrim;
 		gpointer        body;
 		int	        sz = 0;
@@ -832,12 +837,19 @@
 		*newval = ((guchar *)*newval) + sizeof (CORBA_Object);
 		break;
 	case CORBA_tk_struct:
-	case CORBA_tk_except:
+	case CORBA_tk_except: {
+		CORBA_TypeCode subtc;
+
 		*val = ALIGN_ADDRESS (*val, tc->c_align);
 		*newval = ALIGN_ADDRESS (*newval, tc->c_align);
-		for (i = 0; i < tc->sub_parts; i++)
-			ORBit_copy_value_core (val, newval, tc->subtypes[i]);
+		for (i = 0; i < tc->sub_parts; i++) {
+			subtc = tc->subtypes[i];
+			*val = ALIGN_ADDRESS (*val, subtc->c_align);
+			*newval = ALIGN_ADDRESS (*newval, subtc->c_align);
+			ORBit_copy_value_core (val, newval, subtc);
+		}
 		break;
+	}
 	case CORBA_tk_union: {
 		CORBA_TypeCode utc;
 		gint	       union_align = tc->c_align;
@@ -1021,14 +1033,18 @@
 	case CORBA_tk_struct:
 	case CORBA_tk_except: {
 		int i;
+		CORBA_TypeCode subtc;
 
 		*a = ALIGN_ADDRESS (*a, tc->c_align);
 		*b = ALIGN_ADDRESS (*b, tc->c_align);
 
-		for (i = 0; i < tc->sub_parts; i++)
-			if (!ORBit_value_equivalent (a, b, tc->subtypes [i], ev))
+		for (i = 0; i < tc->sub_parts; i++) {
+			subtc = tc->subtypes[i];
+			*a = ALIGN_ADDRESS (*a, subtc->c_align);
+			*b = ALIGN_ADDRESS (*b, subtc->c_align);
+			if (!ORBit_value_equivalent (a, b, subtc, ev))
 				return FALSE;
-
+		}
 		return TRUE;
 	}
 
