diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java b/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
index ac56ff83acc56e5edfb88cf77d0368ccec907396..84290018dea71e54249295ff3e40f41b0f78568d 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
@@ -3,37 +3,118 @@ package org.jastadd.tooling;
 import com.intellij.codeInsight.completion.*;
 import com.intellij.codeInsight.lookup.LookupElementBuilder;
 import com.intellij.patterns.PlatformPatterns;
-import com.intellij.psi.tree.TokenSet;
 import com.intellij.util.ProcessingContext;
 import org.jastadd.tooling.parser.RelAstGrammarTypes;
+import org.jastadd.tooling.psi.RelAstGrammarElementFactory;
 import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
-import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
 import org.jetbrains.annotations.NotNull;
 
 public class RelAstGrammarCompletionContributor extends CompletionContributor {
 
   public RelAstGrammarCompletionContributor() {
-    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID).withParent(RelAstGrammarTypeReference.class),
+
+    // add completion in definition of relations
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID).afterLeaf("rel", "<->", "->", "<-"),
       new CompletionProvider<>() {
         public void addCompletions(@NotNull CompletionParameters parameters,
                                    @NotNull ProcessingContext context,
                                    @NotNull CompletionResultSet resultSet) {
-
           for (RelAstGrammarTypeDecl decl : RelAstGrammarUtil.findTypeDecl(parameters.getPosition().getProject())) {
-            resultSet.addElement(LookupElementBuilder.create(decl.getDeclaredName().getText()));
+            resultSet.addElement(LookupElementBuilder.create(RelAstGrammarElementFactory.createTypeReference(parameters.getPosition().getProject(), decl.getName())));
           }
         }
       }
     );
 
-    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID).afterLeaf("rel", "<->", "->", "<-", ":"),
+    // add "* ", "? " after REL ID DOT ID
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
+        .withTextLengthLongerThan("IntellijIdeaRulezzz".length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
+        .afterLeaf(".")
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel"))),
       new CompletionProvider<>() {
         public void addCompletions(@NotNull CompletionParameters parameters,
                                    @NotNull ProcessingContext context,
                                    @NotNull CompletionResultSet resultSet) {
-          for (RelAstGrammarTypeDecl decl : RelAstGrammarUtil.findTypeDecl(parameters.getPosition().getProject())) {
-            resultSet.addElement(LookupElementBuilder.create(decl.getDeclaredName().getText()));
-          }
+          resultSet = resultSet.withPrefixMatcher("");
+          resultSet.addElement(LookupElementBuilder.create("* ").bold().withPresentableText("*"));
+          resultSet.addElement(LookupElementBuilder.create("? ").bold().withPresentableText("?"));
+        }
+      }
+    );
+    // add "*", "?" after <-  ID DOT ID
+    // add "*", "?" after <-> ID DOT ID
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
+        .withTextLengthLongerThan("IntellijIdeaRulezzz".length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
+        .afterLeaf(".")
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("<-", "<->"))),
+      new CompletionProvider<>() {
+        public void addCompletions(@NotNull CompletionParameters parameters,
+                                   @NotNull ProcessingContext context,
+                                   @NotNull CompletionResultSet resultSet) {
+          resultSet = resultSet.withPrefixMatcher("");
+          resultSet.addElement(LookupElementBuilder.create("*").bold());
+          resultSet.addElement(LookupElementBuilder.create("?").bold());
+        }
+      }
+    );
+    // add " -> ", " <-> " after REL ID DOT ID <SPACE>
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
+        .afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf("."))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID))))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel")))),
+      new CompletionProvider<>() {
+        public void addCompletions(@NotNull CompletionParameters parameters,
+                                   @NotNull ProcessingContext context,
+                                   @NotNull CompletionResultSet resultSet) {
+          resultSet.addElement(LookupElementBuilder.create("-> ").bold().withPresentableText("->"));
+          resultSet.addElement(LookupElementBuilder.create("<-> ").bold().withPresentableText("<->"));
+        }
+      }
+    );
+    // add " -> ", " <-> " after REL ID DOT ID * <SPACE>
+    // add " -> ", " <-> " after REL ID DOT ID ? <SPACE>
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
+        .afterLeaf("?", "*")
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(".")))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel"))))),
+      new CompletionProvider<>() {
+        public void addCompletions(@NotNull CompletionParameters parameters,
+                                   @NotNull ProcessingContext context,
+                                   @NotNull CompletionResultSet resultSet) {
+          resultSet.addElement(LookupElementBuilder.create("-> ").bold().withPresentableText("->"));
+          resultSet.addElement(LookupElementBuilder.create("<-> ").bold().withPresentableText("<->"));
+        }
+      }
+    );
+    // add "." after REL ID
+    // add "." after <-> ID
+    // add "." after <- ID
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
+        .withTextLengthLongerThan("IntellijIdeaRulezzz".length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
+        .afterLeaf("rel", "<->", "<-"),
+      new CompletionProvider<>() {
+        public void addCompletions(@NotNull CompletionParameters parameters,
+                                   @NotNull ProcessingContext context,
+                                   @NotNull CompletionResultSet resultSet) {
+          resultSet = resultSet.withPrefixMatcher("");
+          resultSet.addElement(LookupElementBuilder.create(".").bold());
+        }
+      }
+    );
+    // add " <- " after REL ID <SPACE>
+    extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
+        .afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID))
+        .afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel")),
+      new CompletionProvider<>() {
+        public void addCompletions(@NotNull CompletionParameters parameters,
+                                   @NotNull ProcessingContext context,
+                                   @NotNull CompletionResultSet resultSet) {
+          resultSet.addElement(LookupElementBuilder.create("<- ").bold().withPresentableText("<-"));
         }
       }
     );
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index 14dfe451c56758b960b913fc81512850482aa529..6c566e8bda4fe61f5c58aebc9e52240dcd6c3a72 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -28,15 +28,14 @@
         <codeInsight.lineMarkerProvider language="JAVA"
                                         implementationClass="org.jastadd.tooling.RelAstGrammarLineMarkerProvider"/>
 
-<!--        <completion.contributor language="JastAddGrammar"-->
-<!--                                implementationClass="org.jastadd.tooling.RelAstGrammarCompletionContributor"/>-->
+        <completion.contributor language="JastAddGrammar"
+                                implementationClass="org.jastadd.tooling.RelAstGrammarCompletionContributor"/>
 
         <psi.referenceContributor implementation="org.jastadd.tooling.RelAstGrammarReferenceContributor"/>
 
 
         <lang.refactoringSupport language="JastAddGrammar"
                                  implementationClass="org.jastadd.tooling.RelAstGrammarRefactoringSupportProvider"/>
-        <lang.elementManipulator />
 
         <lang.elementManipulator forClass="org.jastadd.tooling.psi.RelAstGrammarTypeReference" implementationClass="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceManipulator"/>
     </extensions>