diff --git a/src/main/java/ui/eln/sca_eln/ELNComponentIndependentCurrentSource.java b/src/main/java/ui/eln/sca_eln/ELNComponentIndependentCurrentSource.java
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ab2d0c6c1291fc8ae9f11463a01c0446d1c87ca9 100644
--- a/src/main/java/ui/eln/sca_eln/ELNComponentIndependentCurrentSource.java
+++ b/src/main/java/ui/eln/sca_eln/ELNComponentIndependentCurrentSource.java
@@ -0,0 +1,718 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+package ui.eln.sca_eln;
+
+import myutil.GraphicLib;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import ui.*;
+import ui.eln.ELNConnectingPoint;
+import ui.window.JDialogELNComponentIndependentCurrentSource;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * Class ELNComponentIndependentCurrentSource
+ * Independent current source to be used in ELN diagrams
+ * Creation: 15/06/2018
+ * @version 1.0 15/06/2018
+ * @author Irina Kit Yan LEE
+ */
+
+public class ELNComponentIndependentCurrentSource extends TGCScalableWithInternalComponent implements ActionListener {
+    protected Color myColor;
+    protected int orientation;
+	private int maxFontSize = 14;
+    private int minFontSize = 4;
+    private int currentFontSize = -1;
+
+    private int textX = 15;
+    private double dtextX = 0.0;
+    protected int decPoint = 3;
+
+	private double initValue, offset, amplitude, frequency, phase, acAmplitude, acPhase, acNoiseAmplitude;
+	private String delay;
+	private String unit0;
+	
+	private int position = 0;
+	private boolean fv_0_2 = false, fv_1_3 = false, fh_0_2 = false, fh_1_3 = false;
+	private int old;
+	private boolean first;
+    
+    public ELNComponentIndependentCurrentSource(int _x, int _y, int _minX, int _maxX, int _minY, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp)  {
+        super(_x, _y, _minX, _maxX, _minY, _maxY, _pos, _father, _tdp);
+
+        initScaling(60, 80);
+
+        dtextX = textX * oldScaleFactor;
+        textX = (int)dtextX;
+        dtextX = dtextX - textX;
+        
+        minWidth = 1;
+        minHeight = 1;
+
+        initConnectingPoint(2);
+                
+        addTGConnectingPointsComment();
+
+        moveable = true;
+        editable = true;
+        removable = true;
+        userResizable = false;
+        value = tdp.findELNComponentName("ISource");
+        
+        setInitValue(0.0);
+        setOffset(0.0);
+        setAmplitude(0.0);
+        setFrequency(0.0);
+        setUnit0("Hz");
+        setPhase(0.0);
+        setDelay("sc_core::SC_ZERO_TIME");
+        setAcAmplitude(0.0);
+        setAcPhase(0.0);
+        setAcNoiseAmplitude(0.0);
+        
+        old = width;
+		width = height;
+		height = old;
+    }
+
+    public void initConnectingPoint(int nb) {
+        nbConnectingPoint = nb;
+        connectingPoint = new TGConnectingPoint[nb];
+        connectingPoint[0] = new ELNConnectingPoint(this, 0, 0, true, true, 1.0/3.0, 0.0, "p");
+        connectingPoint[1] = new ELNConnectingPoint(this, 0, 0, true, true, 1.0/3.0, 1.0, "n");
+    }
+
+    public Color getMyColor() {
+        return myColor;
+    }
+
+    public void internalDrawing(Graphics g) {
+        Font f = g.getFont();
+        Font fold = f;
+
+    	if (this.rescaled && !this.tdp.isScaled()) {
+            this.rescaled = false;
+            int maxCurrentFontSize = Math.max(0, Math.min(this.height, (int) (this.maxFontSize * this.tdp.getZoom())));
+            f = f.deriveFont((float) maxCurrentFontSize);
+
+            while (maxCurrentFontSize > (this.minFontSize * this.tdp.getZoom() - 1)) {
+            	if (g.getFontMetrics().stringWidth(value) < (width - (2 * textX))) {
+            		break;
+            	}
+                maxCurrentFontSize--;
+                f = f.deriveFont((float) maxCurrentFontSize);
+            }
+
+            if (this.currentFontSize < this.minFontSize * this.tdp.getZoom()) {
+                maxCurrentFontSize++;
+                f = f.deriveFont((float) maxCurrentFontSize);
+            }
+            g.setFont(f);
+            this.currentFontSize = maxCurrentFontSize;
+        } else {
+            f = f.deriveFont(this.currentFontSize);
+    	}
+
+    	Color c = g.getColor();
+    	double w0 = ((ELNConnectingPoint) connectingPoint[0]).getW();
+		double h0 = ((ELNConnectingPoint) connectingPoint[0]).getH();
+		double w1 = ((ELNConnectingPoint) connectingPoint[1]).getW();
+		double h1 = ((ELNConnectingPoint) connectingPoint[1]).getH();
+
+		if (position == 0) {
+			if (first == false) {
+				first = true;
+				old = width;
+				width = height;
+				height = old;
+			}
+
+			((ELNConnectingPoint) connectingPoint[0]).setW(w0);
+			((ELNConnectingPoint) connectingPoint[0]).setH(h0);
+			((ELNConnectingPoint) connectingPoint[1]).setW(w1);
+			((ELNConnectingPoint) connectingPoint[1]).setH(h1);
+
+			int attributeFontSize = this.currentFontSize * 5 / 6;
+			int sh0 = g.getFontMetrics().getAscent();
+			int sh1 = g.getFontMetrics().getAscent();
+			int w = g.getFontMetrics().stringWidth(value);
+			g.setFont(f.deriveFont((float) attributeFontSize));
+			g.setFont(f);
+			g.setFont(f.deriveFont(Font.BOLD));
+			g.drawString(value, x + (width - w) / 2, y - height / 4);
+			g.setFont(f.deriveFont(Font.PLAIN));
+
+			if ((fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)) {
+				rotateTop(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y+height+sh1);
+			}
+			if ((fv_0_2 == false && fv_1_3 == false && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)) {
+				rotateTop(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y+height+sh1);
+			}
+			if ((fv_0_2 == true && fv_1_3 == false && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)) {
+				rotateBottom(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y+height+sh0);
+			}
+			if ((fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)) {
+				rotateBottom(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y+height+sh0);
+			}
+		} else if (position == 1) {
+			if (first == false) {
+				first = true;
+				old = width;
+				width = height;
+				height = old;
+			}
+
+			((ELNConnectingPoint) connectingPoint[0]).setW(h0);
+			((ELNConnectingPoint) connectingPoint[0]).setH(w0);
+			((ELNConnectingPoint) connectingPoint[1]).setW(h1);
+			((ELNConnectingPoint) connectingPoint[1]).setH(w1);
+
+			int attributeFontSize = this.currentFontSize * 5 / 6;
+			int sw0 = g.getFontMetrics().stringWidth("p");
+			int sh0 = g.getFontMetrics().getAscent();
+			int sw1 = g.getFontMetrics().stringWidth("n");
+			int sh1 = g.getFontMetrics().getAscent();
+			int w = g.getFontMetrics().stringWidth(value);
+			g.setFont(f.deriveFont((float) attributeFontSize));
+			g.setFont(f);
+			g.setFont(f.deriveFont(Font.BOLD));
+			g.drawString(value, x + (width - w) / 2, y - height / 2);
+			g.setFont(f.deriveFont(Font.PLAIN));
+
+			if ((fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)) {
+				rotateRight(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x - sw0,
+						y + height / 2 + height / 4 + sh0);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x + width,
+						y + height / 2 + height / 4 + sh1);
+			}
+			if ((fv_0_2 == false && fv_1_3 == false && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)) {
+				rotateRight(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x - sw0,
+						y + height / 2 + height / 4 + sh0);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x + width,
+						y + height / 2 + height / 4 + sh1);
+			}
+			if ((fv_0_2 == true && fv_1_3 == false && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)) {
+				rotateLeft(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x - sw1,
+						y + height / 2 + height / 4 + sh1);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x + width,
+						y + height / 2 + height / 4 + sh0);
+			}
+			if ((fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)) {
+				rotateLeft(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x - sw1,
+						y + height / 2 + height / 4 + sh1);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x + width,
+						y + height / 2 + height / 4 + sh0);
+			}
+		} else if (position == 2) {
+			if (first == false) {
+				first = true;
+				old = width;
+				width = height;
+				height = old;
+			}
+
+			((ELNConnectingPoint) connectingPoint[0]).setW(w0);
+			((ELNConnectingPoint) connectingPoint[0]).setH(h0);
+			((ELNConnectingPoint) connectingPoint[1]).setW(w1);
+			((ELNConnectingPoint) connectingPoint[1]).setH(h1);
+
+			int attributeFontSize = this.currentFontSize * 5 / 6;
+			int sh0 = g.getFontMetrics().getAscent();
+			int sh1 = g.getFontMetrics().getAscent();
+			int w = g.getFontMetrics().stringWidth(value);
+			g.setFont(f.deriveFont((float) attributeFontSize));
+			g.setFont(f);
+			g.setFont(f.deriveFont(Font.BOLD));
+			g.drawString(value, x + (width - w) / 2, y - height / 4);
+			g.setFont(f.deriveFont(Font.PLAIN));
+
+			if ((fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)) {
+				rotateBottom(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y+height+sh0);
+			}
+			if ((fv_0_2 == false && fv_1_3 == false && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)) {
+				rotateBottom(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y+height+sh0);
+			}
+			if ((fv_0_2 == true && fv_1_3 == false && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)) {
+				rotateTop(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y+height+sh1);
+			}
+			if ((fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)) {
+				rotateTop(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y+height+sh1);
+			}
+		} else if (position == 3) {
+			if (first == false) {
+				first = true;
+				old = width;
+				width = height;
+				height = old;
+			}
+
+			((ELNConnectingPoint) connectingPoint[0]).setW(h0);
+			((ELNConnectingPoint) connectingPoint[0]).setH(w0);
+			((ELNConnectingPoint) connectingPoint[1]).setW(h1);
+			((ELNConnectingPoint) connectingPoint[1]).setH(w1);
+
+			int attributeFontSize = this.currentFontSize * 5 / 6;
+			int sw0 = g.getFontMetrics().stringWidth("p");
+			int sh0 = g.getFontMetrics().getAscent();
+			int sw1 = g.getFontMetrics().stringWidth("n");
+			int sh1 = g.getFontMetrics().getAscent();
+			int w = g.getFontMetrics().stringWidth(value);
+			g.setFont(f.deriveFont((float) attributeFontSize));
+			g.setFont(f);
+			g.setFont(f.deriveFont(Font.BOLD));
+			g.drawString(value, x + (width - w) / 2, y - height / 2);
+			g.setFont(f.deriveFont(Font.PLAIN));
+
+			if ((fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)) {
+				rotateLeft(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x - sw1,
+						y + height / 2 + height / 4 + sh1);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x + width,
+						y + height / 2 + height / 4 + sh0);
+			}
+			if ((fv_0_2 == false && fv_1_3 == false && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)) {
+				rotateLeft(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x - sw1,
+						y + height / 2 + height / 4 + sh1);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x + width,
+						y + height / 2 + height / 4 + sh0);
+			}
+			if ((fv_0_2 == true && fv_1_3 == false && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)) {
+				rotateRight(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x - sw0,
+						y + height / 2 + height / 4 + sh0);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x + width,
+						y + height / 2 + height / 4 + sh1);
+			}
+			if ((fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)
+					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
+					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)) {
+				rotateRight(g);
+				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x - sw0,
+						y + height / 2 + height / 4 + sh0);
+				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x + width,
+						y + height / 2 + height / 4 + sh1);
+			}
+		}
+        g.setColor(c);
+        g.setFont(fold);
+    }
+
+    private void rotateTop(Graphics g) {
+    	int [] ptx0 = {x+width/3, x+width/3};
+        int [] pty0 = {y, y+height/4};
+        g.drawPolygon(ptx0, pty0, 2);
+        int [] ptx1 = {x+width/3, x+width/3};
+        int [] pty1 = {y+3*height/4, y+height};
+        g.drawPolygon(ptx1, pty1, 2);
+        int [] ptx2 = {x, x+2*width/3};
+        int [] pty2 = {y+height/2, y+height/2};
+        g.drawPolygon(ptx2, pty2, 2);
+        g.drawOval(x, y+height/4, 2*width/3, height/2);
+        int [] ptx3 = {x+2*width/3+width/6, x+2*width/3+width/6, x+2*width/3, x+2*width/3+width/6, x+width, x+2*width/3+width/6};
+        int [] pty3 = {y+height/4, y+3*height/4, y+3*height/4-width/6, y+3*height/4, y+3*height/4-width/6, y+3*height/4};
+        g.drawPolygon(ptx3, pty3, 6);
+   }
+   
+   private void rotateBottom(Graphics g) {
+	   int [] ptx0 = {x+2*width/3, x+2*width/3};
+       int [] pty0 = {y, y+height/4};
+       g.drawPolygon(ptx0, pty0, 2);
+       int [] ptx1 = {x+2*width/3, x+2*width/3};
+       int [] pty1 = {y+3*height/4, y+height};
+       g.drawPolygon(ptx1, pty1, 2);
+       int [] ptx2 = {x+width/3, x+width};
+       int [] pty2 = {y+height/2, y+height/2};
+       g.drawPolygon(ptx2, pty2, 2);
+       g.drawOval(x+width/3, y+height/4, 2*width/3, height/2);
+       int [] ptx3 = {x+width/6, x+width/6, x, x+width/6, x+width/3, x+width/6};
+       int [] pty3 = {y+height/4, y+3*height/4, y+3*height/4-width/6, y+3*height/4, y+3*height/4-width/6, y+3*height/4};
+       g.drawPolygon(ptx3, pty3, 6);
+   }
+   
+   private void rotateRight(Graphics g) {
+   	int [] ptx0 = {x, x+width};
+       int [] pty0 = {y+height/2, y+height/2};
+       g.drawPolygon(ptx0, pty0, 2);
+       int [] ptx1 = {x+width/4-width/8, x+width/4-width/8, x+width/4-width/8-height/8, x+width/4-width/8+height/8, x+width/4-width/8, x+width/4-width/8};
+       int [] pty1 = {y+height/2-height/4, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y};
+       g.drawPolygon(ptx1, pty1, 6);
+       int [] ptx2 = {x+3*width/4+width/8, x+3*width/4+width/8};
+       int [] pty2 = {y+height/2-height/4, y};
+       g.drawPolygon(ptx2, pty2, 2);
+       g.drawOval(x+width/4, y, width/2, height);
+   }
+   
+   private void rotateLeft(Graphics g) {
+   	int [] ptx0 = {x, x+width};
+       int [] pty0 = {y+height/2, y+height/2};
+       g.drawPolygon(ptx0, pty0, 2);
+       int [] ptx1 = {x+width-width/8, x+width-width/8, x+width-width/8-height/8, x+width-width/8+height/8, x+width-width/8, x+width-width/8};
+       int [] pty1 = {y+height/2-height/4, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y};
+       g.drawPolygon(ptx1, pty1, 6);
+       int [] ptx2 = {x+width/8, x+width/8};
+       int [] pty2 = {y+height/2-height/4, y};
+       g.drawPolygon(ptx2, pty2, 2);
+       g.drawOval(x+width/4, y, width/2, height);
+   }
+    
+    public TGComponent isOnOnlyMe(int _x, int _y) {
+        if (GraphicLib.isInRectangle(_x, _y, x, y, width, height)) {
+            return this;
+        }
+        return null;
+    }
+    
+    public int getType() {
+    	return TGComponentManager.ELN_INDEPENDENT_CURRENT_SOURCE;
+    }
+
+    public boolean editOndoubleClick(JFrame frame) {
+    	JDialogELNComponentIndependentCurrentSource jde = new JDialogELNComponentIndependentCurrentSource(this);
+    	jde.setVisible(true);
+        return true;
+    }
+    
+    public StringBuffer encode(String data) {
+    	StringBuffer databuf = new StringBuffer(data);
+    	StringBuffer buffer = new StringBuffer("");
+        for(int pos = 0; pos != data.length(); pos++) {
+        	char c = databuf.charAt(pos);
+            switch(c) {
+                case '\u03BC' : 
+                	buffer.append("&#x3BC;");      
+                	break;
+                default :   
+                	buffer.append(databuf.charAt(pos)); 
+                	break;
+            }
+        }
+        return buffer;
+    }
+
+    protected String translateExtraParam() {
+        StringBuffer sb = new StringBuffer("<extraparam>\n");
+        sb.append("<attributes init_value=\"" + initValue);
+        sb.append("\" offset=\"" + offset);
+        sb.append("\" amplitude=\"" + amplitude);
+        sb.append("\" frequency=\"" + frequency);
+        sb.append("\" unit0=\"" + encode(unit0));
+        sb.append("\" phase=\"" + phase);
+        sb.append("\" delay=\"" + delay);
+        sb.append("\" ac_amplitude=\"" + acAmplitude);
+        sb.append("\" ac_phase=\"" + acPhase);
+		sb.append("\" ac_noise_amplitude=\"" + acNoiseAmplitude + "\"");
+        sb.append("/>\n");
+        sb.append("</extraparam>\n");
+        return new String(sb);
+    }
+
+	public void loadExtraParam(NodeList nl, int decX, int decY, int decId) throws MalformedModelingException{
+        try {
+            NodeList nli;
+            Node n1, n2;
+            Element elt;
+            
+            double initValue, offset, amplitude, frequency, phase, acAmplitude, acPhase, acNoiseAmplitude;
+        	String delay;
+        	String unit0;
+
+            for(int i=0; i<nl.getLength(); i++) {
+                n1 = nl.item(i);
+                if (n1.getNodeType() == Node.ELEMENT_NODE) {
+                    nli = n1.getChildNodes();
+                    for(int j=0; j<nli.getLength(); j++) {
+                        n2 = nli.item(j);
+                        if (n2.getNodeType() == Node.ELEMENT_NODE) {
+                            elt = (Element) n2;
+                            if (elt.getTagName().equals("attributes")) {
+                            	initValue = Double.parseDouble(elt.getAttribute("init_value"));
+                            	offset = Double.parseDouble(elt.getAttribute("offset"));
+                            	amplitude = Double.parseDouble(elt.getAttribute("amplitude"));
+                            	frequency = Double.parseDouble(elt.getAttribute("frequency"));
+                            	unit0 = elt.getAttribute("unit0");
+                            	phase = Double.parseDouble(elt.getAttribute("phase"));
+                            	delay = elt.getAttribute("delay");
+                            	acAmplitude = Double.parseDouble(elt.getAttribute("ac_amplitude"));
+                            	acPhase = Double.parseDouble(elt.getAttribute("ac_phase"));
+                            	acNoiseAmplitude = Double.parseDouble(elt.getAttribute("ac_noise_amplitude"));
+								setInitValue(initValue);
+								setOffset(offset);
+								setAmplitude(amplitude);
+								setFrequency(frequency);
+                            	setUnit0(unit0);
+                            	setPhase(phase);
+								setDelay(delay);
+								setAcAmplitude(acAmplitude);
+								setAcPhase(acPhase);
+								setAcNoiseAmplitude(acNoiseAmplitude);
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw new MalformedModelingException();
+        }
+    }
+	
+	public void addActionToPopupMenu(JPopupMenu componentMenu, ActionListener menuAL, int x, int y) {
+		componentMenu.addSeparator();
+
+		JMenuItem rotateright = new JMenuItem("Rotate right 90°");
+		rotateright.addActionListener(this);
+		componentMenu.add(rotateright);
+
+		JMenuItem rotateleft = new JMenuItem("Rotate left 90°");
+		rotateleft.addActionListener(this);
+		componentMenu.add(rotateleft);
+
+		componentMenu.addSeparator();
+
+		JMenuItem rotatevertically = new JMenuItem("Flip vertically");
+		rotatevertically.addActionListener(this);
+		componentMenu.add(rotatevertically);
+
+		JMenuItem rotatehorizontally = new JMenuItem("Flip horizontally");
+		rotatehorizontally.addActionListener(this);
+		componentMenu.add(rotatehorizontally);
+	}
+
+	public void actionPerformed(ActionEvent e) {
+		if (e.getActionCommand().equals("Rotate right 90°")) {
+			position++;
+			position %= 4;
+			first = false;
+		}
+		if (e.getActionCommand().equals("Rotate left 90°")) {
+			position = position + 3;
+			position %= 4;
+			first = false;
+		}
+		if (e.getActionCommand().equals("Flip vertically")) {
+			if (position == 0 || position == 2) {
+				if (fv_0_2 == false) {
+					fv_0_2 = true;
+				} else {
+					fv_0_2 = false;
+				}
+			}
+			if (position == 1 || position == 3) {
+				if (fv_1_3 == false) {
+					fv_1_3 = true;
+				} else {
+					fv_1_3 = false;
+				}
+			}
+		}
+		if (e.getActionCommand().equals("Flip horizontally")) {
+			if (position == 0 || position == 2) {
+				if (fh_0_2 == false) {
+					fh_0_2 = true;
+				} else {
+					fh_0_2 = false;
+				}
+			}
+			if (position == 1 || position == 3) {
+				if (fh_1_3 == false) {
+					fh_1_3 = true;
+				} else {
+					fh_1_3 = false;
+				}
+			}
+		}
+	}
+
+    public int getDefaultConnector() {
+        return TGComponentManager.ELN_CONNECTOR;
+    }
+
+	public double getInitValue() {
+		return initValue;
+	}
+
+	public void setInitValue(double _initValue) {
+		initValue = _initValue;
+	}
+
+	public double getOffset() {
+		return offset;
+	}
+
+	public void setOffset(double _offset) {
+		offset = _offset;
+	}
+
+	public double getAmplitude() {
+		return amplitude;
+	}
+
+	public void setAmplitude(double _amplitude) {
+		amplitude = _amplitude;
+	}
+
+	public double getFrequency() {
+		return frequency;
+	}
+
+	public void setFrequency(double _frequency) {
+		frequency = _frequency;
+	}
+
+	public double getPhase() {
+		return phase;
+	}
+
+	public void setPhase(double _phase) {
+		phase = _phase;
+	}
+
+	public double getAcAmplitude() {
+		return acAmplitude;
+	}
+
+	public void setAcAmplitude(double _acAmplitude) {
+		acAmplitude = _acAmplitude;
+	}
+
+	public double getAcPhase() {
+		return acPhase;
+	}
+
+	public void setAcPhase(double _acPhase) {
+		acPhase = _acPhase;
+	}
+
+	public double getAcNoiseAmplitude() {
+		return acNoiseAmplitude;
+	}
+
+	public void setAcNoiseAmplitude(double _acNoiseAmplitude) {
+		acNoiseAmplitude = _acNoiseAmplitude;
+	}
+
+	public String getDelay() {
+		return delay;
+	}
+
+	public void setDelay(String _delay) {
+		delay = _delay;
+	}
+
+	public String getUnit0() {
+		return unit0;
+	}
+
+	public void setUnit0(String _unit0) {
+		unit0 = _unit0;
+	}
+}
diff --git a/src/main/java/ui/eln/sca_eln/ELNComponentIndependentVoltageSource.java b/src/main/java/ui/eln/sca_eln/ELNComponentIndependentVoltageSource.java
index f4d18bc0e3de811dc19c64479bea967d0dc2099b..f90f09aa2f6557b2c86467d59e78347bd3d8714b 100644
--- a/src/main/java/ui/eln/sca_eln/ELNComponentIndependentVoltageSource.java
+++ b/src/main/java/ui/eln/sca_eln/ELNComponentIndependentVoltageSource.java
@@ -197,7 +197,7 @@ public class ELNComponentIndependentVoltageSource extends TGCScalableWithInterna
 					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
 					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)
 					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)) {
-				rotateTop(g);
+				rotateBottomFlip(g);
 				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y);
 				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y+height+sh1);
 			}
@@ -205,7 +205,7 @@ public class ELNComponentIndependentVoltageSource extends TGCScalableWithInterna
 					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
 					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)
 					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)) {
-				rotateBottom(g);
+				rotateTopFlip(g);
 				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y);
 				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y+height+sh0);
 			}
@@ -256,7 +256,7 @@ public class ELNComponentIndependentVoltageSource extends TGCScalableWithInterna
 					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
 					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)
 					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)) {
-				rotateRight(g);
+				rotateRightFlip(g);
 				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x - sw0,
 						y + height / 2 + height / 4 + sh0);
 				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x + width,
@@ -266,7 +266,7 @@ public class ELNComponentIndependentVoltageSource extends TGCScalableWithInterna
 					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
 					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)
 					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)) {
-				rotateLeft(g);
+				rotateLeftFlip(g);
 				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x - sw1,
 						y + height / 2 + height / 4 + sh1);
 				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x + width,
@@ -317,7 +317,7 @@ public class ELNComponentIndependentVoltageSource extends TGCScalableWithInterna
 					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
 					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)
 					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)) {
-				rotateBottom(g);
+				rotateTopFlip(g);
 				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y);
 				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y+height+sh0);
 			}
@@ -325,7 +325,7 @@ public class ELNComponentIndependentVoltageSource extends TGCScalableWithInterna
 					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
 					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)
 					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)) {
-				rotateTop(g);
+				rotateBottomFlip(g);
 				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x+width/2+width/2, y);
 				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x+width/2+width/2, y+height+sh1);
 			}
@@ -376,7 +376,7 @@ public class ELNComponentIndependentVoltageSource extends TGCScalableWithInterna
 					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == false && fh_1_3 == false)
 					|| (fv_0_2 == true && fv_1_3 == false && fh_0_2 == true && fh_1_3 == true)
 					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == false && fh_1_3 == true)) {
-				rotateLeft(g);
+				rotateLeftFlip(g);
 				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x - sw1,
 						y + height / 2 + height / 4 + sh1);
 				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x + width,
@@ -386,7 +386,7 @@ public class ELNComponentIndependentVoltageSource extends TGCScalableWithInterna
 					|| (fv_0_2 == false && fv_1_3 == false && fh_0_2 == false && fh_1_3 == true)
 					|| (fv_0_2 == false && fv_1_3 == true && fh_0_2 == true && fh_1_3 == true)
 					|| (fv_0_2 == true && fv_1_3 == true && fh_0_2 == true && fh_1_3 == false)) {
-				rotateRight(g);
+				rotateRightFlip(g);
 				g.drawString(((ELNConnectingPoint) connectingPoint[1]).getName(), x - sw0,
 						y + height / 2 + height / 4 + sh0);
 				g.drawString(((ELNConnectingPoint) connectingPoint[0]).getName(), x + width,
@@ -420,6 +420,19 @@ public class ELNComponentIndependentVoltageSource extends TGCScalableWithInterna
          g.drawOval(x, y+height/4, width, height/2);
     }
     
+    private void rotateTopFlip(Graphics g) {
+    	int [] ptx0 = {x+width/2, x+width/2};
+    	int [] pty0 = {y, y+height};
+    	g.drawPolygon(ptx0, pty0, 2);
+    	int [] ptx1 = {x+width/2+width/4, x+width/2+width/4+width/8, x+width/2+width/4+width/8, x+width/2+width/4+width/8, x+width/2+width/4+width/8, x+width};
+    	int [] pty1 = {y+3*height/4+height/8, y+3*height/4+height/8, y+3*height/4+height/8+width/8, y+3*height/4+height/8+width/8, y+3*height/4+height/8, y+3*height/4+height/8};
+    	g.drawPolygon(ptx1, pty1, 6);
+    	int [] ptx2 = {x+width/2+width/4, x+width};
+    	int [] pty2 = {y+height/8, y+height/8};
+    	g.drawPolygon(ptx2, pty2, 2);
+    	g.drawOval(x, y+height/4, width, height/2);
+    }
+    
     private void rotateBottom(Graphics g) {
     	 int [] ptx0 = {x+width/2, x+width/2};
          int [] pty0 = {y, y+height};
@@ -433,32 +446,71 @@ public class ELNComponentIndependentVoltageSource extends TGCScalableWithInterna
          g.drawOval(x, y+height/4, width, height/2);
     }
     
+    private void rotateBottomFlip(Graphics g) {
+    	int [] ptx0 = {x+width/2, x+width/2};
+    	int [] pty0 = {y, y+height};
+    	g.drawPolygon(ptx0, pty0, 2);
+    	int [] ptx1 = {x+width/2+width/4, x+width/2+width/4+width/8, x+width/2+width/4+width/8, x+width/2+width/4+width/8, x+width/2+width/4+width/8, x+width};
+    	int [] pty1 = {y+height/8, y+height/8, y+height/8+width/8, y+height/8-width/8, y+height/8, y+height/8};
+    	g.drawPolygon(ptx1, pty1, 6);
+    	int [] ptx2 = {x+width/2+width/4, x+width};
+    	int [] pty2 = {y+3*height/4+height/8, y+3*height/4+height/8};
+    	g.drawPolygon(ptx2, pty2, 2);
+    	g.drawOval(x, y+height/4, width, height/2);
+    }
+    
     private void rotateRight(Graphics g) {
     	int [] ptx0 = {x, x+width};
         int [] pty0 = {y+height/2, y+height/2};
         g.drawPolygon(ptx0, pty0, 2);
-        int [] ptx1 = {x+width/4-width/8, x+width/4-width/8, x+width/4-width/8-height/8, x+width/4-width/8+height/8, x+width/4-width/8, x+width/4-width/8};
-        int [] pty1 = {y+height/2-height/4, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y};
+        int [] ptx1 = {x+width-width/8, x+width-width/8, x+width-width/8-height/8, x+width-width/8+height/8, x+width-width/8, x+width-width/8};
+        int [] pty1 = {y+height/2+height/4, y+height/2+height/4+height/8, y+height/2+height/4+height/8, y+height/2+height/4+height/8, y+height/2+height/4+height/8, y+height};
         g.drawPolygon(ptx1, pty1, 6);
-        int [] ptx2 = {x+3*width/4+width/8, x+3*width/4+width/8};
-        int [] pty2 = {y+height/2-height/4, y};
+        int [] ptx2 = {x+width/8, x+width/8};
+        int [] pty2 = {y+height/2+height/4, y+height};
         g.drawPolygon(ptx2, pty2, 2);
         g.drawOval(x+width/4, y, width/2, height);
     }
     
-    private void rotateLeft(Graphics g) {
+    private void rotateRightFlip(Graphics g) {
     	int [] ptx0 = {x, x+width};
+    	int [] pty0 = {y+height/2, y+height/2};
+    	g.drawPolygon(ptx0, pty0, 2);
+    	int [] ptx1 = {x+width-width/8, x+width-width/8, x+width-width/8-height/8, x+width-width/8+height/8, x+width-width/8, x+width-width/8};
+    	int [] pty1 = {y+height/4, y+height/4+height/8, y+height/4+height/8, y+height/4+height/8, y+height/4+height/8, y};
+    	g.drawPolygon(ptx1, pty1, 6);
+    	int [] ptx2 = {x+width/8, x+width/8};
+    	int [] pty2 = {y+height/4, y};
+    	g.drawPolygon(ptx2, pty2, 2);
+    	g.drawOval(x+width/4, y, width/2, height);
+    }
+    
+    private void rotateLeft(Graphics g) {
+        int [] ptx0 = {x, x+width};
         int [] pty0 = {y+height/2, y+height/2};
         g.drawPolygon(ptx0, pty0, 2);
-        int [] ptx1 = {x+width-width/8, x+width-width/8, x+width-width/8-height/8, x+width-width/8+height/8, x+width-width/8, x+width-width/8};
+        int [] ptx1 = {x+width/4-width/8, x+width/4-width/8, x+width/4-width/8-height/8, x+width/4-width/8+height/8, x+width/4-width/8, x+width/4-width/8};
         int [] pty1 = {y+height/2-height/4, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y+height/2-height/4-height/8, y};
         g.drawPolygon(ptx1, pty1, 6);
-        int [] ptx2 = {x+width/8, x+width/8};
+        int [] ptx2 = {x+3*width/4+width/8, x+3*width/4+width/8};
         int [] pty2 = {y+height/2-height/4, y};
         g.drawPolygon(ptx2, pty2, 2);
         g.drawOval(x+width/4, y, width/2, height);
     }
     
+    private void rotateLeftFlip(Graphics g) {
+    	int [] ptx0 = {x, x+width};
+    	int [] pty0 = {y+height/2, y+height/2};
+    	g.drawPolygon(ptx0, pty0, 2);
+    	int [] ptx1 = {x+width/4-width/8, x+width/4-width/8, x+width/4-width/8-height/8, x+width/4-width/8+height/8, x+width/4-width/8, x+width/4-width/8};
+    	int [] pty1 = {y+height/2+height/4, y+height/2+height/4+height/8, y+height/2+height/4+height/8, y+height/2+height/4+height/8, y+height/2+height/4+height/8, y+height};
+    	g.drawPolygon(ptx1, pty1, 6);
+    	int [] ptx2 = {x+3*width/4+width/8, x+3*width/4+width/8};
+    	int [] pty2 = {y+height/2+height/4, y+height};
+    	g.drawPolygon(ptx2, pty2, 2);
+    	g.drawOval(x+width/4, y, width/2, height);
+    }
+    
     public TGComponent isOnOnlyMe(int _x, int _y) {
         if (GraphicLib.isInRectangle(_x, _y, x, y, width, height)) {
             return this;