diff --git a/CHANGELOG.md b/CHANGELOG.md
index b03834d3988b4bb53aca8ff01d9e8f0cbccb696e..379e15647eb3ae29e4e67ac39506c301b87eef75 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@
   - Note that although it works in the Java embeddings within aspects, it does *not* work in "real" Java classes.
   - Please use this feature with caution. As with most refactoring tools, it is quite fragile and won't give correct
     results in all cases.
+- Folding support for aspect files.
+  - Aspects and most blocks now can be folded.
 
 ### Changed
 
diff --git a/src/main/grammar/Aspect.bnf b/src/main/grammar/Aspect.bnf
index 3dd6a28e556abd7d816b8be2889bbcc9450832db..aca28a62073d58a3b791091d1a9fdb38f5951942 100644
--- a/src/main/grammar/Aspect.bnf
+++ b/src/main/grammar/Aspect.bnf
@@ -173,7 +173,7 @@ class_body_declaration ::= initializer | modifiers ( unmodified_class_declaratio
 
 interface_declaration ::= unmodified_interface_declaration
 
-unmodified_interface_declaration ::= INTERFACE IDENTIFIER type_parameters? (EXTENDS type_name_list)? LBRACE interface_member_declaration RBRACE
+unmodified_interface_declaration ::= INTERFACE IDENTIFIER type_parameters? (EXTENDS type_name_list)? LBRACE interface_member_declaration* RBRACE
 
 interface_member_declaration ::= modifiers (unmodified_class_declaration | unmodified_interface_declaration | field_declaration | method_declaration) | SEMICOLON
 
diff --git a/src/main/java/org/jastadd/tooling/aspect/AspectFoldingBuilder.java b/src/main/java/org/jastadd/tooling/aspect/AspectFoldingBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e28dbfe6259e790e2dc3f12669d00bbfbb79245
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/aspect/AspectFoldingBuilder.java
@@ -0,0 +1,69 @@
+package org.jastadd.tooling.aspect;
+
+
+import com.intellij.lang.ASTNode;
+import com.intellij.lang.folding.FoldingBuilderEx;
+import com.intellij.lang.folding.FoldingDescriptor;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.FoldingGroup;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.util.PsiTreeUtil;
+import org.jastadd.tooling.aspect.psi.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class AspectFoldingBuilder extends FoldingBuilderEx {
+
+  @Override
+  public FoldingDescriptor @NotNull [] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) {
+    List<FoldingDescriptor> descriptors = new ArrayList<>();
+    Collection<JastAddAspectAspectDeclaration> aspectDeclarations = PsiTreeUtil.findChildrenOfType(root, JastAddAspectAspectDeclaration.class);
+    for (final JastAddAspectAspectDeclaration aspectDeclaration : aspectDeclarations) {
+      descriptors.add(new FoldingDescriptor(aspectDeclaration.getNode(),
+        new TextRange(aspectDeclaration.getAspectBody().getTextRange().getStartOffset() + 1,
+          aspectDeclaration.getAspectBody().getTextRange().getEndOffset() - 1)));
+    }
+    Collection<JastAddAspectClassDeclaration> classDeclarations = PsiTreeUtil.findChildrenOfType(root, JastAddAspectClassDeclaration.class);
+    for (final JastAddAspectClassDeclaration classDeclaration : classDeclarations) {
+      descriptors.add(new FoldingDescriptor(classDeclaration.getNode(),
+        new TextRange(classDeclaration.getClassBody().getTextRange().getStartOffset() + 1,
+          classDeclaration.getClassBody().getTextRange().getEndOffset() - 1)));
+    }
+    Collection<JastAddAspectEnumBody> enumBodies = PsiTreeUtil.findChildrenOfType(root, JastAddAspectEnumBody.class);
+    for (final JastAddAspectEnumBody enumBody : enumBodies) {
+      descriptors.add(new FoldingDescriptor(enumBody.getNode(),
+        new TextRange(enumBody.getTextRange().getStartOffset() + 1,
+          enumBody.getTextRange().getEndOffset() - 1)));
+    }
+    Collection<JastAddAspectAnnotationTypeBody> annotationTypeBodies = PsiTreeUtil.findChildrenOfType(root, JastAddAspectAnnotationTypeBody.class);
+    for (final JastAddAspectAnnotationTypeBody annotationTypeBody : annotationTypeBodies) {
+      descriptors.add(new FoldingDescriptor(annotationTypeBody.getNode(),
+        new TextRange(annotationTypeBody.getTextRange().getStartOffset() + 1,
+          annotationTypeBody.getTextRange().getEndOffset() - 1)));
+    }
+    Collection<JastAddAspectBlock> aspectBlocks = PsiTreeUtil.findChildrenOfType(root, JastAddAspectBlock.class);
+    for (final JastAddAspectBlock block : aspectBlocks) {
+      descriptors.add(new FoldingDescriptor(block.getNode(),
+        new TextRange(block.getTextRange().getStartOffset() + 1,
+          block.getTextRange().getEndOffset() - 1)));
+    }
+    return descriptors.toArray(new FoldingDescriptor[0]);
+  }
+
+  @Nullable
+  @Override
+  public String getPlaceholderText(@NotNull ASTNode node) {
+    return " ... ";
+  }
+
+  @Override
+  public boolean isCollapsedByDefault(@NotNull ASTNode node) {
+    return false;
+  }
+
+}
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index a9b7feec56cba1ca3ce62fdb1bbb238ad4fef635..a41624890b5ba72d39f91aa10a63e9fb19276af3 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -89,6 +89,9 @@
                                  implementationClass="org.jastadd.tooling.aspect.psi.JastAddAspectClassOrInterfaceTypeManipulator"/>
 
         <lang.formatter language="JastAddAspect" implementationClass="org.jastadd.tooling.aspect.AspectFormattingModelBuilder"/>
+
+        <lang.foldingBuilder language="JastAddAspect" implementationClass="org.jastadd.tooling.aspect.AspectFoldingBuilder"/>
+        FoldingBuilder"/>
     </extensions>
 
     <actions>