diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/BasicTypeValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/BasicTypeValidator.java
index 18e984c60558fc5adb375b330d695354b5f1e81f..1866407d5b342eae6da956a44e57e7fae430fe34 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/BasicTypeValidator.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/BasicTypeValidator.java
@@ -28,6 +28,8 @@ import org.eclipse.emf.common.util.DiagnosticChain;
 
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType;
 import fr.centralesupelec.edf.riseclipse.iec61850.scl.AbstractDataAttribute;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.DAI;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.UnNaming;
 import fr.centralesupelec.edf.riseclipse.iec61850.scl.Val;
 import fr.centralesupelec.edf.riseclipse.iec61850.scl.validator.RiseClipseValidatorSCL;
 import fr.centralesupelec.edf.riseclipse.util.AbstractRiseClipseConsole;
@@ -44,7 +46,7 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "BOOLEAN", new BasicTypeValidator( "BOOLEAN" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 switch( value ) {
                 case "0" :
                 case "1" :
@@ -52,7 +54,7 @@ public abstract class BasicTypeValidator extends TypeValidator {
                 case "true" :
                     return true;
                 default :
-                    return addDiagnosticErrorIfTrue( true, value, da, diagnostics );
+                    return addDiagnosticErrorIfTrue( true, value, daOrDai, diagnostics );
                 }
             }
             
@@ -61,12 +63,12 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "INT8", new BasicTypeValidator( "INT8" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 try {
                     new Byte( value );
                 }
                 catch( NumberFormatException e ) {
-                    return addDiagnosticErrorIfTrue( true, value, da, diagnostics );
+                    return addDiagnosticErrorIfTrue( true, value, daOrDai, diagnostics );
                 }
                 return true;
             }
@@ -76,12 +78,12 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "INT16", new BasicTypeValidator( "INT16" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 try {
                     new Short( value );
                 }
                 catch( NumberFormatException e ) {
-                    return addDiagnosticErrorIfTrue( true, value, da, diagnostics );
+                    return addDiagnosticErrorIfTrue( true, value, daOrDai, diagnostics );
                 }
                 return true;
             }
@@ -91,12 +93,12 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "INT32", new BasicTypeValidator( "INT32" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 try {
                     new Integer( value );
                 }
                 catch( NumberFormatException e ) {
-                    return addDiagnosticErrorIfTrue( true, value, da, diagnostics );
+                    return addDiagnosticErrorIfTrue( true, value, daOrDai, diagnostics );
                 }
                 return true;
             }
@@ -106,12 +108,12 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "INT64", new BasicTypeValidator( "INT64" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 try {
                     new Long( value );
                 }
                 catch( NumberFormatException e ) {
-                    return addDiagnosticErrorIfTrue( true, value, da, diagnostics );
+                    return addDiagnosticErrorIfTrue( true, value, daOrDai, diagnostics );
                 }
                 return true;
             }
@@ -121,15 +123,15 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "INT8U", new BasicTypeValidator( "INT8U" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 Long v;
                 try {
                     v = new Long( value );
                 }
                 catch( NumberFormatException e ) {
-                    return addDiagnosticErrorIfTrue( true, value, da, diagnostics );
+                    return addDiagnosticErrorIfTrue( true, value, daOrDai, diagnostics );
                 }
-                return addDiagnosticErrorIfTrue(( v < 0 ) || ( v > 255 ), value, da, diagnostics );
+                return addDiagnosticErrorIfTrue(( v < 0 ) || ( v > 255 ), value, daOrDai, diagnostics );
             }
             
         });
@@ -137,15 +139,15 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "INT16U", new BasicTypeValidator( "INT16U" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 Long v;
                 try {
                     v = new Long( value );
                 }
                 catch( NumberFormatException e ) {
-                    return addDiagnosticErrorIfTrue( true, value, da, diagnostics );
+                    return addDiagnosticErrorIfTrue( true, value, daOrDai, diagnostics );
                 }
-                return addDiagnosticErrorIfTrue(( v < 0 ) || ( v > 65535 ), value, da, diagnostics );
+                return addDiagnosticErrorIfTrue(( v < 0 ) || ( v > 65535 ), value, daOrDai, diagnostics );
             }
             
         });
@@ -153,15 +155,15 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "INT32U", new BasicTypeValidator( "INT32U" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 Long v;
                 try {
                     v = new Long( value );
                 }
                 catch( NumberFormatException e ) {
-                    return addDiagnosticErrorIfTrue( true, value, da, diagnostics );
+                    return addDiagnosticErrorIfTrue( true, value, daOrDai, diagnostics );
                 }
-                return addDiagnosticErrorIfTrue(( v < 0 ) || ( v > 4294967295L ), value, da, diagnostics );
+                return addDiagnosticErrorIfTrue(( v < 0 ) || ( v > 4294967295L ), value, daOrDai, diagnostics );
             }
             
         });
@@ -169,12 +171,12 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "FLOAT32", new BasicTypeValidator( "FLOAT32" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 try {
                     new Float( value );
                 }
                 catch( NumberFormatException e ) {
-                    return addDiagnosticErrorIfTrue( true, value, da, diagnostics );
+                    return addDiagnosticErrorIfTrue( true, value, daOrDai, diagnostics );
                 }
                 return true;
             }
@@ -184,8 +186,8 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "Octet64", new BasicTypeValidator( "Octet64" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
-                return addDiagnosticErrorIfTrue( value.getBytes().length > 64, value, da, diagnostics );
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
+                return addDiagnosticErrorIfTrue( value.getBytes().length > 64, value, daOrDai, diagnostics );
             }
             
         });
@@ -193,9 +195,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "VisString64", new BasicTypeValidator( "VisString64" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO: what is a VisString ?
-                return addDiagnosticErrorIfTrue( value.getBytes().length > 64, value, da, diagnostics );
+                return addDiagnosticErrorIfTrue( value.getBytes().length > 64, value, daOrDai, diagnostics );
             }
             
         });
@@ -203,9 +205,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "VisString129", new BasicTypeValidator( "VisString129" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO: what is a VisString ?
-                return addDiagnosticErrorIfTrue( value.getBytes().length > 129, value, da, diagnostics );
+                return addDiagnosticErrorIfTrue( value.getBytes().length > 129, value, daOrDai, diagnostics );
             }
             
         });
@@ -213,9 +215,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "VisString255", new BasicTypeValidator( "VisString255" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO: what is a VisString ?
-                return addDiagnosticErrorIfTrue( value.getBytes().length > 255, value, da, diagnostics );
+                return addDiagnosticErrorIfTrue( value.getBytes().length > 255, value, daOrDai, diagnostics );
             }
             
         });
@@ -223,9 +225,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "Unicode255", new BasicTypeValidator( "Unicode255" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO: how do we handle Unicode ?
-                return addDiagnosticErrorIfTrue( value.getBytes().length > 255, value, da, diagnostics );
+                return addDiagnosticErrorIfTrue( value.getBytes().length > 255, value, daOrDai, diagnostics );
             }
             
         });
@@ -233,9 +235,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "PhyComAddr", new BasicTypeValidator( "PhyComAddr" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -243,9 +245,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "ObjRef", new BasicTypeValidator( "ObjRef" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -253,9 +255,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "EntryID", new BasicTypeValidator( "EntryID" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -280,9 +282,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
                     "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX", "YER", "ZAR", "ZMW", "ZWL", "XXX"
             ));
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO: what means "The concrete coding shall be defined by the SCSMs." ?
-                return addDiagnosticErrorIfTrue( ! ISO_4217_3_characterCurrencyCode.contains( value ), value, da, diagnostics );
+                return addDiagnosticErrorIfTrue( ! ISO_4217_3_characterCurrencyCode.contains( value ), value, daOrDai, diagnostics );
             }
             
         });
@@ -290,9 +292,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "Timestamp", new BasicTypeValidator( "Timestamp" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -300,9 +302,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "Quality", new BasicTypeValidator( "Quality" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -310,9 +312,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "EntryTime", new BasicTypeValidator( "EntryTime" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -320,9 +322,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "TrgOps", new BasicTypeValidator( "TrgOps" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -330,9 +332,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "OptFlds", new BasicTypeValidator( "OptFlds" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -340,9 +342,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "SvOptFlds", new BasicTypeValidator( "SvOptFlds" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -350,9 +352,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "Check", new BasicTypeValidator( "Check" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -360,9 +362,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "Tcmd", new BasicTypeValidator( "Tcmd" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -370,9 +372,9 @@ public abstract class BasicTypeValidator extends TypeValidator {
         validators.put( "Dbpos", new BasicTypeValidator( "Dbpos" ) {
 
             @Override
-            protected boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics ) {
+            protected boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics ) {
                 // TODO
-                return addDiagnosticWarningNotImplemented( value, da, diagnostics );
+                return addDiagnosticWarningNotImplemented( value, daOrDai, diagnostics );
             }
             
         });
@@ -405,34 +407,43 @@ public abstract class BasicTypeValidator extends TypeValidator {
         for( Val val : ada.getVal() ) {
             res = validateValue( ada, val.getValue(), diagnostics ) && res;
         }
+        for( DAI dai : ada.getReferredByDAI() ) {
+            // name is OK because it has been used to create link DAI -> DA
+            for( Val val : dai.getVal() ) {
+                res = validateValue( dai, val.getValue(), diagnostics ) && res;
+            }
+        }
         
         return res;
     }
     
-    protected boolean addDiagnosticErrorIfTrue( boolean condition, String value, AbstractDataAttribute da, DiagnosticChain diagnostics ) {
+    protected boolean addDiagnosticErrorIfTrue( boolean condition, String value, UnNaming daOrDai, DiagnosticChain diagnostics ) {
         if( condition ) {
             diagnostics.add( new BasicDiagnostic(
                     Diagnostic.ERROR,
                     RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE,
                     0,
-                    "[NSD validation] value " + value + " of Val in DA/BDA " + da + " line = " + da.getLineNumber() + ") is not a valid " + getName() + " value",
-                    new Object[] { da } ));
+                    "[NSD validation] value " + value + " of Val in DA/BDA/DAI " + daOrDai + " line = " + daOrDai.getLineNumber() + ") is not a valid " + getName() + " value",
+                    new Object[] { daOrDai } ));
             return false;
             
         }
         return true;
     }
     
-    protected boolean addDiagnosticWarningNotImplemented( String value, AbstractDataAttribute da, DiagnosticChain diagnostics ) {
+    protected boolean addDiagnosticWarningNotImplemented( String value, UnNaming daOrDai, DiagnosticChain diagnostics ) {
+        String name = "";
+        if( daOrDai instanceof AbstractDataAttribute ) name = (( AbstractDataAttribute ) daOrDai ).getName();
+        if( daOrDai instanceof DAI                   ) name = (( DAI ) daOrDai ).getName();
         diagnostics.add( new BasicDiagnostic(
                 Diagnostic.WARNING,
                 RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE,
                 0,
-                "[NSD validation] verification of value " + value + " of Val in DA/BDA " + da + " line = " + da.getLineNumber() + ") is not implemented for BasicType " + getName(),
-                new Object[] { da } ));
+                "[NSD validation] verification of value " + value + " of Val in DA/BDA/DAI " + name + " line = " + daOrDai.getLineNumber() + ") is not implemented for BasicType " + getName(),
+                new Object[] { daOrDai } ));
         return true;
     }
 
-    protected abstract boolean validateValue( AbstractDataAttribute da, String value, DiagnosticChain diagnostics );
+    protected abstract boolean validateValue( UnNaming daOrDai, String value, DiagnosticChain diagnostics );
 
 }