diff --git a/matlab/TCV/gdat_tcv.m b/matlab/TCV/gdat_tcv.m
index 8acfc6f38c78d0457b3e330c4ed1c09b7b2be85e..d8977c80fa263af90386cfe3a3b1a8ee0e3d97e8 100644
--- a/matlab/TCV/gdat_tcv.m
+++ b/matlab/TCV/gdat_tcv.m
@@ -80,7 +80,7 @@ function [gdat_data,gdat_params,error_status,varargout] = gdat_tcv(shot,data_req
 % Prepare some variables, etc
 
 varargout{1}=cell(1,1);
-error_status=1;
+error_status=-1;
 
 % construct main default parameters structure
 % parameters and defaults related to a specific request should be defined in the relevant switch case section
@@ -117,6 +117,9 @@ gdat_data.shot = [];
 gdat_data.gdat_request = [];
 gdat_data.gdat_params = gdat_params;
 gdat_data.data_fullpath = [];
+gdat_data.help = '';
+gdat_data.status_mds = 2;
+gdat_data.status = error_status;
 
 
 % Treat inputs:
@@ -179,6 +182,7 @@ if nargin>=1
   else
     if gdat_params.nverbose>=1; warning('type of 1st argument unexpected, should be numeric or char'); end
     error_status=2;
+    gdat_data.status = error_status;
     return
   end
   if nargin==1
@@ -196,6 +200,7 @@ if nargin>=2 && ivarargin_first_char~=1
     if ~isfield(data_request,'data_request')
       if gdat_params.nverbose>=1; warning('expects field data_request in input parameters structure'); end
       error_status=3;
+      gdat_data.status = error_status;
       return
     end
     data_request_eff = data_request.data_request;
@@ -248,12 +253,14 @@ if (nargin>=ivarargin_first_char)
       else
         if gdat_params.nverbose>=1; warning(['input argument nb: ' num2str(i) ' is incorrect, expects a character string']); end
         error_status=401;
+        gdat_data.status = error_status;
         return
       end
     end
   else
     if gdat_params.nverbose>=1; warning('number of input arguments incorrect, cannot make pairs of parameters'); end
     error_status=402;
+    gdat_data.status = error_status;
     return
   end
 end
@@ -283,6 +290,7 @@ end
 if ~isfield(gdat_params,'data_request') || isempty(gdat_params.data_request)
   % warning('input for ''data_request'' missing from input arguments') % might be correct, asking for list of requests
   error_status=5;
+  gdat_data.status = error_status;
   return
 end
 gdat_data.gdat_params = gdat_params; % This means that before here it is gdat_params which should be updated
@@ -291,6 +299,7 @@ gdat_data.gdat_params = gdat_params; % This means that before here it is gdat_pa
 shot = gdat_data.shot;
 data_request_eff = gdat_data.gdat_params.data_request;
 error_status = 6; % at least reached this level
+gdat_data.status = error_status;
 
 mapping_for_tcv = tcv_requests_mapping(data_request_eff,shot);
 gdat_data.label = mapping_for_tcv.label;
@@ -440,6 +449,7 @@ if strcmp(mapping_for_tcv.method(1:3),'tdi')
     else
       % empty or wrong expression
       error_status=701;
+      gdat_data.status = error_status;
       return
     end
   else
@@ -508,9 +518,15 @@ if strcmp(mapping_for_tcv.method(1:3),'tdi')
       end
     end
   end
-  if isempty(aatmp.data) || (isempty(aatmp.dim) && ischar(aatmp.data) && ~isempty(strfind(lower(aatmp.data),'no data')) ) % || ischar(aatmp.data) (to add?)
+  gdat_data.help = aatmp.help;
+  gdat_data.status_mds = aatmp.status;
+  error_status = 0;
+  gdat_data.status = error_status;
+  if mod(gdat_data.status_mds,2) == 0
     if (gdat_params.nverbose>=1); warning(['problems loading data for ' eval_expr ' for data_request= ' data_request_eff]); end
     if (gdat_params.nverbose>=3); disp('check .gdat_request list'); end
+    error_status = 7;
+    gdat_data.status = error_status;
     return
   end
   gdat_data.data = aatmp.data;
@@ -592,7 +608,6 @@ if strcmp(mapping_for_tcv.method(1:3),'tdi')
   else
     gdat_data.label=[mapping_for_tcv.expression];
   end
-
   if isfield(mapping_for_tcv,'help') && ~isempty(mapping_for_tcv.help)
     gdat_data.help = mapping_for_tcv.help;
   else
@@ -611,6 +626,7 @@ elseif strcmp(mapping_for_tcv.method,'expression')
   if isempty(gdat_tmp) || (~isstruct(gdat_tmp) & ~isobject(gdat_tmp))
     if (gdat_params.nverbose>=1); warning(['expression does not create a gdat_tmp structure: ' mapping_for_tcv.expression]); end
     error_status=801;
+    gdat_data.status = error_status;
     return
   end
   tmp_fieldnames = setdiff(fieldnames(gdat_tmp),{'gdat_request','label'}); % could/should also remove label in any case
@@ -673,20 +689,26 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     if liuqe_matlab==0
       nodenameeff=['tcv_eq("r_max_psi","' psitbx_str '")'];
       rmaxpsi=tdi(nodenameeff);
-      ijnan = find(isnan(rmaxpsi.data));
-      if isempty(rmaxpsi.data) || isempty(rmaxpsi.dim) || ischar(rmaxpsi.data) || ...
-            ( ~isempty(ijnan) && prod(size(ijnan))==prod(size(rmaxpsi.data)) )
+      gdat_data.help = rmaxpsi.help;
+      gdat_data.status_mds = rmaxpsi.status;
+      error_status = 0;
+      gdat_data.status = error_status;
+      if mod(gdat_data.status_mds,2) == 0
         if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end
         if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end
+        error_status = 90;
+        gdat_data.status = error_status;
         return
       end
       nodenameeff2=['tcv_eq("r_min_psi","' psitbx_str '")'];
       rminpsi=tdi(nodenameeff2);
-      ijnan = find(isnan(rminpsi.data));
-      if isempty(rminpsi.data) || isempty(rminpsi.dim) || ...
-            ( ~isempty(ijnan) && prod(size(ijnan))==prod(size(rminpsi.data)) )
+      gdat_data.help = rminpsi.help;
+      gdat_data.status_mds = rminpsi.status;
+      if mod(gdat_data.status_mds,2) == 0
         if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff2 ' for data_request= ' data_request_eff]); end
         if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end
+        error_status = 91;
+        gdat_data.status = error_status;
         return
       end
       ij=find(rmaxpsi.data<0.5 | rmaxpsi.data>1.2); % points outside TCV vessel
@@ -707,6 +729,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         gdat_data.data_fullpath=[nodenameeff ' + ' nodenameeff2 ' /2'];
       else
         if (gdat_params.nverbose>=1); warning(['should not be in this case with data_request_eff = ' data_request_eff]); end
+        error_status = 92;
+        gdat_data.status = error_status;
         return
       end
       if strcmp(data_request_eff(end-3:end),'_rho')
@@ -743,8 +767,20 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         return
       end
       aatmp = tdi(nodenameeff);
+      gdat_data.help = aatmp.help;
+      gdat_data.status_mds = aatmp.status;
+      error_status = 0;
+      gdat_data.status = error_status;
+      if mod(gdat_data.status_mds,2) == 0
+        error_status = 101;
+        gdat_data.status = error_status;
+      end
       if strcmp(data_request_eff(end-3:end),'_rho')
         aatmp2 = tdi(nodenameeff2);
+        if mod(aatmp2.status,2) == 0
+          error_status = 102;
+          gdat_data.status = error_status;
+        end
         if strcmp(data_request_eff,'a_minor_rho')
           gdat_data.data = 0.5.*(aatmp.data-aatmp2.data);
         elseif strcmp(data_request_eff,'rgeom_rho')
@@ -784,9 +820,15 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       nodenameeff=['tcv_eq("z_edge","' psitbx_str '")'];
     end
     zcontour=tdi(nodenameeff);
-    if isempty(zcontour.data) || isempty(zcontour.dim)  % || ischar(zcontour.data) (to add?)
+    gdat_data.help = zcontour.help;
+    gdat_data.status_mds = zcontour.status;
+    error_status = 0;
+    gdat_data.status = error_status;
+    if mod(gdat_data.status_mds,2) == 0
       if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end
       if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end
+      error_status = 111;
+      gdat_data.status = error_status;
       return
     end
     if strcmp(data_request_eff,'zgeom')
@@ -796,6 +838,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       gdat_data.dimunits{1} = zcontour.dimunits{2};
     else
       if (gdat_params.nverbose>=1); warning(['should not be in this case with data_request_eff = ' data_request_eff]); end
+      error_status = 112;
+      gdat_data.status = error_status;
       return
     end
     gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim};
@@ -844,8 +888,14 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         gdat_data.data = tracetdi.data .* added_correction;
       end
     end
-    if isempty(tracetdi.data) || isempty(tracetdi.dim) % || ischar(tracetdi.data) (to add?)
+    gdat_data.help = tracetdi.help;
+    gdat_data.status_mds = tracetdi.status;
+    error_status = 0;
+    gdat_data.status = error_status;
+    if mod(gdat_data.status_mds,2) == 0
       if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end
+      error_status =121;
+      gdat_data.status = error_status;
       return
     end
     gdat_data.data_fullpath=[added_correction_str nodenameeff];
@@ -869,13 +919,13 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'bfields'}
      params_eff = gdat_data.gdat_params;
-     
+
      try
        if params_eff.liuqe == 1
          % load LIUQE data
          [L,LY] = mds2meq(gdat_data.shot,'LIUQE.M',[],'ifield',true); % flag to allow field computation
          LY = meqreprocess(L,LY); % compute fields etc, since not directly loaded from mds2meq
-         datapath = 'Outputs from [L,LY]=mds2meq(gdat_data.shot,''LIUQE.M'',[],''ifield'',true); LY = meqreprocess(L,LY);';       
+         datapath = 'Outputs from [L,LY]=mds2meq(gdat_data.shot,''LIUQE.M'',[],''ifield'',true); LY = meqreprocess(L,LY);';
          Br   = permute(LY.Brx,[2,1,3]); % permute for (Z,R)->(R,Z)
          Bz   = permute(LY.Bzx,[2,1,3]);
          Btor = permute(LY.Btx,[2,1,3]);
@@ -890,10 +940,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
          Bz     = B.z;
          Btor   = B.phi;
          dim_in   = {coord.R,coord.z,time};
-         time_in  = time; 
+         time_in  = time;
          x_in     = {coord.R,coord.z};
        end
-       
+
        gdat_data.data_fullpath = datapath;
 
        % radial magnetic field
@@ -925,7 +975,7 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
        gdat_data.Btor.x = x_in;
        gdat_data.Btor.data_fullpath = datapath;
        gdat_data.Btor.label = 'Toroidal magnetic field map in (R,Z)';
-       
+
        % total magnetic field
        gdat_data.Btot.data = sqrt(gdat_data.Btor.data.^2 + gdat_data.Bz.data.^2 + gdat_data.Br.data.^2);
        gdat_data.Btot.units = 'T';
@@ -935,7 +985,7 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
        gdat_data.Btot.x = x_in;
        gdat_data.Btot.data_fullpath = datapath;
        gdat_data.Btot.label = 'Total magnetic field map in (R,Z)';
-       
+
        gdat_data.data = gdat_data.Btot.data;
        gdat_data.units = 'T';
        gdat_data.dim = dim_in;
@@ -943,6 +993,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
        gdat_data.t = time_in;
        gdat_data.x = x_in;
        gdat_data.label = 'Total magnetic field map in (R,Z)';
+       gdat_data.status_mds = 1;
+       error_status = 0;
+       gdat_data.status = error_status;
 
      catch
 
@@ -951,6 +1004,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
        gdat_data.Br   = [];
        gdat_data.Bz   = [];
        gdat_data.Btot = [];
+       error_status = 151;
+       gdat_data.status = error_status;
 
      end
 
@@ -971,11 +1026,18 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     % use beta as time base
     if isempty(b0.data) || isempty(b0.dim) || isempty(ip.data) || isempty(ip.dim) || isempty(a_minor.data) || isempty(a_minor.dim) || isempty(beta.data) || isempty(beta.dim)
       if (gdat_params.nverbose>=1); warning(['problems loading data for data_request= ' data_request_eff]); end
+      gdat_data.status_mds = 2;
+      error_status = 161;
+      gdat_data.status = error_status;
       return
     end
     gdat_data.dim = beta.dim;
     gdat_data.t = beta.dim{1};
     gdat_data.data = beta.data;
+    gdat_data.help = beta.help;
+    gdat_data.status_mds = 1;
+    error_status = 0;
+    gdat_data.status = error_status;
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
       % should already have all data at times time_out since called gdat_tcv above
     end
@@ -987,6 +1049,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       ip_t = ip.data(ij);
     else
       warning('no valid data for ip, cannot fit')
+      error_status = 162;
+      gdat_data.status = error_status;
       return
     end
     ij=find(isfinite(b0.data));
@@ -996,6 +1060,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       b0_t = b0.data(ij);
     else
       warning('no valid data for b0, cannot fit')
+      error_status = 163;
+      gdat_data.status = error_status;
       return
     end
     ij=find(isfinite(a_minor.data));
@@ -1005,6 +1071,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       a_minor_t = a_minor.data(ij);
     else
       warning('no valid data for a_minor, cannot fit')
+      error_status = 164;
+      gdat_data.status = error_status;
       return
     end
     gdat_data.data = 100.*beta.data ./ abs(ip_t).*1.e6 .* abs(b0_t) .* a_minor_t;
@@ -1086,7 +1154,11 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     inb_times = length(cxrs_profiles.Times);
     gdat_data.cxrs_params = cxrs_profiles.param;
     if isempty(cxrs_profiles.Times) || ~isfield(cxrs_profiles,'proffit')
-      if (gdat_params.nverbose>=1); warning(['problems loading data with CXRS_get_profiles for data_request= ' data_request_eff]); end
+      gdat_data.status_mds = 2;
+      error_status = 171;
+      gdat_data.status = error_status;
+      gdat_data.help = ['problems loading data with CXRS_get_profiles for data_request= ' data_request_eff];
+      if (gdat_params.nverbose>=1); warning(gdat_data.help); end
       for i=1:length(sub_nodes)
         sub_eff_out = sub_nodes_out{i};
         gdat_data.(sub_eff_out).fit.data = [];
@@ -1157,6 +1229,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     end
     gdat_data.dimunits{1} = '';
     gdat_data.dimunits{2} = 's';
+    gdat_data.help = '';
+    gdat_data.status_mds = 1;
+    error_status = 0;
+    gdat_data.status = error_status;
     % add grids_1d to have rhotor, etc if cxrs_rho was asked for
     if strcmp(data_request_eff,'cxrs_rho')
       gdat_data = get_grids_1d(gdat_data,2,1,gdat_params.nverbose);
@@ -1198,6 +1274,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'eqdsk'}
     %
+    gdat_data.help = '';
+    gdat_data.status_mds = 2;
+    error_status = 181;
+    gdat_data.status = error_status;
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
       if isfield(gdat_data.gdat_params,'time') && ~isempty(gdat_data.gdat_params.time)
         disp('time_out parameter not used for eqdsk, uses time')
@@ -1273,6 +1353,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         if gdat_params.nverbose>=1;
           warning(['could not create eqdsk file from read_results_for_chease with data_request= ' data_request_eff]);
         end
+        error_status = 182;
+        gdat_data.status = error_status;
         return
       end
       ii = regexpi(fnames_readresults{4},'eqdsksigns');
@@ -1280,6 +1362,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         eqdskval=read_eqdsk(fnames_readresults{4},cocos_read_results_for_chease,0,[],[],1); % read_results now has relevant cocos LIUQE= 17
       else
         disp('wrong name check order of eqdsk outputs')
+        error_status = 183;
+        gdat_data.status = error_status;
         return
       end
       for i=1:length(fnames_readresults)
@@ -1364,6 +1448,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     gdat_data.dimunits = {'m','m','s'};
     gdat_data.request_description = ['data=psi, x=(R,Z), eqdsk contains eqdsk structure with which ' ...
                     'plot_eqdsk, write_eqdsk, read_eqdsk can be used'];
+    gdat_data.status_mds = 1;
+    error_status = 0;
+    gdat_data.status = error_status;
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'gas', 'gas_flux', 'gas_request', 'gas_feedforward','gas_valve', 'gas_fluxes'}
@@ -1375,6 +1462,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     end
     gasflux = gdat_tcv(gdat_data.shot,params_eff);
     gdat_data.gas_flux = gasflux;
+    gdat_data.help = gasflux.help;
+    gdat_data.status_mds = gasflux.status_mds;
+    error_status = 0; % since many options below, mark error if problem below
+    gdat_data.status = error_status;
     params_eff.data_request = '\hybrid::mat_m_signals:output_019';
     gasrequest = gdat_tcv(gdat_data.shot,params_eff);
     gdat_data.gas_request_volt = gasrequest;
@@ -1446,6 +1537,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         end
       end
      case {'gas_fluxes'}
+       gdat_data.help = 'cell array';
+       gdat_data.status_mds = 2;
+       error_status = 191;
+       gdat_data.status = error_status;
        try
          if shot > 82186
            for i=1:20
@@ -1480,7 +1575,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
        catch
        end
      otherwise
-      error('gas option not defined')
+       gdat_data.status_mds = 2;
+       error_status = 192;
+       gdat_data.status = error_status;
+       error('gas option not defined')
     end
     if ~strcmp(data_request_eff,'gas_valve')
       gdat_data.dim{1} = gdat_data.t;
@@ -1491,6 +1589,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     elseif ~isfield(gdat_data.gdat_params,'time_out')
       gdat_data.gdat_params.time_out = [];
     end
+    error_status = 0;
+    gdat_data.status = error_status;
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'halphas'}
@@ -1509,10 +1609,20 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
           gdat_data.t = halphas.t;
         end
         gdat_data.data(channels(i),:) = halphas.data;
+        gdat_data.help = halphas.help;
+        gdat_data.status_mds = halphas.status_mds;
       catch
-        disp([params_eff.data_request ' not ok']);
+        gdat_data.help = [params_eff.data_request ' not ok'];
+        gdat_data.status_mds = 2;
+        disp(halphas.help);
       end
     end
+    if mod(gdat_data.status_mds,2) == 0
+      error_status = 211;
+    else
+      error_status = 0;
+    end
+    gdat_data.status = error_status;
     gdat_data.label = ['\base::pd:pd_' num2str(min(channels),'%.3d') ' to ' num2str(max(channels),'%.3d')];
     gdat_data.x = channels;
     gdat_data.dim{1} = gdat_data.x;
@@ -1531,11 +1641,17 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     ids_empty_path = fullfile(fileparts(mfilename('fullpath')),'..','TCV_IMAS','ids_empty');
 
     params_eff = gdat_data.gdat_params;
+    gdat_data.help = '';
+    gdat_data.status_mds = 2;
+    error_status = 221;
+    gdat_data.status = error_status;
     if isfield(params_eff,'source') && ~isempty(params_eff.source)
       ids_top_name = params_eff.source;
     else
       ids_top_name = [];
-      warning('gdat:EmptyIDSName','Need an ids name in ''source'' parameter\n check substructure gdat_params.sources_available for an ids list');
+      gdat_data.help = ['gdat:EmptyIDSName','Need an ids name in ''source'' parameter\n check substructure ', ...
+          'gdat_params.sources_available for an ids list'];
+      warning(gdat_data.help);
       addpath(ids_empty_path);
       assert(~~exist('ids_list_all','file'),'could not find ids_list_all.m in %s',ids_empty_path);
       gdat_data.gdat_params.sources_available = ids_list_all; % avoid adding ids_list.m which would override ids_list from IMAS
@@ -1618,6 +1734,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       gdat_data.([ids_top_name '_description']) = getReport(ME_tcv_get_ids);
       rethrow(ME_tcv_get_ids)
     end
+    gdat_data.status_mds = 1;
+    error_status = 0;
+    gdat_data.status = error_status;
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'ec_data', 'aux', 'h_cd', 'nbi_data', 'ic_data', 'lh_data','ohm_data', 'bs_data'}
@@ -1638,6 +1757,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     if ~isempty(gdat_data.gdat_params.trialindx) && gdat_data.gdat_params.trialindx < 0
       gdat_data.gdat_params.trialindx = [];
     end
+    gdat_data.help = '';
+    gdat_data.status_mds = 2;
+    error_status = 1;
+    gdat_data.status = error_status;
     % specific parameters check and default settings
     if ~isfield(gdat_data.gdat_params,'source') || isempty(gdat_data.gdat_params.source)
       switch data_request_eff
@@ -1657,12 +1780,16 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
           if (gdat_params.nverbose>=1)
             warning(['source= ' gdat_data.gdat_params.source ' is not part of the available sources: ' sprintf('''%s'' ',sources_avail{:})]);
           end
+          error_status = 231;
+          gdat_data.status = error_status;
           return
         else
           gdat_data.gdat_params.source = {gdat_data.gdat_params.source};
         end
       else
         if (gdat_params.nverbose>=1); warning([' source parameter not compatible with: ' sprintf('''%s'' ',sources_avail{:})]); end
+        error_status = 232;
+        gdat_data.status = error_status;
         return
       end
     else
@@ -1911,10 +2038,16 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       if filled_successfully
         if isempty(ec_data.cd_tot.data) || isempty(ec_data.cd_tot.t) || ischar(ec_data.cd_tot.data)
           if (gdat_params.nverbose>=1)
+            gdat_data.status_mds = 2;
+            error_status = 233;
+            gdat_data.status = error_status;
             warning(['problems loading data for ' source_icd.ec ...
                       ' for data_request= ' data_request_eff]);
           end
         else
+          gdat_data.status_mds = 1;
+          error_status = 0;
+          gdat_data.status = error_status;
           % now default is icdtot, will depend on request and data_out param of some kind
           data_fullpath = ['from toray nodes using astra_tcv_EC_exp(shot), all results in .ec_data, subfield=' field_for_main_data ...
                            'in ec.data, .x, .t, .dim, .dimunits, .label, .units'];
@@ -1963,6 +2096,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         ec_data.cd_dens_doublewidth_label = [];
         ec_data.rho_tor_norm = [];
         gdat_data.ec.ec_data = ec_data;
+        error_status = 234;
+        gdat_data.status = error_status;
         return
       end
 
@@ -2143,6 +2278,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     elseif ~isfield(gdat_data.gdat_params,'time_out')
       gdat_data.gdat_params.time_out = [];
     end
+    error_status = 0;
+    gdat_data.status = error_status;
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'mhd'}
@@ -2158,6 +2295,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     % load n=1, 2 and 3 Bdot from magnetic measurements
     n3.data = [];
     mhd_source_list = {'0', '0full', '23', '23full', '-23', 'ltcc', 'ltcc-dbpol', 'ltcc-dbrad', 'ltcc-dbtor'};
+    gdat_data.status_mds = 2;
+    error_status = 1;
+    gdat_data.status = error_status;
     if shot< 50926
       n1=tdi('abs(mhdmode("LFS",1,1))');
       n2=tdi('abs(mhdmode("LFS",2,1))');
@@ -2171,6 +2311,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
           t2=sprintf('''%s'', ',mhd_source_list{1:end-1});
           t3=sprintf('or ''%s''',mhd_source_list{end});
           fprintf('%s %s %s\n',t1,t2,t3);
+          error_status = 241;
+          gdat_data.status = error_status;
           return
         end
       else
@@ -2229,6 +2371,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
           aaHFSz0_sect11=tdi('\atlas::DT196_MHD_002:channel_038');
           gdat_data.n1_HFS=aaHFSz0_sect3;
           gdat_data.n1_HFS.data = gdat_data.n1_HFS.data - aaHFSz0_sect11.data;
+          gdat_data.n1_HFS.help = aaHFSz0_sect3.help;
+          gdat_data.n1_HFS.status_mds = aaHFSz0_sect3.status;
           gdat_data.n2_HFS=aaHFSz0_sect3;
           gdat_data.n2_HFS.data = gdat_data.n2_HFS.data + aaHFSz0_sect11.data;
           gdat_data.data_fullpath=['\atlas::DT196_MHD_001:channel_083 -+ \atlas::DT196_MHD_001:channel_091 for n=1,2, LFS_sect3/11, z=0cm; _HFS' ...
@@ -2266,6 +2410,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         n3.data = [];
       else
         disp('should not be here in ''mhd'', ask O. Sauter')
+        error_status = 242;
+        gdat_data.status = error_status;
         return
       end
     end
@@ -2288,7 +2434,15 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       if shot>= 50926
         gdat_data.label = {'n odd','n even'}; % can be used in legend(gdat_data.label)
       end
+      gdat_data.help = n1.help;
+      gdat_data.status_mds = n1.status;
+    end
+    if mod(gdat_data.status_mds,2) == 0
+      error_status = 243;
+    else
+      error_status = 0;
     end
+    gdat_data.status = error_status;
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'ne','te'}
@@ -2298,6 +2452,12 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       gdat_data.gdat_params.systems = {'all'};
     end
     [gdat_data] = get_thomson_raw_data(shot,data_request_eff,gdat_data,gdat_data.gdat_params.systems,gdat_params.nverbose,0);
+    if mod(gdat_data.status_mds,2) == 0
+      error_status = 1;
+    else
+      error_status = 0;
+    end
+    gdat_data.status = error_status;
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
       [gdat_data] = gdat2time_out(gdat_data,1,{'error_bar'});
     elseif ~isfield(gdat_data.gdat_params,'time_out')
@@ -2336,6 +2496,13 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       ab_r = gdat_tcv(gdat_data.shot,'\diagz::fir_array:radii');
       gdat_data.r_center_chord = ab_r.data(ab_index.data+1);
     end
+    if mod(gdat_data.status_mds,2) == 0
+      error_status = 1;
+    else
+      error_status = 0;
+    end
+    gdat_data.status = error_status;
+
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'ne_rho', 'te_rho', 'nete_rho'}
     % if nete_rho, do first ne, then Te later (so fir stuff already done)
@@ -2479,6 +2646,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
           disp('should not be in switch gdat_data.gdat_params.fit_type')
           disp('ask olivier.sauter@epfl.ch')
         end
+        error_status = 251;
+        gdat_data.status = error_status;
         return
       end
       if strcmp(gdat_data.gdat_params.fit_type,'conf')
@@ -2503,8 +2672,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         trialindx = [];
       end
       tracetdi=tdi(nodenameeff);
+      gdat_data.help = tracetdi.help;
+      gdat_data.status_mds = tracetdi.status;
       if isempty(trialindx)
-        if ~isempty(tracetdi.data) && ~isempty(tracetdi.dim) && ~ischar(tracetdi.data)
+        if mod(gdat_data.status_mds,2) == 1
           gdat_data.fit.data = tracetdi.data;
         else
           if gdat_params.nverbose>=1
@@ -2516,6 +2687,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
           else
             gdat_data.fit.data_fullpath = [nodenameeff ' is empty'];
           end
+          error_status = 252;
+          gdat_data.status = error_status;
           return
         end
       else
@@ -2526,6 +2699,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
             disp([nodenameeff ' with trialindx=' num2str(trialindx) ' is empty, thus no fits, check hldsi(shot) and may need to run anaprofs?'])
           end
           gdat_data.fit.data_fullpath = [nodenameeff ' with trialindx=' num2str(trialindx) ' is empty'];
+          error_status = 253;
+          gdat_data.status = error_status;
           return
         end
       end
@@ -2545,8 +2720,12 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       gdat_data.fit.help = '.x is rhopol coordinate';
       tmp = tdi(def_rhotornorm);
       gdat_data.fit.rhotornorm = tmp.data;
+      gdat_data.fit.rhotornorm_help = tracetdi.help;
+      gdat_data.fit.rhotornorm_status_mds = tracetdi.status;
       tmp = tdi(def_rhovolnorm);
       gdat_data.fit.rhovolnorm = tmp.data;
+      gdat_data.fit.rhovolnorm_help = tmp.help;
+      gdat_data.fit.rhovolnorm_status_mds = tmp.status;
       % do te as well if nete asked for
       if strcmp(data_request_eff(1:4),'nete')
         for subfields={'data','x','t','units','help','rhotornorm','rhovolnorm','data_fullpath'}
@@ -2567,12 +2746,16 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         end
         if ~isempty(trialindx); nodenameeff=[nodenameeff ':trial']; end
         tracetdi=tdi(nodenameeff);
+        gdat_data.fit.te.help = tracetdi.help;
+        gdat_data.fit.te.status_mds = tracetdi.status;
         if isempty(trialindx)
           gdat_data.fit.te.data = tracetdi.data;
         else
           if ~isempty(tracetdi.data) && size(tracetdi.data,3)>=trialindx+1
             gdat_data.fit.te.data = tracetdi.data(:,:,trialindx+1);
           else
+          error_status = 254;
+          gdat_data.status = error_status;
             return
           end
         end
@@ -2629,11 +2812,21 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     elseif ~isfield(gdat_data.gdat_params,'time_out')
       gdat_data.gdat_params.time_out = [];
     end
+    if mod(gdat_data.status_mds,2) == 0
+      error_status = 255;
+    else
+      error_status = 0;
+    end
+    gdat_data.status = error_status;
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'powers'}
     % note: same time array for all main, ec, ohm, nbi, ...
     % At this stage fill just ech, later add nbi
+    gdat_data.help = '';
+    gdat_data.status_mds = 2;
+    error_status = 1;
+    gdat_data.status = error_status;
     sources_avail = {'ohm','ec','nbi1','nbi2','dnbi','rad'}; % note should allow ech, nbh, ohmic in parameter sources
     % create empty structures for all, so in return one always have same substructres
     for i=1:length(sources_avail)
@@ -2655,12 +2848,16 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
           if (gdat_params.nverbose>=1)
             warning(['source= ' gdat_data.gdat_params.source ' is not part of the available sources: ' sprintf('''%s'' ',sources_avail{:})]);
           end
+          error_status = 261;
+          gdat_data.status = error_status;
           return
         else
           gdat_data.gdat_params.source = {gdat_data.gdat_params.source};
         end
       else
         if (gdat_params.nverbose>=1); warning([' source parameter not compatible with: ' sprintf('''%s'' ',sources_avail{:})]); end
+        error_status = 262;
+        gdat_data.status = error_status;
         return
       end
     else
@@ -2678,7 +2875,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     % thus should take it from conf if present
     mdsopen(shot);
     ptot_ohm = tdi('\results::conf:ptot_ohm');
-    if ~isempty(ptot_ohm.data) && ~ischar(ptot_ohm.data) && ~isempty(ptot_ohm.dim) && any(~isnan(ptot_ohm.data))
+    gdat_data.ohm.help = ptot_ohm.help;
+    gdat_data.ohm.status_mds = ptot_ohm.status;
+    gdat_data.ohm.status = 1 - mod(gdat_data.ohm.status_mds,2);
+    if mod(gdat_data.ohm.status_mds,2) == 1
       gdat_data.ohm.data = ptot_ohm.data;
       gdat_data.ohm.t = ptot_ohm.dim{1};
       gdat_data.ohm.dim = ptot_ohm.dim;
@@ -2720,7 +2920,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       % EC
       nodenameeff='\results::toray.input:p_gyro';
       tracetdi=tdi(nodenameeff);
-      if isempty(tracetdi.data) || isempty(tracetdi.dim) || ischar(tracetdi.data)
+      gdat_data.ec.help = tracetdi.help;
+      gdat_data.ec.status_mds = tracetdi.status;
+      gdat_data.ec.status = 1 - mod(gdat_data.ec.status_mds,2);
+      if mod(gdat_data.ec.status_mds,2) == 0
         if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end
       else
         ij=[~isfinite(tracetdi.data)]; tracetdi.data(ij)=0.;
@@ -2746,7 +2949,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         nodenameeff = '\results::NBH:POWR_TCV';
       end
       nbh_data_tdi = tdi(nodenameeff);
-      if ~isempty(nbh_data_tdi.data) && ~ischar(nbh_data_tdi.data) && ~isempty(nbh_data_tdi.dim)
+      gdat_data.nbi1.help = nbh_data_tdi.help;
+      gdat_data.nbi1.status_mds = nbh_data_tdi.status;
+      gdat_data.nbi1.status = 1 - mod(gdat_data.nbi1.status_mds,2);
+      if mod(gdat_data.nbi1.status_mds,2) == 1
         nbi_neutral_power_tot = nbh_data_tdi.data.*1e6; % in W
         ij = nbi_neutral_power_tot<100;
         nbi_neutral_power_tot(ij) = 0.;
@@ -2791,7 +2997,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       nodenameeff='\results::bolo_u:prad';
       if shot< 71076, nodenameeff='\results::bolo:prad:total'; end
       tracetdi=tdi(nodenameeff);
-      if isempty(tracetdi.data) || isempty(tracetdi.dim) || ischar(tracetdi.data)
+      gdat_data.rad.help = tracetdi.help;
+      gdat_data.rad.status_mds = tracetdi.status;
+      gdat_data.rad.status = 1 - mod(gdat_data.rad.status_mds,2);
+      if mod(gdat_data.rad.status_mds,2) == 0
         if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end
       else
         gdat_data.rad.data = tracetdi.data*1e3; % at this stage bolo is in kW'
@@ -2814,7 +3023,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       % NB2
       nodenameeff = '\results::NB2:POWR_TCV';
       nb2_data_tdi = tdi(nodenameeff);
-      if ~isempty(nb2_data_tdi.dim) && ~ischar(nb2_data_tdi.data) && ~isempty(nb2_data_tdi.dim)
+      gdat_data.nbi2.help = nb2_data_tdi.help;
+      gdat_data.nbi2.status_mds = nb2_data_tdi.status;
+      gdat_data.nbi2.status = 1 - mod(gdat_data.nbi2.status_mds,2);
+      if mod(gdat_data.nbi2.status_mds,2) == 1
         nbi_neutral_power_tot = nb2_data_tdi.data.*1e6; % in W
         ij = nbi_neutral_power_tot<100;
         nbi_neutral_power_tot(ij) = 0.;
@@ -2854,7 +3066,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       % NB2
       nodenameeff = '\RESULTS::DNBI:POWR_TCV';
       nb2_data_tdi = tdi(nodenameeff);
-      if ~isempty(nb2_data_tdi.data) && ~ischar(nb2_data_tdi.data) && ~isempty(nb2_data_tdi.dim)
+      gdat_data.dnbi.help = nb2_data_tdi.help;
+      gdat_data.dnbi.status_mds = nb2_data_tdi.status;
+      gdat_data.dnbi.status = 1 - mod(gdat_data.dnbi.status_mds,2);
+      if mod(gdat_data.dnbi.status_mds,2) == 1
         nbi_neutral_power_tot = nb2_data_tdi.data.*1e6; % in W
         ij = nbi_neutral_power_tot<100;
         nbi_neutral_power_tot(ij) = 0.;
@@ -2900,6 +3115,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     elseif ~isfield(gdat_data.gdat_params,'time_out')
       gdat_data.gdat_params.time_out = [];
     end
+    gdat_data.status_mds = 1;
+    error_status = 0;
+    gdat_data.status = error_status;
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'q_rho'}
@@ -2913,6 +3131,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       nodenameeff=[begstr 'q_psi' substr_liuqe];
     end
     tracetdi=tdi(nodenameeff);
+    gdat_data.help = tracetdi.help;
+    gdat_data.status_mds = tracetdi.status;
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
     if liuqe_matlab==1 && liuqe_version_eff==-1
       % may have problems with dim{1} being indices instead of rhopol
       if max(tracetdi.dim{1}) > 2
@@ -2923,9 +3144,11 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         end
       end
     end
-    if isempty(tracetdi.data) || isempty(tracetdi.dim)  % || ischar(tracetdi.data) (to add?)
+    if mod(gdat_data.status_mds,2) == 0
       if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end
       if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end
+      error_status = 271;
+      gdat_data.status = error_status;
       return
     end
     gdat_data.data = tracetdi.data;
@@ -2955,18 +3178,28 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     % R*Bphi(rho,t) from F from FFprime
     if liuqe_matlab==0
       fprintf('\n***** not yet implemented for liuqe fortran ******\n');
+      error_status = 281;
+      gdat_data.status = error_status;
       return
     else
       nodenameeff=['tcv_eq("rbtor_rho","' psitbx_str '")'];
     end
     if liuqe_version_eff==-1
       disp('not yet implemented for fbte')
+      error_status = 282;
+      gdat_data.status = error_status;
       return
     end
     tracetdi=tdi(nodenameeff);
-    if isempty(tracetdi.data) || isempty(tracetdi.dim)  % || ischar(tracetdi.data) (to add?)
+    gdat_data.help = tracetdi.help;
+    gdat_data.status_mds = tracetdi.status;
+    error_status = 0;
+    gdat_data.status = error_status;
+    if mod(gdat_data.status_mds,2) == 0
       if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end
       if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end
+      error_status = 283;
+      gdat_data.status = error_status;
       return
     end
     gdat_data.data = tracetdi.data;
@@ -2991,6 +3224,7 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     elseif ~isfield(gdat_data.gdat_params,'time_out')
       gdat_data.gdat_params.time_out = [];
     end
+
    case {'phi_tor', 'phitor', 'toroidal_flux'}
     % Phi(LCFS) = int(Bphi dSphi), can use Eq.(11) of "Tokamak coordinate conventions: COCOS" paper:
     % O. Sauter, S.Yu. Medvedev, Comput. Phys. Commun. 184 (2013) 293???302
@@ -2998,14 +3232,18 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     % q = -dPhi/dpsi => Phi = - int(q*dpsi) which should always have the sign of B0
     % need to get q_rho but to avoid loop for rhotor in grids_1d, get q_rho explicitely here
     params_eff = gdat_data.gdat_params;
+    gdat_data.status_mds = 2;
+    error_status = 1;
+    gdat_data.status = error_status;
     if liuqe_matlab==1
       nodenameeff = ['tcv_eq("tor_flux_tot","' psitbx_str '")'];
       phi_tor = tdi(nodenameeff);
     else
       phi_tor.data = [];
       phi_tor.units = 'Wb';
+      phi_tor.status = 2;
     end
-    if ~any(any(isfinite(phi_tor.data))) || ischar(phi_tor.data)
+    if mod(phi_tor.status,2) == 0
       % no phi_tor, compute it from q profile
       q_rho = tdi(['tcv_eq("' liuqefortran2liuqematlab('q',1,liuqe_matlab) '","' psitbx_str '")']);
       if liuqe_matlab==0
@@ -3013,6 +3251,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       end
       phi_tor.dim = q_rho.dim;
       phi_tor.dimunits = q_rho.dimunits;
+      phi_tor.help = q_rho.help;
+      phi_tor.status = q_rho.status;
       params_eff.data_request='psi_axis'; % psi_edge=0 with LIUQE
       psi_axis=gdat_tcv(shot,params_eff);
       if isnumeric(q_rho.data)
@@ -3044,11 +3284,15 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       % assume same dimensions, check. Note data dims can be different from dim{} when there is a problem with liuqe run
       if numel(phi_tor.data) ~= numel(q_rho.data) || numel(psi_axis.data) ~= numel(phi_tor.dim{2})
         warning(['problems in gdat_tcv with ' data_request_eff ' with unexpected dimensions'])
+        error_status =291;
+        gdat_data.status = error_status;
         return;
       end
       % check time sizes since can happen problems with old liuqe runs
       if size(q_rho.data,2) ~= size(phi_tor.data,2)
         warning(['time sizes between q_rho and phi_tor do not match: ' num2str(size(q_rho.data,2)) ' and ' num2str(size(phi_tor.data,2))]);
+        error_status =292;
+        gdat_data.status = error_status;
         return
       end
       if size(q_rho.data,2) ~= length(psi_axis.data)
@@ -3061,10 +3305,14 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
                  num2str(length(psi_axis.data))]);
         disp('WARNING: should have been caught, so probably q_rho.dim not the same as data(:,:) dims')
         disp('should run: >> liuqe_default_run_sequence(shot)')
+        error_status =293;
+        gdat_data.status = error_status;
         return
       end
       if size(q_rho.data,1) ~= size(phi_tor.data,1)
         warning(['radial sizes between q_rho and phi_tor do not match: ' num2str(size(q_rho.data,1)) ' and ' num2str(size(phi_tor.data,1))]);
+        error_status = 294;
+        gdat_data.status = error_status;
         return
       end
       for it=1:size(q_rho.data,2)
@@ -3086,6 +3334,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     gdat_data.dim = phi_tor.dim;
     gdat_data.dimunits = phi_tor.dimunits;
     gdat_data.units = phi_tor.units;
+    gdat_data.help = phi_tor.help;
+    gdat_data.status_mds = phi_tor.status;
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+    error_status = gdat_data.status;
     if (length(gdat_data.dim)>=mapping_for_tcv.gdat_timedim); gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim}; end
     if (length(gdat_data.dim)>0); gdat_data.x = gdat_data.dim{1}; end
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
@@ -3118,11 +3370,15 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     gdat_data.dimunits = tracetdi.dimunits;
     gdat_data.units = tracetdi.units;
     gdat_data.request_description = 'pprime=dp/dpsi';
+    gdat_data.help = tracetdi.help;
+    gdat_data.status_mds = tracetdi.status;
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
       [gdat_data] = gdat2time_out(gdat_data,1);
     elseif ~isfield(gdat_data.gdat_params,'time_out')
       gdat_data.gdat_params.time_out = [];
     end
+
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'pressure', 'pressure_rho', 'p_rho'}
     if liuqe_matlab==0
       nodenameeff = ['tcv_eq("' liuqefortran2liuqematlab('p_rho',1,0) '","' psitbx_str '")'];
@@ -3145,6 +3401,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     gdat_data.dimunits = tracetdi.dimunits;
     gdat_data.units = tracetdi.units;
     gdat_data.request_description = 'pressure';
+    gdat_data.help = tracetdi.help;
+    gdat_data.status_mds = tracetdi.status;
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+    error_status = gdat_data.status;
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
       [gdat_data] = gdat2time_out(gdat_data,1);
     elseif ~isfield(gdat_data.gdat_params,'time_out')
@@ -3156,37 +3416,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     % psi at edge, 0 by construction in Liuqe, thus not given
     % add surface_psi from surface_flux and d(surface_flux)/dt = vloop
     warning('now psi_edge expression in tcv_requests_mapping, so should not come here')
-    keyboard
-    nodenameeff=['\results::psi_axis' substr_liuqe];
-    if liuqe_version_eff==-1
-      nodenameeff=[begstr 'q_psi' substr_liuqe];
-    end
-    tracetdi=tdi(nodenameeff);
-    if isempty(tracetdi.data) || isempty(tracetdi.dim) || ~any(isfinite(tracetdi.data)) % || ischar(tracetdi.data) (to add?)
-      if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end
-      if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end
-      return
-    end
-    gdat_data.data = tracetdi.data.*0;
-    gdat_data.dim = tracetdi.dim;
-    gdat_data.t = gdat_data.dim{1};
-    gdat_data.data_fullpath=[' zero '];
-    gdat_data.dimunits = tracetdi.dimunits;
-    gdat_data.units = tracetdi.units;
-    gdat_data.request_description = '0 since LIUQE construct psi to be zero at LCFS';
-    %
-    params_eff.data_request='\results::surface_flux';
-    surface_psi=gdat_tcv([],params_eff);
-    ij=[isfinite(surface_psi.data)];
-    [aa,vsurf] = interpos(63,surface_psi.t(ij),surface_psi.data(ij),-3);
-    gdat_data.surface_psi = surface_psi.data;
-    gdat_data.vsurf = vsurf;
-    gdat_data.vsurf_description = ['time derivative from surface_psi, obtained from \results::surface_flux'];
-    if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
-      [gdat_data] = gdat2time_out(gdat_data,1);
-    elseif ~isfield(gdat_data.gdat_params,'time_out')
-      gdat_data.gdat_params.time_out = [];
-    end
+    gdat_data.status_mds = 2;
+    gdat_data.status = -1;
+    error_status = gdat_data.status;
+    return
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'r_contour_edge', 'z_contour_edge'}
@@ -3206,6 +3439,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     gdat_data.data_fullpath=nodenameeff;
     gdat_data.dimunits = tracetdi.dimunits;
     gdat_data.units = tracetdi.units;
+    gdat_data.help = tracetdi.help;
+    gdat_data.status_mds = tracetdi.status;
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+    error_status = gdat_data.status;
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
       [gdat_data] = gdat2time_out(gdat_data,1);
     elseif ~isfield(gdat_data.gdat_params,'time_out')
@@ -3220,6 +3457,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     % q = -dPhi/dpsi => Phi = - int(q*dpsi) which should always have the sign of B0
     % need to get q_rho but to avoid loop for rhotor in grids_1d, get q_rho explicitely here
     params_eff = gdat_data.gdat_params;
+    gdat_data.status_mds = 2;
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+    error_status = gdat_data.status;
     if liuqe_matlab==0
       nodenameeff=['tcv_eq("q_psi","' psitbx_str '")'];
       if liuqe_version_eff==-1
@@ -3229,6 +3469,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       if isempty(q_rho.data) || isempty(q_rho.dim) % || ischar(q_rho.data) (to add?)
         if (gdat_params.nverbose>=1); warning(['problems loading data for q_rho for data_request= ' data_request_eff]); end
         if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end
+        error_status = 301;
+        gdat_data.status = error_status;
         return
       end
       rhopol_eff = ones(size(q_rho.dim{1}));
@@ -3241,6 +3483,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       b0tpsi = interpos_nan(21,b0.t,b0.data,psi_axis.t); %q_rho on same time base as psi_axis
       if isempty(psi_axis.data) || isempty(psi_axis.dim) || isempty(q_rho.data) || isempty(q_rho.dim)
         if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end
+        error_status = 302;
+        gdat_data.status = error_status;
         return
       end
       rhoequal = linspace(0,1,length(q_rho.dim{1}));
@@ -3282,6 +3526,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       gdat_data.psi_axis = reshape(psi_axis.data,length(psi_axis.data),1);
       if length(gdat_data.psi_axis) ~= length(gdat_data.t)
         disp('problems of time between qrho and psi_axis?')
+        error_status = 303;
+        gdat_data.status = error_status;
         return
       end
       gdat_data.b0 = b0tpsi;
@@ -3302,6 +3548,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
           gdat_data.data(:,it) = dataeff;
         else
           disp(['problem in gdat_tcv rhotor with unknown data_request_eff = ' data_request_eff]);
+          error_status = 304;
+          gdat_data.status = error_status;
           return
         end
       end
@@ -3314,6 +3562,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       params_eff.data_request='b0';
       b0=gdat_tcv([],params_eff);
       gdat_data.t = phi_tor.t;
+      gdat_data.help = phi_tor.help;
+      gdat_data.status_mds = phi_tor.status_mds;
       ij=find(isfinite(b0.data));
       if length(gdat_data.t) > 0
         gdat_data.b0 = interpos(b0.t(ij),b0.data(ij),gdat_data.t);
@@ -3341,6 +3591,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
           gdat_data.data_fullpath=['rhotor=sqrt(Phi/pi/B0) from phi_tor'];
         else
           disp(['data_request_eff = ' data_request_eff ' not defined within rhotor block in gdat_tcv.m']);
+          error_status = 305;
+          gdat_data.status = error_status;
           return
         end
       else
@@ -3348,6 +3600,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         gdat_data.rhotor_edge = [];
       end
     end
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+    error_status = gdat_data.status;
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
       % nothing to do since above uses gdat call getting reduced time already
     end
@@ -3360,7 +3614,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     if liuqe_matlab==0
       nodenameeff=['\results::psitbx:vol'];
       if liuqe_version_eff > 1
-        disp('needs to construct volume');
+        disp('needs liuqe_version_eff > 1 to construct volume');
+        error_status = 311;
+        gdat_data.status = error_status;
         return
       end
     else
@@ -3383,7 +3639,11 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         end
       end
     end
-    if isempty(tracetdi.data) || isempty(tracetdi.dim) || ischar(tracetdi.data)
+    gdat_data.help = tracetdi.help;
+    gdat_data.status_mds = tracetdi.status;
+    if mod(gdat_data.status_mds,2) == 0
+      error_status = 312;
+      gdat_data.status = error_status;
       return
     end
     gdat_data.units = tracetdi.units;
@@ -3420,10 +3680,14 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         if (gdat_params.nverbose>=1)
           disp(['should not be here in vol cases with data_request = ' data_request_eff]);
         end
+        error_status = 313;
+        gdat_data.status = error_status;
         return
       end
     end
     gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim};
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+    error_status = gdat_data.status;
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
       [gdat_data] = gdat2time_out(gdat_data,1,{'volume_edge'});
     elseif ~isfield(gdat_data.gdat_params,'time_out')
@@ -3447,6 +3711,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     % If the rtccode/tools not in paths use sauter's link
     % need: get_scd_mems.m
     %
+    gdat_data.help = '';
+    gdat_data.status_mds = 2;
     aaa=which('get_scd_mems');
     if isempty(aaa)
       error('no path for get_scd_mems')
@@ -3460,16 +3726,20 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         end
       end
       gdat_data.data_fullpath = sprintf('used %s with patterns specified in source gdat_params',aaa);
+      gdat_data.status_mds = 1;
     catch
       % to make sure close and disconnect even if error, since connects to scd
     end
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+    error_status = gdat_data.status;
     mdsclose;
-    mdsdisconnect;
-
+    mdsdisconnect; % because connected to rtc/scd
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'sxr', 'mpx', 'radcam'}
 
+    gdat_data.help = '';
+    gdat_data.status_mds = 2;
     if any(contains(data_request_eff,{'mpx','radcam'}))
       % effective source chosen through parameter 'source' within 'sxr'
       gdat_data.gdat_params.source = data_request_eff;
@@ -3485,6 +3755,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       if gdat_data.gdat_params.nverbose>=1
         warning(['source = ' gdat_data.gdat_params.source ' not expected with data_request= ' data_request_eff])
       end
+      error_status = 321;
+      gdat_data.status = error_status;
       return
     end
     % time_out: times at which to provide output data, if 2 values provided, return all values within that time interval
@@ -3656,8 +3928,13 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         gdat_data.(gdat_data.gdat_params.camera{i}).label = sprintf('radcam %s nb chords: %d', ...
           gdat_data.gdat_params.camera{i},numel(gdat_data.(gdat_data.gdat_params.camera{i}).x));
       end
+      gdat_data.status_mds = 1;
+      gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+      error_status = gdat_data.status;
 
      case {'mpx', 'dmpx'}
+      gdat_data.help = '';
+      gdat_data.status_mds = 2;
       gdat_data.gdat_params.source = 'mpx';
       if ~isfield(gdat_data.gdat_params,'camera') || isempty(gdat_data.gdat_params.camera)
         gdat_data.gdat_params.camera = 'top';
@@ -3668,6 +3945,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         if gdat_data.gdat_params.nverbose>=3
           disp(['liuqe_version = ' liuqe_version ' not supported for data_request= ' data_request_eff]);
         end
+        error_status = 331;
+        gdat_data.status = error_status;
         return
       end
       t_int = [0 10]; % starts from 0 otherwise mpxdata gives data from t<0
@@ -3685,6 +3964,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         if gdat_data.gdat_params.nverbose>=1
           warning('problem with mpxdata')
         end
+        error_status = 332;
+        gdat_data.status = error_status;
         return
       end
       gdat_data.units = {'au'}; % not known at this stage
@@ -3719,8 +4000,13 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
                     char(10) gdat_data.data_fullpath];
         gdat_data.x = gdat_data.dim{1};
       end
+      gdat_data.status_mds = 1;
+      gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+      error_status = gdat_data.status;
 
      case 'xtomo'
+      gdat_data.help = '';
+      gdat_data.status_mds = 2;
       % so far allow string and array as 'camera' choices:
       % camera = [] (default, thus get XTOMOGetData defaults), 'central', [3 6] (camera numbers)
       camera_xtomo = [];
@@ -3757,6 +4043,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         if gdat_data.gdat_params.nverbose>=1
           warning('problem with XTOMOGetData, no data')
         end
+        error_status = 341;
+        gdat_data.status = error_status;
         return
       end
       gdat_data.t = t;
@@ -3777,17 +4065,25 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         gdat_data.dimunits = {'chords where floor(dim{1}/10) gives camera nb and mod(dim{1},10) chord nb'; 's'};
       end
       gdat_data.dim = {gdat_data.x; gdat_data.t};
+      gdat_data.status_mds = 1;
+      gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+      error_status = gdat_data.status;
 
      otherwise
       if gdat_data.gdat_params.nverbose>=1
         warning(['camera = ' gdat_data.gdat_params.camera ' not expected with data_request= ' data_request_eff])
       end
+      gdat_data.status_mds = 2;
+      error_status = 351;
+      gdat_data.status = error_status;
       return
 
     end
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'transp'}
+    gdat_data.help = '';
+    gdat_data.status_mds = 2;
     % read transp netcdf output file provided in source parameter and generate substructure with all variables
     if ~isfield(gdat_data.gdat_params,'source') || isempty(gdat_data.gdat_params.source) || ~exist(gdat_data.gdat_params.source,'file')
       warning([char(10) 'requires a netcdf file in ''source'' parameter' char(10)])
@@ -3815,6 +4111,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     end
     gdat_data.data_fullpath = ['.transp structure obtained from cdf2mat(gdat_data.gdat_params.source)'];
     gdat_data.help='Can use transp_gui(gdat_data.transp) to browse and plot';
+    gdat_data.status_mds = 1;
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+    error_status = gdat_data.status;
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'ttprime', 'ttprime_rho'}
@@ -3839,11 +4138,15 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     gdat_data.dimunits = tracetdi.dimunits;
     gdat_data.units = tracetdi.units;
     gdat_data.request_description = 'ttprime=t*dt/dpsi';
+    gdat_data.help = tracetdi.help;
+    gdat_data.status_mds = tracetdi.status;
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
       [gdat_data] = gdat2time_out(gdat_data,1);
     elseif ~isfield(gdat_data.gdat_params,'time_out')
       gdat_data.gdat_params.time_out = [];
     end
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+    error_status = gdat_data.status;
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'profnerho','profterho'}
@@ -3902,16 +4205,22 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     elseif ~isfield(gdat_data.gdat_params,'time_out')
       gdat_data.gdat_params.time_out = [];
     end
+    gdat_data.help = tracetdi.help;
+    gdat_data.status_mds = tracetdi.status;
+    gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+    error_status = gdat_data.status;
 
    otherwise
     if (gdat_params.nverbose>=1); warning(['switchcase= ' data_request_eff ' not known in gdat_tcv']); end
-    error_status=901;
+    error_status = 901;
+    gdat_data.status = error_status;
     return
   end
 
 else
   if (gdat_params.nverbose>=1); warning(['TCV method=' mapping_for_tcv.method ' not known yet, contact Olivier.Sauter@epfl.ch']); end
   error_status=602;
+  gdat_data.status = error_status;
   return
 end
 
@@ -3921,6 +4230,7 @@ gdat_data.gdat_params.help = tcv_help_parameters(fieldnames(gdat_data.gdat_param
 gdat_data.mapping_for.tcv = mapping_for_tcv;
 gdat_params = gdat_data.gdat_params;
 error_status=0;
+gdat_data.status = error_status;
 
 return
 
@@ -4000,8 +4310,12 @@ end
 %
 try
   time=mdsdata('\results::thomson:times');
+  gdat_data.status_mds = 1;
 catch
   gdat_data.error_bar = [];
+  gdat_data.status_mds = 2;
+  error_status = 1001;
+  gdat_data.status = error_status;
   if strcmp(data_request_eff(1:2),'ne')
     tracefirrat_data = [];
     gdat_data.firrat=tracefirrat_data;
@@ -4020,6 +4334,8 @@ if isempty(time) || ischar(time)
     warning('!!!!!!!!!!!!!!!!!!!!!!!!!\results::thomson:times  is empty? Check')
     disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' data_request_eff])
   end
+  error_status = 1002;
+  gdat_data.status = error_status;
   return
 end
 
@@ -4042,12 +4358,16 @@ for is = 1:nsys
     otherwise
       warning('Unrecognised thomson scattering system name: %s',systems{is});
       disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' data_request_eff])
+      error_status = 1003;
+      gdat_data.status = error_status;
       return
   end
 
   nodenameeff = ['\results::thomson' edge_str ':' data_request_eff(1:2)];
   tracetdi=tdi(nodenameeff);
-  if isempty(tracetdi.data) || ischar(tracetdi.data) || isempty(tracetdi.dim)
+  data_tmp(is).help = tracetdi.help;
+  data_tmp(is).status_mds = tracetdi.status;
+  if mod(data_tmp(is).status_mds,2) == 0
     data_tmp(is).data = [];
     data_tmp(is).error_bar = [];
     data_tmp(is).data_fullpath = '';
@@ -4108,6 +4428,8 @@ if strcmp(data_request_eff(1:2),'ne')
     disp('***********************************************************************')
   end
 end
+gdat_data.status = 1 - mod(gdat_data.status_mds,2);
+error_status = gdat_data.status;
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 function [psiscatvol,psi_max] = get_thomson_psiscatvol(shot,systems,substr_liuqe,nverbose)
diff --git a/matlab/gdat.m b/matlab/gdat.m
index 99271c743677156ce27598a06bda6a42cf7e88a1..7a0458e83ee0020fa93af549af5442954a46faba 100644
--- a/matlab/gdat.m
+++ b/matlab/gdat.m
@@ -206,6 +206,14 @@ try
     % needed since some substructure have machine name like mapping_for
     gdat_data.gdat_params.machine = lower(gdat_data.gdat_params.machine);
   end
+  if ~isfield(gdat_data,'status')
+    if exist('error_status','var')
+      gdat_data.status = error_status;
+    else
+      error_status = 0;
+      gdat_data.status = error_status;
+    end
+  end
 
 catch ME_gdat
   warning(['problems calling gdat_' lower(machine_eff)]);
diff --git a/matlab/tests/test_tcv_get_ids.m b/matlab/tests/test_tcv_get_ids.m
index 110f1dbeb5fa712aab98bec4ae71fc69469e1c05..a187d5f8ee377294765eef927af42fd8ad94a197 100644
--- a/matlab/tests/test_tcv_get_ids.m
+++ b/matlab/tests/test_tcv_get_ids.m
@@ -12,7 +12,8 @@ classdef (TestTags={'tcv_imas'},SharedTestFixtures={...
 
   methods(Test)
     function test_get_ids_list(testCase,shot)
-      gg = testCase.assertWarning(@() gdat(shot,'ids'),'gdat:EmptyIDSName');
+      gg = gdat(shot,'ids');
+      testCase.assertTrue(gg.status~=0);
 
       testCase.assertTrue(iscell(gg.gdat_params.sources_available));
     end