diff --git a/matlab/TCV/gdat_tcv.m b/matlab/TCV/gdat_tcv.m
index deae6b52e1482d482299c7737f3818a3fc2ad9cc..a6118f64c65737d25943d7f4ca4bed810cb82bea 100644
--- a/matlab/TCV/gdat_tcv.m
+++ b/matlab/TCV/gdat_tcv.m
@@ -1740,7 +1740,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
           gdat_data.ec.ec_data = ec_data;
           filled_successfully = true; %set flag to true
         catch ME
-          warning(ME.identifier,'Problem retrieving TORAY data. \nError message: %s',ME.message);
+          warning('Problem retrieving TORAY data. \nError message: %s',ME.message);
+          getReport(ME) % without ; to get output
           % try to identify cause of the error
           if ~check_nodes_filled(shot,'toray')
             if ~any(ec_inputs.launchers_active.data,1)
@@ -3308,17 +3309,20 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
 
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-   case {'sxr', 'mpx'}
+   case {'sxr', 'mpx', 'radcam'}
 
-    if strcmp(data_request_eff,'mpx')
-      data_request_eff = 'mpx'; % mpx chosen through parameter 'source' within 'sxr'
-      gdat_data.data_request = data_request_eff;
-      gdat_data.gdat_params.source = 'mpx';
+    if any(contains(data_request_eff,{'mpx','radcam'}))
+      % effective source chosen through parameter 'source' within 'sxr'
+      gdat_data.gdat_params.source = data_request_eff;
     end
     % sxr from dmpx by default or xtomo if 'camera','xtomo' is provided
     if ~isfield(gdat_data.gdat_params,'source') || isempty(gdat_data.gdat_params.source)
-      gdat_data.gdat_params.source = 'mpx';
-    elseif ~strcmp(lower(gdat_data.gdat_params.source),'xtomo') && ~strcmp(lower(gdat_data.gdat_params.source),'mpx')
+      if shot < 70144
+        gdat_data.gdat_params.source = 'mpx';
+      else
+        gdat_data.gdat_params.source = 'radcam';
+      end
+    elseif ~any(contains(lower(gdat_data.gdat_params.source),{'xtomo','mpx','radcam'}))
       if gdat_data.gdat_params.nverbose>=1
         warning(['source = ' gdat_data.gdat_params.source ' not expected with data_request= ' data_request_eff])
       end
@@ -3339,10 +3343,125 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
                  num2str(time_interval(1)) ',' num2str(time_interval(2)) ']' char(10)])
       end
     end
+    % at this stage 2 option for freq, raw data (fast, default), 10kHz or similar (slow)
+    freq_opt = 1;
     if ~isfield(gdat_data.gdat_params,'freq')
-      gdat_data.gdat_params.freq = 'slow';
+      gdat_data.gdat_params.freq = 'fast';
+    end
+    if strcmp(gdat_data.gdat_params.freq,'slow'); freq_opt = 0; end
+    % fit_tension for smoothing on slow timescale (radcam for example)
+    if ~isfield(gdat_data.gdat_params,'fit_tension') || isempty(gdat_data.gdat_params.fit_tension)
+      gdat_data.gdat_params.fit_tension = -1e2;
     end
     switch lower(gdat_data.gdat_params.source)
+     case {'radcam'}
+      gdat_data.gdat_params.source = 'radcam';
+      gdat_data.camera_list  = {'top', 'upper','equatorial','bottom'};
+      gdat_data.channel_list = {[1:20],[21:40],[41:80],     [81:100]};
+      if ~isfield(gdat_data.gdat_params,'camera') || isempty(gdat_data.gdat_params.camera)
+        gdat_data.gdat_params.camera = {'equatorial'}; % default equatorial
+        disp(['loads all radcam cameras, each data also in subfield ' gdat_data.gdat_params.camera])
+      else
+        if ischar(gdat_data.gdat_params.camera) || (isstring(gdat_data.gdat_params.camera) && numel(gdat_data.gdat_params.camera)==1)
+          gdat_data.gdat_params.camera = {char(gdat_data.gdat_params.camera)};
+        end
+        if isnumeric(gdat_data.gdat_params.camera) && (min(gdat_data.gdat_params.camera)<5 && max(gdat_data.gdat_params.camera)>0)
+          ij = gdat_data.gdat_params.camera([gdat_data.gdat_params.camera>0 & gdat_data.gdat_params.camera<5]);
+          gdat_data.gdat_params.camera = gdat_data.camera_list(ij);
+        elseif any(startsWith(gdat_data.gdat_params.camera,gdat_data.camera_list).*endsWith(gdat_data.gdat_params.camera,gdat_data.camera_list))
+          ij = startsWith(gdat_data.gdat_params.camera,gdat_data.camera_list).*endsWith(gdat_data.gdat_params.camera,gdat_data.camera_list);
+          gdat_data.gdat_params.camera = lower(gdat_data.gdat_params.camera(ij>0));
+          if any(ij==0)
+            warning(['camera not defined: ' gdat_data.gdat_params.camera(ij==0)]);
+            disp(['list of cameras: ' gdat_data.camera_list])
+          end
+        else
+          error(['camera: ' gdat_data.gdat_params.camera ' not in list: ' gdat_data.camera_list])
+        end
+      end
+      if ~isfield(gdat_data.gdat_params,'channel') || isempty(gdat_data.gdat_params.channel)
+        for i=1:numel(gdat_data.gdat_params.camera)
+          gdat_data.gdat_params.(gdat_data.gdat_params.camera{i}).channel = ...
+              gdat_data.channel_list{[contains(gdat_data.camera_list,gdat_data.gdat_params.camera{i})]};
+          gdat_data.gdat_params.channel{i} = gdat_data.gdat_params.(gdat_data.gdat_params.camera{i}).channel;
+        end
+      else
+        if isnumeric(gdat_data.gdat_params.channel)
+          gdat_data.gdat_params.channel = {gdat_data.gdat_params.channel};
+        end
+        if numel(gdat_data.gdat_params.camera) ~= numel(gdat_data.gdat_params.channel)
+          gdat_data.gdat_params
+          error('expects same number of camera as number of channel group in each cell list')
+        end
+        all_channels = [];
+        for i=1:numel(gdat_data.gdat_params.camera)
+          all_channels(end+1:end+numel(gdat_data.gdat_params.channel{i})) = gdat_data.gdat_params.channel{i};
+        end
+        % check camera and channel chosen are consistent within camera interval, just redistribute
+        icount = 0;
+        for i=1:numel(gdat_data.camera_list)
+          ij = intersect(gdat_data.channel_list{i},all_channels);
+          if ~isempty(ij)
+            icount = icount + 1;
+            camera{icount} = gdat_data.camera_list{i};
+            channel{icount} = ij;
+          end
+        end
+        if ~isequal(sort(camera),sort(gdat_data.gdat_params.camera))
+          disp('***************************************************************************')
+          warning(sprintf('channel nbs and camera did not match, camera chosen adapted: %s %s %s %s',camera{:}));
+          disp('***************************************************************************')
+          gdat_data.gdat_params.camera = camera;
+        end
+        if ~isequal(sort(cell2mat(channel)),sort(cell2mat(gdat_data.gdat_params.channel))) || ...
+            numel(gdat_data.gdat_params.channel) ~= numel(channel)
+          warning(sprintf('channel nbs and channel did not match, channel chosen adapted'));
+          gdat_data.gdat_params.channel = channel;
+        end
+        for i=1:numel(gdat_data.gdat_params.camera)
+          gdat_data.gdat_params.(gdat_data.gdat_params.camera{i}).channel = gdat_data.gdat_params.channel{i};
+        end
+      end
+      gdat_data.x = [];
+      for i=1:numel(gdat_data.gdat_params.camera)
+        gdat_data.(gdat_data.gdat_params.camera{i}).x = gdat_data.gdat_params.(gdat_data.gdat_params.camera{i}).channel;
+        gdat_data.x(end+1:end+numel(gdat_data.(gdat_data.gdat_params.camera{i}).x)) = gdat_data.(gdat_data.gdat_params.camera{i}).x;
+      end
+      sxr = rc_load_diodes(shot,'diag_name',"sxr",'channels',gdat_data.x); % since all cameras with different channel number
+      if freq_opt == 1
+        gdat_data.data = sxr.data';
+        gdat_data.t = sxr.time;
+      else
+        gdat_data.t = linspace(sxr.time(1),sxr.time(end),round((sxr.time(end)-sxr.time(1))/1e-4));
+        for i=1:size(sxr.data,2)
+          gdat_data.data(i,:) = interpos(sxr.time,sxr.data(:,i),gdat_data.t,gdat_data.gdat_params.fit_tension);
+        end
+      end
+      gdat_data.r_x = sxr.geometry.xchord(gdat_data.x,:);
+      gdat_data.z_x = sxr.geometry.ychord(gdat_data.x,:);
+      gdat_data.r_at_z0 = gdat_data.r_x(:,1) + ...
+            diff(gdat_data.r_x(:,:)')' .* (0-gdat_data.z_x(:,1))./(gdat_data.z_x(:,2)-gdat_data.z_x(:,1));
+      gdat_data.z_at_r09 = gdat_data.z_x(:,1) + ...
+            diff(gdat_data.z_x(:,:)')' .* (0.9-gdat_data.r_x(:,1))./(gdat_data.r_x(:,2)-gdat_data.r_x(:,1));
+      gdat_data.good_channels = sxr.good_channels;
+      gdat_data.data_fullpath = ['using  rc_load_diodes(shot,''diag_name'',"sxr",...) with params in gdat_data.gdat_params'];
+      gdat_data.units = 'au';
+      gdat_data.dim = {gdat_data.x, gdat_data.t};
+      gdat_data.dimunits = {'channel', 's'};
+      gdat_data.label = strtrim(sprintf('radcam %s %s %s %s %s',gdat_data.gdat_params.camera{:}));
+      for i=1:numel(gdat_data.gdat_params.camera)
+        ij = iround_os(sxr.channels,gdat_data.(gdat_data.gdat_params.camera{i}).x);
+        gdat_data.(gdat_data.gdat_params.camera{i}).data = gdat_data.data(:,ij)';
+        gdat_data.(gdat_data.gdat_params.camera{i}).t = gdat_data.t;
+        gdat_data.(gdat_data.gdat_params.camera{i}).r_x = sxr.geometry.xchord(gdat_data.(gdat_data.gdat_params.camera{i}).x,:);
+        gdat_data.(gdat_data.gdat_params.camera{i}).z_x = sxr.geometry.ychord(gdat_data.(gdat_data.gdat_params.camera{i}).x,:);
+        gdat_data.(gdat_data.gdat_params.camera{i}).r_at_z0 = gdat_data.r_at_z0(ij);
+        gdat_data.(gdat_data.gdat_params.camera{i}).z_at_r09 = gdat_data.z_at_r09(ij);
+        gdat_data.(gdat_data.gdat_params.camera{i}).good_channels = intersect(gdat_data.(gdat_data.gdat_params.camera{i}).x,sxr.good_channels);
+        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
+
      case {'mpx', 'dmpx'}
       gdat_data.gdat_params.source = 'mpx';
       if ~isfield(gdat_data.gdat_params,'camera') || isempty(gdat_data.gdat_params.camera)
@@ -3356,8 +3475,6 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         end
         return
       end
-      freq_opt = 0;
-      if strcmp(gdat_data.gdat_params.freq,'fast'); freq_opt = 1; end
       t_int = [0 10]; % starts from 0 otherwise mpxdata gives data from t<0
       if ~isempty(time_interval); t_int = time_interval; end
       gdat_data.top.data = [];
@@ -3474,7 +3591,6 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
 
     end
 
-
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'transp'}
     % read transp netcdf output file provided in source parameter and generate substructure with all variables
diff --git a/matlab/TCV/tcv_help_parameters.m b/matlab/TCV/tcv_help_parameters.m
index 2c6c74c0b91bc015c0558a43e33af1c0f98ec3c0..15de8984169996ffdd2c5f1ea0e1b99a310aaa33 100644
--- a/matlab/TCV/tcv_help_parameters.m
+++ b/matlab/TCV/tcv_help_parameters.m
@@ -29,7 +29,8 @@ help_struct_all.cxrs_time_interval = ['cxrs: (time_interval can have several nbs
                     ' as well'];
 help_struct_all.fit_tension = ['smoothing value used in interpos fitting routine, -30 means ''30 times default value'', thus -1 often a' ...
                     ' good value' char(10) ...
-                   'cxrs: if numeric, default for all cases, if structure, default for non given fields'];
+                    'cxrs: if numeric, default for all cases, if structure, default for non given fields' char(10) ...
+                    'radcam: tension for interpos smoothing of data to have lower time samples'];
 help_struct_all.time = 'eqdsk: time(s) value(s) requested, by default time=1.0s (see time_out for other requests)';
 help_struct_all.time_out = ['requested time for output: data points within interval if time_out=[t1 t2], otherwise assumes series of points, uses linear interpolation in that case (default [-Inf Inf])'...
                    char(10) 'for sxr, mpx: only time interval provided in time_out is relevant'];
@@ -56,17 +57,19 @@ help_struct_all.error_bar = sprintf('%s\n','for ids: choice of nodes fill in and
           '''delta'' (default): only upper fill in  with the abs(value) to add or subtract to data to get upper and lower values (symmetric)', ...
           '''delta_with_lower'': same as delta but fill in lower node as well (with delta as well, same as upper)', ...
           '''added'': add the delta values (old cpo style), so upper=data+error_bar and lower=data+error_bar');
-help_struct_all.camera = ['sxr: for MPX: ''central'', ''top'' (default), ''bottom'' or ''both'' ; ' ...
-                    ' for XTOMO: ''central'' (a central chord only), defaults if empty, [1 3 5] if only camera 1, 3 and 5 are desired'];
-help_struct_all.freq = '''slow'', default, lower sampling; ''fast'' full samples for both mpx and xtomo';
+help_struct_all.camera = sprintf('%s\n%s\n%s', ...
+          'sxr: for radcam: 1 to 4 or ''top'' (default), ''upper'', ''equatorial'', ''bottom'' array or cell array ok as well;', ...
+          ' for MPX: ''central'', ''top'' (default), ''bottom'' or ''both'' ;', ...
+          ' for XTOMO: ''central'' (a central chord only), defaults if empty, [1 3 5] if only camera 1, 3 and 5 are desired');
+help_struct_all.channel = sprintf('%s\n%s\n%s', ...
+          'radcam: chord to choose within camera interval, or simply chords, then it is re-distributed to correct camera');
+help_struct_all.freq = '''slow'', default, lower sampling (for radcam smoothing on dt=0.1ms); ''fast'' full samples for radcam, mpx and xtomo';
 help_struct_all.max_adcs = 'rtc: source=''adcs'' maximum nb of adc channels loaded for each board in each active node';
 help_struct_all.nfft = '512 (default) changes time resolution in spectrogram in gdat_plot for ''mhd'' request';
 help_struct_all.map_eqdsk_psirz = 'eqdsk: if time array provided, maps all psi(R,Z,t) on same R,Zmesh in .data (1) or not (0, default)';
 help_struct_all.write = 'eqdsk: write eqdsk while loading data (1, default) or not (0)';
 %help_struct_all. = '';
 
-
-
 if ~exist('parameter_list') || isempty(parameter_list)
   help_struct = help_struct_all;
   return
diff --git a/matlab/TCV/tcv_requests_mapping.m b/matlab/TCV/tcv_requests_mapping.m
index ad1bc170dab3bea172e5cffe6628196f901c8e63..04dcc1f5c8e483714b1882bb15b8e965bb07ed20 100644
--- a/matlab/TCV/tcv_requests_mapping.m
+++ b/matlab/TCV/tcv_requests_mapping.m
@@ -458,7 +458,7 @@ switch lower(data_request)
   mapping.expression = ['params_eff = gdat_data.gdat_params;params_eff.data_request=''tcv_eq("surf","LIUQE.M")'';' ...
                     'gdat_tmp=gdat_tcv(shot,params_eff); gdat_tmp.dim = {gdat_tmp.t}; gdat_tmp.x=[]; gdat_tmp.data= gdat_tmp.data(end,:);' ...
                     'gdat_tmp.dimunits{1}=''s'';gdat_tmp.help=''toroidal surface of LCFS'';'];
- case 'sxr'
+ case {'sxr', 'mpx', 'radcam'}
   mapping.timedim = 1;
   mapping.gdat_timedim = 2;
   mapping.method = 'switchcase';
@@ -583,10 +583,6 @@ switch lower(data_request)
 % $$$   mapping.method = 'tdiliuqe';
 % $$$   % mapping.expression = '\results::thomson:psiscatvol:foo';
 % $$$   mapping.expression = '\results::thomson:psiscatvol';
- case 'mpx'
-  mapping.timedim = 1;
-  mapping.gdat_timedim = 2;
-  mapping.method = 'switchcase';
  case {'profnerho','profterho'}
   mapping.timedim = 1;
   mapping.label = data_request;
diff --git a/matlab/TCV_IMAS/ids2database.m b/matlab/TCV_IMAS/ids2database.m
index 40f83746b8524a2b3f38cf770fcba6147ae7ace2..eb2c2ed7f0275d6700c482f8c6f3a1a4727d2fae 100644
--- a/matlab/TCV_IMAS/ids2database.m
+++ b/matlab/TCV_IMAS/ids2database.m
@@ -1,4 +1,4 @@
-function [ids_put_status] = ids2database(shot,run,occurence,ids2put,tree_user,tree_tokamak,tree_majorversion,varargin);
+function [ids_put_status] = ids2database(shot,run,occurence,ids2put,tree_user,tree_tokamak,tree_majorversion,imas_backend,varargin);
 %
 %   [ids_put_status] = ids2database(shot,run,occurence,ids2put,varargin);
 %
@@ -7,6 +7,7 @@ function [ids_put_status] = ids2database(shot,run,occurence,ids2put,tree_user,tr
 % tree_name: getenv('USER') by default, can be 'public'
 % tree_tokamak: 'tcv' by default
 % tree_majorversion: '3' by default
+% imas_backend: "MDSplus" or "HDF5"
 %
 % varargin{1}: tbd
 %
@@ -16,6 +17,7 @@ ids_put_status = 0;
 tree_user_default = getenv('USER');
 tree_tokamak_default = 'tcv';
 tree_majorversion_default = '3';
+imas_backend_default = 'MDSplus';
 
 % initialize input parser
 p = inputParser;
@@ -28,6 +30,7 @@ p.addOptional('ids2put', struct([]), @(x) (isstruct(x)));
 p.addOptional('tree_user', tree_user_default, @(x) (isempty(x) || ischar(x)));
 p.addOptional('tree_tokamak', tree_tokamak_default, @(x) (isempty(x) || ischar(x)));
 p.addOptional('tree_majorversion', tree_majorversion_default, @(x) (ischar(x)));
+p.addOptional('imas_backend', imas_backend_default, @(x) (isempty(x) || ischar(x)));
 
 p.parse;
 defaults_ids2database = p.Results; % to keep track of defaults
@@ -53,8 +56,11 @@ elseif nargin==6
 elseif nargin==7
   p.parse(shot,run,occurence,ids2put,tree_user,tree_tokamak,tree_majorversion);
   params = p.Results;
-elseif nargin>=8
-  p.parse(shot,run,occurence,ids2put,tree_user,tree_tokamak,tree_majorversion,varargin{:});
+elseif nargin==8
+  p.parse(shot,run,occurence,ids2put,tree_user,tree_tokamak,tree_majorversion,imas_backend);
+  params = p.Results;
+elseif nargin>=9
+  p.parse(shot,run,occurence,ids2put,tree_user,tree_tokamak,tree_majorversion,imas_backend,varargin{:});
   params = p.Results;
 else
   p.parse;
@@ -100,6 +106,19 @@ if isempty(ids_names_ok)
   return
 end
 
+if ~ismember(params_ids2database.imas_backend, {'MDSplus', 'HDF5'})
+    warning(['Unknown imas_backend: ', imas_backend, ', selecting default: ',imas_backend_default]);
+    params_ids2database.imas_backend = imas_backend_default;
+end
+
+% Get IMAS backend ID
+switch params_ids2database.imas_backend
+  case "HDF5"
+    backendid=13;
+  case "MDSplus"
+    backendid=12;
+end
+
 try
   %% Initialize the three
   shot_is_new = 1; % seems only create is ok even if does already exist
@@ -109,10 +128,9 @@ try
     shot_is_new = 0;
   end
   if shot_is_new
-    idx  = imas_create_env('ids',shot,run,0,0,params_ids2database.tree_user,params_ids2database.tree_tokamak, ...
-          params_ids2database.tree_majorversion); %
+    idx = imas_create_env_backend(shot, run, params_ids2database.tree_user,params_ids2database.tree_tokamak, params_ids2database.tree_majorversion, backendid)
   else
-    idx  = imas_open_env('ids',shot,run,params_ids2database.tree_user,params_ids2database.tree_tokamak,params_ids2database.tree_majorversion); %
+    idx  = imas_open_env_backend(shot,run,params_ids2database.tree_user,params_ids2database.tree_tokamak,params_ids2database.tree_majorversion,backendid); %
   end
 
   %% Put the field
diff --git a/matlab/TCV_IMAS/tcv2ids2database.m b/matlab/TCV_IMAS/tcv2ids2database.m
index 9166d42d3cb3b839076f7e15aa0bd33d158735a2..664175a4313b51c1194f1b54980d78155a6777d9 100644
--- a/matlab/TCV_IMAS/tcv2ids2database.m
+++ b/matlab/TCV_IMAS/tcv2ids2database.m
@@ -10,6 +10,7 @@ function [ids_from_tcv,varargout] = tcv2ids2database(shot,run_out,varargin);
 % varargin: 'occurence': occurence value
 % varargin: 'ids_names': cell, ids to load, by default all defined so far (if empty or empty string or not given)
 %             see tcv_available_ids for the list of IDSs available for TCV
+% varargin: 'imas_backend': "MDSplus" or "HDF5"
 % varargin: 'error_bar': type (string)
 %                'delta' or empty (default): meaning difference in upper is set (standard error_bar
 %                'added': errorbar is added: upper=data+delta and lower=data-delta
@@ -27,6 +28,7 @@ function [ids_from_tcv,varargout] = tcv2ids2database(shot,run_out,varargin);
 % example:
 %   ids_from_tcv = tcv2ids2database(62745,9999,'ids_names',{'pf_active'},'error_bar','added'); % to test only one ids
 %   ids_from_tcv = tcv2ids2database(62745,9999,'error_bar','added'); % to get all default ids's and old errorbar type
+%   ids_from_tcv = tcv2ids2database(62745,9999,'ids_names',{'summary'},'imas_backend','HDF5'); % Save data in imas HDF5 backend instead of MDSplus
 %
 
 ids_from_tcv = [];
@@ -50,6 +52,7 @@ p.addOptional('run_out', [], @(x) (isnumeric(x) && isscalar(x) && (x == round(x)
 p.addOptional('occurence', 0, @(x) isempty(x) || (isnumeric(x) && isscalar(x) && (x == round(x)))); % integer
 ids_names = tcv_available_ids;
 p.addOptional('ids_names', ids_names, @(x) isempty(x) || iscell(x)); % char or cell array
+p.addOptional('imas_backend', 'MDSplus', @(x) isempty(x) || ischar(x));
 p.addOptional('error_bar', 'delta', @(x) isempty(x) || ischar(x) ); % char or cell array
 p.addOptional('tree_user', getenv('USER'), @(x) isempty(x) || ischar(x) ); % char
 p.addOptional('tree_tokamak', 'tcv', @(x) isempty(x) || ischar(x) ); % char
@@ -101,8 +104,9 @@ for i=1:length(params.ids_names)
 end
 params.ids_names = ids_names_ok;
 params_tcv2ids2database = params;
-params_not_in_tcv2ids = {'run_out','occurence','tree_user','tree_tokamak','tree_majorversion'};
+params_not_in_tcv2ids = {'run_out','occurence','tree_user','tree_tokamak','tree_majorversion','imas_backend'};
 params_tcv2ids = rmfield(params_tcv2ids2database,params_not_in_tcv2ids);
+
 [ids_from_tcv,idsok] = tcv2ids(shot,params_tcv2ids);
 ids_from_tcv.params_tcv2ids2database = params_tcv2ids2database;
 
@@ -128,7 +132,8 @@ end
 %%
 
 [ids_put_status] = ids2database(shot,run_out,ids_from_tcv.params_tcv2ids2database.occurence,ids_from_tcv, ...
-          params_tcv2ids2database.tree_user,params_tcv2ids2database.tree_tokamak,params_tcv2ids2database.tree_majorversion);
+          params_tcv2ids2database.tree_user,params_tcv2ids2database.tree_tokamak,params_tcv2ids2database.tree_majorversion, ...
+          params_tcv2ids2database.imas_backend);
 
 ids_from_tcv.ids_put_status = ids_put_status;
 
diff --git a/matlab/subcall_all2str.m b/matlab/subcall_all2str.m
index 6e5d1ee125d25ccaad650eb1ba91d844a6c8ebd4..8966d184da44bc48e0c6973f93e9f0c7e8742ab0 100644
--- a/matlab/subcall_all2str.m
+++ b/matlab/subcall_all2str.m
@@ -56,11 +56,7 @@ for i_in=1:length(varargin)
   elseif ischar(var_to_treat)
     subcall = [subcall ',''' var_to_treat ''''];
   elseif iscell(var_to_treat)
-    subcall = [subcall ',{''' var_to_treat{1} ''''];
-    for i=2:length(var_to_treat)
-      subcall = [subcall ','''  var_to_treat{i} ''''];
-    end
-    subcall = [subcall '}'];
+    subcall = [subcall ',' cell2str(var_to_treat,3) ''];
   else
     warning('in subcall_all2str: case not foreseen');
   end
diff --git a/matlab/tests/test_requestnames.m b/matlab/tests/test_requestnames.m
index 63595919b38cbbbedf2ad19c8636348badc1df83..557144ccdb55fdc352bb83cf17315892f15429ad 100644
--- a/matlab/tests/test_requestnames.m
+++ b/matlab/tests/test_requestnames.m
@@ -1,48 +1,63 @@
 classdef (SharedTestFixtures={...
     check_mds,check_gdatpaths}) ...
     test_requestnames < matlab.unittest.TestCase
-  
+
   properties (Abstract)
     Machine;
   end
-  
+
   properties(TestParameter,Abstract)
     % parameters that will vary during tests
     shot;
     requests_fast; % placeholders
     requests_slow;
   end
-  
+
   methods(Static)
     function test_gdat_call(testCase,shot,request)
       % actual function to test gdat call
       testCase.assertTrue(isnumeric(str2double(shot)));
       testCase.assertTrue(ischar(request));
-      
+
       % gdat call
       gdat_call = sprintf(['gdat_' lower(testCase.Machine) '(%s,''%s'')'],shot,request);
       do_gdat_call = 1;
-      
+
       switch request
         case 'eqdsk'
           % avoid writing files in /tmp, may not be allowed
           gdat_call = sprintf(['gdat_%s(%s,''%s'',''write'',0)'],lower(testCase.Machine),shot,request);
+        case 'radcam'
+          % need a newer shot for tcv radcam
+          shot = 81102;
+          gdat_call = sprintf(['gdat_' lower(testCase.Machine) '(%s,''%s'')'],shot,request);
       end
-      
+
       % logging
       fprintf('Testing gdat call: %s\n',gdat_call);
-      
+
       if do_gdat_call
         gdat_out = eval(gdat_call); %#ok<NASGU>
       else
         gdat_out = struct([]);
       end
-      
+
       % in some future: check for warnings
       %gdat_out = verifyWarningFree(testCase,eval(gdat_call),...
       %  'Warning issued from gdat call:\n   %s\n',gdat_call);
-      
+
       % (add optional sanity checks of gdat_out here)
+      gdat_out
+      switch request
+        case {'ece', 'expcode', 'ids', 'ni', 'ti', 'transp'}
+          % tests not yet fully implemented and empty
+        case 'rtc'
+          % in this case .data is empty, all in .scd_mems
+          testCase.assertTrue(isfield(gdat_out,'scd_mems') && isstruct(gdat_out.scd_mems));
+          % testCase.assertTrue(isstruct(gdat_out.scd_mems));
+        otherwise
+          testCase.assertTrue(isnumeric(gdat_out.data) & numel(gdat_out.data)>0);
+      end
     end
   end
-end
\ No newline at end of file
+end
diff --git a/matlab/tests/test_requestnames_tcv.m b/matlab/tests/test_requestnames_tcv.m
index f40ecbfa9348473a86ef5552e37e9ad0340510a7..6941e96ddac1f9ae3cc07d32ee0dc76e58b0c5d5 100644
--- a/matlab/tests/test_requestnames_tcv.m
+++ b/matlab/tests/test_requestnames_tcv.m
@@ -11,17 +11,17 @@ classdef (TestTags={'tcv'})test_requestnames_tcv < test_requestnames
     requests_fast = get_all_gdat_requests('TCV','fast');
     requests_slow = get_all_gdat_requests('TCV','slow');
   end
-  
+
   methods(Test,TestTags = {'fast'})
     function test_gdat_call_fast(testCase,shot,requests_fast)
       testCase.test_gdat_call(testCase,shot,requests_fast);
     end
   end
-  
+
   methods(Test,TestTags = {'slow'})
     function test_gdat_call_slow(testCase,shot,requests_slow)
       testCase.test_gdat_call(testCase,shot,requests_slow);
     end
   end
-  
+
 end