diff --git a/src/AST/ASTVisitor.cs b/src/AST/ASTVisitor.cs
index a29a93ec..9e6c2756 100644
--- a/src/AST/ASTVisitor.cs
+++ b/src/AST/ASTVisitor.cs
@@ -21,7 +21,7 @@ namespace CppSharp.AST
     public enum VisitFlags
     {
         /// <summary>
-        /// We always visit classes, functions and declaration contexts.
+        /// We always visit declaration contexts.
         /// </summary>
         Default = 0,
 
@@ -37,6 +37,8 @@ namespace CppSharp.AST
         NamespaceTypedefs = 1 << 8,
         NamespaceEvents = 1 << 9,
         NamespaceVariables = 1 << 10,
+        NamespaceClasses = 1 << 15,
+        NamespaceFunctions = 1 << 16,
 
         FunctionReturnType = 1 << 11,
         FunctionParameters = 1 << 12,
@@ -46,7 +48,7 @@ namespace CppSharp.AST
         Any = ClassBases | ClassFields | ClassProperties | ClassMethods |
             ClassTemplateSpecializations | PropertyAccessors |
             NamespaceEnums | NamespaceTemplates | NamespaceTypedefs |
-            NamespaceEvents | NamespaceVariables |
+            NamespaceEvents | NamespaceVariables | NamespaceClasses | NamespaceFunctions |
             FunctionReturnType | FunctionParameters |
             EventParameters | TemplateArguments
     }
@@ -63,7 +65,9 @@ namespace CppSharp.AST
         public bool VisitClassTemplateSpecializations => (flags & VisitFlags.ClassTemplateSpecializations) != 0;
         public bool VisitPropertyAccessors => (flags & VisitFlags.PropertyAccessors) != 0;
 
+        public bool VisitNamespaceClasses => (flags & VisitFlags.NamespaceClasses) != 0;
         public bool VisitNamespaceEnums => (flags & VisitFlags.NamespaceEnums) != 0;
+        public bool VisitNamespaceFunctions => (flags & VisitFlags.NamespaceFunctions) != 0;
         public bool VisitNamespaceTemplates => (flags & VisitFlags.NamespaceTemplates) != 0;
         public bool VisitNamespaceTypedefs => (flags & VisitFlags.NamespaceTypedefs) != 0;
         public bool VisitNamespaceEvents => (flags & VisitFlags.NamespaceEvents) != 0;
diff --git a/src/Generator/Generators/CodeGenerator.cs b/src/Generator/Generators/CodeGenerator.cs
index cdda1194..083b83e8 100644
--- a/src/Generator/Generators/CodeGenerator.cs
+++ b/src/Generator/Generators/CodeGenerator.cs
@@ -262,12 +262,27 @@ namespace CppSharp.Generators
         {
             foreach (var decl in context.Declarations)
             {
-                if (decl is Function) continue;
+                if (decl is Function)
+                    continue;
+
+                if (decl is Class && !VisitOptions.VisitNamespaceClasses)
+                    continue;
+
+                if (decl is Enumeration && !VisitOptions.VisitNamespaceEnums)
+                    continue;
+
+                if (decl is Event && !VisitOptions.VisitNamespaceEvents)
+                    continue;
+
+                if (decl is Variable && !VisitOptions.VisitNamespaceVariables)
+                    continue;
+
                 if (decl.IsGenerated)
                     decl.Visit(this);
             }
 
-            VisitDeclContextFunctions(context);
+            if (VisitOptions.VisitNamespaceFunctions)
+                VisitDeclContextFunctions(context);
 
             return true;
         }
@@ -304,25 +319,6 @@ namespace CppSharp.Generators
             VisitClassConstructors(@class);
             VisitClassMethods(@class);
 
-            foreach (var @event in @class.Events)
-            {
-                if (!@event.IsGenerated)
-                    continue;
-
-                @event.Visit(this);
-            }
-
-            foreach (var variable in @class.Variables)
-            {
-                if (!variable.IsGenerated)
-                    continue;
-
-                if (variable.Access != AccessSpecifier.Public)
-                    continue;
-
-                variable.Visit(this);
-            }
-
             return true;
         }