diff --git a/src/CodeGenerator/CodeGenerator.csproj b/src/CodeGenerator/CodeGenerator.csproj
index 693bb04a..0781663c 100644
--- a/src/CodeGenerator/CodeGenerator.csproj
+++ b/src/CodeGenerator/CodeGenerator.csproj
@@ -24,6 +24,7 @@
   
 
   
-    
+    
+    
   
 
diff --git a/src/CodeGenerator/ImguiDefinitions.cs b/src/CodeGenerator/ImguiDefinitions.cs
index 23edaee5..337f8d0b 100644
--- a/src/CodeGenerator/ImguiDefinitions.cs
+++ b/src/CodeGenerator/ImguiDefinitions.cs
@@ -22,7 +22,7 @@ static int GetInt(JToken token, string key)
             if (v == null) return 0;
             return v.ToObject();
         }
-        public void LoadFrom(string directory)
+        public void LoadFrom(string directory, bool useInternals = false)
         {
             
             JObject typesJson;
@@ -66,23 +66,27 @@ public void LoadFrom(string directory)
             {
                 JProperty jp = (JProperty)jt;
                 string name = jp.Name;
-                if (typeLocations?[jp.Name]?.Value().Contains("internal") ?? false) {
+                bool isInternal = typeLocations?[jp.Name]?.Value().Contains("internal") ?? false;
+
+                if (!useInternals && isInternal)
                     return null;
-                }
+
                 EnumMember[] elements = jp.Values().Select(v =>
                 {
                     return new EnumMember(v["name"].ToString(), v["calc_value"].ToString());
                 }).ToArray();
-                return new EnumDefinition(name, elements);
+                return new EnumDefinition(name, elements, isInternal);
             }).Where(x => x != null).ToArray();
 
             Types = typesJson["structs"].Select(jt =>
             {
                 JProperty jp = (JProperty)jt;
                 string name = jp.Name;
-                if (typeLocations?[jp.Name]?.Value().Contains("internal") ?? false) {
+                bool isInternal = typeLocations?[jp.Name]?.Value().Contains("internal") ?? false;
+
+                if (!useInternals && isInternal)
                     return null;
-                }
+
                 TypeReference[] fields = jp.Values().Select(v =>
                 {
                     if (v["type"].ToString().Contains("static")) { return null; }
@@ -95,7 +99,7 @@ public void LoadFrom(string directory)
                         v["template_type"]?.ToString(),
                         Enums);
                 }).Where(tr => tr != null).ToArray();
-                return new TypeDefinition(name, fields);
+                return new TypeDefinition(name, fields, isInternal);
             }).Where(x => x != null).ToArray();
 
             Functions = functionsJson.Children().Select(jt =>
@@ -112,16 +116,22 @@ public void LoadFrom(string directory)
                     {
                         friendlyName = "Destroy";
                     }
-                    //skip internal functions
+                    // Hunt for internal and react
+                    bool isInternal = val["location"]?.ToString().Contains("internal") ?? false;
                     var typename = val["stname"]?.ToString();
                     if (!string.IsNullOrEmpty(typename))
                     {
-                        if (!Types.Any(x => x.Name == val["stname"]?.ToString())) {
+                        TypeDefinition foundType = Types.FirstOrDefault(x => x.Name == val["stname"]?.ToString());
+
+                        if (foundType != null)
+                            isInternal = foundType.IsInternal;
+                        else
                             return null;
-                        }
                     }
                     if (friendlyName == null) { return null; }
-                    if (val["location"]?.ToString().Contains("internal") ?? false) return null;
+
+                    if (!useInternals && isInternal)
+                        return null;
 
                     string exportedName = ov_cimguiname;
                     if (exportedName == null)
@@ -185,7 +195,8 @@ public void LoadFrom(string directory)
                         structName,
                         comment,
                         isConstructor,
-                        isDestructor);
+                        isDestructor,
+                        isInternal);
                 }).Where(od => od != null).ToArray();
                 if(overloads.Length == 0) return null;
                 return new FunctionDefinition(name, overloads, Enums);
@@ -232,8 +243,9 @@ class EnumDefinition
         public string[] Names { get; }
         public string[] FriendlyNames { get; }
         public EnumMember[] Members { get; }
+        public bool IsInternal { get; }
 
-        public EnumDefinition(string name, EnumMember[] elements)
+        public EnumDefinition(string name, EnumMember[] elements, bool isInternal)
         {
             if (TypeInfo.AlternateEnumPrefixes.TryGetValue(name, out string altName))
             {
@@ -265,6 +277,7 @@ public EnumDefinition(string name, EnumMember[] elements)
             {
                 _sanitizedNames.Add(el.Name, SanitizeMemberName(el.Name));
             }
+            IsInternal = isInternal;
         }
 
         public string SanitizeNames(string text)
@@ -336,11 +349,13 @@ class TypeDefinition
     {
         public string Name { get; }
         public TypeReference[] Fields { get; }
+        public bool IsInternal { get; }
 
-        public TypeDefinition(string name, TypeReference[] fields)
+        public TypeDefinition(string name, TypeReference[] fields, bool isInternal)
         {
             Name = name;
             Fields = fields;
+            IsInternal = isInternal;
         }
     }
 
@@ -530,6 +545,7 @@ class OverloadDefinition
         public string Comment { get; }
         public bool IsConstructor { get; }
         public bool IsDestructor { get; }
+        public bool IsInternal { get; }
 
         public OverloadDefinition(
             string exportedName,
@@ -540,7 +556,8 @@ public OverloadDefinition(
             string structName,
             string comment,
             bool isConstructor,
-            bool isDestructor)
+            bool isDestructor,
+            bool isInternal)
         {
             ExportedName = exportedName;
             FriendlyName = friendlyName;
@@ -552,11 +569,12 @@ public OverloadDefinition(
             Comment = comment;
             IsConstructor = isConstructor;
             IsDestructor = isDestructor;
+            IsInternal = isInternal;
         }
 
         public OverloadDefinition WithParameters(TypeReference[] parameters)
         {
-            return new OverloadDefinition(ExportedName, FriendlyName, parameters, DefaultValues, ReturnType, StructName, Comment, IsConstructor, IsDestructor);
+            return new OverloadDefinition(ExportedName, FriendlyName, parameters, DefaultValues, ReturnType, StructName, Comment, IsConstructor, IsDestructor, IsInternal);
         }
     }
 }
diff --git a/src/CodeGenerator/Program.cs b/src/CodeGenerator/Program.cs
index 8597a718..1645bd4d 100644
--- a/src/CodeGenerator/Program.cs
+++ b/src/CodeGenerator/Program.cs
@@ -8,37 +8,85 @@
 using System.Text;
 using System.Text.RegularExpressions;
 using System.Threading.Tasks;
+using System.CommandLine;
 
 namespace CodeGenerator
 {
     internal static class Program
     {
-        static void Main(string[] args)
+        private const string InternalNamespace = ".Internal";
+
+        static async Task Main(string[] args)
         {
-            string outputPath;
-            if (args.Length > 0)
+            // internal vars for command line results used by the rest of the program.
+            bool runApp = false;
+            string outputPath = string.Empty;
+            string outputPathInternal = string.Empty;
+            string libraryName = string.Empty;
+            bool useInternals = false;
+
+            #region Command line handler
+            var optionOutputPath = new Option(
+                                        aliases: new[] { "--outputDir", "-o" },
+                                        description: "The directory to place generated code files.",
+                                        parseArgument: result =>
+                                        {
+                                            if (result.Tokens.Count == 0)
+                                                return Directory.CreateDirectory(Path.Combine(AppContext.BaseDirectory, "Generated"));
+
+                                            string value = result.Tokens.Single().Value;
+
+                                            try { return Directory.CreateDirectory(value); }
+                                            catch (Exception) { result.ErrorMessage = $"Unable to create directory: {value}"; return null; }
+                                        },
+                                        isDefault: true);
+
+            var optionLibraryname = new Option(
+                                        aliases: new[] { "--library", "-l" },
+                                        description: "The library to read parse.",
+                                        getDefaultValue: () => "cimgui")
+                                            .FromAmong("cimgui", "cimplot", "cimnodes", "cimguizmo");
+
+            var optionInternal = new Option(
+                                        name: "--internal",
+                                        description: "When set to true, includes the internal header file.",
+                                        parseArgument: result =>
+                                        {
+                                            // Using parse with isDefault: false, instead of the normal validation, allows us to use "--internal" without specifying true to mean true.
+                                            if (result.Tokens.Count == 0)
+                                                return true;
+
+                                            if (bool.TryParse(result.Tokens.Single().Value, out var value))
+                                                return value;
+
+                                            result.ErrorMessage = "Invalid option for --internal. Value must be true or false.";
+                                            return false; // ignored because of error message.
+                                        },
+                                        isDefault: false);
+
+            var rootCommand = new RootCommand("Generates code for the ImGui.NET libraries based on the cimgui definition files.");
+
+            rootCommand.AddOption(optionInternal);
+            rootCommand.AddOption(optionOutputPath);
+            rootCommand.AddOption(optionLibraryname);
+
+            rootCommand.SetHandler((outputPathValue, libNameValue, useInternalValue) =>
             {
-                outputPath = args[0];
-            }
-            else
-            {
-                outputPath = AppContext.BaseDirectory;
-            }
+                outputPath = outputPathValue.FullName;
+                outputPathInternal = Path.Combine(outputPath, "Internal");
+                libraryName = libNameValue;
+                useInternals = useInternalValue;
 
-            if (!Directory.Exists(outputPath))
-            {
-                Directory.CreateDirectory(outputPath);
-            }
+                runApp = true;
 
-            string libraryName;
-            if (args.Length > 1)
-            {
-                libraryName = args[1];
-            }
-            else
-            {
-                libraryName = "cimgui";
-            }
+            }, optionOutputPath, optionLibraryname, optionInternal);
+
+            var commandResult = await rootCommand.InvokeAsync(args);
+
+            if (!runApp)
+                return commandResult;
+
+            #endregion
 
             string projectNamespace = libraryName switch
             {
@@ -78,15 +126,22 @@ static void Main(string[] args)
             
             string definitionsPath = Path.Combine(AppContext.BaseDirectory, "definitions", libraryName);
             var defs = new ImguiDefinitions();
-            defs.LoadFrom(definitionsPath);
+            defs.LoadFrom(definitionsPath, useInternals);
 
+            // Directory should be created by the optionOutputPath command parser
             Console.WriteLine($"Outputting generated code files to {outputPath}.");
+            
+            if (useInternals)
+            {
+                Console.WriteLine($"Outputting internals generated code files to {outputPathInternal}.");
+                Directory.CreateDirectory(outputPathInternal);
+            }
 
             foreach (EnumDefinition ed in defs.Enums)
             {
-                using (CSharpCodeWriter writer = new CSharpCodeWriter(Path.Combine(outputPath, ed.FriendlyNames[0] + ".gen.cs")))
+                using (CSharpCodeWriter writer = new CSharpCodeWriter(Path.Combine(GetOutputPath(ed.IsInternal), ed.FriendlyNames[0] + ".gen.cs")))
                 {
-                    writer.PushBlock($"namespace {projectNamespace}");
+                    writer.PushBlock($"namespace {projectNamespace}{(ed.IsInternal ? InternalNamespace : string.Empty)}");
                     if (ed.FriendlyNames[0].Contains("Flags"))
                     {
                         writer.WriteLine("[System.Flags]");
@@ -107,7 +162,7 @@ static void Main(string[] args)
             {
                 if (TypeInfo.CustomDefinedTypes.Contains(td.Name)) { continue; }
 
-                using (CSharpCodeWriter writer = new CSharpCodeWriter(Path.Combine(outputPath, td.Name + ".gen.cs")))
+                using (CSharpCodeWriter writer = new CSharpCodeWriter(Path.Combine(GetOutputPath(td.IsInternal), td.Name + ".gen.cs")))
                 {
                     writer.Using("System");
                     writer.Using("System.Numerics");
@@ -118,7 +173,7 @@ static void Main(string[] args)
                         writer.Using("ImGuiNET");
                     }
                     writer.WriteLine(string.Empty);
-                    writer.PushBlock($"namespace {projectNamespace}");
+                    writer.PushBlock($"namespace {projectNamespace}{(td.IsInternal ? InternalNamespace : string.Empty)}");
 
                     writer.PushBlock($"public unsafe partial struct {td.Name}");
                     foreach (TypeReference field in td.Fields)
@@ -160,6 +215,8 @@ static void Main(string[] args)
                         string typeStr = GetTypeString(field.Type, field.IsFunctionPointer);
                         string rawType = typeStr;
 
+                        if (TypeInfo.SkippedMembers.Contains($"{ptrTypeName}.{field.Name}")) { continue; }
+
                         if (TypeInfo.WellKnownFieldReplacements.TryGetValue(field.Type, out string wellKnownFieldType))
                         {
                             typeStr = wellKnownFieldType;
@@ -168,7 +225,22 @@ static void Main(string[] args)
                         if (field.ArraySize != 0)
                         {
                             string addrTarget = TypeInfo.LegalFixedTypes.Contains(rawType) ? $"NativePtr->{field.Name}" : $"&NativePtr->{field.Name}_0";
-                            writer.WriteLine($"public RangeAccessor<{typeStr}> {field.Name} => new RangeAccessor<{typeStr}>({addrTarget}, {field.ArraySize});");
+                            if (typeStr.Contains("*"))
+                            {
+                                if (GetWrappedType(typeStr, out string wrappedTypeName))
+                                {
+                                    writer.WriteLine($"public RangeAccessor<{wrappedTypeName}> {field.Name} => new RangeAccessor<{wrappedTypeName}>({addrTarget}, {field.ArraySize});");
+                                }
+                                
+                                // Try best to hit the primitive pointers
+                                else if (TypeInfo.LegalFixedTypes.Contains(typeStr[0..^1]))
+                                    writer.WriteLine($"public RangeAccessor<{typeStr[0..^1]}> {field.Name} => new RangeAccessor<{typeStr[0..^1]}>({addrTarget}, {field.ArraySize});");
+                                
+                                else
+                                    throw new Exception("Expected to wrap type, but wrapped type not found");
+                            }
+                            else
+                                writer.WriteLine($"public RangeAccessor<{typeStr}> {field.Name} => new RangeAccessor<{typeStr}>({addrTarget}, {field.ArraySize});");
                         }
                         else if (typeStr.Contains("ImVector"))
                         {
@@ -275,6 +347,7 @@ static void Main(string[] args)
                 }
             }
 
+            // Root ImGuiNative declarations - NonInternal
             using (CSharpCodeWriter writer = new CSharpCodeWriter(Path.Combine(outputPath, $"{classPrefix}Native.gen.cs")))
             {
                 writer.Using("System");
@@ -287,10 +360,41 @@ static void Main(string[] args)
                 writer.WriteLine(string.Empty);
                 writer.PushBlock($"namespace {projectNamespace}");
                 writer.PushBlock($"public static unsafe partial class {classPrefix}Native");
+                EmitImGuiNativeFunctions(writer, false);
+                writer.PopBlock();
+                writer.PopBlock();
+            }
+
+            // Root ImGuiNative declarations - Internal
+            if (useInternals)
+            {
+                using (CSharpCodeWriter writer = new CSharpCodeWriter(Path.Combine(outputPathInternal, $"{classPrefix}Native.gen.cs")))
+                {
+                    writer.Using("System");
+                    writer.Using("System.Numerics");
+                    writer.Using("System.Runtime.InteropServices");
+                    if (referencesImGui)
+                    {
+                        writer.Using("ImGuiNET");
+                    }
+                    writer.Using($"{projectNamespace}{InternalNamespace}");
+                    writer.WriteLine(string.Empty);
+                    writer.PushBlock($"namespace {projectNamespace}");
+                    writer.PushBlock($"public static unsafe partial class {classPrefix}Native");
+                    EmitImGuiNativeFunctions(writer, true);
+                    writer.PopBlock();
+                    writer.PopBlock();
+                }
+            }
+
+            // Function referenced by the non-internals and internals when building the appropriate ImGuiNative declarations
+            void EmitImGuiNativeFunctions(CSharpCodeWriter writer, bool isInternal)
+            {
                 foreach (FunctionDefinition fd in defs.Functions)
                 {
                     foreach (OverloadDefinition overload in fd.Overloads)
                     {
+                        if (overload.IsInternal != isInternal) { continue; }
                         string exportedName = overload.ExportedName;
                         if (exportedName.Contains("~")) { continue; }
                         if (exportedName.Contains("ImVector_")) { continue; }
@@ -343,10 +447,9 @@ static void Main(string[] args)
                         writer.WriteLine($"public static extern {ret} {methodName}({parameters});");
                     }
                 }
-                writer.PopBlock();
-                writer.PopBlock();
             }
 
+            // Root ImGui* class items - Noninternal
             using (CSharpCodeWriter writer = new CSharpCodeWriter(Path.Combine(outputPath, $"{classPrefix}.gen.cs")))
             {
                 writer.Using("System");
@@ -360,11 +463,41 @@ static void Main(string[] args)
                 writer.WriteLine(string.Empty);
                 writer.PushBlock($"namespace {projectNamespace}");
                 writer.PushBlock($"public static unsafe partial class {classPrefix}");
+                EmitImGuiFunctions(writer, false);
+                writer.PopBlock();
+                writer.PopBlock();
+            }
+
+            // Root ImGui* class items - Internal
+            if (useInternals)
+            {
+                using (CSharpCodeWriter writer = new CSharpCodeWriter(Path.Combine(outputPathInternal, $"{classPrefix}.gen.cs")))
+                {
+                    writer.Using("System");
+                    writer.Using("System.Numerics");
+                    writer.Using("System.Runtime.InteropServices");
+                    writer.Using("System.Text");
+                    if (referencesImGui)
+                    {
+                        writer.Using("ImGuiNET");
+                    }
+                    writer.WriteLine(string.Empty);
+                    writer.PushBlock($"namespace {projectNamespace}{InternalNamespace}");
+                    writer.PushBlock($"public static unsafe partial class {classPrefix}");
+                    EmitImGuiFunctions(writer, true);
+                    writer.PopBlock();
+                    writer.PopBlock();
+                }
+            }
+
+            // Function referenced by the non-internals and internals when building the appropriate ImGui class
+            void EmitImGuiFunctions(CSharpCodeWriter writer, bool isInternal)
+            {
                 foreach (FunctionDefinition fd in defs.Functions)
                 {
                     if (TypeInfo.SkippedFunctions.Contains(fd.Name)) { continue; }
 
-                    foreach (OverloadDefinition overload in fd.Overloads)
+                    foreach (OverloadDefinition overload in fd.Overloads.Where(o => !o.IsMemberFunction && o.IsInternal == isInternal))
                     {
                         string exportedName = overload.ExportedName;
                         if (exportedName.StartsWith("ig"))
@@ -373,13 +506,14 @@ static void Main(string[] args)
                         }
                         if (exportedName.Contains("~")) { continue; }
                         if (overload.Parameters.Any(tr => tr.Type.Contains('('))) { continue; } // TODO: Parse function pointer parameters.
-                        
+
                         if ((overload.FriendlyName == "GetID" || overload.FriendlyName == "PushID") && overload.Parameters.Length > 1)
                         {
                             // skip ImGui.Get/PushID(start, end) overloads as they would overlap with existing
                             continue;
                         }
 
+
                         bool hasVaList = false;
                         for (int i = 0; i < overload.Parameters.Length; i++)
                         {
@@ -400,7 +534,6 @@ static void Main(string[] args)
 
                         for (int i = overload.DefaultValues.Count; i >= 0; i--)
                         {
-                            if (overload.IsMemberFunction) { continue; }
                             Dictionary defaults = new Dictionary();
                             for (int j = 0; j < i; j++)
                             {
@@ -410,8 +543,6 @@ static void Main(string[] args)
                         }
                     }
                 }
-                writer.PopBlock();
-                writer.PopBlock();
             }
 
             foreach (var method in defs.Variants)
@@ -421,6 +552,14 @@ static void Main(string[] args)
                     if (!variant.Used) Console.WriteLine($"Error: Variants targetting parameter {variant.Name} with type {variant.OriginalType} could not be applied to method {method.Key}.");
                 }
             }
+
+            return 0;
+
+            // Helper to determine the path
+            string GetOutputPath(bool isInternal)
+            {
+                return isInternal ? outputPathInternal : outputPath;
+            }
         }
 
         private static bool IsStringFieldName(string name)
diff --git a/src/CodeGenerator/Properties/launchSettings.json b/src/CodeGenerator/Properties/launchSettings.json
new file mode 100644
index 00000000..fdb2be9e
--- /dev/null
+++ b/src/CodeGenerator/Properties/launchSettings.json
@@ -0,0 +1,36 @@
+{
+  "profiles": {
+    "CodeGenerator - ImGui": {
+      "commandName": "Project",
+      "commandLineArgs": "-o ..\\..\\..\\..\\src\\ImGui.NET\\Generated -l cimgui"
+    },
+    "CodeGenerator - ImPlot": {
+      "commandName": "Project",
+      "commandLineArgs": "-o ..\\..\\..\\..\\src\\ImPlot.NET\\Generated -l cimplot"
+    },
+    "CodeGenerator - ImNodes": {
+      "commandName": "Project",
+      "commandLineArgs": "-o ..\\..\\..\\..\\src\\ImNodes.NET\\Generated -l cimnodes"
+    },
+    "CodeGenerator - ImGuizmo": {
+      "commandName": "Project",
+      "commandLineArgs": "-o ..\\..\\..\\..\\src\\ImGuizmo.NET\\Generated -l cimguizmo"
+    },
+    "CodeGenerator (internal) - ImGui": {
+      "commandName": "Project",
+      "commandLineArgs": "-o ..\\..\\..\\..\\src\\ImGui.NET\\Generated -l cimgui --internal"
+    },
+    "CodeGenerator (internal) - ImPlot": {
+      "commandName": "Project",
+      "commandLineArgs": "-o ..\\..\\..\\..\\src\\ImPlot.NET\\Generated -l cimplot --internal"
+    },
+    "CodeGenerator (internal) - ImNodes": {
+      "commandName": "Project",
+      "commandLineArgs": "-o ..\\..\\..\\..\\src\\ImNodes.NET\\Generated -l cimnodes --internal"
+    },
+    "CodeGenerator (internal) - ImGuizmo": {
+      "commandName": "Project",
+      "commandLineArgs": "-o ..\\..\\..\\..\\src\\ImGuizmo.NET\\Generated -l cimguizmo --internal"
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/CodeGenerator/TypeInfo.cs b/src/CodeGenerator/TypeInfo.cs
index 45c89300..0b4194aa 100644
--- a/src/CodeGenerator/TypeInfo.cs
+++ b/src/CodeGenerator/TypeInfo.cs
@@ -22,6 +22,7 @@ public class TypeInfo
             { "ImS64", "long" },
             { "unsigned short", "ushort" },
             { "unsigned int", "uint" },
+            { "ImVec1", "float" },
             { "ImVec2", "Vector2" },
             { "ImVec2_Simple", "Vector2" },
             { "ImVec3", "Vector3" },
@@ -56,11 +57,25 @@ public class TypeInfo
             { "ImPlotGetter", "IntPtr" },
             { "ImPlotTransform", "IntPtr" },
             { "ImGuiKeyChord", "ImGuiKey" },
+            // internals
+            { "char[5]", "byte*"},
+            { "ImGuiDir*", "IntPtr" },
+            //{ "ImGuiStoragePair", "IntPtr" },
+            { "ImGuiDockRequest", "IntPtr" },
+            { "ImGuiDockNodeSettings", "IntPtr" },
+            { "ImGuiTableColumnIdx", "sbyte" },
+            { "ImGuiTableDrawChannelIdx", "byte"},
+            { "ImGuiContextHookCallback", "IntPtr" },
+            { "ImGuiErrorLogCallback", "IntPtr" },
+            { "ImGuiSelectionUserData", "ulong" },      //ImU64
+            { "ImGuiKeyRoutingIndex", "short" }         //ImS16
+            //{ "ImGuiSizeCallback", "IntPtr"}
         };
         
         public static readonly List WellKnownEnums = new List()
         {
-            "ImGuiMouseButton"
+            "ImGuiMouseButton",
+            "ImGuiDir"
         };
 
         public static readonly Dictionary AlternateEnumPrefixes = new Dictionary()
@@ -70,7 +85,7 @@ public class TypeInfo
 
         public static readonly Dictionary AlternateEnumPrefixSubstitutions = new Dictionary()
         {
-            { "ImGuiMod_", "Mod" },
+            { "ImGuiMod_", "Mod" }
         };
 
         public static readonly Dictionary WellKnownFieldReplacements = new Dictionary()
@@ -81,6 +96,7 @@ public class TypeInfo
         public static readonly HashSet CustomDefinedTypes = new HashSet()
         {
             "ImVector",
+            "ImVec1",
             "ImVec2",
             "ImVec4",
             "ImGuiStoragePair",
@@ -105,10 +121,11 @@ public class TypeInfo
             { "ImPlotPoint(0,0)", "new ImPlotPoint { x = 0, y = 0 }" },
             { "ImPlotPoint(1,1)", "new ImPlotPoint { x = 1, y = 1 }" },
             { "ImDrawCornerFlags_All", "ImDrawCornerFlags.All" },
+            { "ImGuiCond_Once", "ImGuiCond.Once"},
+            { "ImGuiTypingSelectFlags_None", "ImGuiTypingSelectFlags.None" },
             { "ImPlotFlags_None", "ImPlotFlags.None"},
             { "ImPlotAxisFlags_None", "ImPlotAxisFlags.None"},
             { "ImPlotAxisFlags_NoGridLines", "ImPlotAxisFlags.NoGridLines"},
-            { "ImGuiCond_Once", "ImGuiCond.Once"},
             { "ImPlotOrientation_Vertical", "ImPlotOrientation.Vertical"},
             { "PinShape_CircleFilled", "PinShape.CircleFilled"},
             { "ImGuiPopupFlags_None", "ImGuiPopupFlags.None"},
@@ -137,6 +154,7 @@ public class TypeInfo
             { "in", "@in" },
             { "out", "@out" },
             { "ref", "@ref" },
+            { "base", "@base" }
         };
 
         public static readonly HashSet LegalFixedTypes = new HashSet()
@@ -158,7 +176,16 @@ public class TypeInfo
         {
             "igInputText",
             "igInputTextMultiline",
-            "igInputTextWithHint"
+            "igInputTextWithHint",
+        };
+
+        public static readonly HashSet SkippedMembers = new HashSet()
+        {
+            // This can be used to rip members out of internal when you simply want to exclude them.
+            // You must be careful when using this to not mess with data structures that are used
+            // by ImGui
+            // Add an entry for the type.name, such as:
+            // "ImGuiContextPtr.StyleVarStack"
         };
     }
 }
\ No newline at end of file