diff --git a/src/main/java/org/extendj/ragdoc/JsonBuilder.java b/src/main/java/org/extendj/ragdoc/JsonBuilder.java
index 07f98502c9d029c9bfe2c6228d49e9c0072a672c..772c4edd6835e48888e197c9d1b07ee965296b91 100644
--- a/src/main/java/org/extendj/ragdoc/JsonBuilder.java
+++ b/src/main/java/org/extendj/ragdoc/JsonBuilder.java
@@ -78,11 +78,13 @@ public class JsonBuilder {
   private static final String[] MEMBER_KINDS = { "constr", "attr", "rel", "field", "method" };
 
   private final File rootDir;
+  private final boolean excludeGenerated;
   private java.util.List<String> ragRoot = new java.util.LinkedList<>();
   public Map<String, File> sourceFiles = new HashMap<>();
 
-  public JsonBuilder(File rootDir) {
+  public JsonBuilder(File rootDir, boolean excludeGenerated) {
     this.rootDir = rootDir;
+    this.excludeGenerated = excludeGenerated;
     ragRoot = RelativePath.buildPathList(rootDir);
     typenames.add("packages"); // Reserve packages as JSON filename.
   }
@@ -111,6 +113,9 @@ public class JsonBuilder {
       JsonArray array = new JsonArray();
       do {
         ParameterDeclaration param = iter.next();
+        if (matchesGenerated(param.name())) {
+          continue;
+        }
         JsonObject pobj = new JsonObject();
         pobj.add("t", typeRef(param.type()));
         pobj.add("n", param.name());
@@ -135,7 +140,7 @@ public class JsonBuilder {
     JsonObject doc = method.jsonDocObject();
     // System.out.println("" + method.type() + ": " + method + ", kind=" + method.objectKind());
     // System.out.println("`-> doc=" + doc + " doc.get(relation)=" + (doc != null ? doc.get("relation") : "/"));
-    if (shouldDocument(method, doc)) {
+    if (shouldDocument(method, doc) && !matchesGenerated(method.name())) {
       JsonObject obj = new JsonObject();
       obj.add("name", Json.of(method.name()));
       JsonArray modifiers = method.getModifiers().toJson();
@@ -220,6 +225,13 @@ public class JsonBuilder {
         && !typeDecl.isTypeVariable() && typeDecl.compilationUnit().fromSource();
   }
 
+  /**
+   * Check if name contains "_internal_" or "_impl_" and if it should be excluded (based on constructor argument)
+   */
+  private boolean matchesGenerated(String name) {
+    return this.excludeGenerated && (name.contains("_internal_") || name.contains("_impl_") || name.contains("$"));
+  }
+
   // TODO: inner class names.
 
   /**
@@ -255,6 +267,9 @@ public class JsonBuilder {
     JsonObject doc = field.jsonDocObject();
     if (shouldDocument(field, doc)) {
       for (Declarator declarator : field.getDeclaratorList()) {
+        if (!matchesGenerated(declarator.name())) {
+          continue;
+        }
         JsonObject obj = new JsonObject();
         obj.add("name", Json.of(declarator.name()));
         obj.add("type", typeRef(declarator.type()));
@@ -404,13 +419,29 @@ public class JsonBuilder {
           }
           doc.set("astdecl", decl);
           JsonArray array = decl.get("c").array();
+          // objects to keep are non-generated parameters
+          List<JsonObject> objectsToKeep = new ArrayList<>();
+          boolean removeSomeObjects = false;
           for (JsonValue c : array) {
             JsonObject comp = c.object();
+            if (matchesGenerated(comp.get("n").stringValue(""))) {
+              removeSomeObjects = true;
+            } else {
+              objectsToKeep.add(comp);
+            }
             if (!comp.get("e").stringValue("").isEmpty()) {
               comp.set("e",
                   typeRef(safeLookupType(type, stripGenericPart(comp.get("e").stringValue("")))));
             }
           }
+          // recreate the array with only those object to keep
+          if (removeSomeObjects) {
+            array = new JsonArray();
+            for (JsonObject comp : objectsToKeep) {
+              array.add(comp);
+            }
+            decl.set("c", array);
+          }
         } catch (IOException e) {
           e.printStackTrace();
         } catch (JsonParser.SyntaxError syntaxError) {
@@ -439,6 +470,10 @@ public class JsonBuilder {
     return obj;
   }
 
+  private void excludeGeneratedFromProduction(JsonObject decl) {
+
+  }
+
   private TypeDecl safeLookupType(TypeDecl parent, String name) {
     SimpleSet<TypeDecl> types = parent.lookupType(name);
     if (types.isEmpty()) {
diff --git a/src/main/java/org/extendj/ragdoc/RagDocBuilder.java b/src/main/java/org/extendj/ragdoc/RagDocBuilder.java
index bef16cd9a0b12f426b232a597fcbf47972fd55ad..55945cc14410b6473c38de0b69395643dde23a0e 100644
--- a/src/main/java/org/extendj/ragdoc/RagDocBuilder.java
+++ b/src/main/java/org/extendj/ragdoc/RagDocBuilder.java
@@ -187,6 +187,7 @@ public class RagDocBuilder extends Frontend {
   @Override protected void initOptions() {
     super.initOptions();
     program.options().addKeyValueOption("-ragroot");
+    program.options().addKeyOption("-excludeGenerated");
   }
 
   @Override protected int processArgs(String[] args) {
@@ -206,7 +207,8 @@ public class RagDocBuilder extends Frontend {
         }
       }
       System.out.println("Using ragroot directory: " + ragRoot.getAbsolutePath());
-      jsonBuilder = new JsonBuilder(ragRoot);
+      boolean excludeGenerated = program.options().hasOption("-excludeGenerated");
+      jsonBuilder = new JsonBuilder(ragRoot, excludeGenerated);
       ASTNode.jsonBuilder = jsonBuilder;
     }
     return result;