diff --git a/code/classes/SCDclass_mdspar.m b/code/classes/SCDclass_mdspar.m
index 929ebee1692c19971c1297dc50be50473bd31323..bcf283ae0bf5b5369bfdcc28a96704a4224605f2 100644
--- a/code/classes/SCDclass_mdspar.m
+++ b/code/classes/SCDclass_mdspar.m
@@ -117,6 +117,16 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous
            assert(s==localshot, str);
         end
         
+        function obj=setactualizecmds(obj, shot)
+           pointspos=strfind(obj.modelparam,'.');
+           baseparam=obj.modelparam(1:pointspos(1)-1);
+           structparam=obj.modelparam(pointspos(1):end); 
+           obj.assignvar=sprintf('%s.Value%s',baseparam,structparam);
+           obj.assignstring=sprintf('%s=%s;',obj.assignvar,obj.getcommand);
+           obj.denanstring=sprintf('%s(isnan(%s))=0;',obj.assignvar,obj.assignvar);
+           obj.caststring=sprintf('%s=%s;',obj.assignvar,obj.assignvar);             
+        end
+        
         function obj=preactualizecommon(obj, shot)
            if(~obj.unlinked)            
                % Opening the tree
@@ -125,13 +135,7 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous
                [obj, obj.value]=obj.getdata(shot);
                if ~obj.actualizable, return; end
                
-               pointspos=strfind(obj.modelparam,'.');
-               baseparam=obj.modelparam(1:pointspos(1)-1);
-               structparam=obj.modelparam(pointspos(1):end); 
-               obj.assignvar=sprintf('%s.Value%s',baseparam,structparam);
-               obj.assignstring=sprintf('%s=%s;',obj.assignvar,obj.getcommand);
-               obj.denanstring=sprintf('%s(isnan(%s))=0;',obj.assignvar,obj.assignvar);
-               obj.caststring=sprintf('%s=%s;',obj.assignvar,obj.assignvar); 
+               obj=obj.setactualizecmds(shot);
            end
         end
         
@@ -156,9 +160,9 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous
         
         function [obj,value]=getdatacommon(obj, shot)
             obj=obj.actualizegetcmd('mdsvalue(''%s'')', shot);
-            
+                
             value=eval(obj.getcommand);
-            if(~isnumeric(value))
+            if(~isnumeric(value) && ~isa(obj,'SCDclass_mdsparenum')) % TODO: better handle this exception
                 warning('SCDclass_mdspar:MDSerror','MDS+ error for parameter %s: %s. Actualization skipped.',obj.modelparam, value);
                 obj.actualizable=false;
             else
diff --git a/code/classes/SCDclass_mdsparenum.m b/code/classes/SCDclass_mdsparenum.m
new file mode 100644
index 0000000000000000000000000000000000000000..1d0eb73642c74b549e5923a16bae4485d6d0f16c
--- /dev/null
+++ b/code/classes/SCDclass_mdsparenum.m
@@ -0,0 +1,116 @@
+classdef SCDclass_mdsparenum < SCDclass_mdspar
+    % A string enumerated MDS parameter, for uint16 enum codes
+    % 
+    % behavior in MATLAB:
+    %  if a string match between MDS string and matlab num string is 
+    %  asserted, the enum choice is loaded into the tun parameter
+    %  if not a warning is issued and the param is left untouched
+    % behavior in MARTe2:
+    %  the same than before but the enum map is used to load the
+    %  equivalent uint16 code on the MARTe2 side tunable parameter
+    %  if a string match is not detected, the parameter is invalidated
+
+    properties(Access=private)
+        enumclass
+        stringmap
+        intmap
+    end
+    
+    methods
+        
+        function obj=SCDclass_mdsparenum(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='MDSParEnum';
+        end
+
+        function actualizedata(obj, shot)                         
+              obj=obj.preactualizecommon(shot);
+              
+              if(~obj.unlinked) 
+                  % Enumeration map fill
+                  obj=obj.initenummap();
+
+                  found=false;
+                  for ii=1:numel(obj.stringmap)
+                      if strcmp(obj.value,char(obj.stringmap(ii)))
+                          found = true;
+                          break;
+                      end
+
+                  end
+
+                  if ~found
+                     warning('SCDclass_mdsparenum:actualize','No match between MDS and enum values, parameter not actualized');
+                     return
+                  end
+
+                  obj.assignstring=sprintf('%s=%s.%s;',obj.assignvar,obj.enumclass,obj.value);             
+                  obj.denanstring='';
+                  obj.caststring='';
+              end
+              
+              obj.postactualizecommon(shot);
+        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);
+            
+            % to populate obj.assignvar
+            obj=obj.setactualizecmds(shot);
+              
+            % Enumeration map fill
+            obj=obj.initenummap();
+            
+            enumval  ='EnumVal = {';
+            enumcode ='EnumCode = {';
+            for ii=1:numel(obj.stringmap)
+                enumval=[enumval '"' char(obj.stringmap(ii)) '"'];
+                if ii~=numel(obj.stringmap)
+                    enumval=[enumval ','];
+                end
+            end
+            enumval=[enumval, '}'];
+            for ii=1:numel(obj.intmap)
+                enumcode=[enumcode num2str(obj.intmap(ii))];
+                if ii~=numel(obj.intmap)
+                    enumcode=[enumcode ','];
+                end
+            end
+            enumcode=[enumcode '}'];
+            
+            
+            entrystring=[entrystring ' ' enumcode ' ' enumval '}'];
+        end
+
+    end
+    
+    methods(Access = private)
+       
+        function obj = initenummap(obj)
+            % TODO: probably Simulink.data.evalinGlobal better than
+            % evalin('base'
+            
+            basecmd = ['class(' obj.assignvar ');'];
+            obj.enumclass  = evalin('base',basecmd);
+            basecmd = ['enumeration(' obj.assignvar ');'];
+            obj.stringmap  = evalin('base',basecmd);
+            basecmd = ['uint16(enumeration(' obj.assignvar '));'];
+            obj.intmap     = evalin('base',basecmd);
+        end
+        
+    end
+end
+