diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.validator/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DataObjectPresenceConditionValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.validator/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DataObjectPresenceConditionValidator.java
index 86aba5cafab1e68e8b43da70367e835033a3b2cf..639b358dd550b8a8be2bb9b8189a709b6879637b 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.validator/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DataObjectPresenceConditionValidator.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.validator/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DataObjectPresenceConditionValidator.java
@@ -142,6 +142,10 @@ public class DataObjectPresenceConditionValidator {
         // and duplicate it in each sub-LNClass for adding specific elements
         if( base == null ) {
             atLeastOne = new HashMap<>();
+            atMostOne = new HashSet<>();
+            allOrNonePerGroup = new HashMap<>();
+            allOnlyOneGroup = new HashMap<>();
+            allAtLeastOneGroup = new HashMap<>();
         }
         else {
             atLeastOne = ( HashMap< Integer, HashSet< String > > ) base.atLeastOne.clone();
@@ -152,6 +156,31 @@ public class DataObjectPresenceConditionValidator {
                 }
             }
             
+            atMostOne = ( HashSet< String > ) base.atMostOne.clone();
+            for( String name : atMostOne ) {
+                presentDO.put( name, null );
+            }
+
+            allOrNonePerGroup = ( HashMap< Integer, HashSet< String > > ) base.allOrNonePerGroup.clone();
+            for( Integer group : allOrNonePerGroup.keySet() ) {
+                for( String name : allOrNonePerGroup.get( group )) {
+                    presentDO.put( name, null );
+                }
+            }
+            
+            allOnlyOneGroup = ( HashMap< Integer, HashSet< String > > ) base.allOnlyOneGroup.clone();
+            for( Integer group : allOnlyOneGroup.keySet() ) {
+                for( String name : allOnlyOneGroup.get( group )) {
+                    presentDO.put( name, null );
+                }
+            }
+            
+            allAtLeastOneGroup = ( HashMap< Integer, HashSet< String > > ) base.allAtLeastOneGroup.clone();
+            for( Integer group : allAtLeastOneGroup.keySet() ) {
+                for( String name : allAtLeastOneGroup.get( group )) {
+                    presentDO.put( name, null );
+                }
+            }
         }
 
         anyLNClass
@@ -235,13 +264,13 @@ public class DataObjectPresenceConditionValidator {
             }
         case "AtMostOne" :
             // At most one of marked elements shall be present
-            if( atMostOne == null ) atMostOne = new HashSet<>();
+            //if( atMostOne == null ) atMostOne = new HashSet<>();
             atMostOne.add( name );
             break;
         case "AllOrNonePerGroup" :
             // Parameter n: group number (> 0).
             // All or none of the elements of a group n shall be present
-            if( allOrNonePerGroup == null ) allOrNonePerGroup = new HashMap<>();
+            //if( allOrNonePerGroup == null ) allOrNonePerGroup = new HashMap<>();
             try {
                 Integer arg = Integer.valueOf( presCondArgs );
                 if( arg <= 0 ) {
@@ -261,7 +290,7 @@ public class DataObjectPresenceConditionValidator {
         case "AllOnlyOneGroup" :
             // Parameter n: group number (> 0).
             // All elements of only one group n shall be present
-            if( allOnlyOneGroup == null ) allOnlyOneGroup = new HashMap<>();
+            //if( allOnlyOneGroup == null ) allOnlyOneGroup = new HashMap<>();
             try {
                 Integer arg = Integer.valueOf( presCondArgs );
                 if( arg <= 0 ) {
@@ -281,7 +310,7 @@ public class DataObjectPresenceConditionValidator {
         case "AllAtLeastOneGroup" :
             // Parameter n: group number (> 0).
             // All elements of at least one group n shall be present
-            if( allAtLeastOneGroup == null ) allAtLeastOneGroup = new HashMap<>();
+            //if( allAtLeastOneGroup == null ) allAtLeastOneGroup = new HashMap<>();
             try {
                 Integer arg = Integer.valueOf( presCondArgs );
                 if( arg <= 0 ) {
@@ -860,6 +889,7 @@ public class DataObjectPresenceConditionValidator {
         // Parameter n: group number (> 0).
         // At least one of marked elements of a group n shall be present
         // Usage in standard NSD files (version 2007B): DataObject and SubDataObject and DataAttribute and SubDataAttribute
+        //if( atLeastOne != null ) {
         if( ! asSuperclass ) {
             AbstractRiseClipseConsole.getConsole().verbose( "[NSD validation] validation of presence condition \"AtLeastOne\" on LNodeType (id=" + lNodeType.getId() + ") at line " + lNodeType.getLineNumber() );
             for( Entry< Integer, HashSet< String > > e1 : atLeastOne.entrySet() ) {
@@ -885,7 +915,8 @@ public class DataObjectPresenceConditionValidator {
         // presCond: "AtMostOne" :
         // At most one of marked elements shall be present
         // Usage in standard NSD files (version 2007B): DataObject
-        if( atMostOne != null ) {
+        //if( atMostOne != null ) {
+        if( ! asSuperclass ) {
             AbstractRiseClipseConsole.getConsole().verbose( "[NSD validation] validation of presence condition \"AtMostOne\" on LNodeType (id=" + lNodeType.getId() + ") at line " + lNodeType.getLineNumber() );
             int count = 0;
             for( String s : atMostOne ) {
@@ -908,7 +939,8 @@ public class DataObjectPresenceConditionValidator {
         // Parameter n: group number (> 0).
         // All or none of the elements of a group n shall be present
         // Usage in standard NSD files (version 2007B): DataAttribute
-        if( allOrNonePerGroup != null ) {
+        //if( allOrNonePerGroup != null ) {
+        if( ! asSuperclass ) {
             AbstractRiseClipseConsole.getConsole().verbose( "[NSD validation] validation of presence condition \"AllOrNonePerGroup\" on LNodeType (id=" + lNodeType.getId() + ") at line " + lNodeType.getLineNumber() );
             for( Entry< Integer, HashSet< String > > e1 : allOrNonePerGroup.entrySet() ) {
                 int groupCount = 0;
@@ -933,7 +965,8 @@ public class DataObjectPresenceConditionValidator {
         // Parameter n: group number (> 0).
         // All elements of only one group n shall be present
         // Usage in standard NSD files (version 2007B): DataObject and SubDataAttribute
-        if( allOnlyOneGroup != null ) {
+        //if( allOnlyOneGroup != null ) {
+        if(( ! asSuperclass ) && ( allOnlyOneGroup.size() != 0 )) {         // groupNumber == 0 not an error if empty
             AbstractRiseClipseConsole.getConsole().verbose( "[NSD validation] validation of presence condition \"AllOnlyOneGroup\" on LNodeType (id=" + lNodeType.getId() + ") at line " + lNodeType.getLineNumber() );
             int groupNumber = 0;
             for( Entry< Integer, HashSet< String > > e1 : allOnlyOneGroup.entrySet() ) {
@@ -982,7 +1015,8 @@ public class DataObjectPresenceConditionValidator {
         // Parameter n: group number (> 0).
         // All elements of at least one group n shall be present
         // Usage in standard NSD files (version 2007B): DataAttribute
-        if( allAtLeastOneGroup != null ) {
+        //if( allAtLeastOneGroup != null ) {
+        if(( ! asSuperclass ) && ( allAtLeastOneGroup.size() != 0 )) {         // groupNumber == 0 not an error if empty
             AbstractRiseClipseConsole.getConsole().verbose( "[NSD validation] validation of presence condition \"AllAtLeastOneGroup\" on LNodeType (id=" + lNodeType.getId() + ") at line " + lNodeType.getLineNumber() );
             int groupNumber = 0;
             for( Entry< Integer, HashSet< String > > e1 : allAtLeastOneGroup.entrySet() ) {