diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs
index 69edf35a..9ef0392c 100644
--- a/src/Generator/Driver.cs
+++ b/src/Generator/Driver.cs
@@ -246,8 +246,8 @@ namespace CppSharp
 
             Generator.SetupPasses();
 
-            TranslationUnitPasses.AddPass(new CleanInvalidDeclNamesPass());
             TranslationUnitPasses.AddPass(new FlattenAnonymousTypesToFields());
+            TranslationUnitPasses.AddPass(new CleanInvalidDeclNamesPass());
             TranslationUnitPasses.AddPass(new FieldToPropertyPass());
             TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
             TranslationUnitPasses.AddPass(new CheckFlagEnumsPass());
diff --git a/src/Generator/Passes/FlattenAnonymousTypesToFields.cs b/src/Generator/Passes/FlattenAnonymousTypesToFields.cs
index e7164ad0..964cb710 100644
--- a/src/Generator/Passes/FlattenAnonymousTypesToFields.cs
+++ b/src/Generator/Passes/FlattenAnonymousTypesToFields.cs
@@ -43,7 +43,23 @@ namespace CppSharp.Passes
                     continue;
 
                 ReplaceField(@class, i, fieldType);
-                ReplaceLayoutField(@class, field, fieldType);
+                fieldType.Fields.Clear();
+                fieldType.ExplicitlyIgnore();
+            }
+
+            if (@class.Layout == null)
+                return true;
+
+            for (int i = @class.Layout.Fields.Count - 1; i >= 0; i--)
+            {
+                LayoutField field = @class.Layout.Fields[i];
+                Class fieldType;
+                if (!string.IsNullOrEmpty(field.Name) ||
+                    !field.QualifiedType.Type.Desugar().TryGetClass(out fieldType) ||
+                    !string.IsNullOrEmpty(fieldType.OriginalName))
+                    continue;
+                
+                ReplaceLayoutField(@class, i, fieldType);
                 fieldType.Fields.Clear();
                 fieldType.ExplicitlyIgnore();
             }
@@ -63,18 +79,23 @@ namespace CppSharp.Passes
             }
         }
 
-        private static void ReplaceLayoutField(Class @class, Field field, Class fieldType)
+        private static void ReplaceLayoutField(Class @class, int i, Class fieldType)
         {
-            LayoutField layoutField = @class.Layout.Fields.Find(
-                                f => f.FieldPtr == field.OriginalPtr);
-            int layoutIndex = @class.Layout.Fields.IndexOf(layoutField);
-            @class.Layout.Fields.RemoveAt(layoutIndex);
+            uint offset = @class.Layout.Fields[i].Offset;
+            @class.Layout.Fields.RemoveAt(i);
 
             for (int j = 0; j < fieldType.Layout.Fields.Count; j++)
             {
-                LayoutField nestedlayoutField = fieldType.Layout.Fields[j];
-                nestedlayoutField.Offset += layoutField.Offset;
-                @class.Layout.Fields.Insert(layoutIndex + j, nestedlayoutField);
+                LayoutField nestedLayoutField = fieldType.Layout.Fields[j];
+                var layoutField = new LayoutField
+                    {
+                        Expression = nestedLayoutField.Expression,
+                        FieldPtr = nestedLayoutField.FieldPtr,
+                        Name = nestedLayoutField.Name,
+                        Offset = nestedLayoutField.Offset + offset,
+                        QualifiedType = nestedLayoutField.QualifiedType
+                    };
+                @class.Layout.Fields.Insert(i + j, layoutField);
             }
         }
     }
diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs
index ba751d46..e3137c5f 100644
--- a/tests/CSharp/CSharp.Tests.cs
+++ b/tests/CSharp/CSharp.Tests.cs
@@ -142,7 +142,11 @@ public unsafe class CSharpTests : GeneratorTestFixture
             Assert.That(baz.TakesQux(baz), Is.EqualTo(20));
             Assert.That(baz.ReturnQux().FarAwayFunc, Is.EqualTo(20));
             baz.SetMethod(1);
-            Assert.AreEqual(5, baz.P);
+            Assert.That(baz.P, Is.EqualTo(5));
+            baz.PublicDouble = 1.5;
+            Assert.That(baz.PublicDouble, Is.EqualTo(1.5));
+            baz.PublicInt = 15;
+            Assert.That(baz.PublicInt, Is.EqualTo(15));
         }
     }
 
diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h
index 99b28b04..4e73f2fb 100644
--- a/tests/CSharp/CSharp.h
+++ b/tests/CSharp/CSharp.h
@@ -104,6 +104,11 @@ public:
     Foo foos[4];
     int getIndex();
     void setIndex(int value);
+    union
+    {
+        int publicInt;
+        double publicDouble;
+    };
 
 private:
     int index;