diff --git a/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSBlock.java b/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSBlock.java
index 9250bc1..8239a85 100644
--- a/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSBlock.java
+++ b/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSBlock.java
@@ -14,9 +14,12 @@
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.util.EcoreEList.UnmodifiableEList;
 import org.eclipse.uml2.uml.Class;
+import org.eclipse.uml2.uml.Connector;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Model;
 import org.eclipse.uml2.uml.Package;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.util.UMLUtil;
 import org.polarsys.esf.esfarchitectureconcepts.IMSBlock;
 import org.polarsys.esf.esfarchitectureconcepts.ISConnector;
@@ -113,8 +116,15 @@
     @Override
     public EList<ISPart> getOwnedSPartsList() {
         EList<ISPart> vSPartsList = new BasicEList<ISPart>();
-
-        // TODO: Retrieve all owned SParts of SBlock
+        Class vBase = getBase_Class();
+        if (vBase != null) {
+            for (Property vProperty : vBase.getOwnedAttributes()) {
+                if (UMLUtil.getStereotypeApplication(vProperty, SPart.class) != null) {
+                    ISPart vSPart = (SPart) UMLUtil.getStereotypeApplication(vProperty, SPart.class);
+                    vSPartsList.add(vSPart);
+                }
+            }
+        }
 
         UnmodifiableEList<ISPart> vUSPartsList = new UnmodifiableEList<ISPart>(
             this,
@@ -130,8 +140,16 @@
     @Override
     public EList<ISConnector> getSConnectorsList() {
         EList<ISConnector> vSConnectorsList = new BasicEList<ISConnector>();
-
-        // TODO: Retrieve all SConnectors of SBlock
+        Class vBase = getBase_Class();
+        if (vBase != null) {
+            for (Connector vConnector : vBase.getOwnedConnectors()) {
+                if (UMLUtil.getStereotypeApplication(vConnector, SConnector.class) != null) {
+                    ISConnector vSConnector =
+                        (SConnector) UMLUtil.getStereotypeApplication(vConnector, SConnector.class);
+                    vSConnectorsList.add(vSConnector);
+                }
+            }
+        }
 
         UnmodifiableEList<ISConnector> vUSConnectorsList = new UnmodifiableEList<ISConnector>(
             this,
@@ -147,8 +165,16 @@
     @Override
     public EList<ISPort> getOwnedSPortsList() {
         EList<ISPort> vSPortsList = new BasicEList<ISPort>();
-
-        // TODO: Retrieve all owned SPorts of SBlock
+        Class vBase = getBase_Class();
+        if (vBase != null) {
+            for (Port vPort : vBase.getOwnedPorts()) {
+                if (UMLUtil.getStereotypeApplication(vPort, SPort.class) != null) {
+                    ISPort vSPort =
+                        (SPort) UMLUtil.getStereotypeApplication(vPort, SPort.class);
+                    vSPortsList.add(vSPort);
+                }
+            }
+        }
 
         UnmodifiableEList<ISPort> vUSPortsList = new UnmodifiableEList<ISPort>(
             this,
@@ -157,6 +183,7 @@
             vSPortsList.toArray());
         return vUSPortsList;
     }
+
     /**
      * {@inheritDoc}
      */
diff --git a/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSConnector.java b/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSConnector.java
index 504500a..83ddb55 100644
--- a/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSConnector.java
+++ b/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSConnector.java
@@ -10,84 +10,308 @@
  ******************************************************************************/
 package org.polarsys.esf.esfarchitectureconcepts.impl;
 
+import java.util.Collection;
 import org.eclipse.emf.common.util.BasicEList;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.util.EcoreEList.UnmodifiableEList;
 import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.ConnectorEnd;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.util.UMLUtil;
 import org.polarsys.esf.esfarchitectureconcepts.IAbstractSConnectableElement;
 import org.polarsys.esf.esfarchitectureconcepts.IESFArchitectureConceptsFactory;
 import org.polarsys.esf.esfarchitectureconcepts.IMSConnector;
 import org.polarsys.esf.esfarchitectureconcepts.ISBlock;
+import org.polarsys.esf.esfarchitectureconcepts.ISPort;
+import org.polarsys.esf.esfarchitectureconcepts.SDirection;
 import org.polarsys.esf.esfcore.impl.GenericAbstractSElement;
 
 /**
- * This class can override the generated class {@link SConnector}
- * and will be used by the custom factory.
+ * This class can override the generated class {@link SConnector} and will be
+ * used by the custom factory.
  *
  * @author $Author: ymunoz $
  * @version $Revision: 168 $
  */
-public class MSConnector
-    extends SConnector
-    implements IMSConnector {
+public class MSConnector extends SConnector implements IMSConnector {
 
-    /**
-     * Default constructor.
-     */
-    public MSConnector() {
-        super();
-    }
+	/**
+	 * Default constructor.
+	 */
+	public MSConnector() {
+		super();
+	}
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getName() {
-        return GenericAbstractSElement.getName(getBase_Connector());
-    }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public String getName() {
+		return GenericAbstractSElement.getName(getBase_Connector());
+	}
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getUUID() {
-        return GenericAbstractSElement.getUUID(getBase_Connector());
-    }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public String getUUID() {
+		return GenericAbstractSElement.getUUID(getBase_Connector());
+	}
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public EList<IAbstractSConnectableElement> getEndsList() {
-        EList<IAbstractSConnectableElement> vSConnectableElementsList = new BasicEList<IAbstractSConnectableElement>();
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public EList<IAbstractSConnectableElement> getEndsList() {
+		EList<IAbstractSConnectableElement> vSConnectableElementsList = new BasicEList<IAbstractSConnectableElement>();
+		Connector vBase = getBase_Connector();
 
-        // TODO: Retrieve all Ends of SConnector
+		if (vBase != null) {
+			if (vBase.getEnds().size() >= 2) {
+				ConnectorEnd vEnd1 = vBase.getEnds().get(0);
+				ConnectorEnd vEnd2 = vBase.getEnds().get(1);
+				if ((vEnd1.getRole() != null) && (vEnd2.getRole() != null)) {
+					if ((UMLUtil.getStereotypeApplication(vEnd1.getRole(), SPort.class) != null)
+							&& (UMLUtil.getStereotypeApplication(vEnd2.getRole(), SPort.class) != null)) {
+						// Get the two Ports
+						ISPort vSPort1 = (ISPort) UMLUtil.getStereotypeApplication(vEnd1.getRole(), SPort.class);
+						ISPort vSPort2 = (ISPort) UMLUtil.getStereotypeApplication(vEnd2.getRole(), SPort.class);
+						vSConnectableElementsList.add(vSPort1);
+						vSConnectableElementsList.add(vSPort2);
+					}
+				}
+			}
+		}
 
-        UnmodifiableEList<IAbstractSConnectableElement> vUSConnectableElementsList =
-            new UnmodifiableEList<IAbstractSConnectableElement>(
-                this,
-                ESFArchitectureConceptsPackage.eINSTANCE.getSConnector_EndsList(),
-                vSConnectableElementsList.size(),
-                vSConnectableElementsList.toArray());
-        return vUSConnectableElementsList;
-    }
+		UnmodifiableEList<IAbstractSConnectableElement> vUSConnectableElementsList = new UnmodifiableEList<IAbstractSConnectableElement>(
+				this, ESFArchitectureConceptsPackage.eINSTANCE.getSConnector_EndsList(),
+				vSConnectableElementsList.size(), vSConnectableElementsList.toArray());
+		return vUSConnectableElementsList;
+	}
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ISBlock basicGetOwner() {
-        Connector vBase = getBase_Connector();
-        ISBlock vSBlock = IESFArchitectureConceptsFactory.eINSTANCE.createSBlock();
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public ISBlock basicGetOwner() {
+		Connector vBase = getBase_Connector();
+		ISBlock vSBlock = IESFArchitectureConceptsFactory.eINSTANCE.createSBlock();
 
-        if (vBase != null) {
-            Element vOwner = vBase.getOwner();
-            if ((vOwner != null) && (UMLUtil.getStereotypeApplication(vOwner, SBlock.class) != null)) {
-                vSBlock = (SBlock) UMLUtil.getStereotypeApplication(vOwner, SBlock.class);
-            }
-        }
-        return vSBlock;
-    }
+		if (vBase != null) {
+			Element vOwner = vBase.getOwner();
+			if ((vOwner != null) && (UMLUtil.getStereotypeApplication(vOwner, SBlock.class) != null)) {
+				vSBlock = (SBlock) UMLUtil.getStereotypeApplication(vOwner, SBlock.class);
+			}
+		}
+		return vSBlock;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public EList<IAbstractSConnectableElement> getSourcesList() {
+		EList<IAbstractSConnectableElement> vSourcesList = new BasicEList<IAbstractSConnectableElement>();
+		Connector vBase = getBase_Connector();
+
+		if (vBase != null) {
+			EList<IAbstractSConnectableElement> vEnds = getEndsList();
+			if (vEnds.size() >= 2) {
+				vSourcesList.addAll(getSourcePorts(vEnds));
+			}
+		}
+
+		UnmodifiableEList<IAbstractSConnectableElement> vUSourcesList = new UnmodifiableEList<IAbstractSConnectableElement>(
+				this, ESFArchitectureConceptsPackage.eINSTANCE.getSConnector_EndsList(), vSourcesList.size(),
+				vSourcesList.toArray());
+		return vUSourcesList;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public EList<IAbstractSConnectableElement> getTargetsList() {
+		EList<IAbstractSConnectableElement> vTargetsList = new BasicEList<IAbstractSConnectableElement>();
+		Connector vBase = getBase_Connector();
+
+		if (vBase != null) {
+			EList<IAbstractSConnectableElement> vEnds = getEndsList();
+			if (vEnds.size() >= 2) {
+				vTargetsList.addAll(getTargetPorts(vEnds));
+			}
+		}
+
+		UnmodifiableEList<IAbstractSConnectableElement> vUSTargetsList = new UnmodifiableEList<IAbstractSConnectableElement>(
+				this, ESFArchitectureConceptsPackage.eINSTANCE.getSConnector_EndsList(), vTargetsList.size(),
+				vTargetsList.toArray());
+		return vUSTargetsList;
+	}
+
+	/**
+	 * Verify what are the SPorts who play the source's role and get them.
+	 *
+	 * @param pSPorts
+	 *            The SPorts from the SConnector
+	 * @return The source SPorts
+	 */
+	private Collection<? extends IAbstractSConnectableElement> getSourcePorts(
+			final EList<IAbstractSConnectableElement> pSPorts) {
+
+		if (pSPorts.size() < 2) {
+			throw new IllegalArgumentException(Integer.toString(pSPorts.size()));
+		}
+
+		EList<IAbstractSConnectableElement> vSourcePortsList = new BasicEList<IAbstractSConnectableElement>();
+
+		// Get the two SPorts
+		ISPort vSPort1 = (ISPort) pSPorts.get(0);
+		ISPort vSPort2 = (ISPort) pSPorts.get(1);
+
+		// Get the direction for each SPort
+		SDirection vDirectionOfPort1 = vSPort1.getSDirection();
+		SDirection vDirectionOfPort2 = vSPort2.getSDirection();
+
+		// Get the owner for each Port
+		Element vOwnerOfPort1 = vSPort1.getBase_Port().getOwner();
+		Element vOwnerOfPort2 = vSPort2.getBase_Port().getOwner();
+
+		// Get the part with port for each ConnectorEnd
+		Element vPartWithPort1 = getBase_Connector().getEnds().get(0).getPartWithPort();
+		Element vPartWithPort2 = getBase_Connector().getEnds().get(1).getPartWithPort();
+
+		// 1. Verify if the connection is between SBlock and SPart
+		if (((vPartWithPort1 != null) && (vPartWithPort2 == null))
+				|| ((vPartWithPort1 == null) && (vPartWithPort2 != null))) {
+
+			// 1.1 Verify if the connection is between : [SBlock::SPort_IN] ->
+			// [SPart::SPort_IN]
+			if (SDirection.IN.equals(vDirectionOfPort1) && SDirection.IN.equals(vDirectionOfPort2)) {
+
+				// If "ownerOfPort1" contains "partWithPort2" than "SPort1" is
+				// the source
+				if ((vPartWithPort2 != null) && (vOwnerOfPort1.getOwnedElements().contains(vPartWithPort2))) {
+					vSourcePortsList.add(vSPort1);
+
+					// If "ownerOfPort2" contains "partWithPort1" than "SPort2"
+					// is the source
+				} else if ((vPartWithPort1 != null) && (vOwnerOfPort2.getOwnedElements().contains(vPartWithPort1))) {
+					vSourcePortsList.add(vSPort2);
+				}
+
+				// 1.2 If the connection is between : [SPart::SPort_OUT] ->
+				// [SBlock::SPort_OUT]
+			} else if (SDirection.OUT.equals(vDirectionOfPort1) && SDirection.OUT.equals(vDirectionOfPort2)) {
+
+				// If "partWithPort2" is child of "ownerOfPort1" than "SPort2"
+				// is the source
+				if ((vPartWithPort2 != null) && (vPartWithPort2.getOwner().equals(vOwnerOfPort1))) {
+					vSourcePortsList.add(vSPort2);
+
+					// If "partWithPort1" is child of "ownerOfPort2" than return
+					// "SPort1" is the source
+				} else if ((vPartWithPort1 != null) && (vPartWithPort1.getOwner().equals(vOwnerOfPort2))) {
+					vSourcePortsList.add(vSPort1);
+				}
+			}
+
+			// 2. If the connection is between : [SPart::SPort_OUT] ->
+			// [SPart::SPort_IN]
+		} else if ((vPartWithPort1 != null) && (vPartWithPort2 != null)) {
+
+			// If the direction of "SPort1" is OUT and the direction of "SPort2"
+			// is IN than "SPort1" is the source
+			if (SDirection.OUT.equals(vDirectionOfPort1) && SDirection.IN.equals(vDirectionOfPort2)) {
+				vSourcePortsList.add(vSPort1);
+
+				// If the direction of "SPort2" is OUT and the direction of
+				// "SPort1" is IN than "SPort2" is the source
+			} else if (SDirection.OUT.equals(vDirectionOfPort2) && SDirection.IN.equals(vDirectionOfPort1)) {
+				vSourcePortsList.add(vSPort2);
+			}
+		}
+		return vSourcePortsList;
+	}
+
+	/**
+	 * Verify what are the SPorts who play the target's role and get them.
+	 *
+	 * @param pSPorts
+	 *            The SPorts from the SConnector
+	 * @return The target SPorts
+	 */
+	private Collection<? extends IAbstractSConnectableElement> getTargetPorts(
+			final EList<IAbstractSConnectableElement> pSPorts) {
+
+		if (pSPorts.size() != 2) {
+			throw new IllegalArgumentException(Integer.toString(pSPorts.size()));
+		}
+
+		EList<IAbstractSConnectableElement> vTargetPortsList = new BasicEList<IAbstractSConnectableElement>();
+
+		// Get the two SPorts
+		ISPort vSPort1 = (ISPort) pSPorts.get(0);
+		ISPort vSPort2 = (ISPort) pSPorts.get(1);
+
+		// Get the type for each SPort
+		SDirection vDirectionOfPort1 = vSPort1.getSDirection();
+		SDirection vDirectionOfPort2 = vSPort2.getSDirection();
+
+		// Get the owner for each Port
+		Element vOwnerOfPort1 = vSPort1.getBase_Port().getOwner();
+		Element vOnerOfPort2 = vSPort2.getBase_Port().getOwner();
+
+		// Get the part with port for each ConnectorEnd
+		Element vParttWithPort1 = getBase_Connector().getEnds().get(0).getPartWithPort();
+		Element vPartWithPort2 = getBase_Connector().getEnds().get(1).getPartWithPort();
+
+		// 1. Verify if the connection is between Block and Part
+		if (((vParttWithPort1 != null) && (vPartWithPort2 == null))
+				|| ((vParttWithPort1 == null) && (vPartWithPort2 != null))) {
+			// 1.1 Verify if the connection is between : [SBlock::SPort_IN] ->
+			// [SPart::SPort_IN]
+			if (SDirection.IN.equals(vDirectionOfPort1) && SDirection.IN.equals(vDirectionOfPort2)) {
+
+				// If "ownerOfPort1" contains "partWithPort2" than return
+				// "SPort2" is the target
+				if ((vPartWithPort2 != null) && (vOwnerOfPort1.getOwnedElements().contains(vPartWithPort2))) {
+					vTargetPortsList.add(vSPort2);
+
+					// If "ownerOfPort2" contains "partWithPort1" than "SPort1"
+					// is the target
+				} else if ((vParttWithPort1 != null) && (vOnerOfPort2.getOwnedElements().contains(vParttWithPort1))) {
+					vTargetPortsList.add(vSPort1);
+				}
+
+				// 1.2 If the connection is between : [SPart::SPort_OUT] ->
+				// [SBlock::SPort_OUT]
+			} else if (SDirection.OUT.equals(vDirectionOfPort1) && SDirection.OUT.equals(vDirectionOfPort2)) {
+				// If "partWithPort2" is child of "ownerOfPort1" than "SPort1"
+				// is the target
+				if ((vPartWithPort2 != null) && (vPartWithPort2.getOwner().equals(vOwnerOfPort1))) {
+					vTargetPortsList.add(vSPort1);
+
+					// If "partWithPort1" is child of "ownerOfPort2" than
+					// "SPort2" is the target
+				} else if ((vParttWithPort1 != null) && (vParttWithPort1.getOwner().equals(vOnerOfPort2))) {
+					vTargetPortsList.add(vSPort2);
+				}
+			}
+
+			// 2. If the connection is between : [SPart::SPort_OUT] ->
+			// [SPart::SPort_IN]
+		} else if ((vParttWithPort1 != null) && (vPartWithPort2 != null)) {
+			// If the direction of "SPort1" is OUT and the direction of "SPort2"
+			// is IN than "SPort2" is the target
+			if (SDirection.OUT.equals(vDirectionOfPort1) && SDirection.IN.equals(vDirectionOfPort2)) {
+				vTargetPortsList.add(vSPort2);
+
+				// If the direction of "SPort2" is OUT and the direction of
+				// "SPort1" is IN than "SPort1" is the target
+			} else if (SDirection.OUT.equals(vDirectionOfPort2) && SDirection.IN.equals(vDirectionOfPort1)) {
+				vTargetPortsList.add(vSPort1);
+			}
+		}
+		return vTargetPortsList;
+	}
 }
diff --git a/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSPort.java b/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSPort.java
index bb6ddd1..693f432 100644
--- a/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSPort.java
+++ b/core/profile/org.polarsys.esf.core.profile.esfarchitectureconcepts/src/main/java/org/polarsys/esf/esfarchitectureconcepts/impl/MSPort.java
@@ -13,6 +13,8 @@
 import org.eclipse.emf.common.util.BasicEList;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.util.EcoreEList.UnmodifiableEList;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.ConnectorEnd;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.util.UMLUtil;
@@ -63,8 +65,20 @@
     @Override
     public EList<ISConnector> getSConnectorsList() {
         EList<ISConnector> vSConnectorsList = new BasicEList<ISConnector>();
+        Port vBase = getBase_Port();
 
-        // TODO: Retrieve all SConnectors of SPort
+        if (vBase != null) {
+            for (ConnectorEnd vEnd : vBase.getEnds()) {
+                if (vEnd.getOwner() instanceof Connector) {
+                    Connector vConnector = (Connector)vEnd.getOwner();
+                    if (UMLUtil.getStereotypeApplication(vConnector, SConnector.class) != null) {
+                        ISConnector vSConnector =
+                            (SConnector) UMLUtil.getStereotypeApplication(vConnector, SConnector.class);
+                        vSConnectorsList.add(vSConnector);
+                    }
+                }
+            }
+        }
 
         UnmodifiableEList<ISConnector> vUSConnectorsList = new UnmodifiableEList<ISConnector>(
             this,
