diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/AnyLNClassImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/AnyLNClassImpl.java
index acb7be80edc637ed7a3a2fff142f496eea4bf484..53584c942c0f48b1fbd5c6d6d115ee76d412e644 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/AnyLNClassImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/AnyLNClassImpl.java
@@ -28,6 +28,7 @@ import fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
+import java.util.Optional;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -513,23 +514,29 @@ public abstract class AnyLNClassImpl extends TitledClassImpl implements AnyLNCla
     @Override
     public boolean buildExplicitLinks( IRiseClipseConsole console ) {
         if( super.buildExplicitLinks( console ) ) return true;
-        if( !isSetBase() ) return false;
-
-        // This code assumes that the referred AbstractLNClass is in the same NS
-        // TODO: check that it is right
-        LNClasses lNClasses = ( LNClasses ) eContainer();
-        EList< AbstractLNClass > l = lNClasses.getAbstractLNClass();
-        setRefersToAbstractLNClass( l.stream()
-                .filter( abstractLNClass -> abstractLNClass.getName().equals( getBase() ) ).findAny().orElse( null ) );
-        if( getRefersToAbstractLNClass() == null ) {
-            console.error( "AbstractLNClass (name: " + getBase() + ") refers by AnyLNClass (name: " + getName()
-                    + ") in NS (id:" + lNClasses.getNS().getId() + ") is unknown" );
-        }
-        else {
-            console.verbose( "AbstractLNClass (name: " + getBase() + ") refers by AnyLNClass (name: " + getName()
-                    + ") in NS (id:" + lNClasses.getNS().getId() + ") found in NS (id:"
-                    + getRefersToAbstractLNClass().getLNClasses().getNS().getId() + ")" );
+
+        if( isSetBase() ) {
+
+            // This code assumes that the referred AbstractLNClass is in the same NS
+            // TODO: check that it is right
+            getLNClasses()
+                    .getAbstractLNClass()
+                    .stream()
+                    .filter( abstractLNClass -> abstractLNClass.getName().equals( getBase() ) )
+                    .findAny()
+                    .ifPresent( abstractLNClass -> setRefersToAbstractLNClass( abstractLNClass ) );
+
+            if( isSetRefersToAbstractLNClass() ) {
+                console.verbose( "AbstractLNClass (name: " + getBase() + ") refers by AnyLNClass (name: " + getName()
+                        + ") in NS (id:" + getLNClasses().getNS().getId() + ") found in NS (id:"
+                        + getRefersToAbstractLNClass().getLNClasses().getNS().getId() + ")" );
+            }
+            else {
+                console.error( "AbstractLNClass (name: " + getBase() + ") refers by AnyLNClass (name: " + getName()
+                        + ") in NS (id:" + getLNClasses().getNS().getId() + ") is unknown" );
+            }
         }
+
         return false;
     }
 
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DataAttributeImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DataAttributeImpl.java
index 96a0d6dae371bc3e1d14917b51ec67edd3c54f27..2558c5a22d855fe8c0dff1164ec57965f4761442 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DataAttributeImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DataAttributeImpl.java
@@ -29,6 +29,7 @@ import fr.centralesupelec.edf.riseclipse.iec61850.nsd.CDC;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataAttribute;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DefinedAttributeTypeKind;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.FunctionalConstraint;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NS;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdFactory;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdPackage;
 
@@ -3046,71 +3047,89 @@ public class DataAttributeImpl extends DocumentedClassImpl implements DataAttrib
     public boolean buildExplicitLinks( IRiseClipseConsole console ) {
         if( super.buildExplicitLinks( console ) ) return true;
 
+        NS ns = getCDC().getCDCs().getNS();
+
         if( isSetFc() ) {
-            setRefersToFunctionalConstraint( getCDC().getCDCs().getNS().findFunctionalConstraint( getFc(), console ) );
-            if( getRefersToFunctionalConstraint() == null ) {
+            FunctionalConstraint foundFC = ns.findFunctionalConstraint( getFc(), console );
+
+            if( foundFC == null ) {
                 console.error( "FunctionalConstraint (abbreviation: " + getFc() + ") refers by DataAttribute (name: "
-                        + getName() + ") in NS (id:" + getCDC().getCDCs().getNS().getId() + ") is unknown" );
+                        + getName() + ") in NS (id:" + ns.getId() + ") is unknown" );
             }
             else {
+                setRefersToFunctionalConstraint( foundFC );
                 console.verbose( "FunctionalConstraint (abbreviation: " + getFc() + ") refers by DataAttribute (name: "
-                        + getName() + ") in NS (id:" + getCDC().getCDCs().getNS().getId() + ") found in NS (id:"
+                        + getName() + ") in NS (id:" + ns.getId() + ") found in NS (id:"
                         + getRefersToFunctionalConstraint().getFunctionalConstraints().getNS().getId() + ")" );
             }
         }
 
         if( isSetPresCond() ) {
-            setRefersToPresenceCondition( getCDC().getCDCs().getNS().findPresenceCondition( getPresCond(), console ) );
-            if( getRefersToPresenceCondition() == null ) {
+            PresenceCondition foundPC = ns.findPresenceCondition( getPresCond(), console );
+
+            if( foundPC == null ) {
                 console.error( "PresenceCondition (name: " + getPresCond() + ") refers by DataAttribute (name: "
-                        + getName() + ") in NS (id:" + getCDC().getCDCs().getNS().getId() + ") is unknown" );
+                        + getName() + ") in NS (id:" + ns.getId() + ") is unknown" );
             }
             else {
+                setRefersToPresenceCondition( foundPC );
                 console.verbose( "PresenceCondition (name: " + getPresCond() + ") refers by DataAttribute (name: "
-                        + getName() + ") in NS (id:" + getCDC().getCDCs().getNS().getId() + ") found in NS (id:"
+                        + getName() + ") in NS (id:" + ns.getId() + ") found in NS (id:"
                         + getRefersToPresenceCondition().getPresenceConditions().getNS().getId() + ")" );
             }
         }
 
         if( isSetSizeAttribute() ) {
-            setRefersToSizeAttribute( getCDC().getDataAttribute().stream()
-                    .filter( att -> att.getName().equals( getSizeAttribute() ) ).findAny().orElse( null ) );
-            if( getRefersToSizeAttribute() == null ) {
-                console.error( "DataAttribute (name: " + getSizeAttribute()
+            getCDC()
+                    .getDataAttribute()
+                    .stream()
+                    .filter( att -> att.getName().equals( getSizeAttribute() ) )
+                    .findAny()
+                    .ifPresent( att -> setRefersToSizeAttribute( att ) );
+
+            if( isSetRefersToSizeAttribute() ) {
+                console.verbose( "DataAttribute (name: " + getSizeAttribute()
                         + ") refers as sizeAttribute by DataAttribute (name: " + getName() + ") in NS (id:"
-                        + getCDC().getCDCs().getNS().getId() + ") is unknown" );
+                        + ns.getId() + ") found" );
             }
             else {
-                console.verbose( "DataAttribute (name: " + getSizeAttribute()
+                console.error( "DataAttribute (name: " + getSizeAttribute()
                         + ") refers as sizeAttribute by DataAttribute (name: " + getName() + ") in NS (id:"
-                        + getCDC().getCDCs().getNS().getId() + ") found" );
+                        + ns.getId() + ") is unknown" );
             }
         }
 
         if( isSetMaxIndexAttribute() ) {
-            setRefersToMaxIndexAttribute( getCDC().getDataAttribute().stream()
-                    .filter( att -> att.getName().equals( getMaxIndexAttribute() ) ).findAny().orElse( null ) );
-            if( getRefersToMaxIndexAttribute() == null ) {
-                console.error( "DataAttribute (name: " + getMaxIndexAttribute()
+            getCDC()
+                    .getDataAttribute()
+                    .stream()
+                    .filter( att -> att.getName().equals( getMaxIndexAttribute() ) )
+                    .findAny()
+                    .ifPresent( att -> setRefersToMaxIndexAttribute( att ) );
+
+            if( isSetRefersToMaxIndexAttribute() ) {
+                console.verbose( "DataAttribute (name: " + getMaxIndexAttribute()
                         + ") refers as maxIndexAttribute by DataAttribute (name: " + getName() + ") in NS (id:"
-                        + getCDC().getCDCs().getNS().getId() + ") is unknown" );
+                        + ns.getId() + ") found" );
             }
             else {
-                console.verbose( "DataAttribute (name: " + getMaxIndexAttribute()
+                console.error( "DataAttribute (name: " + getMaxIndexAttribute()
                         + ") refers as maxIndexAttribute by DataAttribute (name: " + getName() + ") in NS (id:"
-                        + getCDC().getCDCs().getNS().getId() + ") found" );
+                        + ns.getId() + ") is unknown" );
             }
         }
 
         if( getTypeKind().equals( DefinedAttributeTypeKind.BASIC ) ) {
-            setRefersToBasicType( getCDC().getCDCs().getNS().findBasicType( getType(), console ) );
-            if( getRefersToBasicType() == null ) {
+            BasicType foundBT = ns.findBasicType( getType(), console );
+
+            if( foundBT == null ) {
                 console.error( "BasicType (name: " + getType() + ") refers as type by DataAttribute (name: " + getName()
-                        + ") in NS (id:" + getCDC().getCDCs().getNS().getId() + ") is unknown" );
+                        + ") in NS (id:" + ns.getId() + ") is unknown" );
             }
             else {
+                setRefersToBasicType( foundBT );
                 console.verbose( "BasicType (name: " + getType() + ") refers as type by DataAttribute (name: "
-                        + getName() + ") in NS (id:" + getCDC().getCDCs().getNS().getId() + ") found in NS (id:" 
+                        + getName() + ") in NS (id:" + ns.getId() + ") found in NS (id:"
                         + getRefersToBasicType().getBasicTypes().getNS().getId() + ")" );
             }
         }
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DataObjectImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DataObjectImpl.java
index d9c234216d9c8d7040661ff9c91a46ac79ea6a34..2244618688b4e0bcce9a9373d8f027b9c2e90a78 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DataObjectImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DataObjectImpl.java
@@ -26,6 +26,7 @@ import fr.centralesupelec.edf.riseclipse.iec61850.nsd.AnyLNClass;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.CDC;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataObject;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DefinedAttributeTypeKind;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NS;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdPackage;
 
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.PresenceCondition;
@@ -1841,44 +1842,46 @@ public class DataObjectImpl extends DocumentedClassImpl implements DataObject {
     public boolean buildExplicitLinks( IRiseClipseConsole console ) {
         if( super.buildExplicitLinks( console ) ) return true;
 
+        NS ns = getAnyLNClass().getLNClasses().getNS();
         if( isSetType() ) {
-            setRefersToCDC( getAnyLNClass().getLNClasses().getNS().findCDC( getType(), console ) );
-            if( getRefersToCDC() == null ) {
+            CDC foundCDC = ns.findCDC( getType(), console );
+
+            if( foundCDC == null ) {
                 console.error( "CDC (name: " + getType() + ") refers by DataObject (name: " + getName() + ") in NS (id:"
-                        + getAnyLNClass().getLNClasses().getNS().getId() + ") is unknown" );
+                        + ns.getId() + ") is unknown" );
             }
             else {
+                setRefersToCDC( foundCDC );
                 console.verbose( "CDC (name: " + getType() + ") refers by DataObject (name: " + getName()
-                        + ") in NS (id:" + getAnyLNClass().getLNClasses().getNS().getId() + ") found in NS (id:"
+                        + ") in NS (id:" + ns.getId() + ") found in NS (id:"
                         + getRefersToCDC().getCDCs().getNS().getId() + ")" );
             }
         }
 
         if( isSetPresCond() ) {
-            setRefersToPresenceCondition(
-                    getAnyLNClass().getLNClasses().getNS().findPresenceCondition( getPresCond(), console ) );
-            if( getRefersToPresenceCondition() == null ) {
-                console.error(
-                        "PresenceCondition (name: " + getPresCond() + ") refers by DataObject (name: " + getName()
-                                + ") in NS (id:" + getAnyLNClass().getLNClasses().getNS().getId() + ") is unknown" );
+            PresenceCondition foundPC = ns.findPresenceCondition( getPresCond(), console );
+
+            if( foundPC == null ) {
+                console.error( "PresenceCondition (name: " + getPresCond() + ") refers by DataObject (name: "
+                        + getName() + ") in NS (id:" + ns.getId() + ") is unknown" );
             }
             else {
-                console.verbose(
-                        "PresenceCondition (name: " + getPresCond() + ") refers by DataObject (name: " + getName()
-                                + ") in NS (id:" + getAnyLNClass().getLNClasses().getNS().getId() + ") found in NS (id:"
-                                + getRefersToPresenceCondition().getPresenceConditions().getNS().getId() + ")" );
+                setRefersToPresenceCondition( foundPC );
+                console.verbose( "PresenceCondition (name: " + getPresCond() + ") refers by DataObject (name: "
+                        + getName() + ") in NS (id:" + ns.getId() + ") found in NS (id:"
+                        + getRefersToPresenceCondition().getPresenceConditions().getNS().getId() + ")" );
             }
         }
 
         if( isSetDsPresCond() ) {
-            setRefersToPresenceConditionDerivedStatistics(
-                    getAnyLNClass().getLNClasses().getNS().findPresenceCondition( getDsPresCond(), console ) );
-            if( getRefersToPresenceConditionDerivedStatistics() == null ) {
+            PresenceCondition foundPC = ns.findPresenceCondition( getDsPresCond(), console );
+            if( foundPC == null ) {
                 console.error(
                         "PresenceCondition (name: " + getDsPresCond() + ") refers by DataObject (name: " + getName()
                                 + ") in NS (id:" + getAnyLNClass().getLNClasses().getNS().getId() + ") is unknown" );
             }
             else {
+                setRefersToPresenceConditionDerivedStatistics( foundPC );
                 console.verbose( "PresenceCondition (name: " + getDsPresCond() + ") refers by DataObject (name: "
                         + getName() + ") in NS (id:" + getAnyLNClass().getLNClasses().getNS().getId()
                         + ") found in NS (id:"
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DependsOnImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DependsOnImpl.java
index b49f0485836d0170a04836b3efa0365d43ccba1a..d1097a413f44fcc1874171867f004a8412704c02 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DependsOnImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/DependsOnImpl.java
@@ -891,13 +891,13 @@ public class DependsOnImpl extends NsdObjectImpl implements DependsOn {
     public boolean buildExplicitLinks( IRiseClipseConsole console ) {
         if( super.buildExplicitLinks( console ) ) return true;
 
-        NsdResourceSetImpl resourceSet = ( NsdResourceSetImpl ) eResource().getResourceSet();
-        setRefersToNS( resourceSet.getNS( getId() ) );
-        if( getRefersToNS() == null ) {
+        NS ns = ( ( NsdResourceSetImpl ) eResource().getResourceSet() ).getNS( getId() );
+        if( ns == null ) {
             console.error(
                     "NS (id: " + getId() + ") and refers by DependsOn in NS (id:" + getNS().getId() + ") is unknown" );
         }
         else {
+            setRefersToNS( ns );
             console.verbose(
                     "NS (id: " + getId() + ") and refers by DependsOn in NS (id:" + getNS().getId() + ") found" );
         }
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/EnumerationImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/EnumerationImpl.java
index e10140cabd29a0b71994479244814b8973d0b125..e28bf359dee417108b85e0b0cfbdeeb44dce8d1f 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/EnumerationImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/EnumerationImpl.java
@@ -22,6 +22,7 @@ package fr.centralesupelec.edf.riseclipse.iec61850.nsd.impl;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.Enumeration;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.Enumerations;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.Literal;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NS;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdPackage;
 import fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole;
 
@@ -709,15 +710,17 @@ public class EnumerationImpl extends TitledClassImpl implements Enumeration {
     public boolean buildExplicitLinks( IRiseClipseConsole console ) {
         if( super.buildExplicitLinks( console ) ) return true;
 
+        NS ns = getEnumerations().getNS();
         if( isSetInheritedFrom() ) {
-            setRefersToBaseEnumeration( getEnumerations().getNS().findEnumeration( getInheritedFrom(), console ) );
-            if( getRefersToBaseEnumeration() == null ) {
+            Enumeration foundBase = ns.findEnumeration( getInheritedFrom(), console );
+            if( foundBase == null ) {
                 console.error( "Enumeration (name: " + getInheritedFrom() + ") refers by Enumeration (name: "
-                        + getName() + ") in NS (id:" + getEnumerations().getNS().getId() + ") is unknown" );
+                        + getName() + ") in NS (id:" + ns.getId() + ") is unknown" );
             }
             else {
+                setRefersToBaseEnumeration( foundBase );
                 console.verbose( "Enumeration (name: " + getInheritedFrom() + ") refers by Enumeration (name: "
-                        + getName() + ") in NS (id:" + getEnumerations().getNS().getId() + ") found in NS (id:"
+                        + getName() + ") in NS (id:" + ns.getId() + ") found in NS (id:"
                         + getRefersToBaseEnumeration().getEnumerations().getNS().getId() + ")" );
             }
         }
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/SubDataAttributeImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/SubDataAttributeImpl.java
index a46aef8341d4cbfe081340e77154cb891e8fe02d..2fd4cc70162dcf146da7e8250312965d87aad315 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/SubDataAttributeImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/SubDataAttributeImpl.java
@@ -24,6 +24,7 @@ import fr.centralesupelec.edf.riseclipse.iec61850.nsd.AgAttributeType;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.AgAttributeTypeAndValues;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.AgPresenceCondition;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.ConstructedAttribute;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NS;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdFactory;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdPackage;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.PresenceCondition;
@@ -1761,18 +1762,17 @@ public class SubDataAttributeImpl extends DocumentedClassImpl implements SubData
     public boolean buildExplicitLinks( IRiseClipseConsole console ) {
         if( super.buildExplicitLinks( console ) ) return true;
 
+        NS ns = getConstructedAttribute().getConstructedAttributes().getNS();
         if( isSetPresCond() ) {
-            setRefersToPresenceCondition( getConstructedAttribute().getConstructedAttributes().getNS()
-                    .findPresenceCondition( getPresCond(), console ) );
-            if( getRefersToPresenceCondition() == null ) {
+            PresenceCondition foundPC = ns.findPresenceCondition( getPresCond(), console );
+            if( foundPC == null ) {
                 console.error( "PresenceCondition (name: " + getPresCond() + ") refers by SubDataAttribute (name: "
-                        + getName() + ") in NS (id:"
-                        + getConstructedAttribute().getConstructedAttributes().getNS().getId() + ") is unknown" );
+                        + getName() + ") in NS (id:" + ns.getId() + ") is unknown" );
             }
             else {
+                setRefersToPresenceCondition( foundPC );
                 console.verbose( "PresenceCondition (name: " + getPresCond() + ") refers by SubDataAttribute (name: "
-                        + getName() + ") in NS (id:"
-                        + getConstructedAttribute().getConstructedAttributes().getNS().getId() + ") found in NS (id:"
+                        + getName() + ") in NS (id:" + ns.getId() + ") found in NS (id:"
                         + getRefersToPresenceCondition().getPresenceConditions().getNS().getId() + ")" );
             }
         }
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/SubDataObjectImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/SubDataObjectImpl.java
index ec0402d12ea7de7726911cb7d14c06962fea9488..4db5f674f1540ea0d691fa2cc8e88f406771d5ee 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/SubDataObjectImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/SubDataObjectImpl.java
@@ -25,6 +25,7 @@ import fr.centralesupelec.edf.riseclipse.iec61850.nsd.AgUnderlyingType;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.CDC;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataAttribute;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DefinedAttributeTypeKind;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NS;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdPackage;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.PresenceCondition;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.SubDataObject;
@@ -1994,59 +1995,75 @@ public class SubDataObjectImpl extends DocumentedClassImpl implements SubDataObj
     public boolean buildExplicitLinks( IRiseClipseConsole console ) {
         if( super.buildExplicitLinks( console ) ) return true;
 
+        NS ns = getCDC().getCDCs().getNS();
         if( isSetType() ) {
-            setRefersToCDC( getCDC().getCDCs().getNS().findCDC( getType(), console ) );
-            if( getRefersToCDC() == null ) {
-                console.error( "CDC (name: " + getType() + ") refers by SubDataObject (name: " + getName()
-                        + ") in NS (id:" + getCDC().getCDCs().getNS().getId() + ") is unknown" );
+            CDC foundCDC = ns.findCDC( getType(), console );
+
+            if( foundCDC == null ) {
+                console.error(
+                        "CDC (name: " + getType() + ") refers by SubDataObject (name: " + getName() + ") in NS (id:"
+                                + ns.getId() + ") is unknown" );
             }
             else {
+                setRefersToCDC( foundCDC );
                 console.verbose( "CDC (name: " + getType() + ") refers by SubDataObject (name: " + getName()
-                        + ") in NS (id:" + getCDC().getCDCs().getNS().getId() + ") found in NS (id:"
+                        + ") in NS (id:" + ns.getId() + ") found in NS (id:"
                         + getRefersToCDC().getCDCs().getNS().getId() + ")" );
             }
         }
 
         if( isSetPresCond() ) {
-            setRefersToPresenceCondition( getCDC().getCDCs().getNS().findPresenceCondition( getPresCond(), console ) );
-            if( getRefersToPresenceCondition() == null ) {
+            PresenceCondition foundPC = ns.findPresenceCondition( getPresCond(), console );
+
+            if( foundPC == null ) {
                 console.error( "PresenceCondition (name: " + getPresCond() + ") refers by SubDataObject (name: "
-                        + getName() + ") in NS (id:" + getCDC().getCDCs().getNS().getId() + ") is unknown" );
+                        + getName() + ") in NS (id:" + ns.getId() + ") is unknown" );
             }
             else {
+                setRefersToPresenceCondition( foundPC );
                 console.verbose( "PresenceCondition (name: " + getPresCond() + ") refers by SubDataObject (name: "
-                        + getName() + ") in NS (id:" + getCDC().getCDCs().getNS().getId() + ") found in NS (id:"
+                        + getName() + ") in NS (id:" + ns.getId() + ") found in NS (id:"
                         + getRefersToPresenceCondition().getPresenceConditions().getNS().getId() + ")" );
             }
         }
 
         if( isSetSizeAttribute() ) {
-            setRefersToSizeAttribute( getCDC().getDataAttribute().stream()
-                    .filter( att -> att.getName().equals( getSizeAttribute() ) ).findAny().orElse( null ) );
-            if( getRefersToSizeAttribute() == null ) {
-                console.error( "DataAttribute (name: " + getSizeAttribute()
+            getCDC()
+                    .getDataAttribute()
+                    .stream()
+                    .filter( att -> att.getName().equals( getSizeAttribute() ) )
+                    .findAny()
+                    .ifPresent( att -> setRefersToSizeAttribute( att ) );
+
+            if( isSetRefersToSizeAttribute() ) {
+                console.verbose( "DataAttribute (name: " + getSizeAttribute()
                         + ") refers as sizeAttribute by SubDataObject (name: " + getName() + ") in NS (id:"
-                        + getCDC().getCDCs().getNS().getId() + ") is unknown" );
+                        + ns.getId() + ") found" );
             }
             else {
-                console.verbose( "DataAttribute (name: " + getSizeAttribute()
+                console.error( "DataAttribute (name: " + getSizeAttribute()
                         + ") refers as sizeAttribute by SubDataObject (name: " + getName() + ") in NS (id:"
-                        + getCDC().getCDCs().getNS().getId() + ") found" );
+                        + ns.getId() + ") is unknown" );
             }
         }
 
         if( isSetMaxIndexAttribute() ) {
-            setRefersToMaxIndexAttribute( getCDC().getDataAttribute().stream()
-                    .filter( att -> att.getName().equals( getMaxIndexAttribute() ) ).findAny().orElse( null ) );
-            if( getRefersToMaxIndexAttribute() == null ) {
-                console.error( "DataAttribute (name: " + getMaxIndexAttribute()
+            getCDC()
+                    .getDataAttribute()
+                    .stream()
+                    .filter( att -> att.getName().equals( getSizeAttribute() ) )
+                    .findAny()
+                    .ifPresent( att -> setRefersToMaxIndexAttribute( att ) );
+
+            if( isSetRefersToMaxIndexAttribute() ) {
+                console.verbose( "DataAttribute (name: " + getMaxIndexAttribute()
                         + ") refers as maxIndexAttribute by SubDataObject (name: " + getName() + ") in NS (id:"
-                        + getCDC().getCDCs().getNS().getId() + ") is unknown" );
+                        + ns.getId() + ") found" );
             }
             else {
-                console.verbose( "DataAttribute (name: " + getMaxIndexAttribute()
+                console.error( "DataAttribute (name: " + getMaxIndexAttribute()
                         + ") refers as maxIndexAttribute by SubDataObject (name: " + getName() + ") in NS (id:"
-                        + getCDC().getCDCs().getNS().getId() + ") found" );
+                        + ns.getId() + ") is unknown" );
             }
         }