diff --git a/src/main/java/avatartranslator/AvatarLibraryFunction.java b/src/main/java/avatartranslator/AvatarLibraryFunction.java
index 8babbc76a54455a57e1c0e1f633e205d06631cb6..0831f73dae0a3e9c2981e5b4acae11532fb60013 100644
--- a/src/main/java/avatartranslator/AvatarLibraryFunction.java
+++ b/src/main/java/avatartranslator/AvatarLibraryFunction.java
@@ -624,6 +624,7 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl
         asme.setValues (replaceAttributesInExpr(_asme.getMinValue (), _arg), replaceAttributesInExpr(_asme.getMaxValue (), _arg));
         asme.setFunctionId (_asme.getFunctionId ());
         asme.setExtraAttribute1(_asme.getExtraAttribute1());
+        asme.setExtraAttribute2(_asme.getExtraAttribute2());
         asme.setVariable (arg.placeholdersMapping.get (this.getAvatarAttributeWithName (_asme.getVariable ())).getName ());
 
         this.translateNext (asme, _asme, arg);
diff --git a/src/main/java/avatartranslator/AvatarRandom.java b/src/main/java/avatartranslator/AvatarRandom.java
index d60d0eb51134bcb9720741dbca8be2662a7633ec..71c60bd60257fa83e9eb2cf9e8a55b4da27da138 100644
--- a/src/main/java/avatartranslator/AvatarRandom.java
+++ b/src/main/java/avatartranslator/AvatarRandom.java
@@ -56,13 +56,16 @@ public class AvatarRandom extends AvatarStateMachineElement {
     public final static int RANDOM_UNIFORM_LAW = 0;
     public final static int RANDOM_TRIANGULAR_LAW = 1;
     public final static int RANDOM_GAUSSIAN_LAW = 2;
-    public final static String[] DISTRIBUTION_LAWS = {"Uniform", "Triangular", "Gaussian"};
-    public final static String[] DISTRIBUTION_LAWS_SHORT = {"", " ^", "ĝ"};
+    public final static int RANDOM_LOG_NORMAL_LAW = 3;
+    public final static String[] DISTRIBUTION_LAWS = {"Uniform", "Triangular", "Gaussian", "Log normal"};
+    public final static String[] DISTRIBUTION_LAWS_SHORT = {"", " ^", "ĝ", "ln"};
 
-    public final static int[] NB_OF_EXTRA_ATTRIBUTES = {0, 1, 1};
-    public final static String[] LABELS_OF_EXTRA_ATTRIBUTES = {"", "triangle top", "standard deviation"};
+    public final static int[] NB_OF_EXTRA_ATTRIBUTES = {0, 1, 1, 2};
+    public final static String[] LABELS_OF_EXTRA_ATTRIBUTES_1 = {"", "triangle top", "standard deviation", "standard deviation"};
+    public final static String[] LABELS_OF_EXTRA_ATTRIBUTES_2 = {"", "", "", "mean"};
     protected int functionId;
     protected String extraAttribute1;
+    protected String extraAttribute2;
 
     public AvatarRandom(String _name, Object _referenceObject) {
         super(_name, _referenceObject);
@@ -88,6 +91,10 @@ public class AvatarRandom extends AvatarStateMachineElement {
         return extraAttribute1;
     }
 
+    public String getExtraAttribute2() {
+        return extraAttribute2;
+    }
+
     public void setVariable(String _variable) {
         variable = _variable;
     }
@@ -104,6 +111,9 @@ public class AvatarRandom extends AvatarStateMachineElement {
     public void setExtraAttribute1(String _extraAttribute1) {
         extraAttribute1 = _extraAttribute1;
     }
+    public void setExtraAttribute2(String _extraAttribute2) {
+        extraAttribute2 = _extraAttribute2;
+    }
 
     public String getNiceName() {
         return "Random between " + minValue + " and " + maxValue + " stored in " + variable;
@@ -120,7 +130,8 @@ public class AvatarRandom extends AvatarStateMachineElement {
 	 ar.setValues(minValue, maxValue);
 	 ar.setFunctionId(functionId);
 	 ar.setExtraAttribute1(extraAttribute1);
+	 ar.setExtraAttribute2(extraAttribute2);
 
-        return ar;
+	 return ar;
     }
 }
diff --git a/src/main/java/avatartranslator/directsimulation/AvatarSimulationBlock.java b/src/main/java/avatartranslator/directsimulation/AvatarSimulationBlock.java
index 35075d415eebe7379490fa95977664f2890b75dc..21f5616d1d3aee34a1856373507d01d58a01e04b 100644
--- a/src/main/java/avatartranslator/directsimulation/AvatarSimulationBlock.java
+++ b/src/main/java/avatartranslator/directsimulation/AvatarSimulationBlock.java
@@ -402,13 +402,23 @@ public class AvatarSimulationBlock {
                         extra1 = 0.0;
                     }
 
+                    double extra2;
+                    //TraceManager.addDev("Extra2=" + random.getExtraAttribute2());
+                    try {
+                        extra2 = Double.parseDouble(random.getExtraAttribute2());
+                    } catch (Exception e) {
+                        //TraceManager.addDev("Extra2 exception");
+                        extra2 = 0.0;
+                    }
+                    //TraceManager.addDev("Extra2=" + extra2);
+
                     if ((forcedRandom > -1) && (forcedRandom >= valMin) && (forcedRandom <= valMax)) {
                         // Use provided value as random value
                         valMin = forcedRandom;
                     } else {
                         // randomly select a value according to distribution law
 
-                        valMin = makeRandom(valMin, valMax, random.getFunctionId(), extra1);
+                        valMin = makeRandom(valMin, valMax, random.getFunctionId(), extra1, extra2);
                     }
                     attributeValues.remove(index);
                     attributeValues.add(index, "" + valMin);
@@ -727,7 +737,7 @@ public class AvatarSimulationBlock {
         return result;
     }
 
-    public int makeRandom(int minV, int maxV, int functionID, double extra1) {
+    public int makeRandom(int minV, int maxV, int functionID, double extra1, double extra2) {
         switch (functionID) {
             case AvatarRandom.RANDOM_UNIFORM_LAW:
                 //TraceManager.addDev("\n\n\n******* UNIFORM LAW ********");
@@ -735,10 +745,16 @@ public class AvatarSimulationBlock {
             case AvatarRandom.RANDOM_TRIANGULAR_LAW:
                 //TraceManager.addDev("\n\n\n******* TRIANGULAR LAW ********");
                 return (int) (MyMath.triangularDistribution((double) (minV), (double) (maxV), extra1));
-            case AvatarTransition.DELAY_GAUSSIAN_LAW:
+            case AvatarRandom.RANDOM_GAUSSIAN_LAW:
                 //TraceManager.addDev("\n\n\n******* GAUSSIAN LAW ********");
                 return (int)(Math.floor(MyMath.gaussianDistribution((double) (minV), (double) (maxV), extra1)));
-
+            case AvatarRandom.RANDOM_LOG_NORMAL_LAW:
+                try {
+                    return (int) (Math.floor(MyMath.logNormalDistribution((double) (minV), (double) (maxV), extra1, extra2)));
+                } catch (Exception e) {
+                    TraceManager.addDev("Exception on log normal: " + e.getMessage());
+                    return minV;
+                }
         }
         return minV;
     }
diff --git a/src/main/java/myutil/MyMath.java b/src/main/java/myutil/MyMath.java
index 20b38db7ff9af6aedb6e7015deda8c470ffb5a5d..f780ca1bbf3cf6281f045eb3b0ea335c9332e84e 100644
--- a/src/main/java/myutil/MyMath.java
+++ b/src/main/java/myutil/MyMath.java
@@ -42,6 +42,7 @@
 package myutil;
 
 import java.util.Random;
+import org.apache.commons.math3.distribution.LogNormalDistribution;
 
 /**
  * Class MyMath
@@ -129,5 +130,19 @@ public class MyMath {
         return n;
     }
 
+
+    public static double logNormalDistribution(double a, double b, double sigma, double mean) {
+	    //TraceManager.addDev("LOG  NORMAL. SIGMA=" + sigma + " MEAN=" + mean);
+	    LogNormalDistribution lnd = new LogNormalDistribution(sigma, mean);
+	    double val = lnd.sample();
+	    val += a;
+	    if (val > b) {
+	        return logNormalDistribution(a, b, sigma, mean);
+        }
+        return val;
+    }
+
+
+
   
 }
diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java
index b54fc6ec0fefea06caa61430bc5528efb8986dd7..a4b55ed06d63fa8711c61bbf2b943fca084a0f86 100644
--- a/src/main/java/ui/AvatarDesignPanelTranslator.java
+++ b/src/main/java/ui/AvatarDesignPanelTranslator.java
@@ -1558,6 +1558,8 @@ public class AvatarDesignPanelTranslator {
             arandom.setValues(tmp1, tmp2);
             arandom.setFunctionId(asmdrand.getFunctionId());
             arandom.setExtraAttribute1(asmdrand.getExtraAttribute1());
+            arandom.setExtraAttribute2(asmdrand.getExtraAttribute2());
+
 
             tmp1 = modifyString(asmdrand.getVariable());
             AvatarAttribute aa = _ab.getAvatarAttributeWithName(tmp1);
diff --git a/src/main/java/ui/avatarsmd/AvatarSMDRandom.java b/src/main/java/ui/avatarsmd/AvatarSMDRandom.java
index 066e3008ef8c4087453d63a741aafb2231be5af1..157cccf43a67923b64fe663dde355e2f99fdbfb1 100755
--- a/src/main/java/ui/avatarsmd/AvatarSMDRandom.java
+++ b/src/main/java/ui/avatarsmd/AvatarSMDRandom.java
@@ -68,6 +68,7 @@ public class AvatarSMDRandom extends  AvatarSMDBasicCanBeDisabledComponent /* Is
     protected String minValue;
     protected String maxValue;
     protected String extraAttribute1;
+    protected String extraAttribute2;
     protected int functionId;
 
     protected int stateOfError = 0; // Not yet checked
@@ -96,6 +97,7 @@ public class AvatarSMDRandom extends  AvatarSMDBasicCanBeDisabledComponent /* Is
         maxValue = "10";
         functionId = 0;
         extraAttribute1 = "";
+        extraAttribute2 = "";
 
         myImageIcon = IconManager.imgic912;
     }
@@ -162,7 +164,7 @@ public class AvatarSMDRandom extends  AvatarSMDBasicCanBeDisabledComponent /* Is
         String tmpName;
 
         JDialogTMLADRandom dialog = new JDialogTMLADRandom(frame, "Setting RANDOM attributes",
-                getVariable(), getMinValue(), getMaxValue(), getFunctionId(), getExtraAttribute1());
+                getVariable(), getMinValue(), getMaxValue(), getFunctionId(), getExtraAttribute1(), getExtraAttribute2());
         //dialog.setSize(500, 450);
         GraphicLib.centerOnParent(dialog, 500, 450);
         dialog.setVisible( true ); // blocked until dialog has been closed
@@ -207,6 +209,15 @@ public class AvatarSMDRandom extends  AvatarSMDBasicCanBeDisabledComponent /* Is
             extraAttribute1 = formerExtra;
         }
 
+        formerExtra = extraAttribute2;
+        extraAttribute2 = dialog.getExtraAttribute2();
+        double extra2;
+        try {
+            extra2 = Double.parseDouble(extraAttribute2);
+        } catch (Exception e) {
+            extraAttribute2 = formerExtra;
+        }
+
 
         if (error) {
             JOptionPane.showMessageDialog(frame,
@@ -258,6 +269,10 @@ public class AvatarSMDRandom extends  AvatarSMDBasicCanBeDisabledComponent /* Is
         return extraAttribute1;
     }
 
+    public String getExtraAttribute2() {
+        return extraAttribute2;
+    }
+
 	@Override
     protected String translateExtraParam() {
         StringBuffer sb = new StringBuffer("<extraparam>\n");
@@ -271,6 +286,8 @@ public class AvatarSMDRandom extends  AvatarSMDBasicCanBeDisabledComponent /* Is
         sb.append(getFunctionId());
         sb.append("\" extraAttribute1=\"");
         sb.append(getExtraAttribute1());
+        sb.append("\" extraAttribute2=\"");
+        sb.append(getExtraAttribute2());
         sb.append("\" />\n");
         sb.append("</extraparam>\n");
         return new String(sb);
@@ -303,6 +320,10 @@ public class AvatarSMDRandom extends  AvatarSMDBasicCanBeDisabledComponent /* Is
                                 if (extraAttribute1 == null) {
                                     extraAttribute1 = "";
                                 }
+                                extraAttribute2 = elt.getAttribute("extraAttribute2");
+                                if (extraAttribute2 == null) {
+                                    extraAttribute2 = "";
+                                }
                                 s = elt.getAttribute("functionId");
                                 if (s != null) {
                                     try {
diff --git a/src/main/java/ui/tmlad/TMLADRandom.java b/src/main/java/ui/tmlad/TMLADRandom.java
index 635f7c074d4438cc3bdf3ef361a36da30b1c93db..a5e8308f70e8c844f353dff82e96685d4ffd9594 100755
--- a/src/main/java/ui/tmlad/TMLADRandom.java
+++ b/src/main/java/ui/tmlad/TMLADRandom.java
@@ -146,7 +146,7 @@ public class TMLADRandom extends TADComponentWithoutSubcomponents/* Issue #69 TG
 		String tmpName;
         
 		JDialogTMLADRandom dialog = new JDialogTMLADRandom(frame, "Setting RANDOM attributes",
-				getVariable(), getMinValue(), getMaxValue(), getFunctionId(), null);
+				getVariable(), getMinValue(), getMaxValue(), getFunctionId(), null, null);
 		//dialog.setSize(500, 450);
         GraphicLib.centerOnParent(dialog, 500, 450);
         dialog.setVisible( true ); // blocked until dialog has been closed
diff --git a/src/main/java/ui/window/JDialogTMLADRandom.java b/src/main/java/ui/window/JDialogTMLADRandom.java
index 0ecc27b40500c0dd37de02a1ee9e454a0b6cf451..15bfe01ad2c9f4c6b045a31f9fecf59e52e566b5 100644
--- a/src/main/java/ui/window/JDialogTMLADRandom.java
+++ b/src/main/java/ui/window/JDialogTMLADRandom.java
@@ -65,20 +65,20 @@ public class JDialogTMLADRandom extends JDialogBase implements ActionListener  {
     
     private JPanel panel2;
     private Frame frame;
-	private String variable, minValue, maxValue, extraAttribute1;
+	private String variable, minValue, maxValue, extraAttribute1, extraAttribute2;
 
 	private int functionId;
     
 	
 	// Panel2
-    private JTextField jvariable, jminValue, jmaxValue, jextraAttribute1;
-    private JLabel jextraAttribute1L;
+    private JTextField jvariable, jminValue, jmaxValue, jextraAttribute1, jextraAttribute2;
+    private JLabel jextraAttribute1L, jextraAttribute2L;
 	private JComboBox<String> randomFunction;
     
     /* Creates new form  */
     public JDialogTMLADRandom(Frame _frame, String _title, String _variable,
                               String _minValue, String _maxValue, int _functionId,
-                              String _extraAttribute1) {
+                              String _extraAttribute1, String _extraAttribute2) {
         super(_frame, _title, true);
         frame = _frame;
         variable = _variable;
@@ -86,6 +86,7 @@ public class JDialogTMLADRandom extends JDialogBase implements ActionListener  {
 		maxValue = _maxValue;
 		functionId = _functionId;
 		extraAttribute1 = _extraAttribute1;
+        extraAttribute2 = _extraAttribute2;
         
         initComponents();
         myInitComponents();
@@ -168,6 +169,17 @@ public class JDialogTMLADRandom extends JDialogBase implements ActionListener  {
             panel2.add(jextraAttribute1, c2);
         }
 
+        if (extraAttribute2 != null) {
+            c2.gridwidth = 1;
+            jextraAttribute2L = new JLabel("");
+            panel2.add(jextraAttribute2L, c2);
+            c2.gridwidth = GridBagConstraints.REMAINDER; //end row
+            jextraAttribute2 = new JTextField(extraAttribute2, 30);
+            jextraAttribute2.setEditable(true);
+            jextraAttribute2.setFont(new Font("times", Font.PLAIN, 12));
+            panel2.add(jextraAttribute2, c2);
+        }
+
         checkAttributesDistributionLawB();
         
         // main panel;
@@ -236,17 +248,30 @@ public class JDialogTMLADRandom extends JDialogBase implements ActionListener  {
 
     public String getExtraAttribute1() {return jextraAttribute1.getText();}
 
+    public String getExtraAttribute2() {return jextraAttribute2.getText();}
+
     private void checkAttributesDistributionLawB() {
         if (extraAttribute1 != null) {
             functionId = randomFunction.getSelectedIndex();
             int nbOfExtras = AvatarRandom.NB_OF_EXTRA_ATTRIBUTES[functionId];
             jextraAttribute1.setEnabled(nbOfExtras > 0);
-            if (AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES[functionId].length() > 0)
-                jextraAttribute1L.setText(AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES[functionId] + ":");
+            if (AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES_1[functionId].length() > 0)
+                jextraAttribute1L.setText(AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES_1[functionId] + ":");
             else {
                 jextraAttribute1L.setText("");
             }
         }
+
+        if (extraAttribute2 != null) {
+            functionId = randomFunction.getSelectedIndex();
+            int nbOfExtras = AvatarRandom.NB_OF_EXTRA_ATTRIBUTES[functionId];
+            jextraAttribute2.setEnabled(nbOfExtras > 1);
+            if (AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES_2[functionId].length() > 0)
+                jextraAttribute2L.setText(AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES_2[functionId] + ":");
+            else {
+                jextraAttribute2L.setText("");
+            }
+        }
     }