diff --git a/src/main/java/ui/TDiagramMouseManager.java b/src/main/java/ui/TDiagramMouseManager.java
index 2d1018f2e44aa28f2a1fb423df3d05a91d452904..c5ad2a57ebc3d9e50b632c2b08e2616a02d30e29 100755
--- a/src/main/java/ui/TDiagramMouseManager.java
+++ b/src/main/java/ui/TDiagramMouseManager.java
@@ -41,6 +41,8 @@ package ui;
 import ui.window.JDialogSearchBox;
 
 import java.awt.*;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;
@@ -57,6 +59,7 @@ public class TDiagramMouseManager extends MouseAdapter {//implements MouseListen
     private TDiagramPanel tdp;
 
     private TGComponent tgc;
+    private TGComponent lastSelectedComponent = null;
 
     private int oldx;
     private int oldy;
@@ -99,9 +102,8 @@ public class TDiagramMouseManager extends MouseAdapter {//implements MouseListen
         //System.out.println("Titi");
         if (e.getButton() == MouseEvent.BUTTON3) {
             //System.out.println("toto");
-            if (selected == TGComponentManager.EDIT) {
-                tdp.openPopupMenu(e.getX(), e.getY());
-            }
+        	setSelection(e.getX(), e.getY());
+            tdp.openPopupMenu(e.getX(), e.getY());
         }
 
         //System.out.println("mode = " + tdp.mode + " selected=" + selected);
@@ -120,7 +122,8 @@ public class TDiagramMouseManager extends MouseAdapter {//implements MouseListen
 
 
         if ((tdp.mode == TDiagramPanel.NORMAL) && (selected == TGComponentManager.EDIT)& (e.getButton() == MouseEvent.BUTTON1)) {
-            //search if an element is pointed
+        	setSelection(e.getX(), e.getY());
+        	//search if an element is pointed
             boolean actionMade = false;
             tgc = tdp.componentPointed();
             //System.out.println("Working on TGC=" + tgc);
@@ -455,9 +458,41 @@ public class TDiagramMouseManager extends MouseAdapter {//implements MouseListen
             tdp.getGUI().changeMade(tdp, TDiagramPanel.NEW_COMPONENT);
             tdp.repaint();
         }
-
+       
+        //If one click is done for selection
+        if ((selected == TGComponentManager.EDIT) && (e.getClickCount() == 1) && (e.getButton() == MouseEvent.BUTTON1)) {
+    	    setSelection(e.getX(), e.getY());
+        }
     }
 
+    /**
+     * Set the selection on the clicked component
+     * @author Fabien Tessier
+     */
+    public void setSelection(int x, int y) {
+    	tdp.unselectClickSelectedComponents(); //Unselect all components
+ 	    tgc = null;
+ 	    for (TGComponent tgc: tdp.componentList) {
+             TGComponent tgcTmp = tgc.isOnMeHL(x, y);
+             if (tgcTmp != null && !tgcTmp.hidden) { //Component clicked
+            	 this.tgc = tgcTmp;
+            	 break;
+             }
+ 	    }
+ 	    if (tgc != null) { //A component has been clicked
+     	   lastSelectedComponent = tgc;
+     	   tdp.setSelect(true);
+     	   tgc.singleClick(tdp.getGUI().getFrame(), x, y);       	   
+        }
+        else {
+     	   tdp.setSelect(false);
+     	   lastSelectedComponent = null;
+     	   tdp.componentPointed = null;
+        }
+        tdp.getGUI().changeMade(tdp, TDiagramPanel.CHANGE_VALUE_COMPONENT);
+	    tdp.repaint();
+    }
+    
     public void stopAddingConnector() {
         //TraceManager.addDev("Stop Adding connector in tdmm");
         tdp.mode = TDiagramPanel.NORMAL;
@@ -510,7 +545,7 @@ public class TDiagramMouseManager extends MouseAdapter {//implements MouseListen
             }
         }
 
-        if ((tdp.mode == TDiagramPanel.NORMAL) && (selected == TGComponentManager.EDIT) && (selectedComponent == false)){
+        if ((tdp.mode == TDiagramPanel.NORMAL) && (selected == TGComponentManager.EDIT) && (selectedComponent == false) && (!tdp.isSelect())){
             byte info = tdp.highlightComponent(e.getX(), e.getY());
             if (info > 1) {
                 tgc = tdp.componentPointed();
@@ -644,5 +679,5 @@ public class TDiagramMouseManager extends MouseAdapter {//implements MouseListen
 //
 //    public void removeSelectedComponentFromList(){
 //        this.selectedMultiComponents.clear();
-//    }
+//    }   
 }
diff --git a/src/main/java/ui/TDiagramPanel.java b/src/main/java/ui/TDiagramPanel.java
index 377d6fd324798af19dcf7423aab2c3cc82c6ecb8..28d1d714911ba5f6acf8860a33f75e78516de726 100755
--- a/src/main/java/ui/TDiagramPanel.java
+++ b/src/main/java/ui/TDiagramPanel.java
@@ -111,6 +111,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
     protected TGConnectingPoint selectedConnectingPoint;
     protected CAMSConnectingPoint selectedCAMSConnectingPoints;
     protected TGComponent componentPointed;
+    protected TGComponent lastClickComponent = null;
     protected TGComponent componentPopup;
     protected TToolBar ttb;
     protected TGComponent fatherOfRemoved;
@@ -190,6 +191,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
     protected int sel = 5;
     protected boolean showSelectionZone = false;
     protected boolean selectedTemp = true;
+    protected boolean select = false;
 
     private boolean isScaled;
     private boolean overcomeShowing = false;
@@ -739,9 +741,11 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         for (TGComponent tgc: this.componentList) {
             //state = tgc.getState();
             tgcTmp = tgc.isOnMeHL(x, y);
-            if (tgcTmp != null) {
+            if ((tgcTmp != null && (!select || tgcTmp.isClickSelected())) || tgc.isClickSelected()) {
                 if (!pointedElementFound) {
                     componentPointed = tgcTmp;
+                    if (componentPointed == null)
+                    	componentPointed = tgc;
                     tgc.setState(TGState.POINTED);
                     String tooltip = componentPointed.getToolTipText();
                     if (tooltip!=null && tooltip.length()>0){
@@ -755,7 +759,10 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
                     tgc.setState(TGState.NORMAL);
                 }
             } else {
-                tgc.setState(TGState.NORMAL);
+            	if (tgcTmp != null && tgcTmp.father != null)
+            		tgc.setState(TGState.POINTED);
+            	else
+            		tgc.setState(TGState.NORMAL);
             }
         }
 
@@ -1150,8 +1157,23 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
             tgc.setState(TGState.NORMAL);
         }
     }
-
-
+    
+    /**
+     * Unselect all components (triggered when a single click is done)
+     * @author Fabien Tessier
+     */
+    public void unselectClickSelectedComponents() {
+    	for (TGComponent tgc: this.componentList) {
+            tgc.select(false);
+            tgc.clickSelect(false);
+            tgc.setState(TGState.NORMAL);
+            for (TGComponent tgcTmp: tgc.getRecursiveAllInternalComponent()) {
+            	tgcTmp.select(false);
+                tgcTmp.clickSelect(false);
+                tgcTmp.setState(TGState.NORMAL);
+            }
+        }
+    }
 
     public boolean showSelectionZone(int x, int y) {
         if (GraphicLib.isInRectangle(x, y, xSel, ySel, widthSel, heightSel)) {
@@ -3376,4 +3398,12 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
     public MainGUI getMainGUI(){ //Ajout CD pour creation d'un panel depuis un block
 	return mgui;
     }
+    
+    public boolean isSelect() {
+    	return select;
+    }
+    
+    public void setSelect(boolean b) {
+    	select = b;
+    }
 }
diff --git a/src/main/java/ui/TGCWithInternalComponent.java b/src/main/java/ui/TGCWithInternalComponent.java
index efdac0c6d597451414380ed9bd4820a9d7971b77..1b2d6e71a192ec96a0abb56b59dcdb8d8c620fb0 100755
--- a/src/main/java/ui/TGCWithInternalComponent.java
+++ b/src/main/java/ui/TGCWithInternalComponent.java
@@ -62,8 +62,11 @@ public abstract class TGCWithInternalComponent extends TGComponent{
         if (s != TGState.POINTER_ON_ME) {
             setStateInternalTGComponent(s);
             if (s == TGState.POINTED) {
-                if (selectedInternalComponent != null) {
+               if (selectedInternalComponent != null) {
+            	   if(!tdp.select || (tdp.select && tdp.componentPointed == selectedInternalComponent)) //Check if this is the selected component
                     selectedInternalComponent.setState(TGState.POINTER_ON_ME);
+            	   else
+            		   selectedInternalComponent.setState(TGState.POINTED);
                 } else {
                     if (father == null) {
                         state = TGState.POINTER_ON_ME;
diff --git a/src/main/java/ui/TGComponent.java b/src/main/java/ui/TGComponent.java
index b1b5abaf81b731344528f738af2f00ce842de0b3..7d927979f8bb0bce1e24ab282102aee1c49fc09a 100755
--- a/src/main/java/ui/TGComponent.java
+++ b/src/main/java/ui/TGComponent.java
@@ -171,6 +171,7 @@ public abstract class TGComponent implements CDElement, GenericTree {
 
     protected int state;
     protected boolean selected;
+    protected boolean isSelect = false;
 
     protected int distanceSelected = 5;
 
@@ -1522,6 +1523,10 @@ public abstract class TGComponent implements CDElement, GenericTree {
             if (tgc != null) {
                 return tgc;
             }
+            if (tgcomponent[i].isClickSelected())
+            {
+            	return tgcomponent[i];
+            }
         }
         return null;
     }
@@ -2723,6 +2728,22 @@ public abstract class TGComponent implements CDElement, GenericTree {
         return b;
     }
 
+    /**
+     * Highlight the selected component
+     * @author Fabien Tessier
+     */
+    public final boolean singleClick(JFrame frame, int x, int y)
+    {
+    	boolean b = true;
+    	isSelect = true;
+    	tdp.highlightComponent(x, y);
+    	if (moveable) {
+    		
+    	}
+    	
+    	return b;
+    }
+    
     public final void actionOnRemove(){
         if (removable) {
             myActionWhenRemoved();
@@ -3208,4 +3229,12 @@ public abstract class TGComponent implements CDElement, GenericTree {
             tgcomponent[i].searchForText(text, elements);
         }
     }
+    
+    public boolean isClickSelected() {
+    	return isSelect;
+    }
+    
+    public void clickSelect(boolean b) {
+    	isSelect = b;
+    }
 }