diff --git a/src/main/java/ui/ActionPerformer.java b/src/main/java/ui/ActionPerformer.java
index 86b7c18c642b071fb28ebfcce1df24135717524e..5f74e096b43a6116ec8076d33e2c027850fb58a2 100644
--- a/src/main/java/ui/ActionPerformer.java
+++ b/src/main/java/ui/ActionPerformer.java
@@ -786,8 +786,11 @@ public class ActionPerformer {
         } else if (command.equals(mgui.actions[TGUIAction.TMLCTD_EDIT].getActionCommand())) {
             mgui.actionOnButton(TGComponentManager.EDIT, -1);
         } else if (command.equals(mgui.actions[TGUIAction.TMLAD_WRITE_CHANNEL].getActionCommand())) {
-            mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_WRITE_CHANNEL);
-        } else if (command.equals(mgui.actions[TGUIAction.TMLAD_SEND_REQUEST].getActionCommand())) {
+            mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_WRITE_CHANNEL);	    
+        }  else if (command.equals(mgui.actions[TGUIAction.TMLAD_WRITE_CAMS].getActionCommand())) {
+            mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_WRITE_CAMS);
+        }
+	else if (command.equals(mgui.actions[TGUIAction.TMLAD_SEND_REQUEST].getActionCommand())) {
             mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_SEND_REQUEST);
         } else if (command.equals(mgui.actions[TGUIAction.TMLAD_READ_REQUEST_ARG].getActionCommand())) {
             mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_READ_REQUEST_ARG);
@@ -799,9 +802,11 @@ public class ActionPerformer {
             mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_NOTIFIED_EVENT);
         } else if (command.equals(mgui.actions[TGUIAction.TMLAD_READ_CHANNEL].getActionCommand())) {
             mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_READ_CHANNEL);
-        }  else if (command.equals(mgui.actions[TGUIAction.TMLAD_ACTION_STATE].getActionCommand())) {
+	} else if (command.equals(mgui.actions[TGUIAction.TMLAD_READ_CAMS].getActionCommand())) {
+            mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_READ_CAMS);       
+        } else if (command.equals(mgui.actions[TGUIAction.TMLAD_ACTION_STATE].getActionCommand())) {
             mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_ACTION_STATE);
-        }  else if (command.equals(mgui.actions[TGUIAction.TMLAD_CHOICE].getActionCommand())) {
+        } else if (command.equals(mgui.actions[TGUIAction.TMLAD_CHOICE].getActionCommand())) {
             mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_CHOICE);
         } else if (command.equals(mgui.actions[TGUIAction.TMLAD_EXECI].getActionCommand())) {
             mgui.actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.TMLAD_EXECI);
diff --git a/src/main/java/ui/TGComponentManager.java b/src/main/java/ui/TGComponentManager.java
index 9760d9e793efad3167806b1c77c597a1683f4108..b06aacfd5044435acbd6a719ac121cc97d7f3272 100644
--- a/src/main/java/ui/TGComponentManager.java
+++ b/src/main/java/ui/TGComponentManager.java
@@ -240,9 +240,11 @@ public class TGComponentManager {
     public static final int TMLTD_REQUEST_OPERATOR = 1004;
     public static final int TMLTD_EVENT_OPERATOR = 1005;
     public static final int TMLAD_WRITE_CHANNEL = 1006;
+    public static final int TMLAD_WRITE_CAMS = 1037;
     public static final int TMLAD_SEND_REQUEST = 1007;
     public static final int TMLAD_SEND_EVENT = 1008;
     public static final int TMLAD_READ_CHANNEL = 1009;
+    public static final int TMLAD_READ_CAMS = 1038;
     public static final int TMLAD_WAIT_EVENT = 1010;
     public static final int TMLAD_NOTIFIED_EVENT = 1017;
     public static final int TMLAD_ACTION_STATE = 1011;
@@ -1134,6 +1136,12 @@ public class TGComponentManager {
             case TMLAD_READ_CHANNEL:
                 tgc = new TMLADReadChannel(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp);
                 break;
+	    case TMLAD_WRITE_CAMS:
+                tgc = new TMLADWriteCAMS(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp);
+                break;
+            case TMLAD_READ_CAMS:
+                tgc = new TMLADReadCAMS(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp);
+                break;
             case TMLAD_SEND_REQUEST:
                 tgc = new TMLADSendRequest(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp);
                 break;
@@ -2095,6 +2103,11 @@ public class TGComponentManager {
             return TMLAD_WRITE_CHANNEL;
         } else if (tgc instanceof TMLADReadChannel) {
             return TMLAD_READ_CHANNEL;
+	}    else if (tgc instanceof TMLADWriteCAMS) {
+            return TMLAD_WRITE_CAMS;
+        } else if (tgc instanceof TMLADReadCAMS) {
+            return TMLAD_READ_CAMS;
+        
         } else if (tgc instanceof TMLADSendRequest) {
             return TMLAD_SEND_REQUEST;
         } else if (tgc instanceof TMLADSendEvent) {
diff --git a/src/main/java/ui/TGUIAction.java b/src/main/java/ui/TGUIAction.java
index b8391a3a3d1ab5772b986fd21340c92f43f5d2e7..b7b28a440e8ad498fb040f90f5ce6f2cf217424f 100644
--- a/src/main/java/ui/TGUIAction.java
+++ b/src/main/java/ui/TGUIAction.java
@@ -220,6 +220,8 @@ public class TGUIAction extends AbstractAction {
     public static final int TMLAD_SEND_REQUEST = 143;
     public static final int TMLAD_SEND_EVENT = 144;
     public static final int TMLAD_WAIT_EVENT = 145;
+    public static final int TMLAD_WRITE_CAMS = 523;
+    public static final int TMLAD_READ_CAMS = 524;
     public static final int TMLAD_NOTIFIED_EVENT = 203;
     public static final int TMLAD_READ_CHANNEL = 146;
     public static final int TMLAD_FOR_LOOP = 147;
@@ -676,7 +678,7 @@ public class TGUIAction extends AbstractAction {
     public static final int MOVE_ENABLED = 463;
     public static final int FIRST_DIAGRAM = 464;
     
-    public static final int NB_ACTION = 522;
+    public static final int NB_ACTION = 525;
 
     private static final TAction [] actions = new TAction[NB_ACTION];
 
@@ -1105,8 +1107,11 @@ public class TGUIAction extends AbstractAction {
         actions[TMLAD_WRITE_CHANNEL] = new TAction("add-tmladd-write-channel", "Write in channel", IconManager.imgic900, IconManager.imgic900, "Write in channel", "Add a write to channel operator opened TML activity diagram", 0);
         actions[TMLAD_SEND_REQUEST] = new TAction("add-tmladd-send-request", "Send request", IconManager.imgic902, IconManager.imgic902, "Send request", "Add a send request operator to the currently opened TML activity diagram", 0);
         actions[TMLAD_SEND_EVENT] = new TAction("add-tmladd-send-event", "Send event", IconManager.imgic904, IconManager.imgic904, "Send event", "Add a send event operator to the currently opened TML activity diagram", 0);
-        actions[TMLAD_WAIT_EVENT] = new TAction("add-tmladd-wait-event", "Wait event", IconManager.imgic908, IconManager.imgic908, "Wait event", "Add a wait event operator to the currently opened TML activity diagram", 0);
+        actions[TMLAD_WAIT_EVENT] = new TAction("add-tmladd-wait-event", "Wait event", IconManager.imgic908, IconManager.imgic908, "Wait event", "Add a wait event operator to the currently opened TML activity diagram", 0);      
         actions[TMLAD_NOTIFIED_EVENT] = new TAction("add-tmladd-notified-event", "Notified event", IconManager.imgic918, IconManager.imgic918, "Notified event", "Add a notified event operator to the currently opened TML activity diagram", 0);
+	 actions[TMLAD_WRITE_CAMS] = new TAction("add-tmladd-write-cams", "Write to CAMS", IconManager.imgic904, IconManager.imgic905, "Write to CAMS", "Add a write CAMS operator to the currently opened TML activity diagram", 0);
+        actions[TMLAD_READ_CAMS] = new TAction("add-tmladd-read-cams", "Read CAMS", IconManager.imgic908, IconManager.imgic907, "Read CAMS", "Add a read CAMS operator to the currently opened TML activity diagram", 0);
+	
         actions[TMLAD_READ_CHANNEL] = new TAction("add-tmladd-read-channel", "Read in channel", IconManager.imgic906, IconManager.imgic906, "Read in channel", "Add a read to channel operator opened TML activity diagram", 0);
         actions[TMLAD_FOR_LOOP] = new TAction("add-tmlad-for-loop", "Loop (for)", IconManager.imgic912, IconManager.imgic912, "Loop (for)", "Add a for loop to the currently opened TML activity diagram", 0);
         actions[TMLAD_FOR_STATIC_LOOP] = new TAction("add-tmlad-for-static-loop", "Static loop (for)", IconManager.imgic912, IconManager.imgic912, "Static loop (for)", "Add a static for loop to the currently opened TML activity diagram", 0);
diff --git a/src/main/java/ui/tmlad/TMLADReadCAMS.java b/src/main/java/ui/tmlad/TMLADReadCAMS.java
new file mode 100755
index 0000000000000000000000000000000000000000..5dac8a22345a6a9d41dda3a16227cb75e585839b
--- /dev/null
+++ b/src/main/java/ui/tmlad/TMLADReadCAMS.java
@@ -0,0 +1,452 @@
+/* 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.tmlad;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.geom.Line2D;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.swing.JFrame;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import myutil.GraphicLib;
+import ui.AllowedBreakpoint;
+import ui.BasicErrorHighlight;
+import ui.CheckableAccessibility;
+import ui.CheckableLatency;
+import ui.ColorManager;
+import ui.EmbeddedComment;
+import ui.ErrorHighlight;
+import ui.LinkedReference;
+import ui.MalformedModelingException;
+import ui.TDiagramPanel;
+import ui.TGComponent;
+import ui.TGComponentManager;
+import ui.TGConnectingPoint;
+import ui.ad.TADComponentWithoutSubcomponents;
+import ui.util.IconManager;
+import ui.window.JDialogMultiStringAndTabs;
+import ui.window.TabInfo;
+
+/**
+ * Class TMLADReadChannel
+ * Action of writing data in channel
+ * Creation: 21/11/2005
+ *
+ * @author Ludovic APVRILLE
+ * @version 1.0 21/11/2005
+* @version 1.1 05/11/2019
+ */
+public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69 TGCWithoutInternalComponent*/ implements CheckableAccessibility, LinkedReference, CheckableLatency, EmbeddedComment, AllowedBreakpoint, BasicErrorHighlight {
+    private Map<String, String> latencyVals;
+    protected int lineLength = 5;
+    protected int textX = 5;
+    protected int textX0 = 2;
+    protected int textY0 = 0;
+    protected int textY1 = 15;
+    protected int linebreak = 10;
+
+    protected int decSec = 4;
+
+    protected int latencyX = 30;
+    protected int latencyY = 25;
+    protected int textWidth = 10;
+    protected int textHeight = 20;
+
+    protected String channelName = "ch";
+    protected String nbOfSamples = "1";
+    protected String securityContext = "";
+    protected boolean isAttacker = false;
+
+    protected int stateOfError = 0; // Not yet checked
+
+    public final static int NOT_VERIFIED = 0;
+    public final static int REACHABLE = 1;
+    public final static int NOT_REACHABLE = 2;
+
+    public int reachabilityInformation;
+
+	public boolean isEncForm = true;
+	
+    public TMLADReadCAMS(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);
+
+        width = 30;
+        height = 20;
+        minWidth = 30;
+
+        nbConnectingPoint = 2;
+        connectingPoint = new TGConnectingPoint[2];
+        connectingPoint[0] = new TGConnectingPointTMLAD(this, 0, -lineLength, true, false, 0.5, 0.0);
+        connectingPoint[1] = new TGConnectingPointTMLAD(this, 0, lineLength, false, true, 0.5, 1.0);
+
+        moveable = true;
+        editable = true;
+        removable = true;
+
+        makeValue();
+        name = "read channel";
+
+        myImageIcon = IconManager.imgic906;
+        latencyVals = new ConcurrentHashMap<String, String>();
+        //latencyVals.put("sendChannel: sensorData", "3");
+    }
+
+	/*public void addLatency(String name, String num){
+        latencyVals.put(name,num);
+	}*/
+
+    public Map<String, String> getLatencyMap() {
+        return latencyVals;
+    }
+
+    @Override
+    public void internalDrawing(Graphics g) {
+        int w = g.getFontMetrics().stringWidth(value);
+        int w1 = Math.max(minWidth, w + 2 * textX);
+        if ((w1 != width) & (!tdp.isScaled())) {
+            setCd(x + width / 2 - w1 / 2, y);
+            width = w1;
+            //updateConnectingPoints();
+        }
+
+        if (stateOfError > 0) {
+            Color c = g.getColor();
+            switch (stateOfError) {
+                case ErrorHighlight.OK:
+                    g.setColor(ColorManager.TML_PORT_CHANNEL);
+                    break;
+                default:
+                    g.setColor(ColorManager.UNKNOWN_BOX_ACTION);
+            }
+            // Making the polygon
+            int[] px1 = {x, x + width, x + width, x, x + linebreak};
+            int[] py1 = {y, y, y + height, y + height, y + (height / 2)};
+            g.fillPolygon(px1, py1, 5);
+            g.setColor(c);
+        }
+
+        //g.drawRoundRect(x, y, width, height, arc, arc);
+        g.drawLine(x + (width / 2), y, x + (width / 2), y - lineLength);
+        g.drawLine(x + (width / 2), y + height, x + (width / 2), y + lineLength + height);
+
+        Color c = g.getColor();
+        int x1 = x + 1;
+        int y1 = y + 1;
+        int height1 = height;
+        int width1 = width;
+        g.setColor(ColorManager.TML_PORT_CHANNEL);
+        g.drawLine(x1, y1, x1 + width1, y1);
+        g.drawLine(x1 + width1, y1, x1 + width1, y1 + height1);
+        g.drawLine(x1, y1 + height1, x1 + width1, y1 + height1);
+        g.drawLine(x1, y1, x1 + linebreak, y1 + height1 / 2);
+        g.drawLine(x1, y1 + height1, x1 + linebreak, y1 + height1 / 2);
+        g.setColor(c);
+
+        g.drawLine(x, y, x + width, y);
+        g.drawLine(x + width, y, x + width, y + height);
+        g.drawLine(x, y + height, x + width, y + height);
+        g.drawLine(x, y, x + linebreak, y + height / 2);
+        g.drawLine(x, y + height, x + linebreak, y + height / 2);
+        if (isAttacker) {
+            g.drawString("attack", x + (width - w) / 2, y + textY0);
+        } else {
+            g.drawString("chl", x + (width - w) / 2, y + textY0);
+        }
+        g.drawString(value, x + linebreak + textX0, y + textY1);
+
+        if (!securityContext.equals("")) {
+        	c = g.getColor();
+	        if (!isEncForm){
+	        	g.setColor(Color.RED);
+	        }
+            g.drawString("sec:" + securityContext, x + 3 * width / 4, y + height + textY1 - decSec);
+            g.setColor(c);
+        }
+        drawReachabilityInformation(g);
+        if (getCheckLatency()) {
+            ConcurrentHashMap<String, String> latency = tdp.getMGUI().getLatencyVals(getDIPLOID());
+
+            if (latency != null) {
+                latencyVals = latency;
+                drawLatencyInformation(g);
+            }
+        }
+    }
+
+    private void drawLatencyInformation(Graphics g) {
+        int index = 1;
+        for (String s : latencyVals.keySet()) {
+            int w = g.getFontMetrics().stringWidth(s);
+            g.drawString(s, x - latencyX - w + 1, y - latencyY * index - 2);
+            g.drawRect(x - latencyX - w, y - latencyY * index - textHeight, w + 4, textHeight);
+            g.drawLine(x, y, x - latencyX, y - latencyY * index);
+            g.drawString(latencyVals.get(s), x - latencyX / 2, y - latencyY * index / 2);
+            index++;
+        }
+    }
+
+    private void drawReachabilityInformation(Graphics g) {
+        if (reachabilityInformation > 0) {
+            Color c = g.getColor();
+            Color c1;
+            switch (reachabilityInformation) {
+                case REACHABLE:
+                    c1 = Color.green;
+                    break;
+                case NOT_REACHABLE:
+                    c1 = Color.red;
+                    break;
+                default:
+                    return;
+            }
+
+            GraphicLib.arrowWithLine(g, 1, 0, 10, x - 30, y - 3, x - 15, y - 3, true);
+            g.drawOval(x - 11, y - 10, 7, 9);
+            g.setColor(c1);
+            g.fillRect(x - 12, y - 7, 9, 7);
+            g.setColor(c);
+            g.drawRect(x - 12, y - 7, 9, 7);
+            if (reachabilityInformation == NOT_REACHABLE) {
+                g.drawLine(x - 14, y - 9, x - 1, y + 3);
+                g.drawLine(x - 14, y + 3, x - 1, y - 9);
+            }
+        }
+    }
+
+    @Override
+    public TGComponent isOnMe(int _x, int _y) {
+        if (GraphicLib.isInRectangle(_x, _y, x, y, width, height)) {
+            return this;
+        }
+
+        if ((int) (Line2D.ptSegDistSq(x + (width / 2), y - lineLength, x + (width / 2), y + lineLength + height, _x, _y)) < distanceSelected) {
+            return this;
+        }
+
+        return null;
+    }
+
+    public void makeValue() {
+        value = channelName + "(" + nbOfSamples + ") ";
+    }
+
+    public String getChannelName() {
+        return channelName;
+    }
+
+    public String getSamplesValue() {
+        return nbOfSamples;
+    }
+
+    public String getAction() {
+        return value;
+    }
+
+    @Override
+    public boolean editOndoubleClick(JFrame frame) {
+        TabInfo tab1 = new TabInfo("Name and samples");
+        String[] labels = new String[2];
+        String[] values = new String[2];
+        labels[0] = "CAMS Channel name";
+        values[0] = channelName;
+        labels[1] = "Nb of samples";
+        values[1] = nbOfSamples;
+        tab1.labels=labels;
+        tab1.values =  values;
+        List<String[]> help = new ArrayList<String[]>();
+        String[] allInChannels = tdp.getMGUI().getAllInChannels();
+        if (isAttacker) {
+            allInChannels = tdp.getMGUI().getAllCompInChannels();
+        }
+        help.add(allInChannels);
+        help.add(null);
+        tab1.help = help;
+
+        TabInfo tab2 = new TabInfo("Security");
+        labels = new String[3];
+        values = new String[3];
+        labels[0] = "Security Pattern";
+        values[0] = securityContext;
+        labels[1] = "Attacker?";
+        values[1] = isAttacker ? "Yes" : "No";
+        labels[2] = "Encrypted Form?";
+        values[2] = isEncForm ? "Yes" : "No";        
+        help = new ArrayList<String[]>();
+        String[] choice = new String[]{"Yes", "No"};
+        help.add(tdp.getMGUI().getCurrentCryptoConfig());
+        help.add(choice);
+        help.add(choice);
+        tab2.labels=labels;
+        tab2.values =  values;
+        tab2.help = help;
+
+        List<TabInfo> tabs = new ArrayList<>();
+        tabs.add(tab1);
+        tabs.add(tab2);
+
+        //JDialogTwoString jdts = new JDialogTwoString(frame, "Setting channel's properties", "Channel name", channelName, "Nb of samples", nbOfSamples);
+        JDialogMultiStringAndTabs jdmsat = new JDialogMultiStringAndTabs(frame, "Write in channel", tabs);
+        //jdms.setSize(600, 300);
+        GraphicLib.centerOnParent(jdmsat, 600, 300);
+        jdmsat.setVisible(true); // blocked until dialog has been closed
+
+        if (jdmsat.hasBeenSet() && (jdmsat.hasValidString(0))) {
+            channelName = jdmsat.getString(0, 0);
+            nbOfSamples = jdmsat.getString(0, 1);
+            securityContext = jdmsat.getString(1, 0);
+            isAttacker = jdmsat.getString(1, 1).equals("Yes");
+            isEncForm = jdmsat.getString(1, 2).equals("Yes");
+            makeValue();
+            return true;
+        }
+
+        return false;
+    }
+
+    public void setSamples(String sp) {
+        nbOfSamples = sp;
+        makeValue();
+    }
+
+    @Override
+    protected String translateExtraParam() {
+        StringBuffer sb = new StringBuffer("<extraparam>\n");
+        sb.append("<Data channelName=\"");
+        sb.append(getChannelName());
+        sb.append("\" nbOfSamples=\"");
+        sb.append(getSamplesValue());
+        sb.append("\" secPattern=\"");
+        sb.append(securityContext);
+        sb.append("\" isAttacker=\"");
+        sb.append(isAttacker ? "Yes" : "No");
+        sb.append("\" isEncForm=\"");
+        sb.append(isEncForm ? "Yes" : "No");
+        sb.append("\" />\n");
+        sb.append("</extraparam>\n");
+        return new String(sb);
+    }
+
+    @Override
+    public void loadExtraParam(NodeList nl, int decX, int decY, int decId) throws MalformedModelingException {
+        try {
+            NodeList nli;
+            Node n1, n2;
+            Element elt;
+
+            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("Data")) {
+                                channelName = elt.getAttribute("channelName");
+                                nbOfSamples = elt.getAttribute("nbOfSamples");
+                                securityContext = elt.getAttribute("secPattern");
+                                isAttacker = elt.getAttribute("isAttacker").equals("Yes");
+                                isEncForm = elt.getAttribute("isEncForm").equals("Yes");    
+                                if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")){
+                                	if (!securityContext.equals("")){
+                                		isEncForm=true;
+                                	}
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            throw new MalformedModelingException( e );
+        }
+        makeValue();
+    }
+
+    public String getSecurityContext() {
+        return securityContext;
+    }
+
+    public void setSecurityContext(String sc) {
+        securityContext = sc;
+    }
+
+    public boolean isAttacker() {
+        return isAttacker;
+    }
+
+    @Override
+    public int getType() {
+        return TGComponentManager.TMLAD_READ_CHANNEL;
+    }
+
+    @Override
+    public int getDefaultConnector() {
+        return TGComponentManager.CONNECTOR_TMLAD;
+    }
+
+    @Override
+    public void setStateAction(int _stateAction) {
+        stateOfError = _stateAction;
+    }
+
+    public boolean getEncForm(){
+		return isEncForm;
+	}
+		
+	public void setEncForm(boolean encForm){
+		isEncForm=encForm;
+	}
+
+
+    public void setChannelName(String s) {
+        channelName = s;
+        makeValue();
+    }
+}
diff --git a/src/main/java/ui/tmlad/TMLADWriteCAMS.java b/src/main/java/ui/tmlad/TMLADWriteCAMS.java
new file mode 100755
index 0000000000000000000000000000000000000000..7e4b4ef5d0359f2a74f17a0710c025ab91a346fd
--- /dev/null
+++ b/src/main/java/ui/tmlad/TMLADWriteCAMS.java
@@ -0,0 +1,480 @@
+/* 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.tmlad;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.geom.Line2D;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.swing.JFrame;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import myutil.Conversion;
+import myutil.GraphicLib;
+import ui.AllowedBreakpoint;
+import ui.BasicErrorHighlight;
+import ui.CheckableAccessibility;
+import ui.CheckableLatency;
+import ui.ColorManager;
+import ui.EmbeddedComment;
+import ui.ErrorHighlight;
+import ui.LinkedReference;
+import ui.MalformedModelingException;
+import ui.TDiagramPanel;
+import ui.TGComponent;
+import ui.TGComponentManager;
+import ui.TGConnectingPoint;
+import ui.ad.TADComponentWithoutSubcomponents;
+import ui.util.IconManager;
+import ui.window.JDialogMultiStringAndTabs;
+import ui.window.TabInfo;
+
+/**
+ * Class TMLADWriteCAMS
+ * Action of writing data in CAMS channel
+ * Creation: 17/11/2005
+ *
+ * @author Ludovic APVRILLE
+ * @version 1.0 17/11/2005
+ * @version 1.1 05/11/2019 Daniela Genius
+ */
+public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69 TGCWithoutInternalComponent*/ implements CheckableAccessibility, LinkedReference, CheckableLatency, EmbeddedComment, AllowedBreakpoint, BasicErrorHighlight {
+    protected int lineLength = 5;
+    protected int textX = 5;
+    protected int textY = 15;
+    protected int arc = 5;
+    protected int linebreak = 10;
+    protected int decSec = 4;
+
+    private Map<String, String> latencyVals;
+
+    protected int latencyX = 30;
+    protected int latencyY = 25;
+    protected int textWidth = 10;
+    protected int textHeight = 20;
+
+    protected String channelName = "ch";
+    protected String nbOfSamples = "1";
+    protected String securityContext = "";
+    protected boolean isAttacker = false;
+
+    protected int stateOfError = 0; // Not yet checked
+
+    public final static int NOT_VERIFIED = 0;
+    public final static int REACHABLE = 1;
+    public final static int NOT_REACHABLE = 2;
+
+    public int reachabilityInformation;
+
+	public boolean isEncForm = true;
+
+    public TMLADWriteCAMS(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);
+
+        width = 30;
+        height = 20;
+        minWidth = 30;
+
+
+        nbConnectingPoint = 2;
+        connectingPoint = new TGConnectingPoint[2];
+        connectingPoint[0] = new TGConnectingPointTMLAD(this, 0, -lineLength, true, false, 0.5, 0.0);
+        connectingPoint[1] = new TGConnectingPointTMLAD(this, 0, lineLength, false, true, 0.5, 1.0);
+
+        moveable = true;
+        editable = true;
+        removable = true;
+
+        makeValue();
+        name = "write channel";
+
+        myImageIcon = IconManager.imgic900;
+        latencyVals = new ConcurrentHashMap<String, String>();
+    }
+
+    public Map<String, String> getLatencyMap() {
+        return latencyVals;
+    }
+
+    @Override
+    public void internalDrawing(Graphics g) {
+        int w = g.getFontMetrics().stringWidth(value);
+        int w1 = Math.max(minWidth, w + 2 * textX);
+        if ((w1 != width) & (!tdp.isScaled())) {
+            setCd(x + width / 2 - w1 / 2, y);
+            width = w1;
+            //updateConnectingPoints();
+        }
+        //g.drawRoundRect(x, y, width, height, arc, arc);
+
+        if (stateOfError > 0) {
+            Color c = g.getColor();
+            switch (stateOfError) {
+                case ErrorHighlight.OK:
+                    g.setColor(ColorManager.TML_PORT_CHANNEL);
+                    break;
+                default:
+                    g.setColor(ColorManager.UNKNOWN_BOX_ACTION);
+            }
+            // Making the polygon
+            int[] px1 = {x, x + width - linebreak, x + width, x + width - linebreak, x};
+            int[] py1 = {y, y, y + (height / 2), y + height, y + height};
+            g.fillPolygon(px1, py1, 5);
+            g.setColor(c);
+        }
+
+        g.drawLine(x + (width / 2), y, x + (width / 2), y - lineLength);
+        g.drawLine(x + (width / 2), y + height, x + (width / 2), y + lineLength + height);
+
+        int x1 = x + 1;
+        int y1 = y + 1;
+        int height1 = height;
+        int width1 = width;
+        Color c = g.getColor();
+        g.setColor(ColorManager.TML_PORT_CHANNEL);
+        g.drawLine(x1, y1, x1 + width1 - linebreak, y1);
+        g.drawLine(x1, y1 + height1, x1 + width1 - linebreak, y1 + height1);
+        g.drawLine(x1, y1, x1, y1 + height1);
+        g.drawLine(x1 + width1 - linebreak, y1, x1 + width1, y1 + height1 / 2);
+        g.drawLine(x1 + width1 - linebreak, y1 + height1, x1 + width1, y1 + height1 / 2);
+        g.setColor(c);
+
+        g.drawLine(x, y, x + width - linebreak, y);
+        g.drawLine(x, y + height, x + width - linebreak, y + height);
+        g.drawLine(x, y, x, y + height);
+        g.drawLine(x + width - linebreak, y, x + width, y + height / 2);
+        g.drawLine(x + width - linebreak, y + height, x + width, y + height / 2);
+        if (isAttacker) {
+            g.drawString("attack", x + (width - w) / 2, y);
+        } else {
+            g.drawString("chl", x + (width - w) / 2, y);
+        }
+        g.drawString(value, x + (width - w) / 2, y + textY);
+        if (!securityContext.equals("")) {
+	        c = g.getColor();
+	        if (!isEncForm){
+	        	g.setColor(Color.RED);
+	        }
+            g.drawString("sec:" + securityContext, x + 3 * width / 4, y + height + textY - decSec);
+            g.setColor(c);
+        }
+
+        if (getCheckLatency()) {
+            ConcurrentHashMap<String, String> latency = tdp.getMGUI().getLatencyVals(getDIPLOID());
+            //
+            if (latency != null) {
+                latencyVals = latency;
+                drawLatencyInformation(g);
+            }
+        }
+        drawReachabilityInformation(g);
+    }
+
+    private void drawLatencyInformation(Graphics g) {
+        int index = 1;
+        for (String s : latencyVals.keySet()) {
+            int w = g.getFontMetrics().stringWidth(s);
+            g.drawString(s, x - latencyX - w + 1, y - latencyY * index - 2);
+            g.drawRect(x - latencyX - w, y - latencyY * index - textHeight, w + 4, textHeight);
+            g.drawLine(x, y, x - latencyX, y - latencyY * index);
+            g.drawString(latencyVals.get(s), x - latencyX / 2, y - latencyY * index / 2);
+            index++;
+        }
+    }
+
+    public void addLatency(String name, String num) {
+        latencyVals.put(name, num);
+    }
+
+    private void drawReachabilityInformation(Graphics g) {
+        if (reachabilityInformation > 0) {
+
+            Color c = g.getColor();
+            Color c1;
+            switch (reachabilityInformation) {
+                case REACHABLE:
+                    c1 = Color.green;
+                    break;
+                case NOT_REACHABLE:
+                    c1 = Color.red;
+                    break;
+                default:
+                    return;
+            }
+
+            GraphicLib.arrowWithLine(g, 1, 0, 10, x - 30, y - 3, x - 15, y - 3, true);
+            g.drawOval(x - 11, y - 10, 7, 9);
+            g.setColor(c1);
+            g.fillRect(x - 12, y - 7, 9, 7);
+            g.setColor(c);
+            g.drawRect(x - 12, y - 7, 9, 7);
+            if (reachabilityInformation == NOT_REACHABLE) {
+                g.drawLine(x - 14, y - 9, x - 1, y + 3);
+                g.drawLine(x - 14, y + 3, x - 1, y - 9);
+            }
+        }
+    }
+
+    @Override
+    public TGComponent isOnMe(int _x, int _y) {
+        if (GraphicLib.isInRectangle(_x, _y, x, y, width, height)) {
+            return this;
+        }
+
+        if ((int) (Line2D.ptSegDistSq(x + (width / 2), y - lineLength, x + (width / 2), y + lineLength + height, _x, _y)) < distanceSelected) {
+            return this;
+        }
+
+        return null;
+    }
+
+    public void makeValue() {
+        value = channelName + "(" + nbOfSamples + ")";
+    }
+
+    /*public String getChannelName() {
+      return channelName;
+      }*/
+
+    public String[] getChannelsByName() {
+        //int nbOfChannels = Conversion.nbChar(channelName, ',') + 1;
+        String tmp = Conversion.replaceAllChar(channelName, ' ', "");
+        String[] channels = tmp.split(",");
+        return channels;
+    }
+
+    public String getChannelName(int _index) {
+        return getChannelsByName()[_index];
+    }
+
+    public String getSamplesValue() {
+        return nbOfSamples;
+    }
+
+    public String getAction() {
+        return value;
+    }
+
+    @Override
+    public boolean editOndoubleClick(JFrame frame) {
+        TabInfo tab1 = new TabInfo("Name and samples");
+        String[] labels = new String[2];
+        String[] values = new String[2];
+        labels[0] = "CAMS Channel name";
+        values[0] = channelName;
+        labels[1] = "Nb of samples";
+        values[1] = nbOfSamples;
+
+      /*  labels[2] = "Security Pattern";
+        values[2] = securityContext;
+		labels[3] = "Attacker?";
+		values[3] = isAttacker ? "Yes" : "No"; */
+        List<String []> help = new ArrayList<String []>();
+		String[] allOutChannels = tdp.getMGUI().getAllOutChannels();
+		if (isAttacker){
+			allOutChannels =tdp.getMGUI().getAllCompOutChannels();
+		}
+		String[] choice = new String[]{"Yes", "No"};
+		help.add(allOutChannels);
+		help.add(null);
+	//	help.add(tdp.getMGUI().getCurrentCryptoConfig());
+		//help.add(choice);
+
+        tab1.labels=labels;
+        tab1.values =  values;
+        tab1.help = help;
+
+        TabInfo tab2 = new TabInfo("Security");
+        labels = new String[3];
+        values = new String[3];
+        labels[0] = "Security Pattern";
+        values[0] = securityContext;
+        labels[1] = "Attacker?";
+        values[1] = isAttacker ? "Yes" : "No";
+        labels[2] = "Encrypted Form?";
+        values[2] = isEncForm ? "Yes" : "No";        
+        help = new ArrayList<String[]>();
+
+        help.add(tdp.getMGUI().getCurrentCryptoConfig());
+        help.add(choice);
+        help.add(choice);
+        tab2.labels=labels;
+        tab2.values =  values;
+        tab2.help = help;
+
+        List<TabInfo> tabs = new ArrayList<>();
+        tabs.add(tab1);
+        tabs.add(tab2);
+
+
+        //JDialogTwoString jdts = new JDialogTwoString(frame, "Setting channel's properties", "Channel name", channelName, "Nb of samples", nbOfSamples);
+        JDialogMultiStringAndTabs jdmsat = new JDialogMultiStringAndTabs(frame, "Write in channel", tabs);
+        //jdms.setSize(600, 300);
+        GraphicLib.centerOnParent(jdmsat, 600, 300);
+        jdmsat.setVisible(true); // blocked until dialog has been closed
+
+        if (jdmsat.hasBeenSet() && (jdmsat.hasValidString(0))) {
+            channelName = jdmsat.getString(0, 0);
+            nbOfSamples = jdmsat.getString(0, 1);
+            securityContext = jdmsat.getString(1, 0);
+            isAttacker = jdmsat.getString(1, 1).equals("Yes");
+            isEncForm = jdmsat.getString(1, 2).equals("Yes");
+            makeValue();
+            
+            return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    protected String translateExtraParam() {
+        StringBuffer sb = new StringBuffer("<extraparam>\n");
+        sb.append("<Data channelName=\"");
+        sb.append(channelName);
+        sb.append("\" nbOfSamples=\"");
+        sb.append(getSamplesValue());
+        sb.append("\" secPattern=\"");
+        sb.append(securityContext);
+        sb.append("\" isAttacker=\"");
+        sb.append(isAttacker ? "Yes" : "No");
+        sb.append("\" isEncForm=\"");
+        sb.append(isEncForm ? "Yes" : "No");
+        sb.append("\" />\n");
+        sb.append("</extraparam>\n");
+        return new String(sb);
+    }
+
+    @Override
+    public void loadExtraParam(NodeList nl, int decX, int decY, int decId) throws MalformedModelingException {
+        try {
+            NodeList nli;
+            Node n1, n2;
+            Element elt;
+
+            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("Data")) {
+                                channelName = elt.getAttribute("channelName");
+                                nbOfSamples = elt.getAttribute("nbOfSamples");
+                                securityContext = elt.getAttribute("secPattern");
+                                isAttacker = elt.getAttribute("isAttacker").equals("Yes");
+                                isEncForm = elt.getAttribute("isEncForm").equals("Yes");                                   
+                                if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")){
+                                	if (!securityContext.equals("")){
+                                		isEncForm=true;
+                                	}
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            throw new MalformedModelingException( e );
+        }
+        makeValue();
+    }
+
+    @Override
+    public int getType() {
+        return TGComponentManager.TMLAD_WRITE_CHANNEL;
+    }
+
+    @Override
+    public int getDefaultConnector() {
+        return TGComponentManager.CONNECTOR_TMLAD;
+    }
+
+    public String getChannelName() {
+        return channelName;
+    }
+
+    public void setChannelName(String s) {
+        channelName = s;
+        makeValue();
+    }
+
+    public void setSamples(String sp) {
+        nbOfSamples = sp;
+        makeValue();
+    }
+
+    public String getSecurityContext() {
+        return securityContext;
+    }
+
+    public void setSecurityContext(String sc) {
+        securityContext = sc;
+    }
+
+    public boolean isAttacker() {
+        return isAttacker;
+    }
+
+	public boolean getEncForm(){
+		return isEncForm;
+	}
+	
+	
+	public void setEncForm(boolean encForm){
+		isEncForm=encForm;
+	}
+
+    @Override
+    public void setStateAction(int _stateAction) {
+        stateOfError = _stateAction;
+    }
+}
diff --git a/src/main/java/ui/tmlad/TMLActivityDiagramToolBar.java b/src/main/java/ui/tmlad/TMLActivityDiagramToolBar.java
index 4c19db934fa316a72fd15860636634e6290a1b96..72d625d857802e5abbbb82a17fe2ce67e9ee804d 100755
--- a/src/main/java/ui/tmlad/TMLActivityDiagramToolBar.java
+++ b/src/main/java/ui/tmlad/TMLActivityDiagramToolBar.java
@@ -88,6 +88,8 @@ public class TMLActivityDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.TMLAD_SEND_REQUEST].setEnabled(b);
         mgui.actions[TGUIAction.TMLAD_SEND_EVENT].setEnabled(b);
         mgui.actions[TGUIAction.TMLAD_WAIT_EVENT].setEnabled(b);
+	 mgui.actions[TGUIAction.TMLAD_WRITE_CAMS].setEnabled(b);
+        mgui.actions[TGUIAction.TMLAD_READ_CAMS].setEnabled(b);
         mgui.actions[TGUIAction.TMLAD_NOTIFIED_EVENT].setEnabled(b);
 		mgui.actions[TGUIAction.TMLAD_READ_REQUEST_ARG].setEnabled(b);
         mgui.actions[TGUIAction.TMLAD_FOR_LOOP].setEnabled(b);
@@ -138,7 +140,10 @@ public class TMLActivityDiagramToolBar extends TToolBar {
         
         button = this.add(mgui.actions[TGUIAction.TMLAD_WRITE_CHANNEL]);
         button.addMouseListener(mgui.mouseHandler);
-        
+
+	button = this.add(mgui.actions[TGUIAction.TMLAD_WRITE_CAMS]);
+        button.addMouseListener(mgui.mouseHandler);
+
         button = this.add(mgui.actions[TGUIAction.TMLAD_SEND_EVENT]);
         button.addMouseListener(mgui.mouseHandler);
         
@@ -149,7 +154,12 @@ public class TMLActivityDiagramToolBar extends TToolBar {
         
         button = this.add(mgui.actions[TGUIAction.TMLAD_READ_CHANNEL]);
         button.addMouseListener(mgui.mouseHandler);
+
+
+	button = this.add(mgui.actions[TGUIAction.TMLAD_READ_CAMS]);
+        button.addMouseListener(mgui.mouseHandler);
         
+	
         button = this.add(mgui.actions[TGUIAction.TMLAD_WAIT_EVENT]);
         button.addMouseListener(mgui.mouseHandler);
         
diff --git a/src/main/java/ui/util/IconManager.java b/src/main/java/ui/util/IconManager.java
index 709f2082315bccb3d3dd3ce853fd20b31dc34847..ab646504fa9388dc88b4ab84a91913d11ee7a7e0 100755
--- a/src/main/java/ui/util/IconManager.java
+++ b/src/main/java/ui/util/IconManager.java
@@ -108,7 +108,7 @@ public class IconManager {
     public static ImageIcon imgic700, imgic702;
 
     public static ImageIcon imgic800, imgic802, imgic804, imgic806, imgic808, imgic810, imgic812;
-    public static ImageIcon imgic900, imgic902, imgic904, imgic906, imgic908, imgic910, imgic912, imgic914, imgic916, imgic918;
+    public static ImageIcon imgic900, imgic902, imgic904, imgic905, imgic906,  imgic907, imgic908, imgic910, imgic912, imgic914, imgic916, imgic918;
     public static ImageIcon imgic920, imgic922, imgic924, imgic926, imgic928, imgic930;
     public static ImageIcon imgic940, imgic941;
     // Requirement diagrams
@@ -468,7 +468,9 @@ public class IconManager {
     private static String icon900 = "tmladwrch.gif";
     private static String icon902 = "tmladsendreq.gif";
     private static String icon904 = "tmladsendevt.gif";
+    private static String icon905 = "tmladwritecams.gif";
     private static String icon906 = "tmladrdch.gif";
+    private static String icon907 = "tmladreadcams.gif";
     private static String icon908 = "tmladwaitevt.gif";
     private static String icon910 = "tmladexeci.gif";
     private static String icon912 = "tmladforloop.gif";
@@ -977,7 +979,9 @@ public class IconManager {
         imgic900 = getIcon(icon900);
         imgic902 = getIcon(icon902);
         imgic904 = getIcon(icon904);
+	imgic905 = getIcon(icon905);
         imgic906 = getIcon(icon906);
+	imgic907 = getIcon(icon907);
         imgic908 = getIcon(icon908);
         imgic910 = getIcon(icon910);
         imgic912 = getIcon(icon912);
diff --git a/src/main/resources/ui/util/tmladwritecams.gif b/src/main/resources/ui/util/tmladwritecams.gif
new file mode 100755
index 0000000000000000000000000000000000000000..c8acb635ea8fd29aede85f98e58bbeb865cf10cc
Binary files /dev/null and b/src/main/resources/ui/util/tmladwritecams.gif differ
diff --git a/src/main/resources/ui/util/tmlreadcams.gif b/src/main/resources/ui/util/tmlreadcams.gif
new file mode 100755
index 0000000000000000000000000000000000000000..fd661fbed71a605ead809eba99ffae90580f47ad
Binary files /dev/null and b/src/main/resources/ui/util/tmlreadcams.gif differ