diff --git a/src/main/jastadd/Analysis.jrag b/src/main/jastadd/Analysis.jrag
index 8959b7b1280f5e1594d436ca369ff3b1da4aede7..0524c6175805427457e5918b5eb6e1b330608768 100644
--- a/src/main/jastadd/Analysis.jrag
+++ b/src/main/jastadd/Analysis.jrag
@@ -62,12 +62,6 @@ aspect ComponentAnalysis {
   eq Program.getChild().lookupComponent(TypeDecl td, String name)
     = lookupComponentSyn(td, name);
   syn Component Program.lookupComponentSyn(TypeDecl td, String name) {
-    // Check super type first to find duplicates (shadowing is not allowed)
-    if (td.hasSuper() && td.getSuper().decl() != null) {
-      Component c = lookupComponentSyn(td.getSuper().decl(), name);
-      if (c != null) return c;
-    }
-
     for (Component c: td.getComponents()) {
       if (c.name().equals(name)) {
         return c;
@@ -84,6 +78,36 @@ aspect ComponentAnalysis {
     return null;
   }
 
+  syn boolean Component.isInvalidRedefinition() {
+    if (toTypeDecl() == null) return false;
+
+    TypeDecl td = toTypeDecl();
+
+    while (td.hasSuper() && td.getSuper().decl() != null) {
+      td = td.getSuper().decl();
+      Component c = lookupComponent(td, getID());
+      if (c != null && isTargetOfDirectedRelation()) return true;
+
+      if (c != null && !this.isEqual(c)) return true;
+    }
+    return false;
+  }
+
+  syn boolean Component.isEqual(Component c) = this.getClass() == c.getClass() && getTypeUse().isEqual(c.getTypeUse());
+
+  syn boolean TypeUse.isEqual(TypeUse u);
+  eq SimpleTypeUse.isEqual(TypeUse u) = u instanceof SimpleTypeUse && getID().equals(u.getID());
+  eq ParameterizedTypeUse.isEqual(TypeUse u) {
+    if (!getID().equals(u.getID())) return false;
+    if (!(u instanceof ParameterizedTypeUse)) return false;
+    ParameterizedTypeUse pu = (ParameterizedTypeUse) u;
+    if (getNumTypeUse() != pu.getNumTypeUse()) return false;
+    for (int i = 0; i < getNumTypeUse(); i++) {
+      if (!getTypeUse(i).isEqual(pu.getTypeUse(i))) return false;
+    }
+    return true;
+  }
+
   syn RelationComponent RelationComponent.lookup(TypeDecl td, String name)
     = !isTargetOfDirectedRelation() && toTypeDecl() == td && name().equals(name)
     ? this
diff --git a/src/main/jastadd/Errors.jrag b/src/main/jastadd/Errors.jrag
index 39a1bfd05e9371a646ba7de7c626757b3734be55..9d9f75505aa01df342dd6b9e365c091b4a7ce6c7 100644
--- a/src/main/jastadd/Errors.jrag
+++ b/src/main/jastadd/Errors.jrag
@@ -20,6 +20,11 @@ aspect Errors {
     when isAlreadyDeclared()
     to Program.errors();
 
+  Component contributes error("Component '" + name()
+    + "' is an invalid redefition for type '" + toTypeDecl() + "'")
+    when isInvalidRedefinition()
+    to Program.errors();
+
   RelationComponent contributes
     error("Role name missing for type '" + toTypeDecl() + "'")
     when !isTargetOfDirectedRelation() && name().isEmpty()
diff --git a/src/test/jastadd/errors/Inheritance.expected b/src/test/jastadd/errors/Inheritance.expected
index 048fc9760094a975cbe8e5ffec1207b72fcd55c9..717389a4052a506dbe52c3734c9880b7f5c709fe 100644
--- a/src/test/jastadd/errors/Inheritance.expected
+++ b/src/test/jastadd/errors/Inheritance.expected
@@ -1,3 +1,3 @@
 Errors:
-$FILENAME Line 2, column 12: Component 'X' is already declared for type 'B1'
-$FILENAME Line 6, column 5: Component 'X' is already declared for type 'B2'
+$FILENAME Line 4, column 12: Component 'X' is an invalid redefition for type 'B3'
+$FILENAME Line 7, column 5: Component 'X' is an invalid redefition for type 'B2'
diff --git a/src/test/jastadd/errors/Inheritance.relast b/src/test/jastadd/errors/Inheritance.relast
index 9f012a95b93d32a27ab21661f0b354ae1374b0c1..db746eb173254ba6c28d7bb2d585b1c92f7e76f3 100644
--- a/src/test/jastadd/errors/Inheritance.relast
+++ b/src/test/jastadd/errors/Inheritance.relast
@@ -1,6 +1,7 @@
 A ::= X;
 B1 : A ::= X;
 B2 : A;
+B3 : A ::= <X:String>;
 X;
 
 rel B2.X -> X;
diff --git a/src/test/jastadd/errors/InheritanceLeft.expected b/src/test/jastadd/errors/InheritanceLeft.expected
index ef568b501af914f79b4dfeb6c0d958c3198ca2f7..2cb8024867b5c38771a337330d2e87a8035be653 100644
--- a/src/test/jastadd/errors/InheritanceLeft.expected
+++ b/src/test/jastadd/errors/InheritanceLeft.expected
@@ -1,3 +1,3 @@
 Errors:
-$FILENAME Line 2, column 12: Component 'X' is already declared for type 'B1'
-$FILENAME Line 6, column 10: Component 'X' is already declared for type 'B2'
+$FILENAME Line 4, column 12: Component 'X' is an invalid redefition for type 'B3'
+$FILENAME Line 7, column 10: Component 'X' is an invalid redefition for type 'B2'
diff --git a/src/test/jastadd/errors/InheritanceLeft.relast b/src/test/jastadd/errors/InheritanceLeft.relast
index a63c2668bb0c27348947fbbb8a8f0a72b173d096..710cc86226408aa5d44e1a03bc7065bec42d6a12 100644
--- a/src/test/jastadd/errors/InheritanceLeft.relast
+++ b/src/test/jastadd/errors/InheritanceLeft.relast
@@ -1,6 +1,7 @@
 A ::= X;
 B1 : A ::= X;
 B2 : A;
+B3 : A ::= <X:String>;
 X;
 
 rel X <- B2.X;