diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs
index b79790b8..349a6980 100644
--- a/src/Generator/Driver.cs
+++ b/src/Generator/Driver.cs
@@ -221,6 +221,8 @@ namespace CppSharp
                 TranslationUnitPasses.AddPass(new EqualiseAccessOfOverrideAndBasePass());
 
             TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
+            TranslationUnitPasses.AddPass(new FlattenAnonymousTypesToFields());
+            TranslationUnitPasses.AddPass(new MarkUsedClassInternalsPass());
 
             if (Options.IsCSharpGenerator)
             {
@@ -260,7 +262,6 @@ namespace CppSharp
 
             Generator.SetupPasses();
 
-            TranslationUnitPasses.AddPass(new FlattenAnonymousTypesToFields());
             TranslationUnitPasses.AddPass(new CleanInvalidDeclNamesPass());
             TranslationUnitPasses.AddPass(new FastDelegateToDelegatesPass());
             TranslationUnitPasses.AddPass(new FieldToPropertyPass());
@@ -290,8 +291,6 @@ namespace CppSharp
 
             TranslationUnitPasses.AddPass(new CheckDuplicatedNamesPass());
 
-            TranslationUnitPasses.AddPass(new MarkUsedClassInternalsPass());
-
             if (Options.IsCLIGenerator || Options.IsCSharpGenerator)
             {
                 TranslationUnitPasses.RenameDeclsUpperCase(RenameTargets.Any & ~RenameTargets.Parameter);
diff --git a/src/Generator/Generators/CSharp/CSharpSourcesExtensions.cs b/src/Generator/Generators/CSharp/CSharpSourcesExtensions.cs
index b122c0ea..d3cd5d70 100644
--- a/src/Generator/Generators/CSharp/CSharpSourcesExtensions.cs
+++ b/src/Generator/Generators/CSharp/CSharpSourcesExtensions.cs
@@ -41,6 +41,7 @@ namespace CppSharp.Generators.CSharp
             static bool allPointers(TemplateArgument a) => a.Type.Type?.Desugar().IsAddress() == true;
             var groups = (from @class in specializations
                           let spec = @class.GetParentSpecialization()
+                          where !spec.Ignore
                           orderby spec.IsGenerated descending
                           group @class by spec.Arguments.All(allPointers)
                           into @group
diff --git a/src/Generator/Passes/CheckIgnoredDecls.cs b/src/Generator/Passes/CheckIgnoredDecls.cs
index 9d5d3c6d..806988fb 100644
--- a/src/Generator/Passes/CheckIgnoredDecls.cs
+++ b/src/Generator/Passes/CheckIgnoredDecls.cs
@@ -51,10 +51,12 @@ namespace CppSharp.Passes
             if (!base.VisitClassTemplateSpecializationDecl(specialization))
                 return false;
 
+            if (specialization.GenerationKind == GenerationKind.Internal)
+                return false;
+
             TypeMap typeMap;
             if (!Options.GenerateClassTemplates &&
                 !specialization.IsExplicitlyGenerated &&
-                specialization.GenerationKind != GenerationKind.Internal &&
                 !Context.TypeMaps.FindTypeMap(specialization, out typeMap))
             {
                 specialization.ExplicitlyIgnore();
@@ -594,7 +596,8 @@ namespace CppSharp.Passes
                 else if (specialization.GenerationKind != GenerationKind.Internal)
                     specialization.ExplicitlyIgnore();
 
-            if (!hasExplicitlyGeneratedSpecializations)
+            if (!hasExplicitlyGeneratedSpecializations &&
+                @class.GenerationKind != GenerationKind.Internal)
                 @class.ExplicitlyIgnore();
         }
 
diff --git a/src/Generator/Passes/TrimSpecializationsPass.cs b/src/Generator/Passes/TrimSpecializationsPass.cs
index 22f71839..680dd42a 100644
--- a/src/Generator/Passes/TrimSpecializationsPass.cs
+++ b/src/Generator/Passes/TrimSpecializationsPass.cs
@@ -151,6 +151,10 @@ namespace CppSharp.Passes
             for (int i = template.Specializations.Count - 1; i >= 0; i--)
             {
                 var specialization = template.Specializations[i];
+                if (specialization.Ignore)
+                {
+                    continue;
+                }
                 var modules = (from arg in specialization.Arguments
                                where arg.Type.Type != null
                                    && ASTUtils.IsTypeExternal(