diff --git a/src/mo_optimization_types.f90 b/src/mo_optimization_types.f90
index 7dc1376416092f7b1a92333fad437d7db94cd926..e42fc511b8a2d3fedcfeae5917eb2f3211239173 100644
--- a/src/mo_optimization_types.f90
+++ b/src/mo_optimization_types.f90
@@ -41,18 +41,21 @@ MODULE mo_optimization_types
   type sim_data_t
     type(sim_var_t), dimension(:), allocatable :: variables
     contains
-    procedure :: has => sim_data_has
-    procedure :: add => sim_data_add
-    procedure :: get_id => sim_data_get_id
+    procedure, public :: has => sim_data_has
+    procedure, public :: add => sim_data_add
+    procedure, public :: allocate => sim_data_allocate
     ! ToDo only interface public, other private
-    procedure :: allocate => sim_data_allocate
-    procedure :: sim_data_set_pointer_1d
-    procedure :: sim_data_set_pointer_2d
-    procedure :: sim_data_set_pointer_3d
-    procedure :: sim_data_set_pointer_4d
-    procedure :: sim_data_set_pointer_5d
+    procedure, private :: get_id => sim_data_get_id
+    ! One could create these similar procedures
+    ! with fypp, for example if more dimensions are needed.
+    ! Or you could read about 'assumed rank'.
+    procedure, private :: sim_data_set_pointer_1d
+    procedure, private :: sim_data_set_pointer_2d
+    procedure, private :: sim_data_set_pointer_3d
+    procedure, private :: sim_data_set_pointer_4d
+    procedure, private :: sim_data_set_pointer_5d
     ! ToDo: destructor
-    generic   :: set_pointer => sim_data_set_pointer_1d, sim_data_set_pointer_2d, &
+    generic, public   :: set_pointer => sim_data_set_pointer_1d, sim_data_set_pointer_2d, &
       sim_data_set_pointer_3d, sim_data_set_pointer_4d, sim_data_set_pointer_5d
   end type sim_data_t
 
@@ -117,17 +120,17 @@ MODULE mo_optimization_types
     end do
   end function sim_data_has
 
-  subroutine sim_data_add(this, name, dim, time_avg_selector)
+  subroutine sim_data_add(this, name, ndim, time_avg_selector)
     class(sim_data_t), intent(inout) :: this
     character(*), intent(in)    :: name
-    integer(i4), intent(in) :: dim
+    integer(i4), intent(in) :: ndim
     integer(i4), optional, intent(in) :: time_avg_selector
 
     type(sim_var_t) :: add_data
 
     ! ToDo: Why name in type 256 and in input var *?
     add_data%name = trim(name)
-    add_data%ndim = dim
+    add_data%ndim = ndim
     if (present(time_avg_selector)) add_data%time_avg_selector = time_avg_selector
     ! ToDo: is the if case needed?
     ! Tested: the else case works
@@ -140,6 +143,7 @@ MODULE mo_optimization_types
 
   end subroutine sim_data_add
 
+  ! ToDo: rename ndim -> data_shape
   subroutine sim_data_allocate(this, name, ndim)
     class(sim_data_t), target, intent(inout) :: this
     character(*), intent(in)    :: name
@@ -174,7 +178,7 @@ MODULE mo_optimization_types
 
     integer(i4) :: i
 
-    sim_data_get_id = -999
+    sim_data_get_id = -1
     do i = 1, size(this%variables)
       if (this%variables(i)%name == name) then
         sim_data_get_id = i
@@ -182,11 +186,10 @@ MODULE mo_optimization_types
       end if
     end do
 
-    if (sim_data_get_id == -999) stop ('sim_data_get_id: The simulated variable name does not exist.')
+    if (sim_data_get_id == -1) stop ('sim_data_get_id: The simulated variable name does not exist.')
 
   end function sim_data_get_id
 
-  ! ToDo: generate with fypp
   subroutine sim_data_set_pointer_1d(this, name, ptr)
     class(sim_data_t), target, intent(in) :: this
     character(*), intent(in)    :: name