diff --git a/src/InputOutput/IHMImpl/Params/DownloadImpl/IHMInputOutputParamsDownloadClass.php b/src/InputOutput/IHMImpl/Params/DownloadImpl/IHMInputOutputParamsDownloadClass.php
index 8119f6a..7eeddaa 100644
--- a/src/InputOutput/IHMImpl/Params/DownloadImpl/IHMInputOutputParamsDownloadClass.php
+++ b/src/InputOutput/IHMImpl/Params/DownloadImpl/IHMInputOutputParamsDownloadClass.php
@@ -81,19 +81,42 @@ class IHMInputOutputParamsDownloadClass extends IHMInputOutputParamsAbstractClas
 					break;
 				case 1:
 					//Tab1D
-					if (isset($param->dim1) && ($param->dim1 != '') && ($param->dim1 != '*')) {
-						$paramInfo['indexes'] = array();
-						$paramInfo['indexes'][] = $param->dim1;
+					if ($param->{'dim1-is-range'}) {
+						$template_args = array(
+							'paramid' => $paramInfo['id'],
+							'min' => $param->{'dim1-min-range'},
+							'max' => $param->{'dim1-max-range'},
+							'relateddim' => 0
+						);
+						$paramInfo = $this->paramManager->addExistingParam('sum_into_table_range', $this->paramsData, $template_args);
 					}
-					else if (isset($param->dim2) && ($param->dim2 != '') && ($param->dim2 != '*')) {
-						$paramInfo['indexes'] = array();
-						$paramInfo['indexes'][] = $param->dim2;
+					else {
+						if (($param->{'dim1-index'} != '*') && ($param->{'dim1-index'} != '')) {
+							$paramInfo['indexes'] = array();
+							$paramInfo['indexes'][] = $param->{'dim1-index'};
+						}
+					}
+					
+					if ($param->{'dim2-is-range'}) {
+						$template_args = array(
+							'paramid' => $paramInfo['id'],
+							'min' => $param->{'dim2-min-range'},
+							'max' => $param->{'dim2-max-range'},
+							'relateddim' => 1
+						);
+						$paramInfo = $this->paramManager->addExistingParam('sum_into_table_range', $this->paramsData, $template_args);
+					}
+					else {
+						if (($param->{'dim2-index'} != '*') && ($param->{'dim2-index'} != '')) {
+							$paramInfo['indexes'] = array();
+							$paramInfo['indexes'][] = $param->{'dim2-index'};
+						}
 					}
 					break;
 				case 2:
-					if (($param->dim1 != '*') || ($param->dim2 != '*')) {
+					if (($param->{'dim1-index'} != '*') || ($param->{'dim2-index'} != '*')) {
 						$paramInfo['indexes'] = array();
-						$paramInfo['indexes'][] = "[".$param->dim1.",".$param->dim2."]";
+						$paramInfo['indexes'][] = "[".$param->{'dim1-index'}.",".$param->{'dim2-index'}."]";
 					}
 					break;
 			}
diff --git a/src/InputOutput/IHMImpl/Params/PlotImpl/IHMInputOutputParamsPlotClass.php b/src/InputOutput/IHMImpl/Params/PlotImpl/IHMInputOutputParamsPlotClass.php
index 3300313..20df4c2 100644
--- a/src/InputOutput/IHMImpl/Params/PlotImpl/IHMInputOutputParamsPlotClass.php
+++ b/src/InputOutput/IHMImpl/Params/PlotImpl/IHMInputOutputParamsPlotClass.php
@@ -651,28 +651,53 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
 			$paramInfo = $this->paramManager->addExistingParam($paramData->{'paramid'}, $this->paramsData, $paramData->{'template_args'});
 			
 			$paramInfo['indexes'] = array();
-			$dim1 = $paramData->{'dim1'};
-			if ($dim1 == '')
-				$dim1 = '*';
-			$dim2 = $paramData->{'dim2'};
-			if ($dim2 == '')
-				$dim2 = '*';
+			
+			$dim1_index = '*';
+			if (!$paramData->{'dim1-is-range'}) {
+				if ($paramData->{'dim1-index'} != '')
+					$dim1_index = $paramData->{'dim1-index'};
+			}
+			
+			$dim2_index = '*';
+			if (!$paramData->{'dim2-is-range'}) {
+				if ($paramData->{'dim2-index'} != '')
+					$dim2_index = $paramData->{'dim2-index'};
+			}	
+			
 			switch ($paramData->{'type'}) {
 				case 0:
 					//scalar - nothing to do
 					break;
 				case 1:
 					//Tab1D
-					if (isset($dim1) && ($dim1 != '*')) {
-						$paramInfo['indexes'][] = $dim1;
+					if ($paramData->{'dim1-is-range'}) {
+						$template_args = array(
+							'paramid' => $paramInfo['id'],
+							'min' => $paramData->{'dim1-min-range'},
+							'max' => $paramData->{'dim1-max-range'},
+							'relateddim' => 0
+						);
+						$paramInfo = $this->paramManager->addExistingParam('sum_into_table_range', $this->paramsData, $template_args);
+					}
+					else if ($paramData->{'dim2-is-range'}) {
+						$template_args = array(
+							'paramid' => $paramInfo['id'],
+							'min' => $paramData->{'dim2-min-range'},
+							'max' => $paramData->{'dim2-max-range'},
+							'relateddim' => 1
+						);
+						$paramInfo = $this->paramManager->addExistingParam('sum_into_table_range', $this->paramsData, $template_args);
+					}
+					else if (isset($dim1_index) && ($dim1_index != '*')) {
+						$paramInfo['indexes'][] = $dim1_index;
 					}
-					else if (isset($dim2) && ($dim2 != '*')) {
-						$paramInfo['indexes'][] = $dim2;
+					else if (isset($dim2_index) && ($dim2_index != '*')) {
+						$paramInfo['indexes'][] = $dim2_index;
 					}
 					break;
 				case 2:
-					if (($dim1 != '*') || ($dim2 != '*')) {
-						$paramInfo['indexes'][] = "[".$dim1.",".$dim2."]";
+					if (($dim1_index != '*') || ($dim2_index != '*')) {
+						$paramInfo['indexes'][] = "[".$dim1_index.",".$dim2_index."]";
 					}
 					break;
 			}
diff --git a/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php b/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php
index 79384ca..8432ed0 100644
--- a/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php
+++ b/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php
@@ -45,13 +45,17 @@ class IHMExpressionParserClass
 	private $functionsArray;
 	
 	private $templatedParamMgr = NULL;
+	
+	private $isTest = FALSE;
 
 	/*
 	 * @brief Constructor
 	*/
-	function __construct()
+	function __construct($isTest = FALSE)
 	{
-		$this->templatedParamMgr = new IHMParamTemplateClass();
+		$this->isTest = $isTest;
+		if (!$isTest)
+			$this->templatedParamMgr = new IHMParamTemplateClass();
 	}
 
 	/*
@@ -61,18 +65,19 @@ class IHMExpressionParserClass
 	{
 		//tests
 		$tests = array(
-				"dst>3" => array ("expression" => "greater_than(\$dst,3)", "params" => array("dst")),
-				"@const_1<dst" => array("expression" => "(lower_than(1.0E-10,\$dst))", "params" => array("dst")),
-				"dst^#alias_2" => array("expression" => "(pow(\$dst,\$imf[1]))", "params" => array("dst","imf")),
-				"dst^2+@const_2" => array("expression" => "(pow(\$dst,2))+-2.8", "params" => array("dst")),
-				"atan(imf(2)/imf(1))+speed/100.0" => array("expression" => "atan((\$imf[2]/\$imf[1]))+(\$speed/100.0)", "params" => array("imf","speed")),
-				"shiftT_(clust1_hia_pad,60)" => array("expression" => "#timeShift(\$clust1_hia_pad;60)", "params" => array("clust1_hia_pad")),
-				"smooth_(density,1200)" => array("expression" => "#boxcar(\$density;1200)", "params" => array("density")),
-				"shiftT_(density,-600)" => array("expression" => "#timeShift(\$density;-600)", "params" => array("density")),
-				"deriv(density)" => array("expression" => "#deriv(\$density)", "params" => array("density")),
-				"abs(dst)" =>array("expression" => "abs(\$dst)", "params" => array("dst")),
-				"density*speed+(density^2-1.0)/speed" => array("expression" => "(\$density*\$speed)+((pow(\$density,2))-1.0)/\$speed", "params" => array("density","speed")),
-				"(-7<dst)&(dst<-3)" => array("expression" => "And((lower_than(-7,\$dst)),(lower_than(\$dst,-3)))", "params" => array("dst"))
+				"dst>3" => array ("expression" => "greater_than(\$dst,3)", "params" => array(array("paramid" => "dst"))),
+				"@const_1<dst" => array("expression" => "(lower_than(1.0E-10,\$dst))", "params" => array(array("paramid" =>"dst"))),
+				"dst^#alias_2" => array("expression" => "(pow(\$dst,\$imf[1]))", "params" => array(array("paramid" => "dst"),array("paramid" => "imf"))),
+				"dst^2+@const_2" => array("expression" => "(pow(\$dst,2))+-2.8", "params" => array(array("paramid" => "dst"))),
+				"atan(imf(2)/imf(1))+speed/100.0" => array("expression" => "atan((\$imf[2]/\$imf[1]))+(\$speed/100.0)", "params" => array(array("paramid" => "imf"), array("paramid" => "speed"))),
+				"shiftT_(clust1_hia_pad,60)" => array("expression" => "#timeShift(\$clust1_hia_pad;60)", "params" => array(array("paramid" => "clust1_hia_pad"))),
+				"smooth_(density,1200)" => array("expression" => "#boxcar(\$density;1200)", "params" => array(array("paramid" => "density"))),
+				"shiftT_(density,-600)" => array("expression" => "#timeShift(\$density;-600)", "params" => array(array("paramid" => "density"))),
+				"deriv(density)" => array("expression" => "#deriv(\$density)", "params" => array(array("paramid" => "density"))),
+				"abs(dst)" =>array("expression" => "abs(\$dst)", "params" => array(array("paramid" => "dst"))),
+				"density*speed+(density^2-1.0)/speed" => array("expression" => "(\$density*\$speed)+((pow(\$density,2))-1.0)/\$speed", "params" => array(array("paramid" => "density"),array("paramid" => "speed"))),
+				"(-7<dst)&(dst<-3)" => array("expression" => "And((lower_than(-7,\$dst)),(lower_than(\$dst,-3)))", "params" => array(array("paramid" => "dst"))),
+				"cass_caps_elssec4(range[0,10])" => array("expression" => "\$sum_into_table_range_cass_caps_elssec4_0_0_10", "params" => array(array("paramid" => "sum_into_table_range_cass_caps_elssec4_0_0_10")))
 		);
 
 		//init constants, aliases and functions for test
@@ -146,13 +151,19 @@ class IHMExpressionParserClass
 		//keep only params id
 		$params = array();
 		foreach ($params_full as $param_full) {
-			if (($templated_param_info = $this->templatedParamMgr->parseTemplatedParam($param_full["id"])) !== FALSE) {
+			if (array_key_exists("template_args", $param_full)) {
+				$params[] = array(
+					"paramid" => $param_full['id'],
+					"fullparamid" => $param_full['fullparamid'],
+					"template_args" => $param_full['template_args']
+				);
+			}
+			else if (!$this->isTest && (($templated_param_info = $this->templatedParamMgr->parseTemplatedParam($param_full["id"])) !== FALSE)) {
 				$params[] = $templated_param_info;
 			}
 			else
 				$params[] = array("paramid" => $param_full["id"]);
 		}
-
 		return array("expression" => $translated, "params" => $params);
 	}
 
@@ -303,6 +314,14 @@ class IHMExpressionParserClass
 		$this->loadFunctions();
 		return array_key_exists($element,$this->functionsArray);
 	}
+	
+	/*
+	 * @brief detect if the element is "range"
+	 */
+	private function isRange($element)
+	{
+		return ($element == "range");
+	}
 
 	/*
 	 * @brief detect if the element is an operator
@@ -534,7 +553,8 @@ class IHMExpressionParserClass
 				!$this->isDecimal($element) &&
 				!$this->isOperator($element) &&
 				!$this->isFunction($element) &&
-				($element != ",") && ($element != ";") && ($element != "(") && ($element != ")"));
+				!$this->isRange($element) &&
+				($element != ",") && ($element != ";") && ($element != "("));
 	}
 
 	/*
@@ -551,6 +571,21 @@ class IHMExpressionParserClass
 				(count($tree[$i] == 1)) &&
 				$this->isInteger($tree[$i][0]));
 	}
+	
+	/*
+	 * @brief detect if the element is a range for a parameter
+	*/
+	private function isParameterRange($tree, $i)
+	{
+		$paramId = "";
+		if ($i <= 0)
+			return false;
+		if (!$this->isParameter($tree[$i-1]))
+			return false;
+		return (is_array($tree[$i]) &&
+				(count($tree[$i] == 1)) &&
+				$this->isRange($tree[$i][0]));
+	}
 
 	/*
 	 * @brief add a parameter
@@ -575,6 +610,29 @@ class IHMExpressionParserClass
 			return;
 		}
 	}
+	
+	/*
+	 * @brief add a parameter range
+	*/
+	private function addParameterRangeInParameterArray($paramId, $range, &$params)
+	{
+		$sum_parameter_id = "";
+		if ((count($range) == 2) && (count($range[1]) == 3) && ($this->isInteger($range[1][0])) && ($this->isInteger($range[1][2])) & ($range[1][1] == ",")) {
+			$sum_parameter_id = "sum_into_table_range_".$paramId."_0_".$range[1][0]."_".$range[1][2];
+			$params[] = array("id"      => "sum_into_table_range",
+					          "fullparamid"  => $sum_parameter_id,
+							  "indexes" => array(),
+							  "calib_infos" => array(),
+					          "template_args" => array(
+					          		"paramid" => $paramId,
+									"relateddim" => 0,
+					          		"min" => $range[1][0],
+					          		"max" => $range[1][2]
+							  )
+					);
+		}
+		return $sum_parameter_id;
+	}
 
 	/*
 	 * @brief process used to treat parameter components
@@ -592,16 +650,29 @@ class IHMExpressionParserClass
 			else if ($this->isParameter($tree[$i]))
 			{
 				$param = $tree[$i];
-				$this->addParameterIdInParameterArray($param,$params);
+				
 				if ($i < count($tree) - 1)
 				{
-					if ($this->isParameterComponent($tree,$i+1))
+					if ($this->isParameterRange($tree,$i+1))
 					{
-						$this->addParameterComponentInParameterArray($param, $tree[$i+1][0], $params);
-						$param .= ("[".$tree[$i+1][0]."]");
+						$sum_parameter_id = $this->addParameterRangeInParameterArray($param, $tree[$i+1], $params);
+						$param = $sum_parameter_id;
 						++$i;
 					}
+					else
+					{
+						$this->addParameterIdInParameterArray($param,$params);
+						if ($this->isParameterComponent($tree,$i+1))
+						{
+							$this->addParameterComponentInParameterArray($param, $tree[$i+1][0], $params);
+							$param .= ("[".$tree[$i+1][0]."]");
+							++$i;
+						}
+					}
 				}
+				else 
+					$this->addParameterIdInParameterArray($param,$params);
+					
 				$result[] = $param;
 			}
 			else
@@ -733,7 +804,7 @@ class IHMExpressionParserClass
 			}
 			else if ($tree[$i] == ";")
 			{
-				//echo "DOT COMA".PHP_EOL;
+				echo "DOT COMA".PHP_EOL;
 				$translated .= ";";
 			}
 			else if ($this->isFunction($tree[$i]))
@@ -752,12 +823,19 @@ class IHMExpressionParserClass
 				{
 					//echo "TEST ".$param["id"].PHP_EOL;
 
-					if ($param["id"] == $tree[$i])
+					if (array_key_exists("template_args", $param))
+					{
+						$founded = true;
+						$translated .= "\$".$param["fullparamid"];
+						break;
+					}
+					else if ($param["id"] == $tree[$i])
 					{
 						$founded = true;
 						$translated .= ("\$".$tree[$i]);
 						break;
 					}
+					
 					foreach ($param["indexes"] as $index)
 					{
 						$temp = "";
@@ -801,7 +879,7 @@ class IHMExpressionParserClass
 	}
 }
 
-/*$parser = new IHMExpressionParserClass();
+/*$parser = new IHMExpressionParserClass(TRUE);
  try {
 $parser->test();
 } catch (Exception $e) {
diff --git a/src/Request/ParamInfoRequestClass.php b/src/Request/ParamInfoRequestClass.php
index 07405f5..df5d9c2 100644
--- a/src/Request/ParamInfoRequestClass.php
+++ b/src/Request/ParamInfoRequestClass.php
@@ -125,15 +125,18 @@ class ParamInfoRequestClass extends RequestAbstractClass
 						'relatedDim' => ($tableNode->getAttribute("relatedDim") == "dim_1" ? "dim1" : "dim2"),
 						'name' => $tableNode->getAttribute("name"),
 						'units' => $tableNode->getAttribute("units"),
+						'variable' => ($tableNode->getAttribute("variable") === "true"),
 						'channels' => array()
 				);
 				
-				$channelNodes = $tableNode->getElementsByTagName("channel");
-				foreach ($channelNodes as $channelNode) {
-					$tableResult['channels'][] = array(
-						'min' => $channelNode->getAttribute("min"),
-						'max' => $channelNode->getAttribute("max")
-					);
+				if (!$tableResult['variable']) {
+					$channelNodes = $tableNode->getElementsByTagName("channel");
+					foreach ($channelNodes as $channelNode) {
+						$tableResult['channels'][] = array(
+							'min' => $channelNode->getAttribute("min"),
+							'max' => $channelNode->getAttribute("max")
+						);
+					}
 				}
 				
 				$result['tables'][] = $tableResult;
--
libgit2 0.21.2