diff --git a/algos/template/algo_template_loadtp.m b/algos/template/algo_template_loadtp.m
index 6be2a3b655373e04f506ec48bb14bd3b4df148c5..80347de0cf4265881cebcc3eea6bb41ec6f76607 100644
--- a/algos/template/algo_template_loadtp.m
+++ b/algos/template/algo_template_loadtp.m
@@ -1,6 +1,9 @@
 function TP = algo_template_loadtp()
 % Setup tunable control params
 
-TP.gain = single(2);
-TP.refmodel.gain = 4; % another gain used in referenced model
+TP.gain             = single(2);
+TP.refmodel.gain    = 4; % another gain used in referenced model
+TP.rowvect          = int32([1 2 3]);
+TP.colvect          = int16([1 2 3]');
+TP.matrix           = int8([1 2; 3 4]);
 end
diff --git a/algos/template/algoobj_template.m b/algos/template/algoobj_template.m
index afd744f5b7c67dc7fdfb72f276801d49bb2b650b..90a1ea875e5361b4a038fcc7334cb9dd5c9d6c4f 100644
--- a/algos/template/algoobj_template.m
+++ b/algos/template/algoobj_template.m
@@ -13,6 +13,11 @@ obj=obj.addfpinitfcn('algo_template_loadfp','algo_template_fp');
 obj=obj.addtunparamstruct('algo_template_tp', @()algo_template_loadtp());
 
 %% Tunable parameters
+obj=obj.addparameter(SCDclass_mdsparnumeric('ks1','gain'            ,'srcsrv','spcpc171.epfl.ch','srctree','martetest')); 
+obj=obj.addparameter(SCDclass_mdsparnumeric('ks2','refmodel.gain'   ,'srcsrv','spcpc171.epfl.ch','srctree','martetest'));
+obj=obj.addparameter(SCDclass_mdsparnumeric('kv1','rowvect'         ,'srcsrv','spcpc171.epfl.ch','srctree','martetest'));
+obj=obj.addparameter(SCDclass_mdsparnumeric('kv2','colvect'         ,'srcsrv','spcpc171.epfl.ch','srctree','martetest'));
+obj=obj.addparameter(SCDclass_mdsparnumeric('km1','matrix'          ,'srcsrv','spcpc171.epfl.ch','srctree','martetest'));
 
 %% Wavegens
 
diff --git a/classes/SCDclass_mdspar.m b/classes/SCDclass_mdspar.m
index 7b7d3a700cbfc895ee94084f54815f9c6bd2fa5c..0c7545f00280d62ab252c01c831f4586a0866451 100644
--- a/classes/SCDclass_mdspar.m
+++ b/classes/SCDclass_mdspar.m
@@ -172,7 +172,10 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous
         end
         
         function [obj,value]=getdatacommon(obj, shot)
-            obj=obj.actualizegetcmd('mdsvalue(''%s'')', shot);
+            % TODO: this depends upon selected MATLAB - MDSplus interface
+            % mdsipmex mdsvalueraw to return uncast MDSplus data
+            % python interface mdsvalue returns incast MDSplus data 
+            obj=obj.actualizegetcmd('mdsvalueraw(''%s'')', shot);  
                 
             value=eval(obj.getcommand);
             if(~isnumeric(value) && ~isa(obj,'SCDclass_mdsparenum')) % TODO: better handle this exception
diff --git a/classes/SCDclass_mdsparnumeric.m b/classes/SCDclass_mdsparnumeric.m
new file mode 100644
index 0000000000000000000000000000000000000000..03f93ae65a5a939edf54f942b7b01e29553dae9b
--- /dev/null
+++ b/classes/SCDclass_mdsparnumeric.m
@@ -0,0 +1,97 @@
+classdef SCDclass_mdsparnumeric < SCDclass_mdspar
+    % General purpose numeric loader MDS+ parameter class
+    
+    properties
+    end
+    
+   
+    methods
+        
+        function obj=SCDclass_mdsparnumeric(srctdimodel, destparam, varargin)   
+            obj@SCDclass_mdspar();
+            % Constructor parser customization definitions here
+            obj=obj.parseconstructorcommon(srctdimodel, destparam, varargin);
+            % Constructor parser customization results here
+            obj.classname=mfilename;
+            obj.marteclassname='MDSParameter';
+        end
+
+        function actualizedata(obj, shot) 
+              obj=obj.preactualizecommon(shot);
+              if ~obj.actualizable, return; end
+     
+              %%% Actualization checks %%%
+              % dimensions
+              sourcedim=size(obj.value);
+              targetdim=Simulink.data.evalinGlobal(obj.modelname,sprintf('size(%s)',obj.assignvar));
+
+              actchk=true;
+              if numel(sourcedim)~=numel(targetdim)
+                  warning('SCDDScore:mdsparnumeric','%s: number of dimensions not matching, actualization skipped!',obj.modelparam); 
+                  % TODO bette handle output ?
+                  sourcedim
+                  targetdim
+                  actchk=false;
+              end
+              % handle vector transposition 
+              if numel(sourcedim)==2 && ~isscalar(obj.value)
+                 if (sourcedim(1)==1 && targetdim(2)==1) || (sourcedim(2)==1 && targetdim(1)==1)
+                    % we've a vector to transpose
+                    obj.value=obj.value';
+                    sourcedim=size(obj.value);
+                    % TODO: in the new implementation, use obj.value for
+                    % actualization and not an evaluated command ?
+                    obj.assignstring=sprintf('%s=%s'';',obj.assignvar,obj.getcommand);
+                 end
+              end
+              if actchk && ~any(sourcedim == targetdim)
+                  warning('SCDDScore:mdsparnumeric','%s: dimensions not matching, actualization skipped!',obj.modelparam); 
+                  % TODO bette handle output ?
+                  sourcedim
+                  targetdim
+                  actchk=false;
+              end
+              
+              % type
+              sourceclass=class(obj.value);
+              targetclass=Simulink.data.evalinGlobal(obj.modelname,sprintf('class(%s)',obj.assignvar));
+              if actchk && ~strcmp(sourceclass,targetclass)
+                  warning('SCDDScore:mdsparnumeric','%s: Data types not matching, actualization skipped!',obj.modelparam); 
+                  % TODO bette handle output ?
+                  sourceclass
+                  targetclass
+                  actchk=false;
+              end
+              
+              % MARTe2 checks matrix orientation, but MDSplus - MATLBA
+              % interface do not provide in information (matrix
+              % orientation) to do this. Or, probably, I misunderstood and
+              % matrix orientation is always preserved
+              
+           
+                           
+              obj.caststring=sprintf('%s=%s;',obj.assignvar,obj.assignvar);
+              if actchk
+                obj.postactualizecommon(shot);
+              end
+        end
+                
+        function [obj, value] = getdata(obj, shot)
+              [obj,value]=obj.getdatacommon(shot);
+        end
+       
+        function printinfo(obj)
+            obj.printinfocommon;
+        end
+         
+        function entrystring = genMARTe2entry(obj, shot)
+            entrystring=obj.genMARTe2entrycommon(shot);
+            entrystring=[entrystring ' }'];
+        end
+
+        function out = casttomds(obj, in)
+            out = in;
+        end
+    end
+end
+