diff --git a/matlab/IMAS/complete_IDS_CORSICA.m b/matlab/IMAS/complete_IDS_CORSICA.m
index 33ed3fb117a90ed6e9bd13764b212fc7813d0129..c62e762521d4b56caf4ceac55c993250e745dc47 100644
--- a/matlab/IMAS/complete_IDS_CORSICA.m
+++ b/matlab/IMAS/complete_IDS_CORSICA.m
@@ -1,10 +1,14 @@
+function IDS_out = complete_IDS_CORSICA(IDS_in,varargin)
+%
+%
+% 
 doread = 0;
 dosave = 0;
 
 if doread
-  clear all
-  close all
-  clc
+% $$$   clear all
+% $$$   close all
+% $$$   clc
 
   % This script will complete the IDS of CORSICA with the missing fields recomputing the missing quantities from available information
 
@@ -13,8 +17,10 @@ if doread
   
   data_path_out = '/NoTivoli/carpanes/LIU_RAP_ITER/CORSICA_ids/CORSICA_130510_extended_COCOS17.mat';
   
-  % Load the IDS file
-  IDS = load(data_path_in);
+  % Load the IDS_in file
+  IDS_out = load(data_path_in);
+else
+  IDS_out = IDS_in;
 end
 
 %% Correct COCOS convention on original data
@@ -22,68 +28,69 @@ end
 % Put homogenous = 0 on magnetic but 1 on the coils.
 % Sign of the angle of the magnetic probes. 
 
-
 %% 
 G = G_ITER_generator;
 % Get the structure from generating files
-P = liupiter(1000,'uuu',ones(G.na,1),'vvv',ones(G.nm,1), 'www', ones(G.nf,1)); % Some default setting that could be removed probably to use the liupiter directly
-G = liug(G,P);
-L = liuc(P,G);
 
-% Extract information from CORSICA IDS
-[LC,LXC,LYC] = LLXLY_IDS_corsica(L, IDS);
+Pliuqe = liupiter(1000,'uuu',ones(G.na,1),'vvv',ones(G.nm,1), 'www', ones(G.nf,1)); % Some default setting that could be removed probably to use the liupiter directly
+G = liug(G,Pliuqe);
+
+L = liuc(Pliuqe,G);
+
+% Extract information from CORSICA IDS_out
+[LC,LXC,LYC] = LLXLY_IDS_corsica(L, IDS_out);
 
-%%  -------------------- ADD the missing information on the existing IDS CORSICA -----------------------
+%%  -------------------- ADD the missing information on the existing IDS_out CORSICA -----------------------
 
 %% Consider each circuit to be composed by only one coil
 % TODO NEED TO ADD THE VERTICAL STABILIZATION COIL STILL
 tmp = data_coils();
 for ii = 1:numel(tmp.names)
-    for jj=1:numel(IDS.pf_active.coil)
+    for jj=1:numel(IDS_out.pf_active.coil)
         % Remove strange character in coil names
-        IDS.pf_active.coil{jj}.name = regexprep(IDS.pf_active.coil{jj}.name,'[\n\r]+','');
-        if strcmp(tmp.names{ii},IDS.pf_active.coil{jj}.name)
-            IDS.pf_active.coil{jj}.element{1}.geometry.geometry_type = 2; % Rectangle description
-            IDS.pf_active.coil{jj}.element{1}.geometry.rectangle.r = tmp.R(ii); 
-            IDS.pf_active.coil{jj}.element{1}.geometry.rectangle.z = tmp.Z(ii); 
-            IDS.pf_active.coil{jj}.element{1}.geometry.rectangle.width = tmp.dR(ii);
-            IDS.pf_active.coil{jj}.element{1}.geometry.rectangle.height = tmp.dZ(ii);
-            IDS.pf_active.coil{jj}.element{1}.turns_with_sign = tmp.N(ii);
+        IDS_out.pf_active.coil{jj}.name = regexprep(IDS_out.pf_active.coil{jj}.name,'[\n\r]+','');
+        if strcmp(tmp.names{ii},IDS_out.pf_active.coil{jj}.name)
+            IDS_out.pf_active.coil{jj}.element{1}.geometry.geometry_type = 2; % Rectangle description
+            IDS_out.pf_active.coil{jj}.element{1}.geometry.rectangle.r = tmp.R(ii); 
+            IDS_out.pf_active.coil{jj}.element{1}.geometry.rectangle.z = tmp.Z(ii); 
+            IDS_out.pf_active.coil{jj}.element{1}.geometry.rectangle.width = tmp.dR(ii);
+            IDS_out.pf_active.coil{jj}.element{1}.geometry.rectangle.height = tmp.dZ(ii);
+            IDS_out.pf_active.coil{jj}.element{1}.turns_with_sign = tmp.N(ii);
         end
     end
 end
 
 %% Add the data to the circuit
-Ncoils = numel(IDS.pf_active.coil);
+Ncoils = numel(IDS_out.pf_active.coil);
 for ii=1:Ncoils-2
-    IDS.pf_active.circuit{ii}.name = IDS.pf_active.coil{ii}.name;
-    IDS.pf_active.supply{ii}.name = IDS.pf_active.coil{ii}.name;
-    IDS.pf_active.circuit{ii}.current.data = IDS.pf_active.coil{ii}.current.data/IDS.pf_active.coil{ii}.element{1}.turns_with_sign;
-    IDS.pf_active.circuit{ii}.current.time = IDS.pf_active.coil{ii}.current.time;
-    IDS.pf_active.circuit{ii}.connections = zeros(2, 4*Ncoils);
-    IDS.pf_active.circuit{ii}.connections(1, 2*ii) =1;
-    IDS.pf_active.circuit{ii}.connections(2, 2*ii-1) = 1;
-    IDS.pf_active.circuit{ii}.connections(1, 2*Ncoils + 2*ii-1) =1;
-    IDS.pf_active.circuit{ii}.connections(2, 2*Ncoils + 2*ii) =1;
+    IDS_out.pf_active.circuit{ii}.name = IDS_out.pf_active.coil{ii}.name;
+    IDS_out.pf_active.supply{ii}.name = IDS_out.pf_active.coil{ii}.name;
+    IDS_out.pf_active.circuit{ii}.current.data = IDS_out.pf_active.coil{ii}.current.data/IDS_out.pf_active.coil{ii}.element{1}.turns_with_sign;
+    IDS_out.pf_active.circuit{ii}.current.time = IDS_out.pf_active.coil{ii}.current.time;
+    IDS_out.pf_active.circuit{ii}.connections = zeros(2, 4*Ncoils);
+    IDS_out.pf_active.circuit{ii}.connections(1, 2*ii) =1;
+    IDS_out.pf_active.circuit{ii}.connections(2, 2*ii-1) = 1;
+    IDS_out.pf_active.circuit{ii}.connections(1, 2*Ncoils + 2*ii-1) =1;
+    IDS_out.pf_active.circuit{ii}.connections(2, 2*Ncoils + 2*ii) =1;
 end
 % Vertical stabilization coil needs to be added still
 for ii=(Ncoils-1):Ncoils
-    IDS.pf_active.circuit{ii}.name = IDS.pf_active.coil{ii}.name;
-    IDS.pf_active.supply{ii}.name = IDS.pf_active.coil{ii}.name;
-    IDS.pf_active.circuit{ii}.name = IDS.pf_active.coil{ii}.name;
-    IDS.pf_active.circuit{ii}.current.data = zeros(LXC.nt, 1);
-    IDS.pf_active.circuit{ii}.current.time = LXC.t;
-    IDS.pf_active.circuit{ii}.connections = zeros(2, 4*Ncoils);
-    IDS.pf_active.circuit{ii}.connections(1, 2*ii) =1;
-    IDS.pf_active.circuit{ii}.connections(2, 2*ii-1) = 1;
-    IDS.pf_active.circuit{ii}.connections(1, 2*Ncoils + 2*ii-1) =1;
-    IDS.pf_active.circuit{ii}.connections(2, 2*Ncoils + 2*ii) =1;
+    IDS_out.pf_active.circuit{ii}.name = IDS_out.pf_active.coil{ii}.name;
+    IDS_out.pf_active.supply{ii}.name = IDS_out.pf_active.coil{ii}.name;
+    IDS_out.pf_active.circuit{ii}.name = IDS_out.pf_active.coil{ii}.name;
+    IDS_out.pf_active.circuit{ii}.current.data = zeros(LXC.nt, 1);
+    IDS_out.pf_active.circuit{ii}.current.time = LXC.t;
+    IDS_out.pf_active.circuit{ii}.connections = zeros(2, 4*Ncoils);
+    IDS_out.pf_active.circuit{ii}.connections(1, 2*ii) =1;
+    IDS_out.pf_active.circuit{ii}.connections(2, 2*ii-1) = 1;
+    IDS_out.pf_active.circuit{ii}.connections(1, 2*Ncoils + 2*ii-1) =1;
+    IDS_out.pf_active.circuit{ii}.connections(2, 2*Ncoils + 2*ii) =1;
 end
 
 %% Limiter description
 tmp = data_limiter();
-IDS.wall.description_2d{1}.limiter.unit{1}.outline.r = tmp.r;
-IDS.wall.description_2d{1}.limiter.unit{1}.outline.z = tmp.z;
+IDS_out.wall.description_2d{1}.limiter.unit{1}.outline.r = tmp.r;
+IDS_out.wall.description_2d{1}.limiter.unit{1}.outline.z = tmp.z;
 
 
 %% Vessel description
@@ -91,54 +98,117 @@ IDS.wall.description_2d{1}.limiter.unit{1}.outline.z = tmp.z;
 
 %%  -------------- Synthetic diagnostics------------ Need to be recomputed from CORSICA flux map
 
-IDS.magnetics.method{1}.ip.time = LXC.t; 
-IDS.magnetics.method{1}.ip.data = LXC.Ip;
+IDS_out.magnetics.method{1}.ip.time = LXC.t; 
+IDS_out.magnetics.method{1}.ip.data = LXC.Ip;
+
+% Correct IDS magnetics
+magnetics_default = ids_gen('magnetics');
+mag_fluxloop_def_fields = fieldnames(magnetics_default.flux_loop{1});
+if isfield(IDS_out.magnetics,'flux_loop') && length(IDS_out.magnetics.flux_loop) > 0
+  mag_fluxloop_fields = fieldnames(IDS_out.magnetics.flux_loop{1});
+else
+  mag_fluxloop_fields = {};
+end
+fields_to_add = setdiff(mag_fluxloop_def_fields,mag_fluxloop_fields);
 
 %% Ff
 tmp = data_Ff();
 for ii=1:numel(tmp.r)
-    IDS.magnetics.flux_loop{ii}.position{1}.r = tmp.r(ii);
-    IDS.magnetics.flux_loop{ii}.position{1}.z = tmp.z(ii);
-    IDS.magnetics.flux_loop{ii}.name = tmp.name{ii};
+  if ~isempty(fields_to_add)
+    for idef=1:length(fields_to_add)
+      % add first defaults and fill in after
+      IDS_out.magnetics.flux_loop{ii}.(fields_to_add{idef}) = magnetics_default.flux_loop{1}.(fields_to_add{idef});
+    end
+    if ii==1; warning(['following fields added to magnetics.flux_loop: ' sprintf('%s ',fields_to_add{:})]); end
+  end
+  IDS_out.magnetics.flux_loop{ii}.position{1}.r = tmp.r(ii);
+  IDS_out.magnetics.flux_loop{ii}.position{1}.z = tmp.z(ii);
+  IDS_out.magnetics.flux_loop{ii}.name = tmp.name{ii};
 end
 
 for ii=1:numel(tmp.r)
-    IDS.magnetics.flux_loop{ii}.flux.data = -LXC.Ff(ii,:)';
-    IDS.magnetics.flux_loop{ii}.flux.time = LXC.t;
+    IDS_out.magnetics.flux_loop{ii}.flux.data = -LXC.Ff(ii,:)';
+    IDS_out.magnetics.flux_loop{ii}.flux.time = LXC.t;
 end
 
 %% Bm
+% Correct IDS magnetics
+magnetics_default = ids_gen('magnetics');
+mag_bpol_probe_def_fields = fieldnames(magnetics_default.bpol_probe{1});
+if isfield(IDS_out.magnetics,'bpol_probe') && length(IDS_out.magnetics.bpol_probe) > 0
+  mag_bpol_probe_fields = fieldnames(IDS_out.magnetics.bpol_probe{1});
+else
+  mag_bpol_probe_fields = {};
+end
+fields_to_add = setdiff(mag_bpol_probe_def_fields,mag_bpol_probe_fields);
+mag_bpol_probe_def_fields = fieldnames(magnetics_default.bpol_probe{1}.position);
+if length(IDS_out.magnetics.bpol_probe) > 0 && isfield(IDS_out.magnetics.bpol_probe{1},'position')
+  mag_bpol_probe_fields = fieldnames(IDS_out.magnetics.bpol_probe{1}.position);
+else
+  mag_bpol_probe_fields = {};
+end
+fields_to_add_position = setdiff(mag_bpol_probe_def_fields,mag_bpol_probe_fields);
+
 tmp = data_Bm();
 for ii=1:numel(tmp.name)
-    IDS.magnetics.bpol_probe{ii}.position.r = tmp.r(ii);
-    IDS.magnetics.bpol_probe{ii}.position.z = tmp.z(ii);
-    IDS.magnetics.bpol_probe{ii}.poloidal_angle = -tmp.am(ii); % Correct the sign to be consistent with COCOS 11
-    IDS.magnetics.bpol_probe{ii}.name = tmp.name{ii};
+  if ~isempty(fields_to_add)
+    for idef=1:length(fields_to_add)
+      % add first defaults and fill in after
+      IDS_out.magnetics.bpol_probe{ii}.(fields_to_add{idef}) = magnetics_default.bpol_probe{1}.(fields_to_add{idef});
+    end
+    if ii==1; warning(['following fields added to magnetics.bpol_probe: ' sprintf('%s ',fields_to_add{:})]); end
+  end
+  if ~isempty(fields_to_add_position)
+    for idef=1:length(fields_to_add_position)
+      % add_position first defaults and fill in after
+      IDS_out.magnetics.bpol_probe{ii}.position.(fields_to_add_position{idef}) = magnetics_default.bpol_probe{1}.position.(fields_to_add_position{idef});
+    end
+    if ii==1; warning(['following fields add_positioned to magnetics.bpol_probe.position: ' sprintf('%s ',fields_to_add_position{:})]); end
+  end
+  IDS_out.magnetics.bpol_probe{ii}.position.r = tmp.r(ii);
+  IDS_out.magnetics.bpol_probe{ii}.position.z = tmp.z(ii);
+  IDS_out.magnetics.bpol_probe{ii}.poloidal_angle = -tmp.am(ii); % Correct the sign to be consistent with COCOS 11
+  IDS_out.magnetics.bpol_probe{ii}.name = tmp.name{ii};
 end
 
 for ii=1:numel(tmp.name)
-    IDS.magnetics.bpol_probe{ii}.field.data = LXC.Bm(ii,:)';
-    IDS.magnetics.bpol_probe{ii}.field.time = LXC.t;
+    IDS_out.magnetics.bpol_probe{ii}.field.data = LXC.Bm(ii,:)';
+    IDS_out.magnetics.bpol_probe{ii}.field.time = LXC.t;
 end
 
 %% Ft 
-IDS.magnetics.method{1}.diamagnetic_flux.data = -LXC.Ft;
-IDS.magnetics.method{1}.diamagnetic_flux.time = LXC.t;
+mag_method_def_fields = fieldnames(magnetics_default.method{1});
+if isfield(IDS_out.magnetics,'method') && length(IDS_out.magnetics.method) > 0
+  mag_method_fields = fieldnames(IDS_out.magnetics.method{1});
+else
+  mag_method_fields = {};
+end
+fields_to_add = setdiff(mag_method_def_fields,mag_method_fields);
+if ~isempty(fields_to_add)
+  for idef=1:length(fields_to_add)
+    % add first defaults and fill in after
+    IDS_out.magnetics.method{1}.(fields_to_add{idef}) = magnetics_default.method{1}.(fields_to_add{idef});
+  end
+  warning(['following fields added to magnetics.method: ' sprintf('%s ',fields_to_add{:})]);
+end
+IDS_out.magnetics.method{1}.diamagnetic_flux.data = -LXC.Ft;
+IDS_out.magnetics.method{1}.diamagnetic_flux.time = LXC.t;
 
 %% rBt
-IDS.tf.time = LXC.t;
-IDS.tf.b_field_tor_vacuum_r.time  = LXC.t;
-IDS.tf.b_field_tor_vacuum_r.data  = LXC.rBt;
-
-%% Convert from 11 to 17
-IDS.magnetics = ids_generic_cocos_nodes_transformation_symbolic(IDS.magnetics, 'magnetics', 11, 17);
-IDS.pf_active = ids_generic_cocos_nodes_transformation_symbolic(IDS.pf_active, 'pf_active', 11, 17,[],[],[],[],[],3);
-IDS.tf = ids_generic_cocos_nodes_transformation_symbolic(IDS.tf, 'tf', 11, 17);
+%IDS_out.tf.time = LXC.t;
+IDS_out.tf.b_field_tor_vacuum_r.time  = LXC.t;
+IDS_out.tf.b_field_tor_vacuum_r.data  = LXC.rBt;
+
+%% Convert from cocos_in to cocos_out
+cocos_in = 17;
+cocos_out = 11;
+to_transform = {'pf_active','pf_passive','magnetics','tf','wall','equilibrium'};
+for i=1:length(to_transform)
+  IDS_out.(to_transform{i}) = ids_generic_cocos_nodes_transformation_symbolic(IDS_out.(to_transform{i}), to_transform{i}, cocos_in, cocos_out,[],[],[],[],[],3);
+end
 
 %% Store the resulting data
 if dosave
-  save(data_path_out, '-struct', 'IDS')
+  save(data_path_out, '-struct', 'IDS_out')
   fprintf('\n wrote file %s \n', data_path_out);
 end
-
-
diff --git a/matlab/IMAS/gdat_imas.m b/matlab/IMAS/gdat_imas.m
index 5850cc9ac9fb88125ac6b39f3f10a8b04fa8f02a..0e2cf4d7512f4d98717b814edefc5fb629813db3 100644
--- a/matlab/IMAS/gdat_imas.m
+++ b/matlab/IMAS/gdat_imas.m
@@ -477,11 +477,35 @@ elseif strcmp(mapping_for_imas.method,'switchcase')
 	gdat_data.([ids_top_name '_help']) = getReport(ME_imas_ids_get);
 	rethrow(ME_imas_ids_get)
       end
+      % check homogeneous
+      switch gdat_data.(ids_top_name).ids_properties.homogeneous_time
+       case -999999999
+	warning([ids_top_name '.ids_properties.homogeneous_time is not defined']);
+	if isempty(gdat_data.(ids_top_name).time)
+	  gdat_data.(ids_top_name).ids_properties.homogeneous_time = 0;
+	  warning([ids_top_name '.ids_properties.homogeneous_time set to 0 since .time empty']);
+	elseif isfinite(gdat_data.(ids_top_name).time)
+	  gdat_data.(ids_top_name).ids_properties.homogeneous_time = 1;
+	  warning([ids_top_name '.ids_properties.homogeneous_time set to 1 since .time finite']);
+	end
+       case 0
+	if ~isempty(gdat_data.(ids_top_name).time)
+	  disp([ids_top_name '.ids_properties.homogeneous_time=0 but .time not empty, to check'])
+	end
+       case 1
+	if isempty(gdat_data.(ids_top_name).time)
+	  disp([ids_top_name '.ids_properties.homogeneous_time=1 but .time empty, to check'])
+	end
+       otherwise
+	warning([ids_top_name '.ids_properties.homogeneous_time = ' num2str(gdat_data.(ids_top_name).ids_properties.homogeneous_time) ...
+		 ' not sure what to check'])
+      end
       % Perform cocos transformation if cocos_out ~= cocos_in
       if gdat_data.gdat_params.cocos_in ~= gdat_data.gdat_params.cocos_out
 	[ids_out,cocoscoeff]=ids_generic_cocos_nodes_transformation_symbolic(gdat_data.(ids_top_name),ids_top_name, ...
 	  gdat_data.gdat_params.cocos_in, gdat_data.gdat_params.cocos_out, gdat_data.gdat_params.ipsign_out,gdat_data.gdat_params.b0sign_out, ...
 	  gdat_data.gdat_params.ipsign_in, gdat_data.gdat_params.b0sign_in);
+	gdat_data.(ids_top_name) = ids_out;
       end
     end
     
diff --git a/matlab/TCV_IMAS/ids2database.m b/matlab/TCV_IMAS/ids2database.m
index f9e2d2551389b95278dcbc2fa25a068262e9d8eb..abbbfaec4f3ceac08b0529a6f04f46347b84c79c 100644
--- a/matlab/TCV_IMAS/ids2database.m
+++ b/matlab/TCV_IMAS/ids2database.m
@@ -25,8 +25,8 @@ p.addOptional('shot', [], @(x) (isnumeric(x) && isscalar(x) && (x == round(x))))
 p.addOptional('run', [], @(x) (isnumeric(x) && isscalar(x) && (x == round(x)))); % integer
 p.addOptional('occurence', 0, @(x) isempty(x) || (isnumeric(x) && isscalar(x) && (x == round(x)))); % integer
 p.addOptional('ids2put', struct([]), @(x) (isstruct(x)));
-p.addOptional('tree_user', tree_user_default, @(x) (ischar(x)));
-p.addOptional('tree_tokamak', tree_tokamak_default, @(x) (ischar(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.parse;
@@ -66,7 +66,15 @@ end
 names = fieldnames(params);
 mask = structfun(@isempty,params);
 if any(mask),
-  params = rmfield(params,unique([names(mask); p.UsingDefaults.']));
+  ij=find(mask==1);
+  for i=1:length(ij)
+    params.(names{ij(i)}) = defaults_ids2database.(names{ij(i)});
+  end
+  mask2 = structfun(@isempty,params);
+  if any(mask2),
+    % rm remaining empty fields
+    params = rmfield(params,unique([names(mask2)]));
+  end
 end
 
 params_ids2database = params;