diff --git a/src/package.devc.xml b/src/package.devc.xml
new file mode 100644
index 0000000..968c3f3
--- /dev/null
+++ b/src/package.devc.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DEVC" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DEVC>
+    <CTEXT>RAP Generator</CTEXT>
+   </DEVC>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_bp_rapg_all.clas.abap b/src/zdmo_bp_rapg_all.clas.abap
new file mode 100644
index 0000000..99f8f61
--- /dev/null
+++ b/src/zdmo_bp_rapg_all.clas.abap
@@ -0,0 +1,25 @@
+CLASS zdmo_bp_rapg_all DEFINITION
+PUBLIC
+ABSTRACT
+FINAL FOR BEHAVIOR OF zdmo_r_rapg_projecttp.
+
+  PUBLIC SECTION.
+
+    TYPES: BEGIN OF t_rap_bo_node,
+             uuid TYPE sysuuid_x16,
+             node TYPE REF TO zdmo_cl_rap_node,
+           END OF t_rap_bo_node.
+
+    TYPES t_rap_bo_nodes TYPE STANDARD TABLE OF t_rap_bo_node.
+
+    CLASS-DATA rap_bo_nodes TYPE t_rap_bo_nodes READ-ONLY.
+
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_BP_RAPG_ALL IMPLEMENTATION.
+ENDCLASS.
diff --git a/src/zdmo_bp_rapg_all.clas.locals_imp.abap b/src/zdmo_bp_rapg_all.clas.locals_imp.abap
new file mode 100644
index 0000000..23163f8
--- /dev/null
+++ b/src/zdmo_bp_rapg_all.clas.locals_imp.abap
@@ -0,0 +1,2971 @@
+CLASS lhc_Project DEFINITION INHERITING FROM cl_abap_behavior_handler.
+  PRIVATE SECTION.
+
+    METHODS get_global_authorizations FOR GLOBAL AUTHORIZATION
+      IMPORTING REQUEST requested_authorizations FOR Project RESULT result.
+
+    METHODS createProjectAndRootNode FOR MODIFY
+      IMPORTING keys FOR ACTION Project~createProjectAndRootNode RESULT result.
+
+    METHODS CalculateBoName FOR DETERMINE ON SAVE
+      IMPORTING keys FOR Project~CalculateBoName.
+    METHODS get_instance_features FOR INSTANCE FEATURES
+      IMPORTING keys REQUEST requested_features FOR Project RESULT result.
+
+    METHODS copyProject FOR MODIFY
+      IMPORTING keys FOR ACTION Project~copyProject RESULT result.
+
+    METHODS deleteProject FOR MODIFY
+      IMPORTING keys FOR ACTION Project~deleteProject RESULT result.
+
+    METHODS generateProject FOR MODIFY
+      IMPORTING keys FOR ACTION Project~generateProject RESULT result.
+
+    METHODS SetRepositoryObjectNames FOR DETERMINE ON MODIFY
+      IMPORTING keys FOR Project~SetRepositoryObjectNames.
+    METHODS createJsonString FOR DETERMINE ON SAVE
+      IMPORTING keys FOR Project~createJsonString.
+    METHODS generated_objects_are_deleted FOR VALIDATE ON SAVE
+      IMPORTING keys FOR Project~generated_objects_are_deleted.
+    METHODS mandatory_fields_check FOR VALIDATE ON SAVE
+      IMPORTING keys FOR Project~mandatory_fields_check.
+    METHODS is_customizing_table FOR VALIDATE ON SAVE
+      IMPORTING keys FOR Project~is_customizing_table.
+    METHODS check_for_allowed_combinations FOR VALIDATE ON SAVE
+      IMPORTING keys FOR Project~check_for_allowed_combinations.
+    METHODS rap_gen_project_objects_exist
+      IMPORTING
+        i_rap_generator_project           TYPE ZDMO_R_RAPG_ProjectTP
+      RETURNING
+        VALUE(r_repository_objects_exist) TYPE abap_bool.
+ENDCLASS.
+
+CLASS lhc_Project IMPLEMENTATION.
+
+  METHOD get_global_authorizations.
+  ENDMETHOD.
+
+  METHOD createProjectAndRootNode.
+
+    CONSTANTS mycid_rapbonode TYPE abp_behv_cid VALUE 'My%CID_rapbonode' ##NO_TEXT.
+
+    DATA create_rapbonode_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node.
+    DATA create_rapbo TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP.
+
+    DATA create_rapbonode_cba_line TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node.
+    DATA create_rapbo_line TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP.
+
+    DATA object_name TYPE if_xco_gen_o_finding=>tv_object_name .
+    DATA abap_object_directory_entry  TYPE zdmo_cl_rap_xco_lib=>t_abap_obj_directory_entry  .
+    DATA package_name TYPE zdmo_cl_rap_xco_lib=>t_abap_obj_directory_entry-ABAPPackage.
+    DATA object_type TYPE zdmo_cl_rap_xco_lib=>t_abap_obj_directory_entry-ABAPObjectType.
+    DATA object_category TYPE zdmo_cl_rap_xco_lib=>t_abap_obj_directory_entry-ABAPObjectCategory.
+
+    DATA has_semantic_key TYPE abap_bool.
+    DATA is_managed TYPE abap_bool.
+    DATA does_not_use_unmanaged_query TYPE abap_bool.
+
+    DATA(xco_lib) = zdmo_cl_rap_xco_lib=>create_xco_lib( ).
+
+
+
+
+*    IF xco_lib->on_premise_branch_is_used(  ) = abap_true.
+*      DATA(abap_language_version) = zdmo_cl_rap_node=>abap_language_version-standard.
+*    ELSE.
+*      abap_language_version = zdmo_cl_rap_node=>abap_language_version-abap_for_cloud_development.
+*    ENDIF.
+
+*    DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib.
+*    DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+**    DATA(xco_cloud_library) = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+*    DATA(node) = NEW ZDMO_cl_rap_node(  ).
+*    IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_true.
+*      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+*      node->set_xco_lib( xco_lib ).
+*      DATA(abap_language_version) = zdmo_cl_rap_node=>abap_language_version-standard.
+*    ELSE.
+*      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+*      node->set_xco_lib( xco_lib ).
+*      abap_language_version = zdmo_cl_rap_node=>abap_language_version-abap_for_cloud_development.
+*    ENDIF.
+
+
+
+    LOOP AT keys INTO DATA(ls_key).
+
+      TRY.
+          "dummy fix
+          DATA(node) = NEW ZDMO_cl_rap_node( xco_lib ) .
+
+          "get package of datasource
+
+          object_name = ls_key-%param-data_source_name.
+
+          DATA(data_source_type) = ls_key-%param-DataSourceType.
+
+          CASE data_source_type.
+            WHEN zdmo_cl_rap_node=>data_source_types-table.
+              object_category = 'TABL'.
+              object_type = 'R3TR'.
+            WHEN zdmo_cl_rap_node=>data_source_types-cds_view.
+              object_category = 'DDLS'.
+              object_type = 'R3TR'.
+            WHEN zdmo_cl_rap_node=>data_source_types-abstract_entity.
+              object_category = 'DDLS'.
+              object_type = 'R3TR'.
+            WHEN OTHERS.
+              "@todo raise exception
+          ENDCASE.
+
+          xco_lib->get_abap_obj_directory_entry(
+                   EXPORTING
+                     i_abap_object_type            = object_category
+                     i_abap_object_category        = object_type
+                     i_abap_object                 = object_name
+                   RECEIVING
+                     r_abap_object_directory_entry = abap_object_directory_entry
+                 ).
+
+*      package_name = abap_object_directory_entry-ABAPPackage.
+
+          package_name = ls_key-%param-package_name.
+
+          "get transport request
+          node->set_package( package_name ).
+          node->set_namespace(  ).
+*          node->set_transport_request(  ).
+
+          node->set_data_source_type( CONV #( ls_key-%param-DataSourceType ) ).
+          node->set_data_source( CONV #( ls_key-%param-data_source_name ) ).
+          "when table is set as a datasource the transport request that is locking
+          "a table should have been set.
+          IF node->transport_request IS INITIAL.
+            node->set_transport_request(  ).
+          ENDIF.
+
+        CATCH zdmo_cx_rap_generator INTO DATA(fill_node_object_exception).
+          APPEND VALUE #( %cid = ls_key-%cid ) TO failed-project.
+          APPEND VALUE #( %cid = ls_key-%cid
+*                        %state_area   = 'VALIDATE_QUANTITY'
+                          %msg = new_message_with_text(
+                                   severity = if_abap_behv_message=>severity-error
+                                   text     = fill_node_object_exception->get_text( ) )
+                        ) TO reported-project.
+          RETURN.
+      ENDTRY.
+
+      IF ls_key-%param-DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity.
+        does_not_use_unmanaged_query = abap_false.
+      ELSE.
+        does_not_use_unmanaged_query = abap_true.
+      ENDIF.
+
+      CASE ls_key-%param-BdefImplementationType.
+        WHEN zdmo_cl_rap_node=>bdef_implementation_type-managed.
+          is_managed = abap_true.
+          IF node->is_uuid_based(  ).         .
+            DATA(implementation_type) = zdmo_cl_rap_node=>implementation_type-managed_uuid.
+          ELSE.
+            implementation_type = zdmo_cl_rap_node=>implementation_type-managed_semantic.
+            has_semantic_key = abap_true.
+          ENDIF.
+        WHEN zdmo_cl_rap_node=>bdef_implementation_type-unmanaged.
+          implementation_type = zdmo_cl_rap_node=>implementation_type-unmanaged_semantic.
+          has_semantic_key = abap_true.
+      ENDCASE.
+
+      "make sure that for abstract entities
+
+*      DATA(fields) = node->lt_all_fields.
+
+      DATA(package) = xco_lib->get_package( package_name ).
+      DATA(software_compontent) = package->read(  )-property-software_component.
+      DATA(abap_language_version_number) = xco_lib->get_abap_language_version( package_name ).
+
+      CASE abap_language_version_number.
+        WHEN zdmo_cl_rap_node=>package_abap_language_version-standard.
+          DATA(abap_language_version) = zdmo_cl_rap_node=>abap_language_version-standard.
+        WHEN zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform.
+          abap_language_version = zdmo_cl_rap_node=>abap_language_version-abap_for_cloud_development.
+        WHEN OTHERS.
+          "abap language version of package is not supported
+          ASSERT 1 = 2.
+      ENDCASE.
+
+      create_rapbo_line = VALUE #(  %is_draft = if_abap_behv=>mk-on
+                                %cid      = ls_key-%cid
+                                rootentityname   = ls_key-%param-EntityName
+                                packagename = package_name
+                                Namespace = node->namespace
+                                abaplanguageversion = abap_language_version "ls_key-%param-language_version
+                                PackageLanguageVersion = abap_language_version_number
+                                draftenabled = ls_key-%param-DraftEnabled
+                                isExtensible = ls_key-%param-isExtensible
+                                implementationtype = implementation_type
+                                datasourcetype = ls_key-%param-DataSourceType
+                                BindingType = ls_key-%param-BindingType
+                                TransportRequest = node->transport_request
+                                "boolean fields to hide / show fields in the UI
+                                AddIViewBasic = abap_false
+                                AddSAPObjectType = abap_false
+                                hasSematicKey    = has_semantic_key
+                                doesNotUseUnmanagedQuery = does_not_use_unmanaged_query
+                                isManaged = is_managed
+                                PublishService = abap_true
+                                            ).
+
+
+      create_rapbonode_cba_line = VALUE #(  %is_draft = if_abap_behv=>mk-on
+                                        %cid_ref  = ls_key-%cid
+                                        %target   = VALUE #( (
+                                                               %is_draft = if_abap_behv=>mk-on
+                                                               %cid      = mycid_rapbonode
+                                                               entityname = ls_key-%param-entityname
+                                                               isrootnode = abap_true
+                                                               DataSource = ls_key-%param-data_source_name
+                                                               hierarchydistancefromroot = 0
+                                                               ) ) ) .
+
+      IF create_rapbo_line-isExtensible = abap_true.
+        create_rapbo_line-AddSAPObjectType = abap_true.
+      ENDIF.
+
+      APPEND create_rapbo_line TO create_rapbo.
+      APPEND create_rapbonode_cba_line TO create_rapbonode_cba.
+
+    ENDLOOP.
+
+    MODIFY ENTITIES OF zdmo_r_rapg_projecttp IN LOCAL MODE
+            ENTITY Project
+            CREATE FIELDS ( rootentityname packagename Namespace
+                            abaplanguageversion PackageLanguageVersion
+                            draftenabled isExtensible implementationtype datasourcetype bindingtype
+                            hasSematicKey doesNotUseUnmanagedQuery isManaged
+                            TransportRequest PublishService AddIViewBasic AddSAPObjectType )
+                  WITH create_rapbo
+                  CREATE BY \_Node
+                  FIELDS ( entityname isrootnode hierarchydistancefromroot DataSource )
+                  WITH create_rapbonode_cba
+            MAPPED   mapped
+            FAILED   failed
+            REPORTED reported.
+
+    CHECK mapped-project[] IS NOT INITIAL.
+
+    DATA test_key TYPE STRUCTURE FOR ACTION IMPORT zdmo_r_rapg_projecttp~check_allowed_combinations_det.
+    DATA test_keys TYPE TABLE FOR ACTION IMPORT zdmo_r_rapg_projecttp~check_allowed_combinations_det.
+
+
+    LOOP AT mapped-project INTO DATA(mapped_project).
+      APPEND VALUE #( %cid = ls_key-%cid
+                      %param = VALUE #( %is_draft = mapped_project-%is_draft
+                                        %key      = mapped_project-%key ) ) TO result.
+      test_key-RapBoUUID = mapped_project-RapBoUUID.
+      test_key-%is_draft = mapped_project-%is_draft.
+      APPEND test_key TO test_keys.
+
+    ENDLOOP.
+
+
+*    MODIFY ENTITIES OF zdmo_r_rapg_projecttp IN LOCAL MODE
+*           ENTITY Project
+*           EXECUTE check_allowed_combinations_det
+*           FROM test_keys
+*              MAPPED   mapped
+*              FAILED   failed
+*              REPORTED reported.
+
+*"set values for node object in global class
+*      zdmo_bp_rapg_all=>rap_bo_nodes[ uuid = mapped-project[ 1 ]-%key-RapBoUUID
+*
+*    DATA rap_bo_node TYPE zdmo_bp_rapg_all=>t_rap_bo_node.
+*    TRY.
+*        LOOP AT mapped-project INTO mapped_project.
+*          rap_bo_node-uuid = mapped_project-RapBoUUID.
+*          rap_bo_node-node = node.
+*        ENDLOOP.
+
+
+
+  ENDMETHOD.
+
+  METHOD CalculateBoName.
+  ENDMETHOD.
+
+  METHOD get_instance_features.
+
+    DATA rap_generator_project TYPE ZDMO_R_RAPG_ProjectTP.
+    DATA result_line  LIKE LINE OF result  .
+    DATA rap_gen_project_objects_exist TYPE abap_bool.
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Project
+    ALL FIELDS
+    WITH CORRESPONDING #( keys )
+    RESULT DATA(rapbos).
+
+    LOOP AT rapbos INTO DATA(rapbo).
+
+      MOVE-CORRESPONDING rapbo TO rap_generator_project.
+
+*      DATA(rap_gen_project_objects_exist) = rap_gen_project_objects_exist( rap_generator_project ).
+
+
+      result_line-%tky = rapbo-%tky.
+
+      "disable EDIT button when
+      " - repository objects have already been generated
+      " - a job has been scheduled
+
+      IF rap_gen_project_objects_exist = abap_true .
+        result_line-%action-edit  = if_abap_behv=>fc-o-disabled.
+      ELSE.
+        IF  rapbo-jobname IS NOT INITIAL.
+          result_line-%action-edit  = if_abap_behv=>fc-o-disabled.
+        ELSE.
+          result_line-%action-edit  =  if_abap_behv=>fc-o-enabled.
+        ENDIF.
+      ENDIF.
+
+      result_line-%action-generateProject      = COND #( WHEN rapbo-%is_draft = if_abap_behv=>mk-off AND
+                                           rapbo-jobname IS INITIAL
+                                      THEN if_abap_behv=>fc-o-enabled
+                                      ELSE if_abap_behv=>fc-o-disabled ).
+      result_line-%action-copyProject      = COND #( WHEN rapbo-%is_draft = if_abap_behv=>mk-off
+                                         THEN if_abap_behv=>fc-o-enabled
+                                         ELSE if_abap_behv=>fc-o-disabled ).
+
+      result_line-%field-MultiInlineEdit  = COND #( WHEN rapbo-ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_semantic
+                                         AND rapbo-DataSourceType = zdmo_cl_rap_node=>data_source_types-table
+                                         AND rapbo-DraftEnabled = abap_true
+                                         AND rapbo-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui
+                                        THEN if_abap_behv=>fc-f-unrestricted
+                                        ELSE if_abap_behv=>fc-f-read_only ).
+      result_line-%field-CustomizingTable = COND #( WHEN rapbo-ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_semantic
+                                         AND rapbo-DataSourceType = zdmo_cl_rap_node=>data_source_types-table
+                                         AND rapbo-DraftEnabled = abap_true
+                                         AND rapbo-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui
+                                        THEN if_abap_behv=>fc-f-unrestricted
+                                        ELSE if_abap_behv=>fc-f-read_only ).
+      result_line-%field-AddToManageBusinessConfig  = COND #( WHEN rapbo-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui
+                                                  THEN if_abap_behv=>fc-f-unrestricted
+                                                  ELSE if_abap_behv=>fc-f-read_only ).
+
+*      result_line-%field-ADTLink  = COND #( WHEN rapbo-BoIsGenerated = abap_true
+*                                                 THEN if_abap_behv=>fc-f-read_only
+*                                                 ELSE if_abap_behv=>fc-f- ).
+
+*      result_line-%field-extensibilityElementSuffix  = COND #( WHEN rapbo-isExtensible = abap_true
+*                                                               THEN if_abap_behv=>fc-f-mandatory
+*                                                                ).
+
+      APPEND result_line TO result.
+    ENDLOOP.
+
+
+
+  ENDMETHOD.
+
+  METHOD copyProject.
+
+*
+*    DATA:
+*      projects       TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\Project,
+*      Nodes_cba  TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\Project\_Node,
+*      fields_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\Node\_field.
+*
+**    READ TABLE keys WITH KEY %cid = '' INTO DATA(key_with_inital_cid).
+**    ASSERT key_with_inital_cid IS INITIAL.
+*
+*    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+*      ENTITY Project
+*       ALL FIELDS WITH CORRESPONDING #( keys )
+*    RESULT DATA(Project_read_result)
+*    FAILED failed.
+*
+*    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+*      ENTITY Project BY \_Node
+*       ALL FIELDS WITH CORRESPONDING #( Project_read_result )
+*     RESULT DATA(book_read_result).
+*
+*    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+*      ENTITY Node BY \_field
+*       ALL FIELDS WITH CORRESPONDING #( book_read_result )
+*    RESULT DATA(booksuppl_read_result).
+*
+*    LOOP AT Project_read_result ASSIGNING FIELD-SYMBOL(<Project>).
+*      "Fill Project container for creating new Project instance
+*      APPEND VALUE #(
+**      %cid     = keys[ KEY entity %tky = <Project>-%tky ]-%cid
+*                      %data    = CORRESPONDING #( <Project> EXCEPT rapbouuid  ) )
+*        TO projects ASSIGNING FIELD-SYMBOL(<new_Project>).
+*
+*      "Fill %cid_ref of Project as instance identifier for cba Node
+*      APPEND VALUE #(
+*        %cid_ref = keys[ KEY entity %tky = <Project>-%tky ]-%cid )
+*        TO Nodes_cba ASSIGNING FIELD-SYMBOL(<Nodes_cba>).
+*
+**      <new_Project>-begin_date     = cl_abap_context_info=>get_system_date( ).
+**      <new_Project>-end_date       = cl_abap_context_info=>get_system_date( ) + 30.
+**      <new_Project>-overall_status = 'O'.  "Set to open to allow an editable instance
+*
+*      LOOP AT book_read_result ASSIGNING FIELD-SYMBOL(<Node>) USING KEY entity WHERE Project_id EQ <Project>-Project_id.
+*        "Fill Node container for creating Node with cba
+*        APPEND VALUE #( %cid     = keys[ KEY entity %tky = <Project>-%tky ]-%cid && <Node>-Node_id
+*                        %data    = CORRESPONDING #(  book_read_result[ KEY entity %tky = <Node>-%tky ] EXCEPT Project_id ) )
+*          TO <Nodes_cba>-%target ASSIGNING FIELD-SYMBOL(<new_Node>).
+*
+*        "Fill %cid_ref of Node as instance identifier for cba booksuppl
+*        APPEND VALUE #( %cid_ref = keys[ KEY entity %tky = <Project>-%tky ]-%cid && <Node>-Node_id )
+*          TO fields_cba ASSIGNING FIELD-SYMBOL(<fields_cba>).
+*
+*        <new_Node>-Node_status = 'N'.
+*
+*        LOOP AT booksuppl_read_result ASSIGNING FIELD-SYMBOL(<booksuppl>) USING KEY entity WHERE Project_id  EQ <Project>-Project_id
+*                                                                                           AND   Node_id EQ <Node>-Node_id.
+*          "Fill booksuppl container for creating supplement with cba
+*          APPEND VALUE #( %cid  = keys[ KEY entity %tky = <Project>-%tky ]-%cid  && <Node>-Node_id && <booksuppl>-Node_supplement_id
+*                          %data = CORRESPONDING #( <booksuppl> EXCEPT Project_id Node_id ) )
+*            TO <fields_cba>-%target.
+*        ENDLOOP.
+*      ENDLOOP.
+*    ENDLOOP.
+*
+*    "create new BO instance
+*    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+*      ENTITY Project
+*        CREATE FIELDS (
+*                boname
+* rootentityname
+* namespace
+* packagename
+* transportrequest
+* skipactivation
+* implementationtype
+* abaplanguageversion
+* packagelanguageversion
+* datasourcetype
+* bindingtype
+* draftenabled
+* suffix
+* prefix
+* multiinlineedit
+* customizingtable
+* addtomanagebusinessconfig
+* businessconfname
+* businessconfidentifier
+* businessconfdescription
+*        )
+*          WITH projects
+*        CREATE BY \_Node FIELDS (
+*
+*                      FieldNameCreatedAt
+*                      FieldNameCreatedby
+*                      FieldNameEtagMaster
+*                      FieldNameLastChangedAt
+*                      FieldNameLastChangedBy
+*                      FieldNameLocLastChangedAt
+*                      FieldNameObjectID
+*                      FieldNameParentUUID
+*                      FieldNameRootUUID
+*                      FieldNameTotalEtag
+*                      FieldNameUUID
+*
+*
+*        )
+*          WITH Nodes_cba
+*      ENTITY Node
+*        CREATE BY \_field FIELDS ( Node_supplement_id supplement_id price currency_code )
+*          WITH fields_cba
+*      MAPPED DATA(mapped_create).
+*
+*    mapped-Project   =  mapped_create-Project .
+
+    DATA update_bonodes TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node.
+
+*    DATA targets TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\node .
+*    DATA target LIKE LINE OF targets.
+    DATA update_fields TYPE TABLE FOR UPDATE ZDMO_R_RAPG_FieldTP.
+    DATA update_field TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_FieldTP.
+
+    DATA cid TYPE i.
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+     ENTITY Project
+     ALL FIELDS
+     WITH CORRESPONDING #( keys )
+     RESULT DATA(rapbos).
+
+    CHECK lines( rapbos ) = 1.
+    "only copy projects that are not in draft mode
+    CHECK rapbos[ 1 ]-%is_draft = if_abap_behv=>mk-off.
+
+    "Get package name selected by the user
+    DATA(selected_packagename) = keys[ 1 ]-%param-packagename.
+
+
+    DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib.
+    DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+    IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_true.
+      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+
+    DATA(selected_package_exist) = xco_lib->get_package( selected_packagename )->exists(  ).
+
+    IF selected_package_exist = abap_false.
+
+      APPEND VALUE #( %tky = rapbos[ 1 ]-%tky )
+                       TO failed-project.
+
+      "Set message
+      APPEND VALUE #( %tky = rapbos[ 1 ]-%tky
+                      %element-jsonstring = if_abap_behv=>mk-on
+                      %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                          number   = 014
+                                          severity = if_abap_behv_message=>severity-error
+                                          v1       =  selected_packagename
+                                   )
+                     )
+             TO reported-project.
+      RETURN.
+
+    ENDIF.
+
+    LOOP AT rapbos INTO DATA(rapbo).
+
+      " Read all associated nodes
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+              ENTITY Project BY \_Node
+              ALL  FIELDS
+              WITH VALUE #( ( %tky = rapbo-%tky ) )
+              RESULT DATA(rapbo_nodes).
+
+      " Read all associated fields
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+        ENTITY Node BY \_Field
+          ALL FIELDS
+        WITH VALUE #( FOR rba_node IN rapbo_nodes ( %tky = rba_node-%tky ) )
+        RESULT DATA(source_fields).
+
+      CHECK line_exists( rapbo_nodes[ IsRootNode = abap_true ] ).
+
+      SORT rapbo_nodes BY HierarchyDistanceFromRoot ASCENDING.
+
+      DATA(root_node) = rapbo_nodes[ IsRootNode = abap_true ].
+
+
+*DataSourceType   char(30)  Datasource Type
+*Column  BdefImplementationType   char(50)  Implementation type
+*Column  BindingType   char(30)  Binding type
+*Column  DraftEnabled  abap_boolean char(1)  Draft enabled
+*Column  EntityName  zdmo_rap_gen_entityname char(40)  Root Entity Name
+*Column  data_source_name   char(30)
+
+      IF rapbo-ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_semantic OR
+         rapbo-ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_uuid.
+        DATA(BdefImplementationType) = zdmo_cl_rap_node=>bdef_implementation_type-managed.
+      ELSE.
+        BdefImplementationType = zdmo_cl_rap_node=>bdef_implementation_type-unmanaged.
+      ENDIF.
+
+      "create BO and root node via action
+
+      MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+        ENTITY Project
+          EXECUTE createProjectAndRootNode  "  createBOandRootNode
+            FROM VALUE #( (
+            %cid = 'ROOT1'
+            %param-BdefImplementationType = BdefImplementationType
+            %param-BindingType = rapbo-BindingType
+            %param-DraftEnabled = rapbo-DraftEnabled
+            %param-entityname = root_node-EntityName
+            %param-data_source_name = root_node-DataSource
+            %param-DataSourceType = rapbo-DataSourceType
+            %param-package_name = selected_packagename
+            ) )
+               " check result
+        MAPPED   mapped
+        FAILED   failed
+        REPORTED reported.
+
+      CHECK mapped-project[] IS NOT INITIAL.
+
+
+      "get copied root node
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+                    ENTITY Project BY \_node
+                    ALL  FIELDS
+                    WITH VALUE #( ( %is_draft   = if_abap_behv=>mk-on
+                                    RapboUUID = mapped-project[ 1 ]-RapboUUID  ) )
+                    RESULT DATA(copied_root_nodes).
+
+      CHECK lines( copied_root_nodes ) = 1.
+
+      DATA(copied_root_node) = copied_root_nodes[ 1 ].
+
+      "set fields for copied header and root node
+
+      MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY Project
+      UPDATE FIELDS ( AddToManageBusinessConfig
+                      CustomizingTable
+                      MultiInlineEdit
+                      Suffix
+                      Prefix
+                      SkipActivation
+                      AddIViewBasic
+                      isExtensible
+                      "extensibilityElementSuffix
+                      )
+      WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on
+                      RapboUUID = mapped-project[ 1 ]-RapboUUID
+
+                      AddToManageBusinessConfig = rapbo-AddToManageBusinessConfig
+                      CustomizingTable = rapbo-CustomizingTable
+                      MultiInlineEdit = rapbo-MultiInlineEdit
+
+                      Suffix = rapbo-Suffix
+                      Prefix = rapbo-Prefix
+                      SkipActivation = rapbo-SkipActivation
+
+                      AddIViewBasic = rapbo-AddIViewBasic
+                      isExtensible = rapbo-isExtensible
+                      extensibilityElementSuffix = rapbo-extensibilityElementSuffix
+                      ) )
+
+       FAILED   DATA(failed_update_root_bo_node)
+       REPORTED DATA(reported_update_root_bo_node).
+
+      "in a second modify we set the field names according to the data from the source project
+      MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY Node
+      UPDATE FIELDS (
+*                      DataSource
+                      FieldNameCreatedAt
+                      FieldNameCreatedby
+                      FieldNameEtagMaster
+                      FieldNameLastChangedAt
+                      FieldNameLastChangedBy
+                      FieldNameLocLastChangedAt
+                      FieldNameObjectID
+                      FieldNameParentUUID
+                      FieldNameRootUUID
+                      FieldNameTotalEtag
+                      FieldNameUUID
+                      ExtensibilityElementSuffix
+                      )
+      WITH VALUE #( (
+                      NodeUUID = copied_root_node-NodeUUID
+                      %is_draft = if_abap_behv=>mk-on
+*                      DataSource = root_node-DataSource
+                      "check if the following fields have to be set using a seperate EML call
+                      FieldNameCreatedAt = root_node-FieldNameCreatedAt
+                      FieldNameCreatedby = root_node-FieldNameCreatedby
+                      FieldNameEtagMaster = root_node-FieldNameEtagMaster
+                      FieldNameLastChangedAt = root_node-FieldNameLastChangedAt
+                      FieldNameLastChangedBy = root_node-FieldNameLastChangedBy
+                      FieldNameLocLastChangedAt = root_node-FieldNameLocLastChangedAt
+                      FieldNameObjectID = root_node-FieldNameObjectID
+                      FieldNameParentUUID = root_node-FieldNameParentUUID
+                      FieldNameRootUUID = root_node-FieldNameRootUUID
+                      FieldNameTotalEtag = root_node-FieldNameTotalEtag
+                      FieldNameUUID = root_node-FieldNameUUID
+                      ExtensibilityElementSuffix = root_node-ExtensibilityElementSuffix
+                      ) )
+       FAILED   DATA(failed_update_root_bo_node2)
+       REPORTED DATA(reported_update_root_bo_node2).
+
+
+
+
+
+      "read copied project header data
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY Project
+      ALL FIELDS
+      WITH VALUE #( ( %is_draft        = if_abap_behv=>mk-on
+                      RapboUUID = mapped-project[ 1 ]-RapboUUID  ) )
+      RESULT DATA(copied_rapbos).
+
+      CHECK lines( copied_rapbos ) = 1.
+
+
+      "get created fields
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+                    ENTITY node
+                    BY \_field
+                    ALL  FIELDS
+                    WITH VALUE #( ( %is_draft   = if_abap_behv=>mk-on
+                                    NodeUUID    = copied_root_nodes[ 1 ]-NodeUUID  ) )
+                    RESULT DATA(new_fields).
+
+
+*  rapbo_node-EntityName
+      "When the project is marked as extensible tables of the source project have a dummy field.
+
+      LOOP AT new_fields INTO DATA(new_field).
+        IF line_exists( source_fields[ DbtableField = new_field-dbtablefield NodeUUID = root_node-NodeUUID  ] ).
+          update_field-FieldUUID = new_field-FieldUUID.
+          update_field-%is_draft = if_abap_behv=>mk-on.
+          update_field-CdsViewField = source_fields[ DbtableField = new_field-dbtablefield NodeUUID = root_node-NodeUUID  ]-CdsViewField.
+          APPEND update_field TO update_fields.
+        ENDIF.
+      ENDLOOP.
+
+
+
+      " loop at nodes of the source project beside the root node
+
+      LOOP AT rapbo_nodes INTO DATA(rapbo_node) WHERE IsRootNode = abap_false.
+        cid += 1.
+
+        "get copied rapbo nodes
+        READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+                      ENTITY Project BY \_node
+                      ALL  FIELDS
+                      WITH VALUE #( ( %is_draft   = if_abap_behv=>mk-on
+                                      RapboUUID = mapped-project[ 1 ]-RapboUUID  ) )
+                      RESULT DATA(copied_rapbo_nodes).
+
+        "get uuid of parent node
+        DATA(uuid_of_parent_node) = copied_rapbo_nodes[ EntityName = rapbo_node-ParentEntityName ]-NodeUUID.
+
+        MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+        ENTITY node
+          EXECUTE addChildNode
+            FROM VALUE #( (
+                                %tky = VALUE #(  %is_draft = if_abap_behv=>mk-on
+                                                  NodeUUID = uuid_of_parent_node )
+                                %param-entity_name = rapbo_node-EntityName
+                                %param-DataSourceName = rapbo_node-DataSource
+                                %param-DataSourceType = rapbo-DataSourceType
+            ) )
+
+        MAPPED   DATA(mapped_add_child)
+        FAILED   DATA(failed_add_child)
+        REPORTED DATA(reported_add_child).
+
+        "in a second modify we set the field names according to the data from the source project
+        MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+        ENTITY Node
+        UPDATE FIELDS (
+*                        DataSource
+                        FieldNameCreatedAt FieldNameCreatedby FieldNameEtagMaster FieldNameLastChangedAt FieldNameLastChangedBy
+                        FieldNameLocLastChangedAt FieldNameObjectID FieldNameParentUUID FieldNameRootUUID FieldNameTotalEtag
+                        FieldNameUUID
+                        extensibilityElementSuffix
+                        )
+        WITH VALUE #( (
+
+                                   NodeUUID = mapped_add_child-node[ 1 ]-NodeUUID
+                                   %is_draft = if_abap_behv=>mk-on
+*                                   DataSource = rapbo_node-DataSource
+                                   "check if the following fields have to be set using a seperate EML call
+                                   fieldnamecreatedat = rapbo_node-fieldnamecreatedat
+                                   fieldnamecreatedby = rapbo_node-fieldnamecreatedby
+                                   fieldnameetagmaster = rapbo_node-fieldnameetagmaster
+                                   fieldnamelastchangedat = rapbo_node-fieldnamelastchangedat
+                                   fieldnamelastchangedby = rapbo_node-fieldnamelastchangedby
+                                   fieldnameloclastchangedat = rapbo_node-fieldnameloclastchangedat
+                                   fieldnameobjectid = rapbo_node-fieldnameobjectid
+                                   fieldnameparentuuid = rapbo_node-fieldnameparentuuid
+                                   fieldnamerootuuid = rapbo_node-fieldnamerootuuid
+                                   fieldnametotaletag = rapbo_node-fieldnametotaletag
+                                   FieldNameUUID = rapbo_node-FieldNameUUID
+                                   extensibilityElementSuffix = rapbo_node-ExtensibilityElementSuffix
+
+                        ) )
+         FAILED   DATA(failed_update_child_bo_node2)
+         REPORTED DATA(reported_update_child_bo_node2).
+
+
+*        LOOP AT mapped_add_child-field INTO DATA(mapped_add_child_field).
+
+* ENTITY Project BY \_node
+*                      ALL  FIELDS
+*                      WITH VALUE #( ( %is_draft   = if_abap_behv=>mk-on
+*                                      RapboUUID = mapped-project[ 1 ]-RapboUUID  ) )
+*                      RESULT DATA(copied_rapbo_nodes).
+
+        "get created fields
+        READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+                      ENTITY node
+                      BY \_field
+                      ALL  FIELDS
+                      WITH VALUE #( ( %is_draft   = if_abap_behv=>mk-on
+                                      NodeUUID    = mapped_add_child-node[ 1 ]-NodeUUID  ) )
+                      RESULT new_fields.
+
+
+*  rapbo_node-EntityName
+
+        LOOP AT new_fields INTO new_field.
+          IF line_exists( source_fields[ DbtableField = new_field-dbtablefield NodeUUID = rapbo_node-NodeUUID  ] ).
+            update_field-FieldUUID = new_field-FieldUUID.
+            update_field-%is_draft = if_abap_behv=>mk-on.
+            update_field-CdsViewField = source_fields[ DbtableField = new_field-dbtablefield NodeUUID = rapbo_node-NodeUUID  ]-CdsViewField.
+            APPEND update_field TO update_fields.
+          ENDIF.
+        ENDLOOP.
+
+      ENDLOOP.
+
+      MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+              ENTITY Field
+              UPDATE FIELDS (
+                              CdsViewField
+                              )
+                            WITH
+                        update_fields
+                     FAILED   DATA(failed_update_child_bo_node3)
+                     REPORTED DATA(reported_update_child_bo_node3).
+
+      APPEND VALUE #(
+       "von der quelle hier im Schlüssel
+                       rapbouuid  = rapbo-RapboUUID "  mapped-rapgeneratorbo[ 1 ]-RapNodeUUID
+                       %is_draft = rapbo-%is_draft "  mapped-rapgeneratorbo[ 1 ]-%is_draft
+                       "hier steht was rauskommt
+                       "also mapping der alten auf neue keys
+                       %param = VALUE #( %is_draft = mapped-project[ 1 ]-%is_draft
+                                         %key      = mapped-project[ 1 ]-%key ) ) TO result.
+
+
+    ENDLOOP.
+
+
+    DATA(a) = mapped.
+
+
+
+
+
+
+
+
+
+
+  ENDMETHOD.
+
+  METHOD deleteProject.
+
+    TYPES: BEGIN OF ty_longtext,
+             msgv1(50),
+             msgv2(50),
+             msgv3(50),
+             msgv4(50),
+           END OF ty_longtext.
+    DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project.
+    DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project.
+
+
+
+    "check json string
+    "if this is not valid, raise an exception
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+          ENTITY Project
+*            FIELDS ( jsonstring abaplanguageversion boname )
+            ALL FIELDS
+            WITH CORRESPONDING #( keys )
+            RESULT DATA(rapbos).
+
+    "Do check
+    LOOP AT rapbos INTO DATA(rapbo).
+
+      SELECT SINGLE *  FROM ZDMO_R_RAPG_ProjectTP WHERE BoName = @rapbo-BoName
+                                                      INTO @DATA(raprootnode) .
+
+      SELECT SINGLE * FROM ZDMO_R_RAPG_NodeTP WHERE RapBoUUID = @raprootnode-RapBoUUID
+                                                     AND IsRootNode = @abap_true
+                                                     INTO @DATA(root_node_information).
+
+*
+*      DATA(filter_string) = to_upper( root_node_information-ServiceBinding && '%' ).
+*
+*      SELECT * FROM I_CustABAPObjDirectoryEntry WHERE ABAPObject LIKE @filter_string
+*                                                  AND ABAPObjectType = 'SIA6'
+*                                                 INTO TABLE @DATA(published_srvb_entries).
+
+      DATA on_prem_xco_lib  TYPE REF TO zdmo_cl_rap_xco_lib.
+      DATA xco_lib  TYPE REF TO zdmo_cl_rap_xco_lib.
+
+      on_prem_xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+      IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_true.
+        xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+      ELSE.
+        xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+      ENDIF.
+
+      IF xco_lib->get_service_binding( CONV sxco_srvb_object_name( root_node_information-ServiceBinding ) )->if_xco_ar_object~exists( ) = abap_true.
+        "service binding exists
+        IF xco_lib->service_binding_is_published( CONV sxco_srvb_object_name( root_node_information-ServiceBinding )  ).
+          "Service binding is published
+*          xco_lib->un_publish_service_binding( CONV sxco_srvb_object_name( root_node_information-ServiceBinding ) ) .
+
+*          IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_false
+**             OR  raprootnode-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v2_ui
+**             OR  raprootnode-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v2_web_api
+*             .
+*
+*            "only raise a message if we are in cloud or if odata v2 is used on prem
+*
+*            APPEND VALUE #( %tky = rapbo-%tky )
+*                   TO failed-project.
+*
+*            "Set message
+*            APPEND VALUE #( %tky = rapbo-%tky
+*                            %element-jsonstring = if_abap_behv=>mk-on
+*                            %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+*                                                number   = 073
+*                                                severity = if_abap_behv_message=>severity-error
+*                                                v1       =  | { root_node_information-ServiceBinding } |
+**                                            v2       =  msg->value-msgv2
+**                                            v3       =  msg->value-msgv3
+**                                            v4       =  msg->value-msgv4
+*                                                )
+*                           )
+*                   TO reported-project.
+*            RETURN.
+*          ENDIF.
+        ENDIF.
+      ENDIF.
+    ENDLOOP.
+
+
+    LOOP AT rapbos INTO rapbo.
+      "set a flag to check in the save sequence that a job is to be scheduled
+      update_line-BoIsDeleted = abap_true.
+      update_line-ApplJobLogHandle = ''.
+      update_line-%tky        = rapbo-%tky.
+      APPEND update_line TO update.
+    ENDLOOP.
+
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Project
+      UPDATE FIELDS (
+                      BoIsDeleted
+                      ApplJobLogHandle
+                      ) WITH update
+    REPORTED reported
+    FAILED failed
+    MAPPED mapped.
+
+    IF failed IS INITIAL.
+      "Read changed data for action result
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+        ENTITY Project
+          ALL FIELDS WITH
+          CORRESPONDING #( keys )
+        RESULT rapbos.
+      result = VALUE #( FOR rapbo2 IN rapbos ( %tky   = rapbo2-%tky
+                                               %param = rapbo2 ) ).
+    ENDIF.
+
+
+
+
+
+
+  ENDMETHOD.
+
+  METHOD generateProject.
+
+
+    TYPES: BEGIN OF ty_longtext,
+             msgv1(50),
+             msgv2(50),
+             msgv3(50),
+             msgv4(50),
+           END OF ty_longtext.
+
+    DATA: ls_longtext TYPE ty_longtext.
+
+    DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project.
+    DATA update_line TYPE STRUCTURE FOR UPDATE zDMO_R_RAPG_ProjectTP\\Project .
+
+
+
+    "check json string
+    "if this is not valid, raise an exception
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+          ENTITY Project
+*            FIELDS ( jsonstring abaplanguageversion boname )
+            ALL FIELDS
+            WITH CORRESPONDING #( keys )
+            RESULT DATA(rapbos).
+
+    "Do check
+    LOOP AT rapbos INTO DATA(rapbo).
+
+      TRY.
+
+          IF rapbo-abaplanguageversion = zdmo_cl_rap_node=>abap_language_version-standard.
+            DATA(check_rapbo_on_prem) =  zdmo_cl_rap_generator=>create_for_on_prem_development( rapbo-jsonstring ).
+          ELSE.
+            DATA(check_rapbo_cloud) =  zdmo_cl_rap_generator=>create_for_cloud_development( rapbo-jsonstring ).
+          ENDIF.
+
+          "set a flag to check in the save sequence that a job is to be scheduled
+          update_line-BoIsGenerated = abap_true.
+          update_line-%tky      = rapbo-%tky.
+          APPEND update_line TO update.
+
+
+        CATCH zdmo_cx_rap_generator INTO DATA(rapobo_exception).
+          DATA(exception_text) = rapobo_exception->get_text(  ).
+*          DATA(msg) = rapobo_exception->get_message(  ).
+          ls_longtext = exception_text.
+          "Set failed keys
+          APPEND VALUE #( %tky = rapbo-%tky )
+                 TO failed-project.
+
+          "Set message
+          APPEND VALUE #( %tky = rapbo-%tky
+                          %element-jsonstring = if_abap_behv=>mk-on
+                          %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                              number   = 016
+                                              severity = if_abap_behv_message=>severity-error
+                                              v1       =  ls_longtext-msgv1 "msg->value-msgv1
+                                              v2       =  ls_longtext-msgv2 " msg->value-msgv2
+                                              v3       =  ls_longtext-msgv3 " msg->value-msgv3
+                                              v4       =  ls_longtext-msgv4 " msg->value-msgv4
+                                              )
+                         )
+                 TO reported-project.
+          RETURN.
+      ENDTRY.
+    ENDLOOP.
+
+
+*    LOOP AT rapbos INTO rapbo.
+*      "set a flag to check in the save sequence that a job is to be scheduled
+*      update_line-BoIsGenerated = abap_true.
+*      update_line-%tky      = rapbo-%tky.
+*      APPEND update_line TO update.
+*    ENDLOOP.
+
+
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Project
+      UPDATE FIELDS (
+                      BoIsGenerated
+                      ) WITH update
+    REPORTED reported
+    FAILED failed
+    MAPPED mapped.
+
+    IF failed IS INITIAL.
+      "Read changed data for action result
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+        ENTITY Project
+          ALL FIELDS WITH
+          CORRESPONDING #( keys )
+        RESULT rapbos.
+      result = VALUE #( FOR rapbo2 IN rapbos ( %tky   = rapbo2-%tky
+                                               %param = rapbo2 ) ).
+    ENDIF.
+
+
+
+  ENDMETHOD.
+
+  METHOD SetRepositoryObjectNames.
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Project
+    ALL FIELDS
+    WITH CORRESPONDING #( keys )
+    RESULT DATA(rapbos).
+
+    LOOP AT rapbos INTO DATA(rapbo).
+      CHECK rapbo-packagename IS NOT INITIAL.
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+              ENTITY Project BY \_Node
+              ALL  FIELDS
+              WITH VALUE #( ( %tky = rapbo-%tky ) )
+              RESULT DATA(rapbo_nodes).
+
+      LOOP AT rapbo_nodes INTO DATA(rapbo_node).
+        MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+              ENTITY Node
+                EXECUTE SetRepositoryObjectNames
+                  FROM VALUE #( ( %tky = rapbo_node-%tky ) ).
+      ENDLOOP.
+
+    ENDLOOP.
+
+
+
+  ENDMETHOD.
+
+  METHOD createJsonString.
+
+    DATA json_string_builder TYPE REF TO zdmo_cl_rap_gen_build_json_2.
+    DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project.
+    DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project .
+
+    DATA rapgen_nodes  TYPE zdmo_cl_rap_gen_build_json_2=>tt_rapgen_node .
+    DATA rapgen_projects  TYPE zdmo_cl_rap_gen_build_json_2=>tt_rapgen_bo .
+    DATA rapgen_fields TYPE zdmo_cl_rap_gen_build_json_2=>tt_rapgen_field.
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+       ENTITY Project
+       ALL FIELDS WITH CORRESPONDING #( keys )
+       RESULT DATA(Projects).
+
+    LOOP AT projects INTO DATA(project).
+
+      " Read all associated nodes
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+        ENTITY Project BY \_Node
+          ALL FIELDS
+        WITH VALUE #( ( %tky = project-%tky ) )
+        RESULT DATA(nodes).
+
+      " Read all associated fields
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+        ENTITY Node BY \_Field
+          ALL FIELDS
+        WITH VALUE #( FOR rba_node IN nodes ( %tky = rba_node-%tky ) )
+        RESULT DATA(fields).
+
+      MOVE-CORRESPONDING Projects TO rapgen_projects.
+      MOVE-CORRESPONDING Nodes TO rapgen_nodes.
+      MOVE-CORRESPONDING Fields TO rapgen_fields.
+
+      json_string_builder = NEW zdmo_cl_rap_gen_build_json_2(
+        iv_bo_uuid     = project-%tky-RapBoUUID
+        it_rapgen_bo   = rapgen_projects
+        it_rapgen_node = rapgen_nodes
+        it_rapgen_field = rapgen_fields
+      ).
+
+      DATA(root_node)      =   rapgen_nodes[ isrootnode = abap_true RapBoUUID  = project-%tky-rapbouuid  ].
+
+      update_line-jsonstring  = json_string_builder->create_json(  ).
+      update_line-%tky      = project-%tky.
+      APPEND update_line TO update.
+
+    ENDLOOP.
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+       ENTITY Project
+       UPDATE FIELDS (
+                jsonstring
+                ) WITH update
+       REPORTED DATA(update_reported).
+
+    reported = CORRESPONDING #( DEEP update_reported ).
+
+  ENDMETHOD.
+
+  METHOD generated_objects_are_deleted.
+
+    DATA repository_objects_exist TYPE abap_bool VALUE abap_false.
+
+    DATA rap_generator_project TYPE ZDMO_R_RAPG_ProjectTP.
+    DATA rap_generator_projects TYPE STANDARD TABLE OF ZDMO_R_RAPG_ProjectTP.
+
+    LOOP AT keys INTO DATA(key).
+      SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE RapBoUUID = @key-RapboUUID
+      INTO @rap_generator_project.
+      APPEND rap_generator_project TO rap_generator_projects.
+    ENDLOOP.
+
+    LOOP AT rap_generator_projects INTO rap_generator_project.
+
+      repository_objects_exist = rap_gen_project_objects_exist( rap_generator_project ).
+
+      IF repository_objects_exist = abap_true.
+        APPEND VALUE #(  rapbouuid  = rap_generator_project-RapboUUID )
+          TO failed-project.
+        APPEND VALUE #( rapbouuid = rap_generator_project-RapboUUID
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                            number   = 077
+                                            severity = if_abap_behv_message=>severity-error
+                                            v1       = |{ rap_generator_project-BoName }| ) )
+               TO reported-project.
+      ENDIF.
+
+
+    ENDLOOP.
+
+
+  ENDMETHOD.
+
+  METHOD rap_gen_project_objects_exist.
+
+    "@todo - duplicate code ???
+
+    DATA generated_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects.
+    DATA generated_repository_object TYPE zdmo_cl_rap_generator=>t_generated_repository_object.
+
+    DATA on_prem_xco_lib  TYPE REF TO zdmo_cl_rap_xco_lib.
+    DATA xco_lib  TYPE REF TO zdmo_cl_rap_xco_lib.
+
+    on_prem_xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+    IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_true.
+      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+
+    SELECT * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @i_rap_generator_project-RapboUUID
+                                                        INTO TABLE @DATA(rapbo_nodes).
+
+    LOOP AT rapbo_nodes INTO DATA(rapbo_node).
+      "get repository object names and types
+
+      CLEAR generated_repository_objects.
+
+      IF rapbo_node-ServiceBinding IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-ServiceBinding.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-ServiceDefinition IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-ServiceDefinition.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_definition.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-CdsRView IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-CdsRView.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r.
+        APPEND generated_repository_object TO generated_repository_objects.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_r.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-CdsPView IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-CdsPView.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_p.
+        APPEND generated_repository_object TO generated_repository_objects.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_p.
+        APPEND generated_repository_object TO generated_repository_objects.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-meta_data_extension.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-CdsiView IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-CdsiView.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_i.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-ControlStructure IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-ControlStructure.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-control_structure.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-BehaviorImplementationClass IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-BehaviorImplementationClass.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-behavior_implementation.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-DraftTableName IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-DraftTableName.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-draft_table.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      LOOP AT generated_repository_objects INTO generated_repository_object.
+
+        CASE generated_repository_object-object_type.
+
+          WHEN zdmo_cl_rap_node=>root_node_object_types-service_binding.
+            IF xco_lib->get_service_binding( CONV sxco_srvb_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>root_node_object_types-service_definition.
+            IF xco_lib->get_service_definition( CONV sxco_srvd_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r. "this checks also for behavior projection 'BDEF'
+            IF xco_lib->get_behavior_definition( CONV sxco_cds_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>node_object_types-behavior_implementation. "checks also for query implementation 'CLAS'
+            IF xco_lib->get_class( CONV  sxco_ao_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>node_object_types-cds_view_r. "this checks also for i- and p-views as well as for custom entities
+            IF xco_lib->get_view( CONV  sxco_cds_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>node_object_types-control_structure.
+            IF xco_lib->get_structure( CONV  sxco_ad_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>node_object_types-draft_table.
+            IF xco_lib->get_database_table( CONV  sxco_dbt_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN  zdmo_cl_rap_node=>node_object_types-meta_data_extension.
+            IF xco_lib->get_metadata_extension( CONV  sxco_cds_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN OTHERS.
+            "do nothing
+        ENDCASE.
+
+      ENDLOOP.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+
+  METHOD mandatory_fields_check.
+
+    DATA permission_request TYPE STRUCTURE FOR PERMISSIONS REQUEST ZDMO_C_RAPG_ProjectTP.
+    DATA reported_rapgeneratorbo_line LIKE LINE OF reported-project.
+
+    "check permissions of the following fields
+    permission_request-%field-PackageName = if_abap_behv=>mk-on.
+*    permission_request-%field-extensibilityElementSuffix = if_abap_behv=>mk-on.
+
+    " Get current field values
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Project
+      ALL FIELDS
+      WITH CORRESPONDING #( keys )
+      RESULT DATA(rap_generator_projects).
+
+    "Do check
+    LOOP AT rap_generator_projects INTO DATA(rap_generator_project).
+
+      GET PERMISSIONS ONLY INSTANCE ENTITY ZDMO_C_RAPG_ProjectTP
+                FROM VALUE #( ( RapBoUUID = rap_generator_project-RapBoUUID ) )
+                REQUEST permission_request
+                RESULT DATA(permission_result)
+                FAILED DATA(failed_permission_result)
+                REPORTED DATA(reported_permission_result).
+
+      IF permission_result-global-%field-PackageName = if_abap_behv=>fc-f-mandatory
+               AND rap_generator_project-PackageName IS INITIAL.
+
+        APPEND VALUE #( %tky = rap_generator_project-%tky ) TO failed-project.
+
+        CLEAR reported_rapgeneratorbo_line.
+        reported_rapgeneratorbo_line-%tky = rap_generator_project-%tky.
+        reported_rapgeneratorbo_line-%element-packagename = if_abap_behv=>mk-on.
+        reported_rapgeneratorbo_line-%msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                                         number   = 071
+                                                         severity = if_abap_behv_message=>severity-error
+                                                         v1       = | Package name |
+                                                         v2       = |{ rap_generator_project-BoName }| ).
+        APPEND reported_rapgeneratorbo_line  TO reported-project.
+
+      ENDIF.
+
+*      IF permission_result-instances[ RapBoUUID = rap_generator_project-RapBoUUID ]-%field-extensibilityElementSuffix = if_abap_behv=>fc-f-mandatory
+*               AND rap_generator_project-extensibilityElementSuffix IS INITIAL.
+*
+*        APPEND VALUE #( %tky = rap_generator_project-%tky ) TO failed-project.
+*
+*        CLEAR reported_rapgeneratorbo_line.
+*        reported_rapgeneratorbo_line-%tky = rap_generator_project-%tky.
+*        reported_rapgeneratorbo_line-%element-packagename = if_abap_behv=>mk-on.
+*        reported_rapgeneratorbo_line-%msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+*                                                         number   = 071
+*                                                         severity = if_abap_behv_message=>severity-error
+*                                                         v1       = | Extensibility Suffix |
+*                                                         v2       = |{ rap_generator_project-BoName }| ).
+*        APPEND reported_rapgeneratorbo_line  TO reported-project.
+*
+*      ENDIF.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+
+  METHOD is_customizing_table.
+
+    " check if
+    " - all data sources are tables of delievery class C
+    " - is of implementation type managed_semantic with
+    "   binding_type odata_V4_UI and is draft enabled
+
+    "Get values of fields
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY project
+      ALL FIELDS
+      WITH CORRESPONDING #( keys )
+      RESULT DATA(projects).
+
+    DATA on_prem_xco_lib  TYPE REF TO zdmo_cl_rap_xco_lib.
+    DATA xco_lib  TYPE REF TO zdmo_cl_rap_xco_lib.
+
+    on_prem_xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+    IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_true.
+      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+
+
+    LOOP AT projects INTO DATA(project).
+
+      IF project-CustomizingTable = abap_true AND
+
+        ( project-ImplementationType <> zdmo_cl_rap_node=>implementation_type-managed_semantic OR
+           project-BindingType <> zdmo_cl_rap_node=>binding_type_name-odata_v4_ui OR
+           project-DraftEnabled = abap_false ).
+
+        APPEND VALUE #( %tky = project-%tky )
+        TO failed-project.
+        APPEND VALUE #( %tky = project-%tky
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                            number   = 059
+                                            severity = if_abap_behv_message=>severity-error
+                                            v1       = |{ project-BoName }| ) )
+               TO reported-project.
+
+        "check if all tables are customizing tables
+      ELSEIF project-CustomizingTable = abap_true
+      AND
+        ( project-ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_semantic OR
+          project-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui OR
+          project-DraftEnabled = abap_true )
+      .
+
+        " Read all associated nodes
+        READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+          ENTITY Project BY \_Node
+            ALL FIELDS
+          WITH VALUE #( ( %tky = project-%tky ) )
+          RESULT DATA(nodes).
+
+        LOOP AT nodes INTO DATA(node).
+
+          DATA(table_delivery_class) = xco_lib->get_database_table( CONV #( node-DataSource ) )->content(  )->get(  )-delivery_class->value.
+
+          IF table_delivery_class <> 'C'.
+
+            APPEND VALUE #( %tky = project-%tky )
+            TO failed-project.
+            APPEND VALUE #( %tky = project-%tky
+                            %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                                number   = 060
+                                                severity = if_abap_behv_message=>severity-error
+                                                v1       = |{ node-DataSource }|
+                                                v2       = |{ table_delivery_class }| ) )
+                   TO reported-project.
+
+            RETURN.
+
+          ENDIF.
+
+        ENDLOOP.
+
+      ENDIF.
+
+    ENDLOOP.
+
+
+  ENDMETHOD.
+
+  METHOD check_for_allowed_combinations.
+
+    "Get values of fields
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Project
+      ALL FIELDS
+      WITH CORRESPONDING #( keys )
+      RESULT DATA(projects).
+
+    LOOP AT projects INTO DATA(entity).
+
+      "managed scenarios should use tables as data sources
+      "scenarios where CDS views are used as datasources are scenarios
+      "where one reads from SAP CDS views and one uses API's such as BAPI's
+      "to store the changes
+
+
+      IF entity-DataSourceType = zdmo_cl_rap_node=>data_source_types-cds_view AND
+         entity-ImplementationType <> zdmo_cl_rap_node=>implementation_type-unmanaged_semantic .
+        APPEND VALUE #( %tky = entity-%tky )
+               TO failed-project.
+        APPEND VALUE #( %tky = entity-%tky
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                            number   = 080
+                                            severity = if_abap_behv_message=>severity-error
+                                            v1       = |{ entity-ImplementationType }|
+                                            v2       = |{ zdmo_cl_rap_node=>implementation_type-unmanaged_semantic }|
+
+                                             ) )
+               TO reported-project.
+      ENDIF.
+
+
+      "custom entities (that are created when abstract entities are used as a data source) do not support draft
+      IF entity-DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity AND
+         entity-DraftEnabled = abap_true .
+        APPEND VALUE #( %tky = entity-%tky )
+               TO failed-project.
+        APPEND VALUE #( %tky = entity-%tky
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                            number   = 063
+                                            severity = if_abap_behv_message=>severity-error
+                                            v1       = |{ entity-BoName }| ) )
+               TO reported-project.
+      ENDIF.
+
+      "custom entities = unmanaged queries do only support an unmanaged transactional implementation
+
+      IF entity-DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity AND
+         entity-ImplementationType <> zdmo_cl_rap_node=>implementation_type-unmanaged_semantic.
+        APPEND VALUE #( %tky = entity-%tky )
+               TO failed-project.
+        APPEND VALUE #( %tky = entity-%tky
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                            number   = 079
+                                            severity = if_abap_behv_message=>severity-error
+                                            v1       = |{ entity-ImplementationType }|
+                                            v2       = |{ zdmo_cl_rap_node=>implementation_type-unmanaged_semantic }|
+
+                                            ) )
+               TO reported-project.
+      ENDIF.
+
+      "OData V4 as UI service binding in only allowed when draft is used
+      IF   entity-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui AND
+           entity-DraftEnabled = abap_false .
+        APPEND VALUE #( %tky = entity-%tky )
+               TO failed-project.
+        APPEND VALUE #( %tky = entity-%tky
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                            number   = 078
+                                            severity = if_abap_behv_message=>severity-error
+                                            v1       = |{ entity-BoName }| ) )
+               TO reported-project.
+      ENDIF.
+
+      "For customizing tables are required as data source
+      "the same is true when multi inline edit shall be used
+
+      IF ( entity-MultiInlineEdit = abap_true OR entity-CustomizingTable = abap_true ) AND
+           entity-DataSourceType <> zdmo_cl_rap_node=>data_source_types-table .
+        APPEND VALUE #( %tky = entity-%tky )
+               TO failed-project.
+        APPEND VALUE #( %tky = entity-%tky
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                            number   = 067
+                                            severity = if_abap_behv_message=>severity-error
+                                            v1       = |{ entity-DataSourceType }| ) )
+               TO reported-project.
+      ENDIF.
+
+      IF ( entity-MultiInlineEdit = abap_true OR entity-CustomizingTable = abap_true ) AND
+           entity-ImplementationType <> zdmo_cl_rap_node=>implementation_type-managed_semantic .
+        APPEND VALUE #( %tky = entity-%tky )
+               TO failed-project.
+        APPEND VALUE #( %tky = entity-%tky
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                            number   = 068
+                                            severity = if_abap_behv_message=>severity-error
+                                            v1       = |{ entity-ImplementationType }| ) )
+               TO reported-project.
+      ENDIF.
+
+      IF entity-MultiInlineEdit = abap_true AND
+       ( entity-BindingType <> zdmo_cl_rap_node=>binding_type_name-odata_v4_ui OR
+         entity-DraftEnabled = abap_false ) .
+        APPEND VALUE #( %tky = entity-%tky )
+               TO failed-project.
+        APPEND VALUE #( %tky = entity-%tky
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                            number   = 058
+                                            severity = if_abap_behv_message=>severity-error
+                                            v1       = |{ entity-BoName }| ) )
+               TO reported-project.
+      ENDIF.
+
+      IF entity-CustomizingTable = abap_true AND
+         ( entity-BindingType <> zdmo_cl_rap_node=>binding_type_name-odata_v4_ui OR
+           entity-DraftEnabled = abap_false ) .
+        APPEND VALUE #( %tky = entity-%tky )
+               TO failed-project.
+        APPEND VALUE #( %tky = entity-%tky
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                            number   = 059
+                                            severity = if_abap_behv_message=>severity-error
+                                            v1       = |{ entity-BoName }| ) )
+               TO reported-project.
+      ENDIF.
+
+
+
+
+    ENDLOOP.
+
+  ENDMETHOD.
+
+ENDCLASS.
+
+CLASS lhc_Log DEFINITION INHERITING FROM cl_abap_behavior_handler.
+  PRIVATE SECTION.
+
+    METHODS CalculateLogItemNumber FOR DETERMINE ON SAVE
+      IMPORTING keys FOR Log~CalculateLogItemNumber.
+
+ENDCLASS.
+
+CLASS lhc_Log IMPLEMENTATION.
+
+  METHOD CalculateLogItemNumber.
+  ENDMETHOD.
+
+ENDCLASS.
+
+CLASS lhc_Node DEFINITION INHERITING FROM cl_abap_behavior_handler.
+  PRIVATE SECTION.
+
+    METHODS get_instance_features FOR INSTANCE FEATURES
+      IMPORTING keys REQUEST requested_features FOR Node RESULT result.
+
+*    METHODS get_global_features FOR GLOBAL FEATURES
+*      IMPORTING REQUEST requested_features FOR Node RESULT result.
+
+    METHODS get_global_authorizations FOR GLOBAL AUTHORIZATION
+      IMPORTING REQUEST requested_authorizations FOR Node RESULT result.
+
+*    METHODS addChildNode FOR MODIFY
+*      IMPORTING keys FOR ACTION Node~addChildNode RESULT result.
+
+*    METHODS createRootNode FOR MODIFY
+*      IMPORTING keys FOR ACTION Node~createRootNode RESULT result.
+
+    METHODS CalculateEntityName FOR DETERMINE ON SAVE
+      IMPORTING keys FOR Node~CalculateEntityName.
+    METHODS SetRepositoryObjectNames FOR MODIFY
+      IMPORTING keys FOR ACTION Node~SetRepositoryObjectNames.
+
+    METHODS SetRepositoryObjectNames_det FOR DETERMINE ON MODIFY
+      IMPORTING keys FOR Node~SetRepositoryObjectNames_det.
+    METHODS addChildNode FOR MODIFY
+      IMPORTING keys   FOR ACTION Node~addChildNode
+      RESULT    result.
+    METHODS addChildDataSourceAbsEntity FOR MODIFY
+      IMPORTING keys FOR ACTION Node~addChildDataSourceAbsEntity
+*      RESULT    result
+      .
+
+    METHODS addChildDataSourceCDSview FOR MODIFY
+      IMPORTING keys FOR ACTION Node~addChildDataSourceCDSview
+*      RESULT    result
+      .
+
+    METHODS addChildDataSourceTable FOR MODIFY
+      IMPORTING keys FOR ACTION Node~addChildDataSourceTable
+*      RESULT    result
+      .
+    METHODS SetFieldNames FOR DETERMINE ON MODIFY
+      IMPORTING keys FOR Node~SetFieldNames.
+    METHODS mandatory_fields_check FOR VALIDATE ON SAVE
+      IMPORTING keys FOR Node~mandatory_fields_check.
+
+*    METHODS SetRepositoryObjectNames FOR MODIFY
+*      IMPORTING keys FOR ACTION Node~SetRepositoryObjectNames.
+
+ENDCLASS.
+
+CLASS lhc_Node IMPLEMENTATION.
+
+  METHOD get_instance_features.
+
+
+    "read all child instances
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY Node
+        ALL FIELDS
+*        (  entityname isrootnode viewtypevalue hierarchydistancefromroot )
+        WITH CORRESPONDING #( keys )
+      RESULT DATA(rapbo_nodes).
+
+    "read all links from child instances to the corresponding parent entity
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY Node BY \_Project
+        FROM CORRESPONDING #( rapbo_nodes )
+      LINK DATA(rapbo_nodes_links).
+
+    "read all parent entities of the child entities
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Node BY \_Project
+      ALL FIELDS
+*              ( AddIViewBasic
+*               implementationtype datasourcetype
+*               namespace prefix suffix draftenabled )
+      WITH CORRESPONDING #( keys )
+      RESULT DATA(rapbos).
+
+    LOOP AT rapbo_nodes INTO DATA(rapbo_node).
+
+      "use link data to retrieve the data of the parent entity of the currently selected child entity
+      DATA(rapbo) = rapbos[  rapbouuid = rapbo_nodes_links[ source-nodeuuid = rapbo_node-nodeuuid ]-target-rapbouuid ].
+
+      APPEND VALUE #( %tky                   = rapbo_node-%tky
+
+                      %action-addchilddatasourcetable      = COND #( WHEN ( rapbo-%is_draft = if_abap_behv=>mk-on
+                                                                      AND rapbo-DataSourceType = zdmo_cl_rap_node=>data_source_types-table )
+                                              THEN if_abap_behv=>fc-o-enabled
+                                              ELSE if_abap_behv=>fc-o-disabled )
+
+                      %action-addchilddatasourcecdsview      = COND #( WHEN ( rapbo-%is_draft = if_abap_behv=>mk-on
+                                                                      AND rapbo-DataSourceType = zdmo_cl_rap_node=>data_source_types-cds_view )
+                                              THEN if_abap_behv=>fc-o-enabled
+                                              ELSE if_abap_behv=>fc-o-disabled )
+
+                      %action-addchilddatasourceAbsEntity      = COND #( WHEN ( rapbo-%is_draft = if_abap_behv=>mk-on
+                                                                      AND rapbo-DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity )
+                                              THEN if_abap_behv=>fc-o-enabled
+                                              ELSE if_abap_behv=>fc-o-disabled )
+
+
+                              %field-fieldnameuuid         = COND #( WHEN rapbo-implementationtype = zdmo_cl_rap_node=>implementation_type-managed_uuid
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                              %field-fieldnamerootuuid     = COND #( WHEN ( rapbo-implementationtype = zdmo_cl_rap_node=>implementation_type-managed_uuid
+                                                                      AND rapbo_node-hierarchydistancefromroot > 1 )
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-fieldnameparentuuid    = COND #( WHEN ( rapbo-implementationtype = zdmo_cl_rap_node=>implementation_type-managed_uuid
+                                                                      AND  rapbo_node-hierarchydistancefromroot > 0 )
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-controlstructure       = COND #( WHEN rapbo-implementationtype = zdmo_cl_rap_node=>implementation_type-unmanaged_semantic
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-drafttablename         = COND #( WHEN rapbo-draftenabled = abap_true
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-CdsIViewBasic           = COND #( WHEN rapbo-AddIViewBasic = abap_true
+*                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                                THEN if_abap_behv=>fc-f-unrestricted
+                                                                ELSE if_abap_behv=>fc-f-read_only )
+
+
+                              %field-queryimplementationclass = COND #( WHEN rapbo_node-viewtypevalue = xco_cp_data_definition=>type->abstract_entity->value OR
+                                                                             rapbo_node-viewtypevalue = xco_cp_data_definition=>type->custom_entity->value
+                                                                        THEN if_abap_behv=>fc-f-mandatory
+                                                                        ELSE if_abap_behv=>fc-f-read_only
+                                                                               )
+
+                             %field-fieldnameetagmaster        = COND #( WHEN rapbo_node-isrootnode = abap_true
+                                                                         THEN if_abap_behv=>fc-f-mandatory
+                                                                         ELSE if_abap_behv=>fc-f-unrestricted )
+
+                             "fields needed for root entities
+
+                             %field-servicebinding          = COND #( WHEN rapbo_node-isrootnode = abap_true
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-servicedefinition      = COND #( WHEN rapbo_node-isrootnode = abap_true
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-fieldnametotaletag      = COND #( WHEN ( rapbo_node-isrootnode = abap_true AND rapbo-draftenabled = abap_true )
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                           "additional administrative fields that can be annotated for a root node
+
+                             %field-fieldnamecreatedat      = COND #( WHEN rapbo_node-isrootnode = abap_true
+                                                               THEN if_abap_behv=>fc-f-unrestricted
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-fieldnamecreatedby      = COND #( WHEN rapbo_node-isrootnode = abap_true
+                                                               THEN if_abap_behv=>fc-f-unrestricted
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-fieldnamelastchangedby      = COND #( WHEN rapbo_node-isrootnode = abap_true
+                                                               THEN if_abap_behv=>fc-f-unrestricted
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-fieldnamelastchangedat      = COND #( WHEN rapbo_node-isrootnode = abap_true
+                                                               THEN if_abap_behv=>fc-f-unrestricted
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+"fields needed for extensible RAP BOs
+                             %field-extensibilityelementsuffix  = COND #( WHEN rapbo-isExtensible = abap_true
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-extensioninclude    = COND #( WHEN rapbo-isExtensible = abap_true
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+                             %field-extensionincludeview   = COND #( WHEN rapbo-isExtensible = abap_true
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+                             %field-draftqueryview   = COND #( WHEN rapbo-isExtensible = abap_true
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+"fields to store SAPObjectType and SAPObjectNodeTypes
+
+                             %field-sapobjecttype      = COND #( WHEN rapbo-AddSAPObjectType = abap_true
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+                             %field-sapobjectnodetype      = COND #( WHEN rapbo-AddSAPObjectType = abap_true
+                                                               THEN if_abap_behv=>fc-f-mandatory
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+
+                            ) TO result.
+    ENDLOOP.
+
+  ENDMETHOD.
+
+*  METHOD get_global_features.
+*  ENDMETHOD.
+
+  METHOD get_global_authorizations.
+  ENDMETHOD.
+
+
+
+  METHOD CalculateEntityName.
+  ENDMETHOD.
+
+
+  METHOD SetRepositoryObjectNames.
+    DATA my_node TYPE REF TO ZDMO_cl_rap_node.
+    DATA root_node TYPE REF TO ZDMO_cl_rap_node.
+
+
+    DATA update_bo TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project.
+    DATA update_bo_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project .
+
+    DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node.
+    DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node .
+
+    DATA draft_keys TYPE TABLE FOR DETERMINATION zDMO_R_RAPG_ProjectTP\\Node~SetRepositoryObjectNames_det."  rapgeneratorbonode~setrepositoryobjectnames.
+
+
+* todo check why we only use draft keys here
+* when the action is not enabled in non draft this would not be necessary
+
+    draft_keys = VALUE #( FOR draft_key IN keys  WHERE (   %is_draft = if_abap_behv=>mk-on )
+    (
+      %is_draft  = draft_key-%is_draft
+     nodeuuid = draft_key-nodeuuid
+     "Component Groups
+     %key  = draft_key-%key
+     %tky  = draft_key-%tky
+     %pky  = draft_key-%pky
+     ) ) .
+
+    CHECK draft_keys IS NOT INITIAL.
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Node BY \_Project
+    ALL FIELDS
+    WITH CORRESPONDING #( keys )
+    RESULT DATA(rapbos).
+
+*
+*    " Process all affected RAPBos. Read respective nodes,
+*    " determine the implementation type of the RAP BO
+*
+    LOOP AT rapbos INTO DATA(rapbo).
+
+      DATA my_xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib.
+
+      IF rapbo-abaplanguageversion = ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development.
+        my_xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib(  ).
+      ELSE.
+        my_xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ) .
+      ENDIF.
+
+      CLEAR update_bo_line.
+
+      " read a dummy field
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+        ENTITY Project BY \_Node
+         ALL FIELDS "( entityname  cdsiview  cdspview   )
+        WITH VALUE #( ( %tky = rapbo-%tky ) )
+        RESULT DATA(rapbo_nodes).
+
+      update_bo_line-%tky      = rapbo-%tky.
+
+      "loop will start with the root node
+      SORT rapbo_nodes BY hierarchydistancefromroot ASCENDING.
+
+      root_node = NEW ZDMO_cl_rap_node(  ).
+
+      root_node->set_is_root_node(  ).
+      root_node->set_xco_lib( my_xco_lib ).
+      root_node->set_draft_enabled( rapbo-draftenabled ).
+      root_node->set_prefix( rapbo-prefix ).
+      root_node->set_suffix( rapbo-suffix ).
+      root_node->set_namespace( CONV #( rapbo-namespace ) ).
+      root_node->set_binding_type( CONV #( rapbo-bindingtype ) ).
+      root_node->set_implementation_type( CONV #( rapbo-implementationtype ) ).
+      root_node->set_data_source_type( CONV #( rapbo-datasourcetype ) ).
+      root_node->set_name_sap_object_type(  rapbo-SAPObjectType  ).
+
+*CATCH zdmo_cx_rap_generator.
+
+
+      LOOP AT rapbo_nodes INTO DATA(rapbo_node).
+
+        CHECK rapbo_node-entityname IS NOT INITIAL AND
+              rapbo-namespace IS NOT INITIAL .
+*              AND
+*              rapbo_node-hierarchydescendantcount > 0.  "node has child nodes
+
+        CLEAR update_line.
+        update_line-%tky      = rapbo_node-%tky.
+
+        IF line_exists( rapbo_nodes[ nodeuuid = rapbo_node-parentuuid ] ).
+          update_line-parententityname = rapbo_nodes[ nodeuuid = rapbo_node-parentuuid ]-entityname.
+        ENDIF.
+
+
+        TRY.
+
+            IF rapbo_node-isrootnode = abap_true.
+
+              my_node = root_node.
+              my_node->set_entity_name( CONV #( rapbo_node-entityname ) ).
+
+              my_node->set_name_service_definition(  ).
+              my_node->set_name_service_binding(  ).
+
+              IF rapbo-AddSAPObjectType = abap_true.
+                my_node->set_name_sap_object_type(  ).
+                update_line-SAPObjectType = my_node->rap_root_node_objects-sap_object_type.
+              ELSE.
+                update_line-SAPObjectType  = ''.
+              ENDIF.
+
+              update_line-servicebinding = my_node->rap_root_node_objects-service_binding.
+              update_line-servicedefinition = my_node->rap_root_node_objects-service_definition.
+
+            ELSE.
+
+              "value must be explictly set to ''.
+              "Because if fields are initial their content is not updated via EML
+
+              update_line-servicebinding = ''.
+              update_line-servicedefinition = ''.
+
+              CASE rapbo_node-hierarchydistancefromroot.
+                WHEN 1.
+                  my_node = root_node->add_child( ).
+                  my_node->set_entity_name( CONV #( rapbo_node-entityname ) ).
+                WHEN OTHERS.
+                  LOOP AT root_node->all_childnodes INTO DATA(child_node).
+                    IF child_node->entityname = update_line-parententityname.
+                      my_node = child_node->add_child( ).
+                      my_node->set_entity_name( CONV #( rapbo_node-entityname ) ).
+                    ENDIF.
+                  ENDLOOP.
+              ENDCASE.
+            ENDIF.
+
+            IF rapbo-draftenabled = abap_true.
+              my_node->set_name_draft_table(  ).
+              update_line-drafttablename   = my_node->draft_table_name.
+            ELSE.
+              update_line-drafttablename = ''.
+            ENDIF.
+
+            IF rapbo-AddIViewBasic = abap_true.
+              my_node->set_name_cds_i_view_basic(  ).
+              update_line-CdsIViewBasic   = my_node->rap_node_objects-cds_view_i_basic.
+            ELSE.
+              update_line-CdsIViewBasic  = ''.
+            ENDIF.
+
+            my_node->set_name_cds_i_view(  ).
+            my_node->set_name_cds_r_view(  ).
+            my_node->set_name_cds_p_view(  ).
+            my_node->set_name_behavior_impl(  ).
+            my_node->set_name_mde(  ).
+
+            IF rapbo-AddSAPObjectType = abap_true.
+              my_node->set_name_sap_node_object_type(  ).
+              update_line-SAPObjectNodeType  = my_node->rap_node_objects-sap_object_node_type.
+            ELSE.
+              update_line-SAPObjectNodeType  = ''.
+            ENDIF.
+            update_line-cdsiview   = my_node->rap_node_objects-cds_view_i.
+            update_line-cdsrview   = my_node->rap_node_objects-cds_view_r.
+            update_line-cdspview   = my_node->rap_node_objects-cds_view_p.
+            update_line-mdeview  = my_node->rap_node_objects-meta_data_extension.
+
+            update_line-SAPObjectNodeType = my_node->rap_node_objects-sap_object_node_type.
+
+            update_line-behaviorimplementationclass  = my_node->rap_node_objects-behavior_implementation.
+
+
+
+            "boname can only be set after name of cds-i-view has been determined
+            IF rapbo_node-isrootnode = abap_true.
+              update_bo_line-boname = my_node->rap_node_objects-cds_view_r.
+              update_bo_line-SAPObjectType = my_node->rap_root_node_objects-sap_object_type.
+              update_bo_line-adtlink   = | adt://{ sy-sysid }/sap/bc/adt/ddic/ddl/sources/{ my_node->rap_node_objects-cds_view_r } |.
+            ENDIF.
+
+            IF rapbo-implementationtype = ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+              my_node->set_name_control_structure(  ).
+              update_line-controlstructure = my_node->rap_node_objects-control_structure.
+            ELSE.
+              update_line-controlstructure = ''.
+            ENDIF.
+
+            IF rapbo-datasourcetype = ZDMO_cl_rap_node=>data_source_types-abstract_entity.              .
+
+              my_node->set_name_custom_query_impl(  ).
+              my_node->set_name_custom_entity(  ).
+              "name of custom entity is the same as the name of the cds i(r)-view
+              update_line-queryimplementationclass = my_node->rap_node_objects-custom_query_impl_class.
+            ELSE.
+              update_line-queryimplementationclass = ''.
+            ENDIF.
+
+            IF rapbo-isExtensible = abap_true.
+              my_node->set_name_extension_include(  ).
+              my_node->set_name_extension_incl_view(  ).
+              my_node->set_ext_element_suffix(  ).
+              update_line-ExtensionInclude = my_node->rap_node_objects-extension_include.
+              update_line-ExtensionIncludeView = my_node->rap_node_objects-extension_include_view.
+              update_line-ExtensibilityElementSuffix = my_node->extensibility_element_suffix.
+            ELSE.
+              update_line-ExtensionInclude = ''.
+              update_line-ExtensionIncludeView = ''.
+              update_line-ExtensibilityElementSuffix = ''.
+            ENDIF.
+
+            IF rapbo-isExtensible = abap_true AND rapbo-DraftEnabled = abap_true.
+              my_node->set_name_draft_query_view(  ).
+              update_line-draftqueryview = my_node->rap_node_objects-draft_query_view.
+            ELSE.
+              update_line-DraftQueryView = ''.
+            ENDIF.
+
+          CATCH ZDMO_cx_rap_generator INTO DATA(rap_node_exception).
+            DATA(exception_text) = rap_node_exception->get_text(  ).
+        ENDTRY.
+
+
+        APPEND update_line TO update.
+
+      ENDLOOP.
+
+      APPEND update_bo_line TO update_bo.
+
+    ENDLOOP.
+
+
+    " Update repository object name proposals of all relevant entities
+    " Update the parent entity name
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Project
+      UPDATE FIELDS (
+                      boname
+                      ADTLink
+                      SAPObjectType
+                     ) WITH update_bo
+    ENTITY Node
+      UPDATE FIELDS (
+                      parententityname
+                      cdsiview
+                      cdsiviewbasic
+                      cdsrview
+                      cdspview
+                      mdeview
+                      behaviorimplementationclass
+                      servicedefinition
+                      servicebinding
+                      controlstructure
+                      queryimplementationclass
+                      drafttablename
+                      ExtensionInclude
+                      ExtensionIncludeView
+                      ExtensibilityElementSuffix
+                      DraftQueryView
+                      SAPObjectNodeType
+                      SAPObjectType
+                      ) WITH update
+    REPORTED DATA(update_reported).
+
+    reported = CORRESPONDING #( DEEP update_reported ).
+
+  ENDMETHOD.
+
+  METHOD SetRepositoryObjectNames_det.
+
+
+    "proposals for repository object names are only set
+    "a) when draft is active and
+    "b) when the entity name changes. (which cannot happen anymore)
+
+    DATA draft_keys TYPE TABLE FOR DETERMINATION ZDMO_R_RAPG_ProjectTP\\Node~SetRepositoryObjectNames_det .
+    "  if_abap_behv=>mk-on
+    draft_keys = VALUE #( FOR draft_key IN keys  WHERE (   %is_draft = if_abap_behv=>mk-on )
+    (
+      %is_draft  = draft_key-%is_draft
+     nodeuuid = draft_key-nodeuuid
+     "Component Groups
+     %key  = draft_key-%key
+     %tky  = draft_key-%tky
+     %pky  = draft_key-%pky
+     ) ) .
+
+    CHECK draft_keys IS NOT INITIAL.
+
+    " Trigger Re-Calculation of repository object names
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY node
+        EXECUTE SetRepositoryObjectNames
+          FROM CORRESPONDING  #( draft_keys ).
+
+
+  ENDMETHOD.
+
+  METHOD addChildNode.
+
+    DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node.
+    DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node .
+
+    DATA create_nodes TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node.
+    DATA create_node  TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node.
+
+    DATA number_of_childs TYPE i.
+    DATA n TYPE i.
+
+    "get projects
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY Node BY \_Project
+      ALL FIELDS
+      WITH CORRESPONDING #( keys )
+      RESULT DATA(projects).
+
+    "get nodes
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+       ENTITY Node "BY \_Project
+       ALL FIELDS
+       WITH CORRESPONDING #( keys )
+       RESULT DATA(nodes).
+
+    "get all nodes
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+       ENTITY PRoject BY  \_Node
+       ALL FIELDS
+       WITH CORRESPONDING #( projects )
+       RESULT DATA(nodes_of_project).
+
+    DATA(number_of_nodes) = lines( nodes_of_project )  .
+
+    "calculate new number of child nodes
+    LOOP AT nodes INTO DATA(node).
+      CLEAR update_line.
+      CLEAR number_of_childs.
+      LOOP AT nodes INTO DATA(node_2) WHERE parentuuid = node-nodeuuid AND isrootnode = abap_false.
+        number_of_childs += 1.
+      ENDLOOP.
+      LOOP AT nodes INTO node_2 WHERE nodeuuid = node-nodeuuid.
+        update_line-%tky      = node_2-%tky.
+        update_line-hierarchydescendantcount = number_of_childs + 1 .
+        APPEND update_line TO update.
+      ENDLOOP.
+    ENDLOOP.
+
+
+    LOOP AT nodes INTO node.
+
+      n += 1.
+
+      IF projects[ rapbouuid = node-RapBoUUID ]-AddToManageBusinessConfig = abap_true AND
+         node-hierarchydistancefromroot + 1  >= 2.
+        APPEND VALUE #( nodeuuid = node-nodeuuid
+                        %msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                       number   = 069
+                                       severity = if_abap_behv_message=>severity-error
+                                       v1       = |{ projects[ rapbouuid = node-RapBoUUID ]-BoName }| ) )
+        TO reported-node.
+
+      ELSE.
+
+
+        create_node = VALUE #(
+                                %tky-%is_draft = node-%is_draft
+                                %tky-RapBoUUID = node-rapbouuid
+
+                                %target  = VALUE #(  (
+                                                      %is_draft = node-%is_draft
+                                                      %cid      = node-NodeUUID
+                                                      "data from data source specific action
+                                                      entityname = keys[ NodeUUID = node-NodeUUID ]-%param-entity_name
+                                                      DataSource = keys[ NodeUUID = node-NodeUUID ]-%param-DataSourceName
+                                                      "data from selected node
+                                                      parententityname = node-EntityName
+                                                      parentdatasource = node-DataSource
+                                                      parentuuid = node-NodeUUID
+                                                      rootuuid = node-RootUUID
+                                                      hierarchydistancefromroot = node-hierarchydistancefromroot + 1
+                                                      NodeNumber = number_of_nodes + 1
+                                         ) )
+                              ).
+
+        APPEND create_node TO create_nodes.
+
+      ENDIF.
+    ENDLOOP.
+
+
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+               ENTITY Node
+               UPDATE FIELDS (
+                      hierarchydescendantcount
+                      ) WITH update
+               ENTITY Project
+               CREATE BY \_Node
+               FIELDS (
+                        "set via parameter
+                        entityname
+                        DataSource
+                        "set from selected node
+                        parententityname
+                        parentdatasource
+                        parentuuid
+                        rootuuid
+                        hierarchydistancefromroot
+                        "set for extensibility
+                        NodeNumber
+                      )
+               WITH create_nodes
+        MAPPED  mapped
+        FAILED  failed
+        REPORTED reported.
+
+
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY node
+            ALL FIELDS WITH VALUE #(  FOR m IN mapped-node ( %tky = m-%tky  ) )
+            RESULT DATA(lt_result).
+
+    result = VALUE #( FOR r IN lt_result (
+                                           %tky = r-%tky
+                                           %param = CORRESPONDING #( r ) ) ).
+
+
+*        CHECK mapped-rapgeneratorbonode[] IS NOT INITIAL.
+
+*        APPEND LINES OF mapped-rapgeneratorbonode TO all_mapped-rapgeneratorbonode.
+
+
+
+* MODIFY ENTITIES OF zdmo_r_rapgeneratorbo IN LOCAL MODE
+*               ENTITY rapgeneratorbonode
+*               UPDATE FIELDS (
+*                      hierarchydescendantcount
+*
+*                      ) WITH update
+**    REPORTED DATA(update_reported)
+*
+*               ENTITY rapgeneratorbo
+*               CREATE BY \_rapgeneratorbonode
+*               SET FIELDS WITH VALUE #( ( %is_draft = ls_key-%is_draft
+*                                           rapnodeuuid = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-headeruuid
+*
+*                                           %target   = VALUE #( ( %is_draft = ls_key-%is_draft
+*                                                                  %cid = ls_key-%cid_ref
+*                                                                  entityname = ls_key-%param-entity_name
+*                                                                  parententityname = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-entityname
+*                                                                  parentdatasource = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-datasource
+*                                                                  parentuuid = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-nodeuuid
+*                                                                  rootuuid = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-rootuuid
+*                                                                  hierarchydistancefromroot = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-hierarchydistancefromroot + 1
+*                                                               )
+*                                                             ) ) )
+*        MAPPED  mapped " DATA(mapped_from_modify)
+*        FAILED  failed "  DATA(failed_from_modify)
+*        REPORTED reported." DATA(reported_from_modify).
+*
+*        CHECK mapped-rapgeneratorbonode[] IS NOT INITIAL.
+*
+*        APPEND LINES OF mapped-rapgeneratorbonode TO all_mapped-rapgeneratorbonode.
+*
+*
+
+
+**    value #(
+**  ( %is_draft = CONV #( '01' )
+**     nodeuuid = CONV #( '22ABBDB515F31EDDB1AF72F1C2D2AFAA' )
+**     rapbouuid = CONV #( '22ABBDB515F31EDDB1AF72F1C2D26FAA' )
+**     parentuuid = CONV #( '00000000000000000000000000000000' )
+**     rootuuid = CONV #( '00000000000000000000000000000000' )
+*nodenumber = '0'
+*isrootnode = 'X'
+*entityname = 'Test55'
+*parententityname = ''
+*datasource = 'ZDMO_UUID_HEADER'
+*parentdatasource = ''
+*viewtypevalue = ''
+*fieldnameobjectid = ''
+*fieldnameetagmaster = ''
+*fieldnametotaletag = ''
+*fieldnameuuid = ''
+*fieldnameparentuuid = ''
+*fieldnamerootuuid = ''
+*fieldnamecreatedby = ''
+*fieldnamecreatedat = ''
+*fieldnamelastchangedby = ''
+*fieldnamelastchangedat = ''
+*fieldnameloclastchangedat = ''
+*cdsiview = 'ZI_Test55TP_55'
+*cdsrview = 'ZR_Test55TP_55'
+*cdspview = 'ZC_Test55TP_55'
+*mdeview = 'ZC_Test55TP_55'
+*behaviorimplementationclass = 'ZBP_R_Test55TP_55'
+*servicedefinition = 'ZUI_Test55_55'
+*servicebinding = 'ZUI_Test55_O4_55'
+*controlstructure = ''
+*queryimplementationclass = ''
+*drafttablename = 'ZTEST5500D_55'
+**
+*  hierarchydistancefromroot = '0'
+*  hierarchydescendantcount = '0'
+*  hierarchydrillstate = ``
+*  hierarchypreorderrank = '0'
+*  locallastchangedat = '20230318105741.0634310'
+*  ischildnode = ''
+*  istable = ''
+*  iscdsview = ''
+*  isabstractentity = ''
+*)
+**   )
+
+
+    DATA(a) = 1.
+
+  ENDMETHOD.
+
+  METHOD addChildDataSourceAbsEntity.
+    DATA(a) = 1.
+
+    DATA  keys_for_add_child_node TYPE TABLE FOR ACTION IMPORT zdmo_r_rapg_projecttp\\node~addChildNode  .
+    FIELD-SYMBOLS: <fs_key_for_add_child_node> LIKE LINE OF keys_for_add_child_node.
+
+    keys_for_add_child_node = CORRESPONDING #( DEEP keys ).
+
+    "set DataSourceType to table
+    LOOP AT keys_for_add_child_node  ASSIGNING <fs_key_for_add_child_node>.
+      <fs_key_for_add_child_node>-%param-DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity.
+    ENDLOOP.
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY Node
+      EXECUTE addChildNode
+        FROM keys_for_add_child_node
+      RESULT DATA(result_add_child_node).
+
+*    result = CORRESPONDING #( DEEP result_add_child_node ).
+
+  ENDMETHOD.
+
+  METHOD addChildDataSourceCDSview.
+    DATA(a) = 1.
+
+    DATA  keys_for_add_child_node TYPE TABLE FOR ACTION IMPORT zdmo_r_rapg_projecttp\\node~addChildNode  .
+    FIELD-SYMBOLS: <fs_key_for_add_child_node> LIKE LINE OF keys_for_add_child_node.
+
+    keys_for_add_child_node = CORRESPONDING #( DEEP keys ).
+
+    "set DataSourceType to table
+    LOOP AT keys_for_add_child_node  ASSIGNING <fs_key_for_add_child_node>.
+      <fs_key_for_add_child_node>-%param-DataSourceType = zdmo_cl_rap_node=>data_source_types-cds_view.
+    ENDLOOP.
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY Node
+      EXECUTE addChildNode
+        FROM keys_for_add_child_node
+      RESULT DATA(result_add_child_node).
+
+*    result = CORRESPONDING #( DEEP result_add_child_node ).
+
+  ENDMETHOD.
+
+  METHOD addChildDataSourceTable.
+
+    DATA(a) = 1.
+
+    DATA  keys_for_add_child_node TYPE TABLE FOR ACTION IMPORT zdmo_r_rapg_projecttp\\node~addChildNode  .
+    FIELD-SYMBOLS: <fs_key_for_add_child_node> LIKE LINE OF keys_for_add_child_node.
+
+    keys_for_add_child_node = CORRESPONDING #( DEEP keys ).
+
+    "set DataSourceType to table
+    LOOP AT keys_for_add_child_node  ASSIGNING <fs_key_for_add_child_node>.
+      <fs_key_for_add_child_node>-%param-DataSourceType = zdmo_cl_rap_node=>data_source_types-table.
+    ENDLOOP.
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY Node
+      EXECUTE addChildNode
+        FROM keys_for_add_child_node
+      RESULT DATA(result_add_child_node).
+
+*    result = CORRESPONDING #( DEEP result_add_child_node ).
+
+  ENDMETHOD.
+
+  METHOD SetFieldNames.
+
+    DATA rapbo TYPE STRUCTURE FOR READ RESULT ZDMO_R_RAPG_ProjectTP\\node\_Project .
+
+
+    DATA my_node TYPE REF TO ZDMO_cl_rap_node.
+    DATA parent_node TYPE REF TO ZDMO_cl_rap_node.
+
+
+    DATA update_bo_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project .
+
+    DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node.
+    DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node .
+
+    DATA draft_keys TYPE TABLE FOR DETERMINATION zDMO_R_RAPG_ProjectTP\\Node~SetRepositoryObjectNames_det."  rapgeneratorbonode~setrepositoryobjectnames.
+
+    DATA create_log_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_NodeTP\_Field.
+    DATA create_log_cba_line TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_NodeTP\_Field.
+
+
+* todo check why we only use draft keys here
+* when the action is not enabled in non draft this would not be necessary
+
+    draft_keys = VALUE #( FOR draft_key IN keys  WHERE (   %is_draft = if_abap_behv=>mk-on )
+    (
+      %is_draft  = draft_key-%is_draft
+     nodeuuid = draft_key-nodeuuid
+     "Component Groups
+     %key  = draft_key-%key
+     %tky  = draft_key-%tky
+     %pky  = draft_key-%pky
+     ) ) .
+
+    CHECK draft_keys IS NOT INITIAL.
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Node BY \_Project
+    ALL FIELDS
+    WITH CORRESPONDING #( keys )
+    RESULT DATA(rapbos).
+
+*
+*    " Process all affected RAPBos. Read respective nodes,
+*    " determine the implementation type of the RAP BO
+*
+*    LOOP AT rapbos INTO DATA(rapbo).
+
+
+
+    " read a dummy field
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY Node
+       ALL FIELDS "( entityname  cdsiview  cdspview   )
+      WITH CORRESPONDING #( draft_keys )
+      RESULT DATA(rapbo_nodes).
+
+*      update_bo_line-%tky      = rapbo-%tky.
+
+    "loop will start with the root node
+    SORT rapbo_nodes BY hierarchydistancefromroot ASCENDING.
+
+
+*      root_node = NEW ZDMO_cl_rap_node(  ).
+*      root_node->set_is_root_node(  ).
+*      root_node->set_xco_lib( my_xco_lib ).
+*      root_node->set_draft_enabled( rapbo-draftenabled ).
+*      root_node->set_prefix( rapbo-prefix ).
+*      root_node->set_suffix( rapbo-suffix ).
+*      root_node->set_namespace( CONV #( rapbo-namespace ) ).
+*      root_node->set_binding_type( CONV #( rapbo-bindingtype ) ).
+*      root_node->set_implementation_type( CONV #( rapbo-implementationtype ) ).
+*      root_node->set_data_source_type( CONV #( rapbo-datasourcetype ) ).
+
+    LOOP AT rapbo_nodes INTO DATA(rapbo_node).
+
+      CLEAR rapbo.
+
+      IF line_exists( rapbos[ rapbouuid = rapbo_node-rapbouuid ] ).
+        rapbo = rapbos[ rapbouuid = rapbo_node-rapbouuid ].
+      ENDIF.
+
+      CHECK rapbo IS NOT INITIAL.
+
+      DATA my_xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib.
+
+      IF rapbo-abaplanguageversion = ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development.
+        my_xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib(  ).
+      ELSE.
+        my_xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ) .
+      ENDIF.
+
+      CLEAR update_bo_line.
+
+      CLEAR update_line.
+      update_line-%tky      = rapbo_node-%tky.
+
+      "values must be explictly set to ''.
+      "Because if fields are initial their content is not updated via EML
+
+      update_line-fieldnameobjectid = ''.
+      update_line-viewtypevalue = ''.
+      update_line-fieldnameuuid  = ''.
+      update_line-fieldnameparentuuid  = ''.
+      update_line-fieldnamerootuuid  = ''.
+      update_line-fieldnameetagmaster = ''.
+      update_line-fieldnamecreatedat = ''.
+      update_line-fieldnamecreatedby = ''.
+      update_line-fieldnametotaletag = ''.
+      update_line-fieldnamelastchangedby = ''.
+      update_line-FieldNameLastChangedAt = ''.
+
+*        update_line-fieldnameobjectid = ''.
+
+      CHECK rapbo_node-datasource IS NOT INITIAL.
+
+      IF line_exists( rapbo_nodes[ nodeuuid = rapbo_node-parentuuid ] ).
+        update_line-parententityname = rapbo_nodes[ nodeuuid = rapbo_node-parentuuid ]-entityname.
+      ENDIF.
+
+
+      TRY.
+
+          my_node = NEW ZDMO_cl_rap_node(  ).
+          my_node->set_xco_lib( my_xco_lib ).
+          my_node->set_implementation_type( CONV #( rapbo-implementationtype ) ).
+          my_node->set_data_source_type( CONV #( rapbo-datasourcetype ) ).
+          my_node->set_data_source( CONV #( rapbo_node-datasource ) ).
+
+          update_line-viewtypevalue = my_node->view_type_value.
+
+          IF rapbo-implementationtype = 'managed_uuid'.
+
+            my_node->set_field_name_uuid( ). "CONV string( rapbo_node-FieldNameUUID ) ).
+            update_line-fieldnameuuid  = to_upper( my_node->field_name-uuid ).
+
+            IF rapbo_node-hierarchydistancefromroot > 0.
+              my_node->set_field_name_parent_uuid( ). "CONV string( rapbo_node-FieldNameParentUUID ) ).
+              update_line-fieldnameparentuuid  = to_upper( my_node->field_name-parent_uuid ).
+            ENDIF.
+
+            IF rapbo_node-hierarchydistancefromroot > 1.
+              my_node->set_field_name_root_uuid(  ) .
+              update_line-fieldnamerootuuid  = to_upper( my_node->field_name-root_uuid ).
+            ENDIF.
+
+          ELSE.
+            update_line-fieldnameuuid  = ''.
+            update_line-fieldnameparentuuid  = ''.
+            update_line-fieldnamerootuuid  = ''.
+          ENDIF.
+
+          my_node->set_field_name_etag_master(  ).
+          update_line-fieldnameetagmaster = to_upper( my_node->field_name-etag_master ).
+
+          my_node->set_field_name_loc_last_chg_at(  ).
+          update_line-FieldNameLocLastChangedAt = to_upper( my_node->field_name-local_instance_last_changed_at ).
+
+
+          IF rapbo_node-isrootnode = abap_true.
+
+            my_node->set_is_root_node(  ).
+            my_node->set_draft_enabled( rapbo-draftenabled ).
+
+            my_node->set_object_id(  ). " rapbo_node-FieldNameObjectID ).
+            update_line-fieldnameobjectid = to_upper( my_node->object_id ).
+
+
+            my_node->set_field_name_total_etag( ).
+            update_line-fieldnametotaletag = to_upper( my_node->field_name-total_etag ).
+
+            my_node->set_field_name_created_at( ).
+            update_line-fieldnamecreatedat = to_upper( my_node->field_name-created_at ).
+
+            my_node->set_field_name_created_by( ).
+            update_line-fieldnamecreatedby = to_upper( my_node->field_name-created_by ).
+
+            my_node->set_field_name_last_changed_by( ).
+            update_line-fieldnamelastchangedby = to_upper( my_node->field_name-last_changed_by ).
+
+            my_node->set_field_name_last_changed_at( ).
+            update_line-fieldnamelastchangedat = to_upper( my_node->field_name-last_changed_at ).
+
+          ELSE.
+
+            parent_node = NEW ZDMO_cl_rap_node(  ).
+            parent_node->set_xco_lib( my_xco_lib ).
+            parent_node->set_implementation_type( CONV #( rapbo-implementationtype ) ).
+            parent_node->set_data_source_type( CONV #( rapbo-datasourcetype ) ).
+            parent_node->set_data_source( CONV #( rapbo_node-parentdatasource ) ).
+
+            IF rapbo-implementationtype = 'managed_semantic' OR
+               rapbo-implementationtype = 'unmanaged_semantic'.
+
+              LOOP AT my_node->semantic_key INTO DATA(semantic_key_field).
+                IF NOT line_exists( parent_node->semantic_key[ name = semantic_key_field-name ] ).
+                  update_line-fieldnameobjectid = to_upper( semantic_key_field-name ).
+                  EXIT.
+                ENDIF.
+              ENDLOOP.
+
+            ENDIF.
+
+          ENDIF.
+
+        CATCH ZDMO_cx_rap_generator INTO DATA(rap_node_exception).
+          DATA(exception_text) = rap_node_exception->get_text(  ).
+      ENDTRY.
+
+      DATA n TYPE i.
+      "get fields
+
+      CLEAR create_log_cba.
+
+      LOOP AT my_node->lt_fields INTO DATA(field)
+                                                  WHERE cds_view_field IS NOT INITIAL AND
+                                                        name IS NOT INITIAL
+                                                        "hide client field in RAP Generator UI
+                                                        AND
+                                                        name  <> my_node->field_name-client
+            .
+        n += 1 .
+
+        create_log_cba_line = VALUE #(  %is_draft = if_abap_behv=>mk-on
+                                        %key-NodeUUID = update_line-NodeUUID
+                                        %cid_ref  = update_line-%cid_ref
+                                        %target   = VALUE #( (
+                                                                 %is_draft = if_abap_behv=>mk-on
+                                                                 %cid      = |Hugo{ n }| " ggg
+                                                                 CdsViewField = field-cds_view_field
+                                                                 DbtableField = field-name
+                                                                 IsKey = field-key_indicator
+
+                                                                 ) ) ) .
+        APPEND create_log_cba_line TO create_log_cba.
+
+      ENDLOOP.
+
+
+      APPEND update_line TO update.
+
+*    ENDLOOP.
+
+*    APPEND update_bo_line TO update_bo.
+
+    ENDLOOP.
+
+
+    " Update repository object name proposals of all relevant entities
+    " Update the parent entity name
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+*    ENTITY Project
+*      UPDATE FIELDS (
+*                      boname
+*                      ADTLink
+*                     ) WITH update_bo
+    ENTITY Node
+      UPDATE FIELDS (
+
+        fieldnameobjectid
+
+        viewtypevalue
+
+        fieldnameuuid
+        fieldnameparentuuid
+        fieldnamerootuuid
+
+        fieldnameetagmaster
+        fieldnametotaletag
+
+        fieldnamecreatedat
+        fieldnamecreatedby
+        FieldNameLastChangedAt
+        fieldnamelastchangedby
+
+        FieldNameLocLastChangedAt
+
+                      ) WITH update
+
+        CREATE BY \_Field
+                  FIELDS ( CdsViewField DbtableField IsKey )
+                  WITH create_log_cba
+
+
+    REPORTED DATA(update_reported)
+    FAILED DATA(update_failed)
+    MAPPED DATA(update_mapped).
+
+    reported = CORRESPONDING #( DEEP update_reported ).
+
+
+  ENDMETHOD.
+
+  METHOD mandatory_fields_check.
+
+    DATA permission_request TYPE STRUCTURE FOR PERMISSIONS REQUEST ZDMO_C_RAPG_NodeTP.
+    DATA reported_node_line LIKE LINE OF reported-node.
+
+    "check permissions of the following fields
+    permission_request-%field-FieldNameObjectID = if_abap_behv=>mk-on.
+    permission_request-%field-ExtensibilityElementSuffix = if_abap_behv=>mk-on.
+
+    " Get current field values
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Node
+      ALL FIELDS
+      WITH CORRESPONDING #( keys )
+      RESULT DATA(nodes).
+
+    "Do check
+    LOOP AT nodes INTO DATA(node).
+
+      GET PERMISSIONS ONLY INSTANCE ENTITY ZDMO_C_RAPG_NodeTP
+                FROM VALUE #( ( NodeUUID = node-NodeUUID ) )
+                REQUEST permission_request
+                RESULT DATA(permission_result)
+                FAILED DATA(failed_permission_result)
+                REPORTED DATA(reported_permission_result).
+
+      IF permission_result-global-%field-FieldNameObjectID = if_abap_behv=>fc-f-mandatory
+                                AND node-FieldNameObjectID IS INITIAL
+*               or
+*               permission_result-global-%field-ExtensibilityElementSuffix = if_abap_behv=>fc-f-mandatory
+*                                      AND node-ExtensibilityElementSuffix IS INITIAL
+               .
+
+        APPEND VALUE #( %tky = node-%tky ) TO failed-project.
+
+        CLEAR reported_node_line.
+        reported_node_line-%tky = node-%tky.
+        reported_node_line-%element-fieldnameobjectid = if_abap_behv=>mk-on.
+        reported_node_line-%msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                                         number   = 071
+                                                         severity = if_abap_behv_message=>severity-error
+                                                         v1       = | object id |
+                                                         v2       = |{ node-EntityName }| ).
+        APPEND reported_node_line  TO reported-node.
+      ENDIF.
+      IF line_exists( permission_result-instances[ NodeUUID = node-NodeUUID ] ).
+        IF  permission_result-instances[ NodeUUID = node-NodeUUID ]-%field-ExtensibilityElementSuffix = if_abap_behv=>fc-f-mandatory
+                                   AND node-ExtensibilityElementSuffix IS INITIAL
+                     .
+
+          APPEND VALUE #( %tky = node-%tky ) TO failed-project.
+
+          CLEAR reported_node_line.
+          reported_node_line-%tky = node-%tky.
+          reported_node_line-%element-ExtensibilityElementSuffix = if_abap_behv=>mk-on.
+          reported_node_line-%msg = new_message( id       = 'ZDMO_CM_RAP_GEN_MSG'
+                                                           number   = 071
+                                                           severity = if_abap_behv_message=>severity-error
+                                                           v1       = | Extensibility Element Suffix |
+                                                           v2       = |{ node-EntityName }| ).
+          APPEND reported_node_line  TO reported-node.
+
+        ENDIF.
+      ENDIF.
+    ENDLOOP.
+
+
+  ENDMETHOD.
+
+ENDCLASS.
+
+CLASS lhc_Field DEFINITION INHERITING FROM cl_abap_behavior_handler.
+  PRIVATE SECTION.
+
+    METHODS CalculateDbtableField FOR DETERMINE ON SAVE
+      IMPORTING keys FOR Field~CalculateDbtableField.
+    METHODS get_instance_features FOR INSTANCE FEATURES
+      IMPORTING keys REQUEST requested_features FOR field RESULT result.
+
+ENDCLASS.
+
+CLASS lhc_Field IMPLEMENTATION.
+
+  METHOD CalculateDbtableField.
+  ENDMETHOD.
+
+  METHOD get_instance_features.
+
+    "read all child instances
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY field
+        ALL FIELDS
+        WITH CORRESPONDING #( keys )
+      RESULT DATA(rapbo_node_fields).
+
+    "read all links from child instances to the corresponding root entity
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+      ENTITY field BY \_Project
+        FROM CORRESPONDING #( rapbo_node_fields )
+      LINK DATA(rapbo_nodes_links).
+
+    "read all parent entities of the child entities
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+    ENTITY Field BY \_Project
+      ALL FIELDS
+      WITH CORRESPONDING #( keys )
+      RESULT DATA(rapbos).
+
+    "read all root entities of the child entities
+*    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE
+*    ENTITY Project BY \_Project
+*      ALL FIELDS
+*      WITH CORRESPONDING #( keys )
+*      RESULT DATA(rapbos).
+
+
+
+
+    LOOP AT rapbo_node_fields INTO DATA(rapbo_node).
+
+      "use link data to retrieve the data of the parent entity of the currently selected child entity
+*      DATA(rapbo) = rapbos[  rapbouuid = rapbo_nodes_links[ source-nodeuuid = rapbo_node-nodeuuid ]-target-rapbouuid ].
+
+      APPEND VALUE #( %tky                   = rapbo_node-%tky
+
+
+         %field-iskey   = COND #( WHEN rapbos[ 1 ]-DataSourceType = zdmo_cl_rap_node=>data_source_types-abap_type
+                                                               THEN if_abap_behv=>fc-f-unrestricted
+                                                               ELSE if_abap_behv=>fc-f-read_only )
+
+
+                            ) TO result.
+    ENDLOOP.
+
+
+  ENDMETHOD.
+
+ENDCLASS.
+
+CLASS lsc_ZDMO_R_RAPG_PROJECTTP DEFINITION INHERITING FROM cl_abap_behavior_saver.
+  PROTECTED SECTION.
+
+    METHODS save_modified REDEFINITION.
+
+    METHODS cleanup_finalize REDEFINITION.
+
+ENDCLASS.
+
+CLASS lsc_ZDMO_R_RAPG_PROJECTTP IMPLEMENTATION.
+
+  METHOD save_modified.
+
+    DATA(xco_lib) = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+    DATA xco_api TYPE REF TO zdmo_cl_rap_xco_lib.
+    DATA bgpf_operation TYPE REF TO zdmo_cl_rap_generator_asyn .
+    DATA bgpf_del_operation TYPE REF TO zdmo_cl_rap_generator_del_asyn .
+    DATA async_process_name TYPE string.
+*    DATA start_bgpf_operation TYPE REF TO zdmo_cl_rap_generator_strtbgpf.
+
+    IF xco_lib->on_premise_branch_is_used(  ).
+      xco_api = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_api = NEW ZDMO_cl_rap_xco_cloud_lib( ).
+    ENDIF.
+
+    LOOP AT update-project INTO DATA(update_rapgeneratorbo)
+              WHERE
+                    ( BoIsGenerated = abap_true AND
+                      %control-BoIsGenerated = if_abap_behv=>mk-on )
+                     OR
+                    ( BoIsDeleted = abap_true AND
+                      %control-BoIsDeleted = if_abap_behv=>mk-on )
+                      .
+      TRY.
+          IF update_rapgeneratorbo-BoIsDeleted = abap_true.
+            bgpf_del_operation = NEW zdmo_cl_rap_generator_del_asyn(
+                               i_boname              =  update_rapgeneratorbo-BoName
+                               ).
+          ELSEIF update_rapgeneratorbo-boisgenerated = abap_true.
+            bgpf_operation = NEW zdmo_cl_rap_generator_asyn(
+                                  i_json_string              = update_rapgeneratorbo-JsonString
+                                  i_package_language_version = update_rapgeneratorbo-PackageLanguageVersion
+                                  i_rap_bo_uuid = update_rapgeneratorbo-RapBoUUID
+                                  ).
+          ENDIF.
+
+          IF xco_api->get_class( 'zdmo_cl_rap_generator_strtbgpf'  )->exists(  ).
+            DATA(background_process) = cl_bgmc_process_factory=>get_default(  )->create(  ).
+            IF update_rapgeneratorbo-BoIsDeleted = abap_true.
+              zdmo_cl_rap_generator_strtbgpf=>create_for_del_bgpf(
+                EXPORTING
+                  i_bgpf_del_operation = bgpf_del_operation
+                  i_operation_text     = |Delete { update_rapgeneratorbo-BoName }|
+                RECEIVING
+                  result               = DATA(start_bgpf_operation)
+              ).
+              start_bgpf_operation->start_execution( ).
+*              background_process->set_operation_tx_uncontrolled( bgpf_del_operation ).
+*              background_process->set_name( CONV #( |Generate { update_rapgeneratorbo-BoName }| ) ).
+            ELSEIF update_rapgeneratorbo-BoIsGenerated = abap_true.
+              zdmo_cl_rap_generator_strtbgpf=>create_for_bgpf(
+                EXPORTING
+                  i_bgpf_operation = bgpf_operation
+                  i_operation_text     = |Generate { update_rapgeneratorbo-BoName }|
+                RECEIVING
+                  result               = start_bgpf_operation
+               ).
+              start_bgpf_operation->start_execution( ).
+*              background_process->set_operation_tx_uncontrolled( bgpf_operation ).
+*              background_process->set_name( CONV #( |Generate { update_rapgeneratorbo-BoName }| ) ).
+            ENDIF.
+          ELSE.
+*            background_process->save_for_execution(  ).
+            DATA(lo_parallel) = NEW cl_abap_parallel( ).
+            lo_parallel->run_inst(
+                            EXPORTING
+                                 p_in_tab  = VALUE #( ( bgpf_operation ) )
+                            IMPORTING
+                                 p_out_tab = DATA(lt_out)
+                                 ).
+
+          ENDIF.
+
+        CATCH cx_root INTO DATA(exception).
+          "handle exception
+          DATA(latest_t100_exception) = cl_message_helper=>get_latest_t100_exception( exception ).
+          IF latest_t100_exception IS NOT INITIAL.
+            DATA(exception_text) = latest_t100_exception->if_message~get_text(  ).
+          ELSE.
+            exception_text = exception->get_text(  ).
+          ENDIF.
+      ENDTRY.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+
+  METHOD cleanup_finalize.
+  ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/zdmo_bp_rapg_all.clas.xml b/src/zdmo_bp_rapg_all.clas.xml
new file mode 100644
index 0000000..ca43ac3
--- /dev/null
+++ b/src/zdmo_bp_rapg_all.clas.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_BP_RAPG_ALL</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Behavior Implementation for ZDMO_R_RAPG_PROJECTTP</DESCRIPT>
+    <CATEGORY>06</CATEGORY>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+    <CLSDEFINT>ZDMO_R_RAPG_PROJECTTP</CLSDEFINT>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_c_rapg_fieldtp.ddls.asddls b/src/zdmo_c_rapg_fieldtp.ddls.asddls
new file mode 100644
index 0000000..0954a0d
--- /dev/null
+++ b/src/zdmo_c_rapg_fieldtp.ddls.asddls
@@ -0,0 +1,22 @@
+@AccessControl.authorizationCheck: #CHECK
+@Metadata.allowExtensions: true
+@EndUserText.label: 'Projection View forField'
+@ObjectModel.semanticKey: [ 'DbtableField' ]
+@Search.searchable: true
+define view entity ZDMO_C_RAPG_FieldTP
+  as projection on ZDMO_R_RAPG_FieldTP
+{
+  key FieldUUID,
+      NodeUUID,
+      RapboUUID,
+      IsKey,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+
+      DbtableField,
+      CdsViewField,
+      LocalLastChangedAt,
+      _Node    : redirected to parent ZDMO_C_RAPG_NodeTP,
+      _Project : redirected to ZDMO_C_RAPG_ProjectTP
+
+}
diff --git a/src/zdmo_c_rapg_fieldtp.ddls.baseinfo b/src/zdmo_c_rapg_fieldtp.ddls.baseinfo
new file mode 100644
index 0000000..24736e2
--- /dev/null
+++ b/src/zdmo_c_rapg_fieldtp.ddls.baseinfo
@@ -0,0 +1,26 @@
+{
+"BASEINFO":
+{
+"FROM":
+[
+"ZDMO_R_RAPG_FIELDTP"
+],
+"ASSOCIATED":
+[
+"ZDMO_C_RAPG_NODETP",
+"ZDMO_C_RAPG_PROJECTTP",
+"ZDMO_R_RAPG_NODETP",
+"ZDMO_R_RAPG_PROJECTTP"
+],
+"BASE":
+[
+"ZDMO_R_RAPG_FIELDTP"
+],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_c_rapg_fieldtp.ddls.xml b/src/zdmo_c_rapg_fieldtp.ddls.xml
new file mode 100644
index 0000000..0ef6731
--- /dev/null
+++ b/src/zdmo_c_rapg_fieldtp.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_C_RAPG_FIELDTP</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Projection View for Field</DDTEXT>
+    <SOURCE_TYPE>P</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_c_rapg_fieldtp.ddlx.asddlxs b/src/zdmo_c_rapg_fieldtp.ddlx.asddlxs
new file mode 100644
index 0000000..1e63bd5
--- /dev/null
+++ b/src/zdmo_c_rapg_fieldtp.ddlx.asddlxs
@@ -0,0 +1,75 @@
+@Metadata.layer: #CUSTOMER
+@UI: {
+  headerInfo: {
+    typeName: 'Field',
+    typeNamePlural: 'Fields',
+    title: {
+      type: #STANDARD,
+      label: 'Field',
+      value: 'DbtableField'
+    }
+  },
+  presentationVariant: [ {
+    sortOrder: [ {
+      by: 'DbtableField',
+      direction: #DESC
+    } ],
+    visualizations: [ {
+      type: #AS_LINEITEM
+    } ]
+  } ]
+}
+annotate view ZDMO_C_RAPG_FieldTP with
+{
+  @UI.facet: [ {
+    id: 'idField',
+    purpose: #STANDARD,
+    type: #IDENTIFICATION_REFERENCE,
+    label: 'Field',
+    position: 10
+  } ]
+  @UI.hidden: true
+  FieldUUID;
+
+  @UI.hidden: true
+  NodeUUID;
+
+  @UI.hidden: true
+  RapboUUID;
+
+  @UI.lineItem: [ {
+  label : 'Key Field',
+  position: 35 ,
+  importance: #HIGH
+  } ]
+  @UI.identification: [ {
+    label : 'Key Field',
+    position: 35
+  } ]
+  IsKey;
+
+  @UI.lineItem: [ {
+    label : 'Fieldname datasource',
+    position: 40 ,
+    importance: #HIGH
+  } ]
+  @UI.identification: [ {
+    label : 'Fieldname datasource',
+    position: 40
+  } ]
+  DbtableField;
+
+  @UI.lineItem: [ {
+    label : 'Fieldname CDS view',
+    position: 50 ,
+    importance: #HIGH
+  } ]
+  @UI.identification: [ {
+    label : 'Fieldname CDS view',
+    position: 50
+  } ]
+  CdsViewField;
+
+  @UI.hidden: true
+  LocalLastChangedAt;
+}
\ No newline at end of file
diff --git a/src/zdmo_c_rapg_fieldtp.ddlx.xml b/src/zdmo_c_rapg_fieldtp.ddlx.xml
new file mode 100644
index 0000000..f556249
--- /dev/null
+++ b/src/zdmo_c_rapg_fieldtp.ddlx.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLX" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLX>
+    <METADATA>
+     <NAME>ZDMO_C_RAPG_FIELDTP</NAME>
+     <DESCRIPTION>MDE for Field</DESCRIPTION>
+     <MASTER_LANGUAGE>EN</MASTER_LANGUAGE>
+    </METADATA>
+   </DDLX>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_c_rapg_logtp.ddls.asddls b/src/zdmo_c_rapg_logtp.ddls.asddls
new file mode 100644
index 0000000..a3ddb44
--- /dev/null
+++ b/src/zdmo_c_rapg_logtp.ddls.asddls
@@ -0,0 +1,22 @@
+@AccessControl.authorizationCheck: #CHECK
+@Metadata.allowExtensions: true
+@EndUserText.label: 'Projection View forLog'
+@ObjectModel.semanticKey: [ 'LogItemNumber' ]
+@Search.searchable: true
+define view entity ZDMO_C_RAPG_LogTP
+  as projection on ZDMO_R_RAPG_LogTP
+{
+  key LogUUID,
+  RapBoUUID,
+  @Search.defaultSearchElement: true
+  @Search.fuzzinessThreshold: 0.90 
+  LogItemNumber,
+  DetailLevel,
+  Severity,
+  Criticality,
+  Text,
+  TimeStamp,
+  LocalLastChangedAt,
+  _Project : redirected to parent ZDMO_C_RAPG_ProjectTP
+  
+}
diff --git a/src/zdmo_c_rapg_logtp.ddls.baseinfo b/src/zdmo_c_rapg_logtp.ddls.baseinfo
new file mode 100644
index 0000000..b99f243
--- /dev/null
+++ b/src/zdmo_c_rapg_logtp.ddls.baseinfo
@@ -0,0 +1,24 @@
+{
+"BASEINFO":
+{
+"FROM":
+[
+"ZDMO_R_RAPG_LOGTP"
+],
+"ASSOCIATED":
+[
+"ZDMO_C_RAPG_PROJECTTP",
+"ZDMO_R_RAPG_PROJECTTP"
+],
+"BASE":
+[
+"ZDMO_R_RAPG_LOGTP"
+],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_c_rapg_logtp.ddls.xml b/src/zdmo_c_rapg_logtp.ddls.xml
new file mode 100644
index 0000000..1091152
--- /dev/null
+++ b/src/zdmo_c_rapg_logtp.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_C_RAPG_LOGTP</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Projection View for Log</DDTEXT>
+    <SOURCE_TYPE>P</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_c_rapg_logtp.ddlx.asddlxs b/src/zdmo_c_rapg_logtp.ddlx.asddlxs
new file mode 100644
index 0000000..4f265da
--- /dev/null
+++ b/src/zdmo_c_rapg_logtp.ddlx.asddlxs
@@ -0,0 +1,100 @@
+@Metadata.layer: #CUSTOMER
+@UI: {
+  headerInfo: {
+    typeName: 'Log',
+    typeNamePlural: 'Logs',
+    title: {
+      type: #STANDARD,
+      label: 'Log',
+      value: 'LogItemNumber'
+    }
+  },
+  presentationVariant: [ {
+    qualifier: 'pvariant',
+    sortOrder: [
+    {
+      by: 'LogItemNumber',
+      direction: #DESC
+    }
+    ],
+    visualizations: [ {
+      type: #AS_LINEITEM,
+      element: 'DetailLevel'
+    } ]
+  } ]
+
+}
+
+
+
+
+
+annotate view ZDMO_C_RAPG_LogTP with
+{
+  @UI.facet: [ {
+    id: 'idLog',
+    purpose: #STANDARD,
+    type: #IDENTIFICATION_REFERENCE,
+    label: 'Log',
+    position: 10
+  } ]
+  @UI.hidden: true
+  LogUUID;
+
+  @UI.hidden: true
+  RapBoUUID;
+
+  @UI.lineItem: [ {
+    position: 30 ,
+    importance: #HIGH
+  } ]
+  @UI.identification: [ {
+    position: 30
+  } ]
+  @UI.selectionField: [ { position: 30 } ]
+  LogItemNumber;
+
+  @UI.lineItem: [ {
+    position: 40 ,
+    importance: #HIGH
+  } ]
+  @UI.identification: [ {
+    position: 40
+  } ]
+  DetailLevel;
+
+  @UI.lineItem: [ {
+    position: 50 ,
+    importance: #HIGH,
+    criticality: 'Criticality'
+  } ]
+  @UI.identification: [ {
+    position: 50 ,
+    criticality: 'Criticality'
+  } ]
+  Severity;
+
+  @UI.hidden: true
+  Criticality;
+
+  @UI.lineItem: [ {
+    position: 60 ,
+    importance: #HIGH
+  } ]
+  @UI.identification: [ {
+    position: 60
+  } ]
+  Text;
+
+  @UI.lineItem: [ {
+    position: 70 ,
+    importance: #HIGH
+  } ]
+  @UI.identification: [ {
+    position: 70
+  } ]
+  TimeStamp;
+
+  @UI.hidden: true
+  LocalLastChangedAt;
+}
\ No newline at end of file
diff --git a/src/zdmo_c_rapg_logtp.ddlx.xml b/src/zdmo_c_rapg_logtp.ddlx.xml
new file mode 100644
index 0000000..be7fdf2
--- /dev/null
+++ b/src/zdmo_c_rapg_logtp.ddlx.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLX" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLX>
+    <METADATA>
+     <NAME>ZDMO_C_RAPG_LOGTP</NAME>
+     <DESCRIPTION>MDE for Log</DESCRIPTION>
+     <MASTER_LANGUAGE>EN</MASTER_LANGUAGE>
+    </METADATA>
+   </DDLX>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_c_rapg_nodetp.ddls.asddls b/src/zdmo_c_rapg_nodetp.ddls.asddls
new file mode 100644
index 0000000..0a64988
--- /dev/null
+++ b/src/zdmo_c_rapg_nodetp.ddls.asddls
@@ -0,0 +1,161 @@
+@AccessControl.authorizationCheck: #CHECK
+@Metadata.allowExtensions: true
+@EndUserText.label: 'Projection View forNode'
+@ObjectModel.semanticKey: [ 'EntityName' ]
+@Search.searchable: true
+define view entity ZDMO_C_RAPG_NodeTP
+  as projection on ZDMO_R_RAPG_NodeTP
+{
+  key NodeUUID,
+      RapBoUUID,
+      ParentUUID,
+      RootUUID,
+      NodeNumber,
+      IsRootNode,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      EntityName,
+      //      @Consumption.valueHelpDefinition: [{ association : '_Entity' }]
+      //      @Consumption.valueHelp: '_Entity'
+
+      @Consumption.valueHelpDefinition: [{ entity:
+      { name         : 'ZDMO_C_RAPG_NodeTP' ,  element: 'EntityName' }
+       ,
+                                      additionalBinding: [{ element: 'RapBoUUID',
+                                                            localElement: 'RapBoUUID' }]
+                                                            }]
+      ParentEntityName,
+      @Consumption.valueHelpDefinition: [{ entity:
+      { name         : 'ZDMO_I_RAP_GENERATOR_DATA_SRC2' ,  element: 'name' }
+                                       ,
+                                      additionalBinding: [{ element: 'type',
+                                                            localElement: 'DataSourceType' }]
+                                                            }]
+      DataSource,
+
+
+      ParentDataSource,
+      ViewTypeValue,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+                     additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                          { localElement: 'DataSourceType', element: 'type'},
+                                          { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameObjectID,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+               additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                    { localElement: 'DataSourceType', element: 'type'},
+                                    { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameEtagMaster,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+               additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                    { localElement: 'DataSourceType', element: 'type'},
+                                    { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameTotalEtag,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+                     additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                          { localElement: 'DataSourceType', element: 'type'},
+                                          { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameUUID,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+                     additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                          { localElement: 'DataSourceType', element: 'type'},
+                                          { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameParentUUID,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+                     additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                          { localElement: 'DataSourceType', element: 'type'},
+                                          { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameRootUUID,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+                     additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                          { localElement: 'DataSourceType', element: 'type'},
+                                          { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameCreatedBy,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+                     additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                          { localElement: 'DataSourceType', element: 'type'},
+                                          { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameCreatedAt,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+                     additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                          { localElement: 'DataSourceType', element: 'type'},
+                                          { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameLastChangedBy,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+                     additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                          { localElement: 'DataSourceType', element: 'type'},
+                                          { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameLastChangedAt,
+      @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'},
+                     additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'},
+                                          { localElement: 'DataSourceType', element: 'type'},
+                                          { localElement: 'DataSource', element: 'name'} ] } ]
+      FieldNameLocLastChangedAt,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      CdsIView,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      CdsIViewBasic,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      CdsRView,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      CdsPView,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      MdeView,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      BehaviorImplementationClass,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      ServiceDefinition,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      ServiceBinding,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      ControlStructure,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      QueryImplementationClass,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      DraftTableName,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      ExtensionInclude,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      ExtensionIncludeView,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      DraftQueryView,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      SAPObjectNodeType,
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      SAPObjectType,
+      HierarchyDistanceFromRoot,
+      HierarchyDescendantCount,
+      HierarchyDrillState,
+      HierarchyPreorderRank,
+      LocalLastChangedAt,
+      ExtensibilityElementSuffix,
+      isChildNode,
+      
+      _Project.isManaged                as isManaged,
+      _Project.hasSematicKey            as hasSemanticKey,
+      _Project.doesNotUseUnmanagedQuery as doesNotUseUnmanagedQuery,
+      _Project.DataSourceType           as DataSourceType,
+      _Project.AbapLanguageVersion      as ABAPLanguageVersion,
+      _Project.PackageName              as PackageName,
+      _Field   : redirected to composition child ZDMO_C_RAPG_FieldTP,
+      _Project : redirected to parent ZDMO_C_RAPG_ProjectTP
+      //      ,
+      //      _Entity
+
+}
diff --git a/src/zdmo_c_rapg_nodetp.ddls.baseinfo b/src/zdmo_c_rapg_nodetp.ddls.baseinfo
new file mode 100644
index 0000000..70ee87d
--- /dev/null
+++ b/src/zdmo_c_rapg_nodetp.ddls.baseinfo
@@ -0,0 +1,27 @@
+{
+"BASEINFO":
+{
+"FROM":
+[
+"ZDMO_R_RAPG_NODETP",
+"ZDMO_R_RAPG_PROJECTTP"
+],
+"ASSOCIATED":
+[
+"ZDMO_C_RAPG_FIELDTP",
+"ZDMO_C_RAPG_PROJECTTP",
+"ZDMO_R_RAPG_FIELDTP",
+"ZDMO_R_RAPG_PROJECTTP"
+],
+"BASE":
+[
+"ZDMO_R_RAPG_NODETP"
+],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_c_rapg_nodetp.ddls.xml b/src/zdmo_c_rapg_nodetp.ddls.xml
new file mode 100644
index 0000000..e715559
--- /dev/null
+++ b/src/zdmo_c_rapg_nodetp.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_C_RAPG_NODETP</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Projection View for Node</DDTEXT>
+    <SOURCE_TYPE>P</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_c_rapg_nodetp.ddlx.asddlxs b/src/zdmo_c_rapg_nodetp.ddlx.asddlxs
new file mode 100644
index 0000000..0863bc9
--- /dev/null
+++ b/src/zdmo_c_rapg_nodetp.ddlx.asddlxs
@@ -0,0 +1,364 @@
+@Metadata.layer: #CUSTOMER
+@UI: {
+  headerInfo: {
+    typeName: 'Entity',
+    typeNamePlural: 'Entities',
+    title: {
+      type: #STANDARD,
+      label: 'Entity',
+      value: 'EntityName'
+    }
+  },
+  presentationVariant: [ {
+    sortOrder: [
+    {
+      by: 'HierarchyDistanceFromRoot',
+      direction: #ASC
+    }
+//    ,
+//    {
+//      by: 'EntityName',
+//      direction: #DESC
+//    }
+
+    ],
+    visualizations: [ {
+      type: #AS_LINEITEM
+    } ]
+  } ]
+}
+annotate view ZDMO_C_RAPG_NodeTP with
+{
+
+
+  @UI.facet: [
+  //  {
+  //    id: 'idCollection',
+  //    type: #COLLECTION,
+  //    label: 'Entity',
+  //    position: 10
+  //  },
+  //  {
+  //    id: 'idIdentification',
+  //    parentId: 'idCollection',
+  //    type: #IDENTIFICATION_REFERENCE,
+  //    label: 'General Information',
+  //    position: 10
+  //  },
+
+    { label    : 'Entity details',
+       id       : 'Facet_05',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+       position : 05  },
+     { id       : 'FieldGroup_05',
+       purpose  : #STANDARD,
+       parentId : 'Facet_05',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_05',
+       position : 05   },
+
+
+    //Facet and field groups for field name mapping
+     { label    : 'Map fields for behavior definition',
+       id       : 'Facet_10',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+       position : 10  },
+     { id       : 'FieldGroup_10',
+       purpose  : #STANDARD,
+       parentId : 'Facet_10',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_10',
+       position : 10   },
+
+     { label    : 'Map fields for @ObjectModel annotation',
+       id       : 'Facet_15',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+       position : 15  },
+     { id       : 'FieldGroup_15',
+       purpose  : #STANDARD,
+       parentId : 'Facet_15',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_15',
+       position : 15   },
+
+     { label    : 'Map fields for parent and root UUID',
+       id       : 'Facet_20',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+  //       hidden   : #(hasSemanticKey),
+       position : 20  },
+     { id       : 'FieldGroup_20',
+       purpose  : #STANDARD,
+       parentId : 'Facet_20',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_20',
+       position : 20   },
+
+     { label    : 'Map fields for @Semantics annotation',
+       id       : 'Facet_30',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+       position : 30  },
+     { id       : 'FieldGroup_30',
+       purpose  : #STANDARD,
+       parentId : 'Facet_30',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_30',
+       position : 30   },
+
+  //     { label    : 'Map Etag and semantic key',
+  //       id       : 'FieldGroup_10_1',
+  //       purpose  : #STANDARD,
+  //       parentId : 'FieldGroup_10',
+  //       type     : #FIELDGROUP_REFERENCE,
+  //       targetQualifier: 'FieldGroup_10_1',
+  //       position : 10   },
+  //
+  //     { label    : 'Map parent and root UUID',
+  //       id       : 'FieldGroup_10_2',
+  //       purpose  : #STANDARD,
+  //       parentId : 'FieldGroup_10',
+  //       type     : #FIELDGROUP_REFERENCE,
+  //       targetQualifier: 'FieldGroup_10_2',
+  //       position : 20   },
+  //
+  //     { label    : 'Map administrative fields',
+  //       id       : 'FieldGroup_10_3',
+  //       purpose  : #STANDARD,
+  //       parentId : 'FieldGroup_10',
+  //       type     : #FIELDGROUP_REFERENCE,
+  //       targetQualifier: 'FieldGroup_10_3',
+  //       position : 30   },
+
+  //Facet and field groups for repository object names
+
+     { label    : 'Repository object names',
+       id       : 'Facet_4',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+       position : 40  },
+     { id       : 'FieldGroup_4',
+       purpose  : #STANDARD,
+       parentId : 'Facet_4',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_4',
+       position : 40   },
+
+     { label    : 'Extensibility object names',
+       id       : 'Facet_5',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+       position : 45  },
+     { id       : 'FieldGroup_5',
+       purpose  : #STANDARD,
+       parentId : 'Facet_5',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_5',
+       position : 45   },
+
+
+  {
+    id: 'idLineitem',
+    type: #LINEITEM_REFERENCE,
+    label: 'Field names',
+    position: 50 ,
+    targetElement: '_Field'
+  } ]
+
+  @UI.hidden: true
+  NodeUUID;
+
+  @UI.hidden: true
+  RapBoUUID;
+
+  @UI.hidden: true
+  ParentUUID;
+
+  @UI.hidden: true
+  RootUUID;
+
+  @UI.hidden: true
+  NodeNumber;
+
+  @UI.identification:  [ {
+  //  @UI.lineItem: [ {
+      label: 'Is root node',
+      position: 10 ,
+      importance: #HIGH
+    }
+    //  , {
+    //      label: 'Add Child',
+    //      dataAction: 'addChildNode',
+    //      type: #FOR_ACTION,
+    //      position: 10
+    //      }
+        , {
+        label: 'Add Child based on tables',
+        dataAction: 'addChildDataSourceTable',
+        type: #FOR_ACTION,
+        position: 20
+        }
+        , {
+        label: 'Add Child based on CDS',
+        dataAction: 'addChildDataSourceCDSview',
+        type: #FOR_ACTION,
+        position: 30
+        }
+        , {
+        label: 'Add Child based on Abs. Entity',
+        dataAction: 'addChildDataSourceAbsEntity',
+        type: #FOR_ACTION,
+        position: 40
+        }
+    ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_05', position: 70, label: 'Is root node' }]
+  IsRootNode;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_05', position: 10, label: 'Entity Name' }]
+  @UI.lineItem: [ {
+    label: 'Entity',
+    position: 20 ,
+    importance: #HIGH
+  } ]
+  EntityName;
+
+  @UI.lineItem: [ {
+    label: 'Parent Entity',
+    position: 30 ,
+    importance: #HIGH
+  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_05', position: 40, label: 'Parent Entity Name' }]
+  ParentEntityName;
+
+  @UI.lineItem: [ {
+    label: 'Data source',
+    position: 40 ,
+    importance: #HIGH
+  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_05', position: 30, label: 'Data Source' }]
+  DataSource;
+
+  @UI.lineItem: [ {
+    label: 'Parent data source',
+    position: 50 ,
+    importance: #HIGH
+  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_05', position: 50, label: 'Parent Data Source' }]
+  ParentDataSource;
+
+  @UI.hidden: true
+  DataSourceType;
+
+  @UI.hidden: true
+  ViewTypeValue;
+
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_15', position: 10, label: 'semanticKey' }]
+  FieldNameObjectID;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_10', position: 20, label: 'etag master' }]
+  FieldNameEtagMaster;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_10', position: 30, label: 'total etag' }]
+  FieldNameTotalEtag;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_20', position: 10, label: 'UUID based key field' }]
+  FieldNameUUID;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_20', position: 20, label: 'Parent UUID' }]
+  FieldNameParentUUID;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_20', position: 30, label: 'Root UUID' }]
+  FieldNameRootUUID;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_30', position: 20, label: 'user.createdBy: true' }]
+  FieldNameCreatedBy;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_30', position: 20, label: 'systemDateTime.createdAt: true' }]
+  FieldNameCreatedAt;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_30', position: 20, label: 'user.lastChangedBy: true' }]
+  FieldNameLastChangedBy;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_30', position: 20, label: 'systemDateTime.lastChangedAt: true' }]
+  FieldNameLastChangedAt;
+
+  @EndUserText.quickInfo: '@Semantics.systemDateTime.localInstanceLastChangedAt: true'
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_30', position: 20, label: 'localInstanceLastChangedAt' }]
+  FieldNameLocLastChangedAt;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 30, label: 'CDS Interface View / BDEF' }]
+  CdsIView;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 10, label: 'CDS Base View / BDEF' }]
+  CdsRView;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 15, label: 'CDS I View (Basic)' }]
+  CdsIViewBasic;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 20, label: 'CDS Projection View / BDEF / MDE' }]
+  CdsPView;
+
+  //  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 40, label: 'Meta Data Extension' }]
+  @UI.hidden : true
+  MdeView;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 40, label: 'Behavior Implementation Class' }]
+  BehaviorImplementationClass;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 60, label: 'Service Definition' }]
+  ServiceDefinition;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 70, label: 'Service Binding' }]
+  ServiceBinding;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 150, label: 'SAP Object Node Type' }]
+  SAPObjectNodeType;
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 160, label: 'SAP Object Type' }]
+  SAPObjectType;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 100, label: 'Control Structure'
+  //   , hidden : #(isManaged)
+   }]
+  ControlStructure;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 90, label: 'Query Implementation'
+  //  , hidden : #(doesNotUseUnmanagedQuery)
+  }]
+  QueryImplementationClass;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 50, label: 'Draft table' }]
+  DraftTableName;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_5', position: 50, label: 'Extensibility Element Suffix' }]
+  ExtensibilityElementSuffix;
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_5', position: 60, label: 'Extension Include' }]
+  ExtensionInclude;
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_5', position: 70, label: 'Extension Include View' }]
+  ExtensionIncludeView;
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_5', position: 80, label: 'Draft Query View' }]
+  DraftQueryView;
+
+  @UI.lineItem: [ {
+  label: 'Distance from root',
+  position: 15
+    ,
+    importance: #HIGH
+  } ]
+  HierarchyDistanceFromRoot;
+
+  @UI.hidden: true
+  HierarchyDescendantCount;
+
+  @UI.hidden: true
+  HierarchyDrillState;
+
+  @UI.hidden: true
+  HierarchyPreorderRank;
+
+  @UI.hidden: true
+  LocalLastChangedAt;
+}
\ No newline at end of file
diff --git a/src/zdmo_c_rapg_nodetp.ddlx.xml b/src/zdmo_c_rapg_nodetp.ddlx.xml
new file mode 100644
index 0000000..47e97ce
--- /dev/null
+++ b/src/zdmo_c_rapg_nodetp.ddlx.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLX" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLX>
+    <METADATA>
+     <NAME>ZDMO_C_RAPG_NODETP</NAME>
+     <DESCRIPTION>MDE for Node</DESCRIPTION>
+     <MASTER_LANGUAGE>EN</MASTER_LANGUAGE>
+    </METADATA>
+   </DDLX>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_c_rapg_projecttp.bdef.asbdef b/src/zdmo_c_rapg_projecttp.bdef.asbdef
new file mode 100644
index 0000000..931eec8
--- /dev/null
+++ b/src/zdmo_c_rapg_projecttp.bdef.asbdef
@@ -0,0 +1,76 @@
+projection;
+strict ;
+use draft;
+use side effects;
+
+define behavior for ZDMO_C_RAPG_ProjectTP alias Project
+use etag
+
+{
+
+  //  use create;
+  use update;
+  use delete;
+
+  use action Edit;
+  use action Activate;
+  use action Discard;
+  use action Resume;
+  use action Prepare;
+
+  use action createProjectAndRootNode;
+  use action copyProject;
+  use action deleteProject;
+  use action generateProject;
+
+  use association _Log
+  {
+    //  create;
+    with draft; }
+  use association _Node
+  {
+//      create;
+    with draft; }
+}
+
+define behavior for ZDMO_C_RAPG_LogTP alias Log
+use etag
+
+{
+  use update;
+  use delete;
+
+  use association _Project { with draft; }
+}
+
+define behavior for ZDMO_C_RAPG_NodeTP alias Node
+use etag
+
+{
+  use update;
+  use delete;
+
+//   use action addChildNode;
+   use action addChildDataSourceAbsEntity;
+   use action addChildDataSourceCDSview;
+   use action addChildDataSourceTable;
+//  use action createRootNode;
+//  use action SetRepositoryObjectNames;
+
+  use association _Project { with draft; }
+  use association _Field
+  {
+    //   create;
+    with draft; }
+}
+
+define behavior for ZDMO_C_RAPG_FieldTP alias Field
+use etag
+
+{
+  use update;
+  use delete;
+
+  use association _Project { with draft; }
+  use association _Node { with draft; }
+}
\ No newline at end of file
diff --git a/src/zdmo_c_rapg_projecttp.bdef.xml b/src/zdmo_c_rapg_projecttp.bdef.xml
new file mode 100644
index 0000000..76349ed
--- /dev/null
+++ b/src/zdmo_c_rapg_projecttp.bdef.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_BDEF" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <BDEF>
+    <NAME>ZDMO_C_RAPG_PROJECTTP</NAME>
+    <TYPE>BDEF/BDO</TYPE>
+    <DESCRIPTION>Behavior for ZDMO_C_RAPG_ProjectTP</DESCRIPTION>
+    <DESCRIPTION_TEXT_LIMIT>60</DESCRIPTION_TEXT_LIMIT>
+    <LANGUAGE>EN</LANGUAGE>
+    <LINKS>
+     <item>
+      <HREF>./zdmo_c_rapg_projecttp/source/main/versions</HREF>
+      <REL>http://www.sap.com/adt/relations/versions</REL>
+      <TITLE>Historic versions</TITLE>
+     </item>
+     <item>
+      <HREF>./zdmo_c_rapg_projecttp/source/main</HREF>
+      <REL>http://www.sap.com/adt/relations/source</REL>
+      <TYPE>text/plain</TYPE>
+      <TITLE>Source Content</TITLE>
+     </item>
+     <item>
+      <HREF>./zdmo_c_rapg_projecttp/source/main</HREF>
+      <REL>http://www.sap.com/adt/relations/source</REL>
+      <TYPE>text/html</TYPE>
+      <TITLE>Source Content (HTML)</TITLE>
+     </item>
+    </LINKS>
+    <MASTER_LANGUAGE>EN</MASTER_LANGUAGE>
+    <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION>
+    <SOURCE_URI>./zdmo_c_rapg_projecttp/source/main</SOURCE_URI>
+    <SOURCE_TYPE>ABAP_SOURCE</SOURCE_TYPE>
+    <SOURCE_FIXED_POINT_ARITHMETIC>true</SOURCE_FIXED_POINT_ARITHMETIC>
+    <SOURCE_UNICODE_CHECKS_ACTIVE>true</SOURCE_UNICODE_CHECKS_ACTIVE>
+   </BDEF>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_c_rapg_projecttp.ddls.asddls b/src/zdmo_c_rapg_projecttp.ddls.asddls
new file mode 100644
index 0000000..972ab03
--- /dev/null
+++ b/src/zdmo_c_rapg_projecttp.ddls.asddls
@@ -0,0 +1,82 @@
+@AccessControl.authorizationCheck: #CHECK
+@Metadata.allowExtensions: true
+@EndUserText.label: 'Projection View forProject'
+@ObjectModel.semanticKey: [ 'BoName' ]
+@Search.searchable: true
+define root view entity ZDMO_C_RAPG_ProjectTP
+  provider contract transactional_query
+  as projection on ZDMO_R_RAPG_ProjectTP
+{
+  key      RapBoUUID,
+           @Search.defaultSearchElement: true
+           @Search.fuzzinessThreshold: 0.90
+           BoName,
+           RootEntityName,
+           Namespace,
+           @EndUserText.label: 'Package'
+           @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_PACKAGE', element: 'name' }}]
+           PackageName,
+           TransportRequest,
+           SkipActivation,
+           AddIViewBasic,
+           PublishService,
+           ImplementationType,
+           AbapLanguageVersion,
+           PackageLanguageVersion,
+           DataSourceType,
+           BindingType,
+           DraftEnabled,
+           Suffix,
+           Prefix,
+           MultiInlineEdit,
+           CustomizingTable,
+           AddToManageBusinessConfig,
+           BusinessConfName,
+           BusinessConfIdentifier,
+           BusinessConfDescription,
+           CreatedAt,
+           CreatedBy,
+           LastChangedBy,
+           LastChangedAt,
+           LocalLastChangedAt,
+           JsonString,
+           JsonIsValid,
+           BoIsGenerated,
+           BoIsDeleted,
+           ApplJobLogHandle,
+           JobCount,
+           JobName,
+           ADTLink,
+           isManaged,
+           doesNotUseUnmanagedQuery,
+           hasSematicKey,
+           isExtensible,
+           extensibilityElementSuffix,
+           SAPObjectType,
+           AddSAPObjectType,
+           @EndUserText.label: 'Hide ADT Link'
+           @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS'
+  virtual  HideADTLink            : abap_boolean,
+           //           @EndUserText.label: 'Job Status'
+           //           @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS'
+           //  virtual  JobStatus              : abap.char( 1 ),
+           //           @EndUserText.label: 'Generation'
+           //           @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS'
+           //  virtual  JobStatusText          : abap.char( 20 ),
+           //           @EndUserText.label: 'Criticality'
+           //           @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS'
+           //  virtual  JobStatusCriticality   : abap.int1,
+           JobStatus,
+           JobStatusCriticality,
+           JobStatusText,
+           @EndUserText.label: 'Repository objects exist'
+           @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS'
+
+  virtual  RepositoryObjectsExist : abap_boolean,
+
+
+
+           _Log  : redirected to composition child ZDMO_C_RAPG_LogTP,
+           _Node : redirected to composition child ZDMO_C_RAPG_NodeTP
+
+}
diff --git a/src/zdmo_c_rapg_projecttp.ddls.baseinfo b/src/zdmo_c_rapg_projecttp.ddls.baseinfo
new file mode 100644
index 0000000..156966f
--- /dev/null
+++ b/src/zdmo_c_rapg_projecttp.ddls.baseinfo
@@ -0,0 +1,26 @@
+{
+"BASEINFO":
+{
+"FROM":
+[
+"ZDMO_R_RAPG_PROJECTTP"
+],
+"ASSOCIATED":
+[
+"ZDMO_C_RAPG_LOGTP",
+"ZDMO_C_RAPG_NODETP",
+"ZDMO_R_RAPG_LOGTP",
+"ZDMO_R_RAPG_NODETP"
+],
+"BASE":
+[
+"ZDMO_R_RAPG_PROJECTTP"
+],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_c_rapg_projecttp.ddls.xml b/src/zdmo_c_rapg_projecttp.ddls.xml
new file mode 100644
index 0000000..4b8c7bd
--- /dev/null
+++ b/src/zdmo_c_rapg_projecttp.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_C_RAPG_PROJECTTP</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Projection View for Project</DDTEXT>
+    <SOURCE_TYPE>P</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_c_rapg_projecttp.ddlx.asddlxs b/src/zdmo_c_rapg_projecttp.ddlx.asddlxs
new file mode 100644
index 0000000..f31eaf7
--- /dev/null
+++ b/src/zdmo_c_rapg_projecttp.ddlx.asddlxs
@@ -0,0 +1,422 @@
+@Metadata.layer: #CUSTOMER
+@UI: {
+headerInfo: {
+typeName: 'Project',
+typeNamePlural: 'Projects',
+description.url: 'ADTLink'
+,
+title: {
+type: #STANDARD,
+label: 'Project',
+value: 'BoName'
+}
+},
+presentationVariant: [ {
+  sortOrder: [ {
+  by: 'LocalLastChangedAt',
+  direction: #DESC
+  } ],
+  visualizations: [ {
+  type: #AS_LINEITEM
+  } ],
+    maxItems: 20
+  } ],
+  selectionVariant: [
+  {
+    qualifier: 'svariant',
+    text: 'Press the Go button',
+    filter: 'ImplementationType NE '' '
+  }
+]
+
+
+}
+annotate view ZDMO_C_RAPG_ProjectTP with
+{
+
+
+
+  @UI.facet: [
+
+  //  {
+  //    id: 'idCollection',
+  //    type: #COLLECTION,
+  //    label: 'Project',
+  //    position: 05
+  //  },
+  //  {
+  //    id: 'idIdentification',
+  //    parentId: 'idCollection',
+  //    type: #IDENTIFICATION_REFERENCE,
+  //    label: 'General Information',
+  //    position: 07
+  //  },
+
+  // Show ADT Link and Job Status in Header
+  {
+    purpose: #HEADER,
+    type: #FIELDGROUP_REFERENCE,
+    position: 50,
+    targetQualifier: 'Fieldgroup_0'
+   },
+
+
+  //Facet and field group for implementation details ( managed, draft, .. )
+     { label    : 'Implementation details',
+       id       : 'Facet_1',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+       position : 20  },
+     { id       : 'FieldGroup_1',
+       purpose  : #STANDARD,
+       parentId : 'Facet_1',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_1',
+       position : 20   },
+
+  //Facet and field group for prefix, suffix and namespace
+     { label    : 'Naming parameters',
+       id       : 'Facet_2',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+       position : 30  },
+     { id       : 'FieldGroup_2',
+       purpose  : #STANDARD,
+       parentId : 'Facet_2',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_2',
+       position : 30   },
+
+  //Facet and field group for lifecycle management related information
+     { label    : 'Lifecycle Management',
+       id       : 'Facet_3',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+       position : 40  },
+     { id       : 'FieldGroup_3',
+       purpose  : #STANDARD,
+       parentId : 'Facet_3',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_3',
+       isPartOfPreview: true,
+       position : 40   },
+
+  //Facet and field group for optional parameters
+     { label    : 'Optional parameters',
+       id       : 'Facet_4',
+       purpose  : #STANDARD,
+       type     : #COLLECTION,
+  //       isPartOfPreview: false,
+       position : 50  },
+     { id       : 'FieldGroup_4',
+       purpose  : #STANDARD,
+       parentId : 'Facet_4',
+       type     : #FIELDGROUP_REFERENCE,
+       targetQualifier: 'FieldGroup_4',
+  //       isPartOfPreview: false,
+       position : 50   },
+
+
+  {
+    id: 'idLineitem',
+    type: #LINEITEM_REFERENCE,
+    label: 'Entities',
+    position: 10 ,
+    targetElement: '_Node'
+  }
+  ,
+  {
+  id: 'idLog',
+  type: #LINEITEM_REFERENCE,
+  label: 'Generation Log',
+  position: 70 ,
+  targetElement: '_Log'
+  }
+
+
+  ]
+
+
+
+  @UI.hidden: true
+  RapBoUUID;
+
+  @UI.lineItem: [ {
+    position: 20 ,
+    importance: #HIGH
+  }
+  ,
+    {  type: #FOR_ACTION, dataAction: 'createProjectAndRootNode', label: 'New Project'   }
+    ,
+    {  type: #FOR_ACTION, dataAction: 'copyProject', label: 'Copy Project'  }
+    ,
+    {  type: #FOR_ACTION, dataAction: 'deleteProject', label: 'Delete repository objects' }
+
+
+
+  ]
+
+  @UI.identification: [ {
+    position: 20 ,
+    importance: #HIGH
+  }
+
+  ,
+    { type: #FOR_ACTION, dataAction: 'generateProject', label: 'Generate repository objects' }
+      ,
+      {  type: #FOR_ACTION, dataAction: 'copyProject', label: 'Copy Project' }
+    ,
+    {  type: #FOR_ACTION, dataAction: 'deleteProject', label: 'Delete repository objects' }
+
+
+
+  ]
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_0', position: 10, label: 'RAP BO Name' }
+
+  //  ,
+  //    { type: #FOR_ACTION, dataAction: 'generateProject', label: 'Generate repository objects' }
+  //      ,
+  //      {  type: #FOR_ACTION, dataAction: 'copyProject', label: 'Copy Project' }
+  //    ,
+  //    {  type: #FOR_ACTION, dataAction: 'deleteProject', label: 'Delete repository objects' }
+  //
+
+  ]
+  @UI.selectionField: [ {
+    position: 20
+  } ]
+  @EndUserText.label: 'RAP BO Name'
+  BoName;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_0', position: 10, label: 'SAP Object Type' }
+
+   ]
+  @UI.selectionField: [ {
+    position: 20
+  } ]
+  @EndUserText.label: 'SAP Object Type'
+  SAPObjectType;
+
+  @UI.lineItem: [ {
+    position: 30 ,
+    importance: #HIGH
+  } ]
+  //  @UI.identification: [ {
+  //    position: 30
+  //  } ]
+  RootEntityName;
+
+  //  @UI.lineItem: [ {
+  //    position: 40 ,
+  //    importance: #HIGH
+  //  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_2', position: 10, label: 'Namespace' }]
+  Namespace;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 50, label: 'Package' }]
+
+  @UI.lineItem: [ {
+    position: 180 ,
+    importance: #HIGH,
+    label: 'Package Name'
+  } ]
+
+  PackageName;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_3', position: 10, label: 'Transport' }]
+  TransportRequest;
+
+  @UI.hidden: true
+  SkipActivation;
+
+  @UI.lineItem: [ {
+    position: 80 ,
+    importance: #HIGH,
+    label: 'Implementation_Key Type'
+  } ]
+  //  @UI.identification: [ {
+  //    position: 80 ,
+  //    label: 'ImplementationType'
+  //  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 10, label: 'Implementation_Key Type' }]
+  ImplementationType;
+
+  @UI.hidden: true
+  AbapLanguageVersion;
+
+  @UI.hidden: true
+  PackageLanguageVersion;
+
+  @UI.lineItem: [ {
+    position: 110 ,
+    importance: #HIGH,
+    label: 'DataSourceType'
+  } ]
+  //  @UI.identification: [ {
+  //    position: 110 ,
+  //    label: 'DataSourceType'
+  //  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 20, label: 'Datasource type' }]
+  DataSourceType;
+
+  @UI.lineItem: [ {
+    position: 120 ,
+    importance: #HIGH,
+    label: 'BindingType'
+  } ]
+  //  @UI.identification: [ {
+  //    position: 120 ,
+  //    label: 'BindingType'
+  //  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 30, label: 'Binding type' }]
+  BindingType;
+
+  @UI.lineItem: [ {
+    position: 130 ,
+    importance: #HIGH,
+    label: 'Draft enabled'
+  } ]
+  //  @UI.identification: [ {
+  //    position: 130
+  //  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 40, label: 'Draft enabled' }]
+  DraftEnabled;
+
+  //  @UI.lineItem: [ {
+  //    position: 140 ,
+  //    importance: #HIGH
+  //  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_2', position: 30, label: 'Suffix' }]
+  Suffix;
+
+  //  @UI.lineItem: [ {
+  //    position: 150 ,
+  //    importance: #HIGH
+  //  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_2', position: 20, label: 'Prefix' }]
+  Prefix;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 10, label: 'Multi Inline Edit' }]
+  MultiInlineEdit;
+
+//  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 10, label: 'Record customizing' }]
+  @UI.hidden: true
+  CustomizingTable;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 10, label: 'Add to manage business configuration' }]
+  AddToManageBusinessConfig;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 20, label: 'Create service' }]
+  PublishService;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 20, label: 'Add basic i-views' }]
+  AddIViewBasic;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 30, label: 'Add SAPObjectType' }]
+  AddSAPObjectType;
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 30, label: 'is extensible' }]
+  isExtensible;
+
+  //  @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 40, label: 'Extensibility Suffix' }]
+  @UI.hidden: true
+  extensibilityElementSuffix;
+
+  @UI.hidden: true
+  BusinessConfName;
+
+  @UI.hidden: true
+  BusinessConfIdentifier;
+
+  @UI.hidden: true
+  BusinessConfDescription;
+
+  @UI.hidden: true
+  CreatedAt;
+
+  @UI.lineItem: [ {
+    position: 230 ,
+    importance: #HIGH
+  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_3', position: 40, label: 'Created by' }]
+  CreatedBy;
+
+  @UI.hidden: true
+  LastChangedBy;
+
+  @UI.lineItem: [ {
+    position: 250 ,
+    importance: #HIGH
+  } ]
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_3', position: 30, label: 'Last changed at' }]
+  LastChangedAt;
+
+  @UI.hidden: true
+  LocalLastChangedAt;
+
+
+  @UI.fieldGroup: [{ qualifier: 'FieldGroup_3', position: 30, label: 'Json string'
+  //  , isPartOfPreview: true
+  }]
+  @UI.multiLineText: true
+  JsonString;
+
+  @UI.hidden: true
+  JsonIsValid;
+
+  @UI.hidden: true
+  BoIsGenerated;
+
+  @UI.hidden: true
+  BoIsDeleted;
+
+  @UI.hidden: true
+  ApplJobLogHandle;
+
+  @UI.hidden: true
+  JobCount;
+
+  @UI.hidden: true
+  JobName;
+
+  @UI: { fieldGroup:     [ { qualifier: 'Fieldgroup_0',
+                             position: 50 ,
+                             label: 'ADT Link'    ,
+                             type: #WITH_URL,
+                             url: 'ADTLink'
+                             ,
+                             hidden: #(HideADTLink)
+                             }
+                           ] }
+
+  ADTLink;
+
+  // virtual fields
+
+  @UI.lineItem: [ {
+  position: 220 ,
+  importance: #HIGH,
+  label: 'Job Status',
+  criticality: 'JobStatusCriticality'
+  } ]
+  @UI: { fieldGroup:     [ { qualifier: 'Fieldgroup_0',
+                             position: 40 ,
+                             label: 'Job Status',
+                             criticality: 'JobStatusCriticality'} ] }
+  @UI.dataPoint: {title: 'Generation Job Status', targetValueElement: 'JobStatusText', criticality: 'JobStatusCriticality',
+  criticalityRepresentation: #WITH_ICON}
+  JobStatusText;
+
+  @UI.lineItem: [ {
+    position: 110 ,
+    importance: #HIGH,
+    label: 'Repository objects exist'
+  } ]
+  @UI: { fieldGroup:     [ { qualifier: 'Fieldgroup_0',
+                             position: 40 ,
+                             label: 'Repository Objects Exist'} ] }
+  RepositoryObjectsExist;
+
+
+}
\ No newline at end of file
diff --git a/src/zdmo_c_rapg_projecttp.ddlx.xml b/src/zdmo_c_rapg_projecttp.ddlx.xml
new file mode 100644
index 0000000..df09e37
--- /dev/null
+++ b/src/zdmo_c_rapg_projecttp.ddlx.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLX" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLX>
+    <METADATA>
+     <NAME>ZDMO_C_RAPG_PROJECTTP</NAME>
+     <DESCRIPTION>MDE for Project</DESCRIPTION>
+     <MASTER_LANGUAGE>EN</MASTER_LANGUAGE>
+    </METADATA>
+   </DDLX>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_create_rapxxx_packages.clas.abap b/src/zdmo_cl_create_rapxxx_packages.clas.abap
new file mode 100644
index 0000000..81fd490
--- /dev/null
+++ b/src/zdmo_cl_create_rapxxx_packages.clas.abap
@@ -0,0 +1,42 @@
+CLASS zdmo_cl_create_rapxxx_packages DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_oo_adt_classrun .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_CREATE_RAPXXX_PACKAGES IMPLEMENTATION.
+
+
+  METHOD if_oo_adt_classrun~main.
+
+    DATA group_number_start TYPE i VALUE 1.
+    DATA group_number_end TYPE i.
+    DATA number_of_groups TYPE i VALUE 50.
+    DATA group_number TYPE i.
+    DATA group_number_n(3) TYPE n.
+
+    DATA rapxxx_generator TYPE REF TO zdmo_gen_rap630_single.
+    "DATA rapxxx_generator TYPE REF TO zdmo_gen_rap110_single.
+
+    group_number = group_number_start.
+    group_number_end = group_number_start + number_of_groups .
+
+    WHILE group_number < group_number_end.
+
+      group_number_n = group_number.
+      out->write( |start generation with groupnumber { group_number_n }| ).
+
+      rapxxx_generator = NEW #( CONV #( group_number_n ) ).
+      rapxxx_generator->if_oo_adt_classrun~main( out  ).
+      group_number += 1.
+
+    ENDWHILE.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_create_rapxxx_packages.clas.xml b/src/zdmo_cl_create_rapxxx_packages.clas.xml
new file mode 100644
index 0000000..ebcda8a
--- /dev/null
+++ b/src/zdmo_cl_create_rapxxx_packages.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_CREATE_RAPXXX_PACKAGES</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Create xxx packages for RAP110 or RAP630</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_fe_travel_generator.clas.abap b/src/zdmo_cl_fe_travel_generator.clas.abap
new file mode 100644
index 0000000..dfd5047
--- /dev/null
+++ b/src/zdmo_cl_fe_travel_generator.clas.abap
@@ -0,0 +1,1769 @@
+CLASS zdmo_cl_fe_travel_generator DEFINITION
+INHERITING FROM zdmo_cl_rap_generator_base
+**************************************************************************
+**
+** Welcome to the SAP Fiori elements travel exercise generator!
+**
+** For exercises which focus on SAP Fiori elements and not the creation of
+** an OData service, this generator was developed. It creates all the
+** required RAP development artifacts for a travel scenario. You can then
+** use this OData service and enhance its metadata extensions.
+** However, if you’re interested in how to build such an OData service
+** from scratch using RAP, check out the openSAP course "Building Apps
+** with the ABAP RESTful Application Programming Model".
+**
+** Instructions:
+**
+** 1. Make sure the "Console" view is shown. If you can't see it, you can
+**    open it using "Window" -> "Show View" -> "Other" -> "Console".
+**
+** 2. Right-click in this window and choose:
+**    "Run As" -> "ABAP Application (Console)"
+**    That takes a little over a minute.
+**
+** 3. When the generation finished your personal package name will be
+**    printed to the "Console" view. It's important to note down your
+**    package name!
+**
+** 4. In the "Project Explorer" right click on "Favorite Packages" and
+**    click on "Add Package...". Enter your personal package name
+**    (ZFE_TRAVEL_######) and click OK.
+**
+** 5. Have fun with the exercise! :)
+**
+**************************************************************************
+
+
+  PUBLIC
+*  INHERITING FROM cl_xco_cp_adt_simple_classrun
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_oo_adt_classrun.
+    METHODS constructor.
+
+  PROTECTED SECTION.
+*    METHODS main REDEFINITION.
+
+  PRIVATE SECTION.
+    CONSTANTS:
+      co_prefix         TYPE string         VALUE 'ZFE_TRAVEL_',
+      co_zlocal_package TYPE sxco_package   VALUE 'ZLOCAL'.
+
+    DATA xco_on_prem_library TYPE REF TO zdmo_cl_rap_xco_on_prem_lib  .
+    DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib.
+
+    DATA package_name           TYPE sxco_package .
+    DATA unique_suffix          TYPE string.
+*    DATA mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system.
+    DATA transport              TYPE sxco_transport .
+    DATA table_name_root        TYPE sxco_dbt_object_name.
+    DATA table_name_child       TYPE sxco_dbt_object_name.
+    DATA table_name_status      TYPE sxco_dbt_object_name.
+    DATA table_name_carrier     TYPE sxco_dbt_object_name.
+    DATA table_name_connection  TYPE sxco_dbt_object_name.
+    DATA table_name_flight      TYPE sxco_dbt_object_name.
+    DATA draft_table_name_root  TYPE sxco_dbt_object_name.
+    DATA draft_table_name_child TYPE sxco_dbt_object_name.
+    DATA i_view_name_status     TYPE sxco_cds_object_name.
+    DATA i_view_name_carrier    TYPE sxco_cds_object_name.
+    DATA i_view_name_connection TYPE sxco_cds_object_name.
+    DATA i_view_name_flight     TYPE sxco_cds_object_name.
+    DATA i_view_name_a_travel   TYPE sxco_cds_object_name.
+    DATA i_view_name_a_booking  TYPE sxco_cds_object_name.
+    DATA c_view_name_a_booking  TYPE sxco_cds_object_name.
+    DATA sqlviewname_a_travel   TYPE sxco_cds_object_name.
+    DATA sqlviewname_a_booking  TYPE sxco_cds_object_name.
+    DATA srv_definition_analytics TYPE sxco_cds_object_name.
+    DATA srv_binding_analytics  TYPE sxco_cds_object_name.
+    DATA create_mde_files       TYPE abap_bool.
+    DATA data_generator_class_name TYPE sxco_ad_object_name.
+
+
+    DATA cdsinterfaceviewbasic_travel  TYPE sxco_cds_object_name.
+    DATA cdsrestrictedreuseview_travel  TYPE sxco_cds_object_name.
+    DATA cdsinterfaceview_travel TYPE sxco_cds_object_name.
+    DATA cdsprojectionview_travel TYPE sxco_cds_object_name.
+    DATA metadataextensionview_travel TYPE sxco_cds_object_name.
+
+    DATA cdsinterfaceviewbasic_book  TYPE sxco_cds_object_name.
+    DATA cdsrestrictedreuseview_book  TYPE sxco_cds_object_name.
+    DATA cdsinterfaceview_book TYPE sxco_cds_object_name.
+    DATA cdsprojectionview_book TYPE sxco_cds_object_name.
+    DATA metadataextensionview_book TYPE sxco_cds_object_name.
+
+    DATA show_findings TYPE abap_boolean VALUE abap_false.
+
+    TYPES: BEGIN OF t_table_fields,
+             field                  TYPE sxco_ad_field_name,
+             is_key                 TYPE abap_bool,
+             not_null               TYPE abap_bool,
+             currencyCode           TYPE sxco_cds_field_name,
+             unitOfMeasure          TYPE sxco_cds_field_name,
+             data_element           TYPE sxco_ad_object_name,
+             built_in_type          TYPE cl_xco_ad_built_in_type=>tv_type,
+             built_in_type_length   TYPE cl_xco_ad_built_in_type=>tv_length,
+             built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals,
+           END OF t_table_fields.
+
+    TYPES: tt_fields TYPE STANDARD TABLE OF t_table_fields WITH KEY field.
+
+    METHODS get_unique_suffix
+      IMPORTING
+        VALUE(s_prefix)        TYPE string
+      RETURNING
+        VALUE(s_unique_suffix) TYPE string.
+
+    METHODS create_transport
+      RETURNING
+        VALUE(lo_transport) TYPE sxco_transport.
+
+    METHODS create_super_package.
+
+    METHODS create_package
+      IMPORTING
+        VALUE(lo_transport) TYPE sxco_transport.
+
+    METHODS generate_table  IMPORTING table_fields            TYPE tt_fields
+*                                      io_put_operation        TYPE REF TO if_xco_cp_gen_d_o_put
+                                      table_name              TYPE sxco_dbt_object_name
+                                      table_short_description TYPE if_xco_cp_gen_tabl_dbt_s_form=>tv_short_description.
+
+    METHODS get_root_table_fields RETURNING VALUE(root_table_fields) TYPE tt_fields.
+
+    METHODS get_child_table_fields RETURNING VALUE(child_table_fields) TYPE tt_fields.
+
+    METHODS get_status_table_fields RETURNING VALUE(status_table_fields) TYPE tt_fields.
+    METHODS generate_status_i_view
+*      IMPORTING io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put
+      .
+
+    METHODS get_carrier_table_fields RETURNING VALUE(carrier_table_fields) TYPE tt_fields.
+    METHODS generate_carrier_i_view
+*      IMPORTING io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put
+      .
+
+    METHODS get_connection_table_fields RETURNING VALUE(connection_table_fields) TYPE tt_fields.
+    METHODS generate_connection_i_view
+*      IMPORTING io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put
+      .
+
+    METHODS get_flight_table_fields RETURNING VALUE(flight_table_fields) TYPE tt_fields.
+    METHODS generate_flight_i_view
+*      IMPORTING io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put
+      .
+
+    METHODS generate_data_generator_class IMPORTING VALUE(lo_transport) TYPE sxco_transport
+*                                                    io_put_operation    TYPE REF TO if_xco_cp_gen_d_o_put
+      .
+
+    METHODS release_data_generator_class
+      IMPORTING VALUE(lo_transport) TYPE sxco_transport
+      .
+
+    METHODS generate_analytics_service
+*      IMPORTING io_put_operation1 TYPE REF TO if_xco_cp_gen_d_o_put
+*                io_put_operation2 TYPE REF TO if_xco_cp_gen_d_o_put
+      .
+    METHODS get_json_string RETURNING VALUE(json_string) TYPE string.
+
+    METHODS get_json_string_status RETURNING VALUE(json_string_status) TYPE string.
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_FE_TRAVEL_GENERATOR IMPLEMENTATION.
+
+
+  METHOD constructor.
+    super->constructor( ).
+
+    xco_on_prem_library = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+    "check whether being on cloud or on prem
+    IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_true.
+      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+
+    unique_suffix          = get_unique_suffix( co_prefix ).
+    package_name           = co_prefix && unique_suffix. " your package name
+
+    table_name_root        = |zfe_atrav_{ unique_suffix }|.
+    table_name_child       = |zfe_abook_{ unique_suffix }|.
+    table_name_status      = |zfe_astat_{ unique_suffix }|.
+    table_name_carrier     = |zfe_acarr_{ unique_suffix }|.
+    table_name_connection  = |zfe_aconn_{ unique_suffix }|.
+    table_name_flight      = |zfe_aflig_{ unique_suffix }|.
+    draft_table_name_root  = |zfe_dtrav_{ unique_suffix }|.
+    draft_table_name_child = |zfe_dbook_{ unique_suffix }|.
+    i_view_name_status     = |zi_fe_stat_{ unique_suffix }|.
+    i_view_name_carrier    = |zi_fe_carr_{ unique_suffix }|.
+    i_view_name_connection = |zi_fe_conn_{ unique_suffix }|.
+    i_view_name_flight     = |zi_fe_flig_{ unique_suffix }|.
+    i_view_name_a_booking  = |zi_fe_booking_analytics_{ unique_suffix }|.
+    i_view_name_a_travel   = |zi_fe_travel_analytics_{ unique_suffix }|.
+    c_view_name_a_booking  = |zc_fe_booking_analytics_{ unique_suffix }|.
+    srv_definition_analytics = |zfe_booking_analytics_{ unique_suffix }|.
+    srv_binding_analytics  = |zui_fe_booking_{ unique_suffix }_o2|.
+    sqlviewname_a_travel   = |ZIFETRVANA{ unique_suffix }|.
+    sqlviewname_a_booking  = |ZIFEBOKANA{ unique_suffix }|.
+    data_generator_class_name = |ZFE_DATA_GENERATOR_{ unique_suffix }|.
+    create_mde_files       = abap_false.
+
+    cdsinterfaceviewbasic_travel = |ZI_FE_TRAVEL_B_{ unique_suffix }|.
+    cdsrestrictedreuseview_travel = |ZI_FE_TRAVEL_{ unique_suffix }|.
+    cdsinterfaceview_travel = |ZI_FE_TRAVEL_TP_{ unique_suffix }|.
+    cdsprojectionview_travel = |ZC_FE_TRAVEL_{ unique_suffix }|.
+    metadataextensionview_travel = |ZC_FE_TRAVEL_{ unique_suffix }|.
+
+    cdsinterfaceviewbasic_book = |ZI_FE_BOOKING_B_{ unique_suffix }|.
+    cdsrestrictedreuseview_book = |ZI_FE_BOOKING_{ unique_suffix }|.
+    cdsinterfaceview_book = |ZI_FE_BOOKING_TP_{ unique_suffix }|.
+    cdsprojectionview_book = |ZC_FE_BOOKING_{ unique_suffix }|.
+    metadataextensionview_book = |ZC_FE_BOOKING_{ unique_suffix }|.
+
+
+
+  ENDMETHOD.
+
+
+  METHOD create_package.
+    DATA(package_environment) = get_environment( lo_transport ).
+    DATA(lo_put_operation) = get_put_operation_for_devc( package_environment ).
+    DATA(lo_specification) = lo_put_operation->add_object( package_name )->create_form_specification( ).
+    lo_specification->set_short_description( 'FE tutorial package' ).
+    lo_specification->properties->set_super_package( co_zlocal_package )->set_software_component( co_zlocal_package ).
+    lo_put_operation->execute( ).
+  ENDMETHOD.
+
+
+  METHOD create_super_package.
+    DATA(lo_environment) = get_environment(  ).
+    DATA(lo_put_operation) = get_put_operation_for_devc( lo_environment ).
+    DATA(lo_specification) = lo_put_operation->add_object( co_zlocal_package )->create_form_specification( ).
+    lo_specification->set_short_description( 'FE tutorial super package' ).
+    lo_specification->properties->set_software_component( 'LOCAL' ).
+    lo_put_operation->execute( ).
+  ENDMETHOD.
+
+
+  METHOD create_transport.
+    DATA(ls_package) = xco_lib->get_package( co_zlocal_package ).
+    IF ls_package->read( )-property-record_object_changes = abap_true.
+*    DATA(ls_package) = xco_cp_abap_repository=>package->for( co_zlocal_package )->read( ).
+      DATA(lv_transport_layer) = ls_package->read( )-property-transport_layer->value.
+      DATA(lv_transport_target) = ls_package->read( )-property-transport_layer->get_transport_target( )->value.
+      DATA(lo_transport_request) = xco_cp_cts=>transports->workbench( lv_transport_target )->create_request( 'Generated FE tutorial transport request' ).
+      lo_transport = lo_transport_request->value.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD generate_analytics_service.
+
+*   Create travel i view
+    DATA(lo_interface_spec_i_travel) = mo_put_operation1->for-ddls->add_object( i_view_name_a_travel
+      )->set_package( package_name
+      )->create_form_specification( ).
+
+    DATA(lo_view_entity_i_travel) = lo_interface_spec_i_travel->set_short_description( 'Travel view for Booking Analysis'
+      ")->add_view( ).
+       )->add_view_entity( ).
+    " lo_view_entity_i_travel->data_source->set_entity( CONV #( table_name_root ) )->set_alias( 'Travel' ).
+    lo_view_entity_i_travel->data_source->set_view_entity( CONV #( table_name_root ) )->set_alias( 'Travel' ).
+    " View annotations.
+    "lo_view_entity_i_travel->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( CONV #( sqlviewname_a_travel ) ).
+    lo_view_entity_i_travel->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ).
+    lo_view_entity_i_travel->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Travel view entity for booking analysis' ).
+    lo_view_entity_i_travel->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ).
+
+    " add associations
+    DATA(lo_condition_i_travel) = xco_cp_ddl=>field( 'AgencyID' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'AgencyID' )->of( '_Agency' ) ).
+    lo_view_entity_i_travel->add_association( '/DMO/I_Agency' )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 0 iv_max = 1 ) )->set_alias( '_Agency' )->set_condition( lo_condition_i_travel ).
+
+    lo_condition_i_travel = xco_cp_ddl=>field( 'CustomerID' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'CustomerID' )->of( '_Customer' ) ).
+    lo_view_entity_i_travel->add_association( '/DMO/I_Customer' )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 0 iv_max = 1 ) )->set_alias( '_Customer' )->set_condition( lo_condition_i_travel ).
+
+    " Add fields.
+    DATA(lo_identifier_i_travel) = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'TRAVEL_UUID' ) )->set_key( )->set_alias( 'TravelUUID' ).
+
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'TRAVEL_ID' ) )->set_alias( 'TravelID' ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'AGENCY_ID' ) )->set_alias( 'AgencyID' ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'CUSTOMER_ID' ) )->set_alias( 'CustomerID' ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'BEGIN_DATE' ) )->set_alias( 'BeginDate' ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'END_DATE' ) )->set_alias( 'EndDate' ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'BOOKING_FEE' ) )->set_alias( 'BookingFee' ).
+    lo_identifier_i_travel->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'CurrencyCode' ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'TOTAL_PRICE' ) )->set_alias( 'TotalPrice' ).
+    lo_identifier_i_travel->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'CurrencyCode' ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'CURRENCY_CODE' ) )->set_alias( 'CurrencyCode' ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'DESCRIPTION' ) )->set_alias( 'Description' ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'OVERALL_STATUS' ) )->set_alias( 'OverallStatus' ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'CREATED_BY' ) )->set_alias( 'CreatedBy' ).
+    lo_identifier_i_travel->add_annotation( 'Semantics.user.createdBy' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'CREATED_AT' ) )->set_alias( 'CreatedAt' ).
+    lo_identifier_i_travel->add_annotation( 'Semantics.systemDateTime.createdAt' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'LAST_CHANGED_BY' ) )->set_alias( 'LastChangedBy' ).
+    lo_identifier_i_travel->add_annotation( 'Semantics.user.lastChangedBy' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'LAST_CHANGED_AT' ) )->set_alias( 'LAST_CHANGED_AT' ).
+    lo_identifier_i_travel->add_annotation( 'Semantics.systemDateTime.lastChangedAt' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'LOCAL_LAST_CHANGED_AT' ) )->set_alias( 'LocalLastChangedAt' ).
+    lo_identifier_i_travel->add_annotation( 'Semantics.systemDateTime.localInstanceLastChangedAt' )->value->build( )->add_boolean( abap_true ).
+
+    " add association to publish
+    lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( '_Agency' ) ).
+    lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( '_Customer' ) ).
+
+*   Create booking i view
+    DATA(lo_interface_spec_i_booking) = mo_put_operation1->for-ddls->add_object( i_view_name_a_booking
+      )->set_package( package_name
+      )->create_form_specification( ).
+
+    DATA(lo_view_entity_i_booking) = lo_interface_spec_i_booking->set_short_description( 'Booking view for Booking Analysis'
+      ")->add_view( ).
+        )->add_view_entity( ).
+    "lo_view_entity_i_booking->data_source->set_entity( CONV #( table_name_child ) )->set_alias( 'Booking' ).
+    lo_view_entity_i_booking->data_source->set_view_entity( CONV #( table_name_child ) )->set_alias( 'Booking' ).
+    " View annotations.
+    "lo_view_entity_i_booking->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( CONV #( sqlviewname_a_booking ) ).
+    lo_view_entity_i_booking->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ).
+    lo_view_entity_i_booking->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Booking view entity for booking analysis' ).
+    lo_view_entity_i_booking->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ).
+    "lo_view_entity_i_booking->add_annotation( 'AbapCatalog.preserveKey' )->value->build( )->add_boolean( abap_true ).
+
+    lo_view_entity_i_booking->set_root( ).
+
+    " add associations
+    DATA(lo_condition_i_booking) = xco_cp_ddl=>field( 'TravelUUID' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'TravelUUID' )->of( '_Travel' ) ).
+    lo_view_entity_i_booking->add_association( i_view_name_a_travel )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 0 iv_max = 1 ) )->set_alias( '_Travel' )->set_condition( lo_condition_i_booking ).
+
+    lo_condition_i_booking = xco_cp_ddl=>field( 'CarrierID' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'AirlineID' )->of( '_Connection' ) )->and( xco_cp_ddl=>field( 'ConnectionID' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'ConnectionID' )->of( '_Connection' ) ) ).
+    lo_view_entity_i_booking->add_association( i_view_name_connection )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ) )->set_alias( '_Connection' )->set_condition( lo_condition_i_booking ).
+
+    lo_condition_i_booking = xco_cp_ddl=>field( 'CarrierID' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'AirlineID' )->of( '_Carrier' ) ).
+    lo_view_entity_i_booking->add_association( i_view_name_carrier )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ) )->set_alias( '_Carrier' )->set_condition( lo_condition_i_booking ).
+
+    lo_condition_i_booking = xco_cp_ddl=>field( 'CustomerID' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'CustomerID' )->of( '_Customer' ) ).
+    lo_view_entity_i_booking->add_association( '/DMO/I_Customer' )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 0 iv_max = 1 ) )->set_alias( '_Customer' )->set_condition( lo_condition_i_booking ).
+
+    lo_condition_i_booking = xco_cp_ddl=>field( 'AgencyID' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'AgencyID' )->of( '_Agency' ) ).
+    lo_view_entity_i_booking->add_association( '/DMO/I_Agency' )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 0 iv_max = 1 ) )->set_alias( '_Agency' )->set_condition( lo_condition_i_booking ).
+
+    " Add fields.
+    DATA(lo_identifier_i_booking) = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'booking_uuid' ) )->set_key( )->set_alias( 'BookingUUID' ).
+
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'travel_uuid' ) )->set_alias( 'TravelUUID' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'booking_id' ) )->set_alias( 'BookingID' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'booking_date' ) )->set_alias( 'BookingDate' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'SUBSTRING (booking_date,1,4)' ) )->set_alias( 'BookingDateYear' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'customer_id' ) )->set_alias( 'CustomerID' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Customer.LastName' ) )->set_alias( 'CustomerName' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'carrier_id' ) )->set_alias( 'CarrierID' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Carrier.Name' ) )->set_alias( 'CarrierName' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'connection_id' ) )->set_alias( 'ConnectionID' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'flight_date' ) )->set_alias( 'FlightDate' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'flight_price' ) )->set_alias( 'FlightPrice' ).
+    lo_identifier_i_booking->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'CurrencyCode' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'currency_code' ) )->set_alias( 'CurrencyCode' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Travel.AgencyID' ) )->set_alias( 'AgencyID' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Travel._Agency.Name' ) )->set_alias( 'AgencyName' ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'CREATED_BY' ) )->set_alias( 'CreatedBy' ).
+    lo_identifier_i_booking->add_annotation( 'Semantics.user.createdBy' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'LAST_CHANGED_BY' ) )->set_alias( 'LastChangedBy' ).
+    lo_identifier_i_booking->add_annotation( 'Semantics.user.lastChangedBy' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'LOCAL_LAST_CHANGED_AT' ) )->set_alias( 'LocalLastChangedAt' ).
+    lo_identifier_i_booking->add_annotation( 'Semantics.systemDateTime.localInstanceLastChangedAt' )->value->build( )->add_boolean( abap_true ).
+
+    " add association to publish
+    lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Travel' ) ).
+    lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Carrier' ) ).
+    lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Customer' ) ).
+    lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Connection' ) ).
+
+
+* Create consumption view
+    DATA(lo_interface_specification) = mo_put_operation1->for-ddls->add_object( c_view_name_a_booking
+      )->set_package( package_name
+      )->create_form_specification( ).
+
+    DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Booking Analysis view for Travel Scenario'
+      )->add_projection_view( ).
+    lo_view_entity->data_source->set_view_entity( iv_view_entity = i_view_name_a_booking ).
+
+    lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ).
+    lo_view_entity->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ).
+    lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Projection View for Booking Analysis' ).
+    lo_view_entity->add_annotation( 'Search.searchable' )->value->build( )->add_boolean( abap_true ).
+
+    lo_view_entity->set_root( ).
+    " Add fields.
+    DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'BookingUUID' ) )->set_key( ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'TravelUUID' ) ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'BookingID' ) ).
+    lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( '0.9' ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'BookingDate' ) ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'BookingDateYear' ) ).
+    lo_identifier->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Booking Date (Year)' ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CustomerID' ) ).
+    lo_identifier->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Customer' ).
+    lo_identifier->add_annotation( 'ObjectModel.text.element' )->value->build( )->begin_array( )->add_string( 'CustomerName' ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CustomerName' ) ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CarrierID' ) ).
+    lo_identifier->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Airline' ).
+    lo_identifier->add_annotation( 'ObjectModel.text.element' )->value->build( )->begin_array( )->add_string( 'CarrierName' ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CarrierName' ) ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'ConnectionID' ) ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'FlightDate' ) ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'FlightPrice' ) ).
+    lo_identifier->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'CurrencyCode' ).
+    lo_identifier->add_annotation( 'Aggregation.default' )->value->build( )->add_enum( 'SUM' ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CurrencyCode' ) ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'AgencyID' ) ).
+    lo_identifier->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Agency' ).
+    lo_identifier->add_annotation( 'ObjectModel.text.element' )->value->build( )->begin_array( )->add_string( 'AgencyName' ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'AgencyName' ) ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CreatedBy' ) ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'LastChangedBy' ) ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'LocalLastChangedAt' ) ).
+
+
+    lo_view_entity->add_field( xco_cp_ddl=>field( '_Travel' ) ).
+    lo_view_entity->add_field( xco_cp_ddl=>field( '_Carrier' ) ).
+    lo_view_entity->add_field( xco_cp_ddl=>field( '_Customer' ) ).
+    lo_view_entity->add_field( xco_cp_ddl=>field( '_Connection' ) ).
+
+*   Create service definition
+
+    TYPES: BEGIN OF ty_cds_views_used_by_assoc,
+             name   TYPE zdmo_cl_rap_node=>ts_assocation-name,    "    sxco_ddef_alias_name,
+             target TYPE zdmo_cl_rap_node=>ts_assocation-target,
+           END OF ty_cds_views_used_by_assoc.
+    DATA  lt_cds_views_used_by_assoc  TYPE STANDARD TABLE OF ty_cds_views_used_by_assoc.
+    DATA  ls_cds_views_used_by_assoc  TYPE ty_cds_views_used_by_assoc.
+
+    DATA(lo_specification_header) = mo_put_operation1->for-srvd->add_object( srv_definition_analytics
+                                    )->set_package( package_name
+                                    )->create_form_specification( ).
+
+    lo_specification_header->set_short_description( |Service definition for booking analysis|  ).
+
+    "add exposure for root node
+    lo_specification_header->add_exposure( c_view_name_a_booking )->set_alias( 'Booking' ).
+    lo_specification_header->add_exposure( i_view_name_a_travel )->set_alias( 'Travel' ).
+    lo_specification_header->add_exposure( |ZI_FE_CONN_{ unique_suffix }| )->set_alias( 'Connection' ).
+    lo_specification_header->add_exposure( |ZI_FE_FLIG_{ unique_suffix }| )->set_alias( 'Flight' ).
+    lo_specification_header->add_exposure( |ZI_FE_CARR_{ unique_suffix }| )->set_alias( 'Airline' ).
+    lo_specification_header->add_exposure( |I_CURRENCY| )->set_alias( 'Currency' ).
+    lo_specification_header->add_exposure( |/DMO/I_CUSTOMER| )->set_alias( 'Customer' ).
+    lo_specification_header->add_exposure( |/DMO/I_AGENCY| )->set_alias( 'Agency' ).
+
+
+*   Create service binding
+
+    DATA lv_service_binding_name TYPE sxco_srvb_object_name.
+    lv_service_binding_name = to_upper( srv_binding_analytics ).
+
+    DATA lv_service_definition_name TYPE sxco_srvd_object_name.
+    lv_service_definition_name = to_upper( srv_definition_analytics ).
+
+    DATA(lo_specification_header2) = mo_put_operation2->for-srvb->add_object(   lv_service_binding_name
+                                    )->set_package( package_name
+                                    )->create_form_specification( ).
+
+    lo_specification_header2->set_short_description( |Service binding for booking analysis| ).
+
+    lo_specification_header2->set_binding_type( xco_cp_service_binding=>binding_type->odata_v2_ui ).
+
+
+    lo_specification_header2->add_service( )->add_version( '0001' )->set_service_definition( lv_service_definition_name ).
+
+  ENDMETHOD.
+
+
+  METHOD generate_carrier_i_view.
+    DATA(lo_interface_specification) = mo_put_operation->for-ddls->add_object( i_view_name_carrier
+      )->set_package( package_name
+      )->create_form_specification( ).
+
+    DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Carrier view for Travel Scenario'
+     " )->add_view( ).
+       )->add_view_entity( ).
+    "lo_view_entity->data_source->set_entity( CONV #( table_name_carrier ) )->set_alias( 'Airline' ).
+    lo_view_entity->data_source->set_view_entity( CONV #( table_name_carrier ) )->set_alias( 'Airline' ).
+    " View annotations.
+    DATA s_view_name TYPE string.
+    s_view_name = i_view_name_carrier.
+    REPLACE ALL OCCURRENCES OF '_' IN s_view_name WITH ''.
+
+    " lo_view_entity->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( s_view_name ).
+    "lo_view_entity->add_annotation( 'AbapCatalog.compiler.compareFilter' )->value->build( )->add_boolean( abap_true ).
+    "lo_view_entity->add_annotation( 'AbapCatalog.preserveKey' )->value->build( )->add_boolean( abap_true ).
+    lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ).
+    lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Carrier view entity' ).
+    lo_view_entity->add_annotation( 'Search.searchable' )->value->build( )->add_boolean( abap_true ).
+
+    " add associations
+    DATA(lo_condition) = xco_cp_ddl=>field( 'CurrencyCode' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'Currency' )->of( '_Currency' ) ).
+    lo_view_entity->add_association( 'I_Currency' )->set_cardinality( xco_cp_cds=>cardinality->zero_to_one )->set_alias( '_Currency' )->set_condition( lo_condition ).
+
+    " Add fields.
+    DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'Airline.carrier_id' ) )->set_key( )->set_alias( 'AirlineID' ).
+    lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier->add_annotation( 'ObjectModel.text.element' )->value->build( )->begin_array( )->add_string( 'Name' ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Airline.name' ) )->set_alias( 'Name' ).
+    lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( '0.7' ).
+    lo_identifier->add_annotation( 'Semantics.text' )->value->build( )->add_boolean( abap_true ).
+
+    "ToDo: cast for pic_url
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Airline.carrier_pic_url' ) )->set_alias( 'AirlinePicURL' ).
+    lo_identifier->add_annotation( 'Semantics.imageUrl' )->value->build( )->add_boolean( abap_true ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Airline.currency_code' ) )->set_alias( 'CurrencyCode' ).
+    "lo_identifier->add_annotation( 'Semantics.currencyCode' )->value->build( )->add_boolean( abap_true ).
+
+    " add association to publish
+    lo_view_entity->add_field( xco_cp_ddl=>field( '_Currency' ) ).
+  ENDMETHOD.
+
+
+  METHOD generate_connection_i_view.
+    DATA: s_view_name_connection TYPE string,
+          s_view_name_carrier    TYPE string.
+
+    s_view_name_connection = i_view_name_connection.
+    REPLACE ALL OCCURRENCES OF '_' IN s_view_name_connection WITH ''.
+    s_view_name_carrier = i_view_name_carrier.
+
+    DATA(lo_interface_specification) = mo_put_operation->for-ddls->add_object( i_view_name_connection
+      )->set_package( package_name
+      )->create_form_specification( ).
+
+    DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Connection view for Travel Scenario'
+     " )->add_view( ).
+       )->add_view_entity( ).
+    "lo_view_entity->data_source->set_entity( CONV #( table_name_connection ) )->set_alias( 'Connection' ).
+    lo_view_entity->data_source->set_view_entity( CONV #( table_name_connection ) )->set_alias( 'Connection' ).
+    " View annotations.
+    "lo_view_entity->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( s_view_name_connection ).
+    "lo_view_entity->add_annotation( 'AbapCatalog.compiler.compareFilter' )->value->build( )->add_boolean( abap_true ).
+    "lo_view_entity->add_annotation( 'AbapCatalog.preserveKey' )->value->build( )->add_boolean( abap_true ).
+    lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ).
+    lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Connection view entity' ).
+    lo_view_entity->add_annotation( 'Search.searchable' )->value->build( )->add_boolean( abap_true ).
+
+    " add associations
+    DATA(lo_condition) = xco_cp_ddl=>field( 'AirlineID' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'AirlineID' )->of( '_Airline' ) ).
+    lo_view_entity->add_association( i_view_name_carrier )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ) )->set_alias( '_Airline' )->set_condition( lo_condition ).
+
+    " Add fields.
+    DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.carrier_id' ) )->set_key( )->set_alias( 'AirlineID' ).
+    lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( '0.8' ).
+    lo_identifier->add_annotation( 'ObjectModel.text.association' )->value->build( )->add_string( '_Airline' ).
+    DATA(lo_valuehelpbuilder) = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ).
+    lo_valuehelpbuilder->begin_array(
+                 )->begin_record(
+                   )->add_member( 'entity'
+                      )->begin_record(
+                         )->add_member( 'name' )->add_string( s_view_name_carrier )->add_member( 'element' )->add_string( 'AirlineID'
+                      )->end_record( ).
+    lo_valuehelpbuilder->end_record( )->end_array( ).
+
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.connection_id' ) )->set_key( )->set_alias( 'ConnectionID' ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.airport_from_id' ) )->set_alias( 'DepartureAirport' ).
+    lo_valuehelpbuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ).
+    lo_valuehelpbuilder->begin_array(
+                 )->begin_record(
+                   )->add_member( 'entity'
+                      )->begin_record(
+                         )->add_member( 'name' )->add_string( '/DMO/I_Airport' )->add_member( 'element' )->add_string( 'AirportID'
+                      )->end_record( ).
+    lo_valuehelpbuilder->end_record( )->end_array( ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.airport_to_id' ) )->set_alias( 'DestinationAirport' ).
+    lo_valuehelpbuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ).
+    lo_valuehelpbuilder->begin_array(
+                 )->begin_record(
+                   )->add_member( 'entity'
+                      )->begin_record(
+                         )->add_member( 'name' )->add_string( '/DMO/I_Airport' )->add_member( 'element' )->add_string( 'AirportID'
+                      )->end_record( ).
+    lo_valuehelpbuilder->end_record( )->end_array( ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.departure_time' ) )->set_alias( 'DepartureTime' ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.arrival_time' ) )->set_alias( 'ArrivalTime' ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.distance' ) )->set_alias( 'Distance' ).
+    lo_identifier->add_annotation( 'Semantics.quantity.unitOfMeasure' )->value->build( )->add_string( 'DistanceUnit' ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.distance_unit' ) )->set_alias( 'DistanceUnit' ).
+    " lo_identifier->add_annotation( 'Semantics.unitOfMeasure' )->value->build( )->add_boolean( abap_true ).
+
+    " add association to publish
+    lo_view_entity->add_field( xco_cp_ddl=>field( '_Airline' ) ).
+  ENDMETHOD.
+
+
+  METHOD generate_data_generator_class.
+
+    DATA(lo_specification) = mo_draft_tabl_put_operation->for-clas->add_object(  data_generator_class_name
+                                  )->set_package( package_name
+                                  )->create_form_specification( ).
+    lo_specification->set_short_description( |This class generates the test data| ).
+
+    lo_specification->set_short_description( 'Data generator class' ).
+    lo_specification->definition->add_interface( 'if_oo_adt_classrun' ).
+    lo_specification->implementation->add_method( |if_oo_adt_classrun~main|
+      )->set_source( VALUE #(
+     ( |    INSERT ('{ table_name_root }') FROM ( | )
+( |        SELECT | )
+( |          FROM /dmo/travel | )
+( |          FIELDS | )
+( |            uuid(  )      AS travel_uuid           , | )
+( |            travel_id     AS travel_id             , | )
+( |            agency_id     AS agency_id             , | )
+( |            customer_id   AS customer_id           , | )
+( |            begin_date    AS begin_date            , | )
+( |            end_date      AS end_date              , | )
+( |            booking_fee   AS booking_fee           , | )
+( |            total_price   AS total_price           , | )
+( |            currency_code AS currency_code         , | )
+( |            description   AS description           , | )
+( |            CASE status | )
+( |              WHEN 'B' THEN 'A'   " accepted | )
+( |              WHEN 'X' THEN 'X'   " cancelled | )
+( |              ELSE 'O'            " open | )
+( |            END           AS overall_status        , | )
+( |            createdby     AS created_by            , | )
+( |            createdat     AS created_at            , | )
+( |            lastchangedby AS last_changed_by       , | )
+( |            lastchangedat AS last_changed_at       , | )
+( |            lastchangedat AS local_last_changed_at | )
+( |            ORDER BY travel_id | )
+( |      ). | )
+( |    COMMIT WORK. | )
+( | | )
+( |    " define FROM clause dynamically | )
+( |    DATA: dyn_table_name TYPE string. | )
+( |    dyn_table_name = \| /dmo/booking    AS booking  \| | )
+( |                 && \| JOIN  \{ '{ table_name_root }' \} AS z \| | )
+( |                 && \| ON   booking~travel_id = z~travel_id \|. | )
+( | | )
+( |    " insert booking demo data | )
+( |    INSERT ('{ table_name_child }') FROM ( | )
+( |        SELECT | )
+( |          FROM (dyn_table_name) | )
+( |          FIELDS | )
+( |            uuid( )                 AS booking_uuid          , | )
+( |            z~travel_uuid           AS travel_uuid           , | )
+( |            booking~booking_id      AS booking_id            , | )
+( |            booking~booking_date    AS booking_date          , | )
+( |            booking~customer_id     AS customer_id           , | )
+( |            booking~carrier_id      AS carrier_id            , | )
+( |            booking~connection_id   AS connection_id         , | )
+( |            booking~flight_date     AS flight_date           , | )
+( |            booking~flight_price    AS flight_price          , | )
+( |            booking~currency_code   AS currency_code         , | )
+( |            z~created_by            AS created_by            , | )
+( |            z~last_changed_by       AS last_changed_by       , | )
+( |            z~last_changed_at       AS local_last_changed_by | )
+( |      ). | )
+( |    COMMIT WORK. | )
+( | | )
+( |*   We overwrite the existing airlines with ours | )
+( |    UPDATE ('{ table_name_child }') SET carrier_id = 'SW' WHERE carrier_id NOT IN ( 'AA', 'AZ', 'LH', 'JL' ). | )
+( |    UPDATE ('{ table_name_child }') SET carrier_id = 'GA' WHERE carrier_id = 'AA'. | )
+( |    UPDATE ('{ table_name_child }') SET carrier_id = 'FA' WHERE carrier_id = 'AZ'. | )
+( |    UPDATE ('{ table_name_child }') SET carrier_id = 'EA' WHERE carrier_id = 'LH'. | )
+( |    UPDATE ('{ table_name_child }') SET carrier_id = 'OC' WHERE carrier_id = 'JL'. | )
+( |    COMMIT WORK. | )
+( | | )
+( |    " Travel Status Texts | )
+( |    TYPES: BEGIN OF t_status_fields, | )
+( |             client             TYPE mandt, | )
+( |             travel_status_id   TYPE /dmo/overall_status, | )
+( |             travel_status_text TYPE /dmo/description, | )
+( |           END OF t_status_fields. | )
+( |    TYPES: tt_status TYPE STANDARD TABLE OF t_status_fields WITH KEY travel_status_id. | )
+( | | )
+( |    DATA status_itab TYPE tt_status. | )
+( | | )
+( |    status_itab = VALUE tt_status( | )
+( |      ( travel_status_id = 'O' travel_status_text = 'Open' ) | )
+( |      ( travel_status_id = 'A' travel_status_text = 'Accepted' ) | )
+( |      ( travel_status_id = 'X' travel_status_text = 'Rejected' ) | )
+( |    ). | )
+( |*   insert the new table entries | )
+( |    INSERT ('{ table_name_status }') FROM TABLE @status_itab. | )
+( |    COMMIT WORK. | )
+( | | )
+( | | )
+( |    " Carrier | )
+( |    TYPES: BEGIN OF t_carrier_fields, | )
+( |             client          TYPE mandt, | )
+( |             carrier_id      TYPE /dmo/carrier_id, | )
+( |             name            TYPE /dmo/carrier_name, | )
+( |             carrier_pic_url TYPE c length 255, | )
+( |             currency_code   TYPE /dmo/currency_code, | )
+( |           END OF t_carrier_fields. | )
+( |    TYPES: tt_carrier TYPE STANDARD TABLE OF t_carrier_fields WITH KEY carrier_id. | )
+( | | )
+( |    DATA carrier_itab TYPE tt_carrier. | )
+( | | )
+( |*   Carrier tab entries | )
+( |    carrier_itab = VALUE tt_carrier( | )
+( |      ( carrier_id = 'GA' name = 'Green Albatros' carrier_pic_url = 'https://raw.githubusercontent.com/SAP-samples/fiori-elements-opensap/main/week1/images/airlines/Green-Albatross-logo.png' currency_code = 'EUR') | )
+( |      ( carrier_id = 'FA' name = 'Fly Africa' carrier_pic_url = 'https://raw.githubusercontent.com/SAP-samples/fiori-elements-opensap/main/week1/images/airlines/Fly-Africa-logo.png' currency_code = 'EUR') | )
+( |      ( carrier_id = 'EA' name = 'European Airlines' carrier_pic_url = 'https://raw.githubusercontent.com/SAP-samples/fiori-elements-opensap/main/week1/images/airlines/European-Airlines-logo.png' currency_code = 'EUR') | )
+( |      ( carrier_id = 'OC' name = 'Oceania' carrier_pic_url = 'https://raw.githubusercontent.com/SAP-samples/fiori-elements-opensap/main/week1/images/airlines/Oceania-logo.png' currency_code = 'EUR') | )
+( |      ( carrier_id = 'SW' name = 'Sunset Wings' carrier_pic_url = 'https://raw.githubusercontent.com/SAP-samples/fiori-elements-opensap/main/week1/images/airlines/Sunset-Wings-logo.png' currency_code = 'EUR') | )
+( |    ). | )
+( | | )
+( |*   insert the new table entries | )
+( |    INSERT ('{ table_name_carrier }') FROM TABLE @carrier_itab. | )
+( |    COMMIT WORK. | )
+( | | )
+( |    " insert connection demo data | )
+( |    INSERT ('{ table_name_connection }') FROM ( | )
+( |        SELECT | )
+( |          FROM /dmo/connection | )
+( |          FIELDS | )
+( |            carrier_id, | )
+( |            connection_id, | )
+( |            airport_from_id, | )
+( |            airport_to_id, | )
+( |            departure_time, | )
+( |            arrival_time, | )
+( |            CAST( distance AS dec( 12, 2 ) ),| )
+*( |            distance, | )
+( |            distance_unit | )
+( |    ). | )
+( |    COMMIT WORK. | )
+( | | )
+( |*   We overwrite the existing airlines with ours | )
+( |    UPDATE ('{ table_name_connection }') SET carrier_id = 'SW' WHERE carrier_id NOT IN ( 'AA', 'AZ', 'LH', 'JL' ). | )
+( |    UPDATE ('{ table_name_connection }') SET carrier_id = 'GA' WHERE carrier_id = 'AA'. | )
+( |    UPDATE ('{ table_name_connection }') SET carrier_id = 'FA' WHERE carrier_id = 'AZ'. | )
+( |    UPDATE ('{ table_name_connection }') SET carrier_id = 'EA' WHERE carrier_id = 'LH'. | )
+( |    UPDATE ('{ table_name_connection }') SET carrier_id = 'OC' WHERE carrier_id = 'JL'. | )
+( |    COMMIT WORK. | )
+( | | )
+( |    " insert flight demo data | )
+( |    INSERT ('{ table_name_flight }') FROM ( | )
+( |      SELECT FROM /dmo/flight FIELDS | )
+( |        " client | )
+( |        carrier_id, | )
+( |        connection_id, | )
+( |        flight_date, | )
+( |        price, | )
+( |        currency_code, | )
+( |        plane_type_id, | )
+( |        seats_max, | )
+( |        seats_occupied | )
+( |    ). | )
+( |    COMMIT WORK. | )
+( | | )
+( |*   We overwrite the existing airlines with ours | )
+( |    UPDATE ('{ table_name_flight }') SET carrier_id = 'SW' WHERE carrier_id NOT IN ( 'AA', 'AZ', 'LH', 'JL' ). | )
+( |    UPDATE ('{ table_name_flight }') SET carrier_id = 'GA' WHERE carrier_id = 'AA'. | )
+( |    UPDATE ('{ table_name_flight }') SET carrier_id = 'FA' WHERE carrier_id = 'AZ'. | )
+( |    UPDATE ('{ table_name_flight }') SET carrier_id = 'EA' WHERE carrier_id = 'LH'. | )
+( |    UPDATE ('{ table_name_flight }') SET carrier_id = 'OC' WHERE carrier_id = 'JL'. | )
+( |    COMMIT WORK. | )
+( | | )
+( |*   For simplicity reasons we only use one currency (EUR) | )
+( |    UPDATE ('{ table_name_child }') SET flight_price = division( flight_price, 130, 2 )  where currency_code = 'JPY'. | )
+( |    UPDATE ('{ table_name_root }') SET booking_fee = division( booking_fee, 130, 2 )  where currency_code = 'JPY'. | )
+( |    UPDATE ('{ table_name_root }') SET total_price = division( total_price, 130, 2 )  where currency_code = 'JPY'. | )
+( |    UPDATE ('{ table_name_child }') SET flight_price = division( flight_price, 2, 2 )  where currency_code = 'SGD'. | )
+( |    UPDATE ('{ table_name_root }') SET booking_fee = division( booking_fee, 2, 2 )  where currency_code = 'SGD'. | )
+( |    UPDATE ('{ table_name_root }') SET total_price = division( total_price, 2, 2 )  where currency_code = 'SGD'. | )
+( |    UPDATE ('{ table_name_root }') SET currency_code = 'EUR'. | )
+( |    UPDATE ('{ table_name_child }') SET currency_code = 'EUR'. | )
+    ) ).
+
+  ENDMETHOD.
+
+
+  METHOD generate_flight_i_view.
+    DATA: s_view_name_connection TYPE string,
+          s_view_name_carrier    TYPE string,
+          s_view_name_flight     TYPE string.
+
+    s_view_name_flight = i_view_name_flight.
+    REPLACE ALL OCCURRENCES OF '_' IN s_view_name_flight WITH ''.
+    s_view_name_connection = i_view_name_connection.
+    s_view_name_carrier = i_view_name_carrier.
+
+    DATA(lo_interface_specification) = mo_put_operation->for-ddls->add_object( i_view_name_flight
+      )->set_package( package_name
+      )->create_form_specification( ).
+
+    DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Flight view for Travel Scenario'
+      ")->add_view( ).
+      )->add_view_entity( ).
+    "  lo_view_entity->data_source->set_entity( CONV #( table_name_flight ) )->set_alias( 'Flight' ).
+    lo_view_entity->data_source->set_view_entity( CONV #( table_name_flight ) )->set_alias( 'Flight' ).
+
+    " View annotations.
+    "lo_view_entity->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( s_view_name_flight ).
+    "lo_view_entity->add_annotation( 'AbapCatalog.compiler.compareFilter' )->value->build( )->add_boolean( abap_true ).
+    "lo_view_entity->add_annotation( 'AbapCatalog.preserveKey' )->value->build( )->add_boolean( abap_true ).
+    lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ).
+    lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Flight view entity' ).
+    lo_view_entity->add_annotation( 'Search.searchable' )->value->build( )->add_boolean( abap_true ).
+
+    " add associations
+    DATA(lo_condition) = xco_cp_ddl=>field( 'AirlineID' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'AirlineID' )->of( '_Airline' ) ).
+    lo_view_entity->add_association( i_view_name_carrier )->set_cardinality( xco_cp_cds=>cardinality->one )->set_alias( '_Airline' )->set_condition( lo_condition ).
+
+    lo_condition = xco_cp_ddl=>field( 'ConnectionID' )->of_projection( )->eq( xco_cp_ddl=>field( 'ConnectionID' )->of( '_Connection' ) )->and(
+      xco_cp_ddl=>field( 'AirlineID' )->of_projection( )->eq( xco_cp_ddl=>field( 'AirlineID' )->of( '_Connection' ) ) ).
+    lo_view_entity->add_association( i_view_name_connection )->set_cardinality( xco_cp_cds=>cardinality->one )->set_alias( '_Connection' )->set_condition( lo_condition ).
+
+    lo_condition = xco_cp_ddl=>field( 'CurrencyCode' )->of_projection( )->eq(
+      xco_cp_ddl=>field( 'Currency' )->of( '_Currency' ) ).
+    lo_view_entity->add_association( 'I_Currency' )->set_cardinality( xco_cp_cds=>cardinality->zero_to_one )->set_alias( '_Currency' )->set_condition( lo_condition ).
+
+    " Add fields.
+    DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.carrier_id' ) )->set_key( )->set_alias( 'AirlineID' ).
+    lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( '0.8' ).
+    lo_identifier->add_annotation( 'ObjectModel.text.association' )->value->build( )->add_string( '_Airline' ).
+    DATA(lo_valuehelpbuilder) = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ).
+    lo_valuehelpbuilder->begin_array( )->begin_record(
+        )->add_member( 'entity'
+            )->begin_record(
+                )->add_member( 'name' )->add_string( s_view_name_carrier )->add_member( 'element' )->add_string( 'AirlineID'
+            )->end_record( ).
+    lo_valuehelpbuilder->end_record( )->end_array( ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.connection_id' ) )->set_key( )->set_alias( 'ConnectionID' ).
+    lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ).
+    lo_identifier->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( '0.8' ).
+    lo_valuehelpbuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ).
+    lo_valuehelpbuilder->begin_array( )->begin_record(
+        )->add_member( 'entity'
+            )->begin_record(
+                )->add_member( 'name' )->add_string( s_view_name_connection )->add_member( 'element' )->add_string( 'ConnectionID'
+            )->end_record(
+        )->add_member( 'additionalBinding'
+            )->begin_array( )->begin_record(
+                )->add_member( 'element' )->add_string( 'AirlineID' )->add_member( 'localElement' )->add_string( 'AirlineID'
+            )->end_record( )->end_array( ).
+    lo_valuehelpbuilder->end_record( )->end_array( ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.flight_date' ) )->set_key( )->set_alias( 'FlightDate' ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.price' ) )->set_alias( 'Price' ).
+    lo_identifier->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'CurrencyCode' ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.currency_code' ) )->set_alias( 'CurrencyCode' ).
+    "lo_identifier->add_annotation( 'Semantics.currencyCode' )->value->build( )->add_boolean( abap_true ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.plane_type_id' ) )->set_alias( 'PlaneType' ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.seats_max' ) )->set_alias( 'MaximumSeats' ).
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.seats_occupied' ) )->set_alias( 'OccupiedSeats' ).
+
+    " add association to publish
+    lo_view_entity->add_field( xco_cp_ddl=>field( '_Airline' ) ).
+    lo_view_entity->add_field( xco_cp_ddl=>field( '_Connection' ) ).
+    lo_view_entity->add_field( xco_cp_ddl=>field( '_Currency' ) ).
+  ENDMETHOD.
+
+
+  METHOD generate_status_i_view.
+    DATA(lo_interface_specification) = mo_put_operation->for-ddls->add_object( i_view_name_status
+      )->set_package( package_name
+      )->create_form_specification( ).
+
+    DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Status view for Travel Scenario'
+      ")->add_view( ).
+      )->add_view_entity( ).
+    "lo_view_entity->data_source->set_entity( CONV #( table_name_status ) )->set_alias( 'Status' ).
+    lo_view_entity->data_source->set_view_entity( CONV #( table_name_status ) )->set_alias( 'Status' ).
+
+    " View annotations.
+    DATA s_view_name TYPE string.
+    s_view_name = i_view_name_status.
+    REPLACE ALL OCCURRENCES OF '_' IN s_view_name WITH ''.
+
+    "lo_view_entity->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( s_view_name ).
+    "lo_view_entity->add_annotation( 'AbapCatalog.compiler.compareFilter' )->value->build( )->add_boolean( abap_true ).
+    "lo_view_entity->add_annotation( 'AbapCatalog.preserveKey' )->value->build( )->add_boolean( abap_true ).
+    lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ).
+    lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Travel Status view entity' ).
+
+    " Add fields.
+    DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'Status.travel_status_id' ) )->set_key( )->set_alias( 'TravelStatusId' ).
+    lo_identifier->add_annotation( 'UI.textArrangement' )->value->build( )->add_enum( 'TEXT_ONLY' ).
+    lo_identifier->add_annotation( 'ObjectModel.text.element' )->value->build( )->begin_array( )->add_string( 'TravelStatusText' ).
+
+    lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Status.travel_status_text' ) )->set_alias( 'TravelStatusText' ).
+    lo_identifier->add_annotation( 'UI.hidden' )->value->build( )->add_boolean( abap_true ).
+  ENDMETHOD.
+
+
+  METHOD generate_table.
+
+
+    DATA(lo_specification) = mo_put_operation->for-tabl-for-database_table->add_object( table_name
+              )->set_package( package_name
+               )->create_form_specification( ).
+
+    lo_specification->set_short_description( table_short_description ).
+
+    DATA database_table_field  TYPE REF TO if_xco_gen_tabl_dbt_s_fo_field  .
+
+    LOOP AT table_fields INTO DATA(table_field_line).
+      database_table_field = lo_specification->add_field( table_field_line-field  ).
+
+      IF table_field_line-is_key = abap_true.
+        database_table_field->set_key_indicator( ).
+      ENDIF.
+      IF table_field_line-not_null = abap_true.
+        database_table_field->set_not_null( ).
+      ENDIF.
+      IF table_field_line-currencycode IS NOT INITIAL.
+        database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( table_name ) ) )->set_reference_field( to_upper( table_field_line-currencycode ) ).
+      ENDIF.
+      IF table_field_line-unitofmeasure IS NOT INITIAL.
+        database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( table_name ) ) )->set_reference_field( to_upper( table_field_line-unitofmeasure ) ).
+      ENDIF.
+      IF table_field_line-data_element IS NOT INITIAL.
+        database_table_field->set_type( xco_cp_abap_dictionary=>data_element( table_field_line-data_element ) ).
+      ELSE.
+        CASE  to_lower( table_field_line-built_in_type ).
+          WHEN 'accp'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->accp ).
+          WHEN 'clnt'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->clnt ).
+          WHEN 'cuky'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->cuky ).
+          WHEN 'dats'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dats ).
+          WHEN 'df16_raw'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_raw ).
+          WHEN 'df34_raw'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_raw ).
+          WHEN 'fltp'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->fltp ).
+          WHEN 'int1'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int1 ).
+          WHEN 'int2'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int2 ).
+          WHEN 'int4'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int4 ).
+          WHEN 'int8'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int8 ).
+          WHEN 'lang'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lang ).
+          WHEN 'tims'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->tims ).
+          WHEN 'char'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->char( table_field_line-built_in_type_length  ) ).
+          WHEN 'curr'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->curr(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'dec'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dec(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'df16_dec'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_dec(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'df34_dec'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_dec(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'lchr' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lchr( table_field_line-built_in_type_length  ) ).
+          WHEN 'lraw'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lraw( table_field_line-built_in_type_length  ) ).
+          WHEN 'numc'   .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->numc( table_field_line-built_in_type_length  ) ).
+          WHEN 'quan' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->quan(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                              ) ).
+          WHEN 'raw'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->raw( table_field_line-built_in_type_length  ) ).
+          WHEN 'rawstring'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->rawstring( table_field_line-built_in_type_length  ) ).
+          WHEN 'sstring' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->sstring( table_field_line-built_in_type_length  ) ).
+          WHEN 'string' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->string( table_field_line-built_in_type_length  ) ).
+          WHEN 'unit'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->unit( table_field_line-built_in_type_length  ) ).
+          WHEN OTHERS.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->for(
+                                              iv_type     = to_upper( table_field_line-built_in_type )
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+        ENDCASE.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+
+
+  METHOD get_carrier_table_fields.
+    carrier_table_fields = VALUE tt_fields(
+                  ( field         = 'client'
+                    data_element  = 'mandt'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'carrier_id'
+                    data_element  = '/dmo/carrier_id'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'name'
+                    data_element  = '/dmo/carrier_name' )
+                  ( field         = 'carrier_pic_url'
+                    data_element  = 'BAPI_LISTR' )
+                  ( field         = 'currency_code'
+                    data_element  = '/dmo/currency_code' )
+                    ).
+  ENDMETHOD.
+
+
+  METHOD get_child_table_fields.
+    child_table_fields = VALUE tt_fields(
+                   ( field         = 'client'
+                     data_element  = 'mandt'
+                     is_key        = 'X'
+                     not_null      = 'X' )
+                   ( field         = 'booking_uuid'
+                     data_element  = 'sysuuid_x16'
+                     is_key        = 'X'
+                     not_null      = 'X' )
+                   ( field         = 'travel_uuid'
+                     data_element  = 'sysuuid_x16'
+                     not_null      = 'X' )
+                   ( field         = 'booking_id'
+                     data_element  = '/dmo/booking_id' )
+                   ( field         = 'booking_date'
+                     data_element  = '/dmo/booking_date' )
+                   ( field         = 'customer_id'
+                     data_element  = '/dmo/customer_id' )
+                   ( field         = 'carrier_id'
+                     data_element  = '/dmo/carrier_id' )
+                   ( field         = 'connection_id'
+                     data_element  = '/dmo/connection_id' )
+                   ( field         = 'flight_date'
+                     data_element  = '/dmo/flight_date' )
+                   ( field         = 'flight_price'
+                     data_element  = '/dmo/flight_price'
+                     currencycode  = 'currency_code'  )
+                   ( field         = 'currency_code'
+                     data_element  = '/dmo/currency_code' )
+                   ( field         = 'created_by'
+                     data_element  = 'syuname' )
+                   ( field         = 'last_changed_by'
+                     data_element  = 'syuname' )
+                   ( field         = 'local_last_changed_at '
+                     data_element  = 'timestampl' )
+                   ).
+  ENDMETHOD.
+
+
+  METHOD get_connection_table_fields.
+    connection_table_fields = VALUE tt_fields(
+                  ( field         = 'client'
+                    data_element  = 'mandt'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'carrier_id'
+                    data_element  = '/dmo/carrier_id'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'connection_id'
+                    data_element  = '/dmo/connection_id'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'airport_from_id'
+                    data_element  = '/dmo/airport_from_id' )
+                  ( field         = 'airport_to_id'
+                    data_element  = '/dmo/airport_to_id' )
+                  ( field         = 'departure_time'
+                    data_element  = '/dmo/flight_departure_time' )
+                  ( field         = 'arrival_time'
+                    data_element  = '/dmo/flight_arrival_time' )
+                  ( field         = 'distance'
+                    data_element  = '/dmo/distance_fe' )
+                  ( field         = 'distance_unit'
+                    data_element  = 'msehi' )
+    ).
+  ENDMETHOD.
+
+
+  METHOD get_flight_table_fields.
+    flight_table_fields = VALUE tt_fields(
+                  ( field         = 'client'
+                    data_element  = 'mandt'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'carrier_id'
+                    data_element  = '/dmo/carrier_id'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'connection_id'
+                    data_element  = '/dmo/connection_id'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'flight_date'
+                    data_element  = '/dmo/flight_date'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'price'
+                    data_element  = '/dmo/flight_price'
+                    currencycode  = 'currency_code' )
+                  ( field         = 'currency_code'
+                    data_element  = '/dmo/currency_code' )
+                  ( field         = 'plane_type_id'
+                    data_element  = '/dmo/plane_type_id' )
+                  ( field         = 'seats_max'
+                    data_element  = '/dmo/plane_seats_max' )
+                  ( field         = 'seats_occupied'
+                    data_element  = '/dmo/plane_seats_occupied' )
+    ).
+  ENDMETHOD.
+
+
+  METHOD get_json_string.
+    " build the json document
+    json_string ='{' && |\r\n| &&
+    ' "implementationType": "managed_uuid",' && |\r\n| &&
+    ' "transactionalbehavior" : true,' && |\r\n| &&
+    ' "publishservice" : true ,' && |\r\n| &&
+    | "transportrequest": "{ transport }",| && |\r\n| &&
+    ' "namespace": "Z",' && |\r\n| &&
+    | "suffix": "_{ unique_suffix }",| && |\r\n| &&
+    ' "prefix": "FE_",' && |\r\n| &&
+    | "package": "{ package_name }",| && |\r\n| &&
+    ' "datasourcetype": "table",' && |\r\n| &&
+    ' "draftenabled": true,' && |\r\n| && "draft
+    ' "bindingtype": "odata_v4_ui",' && |\r\n| &&
+    ' "hierarchy": {' && |\r\n| &&
+    ' "entityName": "Travel",' && |\r\n| &&
+    | "dataSource": "{ table_name_root }",| && |\r\n| &&
+    | "drafttable": "{ draft_table_name_root }",| && |\r\n| && "draft
+    ' "objectId": "travel_id",' && |\r\n| &&
+    ' "uuid": "travel_uuid",' && |\r\n| &&
+    ' "lastChangedAt":"LAST_CHANGED_AT",' && |\r\n| &&
+    ' "totalEtag":"LAST_CHANGED_AT",' && |\r\n| &&
+    ' "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",' && |\r\n| &&
+    '"etagMaster":"LOCAL_LAST_CHANGED_AT",' && |\r\n| &&
+
+    | "cdsinterfaceviewbasic" : "{ cdsinterfaceviewbasic_travel }",| && |\r\n| &&
+    | "cdsrestrictedreuseview": "{ cdsrestrictedreuseview_travel }",| && |\r\n| &&
+    | "cdsinterfaceview"      : "{ cdsinterfaceview_travel }",| && |\r\n| &&
+    | "cdsprojectionview"     : "{ cdsprojectionview_travel }",| && |\r\n| &&
+    | "metadataextensionview" : "{ metadataextensionview_travel }",| && |\r\n| &&
+
+
+
+
+    " value help definitions
+    ' "valueHelps": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "alias": "Agency",' && |\r\n| &&
+    ' "name": "/DMO/I_Agency",' && |\r\n| &&
+    ' "localElement": "AgencyID",' && |\r\n| &&
+    ' "element": "AgencyID"' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "alias": "Currency",' && |\r\n| &&
+    ' "name": "I_Currency",' && |\r\n| &&
+    ' "localElement": "CurrencyCode",' && |\r\n| &&
+    ' "element": "Currency"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ],' && |\r\n| &&
+    ' "associations": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "name": "_Agency",' && |\r\n| &&
+    ' "target": "/DMO/I_Agency",' && |\r\n| &&
+    ' "cardinality": "zero_to_one",' && |\r\n| &&
+    ' "conditions": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "AgencyID",' && |\r\n| &&
+    ' "associationField": "AgencyID"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "name": "_Currency",' && |\r\n| &&
+    ' "target": "I_Currency",' && |\r\n| &&
+    ' "cardinality": "zero_to_one",' && |\r\n| &&
+    ' "conditions": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "CurrencyCode",' && |\r\n| &&
+    ' "associationField": "Currency"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "name": "_Customer",' && |\r\n| &&
+    ' "target": "/DMO/I_Customer",' && |\r\n| &&
+    ' "cardinality": "zero_to_one",' && |\r\n| &&
+    ' "conditions": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "CustomerID",' && |\r\n| &&
+    ' "associationField": "CustomerID"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "name": "_TravelStatus",' && |\r\n| &&
+    | "target": "{ i_view_name_status }",| && |\r\n| &&
+    ' "cardinality": "zero_to_one",' && |\r\n| &&
+    ' "conditions": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "OverallStatus",' && |\r\n| &&
+    ' "associationField": "TravelStatusId"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ],' && |\r\n| &&
+    " children
+    ' "children": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "entityName": "Booking",' && |\r\n| &&
+    | "dataSource": "{ table_name_child }",| && |\r\n| &&
+    | "drafttable": "{ draft_table_name_child }",| && |\r\n| && "draft
+    ' "objectId": "booking_id",' && |\r\n| &&
+    ' "uuid": "booking_uuid",' && |\r\n| &&
+    ' "parentUuid": "travel_uuid",' && |\r\n| &&
+    ' "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",' && |\r\n| &&
+    '"etagMaster":"LOCAL_LAST_CHANGED_AT",' && |\r\n| &&
+
+
+    | "cdsinterfaceviewbasic" : "{ cdsinterfaceviewbasic_book }",| && |\r\n| &&
+    | "cdsrestrictedreuseview": "{ cdsrestrictedreuseview_book }",| && |\r\n| &&
+    | "cdsinterfaceview"      : "{ cdsinterfaceview_book }",| && |\r\n| &&
+    | "cdsprojectionview"     : "{ cdsprojectionview_book }",| && |\r\n| &&
+    | "metadataextensionview" : "{ metadataextensionview_book }",| && |\r\n| &&
+
+
+
+    ' "valueHelps": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "alias": "Flight",' && |\r\n| &&
+    | "name": "{ i_view_name_flight }",| && |\r\n| &&
+    ' "localElement": "ConnectionID",' && |\r\n| &&
+    ' "element": "ConnectionID",' && |\r\n| &&
+    ' "additionalBinding": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "localElement": "FlightDate",' && |\r\n| &&
+    ' "element": "FlightDate"' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "localElement": "CarrierID",' && |\r\n| &&
+    ' "element": "AirlineID"' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "localElement": "FlightPrice",' && |\r\n| &&
+    ' "element": "Price"' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "localElement": "CurrencyCode",' && |\r\n| &&
+    ' "element": "CurrencyCode"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "alias": "Currency",' && |\r\n| &&
+    ' "name": "I_Currency",' && |\r\n| &&
+    ' "localElement": "CurrencyCode",' && |\r\n| &&
+    ' "element": "Currency"' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "alias": "Airline",' && |\r\n| &&
+    | "name": "{ i_view_name_carrier }",| && |\r\n| &&
+    ' "localElement": "CarrierID",' && |\r\n| &&
+    ' "element": "AirlineID"' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "alias": "Customer",' && |\r\n| &&
+    ' "name": "/DMO/I_Customer",' && |\r\n| &&
+    ' "localElement": "CustomerID",' && |\r\n| &&
+    ' "element": "CustomerID"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ],' && |\r\n| &&
+    ' "associations": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "name": "_Connection",' && |\r\n| &&
+    | "target": "{ i_view_name_connection }",| && |\r\n| &&
+    ' "cardinality": "one_to_one",' && |\r\n| &&
+    ' "conditions": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "CarrierID",' && |\r\n| &&
+    ' "associationField": "AirlineID"' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "ConnectionID",' && |\r\n| &&
+    ' "associationField": "ConnectionID"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "name": "_Flight",' && |\r\n| &&
+    | "target": "{ i_view_name_flight }",| && |\r\n| &&
+    ' "cardinality": "one_to_one",' && |\r\n| &&
+    ' "conditions": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "CarrierID",' && |\r\n| &&
+    ' "associationField": "AirlineID"' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "ConnectionID",' && |\r\n| &&
+    ' "associationField": "ConnectionID"' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "FlightDate",' && |\r\n| &&
+    ' "associationField": "FlightDate"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "name": "_Carrier",' && |\r\n| &&
+    | "target": "{ i_view_name_carrier }",| && |\r\n| &&
+    ' "cardinality": "one_to_one",' && |\r\n| &&
+    ' "conditions": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "CarrierID",' && |\r\n| &&
+    ' "associationField": "AirlineID"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "name": "_Currency",' && |\r\n| &&
+    ' "target": "I_Currency",' && |\r\n| &&
+    ' "cardinality": "zero_to_one",' && |\r\n| &&
+    ' "conditions": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "CurrencyCode",' && |\r\n| &&
+    ' "associationField": "Currency"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' },' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "name": "_Customer",' && |\r\n| &&
+    ' "target": "/DMO/I_Customer",' && |\r\n| &&
+    ' "cardinality": "one_to_one",' && |\r\n| &&
+    ' "conditions": [' && |\r\n| &&
+    ' {' && |\r\n| &&
+    ' "projectionField": "CustomerID",' && |\r\n| &&
+    ' "associationField": "CustomerID"' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' }' && |\r\n| &&
+    ' ]' && |\r\n| &&
+    ' }' && |\r\n| &&
+    '}'.
+  ENDMETHOD.
+
+
+  METHOD get_json_string_status.
+    " build the json document
+    json_string_status ='{' && |\r\n|  &&
+                         '  "implementationType": "unmanaged_semantic",' && |\r\n|  &&
+                         '  "transactionalbehavior" : false,' && |\r\n|  &&
+                         '  "publishservice" : false ,' && |\r\n|  &&
+                         '  "namespace": "Z",' && |\r\n|  &&
+                         |  "suffix": "_{ unique_suffix }",| && |\r\n|  &&
+                         '  "prefix": "FE_",' && |\r\n|  &&
+                         |  "package": "{ package_name }",| && |\r\n|  &&
+                         '  "datasourcetype": "table",' && |\r\n|  &&
+                         '  "draftenabled": false,' && |\r\n|  &&                            "draft
+                         '  "bindingtype": "odata_v4_ui",' && |\r\n|  &&
+                         '  "hierarchy": {' && |\r\n|  &&
+                         '    "entityName": "Status",' && |\r\n|  &&
+                         |    "dataSource": "{ table_name_status }",| && |\r\n|  &&
+                         '    "objectId": "travel_status_id"' && |\r\n|  &&
+                         '  }' && |\r\n|  &&
+                        '}'.
+  ENDMETHOD.
+
+
+  METHOD get_root_table_fields.
+    root_table_fields = VALUE tt_fields(
+                  ( field         = 'client'
+                    data_element  = 'mandt'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'travel_uuid'
+                    data_element  = 'sysuuid_x16'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'travel_id'
+                    data_element  = '/dmo/travel_id' )
+                  ( field         = 'agency_id'
+                    data_element  = '/dmo/agency_id' )
+                  ( field         = 'customer_id'
+                    data_element  = '/dmo/customer_id' )
+                  ( field         = 'begin_date'
+                    data_element  = '/dmo/begin_date' )
+                  ( field         = 'end_date'
+                    data_element  = '/dmo/end_date' )
+                  ( field         = 'booking_fee'
+                    data_element  = '/dmo/booking_fee'
+                    currencycode  = 'currency_code' )
+                  ( field         = 'total_price'
+                    data_element  = '/dmo/total_price'
+                    currencycode  = 'currency_code' )
+                  ( field         = 'currency_code'
+                    data_element  = '/dmo/currency_code' )
+                  ( field         = 'description'
+                    data_element  = '/dmo/description' )
+                  ( field         = 'overall_status'
+                    data_element  = '/dmo/overall_status' )
+                  ( field         = 'created_by'
+                    data_element  = 'syuname' )
+                  ( field         = 'created_at'
+                    data_element  = 'timestampl' )
+                  ( field         = 'last_changed_by'
+                    data_element  = 'syuname' )
+                  ( field         = 'last_changed_at'
+                    data_element  = 'timestampl' )
+                  ( field         = 'local_last_changed_at '
+                    data_element  = 'timestampl' )
+                    ).
+  ENDMETHOD.
+
+
+  METHOD get_status_table_fields.
+    status_table_fields = VALUE tt_fields(
+                  ( field         = 'client'
+                    data_element  = 'mandt'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'travel_status_id'
+                    data_element  = '/dmo/overall_status'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'travel_status_text'
+                    data_element  = '/dmo/description' )
+                    ).
+  ENDMETHOD.
+
+
+  METHOD get_unique_suffix.
+    DATA: li_counter(6)    TYPE n,
+          ls_counter       TYPE string,
+          ls_package_name  TYPE sxco_package,
+          is_valid_package TYPE abap_bool.
+
+
+    s_unique_suffix = ''.
+    is_valid_package = abap_false.
+    li_counter = 1000.
+    ls_counter = li_counter.
+    ls_package_name = s_prefix && ls_counter.
+
+    WHILE is_valid_package = abap_false.
+      "check package name
+      DATA(lo_package) = xco_lib->get_package( ls_package_name ). "  xco_cp_abap_repository=>object->devc->for( ls_package_name ).
+      IF NOT lo_package->exists( ).
+        is_valid_package = abap_true.
+        s_unique_suffix = ls_counter.
+      ENDIF.
+      li_counter = li_counter + 1.
+      ls_counter = li_counter.
+      ls_package_name = s_prefix && ls_counter.
+    ENDWHILE.
+  ENDMETHOD.
+
+
+  METHOD if_oo_adt_classrun~main.
+    out->write( | SAP Fiori elements exercise generator | ).
+    out->write( | ------------------------------------- | ).
+    " to upper
+    package_name  = to_upper( package_name ).
+    unique_suffix = to_upper( unique_suffix ).
+
+    "create transport
+    IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_false.
+      transport = create_transport(  ).
+    ENDIF.
+
+    IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_true.
+      DATA(my_package) = xco_lib->get_package( CONV sxco_package( co_zlocal_package ) ).
+      IF my_package->exists( ) = abap_false.
+        out->write( |Super package { co_zlocal_package } does not exist.| ).
+        create_super_package( ).
+        IF my_package->exists( ) = abap_false.
+          out->write( |Super package { co_zlocal_package } cannot be created.| ).
+          EXIT.
+        ELSE.
+          out->write( |Super package { co_zlocal_package } created.| ).
+        ENDIF.
+      ELSE.
+        out->write( |Super package { co_zlocal_package } exists.| ).
+      ENDIF.
+    ENDIF.
+
+    "create package
+    create_package( transport ).
+    out->write( | The following package got created for you and includes everything you need: { package_name } | ).
+    out->write( | In the "Project Explorer" right click on "Favorite Packages" and click on "Add Package...". Enter "{ package_name }" and click OK. | ).
+
+    mo_environment     = get_environment( transport ).
+
+    DATA(json_string)              = get_json_string(  ).            " get json document
+    DATA(root_table_fields)        = get_root_table_fields(  ).
+
+    mo_put_operation = get_put_operation( mo_environment )."->create_put_operation( ).
+
+    generate_table(
+      EXPORTING
+*        io_put_operation        = put_operation
+        table_fields            = root_table_fields
+        table_name              = table_name_root
+        table_short_description = 'Travel persistence for Travel scenario'
+    ).
+
+    IF table_name_child IS NOT INITIAL.
+      DATA(child_table_fields)  = get_child_table_fields(  ).
+      generate_table(
+        EXPORTING
+*          io_put_operation        = put_operation
+          table_fields            = child_table_fields
+          table_name              = table_name_child
+          table_short_description = 'Booking persistence for Travel scenario'
+      ).
+    ENDIF.
+
+    DATA(status_table_fields)  = get_status_table_fields(  ).
+    generate_table(
+      EXPORTING
+*        io_put_operation        = put_operation
+        table_fields            = status_table_fields
+        table_name              = table_name_status
+        table_short_description = 'Status Description persistence for Travel scenario'
+    ).
+    generate_status_i_view(
+*      EXPORTING
+*        io_put_operation        = put_operation
+    ).
+
+    DATA(carrier_table_fields)  = get_carrier_table_fields(  ).
+    generate_table(
+      EXPORTING
+*        io_put_operation        = put_operation
+        table_fields            = carrier_table_fields
+        table_name              = table_name_carrier
+        table_short_description = 'Carrier persistence for Travel scenario'
+    ).
+    generate_carrier_i_view(
+*      EXPORTING
+*        io_put_operation        = put_operation
+    ).
+
+    DATA(connection_table_fields)  = get_connection_table_fields(  ).
+    generate_table(
+      EXPORTING
+*        io_put_operation        = put_operation
+        table_fields            = connection_table_fields
+        table_name              = table_name_connection
+        table_short_description = 'Connection persistence for Travel scenario'
+    ).
+    generate_connection_i_view(
+*      exporting
+*        io_put_operation        = put_operation
+    ).
+
+    DATA(flight_table_fields)  = get_flight_table_fields(  ).
+    generate_table(
+      EXPORTING
+*        io_put_operation        = put_operation
+        table_fields            = flight_table_fields
+        table_name              = table_name_flight
+        table_short_description = 'Flight persistence for Travel scenario'
+    ).
+    generate_flight_i_view(
+*      EXPORTING
+*        io_put_operation        = put_operation
+    ).
+
+    TRY.
+        DATA(lo_result) = mo_put_operation->execute( ).
+
+
+
+      CATCH cx_xco_gen_put_exception  INTO DATA(exc_XCO_GEN_PUT_EXCEPTION).
+        " handle findings
+        IF show_findings = abap_true.
+
+          DATA(lo_findings) = lo_result->findings.
+          DATA(lt_findings) = lo_findings->get( ).
+          IF lt_findings IS NOT INITIAL.
+            out->write( lt_findings ).
+          ENDIF.
+          LOOP AT exc_xco_gen_put_exception->findings->get(  ) INTO DATA(put_Finding).
+            out->write( put_Finding->message->get_text(  ) ).
+          ENDLOOP.
+          EXIT.
+        ENDIF.
+    ENDTRY.
+
+*   Create data generator class
+
+    mo_draft_tabl_put_operation = get_put_operation( mo_environment  ).
+    generate_data_generator_class(
+      EXPORTING
+*        io_put_operation       = put_operation
+        lo_transport            = transport
+    ).
+    lo_result = mo_draft_tabl_put_operation->execute( ).
+    " handle findings
+    IF show_findings = abap_true.
+      lo_findings = lo_result->findings.
+      lt_findings = lo_findings->get( ).
+      IF lt_findings IS NOT INITIAL.
+        out->write( lt_findings ).
+      ENDIF.
+    ENDIF.
+
+    IF xco_lib->on_premise_branch_is_used(  ) = abap_false.
+      release_data_generator_class(
+          EXPORTING
+              lo_transport            = transport
+      ).
+    ENDIF.
+
+    DATA lo_object TYPE REF TO if_oo_adt_classrun.
+    CREATE OBJECT lo_object TYPE (data_generator_class_name).
+    lo_object->main(
+        EXPORTING out = out "->plain
+    ).
+
+    DATA(rap_bo_generator) = zdmo_cl_rap_generator=>create_for_cloud_development( json_string ).
+    DATA(lt_todos)         = rap_bo_generator->generate_bo(  ).
+
+    IF show_findings = abap_true.
+      " handle findings
+      lo_findings = lo_result->findings.
+      lt_findings = lo_findings->get( ).
+      IF lt_findings IS NOT INITIAL.
+        out->write( lt_findings ).
+      ENDIF.
+    ENDIF.
+    TRY.
+*    Delete mde files to start with annotations from scratch
+        IF create_mde_files = abap_false.
+*      DATA mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system.
+
+          DATA lv_del_transport   TYPE sxco_transport.
+          lv_del_transport = rap_bo_generator->root_node->transport_request.
+
+
+          IF lv_del_transport IS INITIAL.
+            DATA(cts_obj) = xco_cp_abap_repository=>object->for(
+            EXPORTING
+            iv_type = 'DDLX'
+            iv_name = to_upper( rap_bo_generator->root_node->rap_node_objects-meta_data_extension )
+            )->if_xco_cts_changeable~get_object( ).
+            lv_del_transport = cts_obj->get_lock( )->get_transport( ).
+            lv_del_transport = xco_cp_cts=>transport->for( lv_del_transport )->get_request( )->value.
+          ENDIF.
+          DATA(mo_environment2) = get_environment( lv_del_transport ).
+          mo_environment2 = get_environment( lv_del_transport ). "xco_cp_generation=>environment->dev_system( lv_del_transport ).
+          DATA(lo_delete_ddlx_operation) = mo_environment2->for-ddlx->create_delete_operation( ).
+          DATA(lo_delete_ddls_operation) = mo_environment2->for-ddls->create_delete_operation( ).
+          DATA(lo_delete_bdef_operation) = mo_environment2->for-bdef->create_delete_operation( ).
+          lo_delete_ddlx_operation->add_object( rap_bo_generator->root_node->rap_node_objects-meta_data_extension ).
+          "delete i-tp view and corresponding bdef
+          lo_delete_ddls_operation->add_object( rap_bo_generator->root_node->rap_node_objects-cds_view_i ).
+          lo_delete_bdef_operation->add_object( rap_bo_generator->root_node->rap_root_node_objects-behavior_definition_i ).
+
+          LOOP AT rap_bo_generator->root_node->all_childnodes INTO DATA(ls_childnode).
+            lo_delete_ddlx_operation->add_object( ls_childnode->rap_node_objects-meta_data_extension ).
+            lo_delete_ddls_operation->add_object( ls_childnode->rap_node_objects-cds_view_i ).
+          ENDLOOP.
+          lo_delete_bdef_operation->execute(  ).
+          lo_delete_ddls_operation->execute(  ).
+          lo_delete_ddlx_operation->execute( ).
+          out->write( |Success: deleting objects| ).
+        ENDIF.
+      CATCH cx_root INTO DATA(delete_exception).
+        out->write( |exception occured when deleting objects| ).
+    ENDTRY.
+
+
+*   Create artifacts for analytics
+    mo_put_operation1 = get_put_operation( mo_environment ). "->create_put_operation( ).
+    mo_put_operation2 = get_put_operation( mo_environment ). "->create_put_operation( ).
+    generate_analytics_service(
+*      EXPORTING
+*        io_put_operation1        = lo_objects_put_op_analytics1
+*        io_put_operation2        = lo_objects_put_op_analytics2
+    ).
+    DATA(lo_result_alp) = mo_put_operation1->execute( ).
+
+    IF show_findings = abap_true.
+      lo_findings = lo_result->findings.
+      lt_findings = lo_findings->get( ).
+      IF lt_findings IS NOT INITIAL.
+        out->write( lt_findings ).
+      ENDIF.
+    ENDIF.
+
+    lo_result_alp = mo_put_operation2->execute( ).
+    IF show_findings = abap_true.
+      lo_findings = lo_result->findings.
+      lt_findings = lo_findings->get( ).
+      IF lt_findings IS NOT INITIAL.
+        out->write( lt_findings ).
+      ENDIF.
+    ENDIF.
+    out->write( | Enjoy your SAP Fiori elements exercise :) | ).
+  ENDMETHOD.
+
+
+  METHOD release_data_generator_class.
+
+    DATA(lo_change_scenario) = xco_cp_cts=>transport->for( lo_transport ).
+    DATA(lo_api_state) = xco_cp_ars=>api_state->released( VALUE #( ( xco_cp_ars=>visibility->sap_cloud_platform ) ) ).
+
+    DATA(lo_class) = xco_lib->get_class( data_generator_class_name ).
+
+*    DATA(lo_data_element) = xco_cp_abap_repository=>object->clas->for( data_generator_class_name ).
+    lo_class->set_api_state(
+      io_change_scenario = lo_change_scenario
+      io_api_state       = lo_api_state
+    ).
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_fe_travel_generator.clas.xml b/src/zdmo_cl_fe_travel_generator.clas.xml
new file mode 100644
index 0000000..debf394
--- /dev/null
+++ b/src/zdmo_cl_fe_travel_generator.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_FE_TRAVEL_GENERATOR</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>zdmo_cl_fe_travel_generator</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_build_json_2.clas.abap b/src/zdmo_cl_rap_gen_build_json_2.clas.abap
new file mode 100644
index 0000000..dc27ae2
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_build_json_2.clas.abap
@@ -0,0 +1,429 @@
+CLASS zdmo_cl_rap_gen_build_json_2 DEFINITION
+  PUBLIC
+  INHERITING FROM cl_xco_cp_adt_simple_classrun
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+
+    TYPES :  tt_rapgen_field TYPE STANDARD TABLE OF ZDMO_R_RAPG_FieldTP WITH EMPTY KEY.
+    TYPES :  ty_rapgen_field TYPE ZDMO_R_RAPG_FieldTP.
+    TYPES :  tt_rapgen_node TYPE STANDARD TABLE OF ZDMO_R_RAPG_NodeTP WITH EMPTY KEY.
+    TYPES :  ty_rapgen_node TYPE ZDMO_R_RAPG_NodeTP.
+    TYPES :  tt_rapgen_bo TYPE STANDARD TABLE OF ZDMO_R_RAPG_ProjectTP WITH EMPTY KEY.
+    TYPES :  ty_rapgen_bo TYPE  ZDMO_R_RAPG_ProjectTP.
+
+
+    TYPES: BEGIN OF entities,
+
+             nodeuuid TYPE sysuuid_x16,
+
+
+           END OF entities.
+
+    TYPES tt_childentities TYPE STANDARD TABLE OF entities WITH DEFAULT KEY  .
+    DATA root_entity  TYPE ZDMO_R_RAPG_NodeTP.
+    DATA rapgen_node TYPE tt_rapgen_node.
+    DATA rapgen_bo TYPE tt_rapgen_bo.
+    DATA rapgen_field TYPE tt_rapgen_field.
+
+    DATA run_via_f9 TYPE abap_boolean VALUE abap_false.
+
+    METHODS constructor
+      IMPORTING iv_bo_uuid      TYPE sysuuid_x16  OPTIONAL
+                it_rapgen_node  TYPE tt_rapgen_node OPTIONAL
+                it_rapgen_bo    TYPE tt_rapgen_bo OPTIONAL
+                it_rapgen_field TYPE tt_rapgen_field OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS create_json
+      "IMPORTING iv_rapgen_bo_uuid     TYPE ZDMO_rapgen_bo-rap_node_uuid
+      RETURNING VALUE(rv_json_string) TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS get_formatted_json_string
+      IMPORTING json_string_in         TYPE string
+      RETURNING VALUE(json_string_out) TYPE string
+      RAISING   cx_sxml_parse_error.
+
+
+  PROTECTED SECTION.
+    METHODS: main REDEFINITION.
+  PRIVATE SECTION.
+
+
+    DATA  json_data_builder TYPE REF TO if_xco_cp_json_data_builder  .
+    DATA rap_bo_uuid TYPE sysuuid_x16 .
+*    DATA rap_bo TYPE ZDMO_rapgen_bo.
+    DATA rap_bo TYPE ZDMO_R_RAPG_ProjectTP.
+
+    METHODS get_child_entity_keys
+      IMPORTING current_node              TYPE ZDMO_R_RAPG_NodeTP
+      RETURNING VALUE(child_csn_entities) TYPE  tt_childentities      .
+
+    METHODS in_order
+      IMPORTING current_node        TYPE ZDMO_R_RAPG_NodeTP
+                current_node_fields TYPE tt_rapgen_field OPTIONAL
+                "   out          TYPE REF TO if_xco_adt_classrun_out
+                io_json             TYPE REF TO if_xco_cp_json_data_builder   .
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_BUILD_JSON_2 IMPLEMENTATION.
+
+
+  METHOD constructor.
+    super->constructor( ).
+    rap_bo_uuid = iv_bo_uuid.
+    rapgen_bo = it_rapgen_bo.
+    rapgen_node = it_rapgen_node.
+    rapgen_field = it_rapgen_field.
+  ENDMETHOD.
+
+
+  METHOD create_json.
+
+    DATA json_string  TYPE string .
+    DATA formatted_json_string TYPE string.
+    DATA root_node_fields TYPE tt_rapgen_field .
+    DATA node_fields TYPE tt_rapgen_field.
+
+    DATA(lo_json_data_builder) = xco_cp_json=>data->builder( ).
+
+    IF line_exists( rapgen_bo[ rapbouuid = rap_bo_uuid ] ).
+      rap_bo = rapgen_bo[ rapbouuid = rap_bo_uuid ].
+    ELSE.
+      EXIT.
+    ENDIF.
+
+    IF sy-subrc = 0.
+
+      DATA(root_node)      =   rapgen_node[ isrootnode = abap_true RapBoUUID  = rap_bo_uuid  ].
+
+      CLEAR root_node_fields.
+
+      LOOP AT rapgen_field INTO DATA(field) WHERE NodeUUID = root_node-NodeUUID AND RapboUUID  = rap_bo_uuid  .
+        APPEND field TO root_node_fields.
+      ENDLOOP.
+*      DATA(root_node_fields) = rapgen_field[ RapboUUID = rap_bo_uuid NodeUUID = root_node-NodeUUID  ].
+
+      lo_json_data_builder->begin_object( ).
+
+      lo_json_data_builder->add_member( 'namespace' )->add_string( CONV string( rap_bo-namespace ) ).
+      lo_json_data_builder->add_member( 'package' )->add_string( CONV string( rap_bo-packagename ) ).
+      lo_json_data_builder->add_member( 'dataSourceType' )->add_string( CONV string( rap_bo-datasourcetype ) ).
+      lo_json_data_builder->add_member( 'bindingType' )->add_string( CONV string( rap_bo-bindingtype ) ).
+      lo_json_data_builder->add_member( 'implementationType' )->add_string( CONV string( rap_bo-implementationtype ) ).
+      lo_json_data_builder->add_member( 'prefix' )->add_string( CONV string( rap_bo-prefix ) ).
+      lo_json_data_builder->add_member( 'suffix' )->add_string( CONV string( rap_bo-suffix ) ).
+      lo_json_data_builder->add_member( 'draftEnabled' )->add_boolean( rap_bo-draftenabled ).
+      lo_json_data_builder->add_member( 'multiInlineEdit' )->add_boolean( rap_bo-MultiInlineEdit ).
+      lo_json_data_builder->add_member( 'isCustomizingTable' )->add_boolean( rap_bo-CustomizingTable ).
+      lo_json_data_builder->add_member( 'addBusinessConfigurationRegistration' )->add_boolean( rap_bo-AddToManageBusinessConfig ).
+      lo_json_data_builder->add_member( 'transportRequest' )->add_string( CONV string( rap_bo-TransportRequest ) ).
+
+      lo_json_data_builder->add_member( 'publishservice' )->add_boolean( rap_bo-PublishService ).
+      lo_json_data_builder->add_member( 'addbasiciviews' )->add_boolean( rap_bo-AddIViewBasic ).
+      lo_json_data_builder->add_member( 'isextensible' )->add_boolean( rap_bo-isExtensible ).
+      lo_json_data_builder->add_member( 'addsapobjecttype' )->add_boolean( rap_bo-addsapobjecttype ).
+      "set this string on entity level
+      "lo_json_data_builder->add_member( 'extensibilityElementSuffix' )->add_string( CONV string( rap_bo-extensibilityElementSuffix ) ).
+
+
+      lo_json_data_builder->add_member( 'hierarchy' ).
+
+      in_order(
+        EXPORTING
+          current_node = root_node
+          current_node_fields = root_node_fields
+          "out          = out
+          io_json      = lo_json_data_builder
+      ).
+
+
+      "end object von BO infos
+      lo_json_data_builder->end_object( ).
+
+      DATA(lo_json_data) = lo_json_data_builder->get_data( ).
+
+      json_string = lo_json_data->to_string( ).
+
+      rv_json_string = get_formatted_json_string( json_string ).
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD get_child_entity_keys.
+
+*    SELECT node_uuid FROM ZDMO_rapgen_node WHERE
+*                     parent_uuid = @current_node-node_uuid AND
+*                     is_root_node = @abap_false
+*                     INTO TABLE @child_csn_entities.
+
+    SELECT nodeuuid FROM @rapgen_node AS node
+           WHERE parentuuid = @current_node-nodeuuid AND
+                 isrootnode = @abap_false
+                 INTO TABLE @child_csn_entities.
+
+  ENDMETHOD.
+
+
+  METHOD get_formatted_json_string.
+
+    "cloud
+    DATA(json_xstring) = cl_abap_conv_codepage=>create_out( )->convert( json_string_in ).
+    "on_premise
+    "DATA(json_xstring) = cl_abap_codepage=>convert_to( json_string_in ).
+
+    "Check and pretty print JSON
+
+    DATA(reader) = cl_sxml_string_reader=>create( json_xstring ).
+    DATA(writer) = CAST if_sxml_writer(
+                          cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ) ).
+    writer->set_option( option = if_sxml_writer=>co_opt_linebreaks ).
+    writer->set_option( option = if_sxml_writer=>co_opt_indent ).
+    reader->next_node( ).
+    reader->skip_node( writer ).
+
+    "cloud
+    DATA(json_formatted_string) = cl_abap_conv_codepage=>create_in( )->convert( CAST cl_sxml_string_writer( writer )->get_output( ) ).
+    "on premise
+    "DATA(json_formatted_string) = cl_abap_codepage=>convert_from( CAST cl_sxml_string_writer( writer )->get_output( ) ).
+
+    json_string_out = escape( val = json_formatted_string format = cl_abap_format=>e_xml_text  ).
+
+  ENDMETHOD.
+
+
+  METHOD in_order.
+    DATA child_entities  TYPE TABLE OF zdmo_r_rapg_nodetp .
+
+    DATA child_fields TYPE tt_rapgen_field ."TYPE TABLE OF ZDMO_R_RAPG_FieldTP.
+
+    DATA i TYPE i.
+    " CLEAR child_entities.
+
+    io_json->begin_object( ).
+
+    io_json->add_member( 'entityname' )->add_string( CONV string( current_node-entityname ) ).
+    io_json->add_member( 'dataSource' )->add_string( CONV string( current_node-datasource ) ).
+    io_json->add_member( 'objectid' )->add_string( CONV string( current_node-fieldnameobjectid ) ).
+    "uuid specific fields
+    io_json->add_member( 'uuid' )->add_string( CONV string( current_node-fieldnameuuid ) ).
+    io_json->add_member( 'parentUUID' )->add_string( CONV string( current_node-fieldnameparentuuid ) ).
+    io_json->add_member( 'rootUUID' )->add_string( CONV string( current_node-fieldnamerootuuid ) ).
+    "etag specific fields
+    io_json->add_member( 'etagMaster' )->add_string( CONV string( current_node-fieldnameetagmaster ) ).
+    io_json->add_member( 'totalEtag' )->add_string( CONV string( current_node-fieldnametotaletag ) ).
+    "administrative fields
+    io_json->add_member( 'lastChangedAt' )->add_string( CONV string( current_node-fieldnamelastchangedat ) ).
+    io_json->add_member( 'lastChangedBy' )->add_string( CONV string( current_node-fieldnamelastchangedby ) ).
+    io_json->add_member( 'localInstanceLastChangedAt' )->add_string( CONV string( current_node-fieldnameloclastchangedat ) ).
+    io_json->add_member( 'createdAt' )->add_string( CONV string( current_node-fieldnamecreatedat ) ).
+    io_json->add_member( 'createdBy' )->add_string( CONV string( current_node-fieldnamecreatedby ) ).
+    "repository object names
+    io_json->add_member( 'draftTable' )->add_string( CONV string( current_node-drafttablename ) ).
+    io_json->add_member( 'cdsInterfaceView' )->add_string( CONV string( current_node-cdsiview ) ).
+    io_json->add_member( 'cdsInterfaceViewBasic' )->add_string( CONV string( current_node-CdsIViewBasic ) ).
+    io_json->add_member( 'cdsRestrictedReuseView' )->add_string( CONV string( current_node-cdsrview ) ).
+    io_json->add_member( 'cdsProjectionView' )->add_string( CONV string( current_node-cdspview ) ).
+    io_json->add_member( 'metadataExtensionView' )->add_string( CONV string( current_node-mdeview ) ).
+    io_json->add_member( 'behaviorImplementationClass' )->add_string( CONV string( current_node-behaviorimplementationclass ) ).
+    io_json->add_member( 'sapobjectnodetype' )->add_string( current_node-SAPObjectNodeType ).
+
+    io_json->add_member( 'extensioninclude' )->add_string( CONV string( current_node-ExtensionInclude ) ).
+    io_json->add_member( 'extensionincludeview' )->add_string( CONV string( current_node-ExtensionIncludeView ) ).
+    io_json->add_member( 'draftqueryview' )->add_string( CONV string( current_node-DraftQueryView ) ).
+
+    io_json->add_member( 'extensibilityElementSuffix' )->add_string( CONV string( current_node-ExtensibilityElementSuffix ) ) ."rap_bo-extensibilityElementSuffix ) ).
+
+
+*    IF current_node-isrootnode = abap_true.
+    io_json->add_member( 'serviceDefinition' )->add_string( CONV string( current_node-servicedefinition ) ).
+    io_json->add_member( 'serviceBinding' )->add_string( CONV string( current_node-servicebinding ) ).
+    io_json->add_member( 'sapobjecttype' )->add_string( rap_bo-SAPObjectType ).
+*    ENDIF.
+    io_json->add_member( 'controlStructure' )->add_string( CONV string( current_node-controlstructure ) ).
+    io_json->add_member( 'customQueryImplementationClass' )->add_string( CONV string( current_node-queryimplementationclass ) ).
+
+*    IF run_via_f9 = abap_true.
+
+    IF line_exists( rapgen_bo[ rapbouuid = rap_bo_uuid ] ).
+      DATA(root_bo) = rapgen_bo[ rapbouuid = rap_bo_uuid ].
+    ELSE.
+      EXIT.
+    ENDIF.
+
+    DATA test_node TYPE REF TO zdmo_cl_rap_node.
+    DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib.
+    DATA xco_on_prem_lib TYPE REF TO ZDMO_cl_rap_xco_on_prem_lib.
+    xco_on_prem_lib = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+
+    IF xco_on_prem_lib->on_premise_branch_is_used(  ).
+      xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+
+    test_node = NEW ZDMO_cl_rap_node(  ).
+    test_node->set_xco_lib( xco_lib ).
+
+    test_node->set_data_source_type( CONV #( root_bo-DataSourceType ) ).
+    test_node->set_data_source( CONV #( current_node-DataSource ) ).
+
+* create json entries for table mapping
+*
+
+* "mapping": [
+*      {
+*        "dbtable_field": "TRAVEL_ID",
+*        "cds_view_field": "TravelID"
+*      },
+*      {
+*        "dbtable_field": "AGENCY_ID",
+*        "cds_view_field": "AgencyID"
+*      },
+*      {
+*        "dbtable_field": "CUSTOMER_ID",
+*        "cds_view_field": "CustomerID"
+*      }
+*    ]
+
+
+
+    io_json->add_member( 'mapping' )->begin_array( ).
+
+    IF  current_node_fields  IS INITIAL.
+      "loop über die Felder
+      LOOP AT test_node->lt_fields INTO DATA(data_source_field).
+        io_json->begin_object( ).
+        io_json->add_member( 'dbtable_field' )->add_string( CONV string( data_source_field-name ) ).
+        io_json->add_member( 'cds_view_field' )->add_string( CONV string( data_source_field-cds_view_field  ) ).
+        io_json->end_object( ).
+        "end_loop
+      ENDLOOP.
+    ELSE.
+      LOOP AT current_node_fields INTO DATA(current_node_Field).
+        io_json->begin_object( ).
+        io_json->add_member( 'dbtable_field' )->add_string( CONV string( current_node_Field-DbtableField ) ).
+        io_json->add_member( 'cds_view_field' )->add_string( CONV string( current_node_Field-CdsViewField  ) ).
+        io_json->end_object( ).
+      ENDLOOP.
+    ENDIF.
+    io_json->end_array(  ).
+
+*    ENDIF.
+
+    DATA(child_entity_keys) = get_child_entity_keys( current_node ).
+
+    "CHECK child_entity_keys IS NOT INITIAL.
+    IF child_entity_keys IS INITIAL.
+      io_json->end_object( ).
+    ELSE.
+      io_json->add_member( 'Children' )->begin_array( ).
+
+      DATA(number_of_child_entities) = lines( child_entity_keys ).
+
+      LOOP AT child_entity_keys INTO DATA(child_entity_key).
+        DATA(child_entity) = rapgen_node[ nodeuuid = child_entity_key-nodeuuid ]  .
+        APPEND child_entity TO child_entities.
+      ENDLOOP.
+
+      WHILE i < number_of_child_entities - 1.
+        i += 1 .
+
+        CLEAR child_fields.
+
+        LOOP AT rapgen_field INTO DATA(field) WHERE NodeUUID = child_entities[ i ]-nodeuuid AND RapboUUID  = rap_bo_uuid  .
+          APPEND field TO child_fields.
+        ENDLOOP.
+
+        in_order(
+          EXPORTING
+            current_node = child_entities[ i ]
+            current_node_fields = child_fields
+           " out        = out
+            io_json = io_json
+          ).
+
+*child_fields
+*
+*Key Column  FieldUUID  sysuuid_x16 raw(16)  16 Byte UUID in 16 Bytes (Raw Format)
+*Column  NodeUUID  sysuuid_x16 raw(16)  16 Byte UUID in 16 Bytes (Raw Format)
+*Column  RapboUUID  sysuuid_x16 raw(16)  16 Byte UUID in 16 Bytes (Raw Format)
+*Column  DbtableField  sxco_ad_object_name char(30)  XCO ABAP Dictionary: Object name
+*Column  CdsViewField  sxco_cds_field_name char(30)  XCO CDS: Field name
+*Column  LocalLastChangedAt  timestampl dec(21,7)  UTC Time Stamp in Long Form (YYYYMMDDhhmmssmmmuuun)
+
+
+
+
+
+
+
+
+      ENDWHILE.
+
+      CLEAR child_fields.
+
+      LOOP AT rapgen_field INTO field WHERE NodeUUID = child_entities[ number_of_child_entities ]-nodeuuid AND RapboUUID  = rap_bo_uuid  .
+        APPEND field TO child_fields.
+      ENDLOOP.
+
+      in_order(
+        EXPORTING
+          current_node = child_entities[ number_of_child_entities ]
+          current_node_fields = child_fields
+         " out        = out
+          io_json = io_json
+      ).
+
+      io_json->end_array(  ).
+      io_json->end_object( ).
+    ENDIF.
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD main.
+
+    run_via_f9 = abap_true.
+
+    DATA(bo_name) = 'ZR_SalesOrderTP_900'.
+
+    SELECT SINGLE RapBoUUID  FROM ZDMO_R_RAPG_ProjectTP WHERE boname = @bo_name INTO @rap_bo_uuid.
+
+    IF sy-subrc <> 0.
+      out->write( |rap bo { bo_name } not found. Stop processing.| ).
+    ELSE.
+      out->write( |rap bo { bo_name } hass the following uuid { rap_bo_uuid }.|  ).
+    ENDIF.
+
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP
+    ENTITY Project
+    ALL FIELDS WITH VALUE #( ( RapboUUID = rap_bo_uuid ) )
+    RESULT DATA(rapbos).
+
+    LOOP AT rapbos ASSIGNING FIELD-SYMBOL(<rapbo>).
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP
+        ENTITY Project BY \_Node
+        ALL FIELDS
+        WITH VALUE #( ( RapboUUID = <rapbo>-RapboUUID ) )
+        RESULT DATA(rapnodes).
+    ENDLOOP.
+
+    MOVE-CORRESPONDING rapbos TO rapgen_bo.
+    MOVE-CORRESPONDING rapnodes TO rapgen_node.
+
+    DATA(json_string) = create_json(  ).
+    out->write( json_string ).
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_build_json_2.clas.xml b/src/zdmo_cl_rap_gen_build_json_2.clas.xml
new file mode 100644
index 0000000..b680b7b
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_build_json_2.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_BUILD_JSON_2</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Build json string from tables</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_get_abap_vers.clas.abap b/src/zdmo_cl_rap_gen_get_abap_vers.clas.abap
new file mode 100644
index 0000000..d69d447
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_abap_vers.clas.abap
@@ -0,0 +1,80 @@
+CLASS zdmo_cl_rap_gen_get_abap_vers DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_rap_query_provider.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_GET_ABAP_VERS IMPLEMENTATION.
+
+
+  METHOD if_rap_query_provider~select.
+    DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_abap_vers .
+    DATA business_data_line TYPE ZDMO_i_rap_generator_abap_Vers .
+    DATA(top)     = io_request->get_paging( )->get_page_size( ).
+    DATA(skip)    = io_request->get_paging( )->get_offset( ).
+    DATA(requested_fields)  = io_request->get_requested_elements( ).
+    DATA(sort_order)    = io_request->get_sort_elements( ).
+
+"check if packages exist that are part of customer software component
+select *  from I_CustABAPPackage into table @data(customer_packages_in_swc).
+
+data(xco_on_prem_lib) = new ZDMO_cl_rap_xco_on_prem_lib(  ).
+
+
+    TRY.
+        DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ).
+
+
+
+        DATA type_definition LIKE ZDMO_cl_rap_node=>abap_language_version.
+        DATA(descr_ref_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data_ref( REF #( type_definition ) ) ).
+        DATA(components) = descr_ref_type->get_components(  ).
+        LOOP AT components INTO DATA(line).
+
+          CASE to_lower( line-name ).
+            WHEN ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development .
+              if customer_packages_in_swc is not initial.
+                business_data_line-language_version = ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development.
+              endif.
+            WHEN ZDMO_cl_rap_node=>abap_language_version-standard.
+              "in the on premise branch this method returns abap_true
+              if xco_on_prem_lib->on_premise_branch_is_used(  ) = abap_true.
+                business_data_line = ZDMO_cl_rap_node=>abap_language_version-standard.
+              endif.
+            WHEN OTHERS.
+              "@todo(  ).
+          ENDCASE.
+          APPEND business_data_line TO business_data.
+        ENDLOOP.
+        SELECT * FROM @business_data AS binding_types
+              WHERE (filter_condition) INTO TABLE @business_data.
+
+        io_response->set_total_number_of_records( lines( business_data ) ).
+        io_response->set_data( business_data ).
+
+      CATCH cx_root INTO DATA(exception).
+        DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+
+        data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.
+
+         raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity
+              exporting
+                                  textid  = VALUE scx_t100key( msgid = exception_t100_key-msgid
+                                                               msgno = exception_t100_key-msgno
+                                                               attr1 = exception_t100_key-attr1
+                                                               attr2 = exception_t100_key-attr2
+                                                               attr3 = exception_t100_key-attr3
+                                                               attr4 = exception_t100_key-attr4 )
+
+                                  previous = exception .
+
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_get_abap_vers.clas.xml b/src/zdmo_cl_rap_gen_get_abap_vers.clas.xml
new file mode 100644
index 0000000..a9ed4da
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_abap_vers.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_GET_ABAP_VERS</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>get implementation types</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_get_bind_type.clas.abap b/src/zdmo_cl_rap_gen_get_bind_type.clas.abap
new file mode 100644
index 0000000..1b71c6a
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_bind_type.clas.abap
@@ -0,0 +1,78 @@
+CLASS zdmo_cl_rap_gen_get_bind_type DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_rap_query_provider.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_GET_BIND_TYPE IMPLEMENTATION.
+
+
+  METHOD if_rap_query_provider~select.
+    DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_impl_type .
+    DATA business_data_line TYPE ZDMO_i_rap_generator_impl_type .
+    DATA(top)     = io_request->get_paging( )->get_page_size( ).
+    DATA(skip)    = io_request->get_paging( )->get_offset( ).
+    DATA(requested_fields)  = io_request->get_requested_elements( ).
+    DATA(sort_order)    = io_request->get_sort_elements( ).
+
+    TRY.
+        DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ).
+
+
+
+        DATA type_definition LIKE ZDMO_cl_rap_node=>binding_type_name.
+        DATA(descr_ref_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data_ref( REF #( type_definition ) ) ).
+        DATA(components) = descr_ref_type->get_components(  ).
+        LOOP AT components INTO DATA(line).
+        data(binding_type) = to_lower( line-name ).
+        case binding_type.
+        when ZDMO_cl_rap_node=>binding_type_name-odata_v2_ui .
+        append ZDMO_cl_rap_node=>binding_type_name-odata_v2_ui to business_data.
+        when ZDMO_cl_rap_node=>binding_type_name-odata_v2_web_api.
+         append ZDMO_cl_rap_node=>binding_type_name-odata_v2_web_api to business_data.
+        when ZDMO_cl_rap_node=>binding_type_name-odata_v4_ui.
+         append ZDMO_cl_rap_node=>binding_type_name-odata_v4_ui to business_data.
+        when ZDMO_cl_rap_node=>binding_type_name-odata_v4_web_api.
+         append ZDMO_cl_rap_node=>binding_type_name-odata_v4_web_api to business_data.
+        when others.
+
+           RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+                EXPORTING
+                  textid   = ZDMO_cx_rap_generator=>invalid_binding_type
+                  mv_value = CONV #( line-name ).
+        ENDCASE.
+
+
+        ENDLOOP.
+        SELECT * FROM @business_data AS binding_types
+              WHERE (filter_condition) INTO TABLE @business_data.
+
+        io_response->set_total_number_of_records( lines( business_data ) ).
+        io_response->set_data( business_data ).
+
+      CATCH cx_root INTO DATA(exception).
+        DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+
+        data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.
+
+         raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity
+              exporting
+                                  textid  = VALUE scx_t100key( msgid = exception_t100_key-msgid
+                                                               msgno = exception_t100_key-msgno
+                                                               attr1 = exception_t100_key-attr1
+                                                               attr2 = exception_t100_key-attr2
+                                                               attr3 = exception_t100_key-attr3
+                                                               attr4 = exception_t100_key-attr4 )
+
+                                  previous = exception .
+
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_get_bind_type.clas.xml b/src/zdmo_cl_rap_gen_get_bind_type.clas.xml
new file mode 100644
index 0000000..f57857c
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_bind_type.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_GET_BIND_TYPE</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>get implementation types</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_get_booleans.clas.abap b/src/zdmo_cl_rap_gen_get_booleans.clas.abap
new file mode 100644
index 0000000..5ea86e7
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_booleans.clas.abap
@@ -0,0 +1,58 @@
+CLASS zdmo_cl_rap_gen_get_booleans DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_rap_query_provider.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_GET_BOOLEANS IMPLEMENTATION.
+
+
+  METHOD if_rap_query_provider~select.
+    DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_bool_vh.
+    DATA business_data_line TYPE ZDMO_i_rap_generator_bool_vh .
+    DATA(top)     = io_request->get_paging( )->get_page_size( ).
+    DATA(skip)    = io_request->get_paging( )->get_offset( ).
+    DATA(requested_fields)  = io_request->get_requested_elements( ).
+    DATA(sort_order)    = io_request->get_sort_elements( ).
+
+    TRY.
+        DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ).
+
+        business_data_line-bool_value = abap_false.
+        business_data_line-name = 'No'.
+        APPEND business_data_line TO business_data.
+        business_data_line-bool_value = abap_true.
+        business_data_line-name = 'Yes'.
+        APPEND business_data_line TO business_data.
+
+        SELECT * FROM @business_data AS implementation_types
+              WHERE (filter_condition) INTO TABLE @business_data.
+
+        io_response->set_total_number_of_records( lines( business_data ) ).
+        io_response->set_data( business_data ).
+
+      CATCH cx_root INTO DATA(exception).
+        DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+
+        DATA(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.
+
+        RAISE EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity
+          EXPORTING
+            textid   = VALUE scx_t100key( msgid = exception_t100_key-msgid
+                                          msgno = exception_t100_key-msgno
+                                          attr1 = exception_t100_key-attr1
+                                          attr2 = exception_t100_key-attr2
+                                          attr3 = exception_t100_key-attr3
+                                          attr4 = exception_t100_key-attr4 )
+            previous = exception.
+
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_get_booleans.clas.xml b/src/zdmo_cl_rap_gen_get_booleans.clas.xml
new file mode 100644
index 0000000..7b7cb40
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_booleans.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_GET_BOOLEANS</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Value help for boolean values</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_get_data_src_2.clas.abap b/src/zdmo_cl_rap_gen_get_data_src_2.clas.abap
new file mode 100644
index 0000000..30f9aa3
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_data_src_2.clas.abap
@@ -0,0 +1,395 @@
+CLASS zdmo_cl_rap_gen_get_data_src_2 DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_rap_query_provider.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_GET_DATA_SRC_2 IMPLEMENTATION.
+
+
+  METHOD if_rap_query_provider~select.
+
+    DATA business_data TYPE TABLE OF zdmo_i_rap_generator_data_src2 .
+    DATA business_data_line TYPE zdmo_i_rap_generator_data_src2 .
+    DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib.
+    DATA lt_cds_views TYPE sxco_t_data_definitions .
+    DATA lt_tables TYPE sxco_t_database_tables .
+    DATA lt_structures TYPE sxco_t_ad_structures  .
+
+    TRY.
+        DATA(top)     = io_request->get_paging( )->get_page_size( ).
+        DATA(skip)    = io_request->get_paging( )->get_offset( ).
+        DATA(requested_fields)  = io_request->get_requested_elements( ).
+        DATA(sort_order)    = io_request->get_sort_elements( ).
+        DATA(filter_condition_string) = io_request->get_filter( )->get_as_sql_string( ).
+        DATA(filter_condition_ranges) = io_request->get_filter( )->get_as_ranges(  ).
+        DATA(search_string) = to_upper( io_request->get_search_expression( ) ).
+
+*        READ TABLE filter_condition_ranges WITH KEY name = 'LANGUAGE_VERSION'
+*           INTO DATA(filter_condition_language).
+
+*        IF filter_condition_language IS NOT INITIAL.
+*          DATA(abap_language_version) = filter_condition_language-range[ 1 ]-low.
+*        ENDIF.
+
+        READ TABLE filter_condition_ranges WITH KEY name = 'PARENT_DATA_SOURCE'
+              INTO DATA(filter_condition_par_dat_src).
+*
+        IF filter_condition_par_dat_src IS NOT INITIAL.
+          DATA(parent_data_source) = filter_condition_par_dat_src-range[ 1 ]-low.
+        ENDIF.
+
+*        READ TABLE filter_condition_ranges WITH KEY name = 'IS_ROOT_NODE'
+*               INTO DATA(filter_condition_is_root_node).
+*
+*        IF filter_condition_is_root_node IS NOT INITIAL.
+*          DATA(is_root_node) = filter_condition_is_root_node-range[ 1 ]-low.
+*        ENDIF.
+*
+        DATA(xco_lib_on_prem) = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+
+        IF xco_lib_on_prem->on_premise_branch_is_used(  ) = abap_true. "  ZDMO_cl_rap_node=>abap_language_version-standard .
+          xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+        ELSE.
+          xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib(  ).
+        ENDIF.
+
+        DATA(custom_entity_name) = to_upper(  io_request->get_entity_id(  ) ).
+
+        CASE custom_entity_name.
+
+          WHEN 'ZDMO_I_RAP_GEN_GET_TABLES'.
+            DATA(data_source_type) = zdmo_cl_rap_node=>data_source_types-table.
+          WHEN 'ZDMO_I_RAP_GEN_GET_CDS_VIEWS'.
+            data_source_type = zdmo_cl_rap_node=>data_source_types-cds_view.
+          WHEN 'ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT'.
+            data_source_type = zdmo_cl_rap_node=>data_source_types-abstract_entity.
+          WHEN OTHERS.
+            READ TABLE filter_condition_ranges WITH KEY name = 'TYPE'
+                 INTO DATA(filter_condition_type).
+
+            IF filter_condition_type IS NOT INITIAL.
+              data_source_type = filter_condition_type-range[ 1 ]-low.
+            ENDIF.
+        ENDCASE.
+*        READ TABLE filter_condition_ranges WITH KEY name = 'PACKAGE_NAME'
+*             INTO DATA(filter_condition_package_name).
+*
+*        "if no package name is provided no data can be returned.
+*        IF filter_condition_package_name IS INITIAL.
+*          CLEAR business_data.
+*          io_response->set_total_number_of_records( lines( business_data ) ).
+*          io_response->set_data( business_data ).
+*          EXIT.
+*        ELSE.
+*          DATA(package_name) = filter_condition_package_name-range[ 1 ]-low.
+*        ENDIF.
+
+        CLEAR business_data.
+
+        "if data source is a CDS view we can simply show those views that can be reached via association / composition
+
+        IF
+           parent_data_source IS NOT INITIAL AND
+           ( data_source_type = ZDMO_cl_rap_node=>data_source_types-cds_view OR
+             data_source_type = ZDMO_cl_rap_node=>data_source_types-abstract_entity ).
+
+          DATA(my_node) = NEW ZDMO_cl_rap_node( xco_lib ).
+          my_node->set_data_source_type( data_source_type ).
+          my_node->set_data_source( parent_data_source ).
+
+          IF my_node IS NOT INITIAL.
+            LOOP AT my_node->composition_targets INTO DATA(composition_target).
+              CLEAR business_data_line.
+              business_data_line-name = composition_target.
+*                business_data_line-package_name = package_name.
+*                business_data_line-language_version = abap_language_version.
+              business_data_line-type = data_source_type .
+*                business_data_line-is_root_node = is_root_node.
+              business_data_line-parent_data_source = parent_data_source.
+              APPEND business_data_line TO business_data.
+            ENDLOOP.
+            LOOP AT my_node->association_targets INTO DATA(association_target).
+              CLEAR business_data_line.
+              business_data_line-name = association_target.
+*                business_data_line-package_name = package_name.
+*                business_data_line-language_version = abap_language_version.
+              business_data_line-type = data_source_type .
+*                business_data_line-is_root_node = is_root_node.
+              business_data_line-parent_data_source = parent_data_source.
+              APPEND business_data_line TO business_data.
+            ENDLOOP.
+          ENDIF.
+*            io_response->set_total_number_of_records( lines( business_data ) ).
+*            io_response->set_data( business_data ).
+*            EXIT.
+        ENDIF.
+
+        "start search only if more than minimal_search_string_length characters are provided
+
+        "search string also contains a leading and a trailing quotation mark
+        DATA(length_of_search_string) = numofchar( search_string ) - 2.
+
+
+        IF length_of_search_string < ZDMO_cl_rap_node=>minimal_search_string_length.
+*          CLEAR business_data.
+          "return targets of associations or compositions even if only a 'Z' has been entered
+          io_response->set_total_number_of_records( lines( business_data ) ).
+          io_response->set_data( business_data ).
+          EXIT.
+        ENDIF.
+
+
+*        DATA(data_source)
+*                DATA(package) = xco_lib->get_package( CONV  sxco_package( package_name ) ).
+*        DATA(package_properties) = package->read(  )-property.
+*        DATA(software_component) = package_properties-software_component->name.
+*        DATA(package_abap_language_version) = xco_lib->get_abap_language_version( package->name ).
+*
+*        "In an on premise system it is possible to select data sources from other software components
+*        "if the package is using ABAP language version "standard"
+*        "
+*        "If the package uses language version 5 (abap_for_cloud_development) only data sources from the same software component
+*        "or C1 released CDS views may be used
+*
+*        IF package_abap_language_version = ZDMO_cl_rap_node=>package_abap_language_version-standard.
+*          DATA(software_component_filter) = xco_cp_system=>software_component->get_filter( xco_cp_abap_sql=>constraint->contains_pattern( '%' ) ) .
+*        ELSE.
+*
+*
+**   " Get all data elements in package S_XCO_HOME_DEMO.
+**   DATA(lt_data_elements) = xco_abap_repository=>objects->dtel->all->in( lo_package )->get( ).
+**   When a package with language version 5 is used in an on premise system without
+**   customer software components you run into the problem that tables might use
+**   data elements that must not be used in your package.
+**   hence the genration fails.
+**   Workaround: If package has language version 5 and and on prem system < 2022 is used
+**   take only data sources from the same package.
+*
+*          DATA(filter_1) = xco_cp_system=>software_component->get_filter( xco_cp_abap_sql=>constraint->equal( software_component ) ) .
+*          "used to avoid replacement of string slashDMOslash
+*          "when moving from namespace slashDMOslash to zetDMOunderscore
+*          DATA(filter_2) = xco_cp_system=>software_component->get_filter( xco_cp_abap_sql=>constraint->equal( '/' && 'DMO' && '/' && 'SAP' ) ) .
+*
+*          IF software_component = 'ZLOCAL'.
+*            software_component_filter = xco_cp_abap_repository=>filter->union( it_filters = VALUE #( ( filter_1 ) ( filter_2 ) ) ).
+*          ELSE.
+*            software_component_filter = filter_1.
+*          ENDIF.
+*
+*
+*        ENDIF.
+
+
+
+
+
+        READ TABLE filter_condition_ranges WITH KEY name = 'NAME'
+              INTO DATA(filter_condition_name).
+
+        "check if data_source_type is cds_view (abstract entity) and if we are dealing with a child node
+        "in this case the value help shall only offer cds views (or abstract entities) that can be reached
+        "via association / composition of the cds view that is used as a data source of the parent entity.
+
+
+
+
+        IF filter_condition_name IS NOT INITIAL.
+          LOOP AT filter_condition_name-range INTO DATA(range).
+            REPLACE ALL OCCURRENCES OF '*' IN range-low WITH '%'.
+            DATA(lo_name_filter) = xco_cp_abap_repository=>object_name->get_filter(
+              xco_cp_abap_sql=>constraint->contains_pattern( range-low )
+               ).
+            CASE  data_source_type.
+              WHEN ZDMO_cl_rap_node=>data_source_types-cds_view.
+                DATA(lt_cds_views_add) = xco_lib->get_views( VALUE #(
+                                            ( lo_name_filter )
+*                                            ( software_component_filter )
+                                            ) ).
+                APPEND LINES OF lt_cds_views_add TO lt_cds_views.
+              WHEN ZDMO_cl_rap_node=>data_source_types-table.
+                DATA(lt_tables_add) = xco_lib->get_tables( VALUE #(
+                                            ( lo_name_filter )
+*                                            ( software_component_filter )
+                                            ) ).
+                APPEND LINES OF lt_tables_add TO lt_tables.
+              WHEN ZDMO_cl_rap_node=>data_source_types-structure.
+                DATA(lt_structures_add) = xco_lib->get_structures(  VALUE #(
+                                            ( lo_name_filter )
+*                                            ( software_component_filter )
+                                            )  ).
+                APPEND LINES OF lt_structures_add TO lt_structures.
+            ENDCASE.
+          ENDLOOP.
+
+        ENDIF.
+
+        IF search_string IS NOT INITIAL.
+*          search_string = substring( val = search_string  off = 1 len = strlen( search_string ) - 2  ) .
+*          search_string = '%' && search_string && '%'.
+          REPLACE ALL OCCURRENCES OF '"' IN search_string WITH '%'.
+          "search_string = to_upper( search_string ).
+          lo_name_filter = xco_cp_abap_repository=>object_name->get_filter(
+                 xco_cp_abap_sql=>constraint->contains_pattern( search_string  )
+                  ).
+          CASE  data_source_type.
+            WHEN ZDMO_cl_rap_node=>data_source_types-cds_view OR ZDMO_cl_rap_node=>data_source_types-abstract_entity.
+              "lt_cds_views = xco_cp_abap_repository=>objects->ddls->all->in( xco_cp_abap=>repository )->get( ).
+              lt_cds_views = xco_lib->get_views( VALUE #(
+                                            ( lo_name_filter )
+*                                            ( software_component_filter )
+                                            ) ).
+            WHEN ZDMO_cl_rap_node=>data_source_types-table.
+              "lt_tables = xco_cp_abap_repository=>objects->tabl->database_tables->all->in( xco_cp_abap=>repository )->get( ).
+              lt_tables = xco_lib->get_tables( VALUE #(
+                                            ( lo_name_filter )
+*                                            ( software_component_filter )
+                                            ) ).
+            WHEN ZDMO_cl_rap_node=>data_source_types-structure.
+              "lt_structures = xco_cp_abap_repository=>objects->tabl->structures->all->in( xco_cp_abap=>repository )->get( ).
+              lt_structures = xco_lib->get_structures( VALUE #(
+                                            ( lo_name_filter )
+*                                            ( software_component_filter )
+                                            ) ).
+          ENDCASE.
+
+
+
+*            CASE  filter_condition_Type-range[ 1 ]-low.
+*              WHEN ZDMO_cl_rap_node=>data_source_types-cds_view.
+*                "lt_cds_views = xco_cp_abap_repository=>objects->ddls->all->in( xco_cp_abap=>repository )->get( ).
+*                lt_cds_views = xco_lib->get_views( lo_filter ).
+*              WHEN ZDMO_cl_rap_node=>data_source_types-table.
+*                "lt_tables = xco_cp_abap_repository=>objects->tabl->database_tables->all->in( xco_cp_abap=>repository )->get( ).
+*                lt_tables = xco_lib->get_tables( ).
+*              WHEN ZDMO_cl_rap_node=>data_source_types-structure.
+*                "lt_structures = xco_cp_abap_repository=>objects->tabl->structures->all->in( xco_cp_abap=>repository )->get( ).
+*                lt_structures = xco_lib->get_structures( ).
+*            ENDCASE.
+
+        ENDIF.
+
+        "todo: select
+
+
+
+
+        CASE  data_source_type.
+          WHEN ZDMO_cl_rap_node=>data_source_types-cds_view OR ZDMO_cl_rap_node=>data_source_types-abstract_entity .
+            "first add cds views from software component
+            LOOP AT lt_cds_views INTO DATA(ls_cds_view).
+              CLEAR business_data_line.
+              DATA(view_type) = ls_cds_view->get_type( ).
+              IF view_type = xco_cp_data_definition=>type->view_entity OR
+                 view_type = xco_cp_data_definition=>type->view OR
+                 view_type = xco_cp_data_definition=>type->abstract_entity.
+*                business_data_line-package_name = package_name.
+                business_data_line-name = ls_cds_view->name.
+*                business_data_line-language_version = abap_language_version.
+                business_data_line-type = data_source_type .
+*                business_data_line-is_root_node = is_root_node.
+*                business_data_line-parent_data_source = parent_data_source.
+                IF NOT line_exists( business_data[ name =  ls_cds_view->name ] ) .
+                  APPEND business_data_line TO business_data.
+                ENDIF.
+              ENDIF.
+            ENDLOOP.
+
+            "get c1-released cds views
+            SELECT * FROM i_apisforclouddevelopment
+                                    WHERE objectdirectorytype = 'DDLS' AND
+                                          releasedobjectname LIKE @search_string
+                                    INTO TABLE @DATA(released_cds_views).
+
+            LOOP AT released_cds_views INTO DATA(released_cds_view).
+              CLEAR business_data_line.
+              DATA(lo_data_definition) = xco_lib->get_data_definition( CONV #( released_cds_view-releasedobjectname ) ).
+              view_type = lo_data_definition->get_type( ).
+
+              IF view_type = xco_cp_data_definition=>type->view_entity OR
+                           view_type = xco_cp_data_definition=>type->view OR
+                           view_type = xco_cp_data_definition=>type->abstract_entity.
+*                business_data_line-package_name = package_name.
+                business_data_line-name = released_cds_view-releasedobjectname.
+*                business_data_line-language_version = abap_language_version.
+                business_data_line-type = data_source_type .
+*                business_data_line-is_root_node = is_root_node.
+*                business_data_line-parent_data_source = parent_data_source.
+                IF NOT line_exists( business_data[ name =  ls_cds_view->name ] ) .
+                  APPEND business_data_line TO business_data.
+                ENDIF.
+              ENDIF.
+            ENDLOOP.
+
+          WHEN ZDMO_cl_rap_node=>data_source_types-table.
+            LOOP AT lt_tables INTO DATA(ls_table).
+              CLEAR business_data_line.
+*              business_data_line-package_name = package_name.
+              business_data_line-name = ls_table->name.
+*              business_data_line-language_version = abap_language_version.
+              business_data_line-type = data_source_type .
+*              business_data_line-is_root_node = is_root_node.
+*              business_data_line-parent_data_source = parent_data_source.
+              APPEND business_data_line TO business_data.
+            ENDLOOP.
+          WHEN ZDMO_cl_rap_node=>data_source_types-structure.
+            LOOP AT lt_structures INTO DATA(ls_structure).
+              CLEAR business_data_line.
+*              business_data_line-package_name = package_name.
+              business_data_line-name = ls_structure->name.
+*              business_data_line-language_version = abap_language_version.
+              business_data_line-type = data_source_type .
+*              business_data_line-is_root_node = is_root_node.
+*              business_data_line-parent_data_source = parent_data_source.
+              APPEND business_data_line TO business_data.
+            ENDLOOP.
+        ENDCASE.
+
+
+
+
+
+
+        IF top IS NOT INITIAL.
+          DATA(max_index) = top + skip.
+        ELSE.
+          max_index = 0.
+        ENDIF.
+
+        SELECT * FROM @business_data AS datasource_names
+*           WHERE (filter_condition_string)
+           INTO TABLE @business_data
+           UP TO @max_index ROWS
+           .
+
+        IF skip IS NOT INITIAL.
+          DELETE business_data TO skip.
+        ENDIF.
+
+        io_response->set_total_number_of_records( lines( business_data ) ).
+        io_response->set_data( business_data ).
+
+      CATCH cx_root INTO DATA(exception).
+        DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+        DATA(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.
+
+        RAISE EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity
+          EXPORTING
+            textid   = VALUE scx_t100key( msgid = exception_t100_key-msgid
+                                          msgno = exception_t100_key-msgno
+                                          attr1 = exception_t100_key-attr1
+                                          attr2 = exception_t100_key-attr2
+                                          attr3 = exception_t100_key-attr3
+                                          attr4 = exception_t100_key-attr4 )
+            previous = exception.
+
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_get_data_src_2.clas.xml b/src/zdmo_cl_rap_gen_get_data_src_2.clas.xml
new file mode 100644
index 0000000..eed9593
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_data_src_2.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_GET_DATA_SRC_2</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>get data sources</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_get_dsrc_type.clas.abap b/src/zdmo_cl_rap_gen_get_dsrc_type.clas.abap
new file mode 100644
index 0000000..7442493
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_dsrc_type.clas.abap
@@ -0,0 +1,86 @@
+CLASS zdmo_cl_rap_gen_get_dsrc_type DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_rap_query_provider.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_GET_DSRC_TYPE IMPLEMENTATION.
+
+
+  METHOD if_rap_query_provider~select.
+    DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_dsrc_type .
+    DATA business_data_line TYPE ZDMO_i_rap_generator_dsrc_type .
+    DATA(top)     = io_request->get_paging( )->get_page_size( ).
+    DATA(skip)    = io_request->get_paging( )->get_offset( ).
+    DATA(requested_fields)  = io_request->get_requested_elements( ).
+    DATA(sort_order)    = io_request->get_sort_elements( ).
+
+    TRY.
+        DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ).
+
+
+
+        DATA type_definition LIKE ZDMO_cl_rap_node=>data_source_types.
+        DATA(descr_ref_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data_ref( REF #( type_definition ) ) ).
+        DATA(components) = descr_ref_type->get_components(  ).
+        LOOP AT components INTO DATA(line).
+          DATA(data_source_type) = to_lower( line-name ).
+
+          CASE data_source_type.
+            WHEN ZDMO_cl_rap_node=>data_source_types-abap_type.
+              business_data_line-type = ZDMO_cl_rap_node=>data_source_types-abap_type.
+            WHEN ZDMO_cl_rap_node=>data_source_types-cds_view.
+              business_data_line-type = ZDMO_cl_rap_node=>data_source_types-cds_view.
+            WHEN ZDMO_cl_rap_node=>data_source_types-structure.
+              business_data_line-type = ZDMO_cl_rap_node=>data_source_types-structure.
+            WHEN ZDMO_cl_rap_node=>data_source_types-table.
+              business_data_line-type = ZDMO_cl_rap_node=>data_source_types-table.
+            WHEN ZDMO_cl_rap_node=>data_source_types-abstract_entity.
+              business_data_line-type = ZDMO_cl_rap_node=>data_source_types-abstract_entity.
+            WHEN OTHERS.
+              RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+                EXPORTING
+                  textid   = ZDMO_cx_rap_generator=>invalid_data_source_type
+                  mv_value = CONV #( line-name ).
+          ENDCASE.
+
+          " we omit abap_type and structure.
+          " Support needs further work
+          CASE data_source_type.
+            WHEN ZDMO_cl_rap_node=>data_source_types-abap_type.
+            WHEN ZDMO_cl_rap_node=>data_source_types-structure.
+            WHEN OTHERS.
+              APPEND business_data_line TO business_data.
+          ENDCASE.
+
+        ENDLOOP.
+        SELECT * FROM @business_data AS binding_types
+              WHERE (filter_condition) INTO TABLE @business_data.
+
+        io_response->set_total_number_of_records( lines( business_data ) ).
+        io_response->set_data( business_data ).
+
+      CATCH cx_root INTO DATA(exception).
+        DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+        data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.
+
+        raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity
+              exporting
+                                  textid  = VALUE scx_t100key( msgid = exception_t100_key-msgid
+                                                               msgno = exception_t100_key-msgno
+                                                               attr1 = exception_t100_key-attr1
+                                                               attr2 = exception_t100_key-attr2
+                                                               attr3 = exception_t100_key-attr3
+                                                               attr4 = exception_t100_key-attr4 )
+
+                                  previous = exception .
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_get_dsrc_type.clas.xml b/src/zdmo_cl_rap_gen_get_dsrc_type.clas.xml
new file mode 100644
index 0000000..399c0ea
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_dsrc_type.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_GET_DSRC_TYPE</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>get data source types</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_get_fields.clas.abap b/src/zdmo_cl_rap_gen_get_fields.clas.abap
new file mode 100644
index 0000000..5e03a58
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_fields.clas.abap
@@ -0,0 +1,121 @@
+CLASS zdmo_cl_rap_gen_get_fields DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_rap_query_provider.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_GET_FIELDS IMPLEMENTATION.
+
+
+  METHOD if_rap_query_provider~select.
+    DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_fields .
+    DATA business_data_line TYPE ZDMO_i_rap_generator_fields .
+    DATA(top)     = io_request->get_paging( )->get_page_size( ).
+    DATA(skip)    = io_request->get_paging( )->get_offset( ).
+    DATA(requested_fields)  = io_request->get_requested_elements( ).
+    DATA(sort_order)    = io_request->get_sort_elements( ).
+    DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib.
+    TRY.
+        DATA(filter_condition_string) = io_request->get_filter( )->get_as_sql_string( ).
+        DATA(filter_condition_ranges) = io_request->get_filter( )->get_as_ranges(  ).
+
+        READ TABLE filter_condition_ranges WITH KEY name = 'LANGUAGE_VERSION'
+               INTO DATA(filter_condition_language).
+
+        IF filter_condition_language IS NOT INITIAL.
+          DATA(abap_language_Version) = filter_condition_language-range[ 1 ]-low.
+        ENDIF.
+
+
+        IF abap_language_version =  ZDMO_cl_rap_node=>abap_language_version-standard." abap_language_version-standard .
+          xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+        ELSE.
+          xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib(  ).
+        ENDIF.
+
+        READ TABLE filter_condition_ranges WITH KEY name = 'TYPE'
+        INTO DATA(filter_condition_type).
+
+        READ TABLE filter_condition_ranges WITH KEY name = 'NAME'
+            INTO DATA(filter_condition_name).
+        IF filter_condition_name IS NOT INITIAL and
+           filter_condition_type is not initial.
+          DATA test_node TYPE REF TO ZDMO_cl_rap_node.
+          test_node = NEW ZDMO_cl_rap_node(  ).
+          test_node->set_xco_lib( xco_lib ).
+
+          test_node->set_data_source_type( filter_condition_Type-range[ 1 ]-low ).
+          test_node->set_data_source( filter_condition_name-range[ 1 ]-low ).
+
+          "test_node->get_fields(  ).
+
+          business_data_line-name = filter_condition_name-range[ 1 ]-low .
+          business_data_line-type = filter_condition_Type-range[ 1 ]-low.
+
+          DATA(check_fields) = test_node->lt_fields.
+
+          LOOP AT test_node->lt_fields INTO DATA(ls_fields).
+            business_data_line-language_version = abap_language_Version.
+            business_data_line-field = ls_fields-name.
+            business_data_line-data_element = ls_fields-data_element.
+            business_data_line-built_in_type  = ls_fields-built_in_type        .
+            business_data_line-built_in_type_length  = ls_fields-built_in_type_length .
+            business_data_line-built_in_type_decimals = ls_fields-built_in_type_decimals .
+
+            APPEND business_data_line TO business_Data.
+          ENDLOOP.
+        ENDIF.
+
+*        SELECT * FROM @business_data AS data_source_fields
+*  WHERE (filter_condition_string)
+*  "order by (sort_order)
+*  INTO TABLE @business_data
+*  UP TO @top ROWS.
+
+        IF top IS NOT INITIAL.
+          DATA(max_index) = top + skip.
+        ELSE.
+          max_index = 0.
+        ENDIF.
+
+        SELECT * FROM @business_data AS data_source_fields
+           WHERE (filter_condition_string)
+           INTO TABLE @business_data
+           UP TO @max_index ROWS
+           .
+
+        IF skip IS NOT INITIAL.
+          DELETE business_data TO skip.
+        ENDIF.
+
+
+
+        io_response->set_total_number_of_records( lines( business_data ) ).
+        io_response->set_data( business_data ).
+
+      CATCH cx_root INTO DATA(exception).
+        DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+
+        data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.
+
+         raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity
+              exporting
+                                  textid  = VALUE scx_t100key( msgid = exception_t100_key-msgid
+                                                               msgno = exception_t100_key-msgno
+                                                               attr1 = exception_t100_key-attr1
+                                                               attr2 = exception_t100_key-attr2
+                                                               attr3 = exception_t100_key-attr3
+                                                               attr4 = exception_t100_key-attr4 )
+
+                                  previous = exception .
+
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_get_fields.clas.xml b/src/zdmo_cl_rap_gen_get_fields.clas.xml
new file mode 100644
index 0000000..3305197
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_fields.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_GET_FIELDS</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>get data source fields</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_get_impl_type.clas.abap b/src/zdmo_cl_rap_gen_get_impl_type.clas.abap
new file mode 100644
index 0000000..de5ecc4
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_impl_type.clas.abap
@@ -0,0 +1,76 @@
+CLASS zdmo_cl_rap_gen_get_impl_type DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_rap_query_provider.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_GET_IMPL_TYPE IMPLEMENTATION.
+
+
+  METHOD if_rap_query_provider~select.
+    DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_impl_type .
+    DATA business_data_line TYPE ZDMO_i_rap_generator_impl_type .
+    DATA(top)     = io_request->get_paging( )->get_page_size( ).
+    DATA(skip)    = io_request->get_paging( )->get_offset( ).
+    DATA(requested_fields)  = io_request->get_requested_elements( ).
+    DATA(sort_order)    = io_request->get_sort_elements( ).
+
+    TRY.
+        DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ).
+
+
+
+
+        DATA type_definition LIKE ZDMO_cl_rap_node=>implementation_type.
+        DATA(descr_ref_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data_ref( REF #( type_definition ) ) ).
+        DATA(components) = descr_ref_type->get_components(  ).
+        LOOP AT components INTO DATA(line).
+        data(implementation_type) = to_lower( line-name ).
+          CASE implementation_type.
+            WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+              APPEND ZDMO_cl_rap_node=>implementation_type-managed_uuid TO business_data.
+            WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+              APPEND ZDMO_cl_rap_node=>implementation_type-managed_semantic TO business_data.
+            WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+              APPEND ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic TO business_data.
+            WHEN OTHERS.
+              RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+                EXPORTING
+                  textid   = ZDMO_cx_rap_generator=>implementation_type_not_valid
+                  mv_value = CONV #( line-name ).
+          ENDCASE.
+
+*          append ZDMO_cl_rap_node=>implementation_type- (line-name) to business_data.
+        ENDLOOP.
+        SELECT * FROM @business_data AS implementation_types
+              WHERE (filter_condition) INTO TABLE @business_data
+               "UP TO @top ROWS
+               .
+
+        io_response->set_total_number_of_records( lines( business_data ) ).
+        io_response->set_data( business_data ).
+
+      CATCH cx_root INTO DATA(exception).
+        DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+        data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.
+
+         raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity
+              exporting
+                                  textid  = VALUE scx_t100key( msgid = exception_t100_key-msgid
+                                                               msgno = exception_t100_key-msgno
+                                                               attr1 = exception_t100_key-attr1
+                                                               attr2 = exception_t100_key-attr2
+                                                               attr3 = exception_t100_key-attr3
+                                                               attr4 = exception_t100_key-attr4 )
+
+                                  previous = exception .
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_get_impl_type.clas.xml b/src/zdmo_cl_rap_gen_get_impl_type.clas.xml
new file mode 100644
index 0000000..b1f41f6
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_impl_type.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_GET_IMPL_TYPE</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>get implementation types</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_get_impl_type2.clas.abap b/src/zdmo_cl_rap_gen_get_impl_type2.clas.abap
new file mode 100644
index 0000000..d2b6bf8
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_impl_type2.clas.abap
@@ -0,0 +1,73 @@
+CLASS zdmo_cl_rap_gen_get_impl_type2 DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_rap_query_provider.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_GET_IMPL_TYPE2 IMPLEMENTATION.
+
+
+  METHOD if_rap_query_provider~select.
+    DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_impl_typ2 .
+    DATA business_data_line TYPE ZDMO_i_rap_generator_impl_typ2 .
+    DATA(top)     = io_request->get_paging( )->get_page_size( ).
+    DATA(skip)    = io_request->get_paging( )->get_offset( ).
+    DATA(requested_fields)  = io_request->get_requested_elements( ).
+    DATA(sort_order)    = io_request->get_sort_elements( ).
+
+    TRY.
+        DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ).
+
+
+
+
+        DATA type_definition LIKE ZDMO_cl_rap_node=>bdef_implementation_type.
+        DATA(descr_ref_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data_ref( REF #( type_definition ) ) ).
+        DATA(components) = descr_ref_type->get_components(  ).
+        LOOP AT components INTO DATA(line).
+          DATA(implementation_type) = to_lower( line-name ).
+          CASE implementation_type.
+            WHEN ZDMO_cl_rap_node=>bdef_implementation_type-managed.
+              APPEND ZDMO_cl_rap_node=>bdef_implementation_type-managed TO business_data.
+            WHEN ZDMO_cl_rap_node=>bdef_implementation_type-unmanaged.
+              APPEND ZDMO_cl_rap_node=>bdef_implementation_type-unmanaged TO business_data.
+            WHEN OTHERS.
+              RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+                EXPORTING
+                  textid   = ZDMO_cx_rap_generator=>implementation_type_not_valid
+                  mv_value = CONV #( line-name ).
+          ENDCASE.
+
+*          append ZDMO_cl_rap_node=>implementation_type- (line-name) to business_data.
+        ENDLOOP.
+        SELECT * FROM @business_data AS implementation_types
+              WHERE (filter_condition) INTO TABLE @business_data
+               "UP TO @top ROWS
+               .
+
+        io_response->set_total_number_of_records( lines( business_data ) ).
+        io_response->set_data( business_data ).
+
+      CATCH cx_root INTO DATA(exception).
+        DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+        DATA(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.
+
+        RAISE EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity
+          EXPORTING
+            textid   = VALUE scx_t100key( msgid = exception_t100_key-msgid
+                                          msgno = exception_t100_key-msgno
+                                          attr1 = exception_t100_key-attr1
+                                          attr2 = exception_t100_key-attr2
+                                          attr3 = exception_t100_key-attr3
+                                          attr4 = exception_t100_key-attr4 )
+            previous = exception.
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_get_impl_type2.clas.xml b/src/zdmo_cl_rap_gen_get_impl_type2.clas.xml
new file mode 100644
index 0000000..a098775
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_impl_type2.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_GET_IMPL_TYPE2</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>get implementation types</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_get_job_status.clas.abap b/src/zdmo_cl_rap_gen_get_job_status.clas.abap
new file mode 100644
index 0000000..49766d2
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_job_status.clas.abap
@@ -0,0 +1,147 @@
+CLASS zdmo_cl_rap_gen_get_job_status DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_sadl_exit_calc_element_read.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_GET_JOB_STATUS IMPLEMENTATION.
+
+
+  METHOD if_sadl_exit_calc_element_read~calculate.
+
+    DATA jobname  TYPE cl_apj_rt_api=>ty_jobname .
+    DATA jobcount   TYPE cl_apj_rt_api=>ty_jobcount  .
+    DATA jobstatus  TYPE cl_apj_rt_api=>ty_job_status  .
+    DATA jobstatustext  TYPE cl_apj_rt_api=>ty_job_status_text .
+
+    DATA lt_original_data TYPE STANDARD TABLE OF ZDMO_C_RAPG_ProjectTP WITH DEFAULT KEY.
+    lt_original_data = CORRESPONDING #( it_original_data ).
+
+    LOOP AT lt_original_data ASSIGNING FIELD-SYMBOL(<fs_original_data>).
+
+      TRY.
+
+          <fs_original_data>-HideADTLink = abap_true.
+
+          IF <fs_original_data>-jobname IS NOT INITIAL AND <fs_original_data>-jobcount IS NOT INITIAL.
+
+            cl_apj_rt_api=>get_job_status(
+              EXPORTING
+                iv_jobname  = <fs_original_data>-JobName
+                iv_jobcount = <fs_original_data>-JobCount
+              IMPORTING
+                ev_job_status = JobStatus
+                ev_job_status_text = jobstatustext
+              ).
+
+            <fs_original_data>-JobStatus = jobstatus.
+            <fs_original_data>-JobStatusText = jobstatustext.
+
+            CASE jobstatus.
+              WHEN 'F'. "Finished
+                <fs_original_data>-JobStatusCriticality = 3. "green
+*                <fs_original_data>-HideADTLink = abap_false.
+              WHEN 'A'. "Aborted
+                <fs_original_data>-JobStatusCriticality = 1. "red
+              WHEN 'R'. "Running
+                <fs_original_data>-JobStatusCriticality = 2. "orange
+              WHEN 'Y'. "Ready
+                <fs_original_data>-JobStatusCriticality = 2. "orange
+              WHEN 'S'. "Scheduled
+                <fs_original_data>-JobStatusCriticality = 2. "orange
+              WHEN OTHERS.
+                <fs_original_data>-JobStatusCriticality = 0. "grey
+            ENDCASE.
+
+          ENDIF.
+
+
+
+        CATCH cx_apj_rt INTO DATA(exception).
+
+          DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+
+          <fs_original_data>-JobStatus = ''.
+          <fs_original_data>-JobStatusText = exception->get_text(  ).
+          <fs_original_data>-JobStatusCriticality = 0.
+
+        CATCH cx_root INTO DATA(root_exception).
+
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              previous = root_exception.
+
+      ENDTRY.
+
+      SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE RapboUUID = @<fs_original_data>-RapboUUID INTO @DATA(rap_generator_project) .
+
+      DATA(check_if_objects_are_deleted) = NEW zdmo_cl_rap_generator_del( rap_generator_project-BoName ).
+      DATA(objects_still_exist) = check_if_objects_are_deleted->rap_gen_project_objects_exist( rap_generator_project ).
+
+      <fs_original_data>-RepositoryObjectsExist = objects_still_exist.
+
+      IF objects_still_exist = abap_true.
+        <fs_original_data>-HideADTLink = abap_false.
+      ENDIF.
+
+
+
+    ENDLOOP.
+
+    ct_calculated_data = CORRESPONDING #(  lt_original_data ).
+
+  ENDMETHOD.
+
+
+  METHOD if_sadl_exit_calc_element_read~get_calculation_info.
+
+
+    CONSTANTS fieldname_jobcount TYPE string VALUE 'JOBCOUNT'.
+    CONSTANTS fieldname_jobname TYPE string VALUE 'JOBNAME'.
+
+
+    IF iv_entity <> 'ZDMO_C_RAPGENERATORBO' and iv_entity <> 'ZDMO_C_RAPG_PROJECTTP'.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>root_cause_exception
+          mv_value = |{ iv_entity } has no virtual elements|.
+    ENDIF.
+
+    LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_calc_element>).
+      CASE <fs_calc_element>.
+        WHEN 'JOBSTATUS' .
+          COLLECT fieldname_jobcount INTO et_requested_orig_elements.
+          COLLECT fieldname_jobname INTO et_requested_orig_elements.
+*          APPEND 'JOBCOUNT' TO et_requested_orig_elements.
+*          APPEND 'JOBNAME' TO et_requested_orig_elements.
+        WHEN 'JOBSTATUSTEXT'.
+          COLLECT fieldname_jobcount INTO et_requested_orig_elements.
+          COLLECT fieldname_jobname INTO et_requested_orig_elements.
+*          APPEND 'JOBCOUNT' TO et_requested_orig_elements.
+*          APPEND 'JOBNAME' TO et_requested_orig_elements.
+        WHEN 'JOBSTATUSCRITICALITY'.
+          COLLECT fieldname_jobcount INTO et_requested_orig_elements.
+          COLLECT fieldname_jobname INTO et_requested_orig_elements.
+        WHEN 'HIDEADTLINK'.
+          COLLECT fieldname_jobcount INTO et_requested_orig_elements.
+          COLLECT fieldname_jobname INTO et_requested_orig_elements.
+        WHEN 'REPOSITORYOBJECTSEXIST'  .
+          COLLECT fieldname_jobcount INTO et_requested_orig_elements.
+          COLLECT fieldname_jobname INTO et_requested_orig_elements.
+        WHEN OTHERS.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>root_cause_exception
+              mv_value = |Virtual element { <fs_calc_element> } not known|.
+      ENDCASE.
+    ENDLOOP.
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_get_job_status.clas.xml b/src/zdmo_cl_rap_gen_get_job_status.clas.xml
new file mode 100644
index 0000000..0967844
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_job_status.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_GET_JOB_STATUS</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Calculate virtual elements (Generation Jobs)</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_get_package.clas.abap b/src/zdmo_cl_rap_gen_get_package.clas.abap
new file mode 100644
index 0000000..6d4949f
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_package.clas.abap
@@ -0,0 +1,145 @@
+CLASS zdmo_cl_rap_gen_get_package DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_rap_query_provider.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_GET_PACKAGE IMPLEMENTATION.
+
+
+  METHOD if_rap_query_provider~select.
+    DATA business_data TYPE TABLE OF ZDMO_I_RAP_GENERATOR_PACKAGE .
+    DATA business_data_line TYPE ZDMO_I_RAP_GENERATOR_PACKAGE .
+    DATA(top)     = io_request->get_paging( )->get_page_size( ).
+    DATA(skip)    = io_request->get_paging( )->get_offset( ).
+    DATA(requested_fields)  = io_request->get_requested_elements( ).
+    DATA(sort_order)    = io_request->get_sort_elements( ).
+    DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib.
+
+    DATA lt_package TYPE sxco_t_packages  .
+
+    DATA(xco_on_prem_library) = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+
+    TRY.        DATA(filter_condition_string) = io_request->get_filter( )->get_as_sql_string( ).
+        DATA(filter_condition_ranges) = io_request->get_filter( )->get_as_ranges(  ).
+        DATA(search_string) = io_request->get_search_expression( ).
+
+        "search string also contains a leading and a trailing quotation mark
+        DATA(length_of_search_string) = numofchar( search_string ) - 2.
+
+        IF length_of_search_string < ZDMO_cl_rap_node=>minimal_search_string_length.
+          CLEAR business_data.
+          io_response->set_total_number_of_records( lines( business_data ) ).
+          io_response->set_data( business_data ).
+          EXIT.
+        ENDIF.
+
+*        READ TABLE filter_condition_ranges WITH KEY name = 'LANGUAGE_VERSION'
+*               INTO DATA(filter_condition_language).
+*
+*        IF filter_condition_language IS NOT INITIAL.
+*          DATA(abap_language_Version) =   filter_condition_language-range[ 1 ]-low .
+*        ELSE.
+*          abap_language_version =  ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development.
+*        ENDIF.
+*
+*        IF abap_language_version =  ZDMO_cl_rap_node=>abap_language_version-standard .
+        IF xco_on_prem_library->on_premise_branch_is_used(  ).
+          xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+          DATA(abap_language_version) = ZDMO_cl_rap_node=>abap_language_version-standard.
+        ELSE.
+          xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib(  ).
+          abap_language_version = ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development.
+        ENDIF.
+
+        DATA filter_for_name_provided TYPE abap_bool.
+
+        READ TABLE filter_condition_ranges WITH KEY name = 'NAME'
+              INTO DATA(filter_condition_range).
+
+        IF sy-subrc = 0.
+
+          LOOP AT filter_condition_range-range INTO DATA(range).
+            REPLACE ALL OCCURRENCES OF '*' IN range-low WITH '%'.
+
+            DATA(lo_filter) = xco_cp_abap_repository=>object_name->get_filter(
+              xco_cp_abap_sql=>constraint->contains_pattern( range-low )
+               ).
+
+            DATA(lt_package_add) = xco_lib->get_packages( VALUE #( ( lo_filter ) ) ).
+
+            APPEND LINES OF lt_package_add TO lt_package.
+
+          ENDLOOP.
+
+        ELSEIF search_string IS NOT INITIAL.
+*          search_string = substring( val = search_string  off = 1 len = strlen( search_string ) - 2  ) .
+*          search_string = '%' && search_string && '%'.
+           REPLACE ALL OCCURRENCES OF '"' IN search_string WITH '%'.
+          search_string = to_upper( search_string ).
+          lo_filter = xco_cp_abap_repository=>object_name->get_filter(
+                 xco_cp_abap_sql=>constraint->contains_pattern( search_string  )
+                  ).
+          lt_package = xco_lib->get_packages( VALUE #( ( lo_filter ) ) ).
+
+        ELSE.
+
+          lt_package = xco_lib->get_packages(  ).
+
+        ENDIF.
+
+
+        LOOP AT lt_package INTO DATA(ls_package).
+          business_data_line-name = ls_package->name.
+          business_data_line-language_version = abap_language_version.
+          APPEND business_data_line TO business_data.
+        ENDLOOP.
+
+
+        IF top IS NOT INITIAL.
+          DATA(max_index) = top + skip.
+        ELSE.
+          max_index = 0.
+        ENDIF.
+
+        SELECT * FROM @business_data AS package_names
+           WHERE (filter_condition_string)
+           INTO TABLE @business_data
+           UP TO @max_index ROWS
+           .
+
+        IF skip IS NOT INITIAL.
+          DELETE business_data TO skip.
+        ENDIF.
+
+*          DATA(package_type) = ls_package->read( )-property-package_type->value.
+*          IF package_type = ZDMO_cl_rap_node=>package_type-development_package.
+
+
+        io_response->set_total_number_of_records( lines( business_data ) ).
+        io_response->set_data( business_data ).
+
+      CATCH cx_root INTO DATA(exception).
+        DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+        data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.
+
+         raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity
+              exporting
+                                  textid  = VALUE scx_t100key( msgid = exception_t100_key-msgid
+                                                               msgno = exception_t100_key-msgno
+                                                               attr1 = exception_t100_key-attr1
+                                                               attr2 = exception_t100_key-attr2
+                                                               attr3 = exception_t100_key-attr3
+                                                               attr4 = exception_t100_key-attr4 )
+
+                                  previous = exception .
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_get_package.clas.xml b/src/zdmo_cl_rap_gen_get_package.clas.xml
new file mode 100644
index 0000000..13b3851
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_get_package.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_GET_PACKAGE</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>get implementation types</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_in_background.clas.abap b/src/zdmo_cl_rap_gen_in_background.clas.abap
new file mode 100644
index 0000000..b9c65af
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_in_background.clas.abap
@@ -0,0 +1,267 @@
+CLASS zdmo_cl_rap_gen_in_background DEFINITION
+  PUBLIC
+
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    CONSTANTS : selection_name        TYPE c LENGTH 8   VALUE 'I_VIEW',
+                selection_description TYPE c LENGTH 255 VALUE 'RAP business object name'.
+    INTERFACES if_apj_dt_exec_object .
+    INTERFACES if_apj_rt_exec_object .
+    INTERFACES if_oo_adt_classrun.
+  PROTECTED SECTION.
+    METHODS create_transport RETURNING VALUE(lo_transport) TYPE sxco_transport.
+  PRIVATE SECTION.
+
+    CONSTANTS:
+      co_rap_generator_package TYPE sxco_package VALUE 'ZDMO_RAP_GENERATOR'.
+
+
+
+    DATA package_name TYPE sxco_package.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_IN_BACKGROUND IMPLEMENTATION.
+
+
+  METHOD create_transport.
+
+    "transport creation checks whether being on cloud or on prem
+
+    DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib.
+
+    DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+    IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_true.
+      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+
+
+*    DATA(ls_package) = xco_cp_abap_repository=>package->for( co_rap_generator_package )->read( ).
+
+    DATA(ls_package) = xco_lib->get_package( package_name )->read(  ).
+
+    "  DATA(ls_package) = xco_cp_abap_repository=>package->for( co_rap_generator_package )->read( ).
+    DATA(lv_transport_layer) = ls_package-property-transport_layer->value.
+    DATA(lv_transport_target) = ls_package-property-transport_layer->get_transport_target( )->value.
+    DATA(lo_transport_request) = xco_cp_cts=>transports->workbench( lv_transport_target )->create_request( |RAP Generator Application Job Catalog Entry and Job Template| ).
+
+
+
+* IF lo_transport_request->get_status( ) = xco_cp_transport=>filter->status( xco_cp_transport=>status->modifiable ).
+* DATA(lo_transport_modifiable) = abap_true.
+* ENDIF.
+
+
+
+    lo_transport = lo_transport_request->value.
+
+  ENDMETHOD.
+
+
+  METHOD if_apj_dt_exec_object~get_parameters.
+    " Return the supported selection parameters here
+    et_parameter_def = VALUE #(
+      ( selname = zdmo_cl_rap_node=>job_selection_name kind = if_apj_dt_exec_object=>parameter datatype = 'C' length =  40 param_text = zdmo_cl_rap_node=>job_selection_description changeable_ind = abap_true )
+    ).
+
+    " Return the default parameters values here
+    et_parameter_val = VALUE #(
+      ( selname = zdmo_cl_rap_node=>job_selection_name  kind = if_apj_dt_exec_object=>parameter     sign = 'I' option = 'EQ' low = 'ZI_###' )
+    ).
+
+  ENDMETHOD.
+
+
+  METHOD if_apj_rt_exec_object~execute.
+
+    DATA json_string TYPE string.
+    DATA messages TYPE string_table.
+    DATA(on_prem_xco_lib) = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+
+
+*    TRY.
+*        IF on_prem_xco_lib->on_premise_branch_is_used(  ).
+*          DATA(application_log) = cl_bali_log=>create_with_header(
+*                          header = cl_bali_header_setter=>create( object = 'XCO_DEMO'
+*                                                                  subobject = 'DEMO'
+*                                                                  external_id = 'External ID' ) )..
+*        ELSE.
+*          application_log = cl_bali_log=>create_with_header(
+*                          header = cl_bali_header_setter=>create( object = zdmo_cl_rap_node=>application_log_object_name
+*                                                                  subobject = zdmo_cl_rap_node=>application_log_sub_obj1_name
+*                                                                  external_id = 'External ID' ) ).
+*        ENDIF.
+*
+*      CATCH cx_bali_runtime INTO DATA(application_log_exception).
+*
+*        DATA(bali_log_exception) = application_log_exception->get_text(  ).
+*
+*        RAISE EXCEPTION TYPE cx_apj_rt_content
+*          EXPORTING
+*            previous = application_log_exception.
+*
+*    ENDTRY.
+
+    " Getting the actual parameter values
+    LOOP AT it_parameters INTO DATA(ls_parameter).
+      CASE ls_parameter-selname.
+        WHEN zdmo_cl_rap_node=>job_selection_name .
+
+          SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP  WHERE boname = @ls_parameter-low
+          INTO @DATA(rap_generator_bo).
+
+          IF sy-subrc = 0.
+            json_string = rap_generator_bo-jsonstring.
+          ELSE.
+            RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+              EXPORTING
+                textid   = zdmo_cx_rap_generator=>root_cause_exception
+                mv_value = |BO name { ls_parameter-low } not found in ZDMO_r_rapgeneratorbo |.
+          ENDIF.
+
+      ENDCASE.
+    ENDLOOP.
+
+    DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+    DATA(todo) = NEW zdmo_cl_rap_node(  ).
+    TRY.
+        CASE rap_generator_bo-packagelanguageversion.
+
+          WHEN zdmo_cl_rap_node=>package_abap_language_version-standard.
+            DATA(rap_generator_on_prem) = zdmo_cl_rap_generator=>create_for_on_prem_development( json_string ).
+            DATA(framework_messages) = rap_generator_on_prem->generate_bo( ).
+            APPEND |RAP BO { rap_generator_on_prem->get_rap_bo_name(  ) }  generated successfully| TO messages.
+
+          WHEN zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform.
+
+            "If in on premise systems packages with the language version abap_for_sap_cloud_platform are used
+            "we have to use the xco_cp libraries for generation and
+            "we have to use the xco on prem libraries for reading
+
+            IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_true.
+              DATA(rap_generator) = zdmo_cl_rap_generator=>create_for_on_prem_development( json_string ).
+            ELSE.
+              rap_generator = zdmo_cl_rap_generator=>create_for_cloud_development( json_string ).
+            ENDIF.
+
+            framework_messages = rap_generator->generate_bo( ).
+            APPEND |RAP BO { rap_generator->get_rap_bo_name(  ) }  generated successfully| TO messages.
+
+          WHEN OTHERS.
+            RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+              EXPORTING
+                textid   = zdmo_cx_rap_generator=>root_cause_exception
+                mv_value = |abap language version '{ rap_generator_bo-packagelanguageversion }' is not supported |.
+
+        ENDCASE.
+
+
+
+*        APPEND |Messages from framework:| TO messages.
+*        LOOP AT framework_messages INTO DATA(framework_message).
+*          APPEND framework_message-message TO messages.
+*
+*          DATA(application_log_free_text) = cl_bali_free_text_setter=>create(
+*                            severity = if_bali_constants=>c_severity_status
+*                            text = CONV #( framework_message-message ) ).
+*          application_log_free_text->set_detail_level( detail_level = '1' ).
+*          application_log->add_item( item = application_log_free_text ).
+*
+*        ENDLOOP.
+*        cl_bali_log_db=>get_instance( )->save_log(
+*                                                   log = application_log
+*                                                   assign_to_current_appl_job = abap_true
+*                                                   ).
+*
+*
+*
+*        DATA(log_handle) = application_log->get_handle( ).
+
+
+*        DATA update TYPE TABLE FOR UPDATE ZDMO_R_RapGeneratorBO\\RAPGeneratorBO.
+*        DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RapGeneratorBO\\RAPGeneratorBO.
+*
+*        update_line-RapNodeUUID = rap_generator_bo-RapNodeUUID.
+*        update_line-ApplicationJobLogHandle = log_handle.
+*        APPEND update_line TO update.
+*
+*        IF update IS NOT INITIAL.
+*          MODIFY ENTITIES OF ZDMO_R_RapGeneratorBO
+*               ENTITY RAPGeneratorBO
+*                 UPDATE FIELDS (
+*                                ApplicationJobLogHandle
+*                                RapNodeUUID
+*                                ) WITH update
+*              REPORTED DATA(update_reported)
+*              FAILED DATA(update_failed)
+*              .
+*        ENDIF.
+*
+*        IF update IS NOT INITIAL AND update_failed IS INITIAL.
+*          COMMIT ENTITIES RESPONSE OF ZDMO_R_RapGeneratorBO
+*                          REPORTED DATA(commit_reported)
+*                          FAILED DATA(commit_failed).
+*        ENDIF.
+
+*        reported = CORRESPONDING #( DEEP commit_reported ).
+*        failed = CORRESPONDING #( DEEP commit_failed ).
+
+
+      CATCH zdmo_cx_rap_generator INTO DATA(rap_generator_exception).
+
+        DATA(rap_generator_exception_text) = rap_generator_exception->get_text(  ).
+
+*        application_log->add_item( item = cl_bali_exception_setter=>create(
+*                                     severity = if_bali_constants=>c_severity_error
+*                                     exception = rap_generator_exception ) ).
+*
+*        cl_bali_log_db=>get_instance( )->save_log(
+*                                                   log = application_log
+*                                                   assign_to_current_appl_job = abap_true
+*                                                   ).
+
+
+
+        RAISE EXCEPTION TYPE cx_apj_rt_content
+          EXPORTING
+            previous = rap_generator_exception.
+
+    ENDTRY.
+
+
+  ENDMETHOD.
+
+
+  METHOD if_oo_adt_classrun~main.
+
+    "test run of application job
+    "since application job cannot be debugged we test it via F
+
+    DATA  et_parameters TYPE if_apj_rt_exec_object=>tt_templ_val  .
+
+    et_parameters = VALUE #(
+        ( selname = zdmo_cl_rap_node=>job_selection_name
+          kind = if_apj_dt_exec_object=>parameter
+          sign = 'I'
+          option = 'EQ'
+          low = 'ZR_TravelTP_12' )
+      ).
+
+    TRY.
+        if_apj_rt_exec_object~execute( it_parameters = et_parameters ).
+        out->write( |Finished| ).
+        "CATCH cx_apj_rt_content INTO DATA(job_scheduling_exception).
+      CATCH cx_root INTO DATA(job_scheduling_exception).
+        out->write( |Exception has occured: { job_scheduling_exception->get_text(  ) }| ).
+    ENDTRY.
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_in_background.clas.xml b/src/zdmo_cl_rap_gen_in_background.clas.xml
new file mode 100644
index 0000000..cb0ef8a
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_in_background.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_IN_BACKGROUND</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>run RAP Generator as background job</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_reuse_comp.clas.abap b/src/zdmo_cl_rap_gen_reuse_comp.clas.abap
new file mode 100644
index 0000000..e80b496
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_reuse_comp.clas.abap
@@ -0,0 +1,21 @@
+CLASS zdmo_cl_rap_gen_reuse_comp DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+
+*  type standard table of zdmo_cl_rap_node=>ts_field
+
+*  methods data_source_fields IMPORTING data_source type string
+*                                       data_source_type type string
+*                                       RETURNING VALUE(data_source_field_mapping) type standard table of zdmo_cl_rap_node=>ts_field
+*
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_REUSE_COMP IMPLEMENTATION.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_reuse_comp.clas.xml b/src/zdmo_cl_rap_gen_reuse_comp.clas.xml
new file mode 100644
index 0000000..96e67da
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_reuse_comp.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_REUSE_COMP</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Re-use components for RAP Generator</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_gen_show_appl_log.clas.abap b/src/zdmo_cl_rap_gen_show_appl_log.clas.abap
new file mode 100644
index 0000000..1d96f88
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_show_appl_log.clas.abap
@@ -0,0 +1,309 @@
+CLASS zdmo_cl_rap_gen_show_appl_log DEFINITION
+   PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+
+    INTERFACES if_oo_adt_classrun .
+    INTERFACES if_rap_query_provider.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+
+    METHODS is_key_filter
+      IMPORTING it_filter_cond          TYPE if_rap_query_filter=>tt_name_range_pairs
+      EXPORTING unique_filter_cond      TYPE if_rap_query_filter=>tt_name_range_pairs
+      RETURNING VALUE(rv_is_key_filter) TYPE abap_bool.
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GEN_SHOW_APPL_LOG IMPLEMENTATION.
+
+
+  METHOD if_oo_adt_classrun~main.
+
+
+    DATA l_handle TYPE if_bali_log=>ty_handle.
+
+    l_handle = 'vp3Ggk4J7ksZt3pexkwCdW'.
+*    l_handle = 'eOy9ubWZ7jsZlQLeIxSCGm'.
+
+
+    TRY.
+        DATA(l_log) = cl_bali_log_db=>get_instance( )->load_log( handle = l_handle
+                                                                 read_only_header = abap_true ).
+
+        DATA(log_items) = l_log->get_all_items( )    .
+
+        LOOP AT log_items INTO DATA(log_item).
+          DATA(output) = |number { log_item-log_item_number } Category { log_item-item->category }  Severity { log_item-item->severity } log item number { log_item-item->log_item_number } detail level { log_item-item->detail_level } | .
+          output = output &&  |time stamp { log_item-item->timestamp } msg_text: { log_item-item->get_message_text(  ) }| .
+          out->write( output ).
+        ENDLOOP.
+
+
+
+
+      CATCH cx_bali_runtime INTO DATA(l_exception).
+        out->write( l_exception->get_text( ) ).
+    ENDTRY.
+
+
+  ENDMETHOD.
+
+
+  METHOD if_rap_query_provider~select.
+    DATA business_data TYPE TABLE OF Zdmo_I_rap_generator_appl_log .
+    DATA business_data_line TYPE Zdmo_I_rap_generator_appl_log .
+    DATA(top)     = io_request->get_paging( )->get_page_size( ).
+    DATA(skip)    = io_request->get_paging( )->get_offset( ).
+    DATA(requested_fields)  = io_request->get_requested_elements( ).
+    DATA(sort_order)    = io_request->get_sort_elements( ).
+    DATA total_number_of_records TYPE int8.
+
+    DATA log_item_number  TYPE if_bali_log=>ty_log_item_number  .
+
+    TRY.
+        DATA(filter_condition_string) = io_request->get_filter( )->get_as_sql_string( ).
+        DATA(filter_condition_ranges) = io_request->get_filter( )->get_as_ranges( ).
+
+        is_key_filter(
+          EXPORTING
+            it_filter_cond     = filter_condition_ranges
+          IMPORTING
+            unique_filter_cond = DATA(unique_filter_cond)
+          RECEIVING
+            rv_is_key_filter   = DATA(is_single_read)
+        ).
+
+      CATCH cx_root INTO DATA(exception).
+        DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).
+
+        DATA(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.
+
+        RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+          EXPORTING
+            textid   = VALUE scx_t100key( msgid = exception_t100_key-msgid
+                                          msgno = exception_t100_key-msgno
+                                          attr1 = exception_t100_key-attr1
+                                          attr2 = exception_t100_key-attr2
+                                          attr3 = exception_t100_key-attr3
+                                          attr4 = exception_t100_key-attr4 )
+            previous = exception.
+
+*        ELSE.
+*        ENDIF.
+    ENDTRY.
+
+    READ TABLE filter_condition_ranges WITH KEY name = 'LOG_HANDLE'
+    INTO DATA(filter_condition_log_handle).
+
+    READ TABLE filter_condition_ranges WITH KEY name = 'LOG_ITEM_NUMBER'
+    INTO DATA(filter_condition_log_item_num).
+
+    IF filter_condition_log_handle IS NOT INITIAL.
+
+      DATA l_handle TYPE if_bali_log=>ty_handle.
+
+      l_handle = filter_condition_log_handle-range[ 1 ]-low.
+
+      IF l_handle IS NOT INITIAL.
+        TRY.
+            DATA(l_log) = cl_bali_log_db=>get_instance( )->load_log( handle = l_handle
+                                                                     read_only_header = abap_true ).
+
+            IF is_single_read = abap_true.
+
+              total_number_of_records = 1.
+
+              log_item_number =  filter_condition_log_item_num-range[ 1 ]-low .
+
+              DATA(single_log_item) = l_log->get_item( log_item_number ).
+              APPEND INITIAL LINE TO business_data.
+              business_data[ 1 ]-Log_handle = l_handle.
+              business_data[ 1 ]-Log_item_number = single_log_item->log_item_number.
+              business_data[ 1 ]-category = single_log_item->category.
+              business_data[ 1 ]-detail_level = single_log_item->detail_level.
+              business_data[ 1 ]-message_text = single_log_item->get_message_text( ).
+              business_data[ 1 ]-severity = single_log_item->severity.
+              business_data[ 1 ]-timestamp = single_log_item->timestamp.
+
+              CASE single_log_item->severity.
+                WHEN 'S' OR 'I'. "Status, Information
+                  business_data[ 1 ]-Criticality = 3.
+                WHEN 'E' OR 'A'. "Error, Termination
+                  business_data[ 1 ]-Criticality = 1.
+                WHEN 'W' OR 'X'. "Warning, Exit
+                  business_data[ 1 ]-Criticality = 2.
+                WHEN OTHERS.
+                  business_data[ 1 ]-Criticality = 0.
+              ENDCASE.
+
+              io_response->set_total_number_of_records( total_number_of_records ).
+              io_response->set_data( business_data ).
+
+              RETURN.
+            ELSE.
+
+              DATA(log_items) = l_log->get_all_items( )    .
+
+            ENDIF.
+
+            LOOP AT log_items INTO DATA(log_item).
+
+              "fill key fields
+              business_data_line-Log_handle = l_handle.
+              business_data_line-Log_item_number = log_item-log_item_number.
+              "fill properties
+              business_data_line-category = log_item-item->category.
+              business_data_line-severity = log_item-item->severity.
+              business_data_line-detail_level = log_item-item->detail_level.
+              business_data_line-timestamp = log_item-item->timestamp.
+
+              business_data_line-message_text = log_item-item->get_message_text(  ).
+              APPEND business_data_line TO business_Data.
+            ENDLOOP.
+
+
+
+
+          CATCH cx_bali_runtime INTO DATA(l_exception).
+            DATA(l_exception_t100_key) = cl_message_helper=>get_latest_t100_exception( l_exception )->t100key.
+            RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+              EXPORTING
+                textid   = VALUE scx_t100key( msgid = l_exception_t100_key-msgid
+                                              msgno = l_exception_t100_key-msgno
+                                              attr1 = l_exception_t100_key-attr1
+                                              attr2 = l_exception_t100_key-attr2
+                                              attr3 = l_exception_t100_key-attr3
+                                              attr4 = l_exception_t100_key-attr4 )
+                previous = l_exception.
+        ENDTRY.
+      ENDIF.
+
+
+    ENDIF.
+
+    total_number_of_records = lines( business_data ).
+
+    IF sort_order IS NOT INITIAL.
+
+      DATA order_by_string TYPE string.
+
+      CLEAR order_by_string.
+      LOOP AT sort_order INTO DATA(ls_orderby_property).
+        IF ls_orderby_property-descending = abap_true.
+          CONCATENATE order_by_string ls_orderby_property-element_name 'DESCENDING' INTO order_by_string SEPARATED BY space.
+        ELSE.
+          CONCATENATE order_by_string ls_orderby_property-element_name 'ASCENDING' INTO order_by_string SEPARATED BY space.
+        ENDIF.
+      ENDLOOP.
+
+
+    ENDIF.
+
+    IF top IS NOT INITIAL AND top > 0.
+      DATA(max_index) = top + skip.
+    ELSE.
+      max_index = 0.
+    ENDIF.
+
+    SELECT  Log_item_number FROM @business_data AS data_source_fields
+       WHERE (filter_condition_string)
+       ORDER BY (order_by_string)
+       INTO TABLE @DATA(log_item_number_table)
+       UP TO @max_index ROWS.
+
+    DATA s_log_item_number_table TYPE RANGE OF Zdmo_I_rap_generator_appl_log-Log_item_number.
+    DATA s_log_item_number_table_line LIKE LINE OF s_log_item_number_table.
+
+    LOOP AT log_item_number_table INTO DATA(log_item_number_line).
+      s_log_item_number_table_line-sign = 'I'.
+      s_log_item_number_table_line-option = 'EQ'.
+      s_log_item_number_table_line-low = log_item_number_line-Log_item_number.
+      APPEND s_log_item_number_table_line TO s_log_item_number_table.
+    ENDLOOP.
+
+    DELETE business_data WHERE Log_item_number NOT IN s_log_item_number_table.
+
+    IF skip IS NOT INITIAL.
+      DELETE business_data TO skip.
+    ENDIF.
+
+*public static constant  c_severity_error  type if_bali_constants=>ty_severity value 'E'
+*public static constant  c_severity_exit  type if_bali_constants=>ty_severity value 'X'
+*public static constant  c_severity_information  type if_bali_constants=>ty_severity value 'I'
+*public static constant  c_severity_status  type if_bali_constants=>ty_severity value 'S'
+*public static constant  c_severity_termination  type if_bali_constants=>ty_severity value 'A'
+*public static constant  c_severity_warning  type if_bali_constants=>ty_severity value 'W'
+
+    LOOP AT business_data ASSIGNING FIELD-SYMBOL(<business_data>).
+      CASE <business_data>-severity.
+        WHEN 'S' OR 'I'. "Status, Information
+          <business_data>-Criticality = 3.
+        WHEN 'E' OR 'A'. "Error, Termination
+          <business_data>-Criticality = 1.
+        WHEN 'W' OR 'X'. "Warning, Exit
+          <business_data>-Criticality = 2.
+        WHEN OTHERS.
+          <business_data>-Criticality = 0.
+      ENDCASE.
+    ENDLOOP.
+
+    io_response->set_total_number_of_records( total_number_of_records ).
+    io_response->set_data( business_data ).
+
+  ENDMETHOD.
+
+
+  METHOD is_key_filter.
+
+    DATA filter_condition_by_name TYPE if_rap_query_filter=>ty_name_range_pairs .
+    DATA key_name TYPE string.
+    DATA range_option TYPE if_rap_query_filter=>ty_range_option .
+
+    "check if the request is a single read
+
+    key_name = 'LOG_HANDLE'.
+    CLEAR filter_condition_by_name.
+    CLEAR range_option.
+
+    READ TABLE it_filter_cond WITH KEY name = key_name INTO filter_condition_by_name.
+    IF sy-subrc = 0 AND lines( filter_condition_by_name-range ) = 1.
+      READ TABLE filter_condition_by_name-range INTO range_option INDEX 1.
+      IF sy-subrc = 0 AND range_option-sign = 'I' AND range_option-option = 'EQ' AND range_option-low IS NOT INITIAL.
+        "read details for single record in list
+        rv_is_key_filter = abap_true.
+        APPEND filter_condition_by_name TO unique_filter_cond.
+      ELSE.
+        rv_is_key_filter = abap_false.
+        CLEAR unique_filter_cond.
+      ENDIF.
+    ENDIF.
+
+    CHECK rv_is_key_filter = abap_true.
+
+    key_name = 'LOG_ITEM_NUMBER' .
+    CLEAR filter_condition_by_name.
+    CLEAR range_option.
+
+    READ TABLE it_filter_cond WITH KEY name = key_name INTO filter_condition_by_name.
+    IF sy-subrc = 0 AND lines( filter_condition_by_name-range ) = 1.
+      READ TABLE filter_condition_by_name-range INTO range_option INDEX 1.
+      IF sy-subrc = 0 AND range_option-sign = 'I' AND range_option-option = 'EQ' AND range_option-low IS NOT INITIAL.
+        "read details for single record in list
+        rv_is_key_filter = abap_true.
+        APPEND filter_condition_by_name TO unique_filter_cond.
+      ELSE.
+        rv_is_key_filter = abap_false.
+        CLEAR unique_filter_cond.
+      ENDIF.
+    ELSE.
+      rv_is_key_filter = abap_false.
+      CLEAR unique_filter_cond.
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_gen_show_appl_log.clas.xml b/src/zdmo_cl_rap_gen_show_appl_log.clas.xml
new file mode 100644
index 0000000..04f6b23
--- /dev/null
+++ b/src/zdmo_cl_rap_gen_show_appl_log.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GEN_SHOW_APPL_LOG</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Show application log entries</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_generator.clas.abap b/src/zdmo_cl_rap_generator.clas.abap
new file mode 100644
index 0000000..28ba7a3
--- /dev/null
+++ b/src/zdmo_cl_rap_generator.clas.abap
@@ -0,0 +1,6180 @@
+CLASS zdmo_cl_rap_generator DEFINITION
+INHERITING FROM zdmo_cl_rap_generator_base
+ PUBLIC
+  CREATE PUBLIC.
+  PUBLIC SECTION.
+
+    TYPES:
+            ty_string_table_type TYPE STANDARD TABLE OF string WITH DEFAULT KEY .
+
+*    TYPES: BEGIN OF t_framework_message_fields,
+*             severity    TYPE symsgty,
+*             object_TYPE TYPE if_xco_gen_o_finding=>tv_object_type,
+*             object_name TYPE if_xco_gen_o_finding=>tv_object_name,
+*             message     TYPE string,
+*           END OF t_framework_message_fields.
+*
+*    TYPES: tt_framework_message_fields TYPE STANDARD TABLE OF t_framework_message_fields WITH EMPTY KEY.
+
+    TYPES: BEGIN OF t_generated_repository_object,
+             object_TYPE                  TYPE if_xco_gen_o_finding=>tv_object_type,
+             object_name                  TYPE if_xco_gen_o_finding=>tv_object_name,
+             hierarchy_distance_from_root TYPE int4,
+             transport_request            TYPE sxco_transport,
+           END OF t_generated_repository_object.
+
+    TYPES: t_generated_repository_objects TYPE STANDARD TABLE OF t_generated_repository_object WITH EMPTY KEY.
+
+    TYPES: BEGIN OF t_method_exists_in_interface,
+             interface_name TYPE c LENGTH 30,
+             method_name    TYPE c LENGTH 61,
+             method_exists  TYPE abap_bool,
+           END OF t_method_exists_in_interface.
+
+    TYPES : t_method_exists_in_interfaces TYPE STANDARD TABLE OF t_method_exists_in_interface.
+
+    TYPES: BEGIN OF t_method_exists_in_class,
+             class_name    TYPE c LENGTH 30,
+             method_name   TYPE c LENGTH 61,
+             method_exists TYPE abap_bool,
+           END OF t_method_exists_in_class.
+
+    TYPES : t_method_exists_in_classes TYPE STANDARD TABLE OF t_method_exists_in_class.
+
+
+    TYPES:
+      BEGIN OF ts_condition_components,
+        projection_field  TYPE sxco_cds_field_name,
+        association_name  TYPE sxco_cds_association_name,
+        association_field TYPE sxco_cds_field_name,
+      END OF ts_condition_components,
+
+
+      tt_condition_components TYPE STANDARD TABLE OF ts_condition_components WITH EMPTY KEY.
+
+    TYPES: BEGIN OF t_table_fields,
+             field         TYPE sxco_ad_field_name,
+             data_element  TYPE sxco_ad_object_name,
+             is_key        TYPE abap_bool,
+             not_null      TYPE abap_bool,
+             currencyCode  TYPE sxco_cds_field_name,
+             unitOfMeasure TYPE sxco_cds_field_name,
+           END OF t_table_fields.
+
+    TYPES: tt_table_fields TYPE STANDARD TABLE OF t_table_fields WITH KEY field.
+
+    DATA root_node    TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS get_rap_bo_name RETURNING VALUE(rap_bo_name) TYPE sxco_cds_object_name.
+
+    METHODS get_generated_repo_objects RETURNING VALUE(r_generated_repository_objects) TYPE t_generated_repository_objects.
+
+    METHODS exception_occured RETURNING VALUE(rv_exception_occured) TYPE abap_bool.
+
+    METHODS generate_bo RETURNING VALUE(framework_messages) TYPE zdmo_cl_rap_node=>tt_framework_message_fields
+                        RAISING   cx_xco_gen_put_exception
+                                  ZDMO_cx_rap_generator.
+
+    METHODS store_bo RAISING zdmo_cx_rap_generator.
+
+    METHODS constructor
+      IMPORTING
+                json_string  TYPE clike OPTIONAL
+                io_root_node TYPE REF TO ZDMO_cl_rap_node OPTIONAL
+                xco_lib      TYPE REF TO ZDMO_cl_rap_xco_lib OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    CLASS-METHODS create_for_cloud_development
+      IMPORTING
+        json_string   TYPE clike OPTIONAL
+      RETURNING
+        VALUE(result) TYPE REF TO zdmo_cl_rap_generator.
+
+    CLASS-METHODS create_for_on_prem_development
+      IMPORTING
+        json_string   TYPE clike OPTIONAL
+      RETURNING
+        VALUE(result) TYPE REF TO zdmo_cl_rap_generator.
+
+    CLASS-METHODS create_with_rap_node_object
+      IMPORTING
+        rap_node      TYPE REF TO ZDMO_cl_rap_node OPTIONAL
+      RETURNING
+        VALUE(result) TYPE REF TO zdmo_cl_rap_generator.
+
+  PROTECTED SECTION.
+
+    METHODS cds_i_view_set_provider_cntrct REDEFINITION.
+    METHODS cds_p_view_set_provider_cntrct REDEFINITION.
+    METHODS put_operation_execute REDEFINITION.
+
+  PRIVATE SECTION.
+
+    CONSTANTS method_get_glbl_authorizations TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'GET_GLOBAL_AUTHORIZATIONS'.
+    CONSTANTS method_get_instance_features TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'GET_INSTANCE_FEATURES'.
+    CONSTANTS method_save_modified TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'SAVE_MODIFIED'.
+    CONSTANTS cleanup_finalize TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'CLEANUP_FINALIZE' .
+
+    CONSTANTS method_create TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'CREATE'.
+    CONSTANTS method_update TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'UPDATE'.
+    CONSTANTS method_delete TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'DELETE'.
+    CONSTANTS method_read TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'READ'.
+    CONSTANTS method_lock TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'LOCK'.
+    CONSTANTS method_rba TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'rba'.
+    CONSTANTS method_cba TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'cba'.
+
+    CONSTANTS method_finalize TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'finalize'.
+    CONSTANTS method_check_before_save TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'check_before_save'.
+    CONSTANTS method_save TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'save'.
+    CONSTANTS method_cleanup TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'cleanup'.
+    CONSTANTS method_cleanup_finalize TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  VALUE 'cleanup_finalize'.
+
+
+
+    TYPES : aliases TYPE STANDARD TABLE OF sxco_ddef_alias_name.
+
+    TYPES : BEGIN OF t_log_entry,
+              DetailLevel TYPE ballevel,
+              Severity    TYPE symsgty,
+              Text        TYPE  bapi_msg,
+              TimeStamp   TYPE timestamp,
+            END OF t_log_entry.
+    TYPES : t_log_entries TYPE STANDARD TABLE OF t_log_entry.
+
+    DATA xco_api  TYPE REF TO ZDMO_cl_rap_xco_lib  .
+
+    DATA mo_package      TYPE sxco_package.
+
+    DATA put_exception_occured  TYPE abap_bool.
+
+    DATA generated_repository_objects TYPE t_generated_repository_objects.
+    DATA generated_repository_object TYPE t_generated_repository_object.
+
+    DATA method_exists_in_interface TYPE t_method_exists_in_interface.
+    DATA method_exists_in_classe TYPE t_method_exists_in_class.
+    DATA method_exists_in_interfaces TYPE t_method_exists_in_interfaces.
+    DATA method_exists_in_classes TYPE t_method_exists_in_classes.
+
+********************************************************************************
+*    "cloud
+*    DATA mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system.
+*    DATA mo_put_operation  TYPE REF TO if_xco_cp_gen_d_o_put .
+*    DATA mo_draft_tabl_put_opertion TYPE REF TO if_xco_cp_gen_d_o_put .
+*    DATA mo_srvb_put_operation    TYPE REF TO if_xco_cp_gen_d_o_put .
+********************************************************************************
+*    "onpremise
+*    DATA mo_environment           TYPE REF TO if_xco_gen_environment .
+*    DATA mo_put_operation         TYPE REF TO if_xco_gen_o_mass_put.
+*    DATA mo_draft_tabl_put_opertion TYPE REF TO if_xco_gen_o_mass_put.
+*    DATA mo_srvb_put_operation    TYPE REF TO if_xco_gen_o_mass_put.
+********************************************************************************
+
+    DATA mo_transport TYPE    sxco_transport .
+
+    DATA exc_method_does_not_exist TYPE REF TO cx_sy_dyn_call_illegal_method.
+    DATA call_method_succeeded_list TYPE TABLE OF string.
+    DATA call_method_not_succeeded_list TYPE TABLE OF string.
+*    METHODS constructor
+*      IMPORTING
+*                json_string  TYPE clike OPTIONAL
+*                io_root_node TYPE REF TO ZDMO_cl_rap_node OPTIONAL
+*                xco_lib      TYPE REF TO ZDMO_cl_rap_xco_lib OPTIONAL
+*      RAISING   ZDMO_cx_rap_generator.
+
+
+
+
+    METHODS add_log_entries_for_rap_bo IMPORTING i_rap_bo_name    TYPE sxco_cds_object_name
+                                                 i_log_entries    TYPE t_log_entries
+                                       RETURNING VALUE(r_success) TYPE abap_boolean.
+
+    METHODS assign_package.
+
+    METHODS get_transport_layer
+      IMPORTING
+        io_package                TYPE REF TO if_xco_package
+      RETURNING
+        VALUE(ro_transport_layer) TYPE REF TO if_xco_transport_layer.
+
+    METHODS create_control_structure
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_extension_include
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO zdmo_cl_rap_node.
+
+    METHODS create_extension_include_view
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_draft_query_view
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO zdmo_cl_rap_node.
+
+    METHODS create_r_cds_view
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_p_cds_view
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_i_cds_view
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_i_cds_view_basic
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_mde_view
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_table
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node
+        is_draft_table        TYPE abap_bool.
+
+    METHODS create_bdef
+      IMPORTING
+                VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS create_bil
+      IMPORTING
+                VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS create_bdef_p
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_bdef_i
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_condition
+      IMPORTING
+        VALUE(it_condition_components) TYPE tt_condition_components
+      RETURNING
+        VALUE(ro_expression)           TYPE REF TO if_xco_ddl_expr_condition.
+
+    METHODS create_service_definition
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_sap_object_type
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO zdmo_cl_rap_node.
+
+    METHODS create_sap_object_node_type
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO zdmo_cl_rap_node.
+
+    "service binding needs a separate put operation
+    METHODS create_service_binding
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_custom_entity
+      IMPORTING
+        VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node.
+
+    METHODS create_custom_query
+      IMPORTING
+                VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS add_anno_ABAP_Catalog_Ext
+      IMPORTING
+        io_view                TYPE REF TO if_xco_gen_cds_s_fo_ann_target
+        i_allowNewDataSources  TYPE abap_bool
+        i_elementSuffix        TYPE string
+        i_dataSources          TYPE sxco_cds_association_name
+        i_maximumFields        TYPE i
+        i_allowNewCompositions TYPE abap_bool.
+
+    METHODS add_anno_ui_hidden
+      IMPORTING
+        io_field         TYPE REF TO if_xco_gen_cds_s_fo_ann_target
+        ls_header_fields TYPE ZDMO_cl_rap_node=>ts_field.
+
+    METHODS add_anno_ui_lineitem
+      IMPORTING
+        io_field         TYPE REF TO if_xco_gen_cds_s_fo_ann_target
+        ls_header_fields TYPE ZDMO_cl_rap_node=>ts_field
+        position         TYPE i
+        label            TYPE string OPTIONAL.
+
+    METHODS add_anno_ui_identification
+      IMPORTING
+        io_field                 TYPE REF TO if_xco_gen_cds_s_fo_ann_target
+        io_rap_bo_node           TYPE REF TO ZDMO_cl_rap_node
+        ls_header_fields         TYPE ZDMO_cl_rap_node=>ts_field
+        position                 TYPE i
+        label                    TYPE string OPTIONAL
+        add_action_for_transport TYPE abap_bool OPTIONAL.
+
+    METHODS add_annotation_ui_selectionfld
+      IMPORTING
+        io_field         TYPE REF TO if_xco_gen_cds_s_fo_ann_target
+        io_rap_bo_node   TYPE REF TO ZDMO_cl_rap_node
+        ls_header_fields TYPE ZDMO_cl_rap_node=>ts_field
+        position         TYPE i.
+
+    METHODS add_annotation_ui_header
+      IMPORTING
+        io_specification TYPE REF TO if_xco_gen_cds_s_fo_ann_target
+        io_rap_bo_node   TYPE REF TO ZDMO_cl_rap_node .
+
+    METHODS add_annotation_ui_facets
+      IMPORTING
+        io_field       TYPE REF TO if_xco_gen_cds_s_fo_ann_target
+        io_rap_bo_node TYPE REF TO ZDMO_cl_rap_node  .
+
+    METHODS zz_add_business_configuration
+      CHANGING
+        c_framework_messages TYPE zdmo_cl_rap_node=>tt_framework_message_fields
+      RAISING
+        cx_mbc_api_exception.
+
+    METHODS add_findings_to_output
+      IMPORTING i_task_name      TYPE bapi_msg
+                i_findings       TYPE REF TO if_xco_gen_o_findings
+      RETURNING VALUE(r_success) TYPE abap_bool.
+
+    METHODS check_and_add_ext_incl_struc
+      IMPORTING
+        i_node TYPE REF TO zdmo_cl_rap_node.
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GENERATOR IMPLEMENTATION.
+
+
+  METHOD add_annotation_ui_facets.
+
+    DATA position TYPE i.
+
+    IF io_rap_bo_node->is_virtual_root(  ) = abap_true.
+
+      io_field->add_annotation( 'UI.facet' )->value->build(
+        )->begin_array(
+          )->begin_record(
+            )->add_member( 'id' )->add_string( 'idIdentification'
+            )->add_member( 'parentId' )->add_string( 'idCollection'
+            )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+            )->add_member( 'label' )->add_string( 'General Information'
+            )->add_member( 'position' )->add_number( 10
+            )->add_member( 'hidden' )->add_boolean( abap_true
+          )->end_record(
+          "@todo check what happens if an entity has several child entities
+          )->begin_record(
+            )->add_member( 'purpose' )->add_enum( 'STANDARD'
+            )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE'
+            )->add_member( 'label' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && ''
+            )->add_member( 'position' )->add_number( 20
+            )->add_member( 'targetElement' )->add_string( '_' && io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias
+          )->end_record(
+        )->end_array( ) ##no_text.
+
+    ELSE.
+
+      IF io_rap_bo_node->is_root(  ) = abap_true.
+
+        IF io_rap_bo_node->has_childs(  ).
+
+*          io_field->add_annotation( 'UI.facet' )->value->build(
+*            )->begin_array(
+*              )->begin_record(
+*                )->add_member( 'id' )->add_string( 'idCollection'
+*                )->add_member( 'type' )->add_enum( 'COLLECTION'
+*                )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && ''
+*                )->add_member( 'position' )->add_number( 10
+*              )->end_record(
+*              )->begin_record(
+*                )->add_member( 'id' )->add_string( 'idIdentification'
+*                )->add_member( 'parentId' )->add_string( 'idCollection'
+*                )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+*                )->add_member( 'label' )->add_string( 'General Information'
+*                )->add_member( 'position' )->add_number( 10
+*              )->end_record(
+*              "@todo check what happens if an entity has several child entities
+*              )->begin_record(
+*                )->add_member( 'id' )->add_string( 'idLineitem'
+*                )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE'
+*                )->add_member( 'label' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && ''
+*                )->add_member( 'position' )->add_number( 20
+*                )->add_member( 'targetElement' )->add_string( '_' && io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias
+*              )->end_record(
+*            )->end_array( ).
+
+          DATA(ui_facet_array) = io_field->add_annotation( 'UI.facet' )->value->build(
+            )->begin_array( ).
+          ui_facet_array->begin_record(
+                )->add_member( 'id' )->add_string( 'idCollection'
+                )->add_member( 'type' )->add_enum( 'COLLECTION'
+                )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && ''
+                )->add_member( 'position' )->add_number( 10
+              )->end_record(
+              )->begin_record(
+                )->add_member( 'id' )->add_string( 'idIdentification'
+                )->add_member( 'parentId' )->add_string( 'idCollection'
+                )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+                )->add_member( 'label' )->add_string( 'General Information'
+                )->add_member( 'position' )->add_number( 20
+              )->end_record( ).
+
+          position = 20.
+
+          LOOP AT io_rap_bo_node->childnodes INTO DATA(childnode).
+
+            position += 10.
+            "@todo check what happens if an entity has several child entities
+            ui_facet_array->begin_record(
+              )->add_member( 'id' )->add_string( |id{ childnode->rap_node_objects-alias }|
+              )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE'
+              )->add_member( 'label' )->add_string( childnode->rap_node_objects-alias && ''
+              )->add_member( 'position' )->add_number( position
+              )->add_member( 'targetElement' )->add_string( '_' && childnode->rap_node_objects-alias
+            )->end_record( ).
+          ENDLOOP.
+          ui_facet_array->end_array( ).
+
+
+        ELSE.
+
+          io_field->add_annotation( 'UI.facet' )->value->build(
+            )->begin_array(
+              )->begin_record(
+                )->add_member( 'id' )->add_string( 'idCollection'
+                )->add_member( 'type' )->add_enum( 'COLLECTION'
+                )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && ''
+                )->add_member( 'position' )->add_number( 10
+              )->end_record(
+              )->begin_record(
+                )->add_member( 'id' )->add_string( 'idIdentification'
+                )->add_member( 'parentId' )->add_string( 'idCollection'
+                )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+                )->add_member( 'label' )->add_string( 'General Information'
+                )->add_member( 'position' )->add_number( 10
+              )->end_record(
+            )->end_array( ) ##no_text.
+
+        ENDIF.
+
+      ELSE.
+
+        IF io_rap_bo_node->has_childs(  ).
+
+*          io_field->add_annotation( 'UI.facet' )->value->build(
+*            )->begin_array(
+*              )->begin_record(
+*                )->add_member( 'id' )->add_string( CONV #( 'id' && io_rap_bo_node->rap_node_objects-alias )
+*                )->add_member( 'purpose' )->add_enum( 'STANDARD'
+*                )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+*                )->add_member( 'label' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-alias )
+*                )->add_member( 'position' )->add_number( 10
+*              )->end_record(
+*              )->begin_record(
+*                  )->add_member( 'id' )->add_string( 'idLineitem'
+*                  )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE'
+*                  )->add_member( 'label' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && ''
+*                  )->add_member( 'position' )->add_number( 20
+*                  )->add_member( 'targetElement' )->add_string( '_' && io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias
+*                )->end_record(
+*            )->end_array( ).
+
+
+          DATA(ui_facet_array_child) =  io_field->add_annotation( 'UI.facet' )->value->build(
+              )->begin_array( ).
+
+          ui_facet_array_child->begin_record(
+            )->add_member( 'id' )->add_string( CONV #( 'id' && io_rap_bo_node->rap_node_objects-alias )
+            )->add_member( 'purpose' )->add_enum( 'STANDARD'
+            )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+            )->add_member( 'label' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-alias )
+            )->add_member( 'position' )->add_number( 10
+          )->end_record( ).
+
+          position = 10.
+
+          LOOP AT io_rap_bo_node->childnodes INTO DATA(childnode_child).
+            position += 10.
+            ui_facet_array_child->begin_record(
+                )->add_member( 'id' )->add_string( |id{ childnode_child->rap_node_objects-alias }|
+                )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE'
+                )->add_member( 'label' )->add_string( childnode_child->rap_node_objects-alias && ''
+                )->add_member( 'position' )->add_number( position
+                )->add_member( 'targetElement' )->add_string( '_' && childnode_child->rap_node_objects-alias
+              )->end_record( ).
+          ENDLOOP.
+
+          ui_facet_array_child->end_array( ).
+
+        ELSE.
+
+          io_field->add_annotation( 'UI.facet' )->value->build(
+            )->begin_array(
+              )->begin_record(
+                )->add_member( 'id' )->add_string( CONV #( 'id' && io_rap_bo_node->rap_node_objects-alias )
+                )->add_member( 'purpose' )->add_enum( 'STANDARD'
+                )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+                )->add_member( 'label' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-alias )
+                )->add_member( 'position' )->add_number( 10
+              )->end_record(
+            )->end_array( ).
+
+        ENDIF.
+      ENDIF.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD add_annotation_ui_header.
+    "show the name of the "real" entity, not the virtual one
+    IF io_rap_bo_node->is_virtual_root(  ).
+      io_specification->add_annotation( 'UI' )->value->build(
+            )->begin_record(
+                )->add_member( 'headerInfo'
+                 )->begin_record(
+                  )->add_member( 'typeName' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && ''
+
+              )->end_record(
+            ).
+    ELSE.
+      io_specification->add_annotation( 'UI' )->value->build(
+      )->begin_record(
+          )->add_member( 'headerInfo'
+           )->begin_record(
+            )->add_member( 'typeName' )->add_string( io_rap_bo_node->rap_node_objects-alias && ''
+            )->add_member( 'typeNamePlural' )->add_string( io_rap_bo_node->rap_node_objects-alias && 's'
+            )->add_member( 'title'
+              )->begin_record(
+                )->add_member( 'type' )->add_enum( 'STANDARD'
+                )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && ''
+                "@todo: Check what happens if several key fields are present
+                "for a first test we just take the first one.
+                "also check what happens if no semantic key has been specified
+                )->add_member( 'value' )->add_string(  io_rap_bo_node->object_id_cds_field_name && ''
+          )->end_record(
+          )->end_record(
+
+                  "presentationVariant: [ { sortOrder: [{ by: 'TravelID', direction:  #DESC }], visualizations: [{type: #AS_LINEITEM}] }] }
+      )->add_member( 'presentationVariant'
+        )->begin_array(
+          )->begin_record(
+          )->add_member( 'sortOrder'
+            )->begin_array(
+             )->begin_record(
+               )->add_member( 'by' )->add_string( io_rap_bo_node->object_id_cds_field_name && ''
+               )->add_member( 'direction' )->add_enum( 'DESC'
+             )->end_record(
+            )->end_array(
+          )->add_member( 'visualizations'
+          )->begin_array(
+             )->begin_record(
+               )->add_member( 'type' )->add_enum( 'AS_LINEITEM'
+             )->end_record(
+            )->end_array(
+          )->end_record(
+          )->end_array(
+          )->end_record(
+         ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD add_annotation_ui_selectionfld.
+
+    "add selection fields for semantic key fields or for the fields that are marked as object id
+
+    DATA add_annotation_UI_selectionFld TYPE abap_bool VALUE abap_false .
+
+    IF io_rap_bo_node->is_root(  ) = abap_true AND
+       ( io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-unmanaged_semantic OR
+          io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-managed_semantic ) AND
+          ls_header_fields-key_indicator = abap_true.
+
+      add_annotation_UI_selectionFld = abap_true.
+
+    ENDIF.
+
+    IF io_rap_bo_node->is_root(  ) = abap_true AND
+       io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-managed_uuid  AND
+       ls_header_fields-name = io_rap_bo_node->object_id.
+
+      add_annotation_UI_selectionFld = abap_true.
+
+    ENDIF.
+
+    IF io_rap_bo_node->is_root(  ) = abap_true AND
+       ls_header_fields-has_valuehelp = abap_true.
+
+      add_annotation_UI_selectionFld = abap_true.
+
+    ENDIF.
+
+    IF add_annotation_UI_selectionFld = abap_true.
+      io_field->add_annotation( 'UI.selectionField' )->value->build(
+      )->begin_array(
+      )->begin_record(
+          )->add_member( 'position' )->add_number( position
+        )->end_record(
+      )->end_array( ).
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD add_anno_abap_catalog_ext.
+    DATA(lo_valuebuilder) = io_view->add_annotation( 'AbapCatalog.extensibility' )->value->build( ).
+
+    DATA(lo_record) = lo_valuebuilder->begin_record(
+        )->add_member( 'extensible' )->add_boolean( abap_true
+        )->add_member( 'elementSuffix' )->add_string( i_elementsuffix
+        )->add_member( 'allowNewDatasources' )->add_boolean( i_allownewdatasources
+        )->add_member( 'allowNewCompositions' )->add_boolean( i_allownewcompositions
+        ).
+
+    lo_record->add_member( 'dataSources' )->begin_array(  )->add_string( CONV #( i_datasources ) )->end_array( ).
+    DATA(quota) = lo_record->add_member( 'quota' )->begin_record( ).
+    quota->add_member( 'maximumFields' )->add_number( i_maximumfields ).
+    "recommended formula to calculate maximumBytes
+    quota->add_member( 'maximumBytes' )->add_number( i_maximumfields * 100 ).
+    quota->end_record(  ).
+
+    lo_valuebuilder->end_record( ).
+  ENDMETHOD.
+
+
+  METHOD add_anno_ui_hidden.
+
+    IF ls_header_fields-is_hidden = abap_true.
+      io_field->add_annotation( 'UI.hidden' )->value->build(  )->add_boolean( iv_value =  abap_true ).
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD add_anno_ui_identification.
+
+    IF ls_header_fields-is_currencycode = abap_true OR ls_header_fields-is_unitofmeasure = abap_true.
+      EXIT.
+    ENDIF.
+
+    DATA(lo_valuebuilder) = io_field->add_annotation( 'UI.identification' )->value->build( ).
+    DATA(lo_record) = lo_valuebuilder->begin_array(
+    )->begin_record(
+        )->add_member( 'position' )->add_number( position ).
+
+    "@UI.identification: [{position: 2, importance: #HIGH },{ type: #FOR_ACTION, dataAction: 'selectTransport', label: 'Select Transport' }]
+
+    IF io_rap_bo_node->is_root(  ) = abap_true AND
+       io_rap_bo_node->is_customizing_table = abap_true AND
+       ls_header_fields-cds_view_field = 'Request'.
+      lo_record->add_member( 'type' )->add_enum( 'FOR_ACTION' ).
+      lo_record->add_member( 'dataAction' )->add_string( 'selectTransport' ).
+      lo_record->add_member( 'label' )->add_string( CONV #( 'Select Transport' ) ) ##no_text.
+    ELSE.
+      IF ls_header_fields-is_data_element = abap_false.
+        lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ).
+      ENDIF.
+    ENDIF.
+    lo_valuebuilder->end_record( )->end_array( ).
+
+
+
+  ENDMETHOD.
+
+
+  METHOD add_anno_ui_lineitem.
+
+    IF ls_header_fields-is_currencycode = abap_true OR ls_header_fields-is_unitofmeasure = abap_true.
+      EXIT.
+    ENDIF.
+
+    DATA(lo_valuebuilder) = io_field->add_annotation( 'UI.lineItem' )->value->build( ).
+
+    DATA(lo_record) = lo_valuebuilder->begin_array(
+    )->begin_record(
+        )->add_member( 'position' )->add_number( position
+        )->add_member( 'importance' )->add_enum( 'HIGH').
+    "if field is based on a data element label will be set from its field description
+    "if its a built in type we will set a label whith a meaningful default vaule that
+    "can be changed by the developer afterwards
+    IF ls_header_fields-is_data_element = abap_false.
+      lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ).
+    ENDIF.
+    lo_valuebuilder->end_record( )->end_array( ).
+  ENDMETHOD.
+
+
+  METHOD add_findings_to_output.
+
+    DATA text TYPE c LENGTH 200 .
+    DATA log_entry TYPE t_log_entry.
+    DATA log_entries TYPE t_log_entries.
+
+    log_entry-text = i_task_name.
+    log_entry-detaillevel = 1.
+    log_entry-severity = 'S'.
+
+    IF i_findings->contain_warnings(  ).
+      log_entry-severity = 'W'.
+    ENDIF.
+
+    IF i_findings->contain_errors(  ).
+      log_entry-severity = 'E'.
+    ENDIF.
+
+    APPEND log_entry TO log_entries.
+
+    DATA(finding_texts) = i_findings->get( ).
+
+    IF finding_texts IS NOT INITIAL.
+      LOOP AT finding_texts INTO DATA(finding_text).
+        log_entry-text = |{ finding_text->object_type } { finding_text->object_name } { finding_text->message->get_text(  ) }|.
+        log_entry-severity = finding_text->message->value-msgty.
+        log_entry-detaillevel = 2.
+        APPEND log_entry TO log_entries.
+      ENDLOOP.
+    ENDIF.
+
+    r_success = add_log_entries_for_rap_bo(
+           i_rap_bo_name = root_node->rap_root_node_objects-behavior_definition_r
+           i_log_entries = log_entries
+         ).
+
+  ENDMETHOD.
+
+
+  METHOD add_log_entries_for_rap_bo.
+
+*    DATA create_rapbolog_cba TYPE TABLE FOR CREATE ZDMO_R_RapGeneratorBO\_RAPGeneratorBOLog.
+*    DATA log_entries TYPE TABLE FOR CREATE zdmo_r_rapgeneratorbo\\rapgeneratorbolog   .
+*    DATA log_entry TYPE STRUCTURE FOR CREATE zdmo_r_rapgeneratorbo\\rapgeneratorbolog   .
+*    DATA n TYPE i.
+*    DATA time_stamp TYPE timestampl.
+*
+*    GET TIME STAMP FIELD time_stamp.
+*
+*    SELECT SINGLE * FROM zdmo_r_rapgeneratorbo  WHERE boname = @i_rap_bo_name
+*          INTO @DATA(rap_generator_bo).
+*
+*    LOOP AT i_log_entries INTO DATA(my_log_entry) where Severity GE 1.
+*      n += 1.
+*      log_entry = VALUE #(     %is_draft = if_abap_behv=>mk-off
+*                               %cid      = |test{ n }|
+*                               Severity = my_log_entry-Severity
+*                               DetailLevel = my_log_entry-DetailLevel
+*                               Text = my_log_entry-Text
+*                               TimeStamp = time_stamp
+*                               ).
+*      APPEND log_entry TO log_entries.
+*    ENDLOOP.
+*
+*    create_rapbolog_cba = VALUE #( ( %is_draft = if_abap_behv=>mk-off
+*                                     %key-rapnodeuuid = rap_generator_bo-RapNodeUUID
+*                                     %target   = log_entries ) ) .
+*
+*    MODIFY ENTITIES OF zdmo_r_rapgeneratorbo
+*             ENTITY RAPGeneratorBO
+*                   CREATE BY \_RAPGeneratorBOLog
+*                   FIELDS (
+*                           LogItemNumber
+*                           DetailLevel
+*                           Severity
+*                           Text
+*                           TimeStamp
+*                   )
+*                   WITH create_rapbolog_cba
+*             MAPPED   DATA(mapped)
+*             FAILED   DATA(failed)
+*             REPORTED DATA(reported).
+*
+*
+*    IF mapped-rapgeneratorbolog IS NOT INITIAL.
+*      COMMIT ENTITIES.
+*      COMMIT WORK.
+*      r_success = abap_true.
+*    ENDIF.
+*    IF failed-rapgeneratorbolog IS NOT INITIAL.
+*      r_success = abap_false.
+*    ENDIF.
+
+    DATA create_rapbolog_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Log.
+*    DATA log_entries TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\Log   .
+*    DATA log_entry TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\\Log   .
+    DATA create_raplog_cba_line TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Log.
+    DATA log_entries LIKE create_raplog_cba_line-%target.
+    DATA log_entry LIKE LINE OF log_entries.
+
+    DATA n TYPE i.
+    DATA time_stamp TYPE timestampl.
+
+    GET TIME STAMP FIELD time_stamp.
+
+    SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP   WHERE boname = @i_rap_bo_name
+          INTO @DATA(rap_generator_bo).
+
+
+    LOOP AT i_log_entries INTO DATA(my_log_entry) .
+      n += 1.
+      log_entry = VALUE #(     %is_draft = if_abap_behv=>mk-off
+                               %cid      = |test{ n }|
+                               Severity = my_log_entry-Severity
+                               DetailLevel = my_log_entry-DetailLevel
+                               Text = my_log_entry-Text
+                               TimeStamp = time_stamp
+                               ).
+      APPEND log_entry TO log_entries.
+    ENDLOOP.
+
+    create_rapbolog_cba = VALUE #( ( %is_draft = if_abap_behv=>mk-off
+                                     %key-rapbouuid = rap_generator_bo-RapboUUID
+                                     %target   = log_entries ) ) .
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+             ENTITY Project
+                   CREATE BY \_Log
+                   FIELDS (
+                           LogItemNumber
+                           DetailLevel
+                           Severity
+                           Text
+                           TimeStamp
+                   )
+                   WITH create_rapbolog_cba
+             MAPPED   DATA(mapped)
+             FAILED   DATA(failed)
+             REPORTED DATA(reported).
+
+
+    IF mapped-log  IS NOT INITIAL.
+      COMMIT ENTITIES.
+      COMMIT WORK.
+      r_success = abap_true.
+    ENDIF.
+    IF failed-log IS NOT INITIAL.
+      r_success = abap_false.
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD assign_package.
+    DATA(lo_package_put_operation) = mo_environment->for-devc->create_put_operation( ).
+    DATA(lo_specification) = lo_package_put_operation->add_object( mo_package ).
+  ENDMETHOD.
+
+
+  METHOD cds_i_view_set_provider_cntrct.
+    super->cds_i_view_set_provider_cntrct( i_interface_view_spcification ).
+  ENDMETHOD.
+
+
+  METHOD cds_p_view_set_provider_cntrct.
+    super->cds_p_view_set_provider_cntrct( i_projection_view_spcification  ).
+  ENDMETHOD.
+
+
+  METHOD check_and_add_ext_incl_struc.
+
+    DATA has_extension_include TYPE abap_bool.
+    DATA(database_table) = xco_api->get_database_table( iv_name = to_upper( i_node->data_source_name ) ).
+    DATA include_structure_name TYPE sxco_ad_object_name  .
+    include_structure_name = i_node->rap_node_objects-extension_include.
+
+    DATA(database_table_content) = database_table->content( ).
+    DATA(enhancement_category) = database_table_content->get_enhancement_category( )->value.
+    IF enhancement_category EQ zdmo_cl_rap_node=>enhancement_category-can_be_enhanced_deep.
+      DATA(include_structures_of_table) = database_table_content->get_includes( ).
+      LOOP AT include_structures_of_table INTO DATA(my_include_struc).
+*        DATA(include_structure) = xco_api->get_structure( iv_name = to_upper( my_include_struc-structure->name ) ).
+*        DATA(struc_content) = include_structure->content( ).
+*        IF struc_content->get_enhancement_category(  )->value EQ zdmo_cl_rap_node=>enhancement_category-can_be_enhanced_deep.
+        IF my_include_struc-structure->name = include_structure_name.
+          has_extension_include = abap_true.
+*          DATA(field_suffix)  = struc_content->get_field_suffix( ).
+        ENDIF.
+      ENDLOOP.
+      IF has_extension_include = abap_false.
+        DATA(inlcude_was_added) = add_include_structure_to_table( i_node ).
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD constructor.
+
+    super->constructor( ).
+
+    IF json_string IS INITIAL AND io_root_node IS INITIAL.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>parameter_is_initial
+          mv_value = |json_string and io_root_node|.
+    ENDIF.
+
+    "in on premise systems one can provide the on premise version
+    "of the xco libraries as a parameter
+
+    IF xco_lib IS NOT INITIAL.
+      xco_api = xco_lib.
+    ELSE.
+      xco_api = NEW ZDMO_cl_rap_xco_cloud_lib( ).
+    ENDIF.
+
+    IF io_root_node IS INITIAL.
+
+      root_node = NEW ZDMO_cl_rap_node(  ).
+
+      root_node->set_is_root_node( io_is_root_node = abap_true ).
+      root_node->set_xco_lib( xco_api ).
+
+      DATA(rap_bo_visitor) = NEW ZDMO_cl_rap_xco_json_visitor( root_node ).
+      DATA(json_data) = xco_cp_json=>data->from_string( json_string ).
+      json_data->traverse( rap_bo_visitor ).
+      DATA(a) = 1.
+    ELSE.
+
+      root_node = io_root_node.
+      xco_api = io_root_node->xco_lib.
+
+    ENDIF.
+
+    CASE root_node->get_implementation_type( ).
+      WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid .
+      WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+      WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+      WHEN OTHERS.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>implementation_type_not_valid
+            mv_value = root_node->get_implementation_type( ).
+    ENDCASE.
+
+    IF root_node->is_consistent(  ) = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>node_is_not_consistent
+          mv_entity = root_node->entityname.
+    ENDIF.
+    IF root_node->is_finalized = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>node_is_not_finalized
+          mv_entity = root_node->entityname.
+    ENDIF.
+    IF root_node->has_childs(  ).
+      LOOP AT root_node->all_childnodes INTO DATA(ls_childnode).
+        IF ls_childnode->is_consistent(  ) = abap_false.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>node_is_not_consistent
+              mv_entity = ls_childnode->entityname.
+        ENDIF.
+        IF ls_childnode->is_finalized = abap_false.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>node_is_not_finalized
+              mv_entity = ls_childnode->entityname.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+
+    mo_package = root_node->package.
+
+    IF root_node->transport_request IS INITIAL.
+      root_node->set_transport_request(  ).
+    ENDIF.
+    mo_transport = root_node->transport_request.
+
+
+**********************************************************************
+    "cloud
+*    mo_environment = xco_cp_generation=>environment->dev_system( mo_transport )  .
+*    mo_put_operation = mo_environment->create_put_operation( ).
+*    mo_draft_tabl_put_opertion = mo_environment->create_put_operation( ).
+*    mo_srvb_put_operation = mo_environment->create_put_operation( ).
+**********************************************************************
+    "on premise
+*    IF xco_api->get_package( root_node->package  )->read( )-property-record_object_changes = abap_true.
+*      mo_environment = xco_generation=>environment->transported( mo_transport ).
+*    ELSE.
+*      mo_environment = xco_generation=>environment->local.
+*    ENDIF.
+*    mo_draft_tabl_put_opertion = mo_environment->create_mass_put_operation( ).
+*    mo_put_operation = mo_environment->create_mass_put_operation( ).
+*    mo_srvb_put_operation = mo_environment->create_mass_put_operation( ).
+
+
+    mo_environment = get_environment( mo_transport ) .
+    mo_draft_tabl_put_operation = get_put_operation( mo_environment ).
+    mo_put_operation = get_put_operation( mo_environment ).
+    mo_srvb_put_operation = get_put_operation( mo_environment ).
+    mo_patch_operation = get_patch_operation( mo_environment ).
+
+**********************************************************************
+  ENDMETHOD.
+
+
+  METHOD create_bdef.
+
+    DATA lv_determination_name TYPE string.
+    DATA lv_validation_name TYPE string.
+    DATA lv_action_name TYPE string.
+
+
+    DATA lt_mapping_header TYPE HASHED TABLE OF  if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping
+                               WITH UNIQUE KEY cds_view_field dbtable_field.
+    DATA ls_mapping_header TYPE if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping  .
+
+    DATA lt_mapping_item TYPE HASHED TABLE OF if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping
+                           WITH UNIQUE KEY cds_view_field dbtable_field.
+    DATA ls_mapping_item TYPE if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping  .
+
+    FIELD-SYMBOLS: <fs_create> TYPE REF TO  cl_xco_bdef_eval_trigger_oprtn,
+                   <fs_update> TYPE REF TO  cl_xco_bdef_eval_trigger_oprtn,
+                   <fs_delete> TYPE REF TO  cl_xco_bdef_eval_trigger_oprtn.
+
+    lt_mapping_header = io_rap_bo_node->lt_mapping.
+
+    DATA(lo_specification) = mo_put_operation->for-bdef->add_object( io_rap_bo_node->rap_root_node_objects-behavior_definition_r "mo_i_bdef_header
+        )->set_package( mo_package
+        )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_root_node_objects-behavior_definition_r.
+    generated_repository_object-object_type = 'BDEF'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    lo_specification->set_short_description( |Behavior for { io_rap_bo_node->rap_node_objects-cds_view_r }| ) ##no_text.
+
+    IF io_rap_bo_node->is_extensible(  ) = abap_true.
+      lo_specification->set_extensible(  ).
+      set_bdef_extensible_options( lo_specification  ).
+    ENDIF.
+
+    "set implementation type
+    CASE io_rap_bo_node->get_implementation_type(  ).
+      WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+        lo_specification->set_implementation_type( xco_cp_behavior_definition=>implementation_type->managed ).
+      WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+        lo_specification->set_implementation_type( xco_cp_behavior_definition=>implementation_type->managed ).
+      WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+        lo_specification->set_implementation_type( xco_cp_behavior_definition=>implementation_type->unmanaged ).
+
+        "add the code :
+        "implementation in class ZBP_R_Holiday_U02 unique;
+        lo_specification->set_implementation_class( io_rap_bo_node->rap_node_objects-behavior_implementation ).
+    ENDCASE.
+
+
+    "set is draft enabled
+    lo_specification->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+
+    "use the highest recommended strict mode
+    IF io_rap_bo_node->is_abstract_or_custom_entity(  ) = abap_false.
+*      lo_specification->set_strict_n( zdmo_cl_rap_node=>strict_mode_2 ).
+      IF xco_api->on_premise_branch_is_used(  ).
+        method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'.
+      ELSE.
+        method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'.
+      ENDIF.
+      method_exists_in_interface-method_name    = 'SET_STRICT_N'.
+      IF xco_api->method_exists_in_interface(
+           interface_name = method_exists_in_interface-interface_name
+           method_name    = method_exists_in_interface-method_name
+         ).
+        CALL METHOD lo_specification->(method_exists_in_interface-method_name)
+          EXPORTING
+            iv_n = zdmo_cl_rap_node=>strict_mode_2.
+        APPEND 'SET_STRICT_N' TO call_method_succeeded_list.
+        method_exists_in_interface-method_exists = abap_true.
+      ELSE.
+        method_exists_in_interface-method_exists = abap_false.
+      ENDIF.
+      APPEND method_exists_in_interface TO method_exists_in_interfaces.
+      "set_strict_n not found
+      "try to set strict
+      IF method_exists_in_interface-method_exists = abap_false.
+*        method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'.
+        method_exists_in_interface-method_name    = 'SET_STRICT'.
+        IF xco_api->method_exists_in_interface(
+             interface_name = method_exists_in_interface-interface_name
+             method_name    = method_exists_in_interface-method_name
+           ).
+          CALL METHOD lo_specification->(method_exists_in_interface-method_name).
+          APPEND 'SET_STRICT' TO call_method_succeeded_list.
+          method_exists_in_interface-method_exists = abap_true.
+        ELSE.
+          method_exists_in_interface-method_exists = abap_false.
+        ENDIF.
+        APPEND method_exists_in_interface TO method_exists_in_interfaces.
+      ENDIF.
+    ENDIF.
+
+    "define behavior for root entity
+    DATA(lo_header_behavior) = lo_specification->add_behavior( io_rap_bo_node->rap_node_objects-cds_view_r ).
+
+    " Characteristics.
+    DATA(characteristics) = lo_header_behavior->characteristics.
+    characteristics->set_alias( CONV #( io_rap_bo_node->rap_node_objects-alias ) ).
+    characteristics->set_implementation_class( io_rap_bo_node->rap_node_objects-behavior_implementation ).
+
+**********************************************************************
+** @todo check when to set unmanaged_save and addtionial_save
+**********************************************************************
+
+    IF io_rap_bo_node->is_customizing_table = abap_true AND
+      io_rap_bo_node->is_virtual_root(  ) = abap_false.
+      characteristics->set_with_additional_save( ).
+    ENDIF.
+
+    IF io_rap_bo_node->is_virtual_root(  ) .
+      method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_chara'.
+      method_exists_in_interface-method_name    = 'SET_WITH_UNMANAGED_SAVE'.
+      IF xco_api->method_exists_in_interface(
+           interface_name = method_exists_in_interface-interface_name
+           method_name    = method_exists_in_interface-method_name
+         ).
+        CALL METHOD characteristics->(method_exists_in_interface-method_name).
+        method_exists_in_interface-method_exists = abap_true.
+      ELSE.
+        method_exists_in_interface-method_exists = abap_false.
+      ENDIF.
+      APPEND method_exists_in_interface TO method_exists_in_interfaces.
+    ENDIF.
+
+    method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'.
+    method_exists_in_interface-method_name    = 'SET_MASTER_GLOBAL'.
+    IF xco_api->method_exists_in_interface(
+         interface_name = method_exists_in_interface-interface_name
+         method_name    = method_exists_in_interface-method_name
+       ).
+      DATA(authorization) = characteristics->authorization.
+      CALL METHOD authorization->(method_exists_in_interface-method_name).
+      method_exists_in_interface-method_exists = abap_true.
+    ELSE.
+      method_exists_in_interface-method_exists = abap_false.
+    ENDIF.
+    APPEND method_exists_in_interface TO method_exists_in_interfaces.
+
+    IF method_exists_in_interface-method_exists = abap_false.
+      method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'.
+      method_exists_in_interface-method_name    = 'SET_MASTER_INSTANCE'.
+      IF xco_api->method_exists_in_interface(
+           interface_name = method_exists_in_interface-interface_name
+           method_name    = method_exists_in_interface-method_name
+         ).
+        authorization = characteristics->authorization.
+        CALL METHOD authorization->(method_exists_in_interface-method_name).
+        method_exists_in_interface-method_exists = abap_true.
+      ELSE.
+        method_exists_in_interface-method_exists = abap_false.
+      ENDIF.
+      APPEND method_exists_in_interface TO method_exists_in_interfaces.
+
+    ENDIF.
+
+    IF io_rap_bo_node->is_extensible(  ) = abap_true.
+      characteristics->set_extensible(  ).
+    ENDIF.
+
+    IF io_rap_bo_node->draft_enabled = abap_false.
+      characteristics->lock->set_master( ).
+    ENDIF.
+
+    "add the draft table
+    IF io_rap_bo_node->draft_enabled = abap_true.
+      IF io_rap_bo_node->is_extensible(  ) = abap_true.
+        characteristics->set_draft_table(
+                         io_rap_bo_node->draft_table_name )->set_query(
+                         io_rap_bo_node->rap_node_objects-draft_query_view ).
+      ELSE.
+        characteristics->set_draft_table( io_rap_bo_node->draft_table_name ).
+      ENDIF.
+    ENDIF.
+
+
+
+
+    IF line_exists( io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-last_changed_at ] ).
+      DATA(last_changed_at) = io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-last_changed_at ]-cds_view_field.
+    ELSEIF line_exists( io_rap_bo_node->lt_additional_fields[ name = io_rap_bo_node->field_name-last_changed_at ] ).
+      last_changed_at = io_rap_bo_node->lt_additional_fields[ name = io_rap_bo_node->field_name-last_changed_at ]-cds_view_field.
+    ENDIF.
+
+    IF line_exists( io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-local_instance_last_changed_at ] ).
+      DATA(local_instance_last_changed_at) = io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-local_instance_last_changed_at ]-cds_view_field.
+    ELSEIF line_exists( io_rap_bo_node->lt_additional_fields[ name = io_rap_bo_node->field_name-local_instance_last_changed_at ] ).
+      local_instance_last_changed_at = io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-local_instance_last_changed_at ].
+    ENDIF.
+
+    IF line_exists( io_rap_bo_node->lt_all_fields[ name = io_rap_bo_node->field_name-etag_master ] ).
+      DATA(etag_master) = io_rap_bo_node->lt_all_fields[ name = io_rap_bo_node->field_name-etag_master ]-cds_view_field.
+    ENDIF.
+
+    IF line_exists( io_rap_bo_node->lt_all_fields[ name = io_rap_bo_node->field_name-total_etag ] ).
+      DATA(total_etag) = io_rap_bo_node->lt_all_fields[ name = io_rap_bo_node->field_name-total_etag ]-cds_view_field.
+    ENDIF.
+
+    IF io_rap_bo_node->draft_enabled = abap_true.
+      characteristics->etag->set_master( etag_master ).
+
+      " lock type ref to if_xco_gen_bdef_s_fo_b_lock
+      DATA(lock) = characteristics->lock.
+
+      method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_lock'.
+      method_exists_in_interface-method_name    = 'SET_MASTER_TOTAL_ETAG'.
+      IF xco_api->method_exists_in_interface(
+           interface_name = method_exists_in_interface-interface_name
+           method_name    = method_exists_in_interface-method_name
+         ).
+        CALL METHOD lock->(method_exists_in_interface-method_name)
+          EXPORTING
+            iv_master_total_etag = total_etag.
+        APPEND 'SET_MASTER_TOTAL_ETAG' TO call_method_succeeded_list.
+        method_exists_in_interface-method_exists = abap_true.
+      ELSE.
+        method_exists_in_interface-method_exists = abap_false.
+      ENDIF.
+      APPEND method_exists_in_interface TO method_exists_in_interfaces.
+
+    ELSE.
+      characteristics->etag->set_master( etag_master ).
+      characteristics->lock->set_master( ).
+    ENDIF.
+
+    CASE io_rap_bo_node->get_implementation_type(  ).
+      WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+        lo_header_behavior->characteristics->set_persistent_table( CONV sxco_dbt_object_name( io_rap_bo_node->persistent_table_name ) ).
+      WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+        lo_header_behavior->characteristics->set_persistent_table( CONV sxco_dbt_object_name( io_rap_bo_node->persistent_table_name ) ).
+      WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+        "do not set a persistent table
+    ENDCASE.
+
+    IF io_rap_bo_node->draft_enabled = abap_true.
+
+      "  if this is set, no BIL is needed in a plain vanilla managed draft enabled BO
+      "  add the following operations in case draft is used
+      "  draft action Edit;
+      "  draft action Activate;
+      "  draft action Discard;
+      "  draft action Resume;
+      "  draft determine action Prepare;
+
+**********************************************************************
+** Begin of deletion 2020
+**********************************************************************
+
+*      lo_header_behavior->add_action( 'Edit'  )->set_draft( ) ##no_text.
+*      lo_header_behavior->add_action( 'Activate'  )->set_draft( ) ##no_text.
+*      lo_header_behavior->add_action( 'Discard'  )->set_draft( ) ##no_text.
+*      lo_header_behavior->add_action( 'Resume'  )->set_draft( ) ##no_text.
+*      lo_header_behavior->add_action( 'Prepare'  )->set_draft( )->set_determine( ) ##no_text.
+
+      "lo_action_edit type ref to if_xco_gen_bdef_s_fo_b_action
+
+      " add standard operations
+      DATA(lo_action_edit) =   lo_header_behavior->add_action( 'Edit' )." ##no_text.
+      DATA(lo_action_activate) = lo_header_behavior->add_action( 'Activate' ) ##no_text.
+      DATA(lo_action_discard) = lo_header_behavior->add_action( 'Discard' ) ##no_text.
+      DATA(lo_action_resume) = lo_header_behavior->add_action( 'Resume' ) ##no_text.
+      DATA(lo_action_prepare) = lo_header_behavior->add_action( 'Prepare' ) ##no_text.
+
+      IF io_rap_bo_node->is_extensible(  ) = abap_true.
+        lo_action_prepare->set_extensible( abap_true ).
+      ENDIF.
+
+
+      "add the key word draft, if possible. for example: draft action Activate;
+
+      method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_action'.
+      method_exists_in_interface-method_name    = 'SET_DRAFT'.
+
+      IF xco_api->method_exists_in_interface(
+                     interface_name = method_exists_in_interface-interface_name
+                     method_name    = method_exists_in_interface-method_name
+                  ).
+        CALL METHOD lo_action_edit->(method_exists_in_interface-method_name).
+        CALL METHOD lo_action_activate->(method_exists_in_interface-method_name).
+        CALL METHOD lo_action_discard->(method_exists_in_interface-method_name).
+        CALL METHOD lo_action_resume->(method_exists_in_interface-method_name).
+        CALL METHOD lo_action_prepare->(method_exists_in_interface-method_name).
+        method_exists_in_interface-method_exists = abap_true.
+      ELSE.
+        method_exists_in_interface-method_exists = abap_false.
+      ENDIF.
+      APPEND method_exists_in_interface TO method_exists_in_interfaces.
+
+
+      method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_action'.
+      method_exists_in_interface-method_name    = 'SET_DETERMINE'.
+
+      IF xco_api->method_exists_in_interface(
+                     interface_name = method_exists_in_interface-interface_name
+                     method_name    = method_exists_in_interface-method_name
+                   ).
+        CALL METHOD lo_action_prepare->(method_exists_in_interface-method_name).
+        method_exists_in_interface-method_exists = abap_true.
+      ELSE.
+        method_exists_in_interface-method_exists = abap_false.
+      ENDIF.
+      APPEND method_exists_in_interface TO method_exists_in_interfaces.
+
+    ENDIF.
+
+    " add standard operations for root node
+
+    IF io_rap_bo_node->is_virtual_root(  ) .
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update ).
+    ELSE.
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->create ).
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update ).
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete ).
+    ENDIF.
+
+
+**********************************************************************
+** Begin of deletion 2020
+**********************************************************************
+    xco_api->todo( 'in create bdef. make sure is_customizing_table is false on premise' ).
+
+    IF io_rap_bo_node->is_customizing_table = abap_true AND io_rap_bo_node->is_virtual_root( ) = abap_false.
+      " if_xco_gen_bdef_s_fo_b_validtn
+      lv_validation_name = |validateChanges| .
+
+      DATA(validation) = lo_header_behavior->add_validation( CONV #( lv_validation_name ) ).
+      validation->set_time( xco_cp_behavior_definition=>evaluation->time->on_save ).
+
+      method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_validtn'.
+      method_exists_in_interface-method_name    = 'SET_TRIGGER_OPERATIONS'.
+      IF xco_api->method_exists_in_interface(
+                  interface_name = method_exists_in_interface-interface_name
+                  method_name    = method_exists_in_interface-method_name
+                ).
+        DATA  trigger_operations  TYPE sxco_t_bdef_trigger_operations  .
+        " DATA  trigger_operations_class TYPE REF TO cl_xco_bdef_eval_trigger_op_f.
+
+        ASSIGN xco_cp_behavior_definition=>evaluation->trigger_operation->('CREATE') TO <fs_create>.
+        ASSIGN xco_cp_behavior_definition=>evaluation->trigger_operation->('UPDATE') TO <fs_update>.
+        ASSIGN xco_cp_behavior_definition=>evaluation->trigger_operation->('DELETE') TO <fs_delete>.
+
+        IF <fs_create> IS ASSIGNED.
+          APPEND <fs_create> TO trigger_operations.
+        ENDIF.
+        IF <fs_update> IS ASSIGNED.
+          APPEND <fs_update> TO trigger_operations.
+        ENDIF.
+        IF <fs_delete> IS ASSIGNED.
+          APPEND <fs_delete> TO trigger_operations.
+        ENDIF.
+
+* @todo: dynamic call currently fails
+*        CALL METHOD validation->('SET_TRIGGER_OPERATIONS')
+*          IMPORTING
+*            it_trigger_operations = trigger_operations.
+
+        validation->set_trigger_operations( trigger_operations ).
+
+        method_exists_in_interface-method_exists = abap_true.
+      ELSE.
+        method_exists_in_interface-method_exists = abap_false.
+      ENDIF.
+      APPEND method_exists_in_interface TO method_exists_in_interfaces.
+
+    ENDIF.
+
+    IF io_rap_bo_node->is_virtual_root(  ) = abap_true.
+      "action ( features : instance ) selectTransport parameter D_SelectCustomizingTransptReqP result [1] $self;
+      lv_action_name = 'selectTransport'.
+      DATA(action) = lo_header_behavior->add_action( CONV #( lv_action_name ) ).
+      action->set_features_instance( ).
+      action->parameter->set_entity( 'D_SelectCustomizingTransptReqP' ).
+      action->result->set_cardinality( xco_cp_cds=>cardinality->one )->set_self( ).
+    ENDIF.
+
+
+
+
+
+
+**********************************************************************
+** End of deletion 2020
+**********************************************************************
+
+
+
+    CASE io_rap_bo_node->get_implementation_type(  ).
+      WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+
+        lv_determination_name = |Calculate{ io_rap_bo_node->object_id_cds_field_name }|  ##no_text.
+
+        lo_header_behavior->add_determination( CONV #( lv_determination_name ) "'CalculateSemanticKey'
+          )->set_time( xco_cp_behavior_definition=>evaluation->time->on_save
+          )->set_trigger_operations( VALUE #( ( xco_cp_behavior_definition=>evaluation->trigger_operation->create ) )  ).
+
+
+
+
+        LOOP AT lt_mapping_header INTO ls_mapping_header.
+          CASE ls_mapping_header-dbtable_field.
+            WHEN io_rap_bo_node->field_name-uuid.
+              lo_header_behavior->add_field( ls_mapping_header-cds_view_field
+                               )->set_numbering_managed( ).
+              "to do
+              "add a working dummy implementation to calculate the object id
+            WHEN  io_rap_bo_node->object_id .
+              lo_header_behavior->add_field( ls_mapping_header-cds_view_field
+                                 )->set_read_only( ).
+          ENDCASE.
+        ENDLOOP.
+
+      WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic .
+
+        LOOP AT io_rap_bo_node->lt_fields INTO DATA(key_field_root_node)
+               WHERE key_indicator = abap_true AND name <> io_rap_bo_node->field_name-client.
+
+          DATA(key_field_root_behavior) = lo_header_behavior->add_field( key_field_root_node-cds_view_field ).
+
+
+          method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_field'.
+          method_exists_in_interface-method_name    = 'SET_READONLY_UPDATE'.
+
+          IF xco_api->method_exists_in_interface( interface_name = method_exists_in_interface-interface_name
+                                                  method_name    = method_exists_in_interface-method_name ).
+            CALL METHOD key_field_root_behavior->(method_exists_in_interface-method_name).
+          ENDIF.
+
+
+          "lo_item_behavior->add_field( ls_fields-cds_view_field )->set_readonly_update(  ).
+        ENDLOOP.
+
+
+      WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+
+        LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_field) WHERE name <> io_rap_bo_node->field_name-client.
+          IF ls_field-key_indicator = abap_true.
+            lo_header_behavior->add_field( ls_field-cds_view_field
+                               )->set_read_only(
+                               ).
+          ENDIF.
+        ENDLOOP.
+    ENDCASE.
+
+
+*  make administrative fields read-only
+*  field ( readonly )
+*   CreatedAt,
+*   CreatedBy,
+*   LocalLastChangedAt,
+*   LastChangedAt,
+*   LastChangedBy;
+
+    LOOP AT io_rap_bo_node->lt_fields INTO ls_field
+      WHERE name <> io_rap_bo_node->field_name-client.
+      CASE ls_field-name .
+        WHEN io_rap_bo_node->field_name-created_at OR
+             io_rap_bo_node->field_name-created_by OR
+             io_rap_bo_node->field_name-local_instance_last_changed_at OR
+             io_rap_bo_node->field_name-local_instance_last_changed_by OR
+             io_rap_bo_node->field_name-last_changed_at OR
+             io_rap_bo_node->field_name-last_changed_by OR
+             io_rap_bo_node->field_name-uuid.
+          lo_header_behavior->add_field( ls_field-cds_view_field )->set_read_only( ).
+      ENDCASE.
+    ENDLOOP.
+
+
+
+    IF lt_mapping_header IS NOT INITIAL.
+      CASE io_rap_bo_node->get_implementation_type(  ).
+        WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+
+          "use conv #( ) since importing parameter iv_database_table
+          "was of type sxco_dbt_object_name and has been changed to clike
+          "to support structure names longer than 16 characters as of 2111
+
+          DATA(header_mapping) = lo_header_behavior->add_mapping_for( CONV #( io_rap_bo_node->persistent_table_name ) ).
+          header_mapping->set_field_mapping( it_field_mappings =  lt_mapping_header ).
+          IF io_rap_bo_node->is_extensible(  ) = abap_true.
+            "header_mapping->set_extensible(  )->set_corresponding(  ).
+            set_extensible_for_mapping( header_mapping ).
+          ENDIF.
+        WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+          header_mapping = lo_header_behavior->add_mapping_for( CONV #( io_rap_bo_node->persistent_table_name ) ).
+          header_mapping->set_field_mapping( it_field_mappings =  lt_mapping_header ).
+          IF io_rap_bo_node->is_extensible(  ) = abap_true.
+            "header_mapping->set_extensible(  )->set_corresponding(  ).
+            set_extensible_for_mapping( header_mapping ).
+          ENDIF.
+        WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+          "add control structure
+*          lo_header_behavior->add_mapping_for( CONV sxco_dbt_object_name( io_rap_bo_node->persistent_table_name ) )->set_field_mapping( it_field_mappings =  lt_mapping_header )->set_control( io_rap_bo_node->rap_node_objects-control_structure ).
+
+          "add control structure
+          IF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-table.
+            header_mapping = lo_header_behavior->add_mapping_for( CONV #( io_rap_bo_node->persistent_table_name ) ).
+            header_mapping->set_field_mapping( it_field_mappings = lt_mapping_header )->set_control( io_rap_bo_node->rap_node_objects-control_structure ).
+          ELSEIF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-structure.
+            header_mapping = lo_header_behavior->add_mapping_for( CONV #( io_rap_bo_node->structure_name ) ).
+            header_mapping->set_field_mapping( it_field_mappings = lt_mapping_header )->set_control( io_rap_bo_node->rap_node_objects-control_structure ).
+          ELSEIF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-abap_type.
+            "structure name is added here since we only support abap types that are based on structures
+            header_mapping = lo_header_behavior->add_mapping_for( CONV #( io_rap_bo_node->structure_name ) ).
+            header_mapping->set_field_mapping( it_field_mappings = lt_mapping_header )->set_control( io_rap_bo_node->rap_node_objects-control_structure ).
+          ENDIF.
+          IF io_rap_bo_node->is_extensible(  ) = abap_true.
+            " header_mapping->set_extensible(  )->set_corresponding(  ).
+            set_extensible_for_mapping( header_mapping ).
+          ENDIF.
+      ENDCASE.
+    ENDIF.
+
+    IF io_rap_bo_node->has_childs(  ).
+      LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode).
+        DATA(assoc) = lo_header_behavior->add_association( '_' && lo_childnode->rap_node_objects-alias  ).
+        assoc->set_create_enabled(  ).
+        assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+      ENDLOOP.
+    ENDIF.
+
+
+
+    "define behavior for child entities
+
+    IF io_rap_bo_node->has_childs(  ).
+
+      LOOP AT io_rap_bo_node->all_childnodes INTO lo_childnode.
+
+        CLEAR lt_mapping_item.
+
+        lt_mapping_item = lo_childnode->lt_mapping.
+
+        DATA(lo_item_behavior) = lo_specification->add_behavior( lo_childnode->rap_node_objects-cds_view_r ).
+
+        " Characteristics.
+        DATA(item_characteristics) = lo_item_behavior->characteristics.
+
+        "add the draft table
+        IF io_rap_bo_node->draft_enabled = abap_true.
+          item_characteristics->set_draft_table( lo_childnode->draft_table_name ).
+        ENDIF.
+
+        IF lo_childnode->is_extensible(  ) = abap_true.
+          item_characteristics->set_extensible(  ).
+        ENDIF.
+
+        "@todo: Compare with code for root entity
+
+        CLEAR local_instance_last_changed_at.
+
+        IF line_exists( lo_childnode->lt_fields[ name = lo_childnode->field_name-local_instance_last_changed_at ] ).
+          local_instance_last_changed_at = lo_childnode->lt_fields[ name = lo_childnode->field_name-local_instance_last_changed_at ]-cds_view_field.
+        ELSEIF line_exists( lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-local_instance_last_changed_at ] ).
+          local_instance_last_changed_at = lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-local_instance_last_changed_at ]-cds_view_field.
+        ENDIF.
+
+
+        IF line_exists( lo_childnode->lt_fields[ name = lo_childnode->field_name-last_changed_at ] ).
+          last_changed_at = lo_childnode->lt_fields[ name = lo_childnode->field_name-last_changed_at ]-cds_view_field.
+        ELSEIF line_exists( lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-last_changed_at ] ).
+          last_changed_at = lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-last_changed_at ]-cds_view_field.
+        ENDIF.
+
+        CLEAR etag_master.
+        IF line_exists( lo_childnode->lt_fields[ name = lo_childnode->field_name-etag_master ] ).
+          etag_master = lo_childnode->lt_fields[ name = lo_childnode->field_name-etag_master ]-cds_view_field.
+        ELSEIF line_exists( lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-etag_master ] ).
+          etag_master = lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-etag_master ]-cds_view_field.
+        ENDIF.
+
+        IF etag_master IS NOT INITIAL.
+          item_characteristics->etag->set_master( etag_master ).
+        ELSE.
+          item_characteristics->etag->set_dependent_by( '_' && lo_childnode->root_node->rap_node_objects-alias ).
+        ENDIF.
+
+        " Characteristics.
+        IF lo_childnode->is_grand_child_or_deeper(  ).
+
+          item_characteristics->set_alias( CONV #( lo_childnode->rap_node_objects-alias )
+            )->set_implementation_class( lo_childnode->rap_node_objects-behavior_implementation
+            )->lock->set_dependent_by( '_' && lo_childnode->root_node->rap_node_objects-alias  ).
+
+          "@todo add again once setting of
+          "authorization master(global)
+          "is allowed
+          "IF lo_childnode->root_node->is_virtual_root( ).
+**********************************************************************
+** Begin of deletion 2108
+**********************************************************************
+          "check if set authorization master(global) root node has been set to
+          "MASTER(global) or master(instance)
+          "only in this case child nodes can't be set as dependent_by
+          method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'.
+          method_exists_in_interface-method_name    = 'SET_MASTER_GLOBAL'.
+
+
+          IF xco_api->method_exists_in_interface(
+                     interface_name = method_exists_in_interface-interface_name
+                     method_name    = method_exists_in_interface-method_name
+                   ).
+            DATA(item_authorization) = item_characteristics->authorization.
+            DATA(authorization_association) =  |_{ lo_childnode->root_node->rap_node_objects-alias }|.
+            item_authorization->set_dependent_by( CONV sxco_cds_association_name( authorization_association ) ).
+            method_exists_in_interface-method_exists = abap_true.
+          ELSE.
+            method_exists_in_interface-method_exists = abap_false.
+          ENDIF.
+          APPEND method_exists_in_interface TO method_exists_in_interfaces.
+
+          "if setting authorization master(global) fails
+          "try authorization master(instance)
+
+          IF method_exists_in_interface-method_exists = abap_false.
+            method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'.
+            method_exists_in_interface-method_name    = 'SET_MASTER_INSTANCE'.
+            IF xco_api->method_exists_in_interface(
+                 interface_name = method_exists_in_interface-interface_name
+                 method_name    = method_exists_in_interface-method_name
+               ).
+
+              item_authorization = item_characteristics->authorization.
+              authorization_association =  |_{ lo_childnode->root_node->rap_node_objects-alias }|.
+              item_authorization->set_dependent_by( CONV sxco_cds_association_name( authorization_association ) ).
+
+              method_exists_in_interface-method_exists = abap_true.
+            ELSE.
+              method_exists_in_interface-method_exists = abap_false.
+            ENDIF.
+            APPEND method_exists_in_interface TO method_exists_in_interfaces.
+
+          ENDIF.
+
+
+
+*          item_characteristics->authorization->set_dependent_by( '_' && lo_childnode->root_node->rap_node_objects-alias  ).
+*          "ENDIF.
+*
+**********************************************************************
+** end of deletion 2108
+**********************************************************************
+
+
+          CASE lo_childnode->get_implementation_type(  ).
+            WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+              item_characteristics->set_persistent_table( CONV sxco_dbt_object_name( lo_childnode->persistent_table_name ) ).
+            WHEN   ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+              item_characteristics->set_persistent_table( CONV sxco_dbt_object_name( lo_childnode->persistent_table_name ) ).
+            WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+              "nothing to do
+          ENDCASE.
+
+
+
+          "add association to parent node
+          assoc = lo_item_behavior->add_association( '_' && lo_childnode->parent_node->rap_node_objects-alias  ).
+          assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+
+          "add association to root node
+          assoc = lo_item_behavior->add_association( '_' && lo_childnode->root_node->rap_node_objects-alias  ).
+          assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+
+          IF lo_childnode->root_node->is_customizing_table = abap_true.
+            item_characteristics->set_with_additional_save( ).
+          ENDIF.
+
+        ELSEIF lo_childnode->is_child(  ).
+
+          item_characteristics->set_alias( CONV #( lo_childnode->rap_node_objects-alias )
+                   )->set_implementation_class( lo_childnode->rap_node_objects-behavior_implementation
+                   )->lock->set_dependent_by( '_' && lo_childnode->parent_node->rap_node_objects-alias  ).
+
+
+          "@todo add again once setting of
+          "authorization master(global)
+          "is allowed
+**********************************************************************
+** Begin of deletion 2108
+**********************************************************************
+
+          "check if set authorization master(global) root node has been set to
+          "MASTER(global) or master(instance)
+          "only in this case child nodes can't be set as dependent_by
+
+          method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'.
+          method_exists_in_interface-method_name    = 'SET_MASTER_GLOBAL'.
+          "if root node can't be set as MASTER GLOBAL child nodes can't be set as dependent_by
+          IF xco_api->method_exists_in_interface(
+                     interface_name = method_exists_in_interface-interface_name
+                     method_name    = method_exists_in_interface-method_name
+                   ).
+            item_authorization = item_characteristics->authorization.
+            authorization_association =  |_{ lo_childnode->root_node->rap_node_objects-alias }|.
+            item_authorization->set_dependent_by( CONV sxco_cds_association_name( authorization_association ) ).
+            method_exists_in_interface-method_exists = abap_true.
+          ELSE.
+            method_exists_in_interface-method_exists = abap_false.
+          ENDIF.
+          APPEND method_exists_in_interface TO method_exists_in_interfaces.
+
+
+          IF method_exists_in_interface-method_exists = abap_false.
+            method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'.
+            method_exists_in_interface-method_name    = 'SET_MASTER_INSTANCE'.
+            IF xco_api->method_exists_in_interface(
+                 interface_name = method_exists_in_interface-interface_name
+                 method_name    = method_exists_in_interface-method_name
+               ).
+
+              item_authorization = item_characteristics->authorization.
+              authorization_association =  |_{ lo_childnode->root_node->rap_node_objects-alias }|.
+              item_authorization->set_dependent_by( CONV sxco_cds_association_name( authorization_association ) ).
+
+              method_exists_in_interface-method_exists = abap_true.
+            ELSE.
+              method_exists_in_interface-method_exists = abap_false.
+            ENDIF.
+            APPEND method_exists_in_interface TO method_exists_in_interfaces.
+
+          ENDIF.
+
+
+*          item_characteristics->authorization->set_dependent_by( '_' && lo_childnode->parent_node->rap_node_objects-alias  ).
+
+**********************************************************************
+** end of deletion 2108
+**********************************************************************
+
+          IF lo_childnode->root_node->is_customizing_table = abap_true.
+            item_characteristics->set_with_additional_save( ).
+          ENDIF.
+
+
+          CASE lo_childnode->get_implementation_type(  ).
+            WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+              item_characteristics->set_persistent_table( CONV sxco_dbt_object_name( lo_childnode->persistent_table_name ) ).
+            WHEN   ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+              item_characteristics->set_persistent_table( CONV sxco_dbt_object_name( lo_childnode->persistent_table_name  ) ).
+            WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+              "set no persistent table
+          ENDCASE.
+
+
+          "add association to parent node
+          assoc = lo_item_behavior->add_association( '_' && lo_childnode->parent_node->rap_node_objects-alias  ).
+          assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+
+        ELSE.
+          "should not happen
+
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            MESSAGE ID 'ZDMO_CM_RAP_GEN_MSG' TYPE 'E' NUMBER '001'
+            WITH lo_childnode->entityname lo_childnode->root_node->entityname.
+
+        ENDIF.
+
+
+        IF lo_childnode->has_childs(  ).
+          LOOP AT lo_childnode->childnodes INTO DATA(lo_grandchildnode).
+            assoc = lo_item_behavior->add_association( '_' && lo_grandchildnode->rap_node_objects-alias  ).
+            assoc->set_create_enabled(  ).
+            assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+          ENDLOOP.
+        ENDIF.
+
+        "child nodes only offer update and delete and create by assocation
+        lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update ).
+        lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete ).
+
+
+
+**********************************************************************
+** Begin of deletion 2020
+**********************************************************************
+        IF io_rap_bo_node->is_customizing_table = abap_true.
+
+          lv_validation_name = |val_transport| .
+
+          DATA(item_validation) = lo_item_behavior->add_validation( CONV #( lv_validation_name ) ).
+          "'val_transport'
+          item_validation->set_time( xco_cp_behavior_definition=>evaluation->time->on_save ).
+
+*          trigger_operations = VALUE #(
+*                                        ( xco_cp_behavior_definition=>evaluation->trigger_operation->create )
+*                                        ( xco_cp_behavior_definition=>evaluation->trigger_operation->update )
+*                                        "( xco_cp_behavior_definition=>evaluation->trigger_operation->delete )
+*                                       ).
+
+          CLEAR trigger_operations.
+          ASSIGN xco_cp_behavior_definition=>evaluation->trigger_operation->('CREATE') TO <fs_create>.
+          ASSIGN xco_cp_behavior_definition=>evaluation->trigger_operation->('UPDATE') TO <fs_update>.
+
+
+          IF <fs_create> IS ASSIGNED.
+            APPEND <fs_create> TO trigger_operations.
+          ENDIF.
+          IF <fs_update> IS ASSIGNED.
+            APPEND <fs_update> TO trigger_operations.
+          ENDIF.
+
+          IF xco_api->method_exists_in_interface(
+            interface_name = 'if_xco_gen_bdef_s_fo_b_validtn'
+            method_name    = 'SET_TRIGGER_OPERATIONS'
+          ).
+
+* todo: dynamic call currently fails
+*              CALL METHOD item_validation->('SET_TRIGGER_OPERATIONS')
+*                IMPORTING
+*                  it_trigger_operations = trigger_operations.
+
+            item_validation->set_trigger_operations( trigger_operations ).
+
+          ENDIF.
+        ENDIF.
+**********************************************************************
+** End of deletion 2020
+**********************************************************************
+
+
+        CASE lo_childnode->get_implementation_type(  ).
+          WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+            "determination CalculateSemanticKey on modify { create; }
+            lv_determination_name = 'Calculate' && lo_childnode->object_id_cds_field_name.
+
+            lo_item_behavior->add_determination( CONV #( lv_determination_name )
+              )->set_time( xco_cp_behavior_definition=>evaluation->time->on_save
+              )->set_trigger_operations( VALUE #( ( xco_cp_behavior_definition=>evaluation->trigger_operation->create ) )  ).
+
+            LOOP AT lt_mapping_item INTO ls_mapping_item.
+              CASE ls_mapping_item-dbtable_field.
+                WHEN lo_childnode->field_name-uuid.
+                  lo_item_behavior->add_field( ls_mapping_item-cds_view_field
+                                 )->set_numbering_managed( )->set_read_only( ).
+                WHEN lo_childnode->field_name-parent_uuid OR
+                     lo_childnode->field_name-root_uuid.
+                  lo_item_behavior->add_field( ls_mapping_item-cds_view_field )->set_read_only( ).
+
+                WHEN  lo_childnode->object_id.
+                  lo_item_behavior->add_field( ls_mapping_item-cds_view_field )->set_read_only( ).
+
+              ENDCASE.
+            ENDLOOP.
+
+          WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+
+            "key field is not set as read only since at this point we assume
+            "that the key is set externally
+
+            IF lo_childnode->root_node->is_virtual_root(  ).
+              lo_item_behavior->add_field( lo_childnode->singleton_field_name )->set_read_only( ).
+            ENDIF.
+
+
+
+            LOOP AT lo_childnode->lt_fields INTO DATA(ls_fields)
+                   WHERE key_indicator = abap_true AND name <> lo_childnode->field_name-client.
+
+              DATA(key_field_behavior) = lo_item_behavior->add_field( ls_fields-cds_view_field ).
+
+              "sematic key fields that are set via cba have to be read only.
+              "This are these key fields that are not part of the semantic key
+              "of the parent entity
+              "the remaining key fields have to be set as readonly:update
+
+              IF line_exists( lo_childnode->parent_node->semantic_key[ name = ls_fields-name ] ).
+
+                key_field_behavior->set_read_only( ).
+
+              ELSE.
+
+                IF xco_api->method_exists_in_interface( interface_name = 'if_xco_gen_bdef_s_fo_b_field'
+                                                        method_name    = 'SET_READONLY_UPDATE' ).
+                  CALL METHOD key_field_behavior->('SET_READONLY_UPDATE').
+                ENDIF.
+
+              ENDIF.
+
+              "lo_item_behavior->add_field( ls_fields-cds_view_field )->set_readonly_update(  ).
+            ENDLOOP.
+
+          WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+            "make the key fields read only in the child entities
+            "Otherwise you get the warning
+            "The field "<semantic key of root node>" is used for "lock" dependency (in the ON clause of
+            "the association "_Travel"). This means it should be flagged as
+            "readonly / readonly:update".
+
+            "LOOP AT lo_childnode->root_node->lt_fields INTO DATA(ls_fields)
+            LOOP AT lo_childnode->lt_fields INTO ls_fields
+              WHERE key_indicator = abap_true AND name <> lo_childnode->field_name-client.
+              lo_item_behavior->add_field( ls_fields-cds_view_field )->set_read_only( ).
+            ENDLOOP.
+
+
+
+        ENDCASE.
+
+
+*  make administrative fields read-only
+*  field ( readonly )
+*   CreatedAt,
+*   CreatedBy,
+*   LocalLastChangedAt,
+*   LastChangedAt,
+*   LastChangedBy;
+
+        LOOP AT lo_childnode->lt_fields INTO ls_fields
+          WHERE name <> lo_childnode->field_name-client.
+          CASE ls_fields-name .
+            WHEN lo_childnode->field_name-created_at OR
+                 lo_childnode->field_name-created_by OR
+                 lo_childnode->field_name-local_instance_last_changed_at OR
+                 lo_childnode->field_name-local_instance_last_changed_by OR
+                 lo_childnode->field_name-last_changed_at OR
+                 lo_childnode->field_name-last_changed_by.
+              lo_item_behavior->add_field( ls_fields-cds_view_field )->set_read_only( ).
+          ENDCASE.
+        ENDLOOP.
+
+        IF lt_mapping_item IS NOT INITIAL.
+          CASE io_rap_bo_node->get_implementation_type(  ).
+            WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+              "use conv #( ) since importing parameter iv_database_table
+              "was of type sxco_dbt_object_name and has been changed to clike
+              "to support structure names longer than 16 characters as of 2111
+              DATA(item_mapping) = lo_item_behavior->add_mapping_for( CONV #( lo_childnode->persistent_table_name ) ).
+              item_mapping->set_field_mapping( it_field_mappings =  lt_mapping_item ).
+              IF io_rap_bo_node->is_extensible(  ) = abap_true.
+                "item_mapping->set_extensible(  )->set_corresponding(  ).
+                set_extensible_for_mapping( item_mapping ).
+              ENDIF.
+            WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+              item_mapping = lo_item_behavior->add_mapping_for( CONV #( lo_childnode->persistent_table_name ) ).
+              item_mapping->set_field_mapping( it_field_mappings =  lt_mapping_item ).
+              IF io_rap_bo_node->is_extensible(  ) = abap_true.
+                "item_mapping->set_extensible(  )->set_corresponding(  ).
+                set_extensible_for_mapping( item_mapping ).
+              ENDIF.
+            WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+              "add control structure
+              IF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-table.
+                item_mapping = lo_item_behavior->add_mapping_for( CONV #( lo_childnode->persistent_table_name ) ).
+                item_mapping->set_field_mapping( it_field_mappings = lt_mapping_item )->set_control( lo_childnode->rap_node_objects-control_structure ).
+              ELSEIF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-structure.
+                item_mapping = lo_item_behavior->add_mapping_for( CONV #( lo_childnode->structure_name ) ).
+                item_mapping->set_field_mapping( it_field_mappings = lt_mapping_item )->set_control( lo_childnode->rap_node_objects-control_structure ).
+              ELSEIF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-abap_type.
+                "structure name is added here since we only support abap types that are based on structures
+                item_mapping = lo_item_behavior->add_mapping_for( CONV #( lo_childnode->structure_name ) ).
+                item_mapping->set_field_mapping( it_field_mappings = lt_mapping_item )->set_control( lo_childnode->rap_node_objects-control_structure ).
+              ENDIF.
+
+              IF io_rap_bo_node->is_extensible(  ) = abap_true.
+                "item_mapping->set_extensible(  )->set_corresponding(  ).
+                set_extensible_for_mapping( item_mapping ).
+              ENDIF.
+
+          ENDCASE.
+        ENDIF.
+
+
+
+      ENDLOOP.
+
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD create_bdef_i.
+
+    "todo: add
+    "  rap_root_node_objects-behavior_definition_i
+    "
+
+
+    DATA(lo_specification) = mo_put_operation->for-bdef->add_object( io_rap_bo_node->rap_root_node_objects-behavior_definition_i
+                  )->set_package( mo_package
+                  )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_root_node_objects-behavior_definition_i.
+    generated_repository_object-object_type = 'BDEF'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    lo_specification->set_short_description( |Behavior for { io_rap_bo_node->rap_node_objects-cds_view_i }|
+       )->set_implementation_type( xco_cp_behavior_definition=>implementation_type->interface
+       )  ##no_text.
+
+    IF io_rap_bo_node->is_extensible(  ) = abap_true.
+      lo_specification->set_extensible(  ).
+*      IF xco_api->method_exists_in_interface(
+*        interface_name = 'if_xco_cp_gen_bdef_s_form'
+*        method_name    = 'SET_USE_SIDE_EFFECTS'
+*      ).
+*        CALL METHOD lo_specification->('SET_USE_SIDE_EFFECTS').
+*      ENDIF.
+      IF xco_api->on_premise_branch_is_used(  ).
+        method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'.
+      ELSE.
+        method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'.
+      ENDIF.
+      method_exists_in_interface-method_name    = 'SET_USE_SIDE_EFFECTS'.
+      IF xco_api->method_exists_in_interface(
+              interface_name = method_exists_in_interface-interface_name
+              method_name    = method_exists_in_interface-method_name
+            ).
+        CALL METHOD lo_specification->(method_exists_in_interface-method_name).
+      ENDIF.
+    ENDIF.
+**********************************************************************
+** Begin of deletion 2020
+**********************************************************************
+
+    IF io_rap_bo_node->draft_enabled = abap_true.
+      "if_xco_cp_gen_bdef_s_form
+      IF xco_api->on_premise_branch_is_used(  ).
+        method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'.
+      ELSE.
+        method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'.
+      ENDIF.
+      method_exists_in_interface-method_name    = 'SET_USE_DRAFT'.
+      IF xco_api->method_exists_in_interface(
+              interface_name = method_exists_in_interface-interface_name
+              method_name    = method_exists_in_interface-method_name
+            ).
+        CALL METHOD lo_specification->(method_exists_in_interface-method_name).
+      ENDIF.
+*      IF xco_api->method_exists_in_interface(
+*              interface_name = 'if_xco_cp_gen_bdef_s_form'
+*              method_name    = 'SET_USE_DRAFT'
+*            ).
+*        CALL METHOD lo_specification->('SET_USE_DRAFT').
+*      ENDIF.
+    ENDIF.
+**********************************************************************
+** End of deletion 2020
+**********************************************************************
+
+    "strict statement is not used in bdef of interface view
+*    IF io_rap_bo_node->is_abstract_or_custom_entity(  ) = abap_false.
+*      lo_specification->set_strict_n( zdmo_cl_rap_node=>strict_mode_2 ).
+*      IF xco_api->on_premise_branch_is_used(  ).
+*        method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'.
+*      ELSE.
+*        method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'.
+*      ENDIF.
+*
+*      method_exists_in_interface-method_name    = 'SET_STRICT_N'.
+*      IF xco_api->method_exists_in_interface(
+*           interface_name = method_exists_in_interface-interface_name
+*           method_name    = method_exists_in_interface-method_name
+*         ).
+*        CALL METHOD lo_specification->(method_exists_in_interface-method_name)
+*          EXPORTING
+*            iv_n = zdmo_cl_rap_node=>strict_mode_2.
+*        APPEND 'SET_STRICT_N' TO call_method_succeeded_list.
+*        method_exists_in_interface-method_exists = abap_true.
+*      ELSE.
+*        method_exists_in_interface-method_exists = abap_false.
+*      ENDIF.
+*      APPEND method_exists_in_interface TO method_exists_in_interfaces.
+*      "set_strict_n not found
+*      "try to set strict
+*      IF method_exists_in_interface-method_exists = abap_false.
+*        method_exists_in_interface-method_name    = 'SET_STRICT'.
+*        IF xco_api->method_exists_in_interface(
+*             interface_name = method_exists_in_interface-interface_name
+*             method_name    = method_exists_in_interface-method_name
+*           ).
+*          CALL METHOD lo_specification->(method_exists_in_interface-method_name).
+*          APPEND 'SET_STRICT' TO call_method_succeeded_list.
+*          method_exists_in_interface-method_exists = abap_true.
+*        ELSE.
+*          method_exists_in_interface-method_exists = abap_false.
+*        ENDIF.
+*        APPEND method_exists_in_interface TO method_exists_in_interfaces.
+*      ENDIF.
+*    ENDIF.
+
+    DATA(lo_header_behavior) = lo_specification->add_behavior( io_rap_bo_node->rap_node_objects-cds_view_i ).
+
+    " Characteristics.
+
+    " Characteristics.
+    DATA(header_characteristics) = lo_header_behavior->characteristics.
+
+    " extensibility on entity level is inherited from the R-layer
+*    IF io_rap_bo_node->is_extensible(  ) = abap_true.
+*      header_characteristics->set_extensible(  ).
+*    ENDIF.
+
+    lo_header_behavior->characteristics->set_alias( CONV #( io_rap_bo_node->rap_node_objects-alias )
+      ).
+
+    lo_header_behavior->characteristics->etag->set_use(  ) .
+
+    IF io_rap_bo_node->draft_enabled = abap_true.
+
+      "add the following actions in case draft is used
+      "follows the strict implementation principle
+      "use action Activate;
+      "use action Discard;
+      "use action Edit;
+      "use action Prepare;
+      "use action Resume;
+
+      xco_api->todo( 'check if the following statements shall be executed or only if the following method exists' ).
+*      IF xco_api->method_exists_in_interface(
+*                     interface_name = 'if_xco_gen_bdef_s_fo_b_action '
+*                     method_name    = 'set_draft'
+*                   ).
+
+      lo_header_behavior->add_action( 'Edit' )->set_use( ) ##no_text.
+      lo_header_behavior->add_action( 'Activate' )->set_use( ) ##no_text.
+      lo_header_behavior->add_action( 'Discard' )->set_use( ) ##no_text.
+      lo_header_behavior->add_action( 'Resume' )->set_use( ) ##no_text.
+      lo_header_behavior->add_action( 'Prepare' )->set_use( ) ##no_text.
+
+
+    ENDIF.
+
+    " Standard operations.
+    IF io_rap_bo_node->is_virtual_root(  ) .
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ).
+    ELSE.
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->create )->set_use( ).
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ).
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete )->set_use( ).
+    ENDIF.
+
+    IF io_rap_bo_node->is_virtual_root(  ) = abap_true AND io_rap_bo_node->is_customizing_table = abap_true.
+      "use action selectTransport;
+      lo_header_behavior->add_action( iv_name = 'selectTransport' )->set_use( ).
+    ENDIF.
+
+
+    "use action Edit;
+    "if the Edit function is defined there is no need to implement a BIL
+    "IF io_rap_bo_node->draft_enabled = abap_true.
+    "  lo_header_behavior->add_action( iv_name = 'Edit' )->set_use( ).
+    "ENDIF.
+
+    IF io_rap_bo_node->has_childs(  ).
+
+      LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode).
+        DATA(assoc) =  lo_header_behavior->add_association( '_' && lo_childnode->rap_node_objects-alias ).
+        assoc->set_create_enabled( abap_true ).
+        assoc->set_use(  ).
+        assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+      ENDLOOP.
+
+      LOOP AT io_rap_bo_node->all_childnodes INTO lo_childnode.
+
+        DATA(lo_item_behavior) = lo_specification->add_behavior( lo_childnode->rap_node_objects-cds_view_i ).
+
+        " Characteristics.
+        lo_item_behavior->characteristics->set_alias( CONV #( lo_childnode->rap_node_objects-alias )
+          ).
+
+        " Characteristics.
+        DATA(item_characteristics) = lo_item_behavior->characteristics.
+
+        "extensibility on entity level is inherited from the r-layer
+*        IF io_rap_bo_node->is_extensible(  ) = abap_true.
+*          item_characteristics->set_extensible(  ).
+*        ENDIF.
+
+        lo_item_behavior->characteristics->etag->set_use(  ) .
+
+        " Standard operations.
+        lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ).
+        lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete )->set_use( ).
+
+        "add association to parent and root views
+        "e.g. use association _Travel { with draft; }
+
+        IF lo_childnode->is_grand_child_or_deeper(  ).
+
+          "publish association to root
+          assoc = lo_item_behavior->add_association(  '_' && lo_childnode->root_node->rap_node_objects-alias ).
+          assoc->set_use( ).
+          assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+
+          "publish association to parent
+          assoc = lo_item_behavior->add_association(  '_' && lo_childnode->parent_node->rap_node_objects-alias ).
+          assoc->set_use( ).
+          assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+
+        ELSEIF lo_childnode->is_child( ).
+          "lo_item_behavior->add_association(  mo_assoc_to_header )->set_use(  ).
+          "'_' && lo_childnode->parent_node->rap_node_objects-alias
+
+          "publish association to parent
+          assoc = lo_item_behavior->add_association(  '_' && lo_childnode->parent_node->rap_node_objects-alias ).
+          assoc->set_use(  ).
+          assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+        ELSE.
+
+          "for a root node nothing has to be added here
+
+        ENDIF.
+
+        "publish draft enabled associations to all child nodes of node
+        "e.g. use association _Booking { create; with draft; }
+
+        IF lo_childnode->has_childs(  ).
+          LOOP AT lo_childnode->childnodes INTO DATA(lo_grandchildnode).
+            assoc = lo_item_behavior->add_association( iv_name = '_' && lo_grandchildnode->rap_node_objects-alias ).
+            assoc->set_create_enabled(  ).
+            assoc->set_use(  ).
+            assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+          ENDLOOP.
+        ENDIF.
+
+      ENDLOOP.
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD create_bdef_p.
+    DATA(lo_specification) = mo_put_operation->for-bdef->add_object( io_rap_bo_node->rap_root_node_objects-behavior_definition_p
+               )->set_package( mo_package
+               )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_root_node_objects-behavior_definition_p.
+    generated_repository_object-object_type = 'BDEF'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    lo_specification->set_short_description( |Behavior for { io_rap_bo_node->rap_node_objects-cds_view_p }|
+       )->set_implementation_type( xco_cp_behavior_definition=>implementation_type->projection
+       )  ##no_text.
+
+    IF io_rap_bo_node->is_extensible(  ) = abap_true.
+      lo_specification->set_extensible(  ).
+      IF xco_api->on_premise_branch_is_used(  ).
+        method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'.
+      ELSE.
+        method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'.
+      ENDIF.
+      method_exists_in_interface-method_name    = 'SET_USE_SIDE_EFFECTS'.
+      IF xco_api->method_exists_in_interface(
+              interface_name = method_exists_in_interface-interface_name
+              method_name    = method_exists_in_interface-method_name
+            ).
+        CALL METHOD lo_specification->(method_exists_in_interface-method_name).
+      ENDIF.
+    ENDIF.
+**********************************************************************
+** Begin of deletion 2020
+**********************************************************************
+
+    IF io_rap_bo_node->draft_enabled = abap_true.
+      "if_xco_cp_gen_bdef_s_form
+      IF xco_api->on_premise_branch_is_used(  ).
+        method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'.
+      ELSE.
+        method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'.
+      ENDIF.
+      method_exists_in_interface-method_name    = 'SET_USE_DRAFT'.
+      IF xco_api->method_exists_in_interface(
+              interface_name = method_exists_in_interface-interface_name
+              method_name    = method_exists_in_interface-method_name
+            ).
+        CALL METHOD lo_specification->(method_exists_in_interface-method_name).
+      ENDIF.
+*      IF xco_api->method_exists_in_interface(
+*              interface_name = 'if_xco_cp_gen_bdef_s_form'
+*              method_name    = 'SET_USE_DRAFT'
+*            ).
+*        CALL METHOD lo_specification->('SET_USE_DRAFT').
+*      ENDIF.
+    ENDIF.
+**********************************************************************
+** End of deletion 2020
+**********************************************************************
+
+    "use the highest recommended strict mode
+    IF io_rap_bo_node->is_abstract_or_custom_entity(  ) = abap_false.
+*      lo_specification->set_strict_n( zdmo_cl_rap_node=>strict_mode_2 ).
+      IF xco_api->on_premise_branch_is_used(  ).
+        method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'.
+      ELSE.
+        method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'.
+      ENDIF.
+
+      method_exists_in_interface-method_name    = 'SET_STRICT_N'.
+      IF xco_api->method_exists_in_interface(
+           interface_name = method_exists_in_interface-interface_name
+           method_name    = method_exists_in_interface-method_name
+         ).
+        CALL METHOD lo_specification->(method_exists_in_interface-method_name)
+          EXPORTING
+            iv_n = zdmo_cl_rap_node=>strict_mode_2.
+        APPEND 'SET_STRICT_N' TO call_method_succeeded_list.
+        method_exists_in_interface-method_exists = abap_true.
+      ELSE.
+        method_exists_in_interface-method_exists = abap_false.
+      ENDIF.
+      APPEND method_exists_in_interface TO method_exists_in_interfaces.
+      "set_strict_n not found
+      "try to set strict
+      IF method_exists_in_interface-method_exists = abap_false.
+        method_exists_in_interface-method_name    = 'SET_STRICT'.
+        IF xco_api->method_exists_in_interface(
+             interface_name = method_exists_in_interface-interface_name
+             method_name    = method_exists_in_interface-method_name
+           ).
+          CALL METHOD lo_specification->(method_exists_in_interface-method_name).
+          APPEND 'SET_STRICT' TO call_method_succeeded_list.
+          method_exists_in_interface-method_exists = abap_true.
+        ELSE.
+          method_exists_in_interface-method_exists = abap_false.
+        ENDIF.
+        APPEND method_exists_in_interface TO method_exists_in_interfaces.
+      ENDIF.
+    ENDIF.
+
+    DATA(lo_header_behavior) = lo_specification->add_behavior( io_rap_bo_node->rap_node_objects-cds_view_p ).
+
+    " Characteristics.
+
+    " Characteristics.
+    DATA(header_characteristics) = lo_header_behavior->characteristics.
+
+    IF io_rap_bo_node->is_extensible(  ) = abap_true.
+      header_characteristics->set_extensible(  ).
+    ENDIF.
+
+    lo_header_behavior->characteristics->set_alias( CONV #( io_rap_bo_node->rap_node_objects-alias )
+      ).
+
+    lo_header_behavior->characteristics->etag->set_use(  ) .
+
+    IF io_rap_bo_node->draft_enabled = abap_true.
+
+      "add the following actions in case draft is used
+      "follows the strict implementation principle
+      "use action Activate;
+      "use action Discard;
+      "use action Edit;
+      "use action Prepare;
+      "use action Resume;
+
+      xco_api->todo( 'check if the following statements shall be executed or only if the following method exists' ).
+*      IF xco_api->method_exists_in_interface(
+*                     interface_name = 'if_xco_gen_bdef_s_fo_b_action '
+*                     method_name    = 'set_draft'
+*                   ).
+
+      lo_header_behavior->add_action( 'Edit' )->set_use( ) ##no_text.
+      lo_header_behavior->add_action( 'Activate' )->set_use( ) ##no_text.
+      lo_header_behavior->add_action( 'Discard' )->set_use( ) ##no_text.
+      lo_header_behavior->add_action( 'Resume' )->set_use( ) ##no_text.
+      lo_header_behavior->add_action( 'Prepare' )->set_use( ) ##no_text.
+
+
+    ENDIF.
+
+    " Standard operations.
+    IF io_rap_bo_node->is_virtual_root(  ) .
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ).
+    ELSE.
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->create )->set_use( ).
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ).
+      lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete )->set_use( ).
+    ENDIF.
+
+    IF io_rap_bo_node->is_virtual_root(  ) = abap_true AND io_rap_bo_node->is_customizing_table = abap_true.
+      "use action selectTransport;
+      lo_header_behavior->add_action( iv_name = 'selectTransport' )->set_use( ).
+    ENDIF.
+
+
+    "use action Edit;
+    "if the Edit function is defined there is no need to implement a BIL
+    "IF io_rap_bo_node->draft_enabled = abap_true.
+    "  lo_header_behavior->add_action( iv_name = 'Edit' )->set_use( ).
+    "ENDIF.
+
+    IF io_rap_bo_node->has_childs(  ).
+
+      LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode).
+        DATA(assoc) =  lo_header_behavior->add_association( '_' && lo_childnode->rap_node_objects-alias ).
+        assoc->set_create_enabled( abap_true ).
+        assoc->set_use(  ).
+        assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+      ENDLOOP.
+
+      LOOP AT io_rap_bo_node->all_childnodes INTO lo_childnode.
+
+        DATA(lo_item_behavior) = lo_specification->add_behavior( lo_childnode->rap_node_objects-cds_view_p ).
+
+        " Characteristics.
+        lo_item_behavior->characteristics->set_alias( CONV #( lo_childnode->rap_node_objects-alias )
+          ).
+
+        " Characteristics.
+        DATA(item_characteristics) = lo_item_behavior->characteristics.
+
+        IF io_rap_bo_node->is_extensible(  ) = abap_true.
+          item_characteristics->set_extensible(  ).
+        ENDIF.
+
+        lo_item_behavior->characteristics->etag->set_use(  ) .
+
+        " Standard operations.
+        lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ).
+        lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete )->set_use( ).
+
+        "add association to parent and root views
+        "e.g. use association _Travel { with draft; }
+
+        IF lo_childnode->is_grand_child_or_deeper(  ).
+
+          "publish association to root
+          assoc = lo_item_behavior->add_association(  '_' && lo_childnode->root_node->rap_node_objects-alias ).
+          assoc->set_use( ).
+          assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+
+          "publish association to parent
+          assoc = lo_item_behavior->add_association(  '_' && lo_childnode->parent_node->rap_node_objects-alias ).
+          assoc->set_use( ).
+          assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+
+        ELSEIF lo_childnode->is_child( ).
+          "lo_item_behavior->add_association(  mo_assoc_to_header )->set_use(  ).
+          "'_' && lo_childnode->parent_node->rap_node_objects-alias
+
+          "publish association to parent
+          assoc = lo_item_behavior->add_association(  '_' && lo_childnode->parent_node->rap_node_objects-alias ).
+          assoc->set_use(  ).
+          assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+        ELSE.
+
+          "for a root node nothing has to be added here
+
+        ENDIF.
+
+        "publish draft enabled associations to all child nodes of node
+        "e.g. use association _Booking { create; with draft; }
+
+        IF lo_childnode->has_childs(  ).
+          LOOP AT lo_childnode->childnodes INTO DATA(lo_grandchildnode).
+            assoc = lo_item_behavior->add_association( iv_name = '_' && lo_grandchildnode->rap_node_objects-alias ).
+            assoc->set_create_enabled(  ).
+            assoc->set_use(  ).
+            assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ).
+          ENDLOOP.
+        ENDIF.
+
+      ENDLOOP.
+
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD create_bil.
+**********************************************************************
+** Begin of deletion 2020
+**********************************************************************
+
+    DATA  source_method_save_modified  TYPE if_xco_gen_clas_s_fo_i_method=>tt_source  .
+    DATA  source_method_validation  TYPE if_xco_gen_clas_s_fo_i_method=>tt_source  .
+    DATA  source_method_get_inst_feat TYPE if_xco_gen_clas_s_fo_i_method=>tt_source  .
+    DATA  source_action_set_transport TYPE if_xco_gen_clas_s_fo_i_method=>tt_source  .
+    DATA  source_method_determ_object_id TYPE if_xco_gen_clas_s_fo_i_method=>tt_source  .
+    DATA  source_code_line LIKE LINE OF source_method_save_modified.
+
+    DATA handler_has_method TYPE abap_bool.
+    DATA saver_has_method TYPE abap_bool.
+
+    DATA  local_handler_class_name TYPE sxco_ao_object_name.
+    DATA local_saver_class_name   TYPE sxco_ao_object_name.
+
+    handler_has_method = abap_false.
+    saver_has_method = abap_false.
+
+    local_handler_class_name = |lhc_{ io_rap_bo_node->entityname }| .
+    local_saver_class_name = 'LCL_SAVER' .
+
+    DATA(lo_specification) = mo_put_operation->for-clas->add_object(  io_rap_bo_node->rap_node_objects-behavior_implementation
+                                    )->set_package( mo_package
+                                    )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-behavior_implementation.
+    generated_repository_object-object_type = 'CLAS'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+
+    lo_specification->set_short_description( 'Behavior implementation' ) ##no_text.
+
+    "behavior has to be defined for the root node in all BIL classes
+    "to_upper( ) as workaround for 2011 and 2020, fix will be available with 2102
+    lo_specification->definition->set_abstract(
+      )->set_for_behavior_of( to_upper( io_rap_bo_node->root_node->rap_node_objects-cds_view_r ) ).
+
+*    DATA(lo_handler) = lo_specification->add_local_class( 'LCL_HANDLER' ).
+*    lo_handler->definition->set_superclass( 'CL_ABAP_BEHAVIOR_HANDLER' ).
+
+    "a local class will only be created if there are methods
+    "that are generated as well
+    "otherwise we get the error
+    "The BEHAVIOR class "LCL_HANDLER" does not contain the BEHAVIOR method "MODIFY | READ".
+
+
+    DATA(lo_handler) = lo_specification->add_local_class( local_handler_class_name ).
+    lo_handler->definition->set_superclass( 'CL_ABAP_BEHAVIOR_HANDLER' ).
+
+**********************************************************************
+** Begin of deletion 2108
+**********************************************************************
+    IF xco_api->method_exists_in_interface(
+             interface_name = 'if_xco_gen_clas_s_fo_d_c_m_bi'
+             method_name    = 'SET_FOR_GLOBAL_AUTHORIZATION'
+           ).
+      IF io_rap_bo_node->is_root(  ). " method get_global_authorizations
+
+        DATA(lo_get_global_auth) = lo_handler->definition->section-private->add_method( method_get_glbl_authorizations ).
+        DATA(behavior_implementation) = lo_get_global_auth->behavior_implementation.
+        behavior_implementation->set_result( iv_result = 'result' ).
+        CALL METHOD behavior_implementation->('SET_FOR_GLOBAL_AUTHORIZATION').
+        DATA(lo_request) = lo_get_global_auth->add_importing_parameter( ' ' ).
+        DATA(behavior_implementation_2) = lo_request->behavior_implementation.
+        behavior_implementation_2->set_for( iv_for = io_rap_bo_node->entityname ).
+        CALL METHOD behavior_implementation_2->('SET_REQUEST')
+          EXPORTING
+            iv_request = 'requested_authorizations'.
+
+        lo_handler->implementation->add_method( method_get_glbl_authorizations ).
+        handler_has_method = abap_true.
+      ENDIF.
+    ENDIF.
+
+**********************************************************************
+** End of deletion 2108
+**********************************************************************
+
+    IF io_rap_bo_node->is_virtual_root(  ).
+
+      " method get_instance_features.
+      DATA(lo_get_features) = lo_handler->definition->section-private->add_method( method_get_instance_features ).
+      DATA(behavior_implementation_3) =  lo_get_features->behavior_implementation.
+      behavior_implementation_3->set_result( iv_result = 'result' ).
+
+      CALL METHOD behavior_implementation_3->('SET_FOR_INSTANCE_FEATURES').
+
+      DATA(lo_keys) = lo_get_features->add_importing_parameter( iv_name = 'keys' ).
+
+      DATA(behavior_implementation_4) = lo_keys->behavior_implementation.
+      behavior_implementation_4->set_for( iv_for = io_rap_bo_node->entityname ).
+      CALL METHOD behavior_implementation_4->('SET_REQUEST')
+        EXPORTING
+          iv_request = 'requested_features'.
+
+      lo_handler->implementation->add_method( method_get_instance_features ).
+      handler_has_method = abap_true.
+
+      CLEAR  source_method_get_inst_feat.
+      APPEND |READ ENTITIES OF { io_rap_bo_node->rap_root_node_objects-behavior_definition_r } IN LOCAL MODE| TO  source_method_get_inst_feat ##no_text.
+      APPEND |ENTITY { io_rap_bo_node->entityname }| TO  source_method_get_inst_feat ##no_text.
+      APPEND |ALL FIELDS WITH CORRESPONDING #( keys )| TO  source_method_get_inst_feat  ##no_text.
+      APPEND |RESULT DATA(all).| TO  source_method_get_inst_feat  ##no_text.
+
+      APPEND |result = VALUE #( ( %tky = all[ 1 ]-%tky| TO  source_method_get_inst_feat  ##no_text.
+      APPEND |                    %action-selecttransport = COND #( WHEN all[ 1 ]-%is_draft = if_abap_behv=>mk-on THEN if_abap_behv=>mk-off| TO  source_method_get_inst_feat  ##no_text.
+      APPEND |                                                      ELSE if_abap_behv=>mk-on  )   ) ).| TO  source_method_get_inst_feat  ##no_text.
+
+      lo_handler->implementation->add_method( method_get_instance_features )->set_source( source_method_get_inst_feat ).
+
+      DATA lv_action_name   TYPE sxco_bdef_action_name    .
+      lv_action_name = 'selectTransport'  ##no_text.
+
+      DATA(lo_transport) = lo_handler->definition->section-private->add_method( CONV #( lv_action_name ) ).
+      lo_transport->behavior_implementation->set_for_modify( ).
+
+      DATA(lo_keys_transport)  = lo_transport->add_importing_parameter( iv_name = 'keys' ).
+      lo_keys_transport->behavior_implementation->set_for_action(
+        EXPORTING
+          iv_entity_name = io_rap_bo_node->entityname
+          iv_action_name = lv_action_name
+*  RECEIVING
+*         ro_me          =
+      ).
+      lo_transport->behavior_implementation->set_result( iv_result = 'result' ).
+
+
+      APPEND    |MODIFY ENTITIES OF { io_rap_bo_node->rap_root_node_objects-behavior_definition_r } IN LOCAL MODE| TO source_action_set_transport  ##no_text.
+      APPEND    |ENTITY { io_rap_bo_node->entityname }| TO source_action_set_transport ##no_text.
+      APPEND    |UPDATE FIELDS ( request hidetransport )| TO source_action_set_transport ##no_text.
+      APPEND    |WITH VALUE #( FOR key IN keys| TO source_action_set_transport ##no_text.
+      APPEND    |               ( %tky         = key-%tky| TO source_action_set_transport ##no_text.
+      APPEND    |                 request = key-%param-transportrequestid| TO source_action_set_transport ##no_text.
+      APPEND    |                 hidetransport = abap_false ) )| TO source_action_set_transport ##no_text.
+      APPEND    |    FAILED failed| TO source_action_set_transport ##no_text.
+      APPEND    |    REPORTED reported.| TO source_action_set_transport ##no_text.
+      APPEND    | | TO source_action_set_transport ##no_text.
+      APPEND    | | TO source_action_set_transport ##no_text.
+      APPEND    |    READ ENTITIES OF { io_rap_bo_node->rap_root_node_objects-behavior_definition_r }  IN LOCAL MODE| TO source_action_set_transport ##no_text.
+      APPEND    |      ENTITY { io_rap_bo_node->entityname }| TO source_action_set_transport ##no_text.
+      APPEND    |        ALL FIELDS WITH CORRESPONDING #( keys )| TO source_action_set_transport ##no_text.
+      APPEND    |      RESULT DATA(singletons).| TO source_action_set_transport ##no_text.
+      APPEND    |    result = VALUE #( FOR singleton IN singletons| TO source_action_set_transport ##no_text.
+      APPEND    |                        ( %tky   = singleton-%tky| TO source_action_set_transport ##no_text.
+      APPEND    |                          %param = singleton ) ).| TO source_action_set_transport ##no_text.
+
+      lo_handler->implementation->add_method( CONV #( lv_action_name ) )->set_source( source_action_set_transport ).
+      handler_has_method = abap_true.
+    ENDIF.
+
+
+
+    "add validations of transports
+    IF io_rap_bo_node->is_customizing_table = abap_true AND
+       io_rap_bo_node->is_virtual_root(  ) = abap_false.
+
+      "SELECT * FROM @io_rap_bo_node->lt_fields AS fields WHERE name  = @io_rap_bo_node->field_name-uuid INTO TABLE @DATA(result_uuid).
+
+      SELECT * FROM @io_rap_bo_node->lt_fields AS fields WHERE key_indicator  = @abap_true
+                                                           AND name <> @io_rap_bo_node->field_name-client INTO TABLE @DATA(key_fields).
+
+      DATA(lv_validation_name) = |val_transport| .
+
+      DATA(lo_val) = lo_handler->definition->section-private->add_method( CONV #( lv_validation_name ) ).
+      DATA(behavior_implementation_val) = lo_val->behavior_implementation.
+      CALL METHOD behavior_implementation_val->('SET_FOR_VALIDATE_ON_SAVE').
+      DATA(lo_keys_validation) = lo_val->add_importing_parameter( iv_name = 'keys' ).
+      lo_keys_validation->behavior_implementation->set_for( iv_for = | { io_rap_bo_node->entityname }~{ lv_validation_name } | ).
+
+      CLEAR source_method_validation.
+      "      APPEND |CHECK lines( keys ) > 0.| TO source_method_validation.
+
+      APPEND |DATA change TYPE REQUEST FOR CHANGE { io_rap_bo_node->root_node->rap_root_node_objects-behavior_definition_r }.| TO source_method_validation ##no_text.
+      APPEND |SELECT SINGLE request FROM { io_rap_bo_node->root_node->draft_table_name } INTO @DATA(request).| TO source_method_validation ##no_text.
+      APPEND |DATA(rap_transport_api) = mbc_cp_api=>rap_table_cts( table_entity_relations = VALUE #(| TO source_method_validation ##no_text.
+      LOOP AT io_rap_bo_node->root_node->all_childnodes INTO DATA(childnode).
+        APPEND |                                             ( entity = '{ childnode->entityname }' table = '{ to_upper( childnode->table_name ) }' )| TO source_method_validation ##no_text.
+      ENDLOOP.
+      APPEND |                                                                       ) ).| TO source_method_validation ##no_text.
+
+      APPEND |rap_transport_api->validate_changes(| TO source_method_validation ##no_text.
+      APPEND |    transport_request = request| TO source_method_validation ##no_text.
+      APPEND |    table             = '{ to_upper( io_rap_bo_node->table_name ) }'| TO source_method_validation ##no_text.
+      APPEND |    keys              = REF #( keys )| TO source_method_validation ##no_text.
+      APPEND |    reported          = REF #( reported )| TO source_method_validation ##no_text.
+      APPEND |    failed            = REF #( failed )| TO source_method_validation ##no_text.
+      APPEND |    change            = REF #( change-{ io_rap_bo_node->entityname } ) ).| TO source_method_validation ##no_text.
+
+
+      lo_handler->implementation->add_method( CONV #( lv_validation_name ) )->set_source( source_method_validation ).
+      handler_has_method = abap_true.
+    ENDIF.
+
+    "add local saver class to record customizing data
+    IF io_rap_bo_node->is_customizing_table = abap_true AND
+       io_rap_bo_node->is_root(  ) = abap_true.
+
+      DATA(lo_saver) = lo_specification->add_local_class( local_saver_class_name ).
+      lo_saver->definition->set_superclass( 'CL_ABAP_BEHAVIOR_SAVER' ).
+
+      lo_saver->definition->section-protected->add_method( cleanup_finalize )->set_redefinition( ).
+      lo_saver->implementation->add_method( cleanup_finalize ).
+
+
+      lo_saver->definition->section-protected->add_method( method_save_modified )->set_redefinition( ).
+
+      CLEAR source_method_save_modified.
+      " APPEND |   | TO source_method_save_modified.
+
+
+      APPEND |READ TABLE update-{ io_rap_bo_node->entityname } INDEX 1 INTO DATA(all).| TO source_method_save_modified  ##no_text.
+      APPEND |SELECT SINGLE request FROM { io_rap_bo_node->root_node->draft_table_name } INTO @DATA(request).| TO source_method_save_modified ##no_text.
+      APPEND |DATA(result) = mbc_cp_api=>rap_table_cts( table_entity_relations = VALUE #(| TO source_method_save_modified ##no_text.
+      LOOP AT io_rap_bo_node->all_childnodes INTO DATA(child_node).
+        APPEND |                                                                        ( entity = '{ child_node->entityname }' table = '{ child_node->table_name }' )| TO source_method_save_modified  ##no_text.
+      ENDLOOP.
+      APPEND |                                                                          ) ).| TO source_method_save_modified  ##no_text.
+
+
+      APPEND |IF all-request IS NOT INITIAL.| TO source_method_save_modified ##no_text.
+      APPEND |  result->record_changes(| TO source_method_save_modified ##no_text.
+      APPEND |    EXPORTING| TO source_method_save_modified ##no_text.
+      APPEND |      transport_request = request| TO source_method_save_modified  ##no_text.
+      APPEND |      create            = REF #( create )| TO source_method_save_modified ##no_text.
+      APPEND |      update            = REF #( update )| TO source_method_save_modified ##no_text.
+      APPEND |      delete            = REF #( delete )| TO source_method_save_modified ##no_text.
+      APPEND |  ).| TO source_method_save_modified ##no_text.
+      APPEND |ENDIF.| TO source_method_save_modified ##no_text.
+
+      lo_saver->implementation->add_method( method_save_modified )->set_source( source_method_save_modified ).
+
+    ENDIF.
+
+**********************************************************************
+** End of deletion 2020
+**********************************************************************
+
+    "in case of a semantic key scenario the keys are set externally
+
+
+    CASE io_rap_bo_node->get_implementation_type(  ).
+      WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+
+        DATA cba_method_name  TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  .
+        DATA rba_method_name  TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name  .
+
+        "method determination
+        DATA(lv_determination_name) = |Calculate{ io_rap_bo_node->object_id_cds_field_name }|  ##no_text.
+
+        DATA(lo_det) = lo_handler->definition->section-private->add_method( CONV #( lv_determination_name ) ).
+        DATA(Behavior_implementation_det) = lo_det->behavior_implementation.
+        CALL METHOD Behavior_implementation_det->('SET_FOR_DETERMINE_ON_SAVE').
+
+        DATA(lo_keys_determination) = lo_det->add_importing_parameter( iv_name = 'keys' ).
+        lo_keys_determination->behavior_implementation->set_for( iv_for = | { io_rap_bo_node->entityname }~{ lv_determination_name } | ).
+
+
+        " add dummy implementation to calculate object_id
+        CLEAR  source_method_determ_object_id.
+        DATA cm TYPE c LENGTH 1.
+        cm = | |.
+        IF io_rap_bo_node->is_root(  ) = abap_true.
+
+          APPEND cm && |READ ENTITIES OF { io_rap_bo_node->rap_root_node_objects-behavior_definition_r } IN LOCAL MODE| TO  source_method_determ_object_id ##no_text.
+          APPEND cm && |  ENTITY { io_rap_bo_node->entityname }| TO  source_method_determ_object_id ##no_text.
+          APPEND cm && |    ALL FIELDS WITH CORRESPONDING #( keys )| TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |  RESULT DATA(entities).| TO  source_method_determ_object_id  ##no_text.
+*
+          APPEND cm && |DELETE entities WHERE { io_rap_bo_node->object_id_cds_field_name } IS NOT INITIAL.| TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |Check entities is not initial.                 | TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |"Dummy logic to determine object_id                | TO  source_method_determ_object_id  ##no_text.
+
+          "active table
+          APPEND cm && |SELECT MAX( { io_rap_bo_node->object_id } ) FROM { io_rap_bo_node->table_name } INTO @DATA(max_object_id). | TO  source_method_determ_object_id  ##no_text.
+
+          APPEND cm && |"Add support for draft if used in modify                | TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |"SELECT SINGLE FROM FROM { io_rap_bo_node->draft_table_name } FIELDS MAX( { io_rap_bo_node->object_id_cds_field_name } ) INTO @DATA(max_orderid_draft). "draft table | TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |"if max_orderid_draft > max_object_id | TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |" max_object_id = max_orderid_draft. | TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |"ENDIF. | TO  source_method_determ_object_id  ##no_text.
+
+          APPEND cm && |MODIFY ENTITIES OF { io_rap_bo_node->rap_root_node_objects-behavior_definition_r } IN LOCAL MODE| TO  source_method_determ_object_id ##no_text.
+          APPEND cm && |  ENTITY { io_rap_bo_node->entityname }| TO  source_method_determ_object_id ##no_text.
+          APPEND cm && |    UPDATE FIELDS ( { io_rap_bo_node->object_id_cds_field_name } )| TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |      WITH VALUE #( FOR entity IN entities INDEX INTO i ( | TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |      %tky          = entity-%tky | TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |      { io_rap_bo_node->object_id_cds_field_name }     = max_object_id + i | TO  source_method_determ_object_id  ##no_text.
+          APPEND cm && |) ). | TO  source_method_determ_object_id  ##no_text.
+
+        ENDIF.
+
+        lo_handler->implementation->add_method( CONV #( lv_determination_name ) )->set_source( source_method_determ_object_id ).
+        handler_has_method = abap_true.
+
+
+      WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic.
+
+        IF io_rap_bo_node->is_root(  ).
+          DATA(lo_method) = lo_handler->definition->section-private->add_method( method_create ).
+          lo_method->behavior_implementation->set_for_modify(  ).
+          DATA(lo_import_parameter) = lo_method->add_importing_parameter( iv_name = 'entities' ).
+          lo_import_parameter->behavior_implementation->set_for_create( iv_entity_name = | { io_rap_bo_node->entityname } | ).
+          lo_handler->implementation->add_method( method_create ).
+          handler_has_method = abap_true.
+        ENDIF.
+
+        lo_method = lo_handler->definition->section-private->add_method( method_update ).
+        lo_method->behavior_implementation->set_for_modify(  ).
+        lo_import_parameter = lo_method->add_importing_parameter( iv_name = 'entities' ).
+        lo_import_parameter->behavior_implementation->set_for_update( iv_entity_name = | { io_rap_bo_node->entityname } | ).
+        lo_handler->implementation->add_method( method_update ).
+        handler_has_method = abap_true.
+
+        lo_method = lo_handler->definition->section-private->add_method( method_delete ).
+        lo_method->behavior_implementation->set_for_modify(  ).
+        lo_import_parameter = lo_method->add_importing_parameter( iv_name = 'keys' ).
+        lo_import_parameter->behavior_implementation->set_for_delete( iv_entity_name = | { io_rap_bo_node->entityname } | ).
+        lo_handler->implementation->add_method( method_delete ).
+        handler_has_method = abap_true.
+
+        IF io_rap_bo_node->is_root(  ).
+          lo_method = lo_handler->definition->section-private->add_method( method_lock ).
+          lo_method->behavior_implementation->set_for_lock(  ).
+          lo_import_parameter = lo_method->add_importing_parameter( iv_name = 'keys' ).
+          lo_import_parameter->behavior_implementation->set_for_lock( iv_entity_name = | { io_rap_bo_node->entityname } | ).
+          lo_handler->implementation->add_method( method_lock ).
+          handler_has_method = abap_true.
+        ENDIF.
+
+        lo_method = lo_handler->definition->section-private->add_method( method_read ).
+        lo_method->behavior_implementation->set_for_read( )->set_result( 'result' ).
+        lo_import_parameter = lo_method->add_importing_parameter( iv_name = 'keys' ).
+        lo_import_parameter->behavior_implementation->set_for_read( iv_entity_name = | { io_rap_bo_node->entityname } | ).
+        lo_handler->implementation->add_method( method_read ).
+        handler_has_method = abap_true.
+
+        IF io_rap_bo_node->is_child(  ) = abap_true OR
+           io_rap_bo_node->is_grand_child_or_deeper(  ) = abap_true.
+
+          rba_method_name = |{ method_rba }_{ io_rap_bo_node->parent_node->entityname }|.
+          lo_method = lo_handler->definition->section-private->add_method( rba_method_name ).
+          lo_method->behavior_implementation->set_for_read(  )->set_result( 'result' )->set_link( 'association_links'  )->set_full( 'result_requested' ).
+          lo_import_parameter = lo_method->add_importing_parameter( iv_name = |keys_{ method_rba } | ).
+          lo_import_parameter->behavior_implementation->set_for_read( iv_entity_name = | { io_rap_bo_node->entityname }\\_{ io_rap_bo_node->parent_node->entityname } | ).
+          lo_handler->implementation->add_method( rba_method_name ).
+          handler_has_method = abap_true.
+
+        ENDIF.
+
+        LOOP AT io_rap_bo_node->childnodes INTO childnode.
+
+          lo_method = lo_handler->definition->section-private->add_method( |{ method_cba }_{ childnode->entityname }| ).
+          lo_method->behavior_implementation->set_for_modify(  ).
+          lo_import_parameter = lo_method->add_importing_parameter( iv_name = |entities_{ method_cba } | ).
+          lo_import_parameter->behavior_implementation->set_for_create( iv_entity_name = | { io_rap_bo_node->entityname }\\_{ childnode->entityname } | ).
+          lo_handler->implementation->add_method( |{ method_cba }_{ childnode->entityname }| ).
+          handler_has_method = abap_true.
+
+          rba_method_name = |{ method_rba }_{ childnode->entityname }|.
+          lo_method = lo_handler->definition->section-private->add_method( rba_method_name ).
+          lo_method->behavior_implementation->set_for_read(  )->set_result( 'result' )->set_link( 'association_links'  )->set_full( 'result_requested' ).
+          lo_import_parameter = lo_method->add_importing_parameter( iv_name = |keys_{ method_rba } | ).
+          lo_import_parameter->behavior_implementation->set_for_read( iv_entity_name = | { io_rap_bo_node->entityname }\\_{ childnode->entityname } | ).
+          lo_handler->implementation->add_method( rba_method_name ).
+          handler_has_method = abap_true.
+
+        ENDLOOP.
+
+        IF io_rap_bo_node->is_root(  ).
+          lo_saver = lo_specification->add_local_class( |LCL_{ io_rap_bo_node->rap_root_node_objects-behavior_definition_r }| ).
+          lo_saver->definition->set_superclass( 'CL_ABAP_BEHAVIOR_SAVER' ).
+          saver_has_method = abap_true.
+
+          lo_saver->definition->section-protected->add_method( method_finalize )->set_redefinition( ).
+          lo_saver->implementation->add_method( method_finalize ).
+
+          lo_saver->definition->section-protected->add_method( method_check_before_save )->set_redefinition( ).
+          lo_saver->implementation->add_method( method_check_before_save ).
+
+          lo_saver->definition->section-protected->add_method( method_save )->set_redefinition( ).
+          lo_saver->implementation->add_method( method_save ).
+
+          lo_saver->definition->section-protected->add_method( method_cleanup )->set_redefinition( ).
+          lo_saver->implementation->add_method( method_cleanup ).
+
+          lo_saver->definition->section-protected->add_method( method_cleanup_finalize )->set_redefinition( ).
+          lo_saver->implementation->add_method( method_cleanup_finalize ).
+        ENDIF.
+    ENDCASE.
+
+
+    DATA(implementation) = lo_handler->implementation.
+
+    DATA(definition) = lo_handler->definition.
+
+    "remove implementation if no method is there
+    IF handler_has_method = abap_false AND lo_handler IS NOT INITIAL.
+      lo_specification->remove_local_class( local_handler_class_name ).
+    ENDIF.
+    IF saver_has_method = abap_false AND lo_saver IS NOT INITIAL.
+      lo_specification->remove_local_class( local_saver_class_name ).
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD create_condition.
+
+    DATA lo_expression TYPE REF TO if_xco_ddl_expr_condition.
+
+    LOOP AT it_condition_components INTO DATA(ls_condition_components).
+      DATA(lo_projection_field) = xco_cp_ddl=>field( ls_condition_components-projection_field )->of_projection( ).
+      DATA(lo_association_field) = xco_cp_ddl=>field( ls_condition_components-association_field )->of( CONV #( ls_condition_components-association_name ) ).
+
+      DATA(lo_condition) = lo_projection_field->eq( lo_association_field ).
+
+      IF lo_expression IS INITIAL.
+        lo_expression = lo_condition.
+      ELSE.
+        lo_expression = lo_expression->and( lo_condition ).
+      ENDIF.
+
+      ro_expression = lo_expression.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD create_control_structure.
+
+    DATA lv_control_structure_name TYPE sxco_ad_object_name .
+    lv_control_structure_name = to_upper( io_rap_bo_node->rap_node_objects-control_structure ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = lv_control_structure_name.
+    generated_repository_object-object_type = 'TABL'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    DATA(lo_specification) = mo_put_operation->for-tabl-for-structure->add_object(  lv_control_structure_name
+     )->set_package( mo_package
+     )->create_form_specification( ).
+
+    "create a view entity
+    lo_specification->set_short_description( |Control structure for { io_rap_bo_node->rap_node_objects-alias }| ) ##no_text.
+
+    LOOP AT io_rap_bo_node->lt_fields  INTO  DATA(ls_header_fields) WHERE  key_indicator  <> abap_true AND name IS NOT INITIAL.
+      lo_specification->add_component( ls_header_fields-name
+         )->set_type( xco_cp_abap_dictionary=>data_element( 'xsdboolean' ) ).
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD create_custom_entity.
+**********************************************************************
+** Begin of deletion 2020
+**********************************************************************
+    DATA ls_condition_components TYPE ts_condition_components.
+    DATA lt_condition_components TYPE tt_condition_components.
+    DATA lo_field TYPE REF TO if_xco_gen_ddls_s_fo_field .
+    DATA pos TYPE i.
+
+    DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-custom_entity
+     )->set_package( mo_package
+     )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-custom_entity.
+    generated_repository_object-object_type = 'DDLS'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    "create a custom entity
+    DATA(lo_view) = lo_specification->set_short_description( |CDS View for { io_rap_bo_node->rap_node_objects-alias  }|
+      )->add_custom_entity( ) ##no_text.
+
+    " Annotations can be added to custom entities.
+    lo_view->add_annotation( 'ObjectModel.query.implementedBy' )->value->build( )->add_string( |ABAP:{ to_upper( io_rap_bo_node->rap_node_objects-custom_query_impl_class ) }| ).
+
+    "@ObjectModel.query.implementedBy:'ABAP:ZDMO_CL_TRAVEL_UQ'
+
+    "in contrast to MDE the annotations are not added to the specification but to the view
+    add_annotation_ui_header(
+      EXPORTING
+        io_specification = lo_view
+        io_rap_bo_node   = io_rap_bo_node
+    ).
+
+
+
+    "Client field does not need to be specified in client-specific CDS view
+
+    CLEAR pos.
+
+    LOOP AT io_rap_bo_node->lt_fields  INTO  DATA(ls_header_fields) WHERE  name  <> io_rap_bo_node->field_name-client . "   co_client.
+
+      pos += 10.
+
+      IF ls_header_fields-key_indicator = abap_true.
+        lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field )
+           )->set_key( ). "->set_alias(  ls_header_fields-cds_view_field  ).
+      ELSE.
+        lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field )
+           ). "->set_alias( ls_header_fields-cds_view_field ).
+      ENDIF.
+
+      IF ls_header_fields-is_data_element = abap_true.
+        lo_field->set_type( xco_cp_abap_dictionary=>data_element( ls_header_fields-data_element ) ).
+      ENDIF.
+      IF ls_header_fields-is_built_in_type = abAP_TRUE.
+        lo_field->set_type( xco_cp_abap_dictionary=>built_in_type->for(
+                                        iv_type     =  CONV #( ls_header_fields-built_in_type )
+                                        iv_length   = ls_header_fields-built_in_type_length
+                                        iv_decimals = ls_header_fields-built_in_type_decimals
+                                        ) ).
+      ENDIF.
+
+      "add @Semantics annotation for currency code
+      IF ls_header_fields-currencycode IS NOT INITIAL.
+        READ TABLE io_rap_bo_node->lt_fields INTO DATA(ls_field) WITH KEY name = to_upper( ls_header_fields-currencycode ).
+        IF sy-subrc = 0.
+          "for example @Semantics.amount.currencyCode: 'CurrencyCode'
+          lo_field->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ).
+        ENDIF.
+      ENDIF.
+
+      "add @Semantics annotation for unit of measure
+      IF ls_header_fields-unitofmeasure IS NOT INITIAL.
+        CLEAR ls_field.
+        READ TABLE io_rap_bo_node->lt_fields INTO ls_field WITH KEY name = to_upper( ls_header_fields-unitofmeasure ).
+        IF sy-subrc = 0.
+          "for example @Semantics.quantity.unitOfMeasure: 'QuantityUnit'
+          lo_field->add_annotation( 'Semantics.quantity.unitOfMeasure' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ).
+        ENDIF.
+      ENDIF.
+
+      CASE ls_header_fields-name.
+        WHEN io_rap_bo_node->field_name-created_at.
+          lo_field->add_annotation( 'Semantics.systemDateTime.createdAt' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-created_by.
+          lo_field->add_annotation( 'Semantics.user.createdBy' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-last_changed_at.
+          lo_field->add_annotation( 'Semantics.systemDateTime.lastChangedAt' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-last_changed_by.
+          lo_field->add_annotation( 'Semantics.user.lastChangedBy' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-local_instance_last_changed_at.
+          lo_field->add_annotation( 'Semantics.systemDateTime.localInstanceLastChangedAt' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-local_instance_last_changed_by.
+          lo_field->add_annotation( 'Semantics.user.localInstanceLastChangedBy' )->value->build( )->add_boolean( abap_true ).
+      ENDCASE.
+
+      "add UI annotations
+
+      "put facet annotation in front of the first field
+      IF pos = 10.
+        add_annotation_ui_facets(
+          EXPORTING
+            io_field       = lo_field
+            io_rap_bo_node = io_rap_bo_node
+        ).
+      ENDIF.
+      IF ls_header_fields-is_hidden = abap_true.
+        add_anno_ui_hidden(
+          EXPORTING
+            io_field         = lo_field
+            ls_header_fields = ls_header_fields
+        ).
+      ELSE.
+        add_anno_ui_lineitem(
+          EXPORTING
+            io_field         = lo_field
+            ls_header_fields = ls_header_fields
+            position         = pos
+        ).
+
+        add_anno_ui_identification(
+          EXPORTING
+            io_field         = lo_field
+            io_rap_bo_node   = io_rap_bo_node
+            ls_header_fields = ls_header_fields
+            position         = pos
+        ).
+
+        "add selection fields for semantic key fields or for the fields that are marked as object id
+        add_annotation_ui_selectionfld(
+          EXPORTING
+            io_field         = lo_field
+            io_rap_bo_node   = io_rap_bo_node
+            ls_header_fields = ls_header_fields
+            position         = pos
+        ).
+
+      ENDIF.
+
+    ENDLOOP.
+
+    IF io_rap_bo_node->is_root( ).
+      lo_view->set_root( ).
+    ELSE.
+
+      CASE io_rap_bo_node->get_implementation_type(  ) .
+
+        WHEN  ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic .
+
+          CLEAR ls_condition_components.
+          CLEAR lt_condition_components.
+
+          LOOP AT io_rap_bo_node->parent_node->semantic_key INTO DATA(ls_semantic_key).
+            ls_condition_components-association_name = '_' && io_rap_bo_node->parent_node->rap_node_objects-alias.
+            ls_condition_components-association_field = ls_semantic_key-cds_view_field.
+            ls_condition_components-projection_field = ls_semantic_key-cds_view_field.
+            APPEND ls_condition_components TO lt_condition_components.
+          ENDLOOP.
+
+          DATA(lo_condition) = create_condition( lt_condition_components ).
+
+      ENDCASE.
+
+      lo_field = lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias ) ).
+      lo_field->create_association( io_rap_bo_node->parent_node->rap_node_objects-custom_entity
+       " )->set_cardinality( xco_cp_cds=>cardinality->one_to_n
+        )->set_condition( lo_condition )->set_to_parent( ).
+
+      IF io_rap_bo_node->is_grand_child_or_deeper(  ).
+
+        CASE io_rap_bo_node->get_implementation_type(  ) .
+
+          WHEN  ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic .
+
+            CLEAR ls_condition_components.
+            CLEAR lt_condition_components.
+
+            LOOP AT io_rap_bo_node->ROOT_node->semantic_key INTO DATA(ls_root_semantic_key).
+              ls_condition_components-association_name = '_' && io_rap_bo_node->root_node->rap_node_objects-alias.
+              ls_condition_components-association_field = ls_root_semantic_key-cds_view_field.
+              ls_condition_components-projection_field = ls_root_semantic_key-cds_view_field.
+              APPEND ls_condition_components TO lt_condition_components.
+            ENDLOOP.
+
+            lo_condition = create_condition( lt_condition_components ).
+
+        ENDCASE.
+
+        lo_field = lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->root_node->rap_node_objects-alias ) ).
+        lo_field->create_association( io_rap_bo_node->root_node->rap_node_objects-custom_entity
+          )->set_cardinality( xco_cp_cds=>cardinality->one
+          )->set_condition( lo_condition ).
+
+      ENDIF.
+
+    ENDIF.
+
+    " Data source.
+
+    IF io_rap_bo_node->has_childs(  ).   " create_item_objects(  ).
+      " Composition.
+
+      "change to a new property "childnodes" which only contains the direct childs
+      LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode).
+
+        " Sample field with composition:
+        lo_field = lo_view->add_field( xco_cp_ddl=>field( '_' && lo_childnode->rap_node_objects-alias ) ).
+        lo_field->create_composition( lo_childnode->rap_node_objects-custom_entity
+       )->set_cardinality( xco_cp_cds=>cardinality->zero_to_n ).
+
+
+
+      ENDLOOP.
+
+    ENDIF.
+
+
+    "add associations
+
+    LOOP AT io_rap_bo_node->lt_association INTO DATA(ls_assocation).
+
+      CLEAR ls_condition_components.
+      CLEAR lt_condition_components.
+      LOOP AT ls_assocation-condition_components INTO DATA(ls_components).
+        ls_condition_components-association_field =  ls_components-association_field.
+        ls_condition_components-projection_field = ls_components-projection_field.
+        ls_condition_components-association_name = ls_assocation-name.
+        APPEND ls_condition_components TO lt_condition_components.
+      ENDLOOP.
+
+      lo_condition = create_condition( lt_condition_components ).
+
+      lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_assocation-name ) ).
+
+      DATA(lo_association) = lo_field->create_association( io_rap_bo_node->parent_node->rap_node_objects-cds_view_r
+       " )->set_cardinality( xco_cp_cds=>cardinality->one_to_n
+        )->set_condition( lo_condition ).
+
+      CASE ls_assocation-cardinality .
+        WHEN ZDMO_cl_rap_node=>cardinality-one.
+          lo_association->set_cardinality( xco_cp_cds=>cardinality->one ).
+        WHEN ZDMO_cl_rap_node=>cardinality-one_to_n.
+          lo_association->set_cardinality( xco_cp_cds=>cardinality->one_to_n ).
+        WHEN ZDMO_cl_rap_node=>cardinality-zero_to_n.
+          lo_association->set_cardinality( xco_cp_cds=>cardinality->zero_to_n ).
+        WHEN ZDMO_cl_rap_node=>cardinality-zero_to_one.
+          lo_association->set_cardinality( xco_cp_cds=>cardinality->zero_to_one ).
+        WHEN ZDMO_cl_rap_node=>cardinality-one_to_one.
+          "@todo: currently association[1] will be generated
+          "fix available with 2008 HFC2
+          lo_association->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ) ).
+      ENDCASE.
+
+    ENDLOOP.
+
+    LOOP AT       io_rap_bo_node->lt_additional_fields INTO DATA(additional_fields) WHERE cds_restricted_reuse_view = abap_true.
+      lo_field = lo_view->add_field( xco_cp_ddl=>expression->for( additional_fields-name ) ).
+      IF additional_fields-cds_view_field IS NOT INITIAL.
+        lo_Field->set_alias( additional_fields-cds_view_field ).
+      ENDIF.
+    ENDLOOP.
+**********************************************************************
+** End of deletion 2020
+**********************************************************************
+  ENDMETHOD.
+
+
+  METHOD create_custom_query.
+
+
+    DATA source_method_select TYPE if_xco_gen_clas_s_fo_i_method=>tt_source .
+
+    DATA(lo_specification) = mo_put_operation->for-clas->add_object(  io_rap_bo_node->rap_node_objects-custom_query_impl_class
+                                    )->set_package( mo_package
+                                    )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-custom_query_impl_class.
+    generated_repository_object-object_type = 'CLAS'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    CLEAR source_method_select.
+
+    APPEND |DATA business_data TYPE TABLE OF { io_rap_bo_node->rap_node_objects-custom_entity }.  | TO source_method_select ##no_text.
+    APPEND |DATA query_result  TYPE TABLE OF { io_rap_bo_node->data_source_name }.  | TO source_method_select ##no_text.
+    APPEND |DATA total_number_of_records type int8.| TO source_method_select ##no_text.
+    APPEND |DATA(top)               = io_request->get_paging( )->get_page_size( ). | TO source_method_select ##no_text.
+    APPEND |DATA(skip)              = io_request->get_paging( )->get_offset( ).| TO source_method_select ##no_text.
+    APPEND |DATA(requested_fields)  = io_request->get_requested_elements( ).| TO source_method_select ##no_text.
+    APPEND |DATA(sort_order)        = io_request->get_sort_elements( ).| TO source_method_select ##no_text.
+    APPEND |TRY.| TO source_method_select ##no_text.
+    APPEND | DATA(filter_condition) = io_request->get_filter( )->get_as_ranges( ).| TO source_method_select ##no_text.
+    APPEND | DATA(filter_string) = io_request->get_filter( )->get_as_sql_string( ).| TO source_method_select ##no_text.
+    APPEND | "Here you have to implement your custom query| TO source_method_select ##no_text.
+    APPEND | "and store the result in the internal table query_result| TO source_method_select ##no_text.
+    IF io_rap_bo_node->lt_mapping IS NOT INITIAL.
+      APPEND | business_data = CORRESPONDING #( query_result MAPPING| TO source_method_select ##no_text.
+      LOOP AT io_rap_bo_node->lt_mapping INTO DATA(mapping_line).
+        APPEND | { mapping_line-cds_view_field } = { mapping_line-dbtable_field }| TO source_method_select ##no_text.
+      ENDLOOP.
+      APPEND |  ).| TO source_method_select ##no_text.
+    ENDIF.
+
+    APPEND |   | TO source_method_select ##no_text.
+
+    APPEND | IF top IS NOT INITIAL and top > 0.| TO source_method_select ##no_text.
+    APPEND |   DATA(max_index) = top + skip.| TO source_method_select ##no_text.
+    APPEND | ELSE. | TO source_method_select ##no_text.
+    APPEND |   max_index = 0. | TO source_method_select ##no_text.
+    APPEND | ENDIF. | TO source_method_select ##no_text.
+    APPEND | | TO source_method_select ##no_text.
+    APPEND | SELECT * FROM @business_data AS data_source_fields | TO source_method_select ##no_text.
+    APPEND |    WHERE (filter_string)| TO source_method_select ##no_text.
+    APPEND |    INTO TABLE @business_data| TO source_method_select ##no_text.
+    APPEND |    UP TO @max_index ROWS.| TO source_method_select ##no_text.
+    APPEND | | TO source_method_select ##no_text.
+    APPEND |   | TO source_method_select ##no_text.
+    APPEND | IF skip IS NOT INITIAL. | TO source_method_select ##no_text.
+    APPEND |   DELETE business_data TO skip.| TO source_method_select ##no_text.
+    APPEND | ENDIF.  | TO source_method_select ##no_text.
+    APPEND |   | TO source_method_select ##no_text.
+
+    APPEND | IF io_request->is_total_numb_of_rec_requested(  ).| TO source_method_select ##no_text.
+    APPEND |   io_response->set_total_number_of_records( lines( business_data ) ).| TO source_method_select ##no_text.
+    APPEND | ENDIF.| TO source_method_select ##no_text.
+    APPEND | io_response->set_data( business_data ).| TO source_method_select ##no_text.
+    APPEND |CATCH cx_root INTO DATA(exception).| TO source_method_select ##no_text.
+    APPEND |DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).| TO source_method_select ##no_text.
+    APPEND |ENDTRY.| TO source_method_select ##no_text.
+
+
+
+    lo_specification->set_short_description( 'Custom query implementation' ) ##no_text.
+    lo_specification->definition->add_interface( 'if_rap_query_provider' ).
+    lo_specification->implementation->add_method( |if_rap_query_provider~select|
+      )->set_source( source_method_select ) ##no_text.
+
+
+  ENDMETHOD.
+
+
+  METHOD create_draft_query_view.
+    DATA lo_field TYPE REF TO if_xco_gen_ddls_s_fo_field .
+
+    DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-draft_query_view
+     )->set_package( mo_package
+     )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-draft_query_view.
+    generated_repository_object-object_type = 'DDLS'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    "create a view entity
+    DATA(lo_view) = lo_specification->set_short_description( |Draft query view for { io_rap_bo_node->rap_node_objects-alias  }|
+      )->add_view_entity( ) ##no_text.
+
+    " Annotations.
+    lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ).
+    lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Draft query view for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text.
+    lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->draft_table_name ) ).
+    "add alias
+    lo_view->data_source->set_alias( io_rap_bo_node->entityname ).
+
+    DATA(viewEnhancementCategoryAnno) = lo_view->add_annotation( 'AbapCatalog.viewEnhancementCategory' )->value->build( )->begin_array(  ).
+    viewEnhancementCategoryAnno->add_enum( 'PROJECTION_LIST' ).
+    viewEnhancementCategoryAnno->end_array(  ).
+
+    add_anno_abap_catalog_ext(
+      io_view               = lo_view
+      i_allownewdatasources = abap_false
+      i_allownewcompositions = abap_false
+      i_elementsuffix       = io_rap_bo_node->extensibility_element_suffix
+      i_datasources         = io_rap_bo_node->entityname
+      i_maximumfields       = 100
+    ).
+
+*    DATA(lo_valuebuilder) = lo_view->add_annotation( 'AbapCatalog.extensibility' )->value->build( ).
+*
+*    DATA(lo_record) = lo_valuebuilder->begin_record(
+*        )->add_member( 'extensible' )->add_boolean( abap_true
+*        )->add_member( 'elementSuffix' )->add_string( 'ZAA'
+*        )->add_member( 'allowNewDatasources' )->add_boolean( abap_false
+*        ).
+*
+*    lo_record->add_member( 'dataSources' )->begin_array(  )->add_string( CONV #( io_rap_bo_node->entityname ) )->end_array( ).
+*    DATA(quota) = lo_record->add_member( 'quota' )->begin_record( ).
+*    quota->add_member( 'maximumFields' )->add_number( 100 ).
+*    quota->add_member( 'maximumBytes' )->add_number( 10000 ).
+*    quota->end_record(  ).
+*
+*    lo_valuebuilder->end_record( ).
+
+
+
+
+    LOOP AT io_rap_bo_node->lt_fields  INTO  DATA(ls_header_fields) WHERE name  <> io_rap_bo_node->field_name-client
+                                                                       AND key_indicator = abap_true . "   co_client.
+
+      lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field )
+               )->set_key( ).
+      lo_Field->set_alias( ls_header_fields-cds_view_field ).
+
+    ENDLOOP.
+
+    LOOP AT io_rap_bo_node->lt_fields  INTO  ls_header_fields WHERE name  <> io_rap_bo_node->field_name-client
+                                                                AND key_indicator = abap_false . "   co_client.
+
+      lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field ) ).
+      lo_Field->set_alias( ls_header_fields-cds_view_field ).
+
+    ENDLOOP.
+
+*      draftentitycreationdatetime   as Draftentitycreationdatetime,
+*      draftentitylastchangedatetime as Draftentitylastchangedatetime,
+*      draftadministrativedatauuid   as Draftadministrativedatauuid,
+*      draftentityoperationcode      as Draftentityoperationcode,
+*      hasactiveentity               as Hasactiveentity,
+*      draftfieldchanges             as Draftfieldchanges,
+*      dummy_field                   as DummyField
+    lo_field = lo_view->add_field( xco_cp_ddl=>field( 'draftentitycreationdatetime' ) )->set_alias( 'Draftentitycreationdatetime' ).
+    lo_field = lo_view->add_field( xco_cp_ddl=>field( 'draftentitylastchangedatetime' ) )->set_alias( 'Draftentitylastchangedatetime' ).
+    lo_field = lo_view->add_field( xco_cp_ddl=>field( 'draftadministrativedatauuid' ) )->set_alias( 'Draftadministrativedatauuid' ).
+    lo_field = lo_view->add_field( xco_cp_ddl=>field( 'draftentityoperationcode' ) )->set_alias( 'Draftentityoperationcode' ).
+    lo_field = lo_view->add_field( xco_cp_ddl=>field( 'hasactiveentity' ) )->set_alias( 'Hasactiveentity' ).
+    lo_field = lo_view->add_field( xco_cp_ddl=>field( 'draftfieldchanges' ) )->set_alias( 'Draftfieldchanges' ).
+
+    "dummy field should not be part of the draft query view
+    "lo_field = lo_view->add_field( xco_cp_ddl=>field( 'dummy_field' ) )->set_alias( 'DummyField' ).
+
+
+
+  ENDMETHOD.
+
+
+  METHOD create_extension_include.
+
+    DATA lv_extension_include_name TYPE sxco_ad_object_name .
+    lv_extension_include_name = to_upper( io_rap_bo_node->rap_node_objects-extension_include ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+
+    generated_repository_object-object_name = lv_extension_include_name.
+    generated_repository_object-object_type = 'STRU'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    "extension include must be added to draft table
+    "hence both objects have to be generated at the same time
+
+    DATA(lo_specification) = mo_draft_tabl_put_operation->for-tabl-for-structure->add_object(  lv_extension_include_name
+     )->set_package( mo_package
+     )->create_form_specification( ).
+
+    "create a view entity
+    lo_specification->set_short_description( |Extension include for { io_rap_bo_node->rap_node_objects-alias }| ) ##no_text.
+
+    lo_specification->add_component( zdmo_cl_rap_node=>dummy_field_name " 'dummy_field'
+       )->set_type( xco_cp_abap_dictionary=>built_in_type->char( 1 ) ).
+
+*    lo_specification->add_annotation( 'EndUserText.label' )->value->build(  )->add_s( iv_value =  abap_true ).
+
+    set_struct_enhancement_cat_any( lo_specification  ).
+
+*public instance method  set_enhancement_category
+*public instance method  set_field_suffix
+*public instance method  set_quota_maximum_bytes
+*public instance method  set_quota_maximum_fields
+
+*@AbapCatalog.enhancement.fieldSuffix : 'ZZG'
+*@AbapCatalog.enhancement.quotaMaximumFields : 500
+*@AbapCatalog.enhancement.quotaMaximumBytes : 8160
+    IF xco_api->on_premise_branch_is_used(  ).
+      method_exists_in_interface-interface_name = 'if_xco_gen_tabl_str_s_form '.
+    ELSE.
+      method_exists_in_interface-interface_name = 'if_xco_cp_gen_tabl_str_s_form '.
+    ENDIF.
+    method_exists_in_interface-method_name    = 'SET_FIELD_SUFFIX'.
+    IF xco_api->method_exists_in_interface(
+            interface_name = method_exists_in_interface-interface_name
+            method_name    = method_exists_in_interface-method_name
+          ).
+      CALL METHOD lo_specification->(method_exists_in_interface-method_name)
+        EXPORTING
+          iv_field_suffix = CONV char3( io_rap_bo_node->extensibility_element_suffix ).
+    ENDIF.
+    method_exists_in_interface-method_name    = 'SET_QUOTA_MAXIMUM_BYTES'.
+    IF xco_api->method_exists_in_interface(
+            interface_name = method_exists_in_interface-interface_name
+            method_name    = method_exists_in_interface-method_name
+          ).
+      CALL METHOD lo_specification->(method_exists_in_interface-method_name)
+        EXPORTING
+          iv_quota_maximum_bytes = 8160.
+    ENDIF.
+    method_exists_in_interface-method_name    = 'SET_QUOTA_MAXIMUM_FIELDS'.
+    IF xco_api->method_exists_in_interface(
+            interface_name = method_exists_in_interface-interface_name
+            method_name    = method_exists_in_interface-method_name
+          ).
+      CALL METHOD lo_specification->(method_exists_in_interface-method_name)
+        EXPORTING
+          iv_quota_maximum_fields = 500.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD create_extension_include_view.
+
+    DATA lo_field TYPE REF TO if_xco_gen_ddls_s_fo_field .
+
+    DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-extension_include_view
+     )->set_package( mo_package
+     )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-extension_include_view.
+    generated_repository_object-object_type = 'DDLS'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    "create a view entity
+    DATA(lo_view) = lo_specification->set_short_description( |Extension include view for { io_rap_bo_node->rap_node_objects-alias  }|
+      )->add_view_entity( ) ##no_text.
+
+    " Annotations.
+    lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ).
+    lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Extension include view for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text.
+    lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->table_name ) ).
+    "add alias
+    lo_view->data_source->set_alias( io_rap_bo_node->entityname ).
+
+    DATA(viewEnhancementCategoryAnno) = lo_view->add_annotation( 'AbapCatalog.viewEnhancementCategory' )->value->build( )->begin_array(  ).
+    viewEnhancementCategoryAnno->add_enum( 'PROJECTION_LIST' ).
+    viewEnhancementCategoryAnno->end_array(  ).
+
+*    DATA(lo_valuebuilder) = lo_view->add_annotation( 'AbapCatalog.extensibility' )->value->build( ).
+*
+*    DATA(lo_record) = lo_valuebuilder->begin_record(
+*        )->add_member( 'extensible' )->add_boolean( abap_true
+*        )->add_member( 'elementSuffix' )->add_string( 'ZAA'
+*        )->add_member( 'allowNewDatasources' )->add_boolean( abap_false
+*        ).
+*
+*    lo_record->add_member( 'dataSources' )->begin_array(  )->add_string( CONV #( io_rap_bo_node->entityname ) )->end_array( ).
+*    DATA(quota) = lo_record->add_member( 'quota' )->begin_record( ).
+*    quota->add_member( 'maximumFields' )->add_number( 100 ).
+*    quota->add_member( 'maximumBytes' )->add_number( 10000 ).
+*    quota->end_record(  ).
+*
+*    lo_valuebuilder->end_record( ).
+
+    add_anno_abap_catalog_ext(
+      io_view               = lo_view
+      i_allownewdatasources = abap_false
+      i_allownewcompositions = abap_false
+      i_elementsuffix       = io_rap_bo_node->extensibility_element_suffix
+      i_datasources         = io_rap_bo_node->entityname
+      i_maximumfields       = 100
+    ).
+
+
+    LOOP AT io_rap_bo_node->lt_fields  INTO  DATA(ls_header_fields) WHERE name  <> io_rap_bo_node->field_name-client
+                                                                       AND key_indicator = abap_true . "   co_client.
+
+      lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-name )
+               )->set_key( ).
+      lo_Field->set_alias( ls_header_fields-cds_view_field ).
+
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD create_for_cloud_development.
+    result = NEW #( json_string = json_string
+                    xco_lib     = NEW ZDMO_cl_rap_xco_cloud_lib( ) ).
+  ENDMETHOD.
+
+
+  METHOD create_for_on_prem_development.
+    result = NEW #( json_string = json_string
+                    xco_lib     = NEW ZDMO_cl_rap_xco_on_prem_lib( ) ).
+  ENDMETHOD.
+
+
+  METHOD create_i_cds_view.
+
+    DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-cds_view_i
+     )->set_package( mo_package
+     )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-cds_view_i.
+    generated_repository_object-object_type = 'DDLS'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    DATA(lo_view) = lo_specification->set_short_description( |Interface Projection View for { io_rap_bo_node->rap_node_objects-alias }|
+      )->add_projection_view( )
+       ##no_text.
+
+    " Annotations.
+    lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ).
+    lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Projection View for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text.
+
+    "add @AbapCatalog.extensibility annotations
+    IF io_rap_bo_node->is_extensible(  ) = abap_true.
+      add_anno_abap_catalog_ext(
+          io_view               = lo_view
+          i_allownewdatasources = abap_false
+          i_allownewcompositions = abap_true
+          i_elementsuffix       = io_rap_bo_node->extensibility_element_suffix
+          i_datasources         = io_rap_bo_node->entityname
+          i_maximumfields       = 100
+        ).
+    ENDIF.
+
+    IF io_rap_bo_node->is_root( ).
+      lo_view->set_root( ).
+    ENDIF.
+
+    IF io_rap_bo_node->is_root(  ) = abap_true.
+      cds_i_view_set_provider_cntrct( lo_view ).
+    ENDIF.
+
+    " set data source.
+    lo_view->data_source->set_view_entity( iv_view_entity = io_rap_bo_node->rap_node_objects-cds_view_r ).
+
+
+    "Client field does not need to be specified in client-specific CDS view
+    LOOP AT io_rap_bo_node->lt_fields INTO  DATA(ls_header_fields) WHERE name  <> io_rap_bo_node->field_name-client.
+      DATA(lo_field) = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field ) ).
+      IF ls_header_fields-key_indicator = abap_true  .
+        lo_field->set_key(  ).
+      ENDIF.
+    ENDLOOP.
+
+    "add compositions to child nodes
+    IF io_rap_bo_node->has_childs(  ).
+      LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode).
+        lo_view->add_field( xco_cp_ddl=>field( '_' && lo_childnode->rap_node_objects-alias ) )->set_redirected_to_compos_child( lo_childnode->rap_node_objects-cds_view_i ).
+      ENDLOOP.
+    ENDIF.
+
+    "publish association to parent
+    IF io_rap_bo_node->is_root(  ) = abap_false.
+      lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias ) )->set_redirected_to_parent( io_rap_bo_node->parent_node->rap_node_objects-cds_view_i ).
+    ENDIF.
+
+    "for grand-child nodes we have to add an association to the root node
+    IF io_rap_bo_node->is_grand_child_or_deeper(  ).
+      lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->root_node->rap_node_objects-alias ) )->set_redirected_to( io_rap_bo_node->root_node->rap_node_objects-cds_view_i ).
+    ENDIF.
+
+    "publish associations
+    LOOP AT io_rap_bo_node->lt_association INTO DATA(ls_assocation).
+      lo_view->add_field( xco_cp_ddl=>field( ls_assocation-name ) ).
+    ENDLOOP.
+
+    "add additional fields
+    LOOP AT       io_rap_bo_node->lt_additional_fields INTO DATA(additional_fields) WHERE cds_interface_view = abap_true.
+      lo_field = lo_view->add_field( xco_cp_ddl=>expression->for( CONV #( additional_fields-cds_view_field ) )  ).
+      IF additional_fields-localized = abap_true.
+        lo_Field->set_localized( abap_true ).
+      ENDIF.
+    ENDLOOP.
+
+    "add alias
+    lo_view->data_source->set_alias( io_rap_bo_node->entityname ).
+
+  ENDMETHOD.
+
+
+  METHOD create_i_cds_view_basic.
+
+    DATA lo_field TYPE REF TO if_xco_gen_ddls_s_fo_field .
+
+    DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-cds_view_i_basic
+        )->set_package( mo_package
+        )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-cds_view_i_basic.
+    generated_repository_object-object_type = 'DDLS'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    DATA(lo_view) = lo_specification->set_short_description( |Basic Interface View for { io_rap_bo_node->rap_node_objects-alias }|
+      )->add_view_entity( ) ##no_text.
+    ##no_text.
+
+    " Annotations.
+    lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ).
+    lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Basic Interface View for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text.
+
+
+    " set data source.
+*    lo_view->data_source->set_view_entity( iv_view_entity = io_rap_bo_node->rap_node_objects- ).
+    lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->table_name ) ).
+
+    "Client field does not need to be specified in client-specific CDS view
+    LOOP AT io_rap_bo_node->lt_fields  INTO  DATA(ls_header_fields) WHERE  name  <> io_rap_bo_node->field_name-client . "   co_client.
+
+      IF ls_header_fields-key_indicator = abap_true.
+        lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-name )
+           )->set_key( )->set_alias(  ls_header_fields-cds_view_field  ).
+      ELSE.
+        lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-name )
+           )->set_alias( ls_header_fields-cds_view_field ).
+      ENDIF.
+
+      "add @Semantics annotation for currency code
+      IF ls_header_fields-currencycode IS NOT INITIAL.
+        READ TABLE io_rap_bo_node->lt_fields INTO DATA(ls_field) WITH KEY name = to_upper( ls_header_fields-currencycode ).
+        IF sy-subrc = 0.
+          "for example @Semantics.amount.currencyCode: 'CurrencyCode'
+          lo_field->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ).
+        ENDIF.
+      ENDIF.
+
+      "add @Semantics annotation for unit of measure
+      IF ls_header_fields-unitofmeasure IS NOT INITIAL.
+        CLEAR ls_field.
+        READ TABLE io_rap_bo_node->lt_fields INTO ls_field WITH KEY name = to_upper( ls_header_fields-unitofmeasure ).
+        IF sy-subrc = 0.
+          "for example @Semantics.quantity.unitOfMeasure: 'QuantityUnit'
+          lo_field->add_annotation( 'Semantics.quantity.unitOfMeasure' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ).
+        ENDIF.
+      ENDIF.
+
+      CASE ls_header_fields-name.
+        WHEN io_rap_bo_node->field_name-created_at.
+          lo_field->add_annotation( 'Semantics.systemDateTime.createdAt' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-created_by.
+          lo_field->add_annotation( 'Semantics.user.createdBy' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-last_changed_at.
+          lo_field->add_annotation( 'Semantics.systemDateTime.lastChangedAt' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-last_changed_by.
+          lo_field->add_annotation( 'Semantics.user.lastChangedBy' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-local_instance_last_changed_at.
+          lo_field->add_annotation( 'Semantics.systemDateTime.localInstanceLastChangedAt' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-local_instance_last_changed_by.
+          lo_field->add_annotation( 'Semantics.user.localInstanceLastChangedBy' )->value->build( )->add_boolean( abap_true ).
+      ENDCASE.
+
+    ENDLOOP.
+
+    "add alias
+    lo_view->data_source->set_alias( io_rap_bo_node->entityname ).
+
+
+  ENDMETHOD.
+
+
+  METHOD create_mde_view.
+
+    DATA pos TYPE i VALUE 0.
+    DATA lo_field TYPE REF TO if_xco_gen_ddlx_s_fo_field .
+
+    DATA(lo_specification) = mo_put_operation->for-ddlx->add_object(  io_rap_bo_node->rap_node_objects-meta_data_extension " cds_view_p " mo_p_cds_header
+      )->set_package( mo_package
+      )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name =  io_rap_bo_node->rap_node_objects-meta_data_extension.
+    generated_repository_object-object_type = 'DDLX'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    lo_specification->set_short_description( |MDE for { io_rap_bo_node->rap_node_objects-alias }|
+      )->set_layer( xco_cp_metadata_extension=>layer->customer
+      )->set_view( io_rap_bo_node->rap_node_objects-cds_view_p ) ##no_text. " cds_view_p ).
+
+    "begin_array --> square bracket open
+    "Begin_record-> curly bracket open
+
+    add_annotation_ui_header(
+      EXPORTING
+        io_specification = lo_specification
+        io_rap_bo_node   = io_rap_bo_node
+    ).
+
+    "Client field does not need to be specified in client-specific CDS view
+    LOOP AT io_rap_bo_node->lt_all_fields INTO  DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client.
+
+      pos += 10.
+
+      lo_field = lo_specification->add_field( ls_header_fields-cds_view_field ).
+
+      "put facet annotation in front of the first field
+      IF pos = 10.
+        add_annotation_ui_facets(
+          EXPORTING
+            io_field       = lo_field
+            io_rap_bo_node = io_rap_bo_node
+        ).
+      ENDIF.
+
+      IF ls_header_fields-is_hidden = abap_true.
+
+        add_anno_ui_hidden(
+          EXPORTING
+            io_field         = lo_field
+            ls_header_fields = ls_header_fields
+        ).
+
+      ELSE.
+
+        add_anno_ui_lineitem(
+          EXPORTING
+            io_field         = lo_field
+            ls_header_fields = ls_header_fields
+            position         = pos
+        ).
+
+        add_anno_ui_identification(
+          EXPORTING
+            io_field         = lo_field
+            io_rap_bo_node   = io_rap_bo_node
+            ls_header_fields = ls_header_fields
+            position         = pos
+        ).
+
+        "add selection fields for semantic key fields or for the fields that are marked as object id
+        add_annotation_ui_selectionfld(
+          EXPORTING
+            io_field         = lo_field
+            io_rap_bo_node   = io_rap_bo_node
+            ls_header_fields = ls_header_fields
+            position         = pos
+        ).
+      ENDIF.
+    ENDLOOP.
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD create_p_cds_view.
+
+    DATA fuzzinessThreshold TYPE p LENGTH 3 DECIMALS 2.
+    fuzzinessthreshold = 9 / 10.
+
+    DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-cds_view_p
+     )->set_package( mo_package
+     )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-cds_view_p.
+    generated_repository_object-object_type = 'DDLS'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+
+    DATA(lo_view) = lo_specification->set_short_description( |Projection View for { io_rap_bo_node->rap_node_objects-alias }|
+      )->add_projection_view( )
+       ##no_text.
+
+    " Annotations.
+    lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ).
+    lo_view->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ).
+    lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Projection View for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text.
+
+    "add @AbapCatalog.extensibility annotations
+    IF io_rap_bo_node->is_extensible(  ) = abap_true.
+      add_anno_abap_catalog_ext(
+          io_view               = lo_view
+          i_allownewdatasources = abap_false
+          i_allownewcompositions = abap_true
+          i_elementsuffix       = io_rap_bo_node->extensibility_element_suffix
+          i_datasources         = io_rap_bo_node->entityname
+          i_maximumfields       = 100
+        ).
+    ENDIF.
+
+    "@ObjectModel.semanticKey: ['HolidayAllID']
+    IF io_rap_bo_node->mimic_adt_wizard = abap_false.
+      DATA(semantic_key) = lo_view->add_annotation( 'ObjectModel.semanticKey' )->value->build( )->begin_array(  ).
+      semantic_key->add_string( CONV #( io_rap_bo_node->object_id_cds_field_name ) ).
+      semantic_key->end_array(  ).
+
+      lo_view->add_annotation( 'Search.searchable' )->value->build( )->add_boolean( abap_true ) ##no_text.
+    ENDIF.
+
+    IF io_rap_bo_node->is_root( ).
+      lo_view->set_root( ).
+    ENDIF.
+
+    IF io_rap_bo_node->is_root(  ) = abap_true.
+      cds_p_view_set_provider_cntrct( lo_View  ).
+    ENDIF.
+
+    " Data source.
+    lo_view->data_source->set_view_entity( iv_view_entity = io_rap_bo_node->rap_node_objects-cds_view_r ).
+
+
+    "Client field does not need to be specified in client-specific CDS view
+    LOOP AT io_rap_bo_node->lt_fields INTO  DATA(ls_header_fields) WHERE name  <> io_rap_bo_node->field_name-client.
+
+      DATA(lo_field) = lo_view->add_field( xco_cp_ddl=>field(  ls_header_fields-cds_view_field   )
+         ). "->set_alias(  ls_header_fields-cds_view_field   ).
+
+      IF ls_header_fields-key_indicator = abap_true  .
+        lo_field->set_key(  ).
+      ENDIF.
+
+      "skip setting of additional annotations if we have to mimic the
+      "behavior of the ADT based generator
+
+      IF io_rap_bo_node->mimic_adt_wizard = abap_false.
+
+        IF ls_header_fields-key_indicator = abap_true  .
+          IF io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-managed_semantic OR
+             io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-unmanaged_semantic.
+            lo_field->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ).
+            lo_field->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( iv_value = fuzzinessThreshold ).
+          ENDIF.
+        ENDIF.
+
+        CASE ls_header_fields-name.
+          WHEN io_rap_bo_node->object_id.
+            IF ls_header_fields-key_indicator = abap_false.
+              lo_field->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ).
+              lo_field->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( iv_value = fuzzinessThreshold ).
+            ENDIF.
+        ENDCASE.
+
+        "add @Semantics annotation once available
+        IF ls_header_fields-currencycode IS NOT INITIAL.
+          READ TABLE io_rap_bo_node->lt_fields INTO DATA(ls_field) WITH KEY name = ls_header_fields-currencycode.
+          IF sy-subrc = 0.
+            lo_field->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ).
+          ENDIF.
+        ENDIF.
+
+        "add @Semantics annotation for unit of measure
+        IF ls_header_fields-unitofmeasure IS NOT INITIAL.
+          CLEAR ls_field.
+          READ TABLE io_rap_bo_node->lt_fields INTO ls_field WITH KEY name = to_upper( ls_header_fields-unitofmeasure ).
+          IF sy-subrc = 0.
+            "for example @Semantics.quantity.unitOfMeasure: 'QuantityUnit'
+            lo_field->add_annotation( 'Semantics.quantity.unitOfMeasure' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ).
+          ENDIF.
+        ENDIF.
+
+        "has to be set in 2102
+        "can be omitted later
+        IF ls_header_fields-is_unitofmeasure = abap_true.
+          lo_field->add_annotation( 'Semantics.unitOfMeasure' )->value->build( )->add_boolean( abap_true ).
+        ENDIF.
+
+        IF ls_header_fields-has_valuehelp = abap_true.
+
+          READ TABLE io_rap_bo_node->lt_valuehelp INTO DATA(ls_valuehelp) WITH KEY localelement = ls_header_fields-cds_view_field.
+
+          IF sy-subrc = 0.
+
+            DATA(lo_valuebuilder) = lo_field->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ).
+
+            lo_valuebuilder->begin_array(
+                       )->begin_record(
+                         )->add_member( 'entity'
+                            )->begin_record(
+                               )->add_member( 'name' )->add_string( CONV #( ls_valuehelp-name )
+                               )->add_member( 'element' )->add_string( CONV #( ls_valuehelp-element )
+                            )->end_record( ).
+
+            "use for validation will be set to true for
+            "currencycode and unitofmeasture fields
+
+            IF ls_valuehelp-useforvalidation = abap_true.
+              lo_valuebuilder->add_member( 'useForValidation' )->add_boolean( abap_true ).
+            ENDIF.
+
+            IF ls_valuehelp-additionalbinding IS NOT INITIAL.
+
+              lo_valuebuilder->add_member( 'additionalBinding'
+                )->begin_array( ).
+
+              LOOP AT ls_valuehelp-additionalbinding INTO DATA(ls_additionalbinding).
+
+                DATA(lo_record) = lo_valuebuilder->begin_record(
+                  )->add_member( 'localElement' )->add_string( CONV #( ls_additionalbinding-localelement )
+                  )->add_member( 'element' )->add_string( CONV #( ls_additionalbinding-element )
+                  ).
+                IF ls_additionalbinding-usage IS NOT INITIAL.
+                  lo_record->add_member( 'usage' )->add_enum( CONV #( ls_additionalbinding-usage ) ).
+                ENDIF.
+
+                lo_valuebuilder->end_record(  ).
+
+              ENDLOOP.
+
+              lo_valuebuilder->end_array( ).
+
+            ENDIF.
+
+            lo_valuebuilder->end_record( )->end_array( ).
+
+          ENDIF.
+
+        ENDIF.
+
+      ENDIF.
+
+    ENDLOOP.
+
+    IF io_rap_bo_node->has_childs(  ).   " create_item_objects(  ).
+      " Composition.
+
+      "change to a new property "childnodes" which only contains the direct childs
+      LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode).
+
+        lo_view->add_field( xco_cp_ddl=>field( '_' && lo_childnode->rap_node_objects-alias ) )->set_redirected_to_compos_child( lo_childnode->rap_node_objects-cds_view_p ).
+
+
+      ENDLOOP.
+
+    ENDIF.
+
+    IF io_rap_bo_node->is_root(  ) = abap_false.
+      " "publish association to parent
+      lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias ) )->set_redirected_to_parent( io_rap_bo_node->parent_node->rap_node_objects-cds_view_p ).
+    ENDIF.
+
+    "for grand-child nodes we have to add an association to the root node
+    IF io_rap_bo_node->is_grand_child_or_deeper(  ).
+      lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->root_node->rap_node_objects-alias ) )->set_redirected_to( io_rap_bo_node->root_node->rap_node_objects-cds_view_p ).
+    ENDIF.
+
+
+    "publish associations
+
+    LOOP AT io_rap_bo_node->lt_association INTO DATA(ls_assocation).
+      lo_view->add_field( xco_cp_ddl=>field( ls_assocation-name ) ).
+    ENDLOOP.
+
+
+    LOOP AT       io_rap_bo_node->lt_additional_fields INTO DATA(additional_fields) WHERE cds_projection_view = abap_true.
+
+      lo_field = lo_view->add_field( xco_cp_ddl=>expression->for( CONV #( additional_fields-cds_view_field ) )  ).
+
+      IF additional_fields-localized = abap_true.
+        lo_Field->set_localized( abap_true ).
+      ENDIF.
+    ENDLOOP.
+
+    "add alias
+    lo_view->data_source->set_alias( io_rap_bo_node->entityname ).
+
+  ENDMETHOD.
+
+
+  METHOD create_r_cds_view.
+
+    DATA ls_condition_components TYPE ts_condition_components.
+    DATA lt_condition_components TYPE tt_condition_components.
+    DATA lo_field TYPE REF TO if_xco_gen_ddls_s_fo_field .
+
+    DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-cds_view_r
+     )->set_package( mo_package
+     )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-cds_view_r.
+    generated_repository_object-object_type = 'DDLS'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    "create a view entity
+    DATA(lo_view) = lo_specification->set_short_description( |CDS View for { io_rap_bo_node->rap_node_objects-alias  }|
+      )->add_view_entity( ) ##no_text.
+
+    "create a normal CDS view with DDIC view
+    "maybe needed in order to generate code for a 1909 system
+    "DATA(lo_view) = lo_specification->set_short_description( 'CDS View for ' &&  io_rap_bo_node->rap_node_objects-alias "mo_alias_header
+    "   )->add_view( ).
+
+    " Annotations.
+    " lo_view->add_annotation( 'AbapCatalog' )->value->build( )->begin_record(
+    "   )->add_member( 'sqlViewName' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-ddic_view_i ) "mo_view_header )
+    "   )->add_member( 'compiler.compareFilter' )->add_boolean( abap_true
+    "   )->add_member( 'preserveKey' )->add_boolean( abap_true
+    "   )->end_record( ).
+
+    lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ).
+    lo_view->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ).
+    lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'CDS View for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text. " mo_alias_header ).
+
+    "@ObjectModel.sapObjectNodeType.name : 'ZAF_SALESORDER_01'
+    IF io_rap_bo_node->add_sap_object_type = abap_true.
+      lo_view->add_annotation( 'ObjectModel.sapObjectNodeType.name' )->value->build( )->add_string( CONV #( io_rap_bo_node->rap_node_objects-sap_object_node_type ) ) ##no_text. " mo_alias_header ).
+    ENDIF.
+
+    IF io_rap_bo_node->is_root( ).
+      lo_view->set_root( ).
+    ELSE.
+
+      CASE io_rap_bo_node->get_implementation_type(  ) .
+        WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+
+          DATA(parent_uuid_cds_field_name) = io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-parent_uuid ]-cds_view_field.
+          DATA(uuid_cds_field_name_in_parent) = io_rap_bo_node->parent_node->lt_fields[ name = io_rap_bo_node->parent_node->field_name-uuid ]-cds_view_field.
+
+          DATA(lo_condition) = xco_cp_ddl=>field( parent_uuid_cds_field_name )->of_projection( )->eq(
+            xco_cp_ddl=>field( uuid_cds_field_name_in_parent )->of( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias ) ).
+
+
+
+
+        WHEN  ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic OR ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+
+          CLEAR ls_condition_components.
+          CLEAR lt_condition_components.
+
+          LOOP AT io_rap_bo_node->parent_node->semantic_key INTO DATA(ls_semantic_key).
+            ls_condition_components-association_name = '_' && io_rap_bo_node->parent_node->rap_node_objects-alias.
+            ls_condition_components-association_field = ls_semantic_key-cds_view_field.
+            ls_condition_components-projection_field = ls_semantic_key-cds_view_field.
+            APPEND ls_condition_components TO lt_condition_components.
+          ENDLOOP.
+
+          lo_condition = create_condition( lt_condition_components ).
+
+      ENDCASE.
+
+      "@todo - raise an exception when being initial
+      IF lo_condition IS NOT INITIAL.
+
+        lo_view->add_association( io_rap_bo_node->parent_node->rap_node_objects-cds_view_r )->set_to_parent(
+    )->set_alias( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias
+    )->set_condition( lo_condition ).
+
+      ENDIF.
+
+
+
+      IF io_rap_bo_node->is_grand_child_or_deeper(  ).
+
+        CASE io_rap_bo_node->get_implementation_type(  ) .
+          WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid.
+
+            DATA(root_uuid_cds_field_name) = io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-root_uuid ]-cds_view_field.
+            DATA(uuid_cds_field_name_in_root) = io_rap_bo_node->root_node->lt_fields[ name = io_rap_bo_node->root_node->field_name-uuid ]-cds_view_field.
+
+            lo_condition = xco_cp_ddl=>field( root_uuid_cds_field_name )->of_projection( )->eq(
+              xco_cp_ddl=>field( uuid_cds_field_name_in_root )->of( '_' && io_rap_bo_node->root_node->rap_node_objects-alias ) ).
+
+
+
+          WHEN  ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic OR ZDMO_cl_rap_node=>implementation_type-managed_semantic.
+
+            CLEAR ls_condition_components.
+            CLEAR lt_condition_components.
+
+            LOOP AT io_rap_bo_node->ROOT_node->semantic_key INTO DATA(ls_root_semantic_key).
+              ls_condition_components-association_name = '_' && io_rap_bo_node->root_node->rap_node_objects-alias.
+              ls_condition_components-association_field = ls_root_semantic_key-cds_view_field.
+              ls_condition_components-projection_field = ls_root_semantic_key-cds_view_field.
+              APPEND ls_condition_components TO lt_condition_components.
+            ENDLOOP.
+
+            lo_condition = create_condition( lt_condition_components ).
+
+        ENDCASE.
+
+        IF lo_condition IS NOT INITIAL.
+          lo_view->add_association( io_rap_bo_node->root_node->rap_node_objects-cds_view_r
+            )->set_alias( '_' && io_rap_bo_node->root_node->rap_node_objects-alias
+            )->set_cardinality(  xco_cp_cds=>cardinality->one
+            )->set_condition( lo_condition ).
+        ENDIF.
+
+        "@todo add an association that uses the singleton_id
+        "association [1]    to zfcal_I_CALM_ALL    as _HolidayAll     on $projection.HolidayAllID = _HolidayAll.HolidayAllID
+
+
+      ENDIF.
+
+    ENDIF.
+
+    " Data source.
+    CASE io_rap_bo_node->data_source_type.
+      WHEN io_rap_bo_node->data_source_types-table.
+        IF io_rap_bo_node->add_basic_i_views = abap_true.
+          lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->rap_node_objects-cds_view_i_basic ) ).
+        ELSE.
+          lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->table_name ) ).
+        ENDIF.
+      WHEN io_rap_bo_node->data_source_types-cds_view.
+        lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->cds_view_name ) ).
+    ENDCASE.
+
+*    "add alias
+*    lo_view->data_source->set_alias( io_rap_bo_node->entityname ).
+
+    IF io_rap_bo_node->is_virtual_root(  ) = abap_true.
+      "add the following statement
+      "left outer join zcarrier_002 as carr on 0 = 0
+      "   data(left_outer_join) = lo_view->data_source->add_left_outer_join( io_data_source = io_rap_bo_node->childnodes[ 1 ]->data_source_name ).
+
+      " Association.
+      DATA(condition) = xco_cp_ddl=>field( '0' )->eq( xco_cp_ddl=>field( '0' ) ).
+      "DATA(cardinality) = xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ).
+
+      DATA mo_data_source  TYPE REF TO if_xco_ddl_expr_data_source  .
+      "mo_data_source = .
+
+      DATA(left_outer_join) = lo_view->data_source->add_left_outer_join( xco_cp_ddl=>data_source->database_table( CONV #( root_node->childnodes[ 1 ]->data_source_name ) )->set_alias( CONV #( root_node->singleton_child_tab_name ) ) ).
+
+      "@todo - add code after HFC2 2008 has been applied
+      left_outer_join->set_condition( condition ).
+
+      lo_view->set_where( xco_cp_ddl=>field( 'I_Language.Language' )->eq( xco_cp_ddl=>expression->for( '$session.system_language' ) ) ).
+
+    ENDIF.
+
+    IF io_rap_bo_node->has_childs(  ).   " create_item_objects(  ).
+      " Composition.
+
+      "change to a new property "childnodes" which only contains the direct childs
+      LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode).
+
+        lo_view->add_composition( lo_childnode->rap_node_objects-cds_view_r "  mo_i_cds_item
+          )->set_cardinality( xco_cp_cds=>cardinality->zero_to_n
+          )->set_alias( '_' && lo_childnode->rap_node_objects-alias ). " mo_alias_item ).
+
+      ENDLOOP.
+
+    ENDIF.
+
+    "Client field does not need to be specified in client-specific CDS view
+    LOOP AT io_rap_bo_node->lt_fields  INTO  DATA(ls_header_fields) WHERE  name  <> io_rap_bo_node->field_name-client . "   co_client.
+
+      IF io_rap_bo_node->add_basic_i_views = abap_true.
+        IF ls_header_fields-key_indicator = abap_true.
+          lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field )
+             )->set_key( ).
+        ELSE.
+          lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field )
+             ).
+        ENDIF.
+      ELSE.
+        IF ls_header_fields-key_indicator = abap_true.
+          lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-name )
+             )->set_key( )->set_alias(  ls_header_fields-cds_view_field  ).
+        ELSE.
+          lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-name )
+             )->set_alias( ls_header_fields-cds_view_field ).
+        ENDIF.
+      ENDIF.
+      "add @Semantics annotation for currency code
+      IF ls_header_fields-currencycode IS NOT INITIAL.
+        READ TABLE io_rap_bo_node->lt_fields INTO DATA(ls_field) WITH KEY name = to_upper( ls_header_fields-currencycode ).
+        IF sy-subrc = 0.
+          "for example @Semantics.amount.currencyCode: 'CurrencyCode'
+          lo_field->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ).
+        ENDIF.
+      ENDIF.
+
+      "add @Semantics annotation for unit of measure
+      IF ls_header_fields-unitofmeasure IS NOT INITIAL.
+        CLEAR ls_field.
+        READ TABLE io_rap_bo_node->lt_fields INTO ls_field WITH KEY name = to_upper( ls_header_fields-unitofmeasure ).
+        IF sy-subrc = 0.
+          "for example @Semantics.quantity.unitOfMeasure: 'QuantityUnit'
+          lo_field->add_annotation( 'Semantics.quantity.unitOfMeasure' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ).
+        ENDIF.
+      ENDIF.
+
+      CASE ls_header_fields-name.
+        WHEN io_rap_bo_node->field_name-created_at.
+          lo_field->add_annotation( 'Semantics.systemDateTime.createdAt' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-created_by.
+          lo_field->add_annotation( 'Semantics.user.createdBy' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-last_changed_at.
+          lo_field->add_annotation( 'Semantics.systemDateTime.lastChangedAt' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-last_changed_by.
+          lo_field->add_annotation( 'Semantics.user.lastChangedBy' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-local_instance_last_changed_at.
+          lo_field->add_annotation( 'Semantics.systemDateTime.localInstanceLastChangedAt' )->value->build( )->add_boolean( abap_true ).
+        WHEN io_rap_bo_node->field_name-local_instance_last_changed_by.
+          lo_field->add_annotation( 'Semantics.user.localInstanceLastChangedBy' )->value->build( )->add_boolean( abap_true ).
+      ENDCASE.
+
+    ENDLOOP.
+
+    "IF create_item_objects(  ).
+    IF io_rap_bo_node->has_childs(  ).
+
+      "change to a new property "childnodes" which only contains the direct childs
+      LOOP AT io_rap_bo_node->childnodes INTO lo_childnode.
+
+        "publish association to item  view
+        lo_view->add_field( xco_cp_ddl=>field( '_' && lo_childnode->rap_node_objects-alias ) ).
+
+      ENDLOOP.
+
+    ENDIF.
+
+    IF io_rap_bo_node->is_root(  ) = abap_false.
+      "publish association to parent
+      lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias ) ).
+    ENDIF.
+
+    IF io_rap_bo_node->is_grand_child_or_deeper(  ).
+      "add assocation to root node
+      lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->root_node->rap_node_objects-alias ) ).
+    ENDIF.
+
+    "add associations
+
+    "@todo
+    "add association if RAP BO is extensible
+    "association [1]    to ZRAP625E_SalesOrder_001 as _Extension on $projection.HeaderUUID = _Extension.HeaderUUID
+    "reuse condition
+
+    "add entries to lt_association for the above mentioned association
+
+*      IF io_rap_bo_node->is_extensible( ) = abAP_TRUE.
+*        lo_view->add_association( io_rap_bo_node->rap_node_objects-extension_include
+*            )->set_alias( '_' && io_rap_bo_node->extension_association_name
+*            )->set_condition( lo_condition ).
+*        add_anno_abap_catalog_ext(
+*          io_view               = lo_view
+*          i_allownewdatasources = abap_false
+*          i_elementsuffix       = io_rap_bo_node->extensibility_element_suffix
+*          i_datasources         = '_' && io_rap_bo_node->extension_association_name
+*          i_maximumfields       = 100
+*        ).
+*
+*      ENDIF.
+    IF io_rap_bo_node->is_extensible( ) = abAP_TRUE.
+
+      DATA extension_assocation TYPE zdmo_cl_rap_node=>ts_assocation  .
+      CLEAR ls_condition_components.
+      CLEAR lt_condition_components.
+      DATA ext_condition_component TYPE zdmo_cl_rap_node=>ts_condition_fields.
+      DATA ext_condition_components TYPE zdmo_cl_rap_node=>tt_condition_fields .
+
+      LOOP AT io_rap_bo_node->lt_fields  INTO  DATA(ls_key_fields) WHERE  name  <> io_rap_bo_node->field_name-client
+                                                                     AND  key_indicator = abap_true. "   co_client.
+        ext_condition_component-association_field = ls_key_fields-cds_view_field.
+        ext_condition_component-projection_field = ls_key_fields-cds_view_field.
+*        ls_condition_components-association_name = io_rap_bo_node->extension_association_name.
+        APPEND ext_condition_component TO ext_condition_components.
+      ENDLOOP.
+
+      extension_assocation-cardinality = ZDMO_cl_rap_node=>cardinality-one.
+      extension_assocation-name = '_' && io_rap_bo_node->extension_association_name.
+      extension_assocation-target = io_rap_bo_node->rap_node_objects-extension_include_view.
+      extension_assocation-condition_components = ext_condition_components.
+
+*      append extension_assocation to io_rap_bo_node->a  lt_association.
+
+      add_anno_abap_catalog_ext(
+          io_view               = lo_view
+          i_allownewdatasources = abap_false
+          i_allownewcompositions = abap_true
+          i_elementsuffix       = io_rap_bo_node->extensibility_element_suffix
+          i_datasources         = '_' && io_rap_bo_node->extension_association_name
+          i_maximumfields       = 100
+        ).
+
+    ENDIF.
+
+    DATA(associations) = io_rap_bo_node->lt_association.
+
+    IF extension_assocation IS NOT INITIAL.
+      APPEND extension_assocation TO associations.
+    ENDIF.
+
+*    LOOP AT io_rap_bo_node->lt_association INTO DATA(ls_assocation).
+    LOOP AT associations INTO DATA(ls_assocation).
+
+      CLEAR ls_condition_components.
+      CLEAR lt_condition_components.
+      LOOP AT ls_assocation-condition_components INTO DATA(ls_components).
+        ls_condition_components-association_field =  ls_components-association_field.
+        ls_condition_components-projection_field = ls_components-projection_field.
+        ls_condition_components-association_name = ls_assocation-name.
+        APPEND ls_condition_components TO lt_condition_components.
+      ENDLOOP.
+
+      lo_condition = create_condition( lt_condition_components ).
+
+      DATA(lo_association) = lo_view->add_association( ls_assocation-target )->set_alias(
+           ls_assocation-name
+          )->set_condition( lo_condition ).
+
+      CASE ls_assocation-cardinality .
+        WHEN ZDMO_cl_rap_node=>cardinality-one.
+          lo_association->set_cardinality( xco_cp_cds=>cardinality->one ).
+        WHEN ZDMO_cl_rap_node=>cardinality-one_to_n.
+          lo_association->set_cardinality( xco_cp_cds=>cardinality->one_to_n ).
+        WHEN ZDMO_cl_rap_node=>cardinality-zero_to_n.
+          lo_association->set_cardinality( xco_cp_cds=>cardinality->zero_to_n ).
+        WHEN ZDMO_cl_rap_node=>cardinality-zero_to_one.
+          lo_association->set_cardinality( xco_cp_cds=>cardinality->zero_to_one ).
+        WHEN ZDMO_cl_rap_node=>cardinality-one_to_one.
+          "@todo: currently association[1] will be generated
+          "fix available with 2008 HFC2
+          lo_association->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ) ).
+      ENDCASE.
+
+      "publish association
+      lo_view->add_field( xco_cp_ddl=>field( ls_assocation-name ) ).
+
+    ENDLOOP.
+
+    LOOP AT       io_rap_bo_node->lt_additional_fields INTO DATA(additional_fields) WHERE cds_restricted_reuse_view = abap_true.
+
+      lo_field = lo_view->add_field( xco_cp_ddl=>expression->for( additional_fields-name ) ).
+      IF additional_fields-cds_view_field IS NOT INITIAL.
+        lo_Field->set_alias( additional_fields-cds_view_field ).
+      ENDIF.
+    ENDLOOP.
+
+    "add alias
+    lo_view->data_source->set_alias( io_rap_bo_node->entityname ).
+
+  ENDMETHOD.
+
+
+  METHOD create_sap_object_node_type.
+
+    DATA(lo_specification) = mo_put_operation->for-nont->add_object( io_rap_bo_node->rap_node_objects-sap_object_node_type
+       )->set_package( mo_package
+       )->create_form_specification( ).
+
+    lo_specification->set_short_description( 'Generated SAP Object Node Type' ).
+
+    lo_specification->set_name( io_rap_bo_node->rap_node_objects-sap_object_node_type
+      )->set_sap_object_type( io_rap_bo_node->root_node->rap_root_node_objects-sap_object_type ).
+
+    lo_specification->set_root_node( io_rap_bo_node->is_root(  )  ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-sap_object_node_type.
+    generated_repository_object-object_type = 'NONT'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+
+
+  ENDMETHOD.
+
+
+  METHOD create_sap_object_type.
+
+    DATA(lo_specification) = mo_put_operation->for-ront->add_object( io_rap_bo_node->rap_root_node_objects-sap_object_type
+      )->set_package( io_rap_bo_node->package
+      )->create_form_specification( ).
+    lo_specification->set_short_description( 'Generated SAP Object Type' ).
+
+    DATA(lo_type_category) = xco_cp_sap_object_type=>type_category->business_object.
+
+    lo_specification->set_type_category( lo_type_category
+      )->set_name( io_rap_bo_node->rap_root_node_objects-sap_object_type ).
+
+  ENDMETHOD.
+
+
+  METHOD create_service_binding.
+**********************************************************************
+** Begin of deletion 2020
+**********************************************************************
+    DATA lv_service_binding_name TYPE sxco_srvb_object_name.
+    lv_service_binding_name = to_upper( io_rap_bo_node->root_node->rap_root_node_objects-service_binding ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = lv_service_binding_name.
+    generated_repository_object-object_type = 'SRVB'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    DATA lv_service_definition_name TYPE sxco_srvd_object_name.
+    lv_service_definition_name = to_upper( io_rap_bo_node->root_node->rap_root_node_objects-service_definition ).
+
+    DATA(lo_specification_header) = mo_srvb_put_operation->for-srvb->add_object(   lv_service_binding_name
+                                    )->set_package( mo_package
+                                    )->create_form_specification( ).
+
+    lo_specification_header->set_short_description( |Service binding for { io_rap_bo_node->root_node->entityname }| ) ##no_text.
+
+
+    CASE io_rap_bo_node->root_node->binding_type.
+      WHEN io_rap_bo_node->binding_type_name-odata_v4_ui.
+        lo_specification_header->set_binding_type( xco_cp_service_binding=>binding_type->odata_v4_ui ).
+      WHEN io_rap_bo_node->binding_type_name-odata_v2_ui.
+        lo_specification_header->set_binding_type( xco_cp_service_binding=>binding_type->odata_v2_ui ).
+      WHEN io_rap_bo_node->binding_type_name-odata_v4_web_api.
+        lo_specification_header->set_binding_type( xco_cp_service_binding=>binding_type->odata_v4_web_api ).
+      WHEN io_rap_bo_node->binding_type_name-odata_v2_web_api..
+        lo_specification_header->set_binding_type( xco_cp_service_binding=>binding_type->odata_v2_web_api ).
+      WHEN OTHERS.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid     = ZDMO_cx_rap_generator=>invalid_binding_type
+            mv_value   = io_rap_bo_node->root_node->binding_type
+            mv_value_2 = io_rap_bo_node->supported_binding_types.
+    ENDCASE.
+
+
+    lo_specification_header->add_service( )->add_version( '0001' )->set_service_definition( lv_service_definition_name ).
+
+
+**********************************************************************
+** End of deletion 2020
+**********************************************************************
+  ENDMETHOD.
+
+
+  METHOD create_service_definition.
+
+
+    TYPES: BEGIN OF ty_cds_views_used_by_assoc,
+             name   TYPE ZDMO_cl_rap_node=>ts_assocation-name,    "    sxco_ddef_alias_name,
+             target TYPE ZDMO_cl_rap_node=>ts_assocation-target,
+           END OF ty_cds_views_used_by_assoc.
+    DATA  lt_cds_views_used_by_assoc  TYPE STANDARD TABLE OF ty_cds_views_used_by_assoc.
+    DATA  ls_cds_views_used_by_assoc  TYPE ty_cds_views_used_by_assoc.
+
+    DATA(lo_specification_header) = mo_put_operation->for-srvd->add_object(  io_rap_bo_node->rap_root_node_objects-service_definition
+                                    )->set_package( mo_package
+                                    )->create_form_specification( ).
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+    generated_repository_object-object_name = io_rap_bo_node->rap_root_node_objects-service_definition.
+    generated_repository_object-object_type = 'SRVD'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+    lo_specification_header->set_short_description( |Service definition for { io_rap_bo_node->root_node->entityname }| ) ##no_text.
+
+    set_service_definition_annos(
+      io_specification = lo_specification_header
+      io_rap_bo_node   = root_node
+    ).
+
+*    IF root_node->is_extensible(  ) = abap_true.
+*      "add @AbapCatalog.extensibility.extensible: true
+*      lo_specification_header->add_annotation( 'AbapCatalog.extensibility.extensible' )->value->build( )->add_boolean( abap_true ).
+*    ENDIF.
+*
+*    lo_specification_header->add_annotation( 'ObjectModel.leadingEntity.name' )->value->build( )->add_string( CONV #( root_node->rap_node_objects-cds_view_p ) ).
+
+    "add exposure for root node
+
+    IF root_node->generate_custom_entity(  ).
+      lo_specification_header->add_exposure( root_node->rap_node_objects-cds_view_r )->set_alias( root_node->rap_node_objects-alias ).
+    ELSE.
+      lo_specification_header->add_exposure( root_node->rap_node_objects-cds_view_p )->set_alias( root_node->rap_node_objects-alias ).
+    ENDIF.
+
+*    CASE root_node->data_source_type.
+*      WHEN root_node->data_source_types-table OR root_node->data_source_types-cds_view.
+*        lo_specification_header->add_exposure( root_node->rap_node_objects-cds_view_p )->set_alias( root_node->rap_node_objects-alias ).
+*
+*      WHEN root_node->data_source_types-structure OR root_node->data_source_types-abap_type.
+*        lo_specification_header->add_exposure( root_node->rap_node_objects-cds_view_r )->set_alias( root_node->rap_node_objects-alias ).
+*    ENDCASE.
+    "add exposure for all child nodes
+    LOOP AT root_node->all_childnodes INTO DATA(lo_childnode).
+      "add all nodes to the service definition
+      IF lo_childnode->generate_custom_entity(  ).
+        lo_specification_header->add_exposure( lo_childnode->rap_node_objects-cds_view_r )->set_alias( lo_childnode->rap_node_objects-alias ).
+      ELSE.
+        lo_specification_header->add_exposure( lo_childnode->rap_node_objects-cds_view_p )->set_alias( lo_childnode->rap_node_objects-alias ).
+      ENDIF.
+*      CASE lo_childnode->data_source_type.
+*        WHEN lo_childnode->data_source_types-table OR lo_childnode->data_source_types-cds_view.
+*          lo_specification_header->add_exposure( lo_childnode->rap_node_objects-cds_view_p )->set_alias( lo_childnode->rap_node_objects-alias ).
+*        WHEN lo_childnode->data_source_types-abap_type OR lo_childnode->data_source_types-structure.
+*          lo_specification_header->add_exposure( lo_childnode->rap_node_objects-cds_view_r )->set_alias( lo_childnode->rap_node_objects-alias ).
+*      ENDCASE.
+
+      "create a list of all CDS views used in associations to the service definition
+      LOOP AT lo_childnode->lt_association INTO DATA(ls_assocation).
+        "remove the first character which is an underscore
+        ls_cds_views_used_by_assoc-name = substring( val = ls_assocation-name off = 1 ).
+        ls_cds_views_used_by_assoc-target =  ls_assocation-target.
+        COLLECT ls_cds_views_used_by_assoc INTO lt_cds_views_used_by_assoc.
+      ENDLOOP.
+      LOOP AT lo_childnode->lt_valuehelp INTO DATA(ls_valuehelp).
+        ls_cds_views_used_by_assoc-name = ls_valuehelp-alias.
+        ls_cds_views_used_by_assoc-target = ls_valuehelp-name.
+        COLLECT ls_cds_views_used_by_assoc INTO lt_cds_views_used_by_assoc.
+      ENDLOOP.
+    ENDLOOP.
+
+    "add exposure for all associations and value helps that have been collected (and condensed) in the step before
+    LOOP AT lt_cds_views_used_by_assoc INTO ls_cds_views_used_by_assoc.
+      lo_specification_header->add_exposure( ls_cds_views_used_by_assoc-target )->set_alias( ls_cds_views_used_by_assoc-name ).
+    ENDLOOP.
+
+
+  ENDMETHOD.
+
+
+  METHOD create_table.
+
+    "add object name and type to list of generated repository objects
+    CLEAR generated_repository_object.
+
+    DATA name_of_generated_table TYPE sxco_dbt_object_name.
+
+    IF is_draft_table = abap_true.
+      name_of_generated_table = io_rap_bo_node->draft_table_name.
+    ELSE.
+      name_of_generated_table = io_rap_bo_node->table_name.
+    ENDIF.
+
+
+    DATA(lo_specification) = mo_draft_tabl_put_operation->for-tabl-for-database_table->add_object( name_of_generated_table
+                                  )->set_package( mo_package
+                                  )->create_form_specification( ).
+
+
+    IF is_draft_table = abap_true.
+      generated_repository_object-object_name = name_of_generated_table.
+      lo_specification->set_short_description( | Draft table for entity { io_rap_bo_node->rap_node_objects-cds_view_r } | ) ##no_text.
+    ELSE.
+      generated_repository_object-object_name = name_of_generated_table.
+      lo_specification->set_short_description( | Table for entity { io_rap_bo_node->rap_node_objects-cds_view_r } | ) ##no_text.
+    ENDIF.
+    generated_repository_object-object_type = 'TABL'.
+    APPEND generated_repository_object TO generated_repository_objects.
+
+
+    DATA database_table_field  TYPE REF TO if_xco_gen_tabl_dbt_s_fo_field  .
+
+    "tables must be client dependent
+    "and the key field must be the first field of the table
+
+*    IF is_draft_table = abap_true AND io_rap_bo_node->is_virtual_root(  ) = abap_true.
+    database_table_field = lo_specification->add_field( 'MANDT' ).
+    database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->clnt ).
+    database_table_field->set_not_null( ).
+    database_table_field->set_key_indicator(  ).
+*    ENDIF.
+
+    LOOP AT io_rap_bo_node->lt_fields INTO DATA(table_field_line)
+                                      WHERE name  <> io_rap_bo_node->field_name-client.
+
+      DATA(cds_field_name_upper) = to_upper( table_field_line-cds_view_field ).
+      DATA(table_field_name_upper) = to_upper( table_field_line-name ).
+
+      IF is_draft_table = abap_true.
+        database_table_field = lo_specification->add_field( CONV #( cds_field_name_upper ) ).
+      ELSE.
+        database_table_field = lo_specification->add_field( CONV #( table_field_name_upper ) ).
+      ENDIF.
+
+      IF table_field_line-is_data_element = abap_true.
+        database_table_field->set_type( xco_cp_abap_dictionary=>data_element( table_field_line-data_element ) ).
+      ENDIF.
+      IF table_field_line-is_built_in_type = abap_true.
+
+*        database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->for(
+*                                        iv_type     = to_upper( table_field_line-built_in_type )
+*                                        iv_length   = table_field_line-built_in_type_length
+*                                        iv_decimals = table_field_line-built_in_type_decimals
+*                                        ) ).
+        CASE  to_lower( table_field_line-built_in_type ).
+          WHEN 'accp'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->accp ).
+          WHEN 'clnt'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->clnt ).
+          WHEN 'cuky'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->cuky ).
+          WHEN 'dats'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dats ).
+          WHEN 'df16_raw'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_raw ).
+          WHEN 'df34_raw'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_raw ).
+          WHEN 'fltp'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->fltp ).
+          WHEN 'int1'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int1 ).
+          WHEN 'int2'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int2 ).
+          WHEN 'int4'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int4 ).
+          WHEN 'int8'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int8 ).
+          WHEN 'lang'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lang ).
+          WHEN 'tims'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->tims ).
+          WHEN 'char'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->char( table_field_line-built_in_type_length ) ).
+          WHEN 'curr'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->curr(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'dec'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dec(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'df16_dec'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_dec(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'df34_dec'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_dec(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'lchr' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lchr( table_field_line-built_in_type_length ) ).
+          WHEN 'lraw'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lraw( table_field_line-built_in_type_length ) ).
+          WHEN 'numc'   .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->numc( table_field_line-built_in_type_length ) ).
+          WHEN 'quan' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->quan(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                              ) ).
+          WHEN 'raw'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->raw( table_field_line-built_in_type_length ) ).
+          WHEN 'rawstring'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->rawstring( table_field_line-built_in_type_length ) ).
+          WHEN 'sstring' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->sstring( table_field_line-built_in_type_length ) ).
+          WHEN 'string' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->string( table_field_line-built_in_type_length ) ).
+          WHEN 'unit'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->unit( table_field_line-built_in_type_length ) ).
+          WHEN OTHERS.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->for(
+                                              iv_type     = to_upper( table_field_line-built_in_type )
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+        ENDCASE.
+
+
+
+
+      ENDIF.
+      IF table_field_line-key_indicator = abap_true.
+        database_table_field->set_key_indicator( ).
+        "not_null must not be set for non-key fields of a draft table
+        "this is because otherwise one would not be able to store data in the draft table
+        "which is inconsistent and still being worked on
+        "for non-key fields this is set like in the ADT quick fix that generates a draft table
+        IF table_field_line-not_null = abap_true.
+          database_table_field->set_not_null( ).
+        ENDIF.
+      ENDIF.
+
+      IF table_field_line-currencycode IS NOT INITIAL.
+        DATA(currkey_dbt_field_upper) = to_upper( table_field_line-currencycode ).
+        "get the cds view field name of the currency or quantity filed
+        DATA(cds_view_ref_field_name) = io_rap_bo_node->lt_fields[ name = currkey_dbt_field_upper ]-cds_view_field .
+        DATA(dbt_ref_field_name) = io_rap_bo_node->lt_fields[ name = currkey_dbt_field_upper ]-name.
+        IF is_draft_table = abap_true.
+          database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( io_rap_bo_node->draft_table_name ) ) )->set_reference_field( to_upper( cds_view_ref_field_name ) ).
+        ELSE.
+          database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( io_rap_bo_node->table_name ) ) )->set_reference_field( to_upper( dbt_ref_field_name ) ).
+        ENDIF.
+      ENDIF.
+      IF table_field_line-unitofmeasure IS NOT INITIAL.
+        DATA(quantity_dbt_field_upper) = to_upper( table_field_line-unitofmeasure ).
+        cds_view_ref_field_name = io_rap_bo_node->lt_fields[ name = quantity_dbt_field_upper ]-cds_view_field .
+        dbt_ref_field_name = io_rap_bo_node->lt_fields[ name = quantity_dbt_field_upper ]-name.
+        IF is_draft_table = abap_true.
+          database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( io_rap_bo_node->draft_table_name ) ) )->set_reference_field( to_upper( cds_view_ref_field_name ) ).
+        ELSE.
+          database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( io_rap_bo_node->table_name ) ) )->set_reference_field( to_upper( dbt_ref_field_name ) ).
+        ENDIF.
+      ENDIF.
+    ENDLOOP.
+
+**********************************************************************
+** Begin of deletion 2020
+**********************************************************************
+    IF is_draft_table = abap_true.
+      lo_specification->add_include( )->set_structure( iv_structure = CONV #( to_upper( 'sych_bdl_draft_admin_inc' ) )  )->set_group_name( to_upper( '%admin' )  ).
+    ENDIF.
+**********************************************************************
+** End of deletion 2020
+**********************************************************************
+
+    IF io_rap_bo_node->is_extensible(  ) = abap_true.
+      lo_specification->add_include( )->set_structure( iv_structure = CONV #( to_upper( io_rap_bo_node->rap_node_objects-extension_include ) )  ).
+      set_table_enhancement_cat_any( lo_specification  ).
+    ENDIF.
+
+    "add additional fields if provided
+    LOOP AT       io_rap_bo_node->lt_additional_fields INTO DATA(additional_fields) WHERE draft_table = abap_true.
+
+      database_table_field = lo_specification->add_field( CONV #( to_upper( additional_fields-cds_view_field ) ) ).
+
+      IF additional_fields-data_element IS NOT INITIAL.
+        database_table_field->set_type( xco_cp_abap_dictionary=>data_element( to_upper( additional_fields-data_element ) ) ).
+      ELSE.
+
+        CASE  to_lower( additional_fields-built_in_type ).
+          WHEN 'accp'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->accp ).
+          WHEN 'clnt'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->clnt ).
+          WHEN 'cuky'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->cuky ).
+          WHEN 'dats'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dats ).
+          WHEN 'df16_raw'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_raw ).
+          WHEN 'df34_raw'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_raw ).
+          WHEN 'fltp'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->fltp ).
+          WHEN 'int1'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int1 ).
+          WHEN 'int2'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int2 ).
+          WHEN 'int4'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int4 ).
+          WHEN 'int8'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int8 ).
+          WHEN 'lang'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lang ).
+          WHEN 'tims'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->tims ).
+          WHEN 'char'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->char( additional_fields-built_in_type_length ) ).
+          WHEN 'curr'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->curr(
+                                              iv_length   = additional_fields-built_in_type_length
+                                              iv_decimals = additional_fields-built_in_type_decimals
+                                            ) ).
+          WHEN 'dec'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dec(
+                                              iv_length   = additional_fields-built_in_type_length
+                                              iv_decimals = additional_fields-built_in_type_decimals
+                                            ) ).
+          WHEN 'df16_dec'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_dec(
+                                              iv_length   = additional_fields-built_in_type_length
+                                              iv_decimals = additional_fields-built_in_type_decimals
+                                            ) ).
+          WHEN 'df34_dec'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_dec(
+                                              iv_length   = additional_fields-built_in_type_length
+                                              iv_decimals = additional_fields-built_in_type_decimals
+                                            ) ).
+          WHEN 'lchr' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lchr( additional_fields-built_in_type_length ) ).
+          WHEN 'lraw'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lraw( additional_fields-built_in_type_length ) ).
+          WHEN 'numc'   .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->numc( additional_fields-built_in_type_length ) ).
+          WHEN 'quan' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->quan(
+                                              iv_length   = additional_fields-built_in_type_length
+                                              iv_decimals = additional_fields-built_in_type_decimals
+                                              ) ).
+          WHEN 'raw'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->raw( additional_fields-built_in_type_length ) ).
+          WHEN 'rawstring'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->rawstring( additional_fields-built_in_type_length ) ).
+          WHEN 'sstring' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->sstring( additional_fields-built_in_type_length ) ).
+          WHEN 'string' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->string( additional_fields-built_in_type_length ) ).
+          WHEN 'unit'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->unit( additional_fields-built_in_type_length ) ).
+          WHEN OTHERS.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->for(
+                                              iv_type     = to_upper( additional_fields-built_in_type )
+                                              iv_length   = additional_fields-built_in_type_length
+                                              iv_decimals = additional_fields-built_in_type_decimals
+                                            ) ).
+        ENDCASE.
+
+      ENDIF.
+
+    ENDLOOP.
+
+
+  ENDMETHOD.
+
+
+  METHOD create_with_rap_node_object.
+    result = NEW #( io_root_node = rap_node ).
+  ENDMETHOD.
+
+
+  METHOD exception_occured.
+    rv_exception_occured = put_exception_occured.
+  ENDMETHOD.
+
+
+  METHOD generate_bo.
+
+    DATA framework_message TYPE zdmo_cl_rap_node=>t_framework_message_fields.
+
+    DATA(rap_bo_name) = get_rap_bo_name(  ).
+
+    DATA log_entries TYPE STANDARD TABLE OF t_log_entry.
+    DATA log_entry TYPE t_log_entry.
+    DATA task_name TYPE string.
+
+    log_entry-text = |Start generating { rap_bo_name }|.
+    log_entry-detaillevel = 1.
+    log_entry-severity = 'S'.
+    APPEND log_entry TO log_entries.
+
+    add_log_entries_for_rap_bo(
+      EXPORTING
+        i_rap_bo_name = rap_bo_name
+        i_log_entries = log_entries
+    ).
+
+    put_exception_occured = abap_false.
+
+    "do not generate repository objects
+    "used for testing purposes to allow skip of generation by only changing the json file
+    IF root_node->generate_only_node_hierachy = abap_true.
+      EXIT.
+    ENDIF.
+
+    IF root_node->multi_edit = abap_true.
+      root_node = root_node->add_virtual_root_node( ).
+    ENDIF.
+
+    assign_package( ).
+
+    TRY.
+        " on premise create draft tables first
+        " uses mo_draft_tabl_put_opertion
+        IF root_node->draft_enabled = abap_true OR
+           root_node->create_table = abap_true OR
+           root_node->is_extensible(  ) = abap_true.
+
+          "create extension includes together with tables
+          IF root_node->is_extensible(  ) = abap_true.
+            create_extension_include( root_node ).
+            LOOP AT root_node->all_childnodes INTO DATA(lo_child_node).
+              create_extension_include( lo_child_node ).
+            ENDLOOP.
+          ENDIF.
+
+          "create draft tables
+          IF root_node->draft_enabled = abap_true.
+            task_name = 'create draft tables'.
+            create_table(
+              EXPORTING
+                io_rap_bo_node = root_node
+                is_draft_table = abap_true
+            ).
+            LOOP AT root_node->all_childnodes INTO lo_child_node.
+              create_table(
+                EXPORTING
+                  io_rap_bo_node = lo_child_node
+                  is_draft_table = abap_true
+              ).
+            ENDLOOP.
+          ENDIF.
+
+          "create tables
+          IF root_node->create_table = abap_true.
+            task_name = 'create tables'.
+            create_table(
+              EXPORTING
+                io_rap_bo_node = root_node
+                is_draft_table = abap_false
+            ).
+            LOOP AT root_node->all_childnodes INTO lo_child_node.
+              create_table(
+                EXPORTING
+                  io_rap_bo_node = lo_child_node
+                  is_draft_table = abap_false
+              ).
+            ENDLOOP.
+          ENDIF.
+
+
+
+
+          DATA lo_result TYPE REF TO if_xco_gen_o_put_result .
+
+          IF root_node->skip_activation = abap_true.
+
+**********************************************************************
+** Begin of insertion 2020
+**********************************************************************
+*            lo_result = mo_draft_tabl_put_opertion->execute( VALUE #( ( xco_cp_generation=>put_operation_option->skip_activation ) ) ).
+**********************************************************************
+** End of deletion 2020
+**********************************************************************
+**********************************************************************
+** Begin of insertion 2020
+**********************************************************************
+            lo_result = mo_draft_tabl_put_operation->execute(  ).
+**********************************************************************
+** End of insertion 2020
+**********************************************************************
+          ELSE.
+            lo_result = mo_draft_tabl_put_operation->execute(  ).
+          ENDIF.
+
+
+
+          DATA(lo_findings) = lo_result->findings.
+          DATA(lt_findings) = lo_findings->get( ).
+
+          add_findings_to_output(
+            i_task_name = 'Generating draft tables'
+            i_findings  = lo_findings
+          ).
+
+**********************************************************************
+          "add draft structures
+          "only needed for on premise systems with older release
+          "method is not implemented for xco cloud api
+**********************************************************************
+          IF xco_api->on_premise_branch_is_used(  ).
+
+            IF root_node->draft_enabled = abap_true.
+              xco_api->add_draft_include( root_node->draft_table_name ).
+              LOOP AT root_node->all_childnodes INTO lo_child_node.
+                xco_api->add_draft_include( lo_child_node->draft_table_name ).
+              ENDLOOP.
+            ENDIF.
+
+            IF root_node->is_extensible(  ) = abap_true.
+              xco_api->add_enh_cat_and_anno_to_struct(
+                ext_include_structure_name   = root_node->rap_node_objects-extension_include
+                extensibility_element_suffix = root_node->extensibility_element_suffix
+                ).
+              "the tables used as a data source have to be draft enabled
+              "so we only have to change the draft tables
+              IF root_node->draft_enabled = abap_true.
+                xco_api->add_enh_cat_to_table( root_node->draft_table_name ).
+              ENDIF.
+              LOOP AT root_node->all_childnodes INTO lo_child_node.
+                xco_api->add_enh_cat_and_anno_to_struct(
+                  ext_include_structure_name   = lo_child_node->rap_node_objects-extension_include
+                  extensibility_element_suffix = lo_child_node->extensibility_element_suffix
+                  ).
+                "the tables used as a data source have to be draft enabled
+                "so we only have to change the draft tables
+                IF root_node->draft_enabled = abap_true.
+                  xco_api->add_enh_cat_to_table( lo_child_node->table_name ).
+                ENDIF.
+              ENDLOOP.
+            ENDIF.
+
+          ENDIF.
+
+        ENDIF.
+
+        DATA has_extension_include TYPE abap_bool.
+
+        IF root_node->data_source_type = zdmo_cl_rap_node=>data_source_types-table AND
+          root_node->is_extensible(  ) = abap_true.
+
+          "check table of root node
+          DATA(database_table) = xco_api->get_database_table( iv_name = to_upper( root_node->data_source_name ) ).
+
+          "@todo check why table is not found when being generated
+          IF database_table->exists(  ).
+            check_and_add_ext_incl_struc( root_node ).
+          ENDIF.
+
+          LOOP AT root_node->all_childnodes INTO DATA(child_nodes_add_incl).
+
+            "check table of root node
+            DATA(database_table_child) = xco_api->get_database_table( iv_name = to_upper( child_nodes_add_incl->data_source_name ) ).
+
+            "@todo check why table is not found when being generated
+            IF database_table_child->exists(  ).
+              check_and_add_ext_incl_struc( child_nodes_add_incl ).
+            ENDIF.
+
+
+          ENDLOOP.
+
+          mo_patch_operation->execute( ).
+
+        ENDIF.
+
+        SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP   WHERE boname = @rap_bo_name
+              INTO @DATA(rap_generator_bo).
+
+
+        "if rap generator is called via the behavior implementation class a table entry will exist.
+        "if rap generator class is called via command-line no table entry will exist.
+        "we will hence create an entity in the RAP BO
+
+        IF rap_generator_bo IS INITIAL.
+*          store_bo(  ).
+        ENDIF.
+
+
+        task_name = 'create entities'.
+        IF root_node->generate_custom_entity(  ).
+          create_custom_entity( root_node ).
+          create_custom_query( root_node ).
+        ELSE.
+          create_r_cds_view( root_node ).
+          IF root_node->is_virtual_root(  ) = abap_false.
+            create_i_cds_view( root_node ).
+          ENDIF.
+          create_p_cds_view( root_node ).
+          create_mde_view( root_node ).
+        ENDIF.
+
+        IF root_node->transactional_behavior = abap_true.
+          task_name = 'create bdef'.
+          create_bdef( root_node ).
+        ENDIF.
+
+        IF root_node->generate_custom_entity(  ) = abap_false AND
+           root_node->transactional_behavior = abap_true.
+          task_name = 'create projection bdef'.
+          create_bdef_p( root_node ).
+          create_bdef_i( root_node ).
+        ENDIF.
+
+
+        IF root_node->generate_bil(  ).
+          task_name = 'create BIL'.
+          create_bil( root_node ).
+        ENDIF.
+
+
+
+        IF root_node->add_basic_i_views = abap_true.
+          task_name = 'create basic i view'.
+          create_i_cds_view_basic( root_node ).
+        ENDIF.
+
+        IF root_node->add_sap_object_type = abap_true.
+          create_sap_object_type( root_node ).
+          create_sap_object_node_type( root_node ).
+        ENDIF.
+
+        LOOP AT root_node->all_childnodes INTO DATA(lo_bo_node).
+
+          IF root_node->add_sap_object_type = abap_true.
+            create_sap_object_node_type( lo_bo_node ).
+          ENDIF.
+
+          IF lo_bo_node->generate_custom_entity(  ).
+            create_custom_entity( lo_bo_node ).
+            create_custom_query( lo_bo_node ).
+          ELSE.
+            create_r_cds_view( lo_bo_node ).
+            IF lo_bo_node->root_node->is_virtual_root(  ) = abap_false.
+              create_i_cds_view( lo_bo_node ).
+            ENDIF.
+            create_p_cds_view( lo_bo_node ).
+            create_mde_view( lo_bo_node ).
+          ENDIF.
+
+          IF lo_bo_node->add_basic_i_views = abap_true.
+            task_name = 'create basic i view'.
+            create_i_cds_view_basic( lo_bo_node ).
+          ENDIF.
+
+          IF lo_bo_node->get_implementation_type( ) = lo_bo_node->implementation_type-unmanaged_semantic.
+            create_control_structure( lo_bo_node ).
+          ENDIF.
+
+          IF lo_bo_node->is_extensible(  ) = abap_true.
+*            create_extension_include( lo_bo_node ).
+            create_extension_include_view( lo_bo_node   ).
+          ENDIF.
+
+          IF lo_bo_node->is_extensible(  ) = abap_true AND
+             lo_bo_node->draft_enabled = abap_true.
+            create_draft_query_view( lo_bo_node ).
+          ENDIF.
+
+          IF lo_bo_node->generate_bil(  ).
+            create_bil( lo_bo_node ).
+          ENDIF.
+
+        ENDLOOP.
+
+        IF root_node->is_extensible(  ) = abap_true.
+*          create_extension_include( root_node ).
+          create_extension_include_view( root_node   ).
+        ENDIF.
+
+        IF root_node->is_extensible(  ) = abap_true AND
+         root_node->draft_enabled = abap_true.
+          create_draft_query_view( root_node ).
+        ENDIF.
+
+        IF root_node->get_implementation_type( ) = root_node->implementation_type-unmanaged_semantic.
+          create_control_structure( root_node ).
+        ENDIF.
+
+        IF root_node->publish_service = abap_true.
+          create_service_definition( root_node ).
+        ENDIF.
+
+
+
+
+        "start to create all objects beside service binding
+
+        IF root_node->skip_activation = abap_true.
+          task_name = 'Generating cds views, bdef, bil and service defintion'.
+**********************************************************************
+** Start of deletion 2020
+**********************************************************************
+*          lo_result = mo_put_operation->execute( VALUE #( ( xco_cp_generation=>put_operation_option->skip_activation ) ) ).
+**********************************************************************
+** End of deletion 2020
+**********************************************************************
+**********************************************************************
+** End of insertion 2020
+**********************************************************************
+          lo_result = mo_put_operation->execute(  ).
+**********************************************************************
+** End of insertion 2020
+**********************************************************************
+        ELSE.
+          lo_result = mo_put_operation->execute(  ).
+        ENDIF.
+
+        lo_findings = lo_result->findings.
+
+        lo_findings = lo_result->findings.
+        lt_findings = lo_findings->get( ).
+
+        add_findings_to_output(
+          i_task_name = 'Generating cds views, bdef, bil and service defintion'
+          i_findings  = lo_findings
+        ).
+
+        framework_message-message = 'Messages and warnings from ADT:'.
+        framework_message-severity = 'I'.
+        APPEND framework_message TO framework_messages.
+
+        IF lt_findings IS NOT INITIAL.
+          LOOP AT lt_findings INTO DATA(ls_findings).
+            framework_message-severity = ls_findings->message->value-msgty.
+            framework_message-object_type = ls_findings->object_type.
+            framework_message-object_name = ls_findings->object_name.
+            framework_message-message = ls_findings->message->get_text(  ).
+            APPEND framework_message TO framework_messages.
+          ENDLOOP.
+        ENDIF.
+
+        "if skip_activation is true the service definition will not be activated.
+        "it is hence not possible to generate a service binding on top
+        IF root_node->publish_service = abap_true AND root_node->skip_activation = abap_false.
+
+          create_service_binding( root_node ).
+
+          "service binding needs a separate put operation
+          lo_result = mo_srvb_put_operation->execute(  ).
+          lo_findings = lo_result->findings.
+
+          add_findings_to_output(
+            i_task_name = 'Generate service binding'
+            i_findings  = lo_findings
+          ).
+
+          DATA(lt_srvb_findings) = lo_findings->get( ).
+
+          IF lt_srvb_findings IS NOT INITIAL.
+
+            CLEAR framework_message.
+
+            LOOP AT lt_srvb_findings INTO ls_findings.
+
+              framework_message-severity = ls_findings->message->value-msgty.
+              framework_message-object_type = ls_findings->object_type.
+              framework_message-object_name = ls_findings->object_name.
+              framework_message-message = ls_findings->message->get_text(  ).
+              APPEND framework_message TO framework_messages.
+
+            ENDLOOP.
+          ENDIF.
+
+          CLEAR log_entries.
+          log_entry-text = |Start publish service binding { root_node->rap_root_node_objects-service_binding }|.
+          log_entry-detaillevel = 1.
+          log_entry-severity = 'S'.
+          APPEND log_entry TO log_entries.
+
+          add_log_entries_for_rap_bo(
+            EXPORTING
+              i_rap_bo_name = rap_bo_name
+              i_log_entries = log_entries
+          ).
+
+          DATA service_binding TYPE sxco_srvb_object_name.
+          service_binding =  root_node->rap_root_node_objects-service_binding   .
+          xco_api->publish_service_binding( service_binding ).
+
+        ENDIF.
+
+
+        "if skip_activation is true the service definition will not be activated.
+        "it is hence not possible to generate a service binding on top
+        "we will thus have no service binding that can be used for registration
+
+
+
+
+        IF root_node->manage_business_configuration = abap_true AND root_node->skip_activation = abap_false.
+
+          zz_add_business_configuration( CHANGING c_framework_messages = framework_messages ).
+
+        ENDIF.
+
+        CLEAR log_entries.
+        log_entry-text = |Generation finished|.
+        log_entry-detaillevel = 1.
+        log_entry-severity = 'S'.
+        APPEND log_entry TO log_entries.
+        add_log_entries_for_rap_bo(
+                    EXPORTING
+                      i_rap_bo_name = rap_bo_name
+                      i_log_entries = log_entries
+                  ).
+      CATCH cx_xco_gen_put_exception INTO DATA(put_exception).
+
+        DATA(put_exception_text) = put_exception->get_text(  ).
+
+
+        CLEAR log_entries.
+        log_entry-text = put_exception_text.
+        log_entry-detaillevel = 1.
+        log_entry-severity = 'E'.
+        APPEND log_entry TO log_entries.
+        add_log_entries_for_rap_bo(
+                                       EXPORTING
+                                         i_rap_bo_name = rap_bo_name
+                                         i_log_entries = log_entries
+                                     ).
+
+        put_exception_occured = abap_true.
+        lo_findings = put_exception->findings.
+        lt_findings = lo_findings->get( ).
+
+        add_findings_to_output(
+          i_task_name = 'Exception occured'
+          i_findings  = lo_findings
+        ).
+
+        CLEAR framework_message.
+        framework_message-message =  'PUT operation failed:'.
+        APPEND framework_message TO framework_messages.
+
+        IF lt_findings IS NOT INITIAL.
+          CLEAR framework_message.
+          LOOP AT lt_findings INTO ls_findings.
+
+            framework_message-severity = ls_findings->message->value-msgty.
+            framework_message-object_type = ls_findings->object_type.
+            framework_message-object_name = ls_findings->object_name.
+            framework_message-message = ls_findings->message->get_text(  ).
+            APPEND framework_message TO framework_messages.
+
+            CLEAR log_entries.
+            log_entry-text = ls_findings->message->get_text(  ).
+            log_entry-detaillevel = 1.
+            log_entry-severity = ls_findings->message->value-msgty.
+            APPEND log_entry TO log_entries.
+            add_log_entries_for_rap_bo(
+                                           EXPORTING
+                                             i_rap_bo_name = rap_bo_name
+                                             i_log_entries = log_entries
+                                         ).
+
+          ENDLOOP.
+        ENDIF.
+        EXIT.
+      CATCH cx_root INTO DATA(lx_root_exception).  "if nothing else has been catched so far
+
+        CLEAR framework_message.
+        framework_message-message = lx_root_exception->get_text( ).
+        APPEND framework_message TO framework_messages.
+
+    ENDTRY.
+
+
+
+    IF root_node->is_extensible(  ) = abap_true.
+
+      DATA released_object  TYPE string .
+
+      TRY.
+
+          CLEAR log_entries.
+          log_entry-text = |Start C0- and C1 release|.
+          log_entry-detaillevel = 1.
+          log_entry-severity = 'S'.
+          APPEND log_entry TO log_entries.
+          add_log_entries_for_rap_bo(
+                                         EXPORTING
+                                           i_rap_bo_name = rap_bo_name
+                                           i_log_entries = log_entries
+                                       ).
+
+          "release root node objects
+
+
+
+
+
+*          DATA(api_state_handler_service_def) = cl_abap_api_state=>create_instance( api_key = VALUE #(
+*               object_type     = 'SRVD'
+*               object_name     = to_upper( |{ root_node->rap_root_node_objects-service_definition }| ) "'ZRAP630UI_Shop_051' )
+*               ) ).
+
+
+
+          DATA(api_state_handler_tabl) = cl_abap_api_state=>create_instance( api_key = VALUE #(
+                object_type     = 'TABL'
+                object_name     = to_upper( |{ root_node->data_source_name }| ) "'zrap630sshop_051' )
+                ) ).
+
+*         api_state_handler_tabl->release(
+*              EXPORTING
+*                release_contract         = 'C0'
+*                use_in_cloud_development = abap_true
+*                use_in_key_user_apps     = abap_false
+*                request                  = CONV #( root_node->transport_request )
+*       ).
+
+**********************************************************************
+
+          released_object = root_node->rap_root_node_objects-behavior_definition_r.
+
+          DATA(api_state_handler_r_bdef) = cl_abap_api_state=>create_instance(
+               api_key = VALUE #(
+               object_type     = 'BDEF'
+               object_name     = to_upper( released_object ) "'ZRAP630R_ShopTP_051' )
+           ) ).
+
+          api_state_handler_r_bdef->release(
+                              EXPORTING
+                                release_contract         = 'C0'
+                                use_in_cloud_development = abap_true
+                                use_in_key_user_apps     = abap_false
+                                request                  = CONV #( root_node->transport_request )
+                            ).
+
+          released_object = root_node->rap_root_node_objects-behavior_definition_i.
+
+          DATA(api_state_handler_i_bdef) = cl_abap_api_state=>create_instance(
+                     api_key = VALUE #(
+                     object_type     = 'BDEF'
+                     object_name     = to_upper( released_object ) "'ZRAP630i_ShopTP_051' )
+                      ) ).
+
+          "i-bdef must first be C1 and then C0 released
+
+          api_state_handler_i_bdef->release(
+            EXPORTING
+              release_contract         = 'C1'
+              use_in_cloud_development = abap_true
+              use_in_key_user_apps     = abap_false
+              request                  = CONV #( root_node->transport_request )
+          ).
+
+          api_state_handler_i_bdef->release(
+            EXPORTING
+              release_contract         = 'C0'
+              use_in_cloud_development = abap_true
+              use_in_key_user_apps     = abap_false
+              request                  = CONV #( root_node->transport_request )
+          ).
+
+          released_object = root_node->rap_root_node_objects-behavior_definition_p.
+
+          DATA(api_state_handler_p_bdef) = cl_abap_api_state=>create_instance(
+               api_key = VALUE #(
+               object_type     = 'BDEF'
+               object_name     = to_upper( released_object ) "'ZRAP630c_ShopTP_051' )
+                ) ).
+
+          api_state_handler_p_bdef->release(
+            EXPORTING
+              release_contract         = 'C0'
+              use_in_cloud_development = abap_true
+              use_in_key_user_apps     = abap_false
+              request                  = CONV #( root_node->transport_request )
+          ).
+
+          CLEAR log_entries.
+          log_entry-text = |BDEF's released|.
+          log_entry-detaillevel = 1.
+          log_entry-severity = 'S'.
+          APPEND log_entry TO log_entries.
+          add_log_entries_for_rap_bo(
+                                         EXPORTING
+                                           i_rap_bo_name = rap_bo_name
+                                           i_log_entries = log_entries
+                                           ).
+
+          WAIT UP TO 1 SECONDS.
+          COMMIT WORK.
+
+          released_object = root_node->rap_node_objects-extension_include.
+
+          DATA(api_state_handler_struct) = cl_abap_api_state=>create_instance( api_key = VALUE #(
+               object_type     = 'TABL'
+               object_name     = to_upper( released_object ) "'zrap630sshop_051' )
+               ) ).
+
+          api_state_handler_struct->release(
+             EXPORTING
+               release_contract         = 'C0'
+               use_in_cloud_development = abap_true
+               use_in_key_user_apps     = abap_false
+               request                  = CONV #( root_node->transport_request )
+           ).
+          WAIT UP TO 1 SECONDS.
+          COMMIT WORK.
+          released_object =   root_node->rap_node_objects-extension_include_view.
+
+          DATA(api_state_handler_ext_view) = cl_abap_api_state=>create_instance( api_key = VALUE #(
+               object_type     = 'DDLS'
+               object_name     = to_upper( released_object ) "'ZRAP630E_Shop_051' )
+               sub_object_type = 'CDS_STOB'
+               sub_object_name     = to_upper( released_object ) "'ZRAP630E_Shop_051' )
+               ) ).
+
+          api_state_handler_ext_view->release(
+            EXPORTING
+              release_contract         = 'C0'
+              use_in_cloud_development = abap_true
+              use_in_key_user_apps     = abap_false
+              request                  = CONV #( root_node->transport_request )
+          ).
+
+          released_object = root_node->rap_node_objects-draft_query_view.
+          WAIT UP TO 1 SECONDS.
+          COMMIT WORK.
+          DATA(api_state_handler_D_qu_view) = cl_abap_api_state=>create_instance( api_key = VALUE #(
+               object_type     = 'DDLS'
+               object_name     = to_upper( released_object ) "'ZRAP630R_Shop_D_051' )
+               sub_object_type = 'CDS_STOB'
+               sub_object_name     = to_upper( released_object ) "'ZRAP630R_Shop_D_051' )
+               ) ).
+
+          api_state_handler_d_qu_view->release(
+                EXPORTING
+                  release_contract         = 'C0'
+                  use_in_cloud_development = abap_true
+                  use_in_key_user_apps     = abap_false
+                  request                  = CONV #( root_node->transport_request )
+              ).
+
+          WAIT UP TO 1 SECONDS.
+          COMMIT WORK.
+
+          released_object = root_node->rap_node_objects-cds_view_r.
+
+          DATA(api_state_handler_r_view) = cl_abap_api_state=>create_instance( api_key = VALUE #(
+               object_type     = 'DDLS'
+               object_name     = to_upper( released_object ) "'ZRAP630R_ShopTP_051' )
+               sub_object_type = 'CDS_STOB'
+               sub_object_name     = to_upper( released_object ) " 'ZRAP630R_ShopTP_051' )
+               ) ).
+
+          api_state_handler_r_view->release(
+          EXPORTING
+            release_contract         = 'C0'
+            use_in_cloud_development = abap_true
+            use_in_key_user_apps     = abap_false
+            request                  = CONV #( root_node->transport_request )
+        ).
+
+          released_object = root_node->rap_node_objects-cds_view_i.
+          WAIT UP TO 1 SECONDS.
+          COMMIT WORK.
+          DATA(api_state_handler_i_view) = cl_abap_api_state=>create_instance( api_key = VALUE #(
+               object_type     = 'DDLS'
+               object_name     = to_upper( released_object ) "'ZRAP630i_ShopTP_051' )
+               sub_object_type = 'CDS_STOB'
+               sub_object_name     = to_upper( released_object )  " 'ZRAP630i_ShopTP_051' )
+               ) ).
+
+          "cds interface view must first be C1 and then C0 released
+
+          api_state_handler_i_view->release(
+            EXPORTING
+              release_contract         = 'C1'
+              use_in_cloud_development = abap_true
+              use_in_key_user_apps     = abap_false
+              request                  = CONV #( root_node->transport_request )
+          ).
+          WAIT UP TO 1 SECONDS.
+          COMMIT WORK.
+          api_state_handler_i_view->release(
+            EXPORTING
+              release_contract         = 'C0'
+              use_in_cloud_development = abap_true
+              use_in_key_user_apps     = abap_false
+              request                  = CONV #( root_node->transport_request )
+          ).
+
+          released_object = root_node->rap_node_objects-cds_view_p.
+          WAIT UP TO 1 SECONDS.
+          COMMIT WORK.
+          DATA(api_state_handler_c_view) = cl_abap_api_state=>create_instance( api_key = VALUE #(
+               object_type     = 'DDLS'
+               object_name     = to_upper( released_object ) "'ZRAP630c_ShopTP_051' )
+               sub_object_type = 'CDS_STOB'
+               sub_object_name     = to_upper( released_object ) " 'ZRAP630c_ShopTP_051' )
+               ) ).
+
+          api_state_handler_c_view->release(
+            EXPORTING
+              release_contract         = 'C0'
+              use_in_cloud_development = abap_true
+              use_in_key_user_apps     = abap_false
+              request                  = CONV #( root_node->transport_request )
+          ).
+          WAIT UP TO 1 SECONDS.
+          COMMIT WORK.
+          CLEAR log_entries.
+          log_entry-text = |Root node objects { root_node->entityname } released|.
+          log_entry-detaillevel = 1.
+          log_entry-severity = 'S'.
+          APPEND log_entry TO log_entries.
+          add_log_entries_for_rap_bo(
+                                         EXPORTING
+                                           i_rap_bo_name = rap_bo_name
+                                           i_log_entries = log_entries
+                                       ).
+
+          "release cds views of child nodes
+          LOOP AT root_node->all_childnodes INTO DATA(child_node).
+
+            released_object = child_node->rap_node_objects-extension_include.
+
+            api_state_handler_struct = cl_abap_api_state=>create_instance( api_key = VALUE #(
+                  object_type     = 'TABL'
+                  object_name     = to_upper( released_object ) "'zrap630sshop_051' )
+                  ) ).
+
+            api_state_handler_struct->release(
+                                 EXPORTING
+                                   release_contract         = 'C0'
+                                   use_in_cloud_development = abap_true
+                                   use_in_key_user_apps     = abap_false
+                                   request                  = CONV #( root_node->transport_request )
+                               ).
+
+            released_object = child_node->rap_node_objects-extension_include_view.
+
+            api_state_handler_ext_view = cl_abap_api_state=>create_instance( api_key = VALUE #(
+                 object_type     = 'DDLS'
+                 object_name     = to_upper( released_object ) "'ZRAP630E_Shop_051' )
+                 sub_object_type = 'CDS_STOB'
+                 sub_object_name     = to_upper( released_object ) "'ZRAP630E_Shop_051' )
+                 ) ).
+
+            api_state_handler_ext_view->release(
+              EXPORTING
+                release_contract         = 'C0'
+                use_in_cloud_development = abap_true
+                use_in_key_user_apps     = abap_false
+                request                  = CONV #( root_node->transport_request )
+            ).
+
+            released_object = child_node->rap_node_objects-draft_query_view.
+
+            api_state_handler_D_qu_view = cl_abap_api_state=>create_instance( api_key = VALUE #(
+                 object_type     = 'DDLS'
+                 object_name     = to_upper( |{ child_node->rap_node_objects-draft_query_view }| ) "'ZRAP630R_Shop_D_051' )
+                 sub_object_type = 'CDS_STOB'
+                 sub_object_name     = to_upper( |{ child_node->rap_node_objects-draft_query_view }| ) "'ZRAP630R_Shop_D_051' )
+                 ) ).
+
+            api_state_handler_d_qu_view->release(
+                  EXPORTING
+                    release_contract         = 'C0'
+                    use_in_cloud_development = abap_true
+                    use_in_key_user_apps     = abap_false
+                    request                  = CONV #( root_node->transport_request )
+                ).
+
+
+
+            released_object = child_node->rap_node_objects-cds_view_r.
+
+            api_state_handler_r_view = cl_abap_api_state=>create_instance( api_key = VALUE #(
+                 object_type     = 'DDLS'
+                 object_name     = to_upper( released_object ) "'ZRAP630R_ShopTP_051' )
+                 sub_object_type = 'CDS_STOB'
+                 sub_object_name     = to_upper( released_object ) " 'ZRAP630R_ShopTP_051' )
+                 ) ).
+
+            api_state_handler_r_view->release(
+            EXPORTING
+              release_contract         = 'C0'
+              use_in_cloud_development = abap_true
+              use_in_key_user_apps     = abap_false
+              request                  = CONV #( root_node->transport_request )
+            ).
+
+
+            released_object = child_node->rap_node_objects-cds_view_i.
+
+            api_state_handler_i_view = cl_abap_api_state=>create_instance( api_key = VALUE #(
+                 object_type     = 'DDLS'
+                 object_name     = to_upper( released_object ) "'ZRAP630i_ShopTP_051' )
+                 sub_object_type = 'CDS_STOB'
+                 sub_object_name     = to_upper( released_object )  " 'ZRAP630i_ShopTP_051' )
+                 ) ).
+
+            api_state_handler_i_view->release(
+              EXPORTING
+                release_contract         = 'C1'
+                use_in_cloud_development = abap_true
+                use_in_key_user_apps     = abap_false
+                request                  = CONV #( root_node->transport_request )
+            ).
+
+            api_state_handler_i_view->release(
+              EXPORTING
+                release_contract         = 'C0'
+                use_in_cloud_development = abap_true
+                use_in_key_user_apps     = abap_false
+                request                  = CONV #( root_node->transport_request )
+            ).
+
+            released_object = child_node->rap_node_objects-cds_view_p.
+
+            api_state_handler_c_view = cl_abap_api_state=>create_instance( api_key = VALUE #(
+                 object_type     = 'DDLS'
+                 object_name     = to_upper( released_object ) "'ZRAP630c_ShopTP_051' )
+                 sub_object_type = 'CDS_STOB'
+                 sub_object_name     = to_upper( released_object ) " 'ZRAP630c_ShopTP_051' )
+                 ) ).
+
+            api_state_handler_c_view->release(
+              EXPORTING
+                release_contract         = 'C0'
+                use_in_cloud_development = abap_true
+                use_in_key_user_apps     = abap_false
+                request                  = CONV #( root_node->transport_request )
+       ).
+
+            CLEAR log_entries.
+            log_entry-text = |Child node objects { child_node->entityname } released|.
+            log_entry-detaillevel = 1.
+            log_entry-severity = 'S'.
+            APPEND log_entry TO log_entries.
+            add_log_entries_for_rap_bo(
+                                           EXPORTING
+                                             i_rap_bo_name = rap_bo_name
+                                             i_log_entries = log_entries
+                                         ).
+
+          ENDLOOP.
+
+
+
+          "release service definition
+          "cannot be performed yet since the appropriate annotation cannot be yet set programmatically via XCO
+
+*          api_state_handler_service_def->release(
+*                 EXPORTING
+*                   release_contract         = 'C0'
+*                   use_in_cloud_development = abap_true
+*                   use_in_key_user_apps     = abap_false
+*                   request                  = CONV #( root_node->transport_request )
+*          ).
+
+
+          CLEAR log_entries.
+          log_entry-text = |C0- and C1 release finished|.
+          log_entry-detaillevel = 1.
+          log_entry-severity = 'S'.
+          APPEND log_entry TO log_entries.
+          add_log_entries_for_rap_bo(
+                                EXPORTING
+                                  i_rap_bo_name = rap_bo_name
+                                  i_log_entries = log_entries
+                              ).
+        CATCH cx_abap_api_state INTO DATA(lx_abap_api_state). " API State Handler
+          DATA(lt_msg) = lx_abap_api_state->get_text( ).
+          CLEAR log_entries.
+          log_entry-text = |C0- or C1 release of { released_object } failed.|.
+          log_entry-detaillevel = 1.
+          log_entry-severity = 'E'.
+          APPEND log_entry TO log_entries.
+          add_log_entries_for_rap_bo(
+                      EXPORTING
+                        i_rap_bo_name = rap_bo_name
+                        i_log_entries = log_entries
+                    ).
+          CLEAR log_entries.
+          log_entry-text = lt_msg .
+          APPEND log_entry TO log_entries.
+          add_log_entries_for_rap_bo(
+                      EXPORTING
+                        i_rap_bo_name = rap_bo_name
+                        i_log_entries = log_entries
+                    ).
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD get_generated_repo_objects.
+    r_generated_repository_objects = generated_repository_objects.
+  ENDMETHOD.
+
+
+  METHOD get_rap_bo_name.
+    IF root_node->is_consistent( ).
+      rap_bo_name = root_node->rap_root_node_objects-behavior_definition_r.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_transport_layer.
+
+    DATA(lo_package) = io_package.
+    DO.
+      DATA(ls_package) = lo_package->read( ).
+      IF ls_package-property-transport_layer->value EQ '$SPL'.
+        lo_package = ls_package-property-super_package.
+        CONTINUE.
+      ENDIF.
+      ro_transport_layer = ls_package-property-transport_layer.
+      EXIT.
+    ENDDO.
+  ENDMETHOD.
+
+
+  METHOD put_operation_execute.
+    super->put_operation_execute(
+      EXPORTING
+        i_put_operation   = i_put_operation
+        i_skip_activation = i_skip_activation
+      RECEIVING
+        r_result          = r_result
+    ).
+  ENDMETHOD.
+
+
+  METHOD store_bo.
+
+    " data is stored in root_node
+
+    DATA update_bonodes TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node.
+
+
+    DATA update_fields TYPE TABLE FOR UPDATE ZDMO_R_RAPG_FieldTP.
+    DATA update_field TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_FieldTP.
+
+    DATA cid TYPE i.
+
+
+
+    DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib.
+    DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+    IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_true.
+      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+
+*    WAIT UP TO 5 SECONDS.
+
+    IF root_node->data_source_type = root_node->data_source_types-table.
+      DATA(lo_database_table) = xco_lib->get_database_table( CONV  sxco_dbt_object_name( root_node->data_source_name ) ).
+      IF lo_database_table->exists(  ) = abap_false.
+        COMMIT WORK.
+      ENDIF.
+      lo_database_table = xco_lib->get_database_table( CONV  sxco_dbt_object_name( root_node->data_source_name ) ).
+      IF lo_database_table->exists(  ) = abap_false.
+        RETURN.
+      ENDIF.
+    ENDIF.
+
+    "create BO and root node via action
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+      ENTITY Project
+        EXECUTE createProjectAndRootNode  "  createBOandRootNode
+          FROM VALUE #( (
+          %cid = 'ROOT1'
+          %param-BdefImplementationType =  root_node->get_implementation_type( )
+          %param-BindingType = root_node->binding_type
+          %param-DraftEnabled = root_node->draft_enabled
+          %param-entityname = root_node->EntityName
+          %param-data_source_name = root_node->data_source_name
+          %param-DataSourceType = root_node->data_source_type
+          %param-package_name = root_node->package
+          %param-isExtensible = root_node->is_extensible(  )
+          ) )
+             " check result
+      MAPPED   DATA(mapped)
+      FAILED   DATA(failed)
+      REPORTED DATA(reported).
+
+    CHECK mapped-project[] IS NOT INITIAL.
+
+
+    "get copied root node
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP
+                  ENTITY Project BY \_node
+                  ALL  FIELDS
+                  WITH VALUE #( ( %is_draft   = if_abap_behv=>mk-on
+                                  RapboUUID = mapped-project[ 1 ]-RapboUUID  ) )
+                  RESULT DATA(copied_root_nodes).
+
+    CHECK lines( copied_root_nodes ) = 1.
+
+    DATA(copied_root_node) = copied_root_nodes[ 1 ].
+
+    "set fields for copied header and root node
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+    ENTITY Project
+    UPDATE FIELDS ( AddToManageBusinessConfig
+                    CustomizingTable
+                    MultiInlineEdit
+                    Suffix
+                    Prefix
+                    SkipActivation
+                    AddIViewBasic
+*                    isExtensible
+                    "extensibilityElementSuffix
+                    )
+    WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on
+                    RapboUUID = mapped-project[ 1 ]-RapboUUID
+
+                    AddToManageBusinessConfig = root_node->manage_business_configuration
+                    CustomizingTable = root_node->is_customizing_table
+                    MultiInlineEdit = root_node->multi_edit
+
+                    Suffix = root_node->Suffix
+                    Prefix = root_node->Prefix
+                    SkipActivation = root_node->skip_activation
+
+                    AddIViewBasic = root_node->add_basic_i_views
+*                    isExtensible = rapbo-isExtensible
+                    extensibilityElementSuffix = root_node->extensibility_element_suffix
+                    ) )
+
+     FAILED   DATA(failed_update_root_bo_node)
+     REPORTED DATA(reported_update_root_bo_node).
+
+    "in a second modify we set the field names according to the data from the source project
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+    ENTITY Node
+    UPDATE FIELDS (
+*                      DataSource
+                    FieldNameCreatedAt
+                    FieldNameCreatedby
+                    FieldNameEtagMaster
+                    FieldNameLastChangedAt
+                    FieldNameLastChangedBy
+                    FieldNameLocLastChangedAt
+                    FieldNameObjectID
+                    FieldNameParentUUID
+                    FieldNameRootUUID
+                    FieldNameTotalEtag
+                    FieldNameUUID
+                    ExtensibilityElementSuffix
+                    )
+    WITH VALUE #( (
+                    NodeUUID = copied_root_node-NodeUUID
+                    %is_draft = if_abap_behv=>mk-on
+*                      DataSource = root_node-DataSource
+                    "check if the following fields have to be set using a seperate EML call
+                    FieldNameCreatedAt = root_node->field_name-created_at
+                    FieldNameCreatedby = root_node->field_name-created_by
+                    FieldNameEtagMaster = root_node->Field_Name-etag_master
+                    FieldNameLastChangedAt = root_node->Field_Name-last_changed_at
+                    FieldNameLastChangedBy = root_node->Field_Name-last_changed_by
+                    FieldNameLocLastChangedAt = root_node->Field_Name-local_instance_last_changed_at
+                    FieldNameObjectID = root_node->object_id
+                    FieldNameParentUUID = root_node->Field_Name-parent_uuid
+                    FieldNameRootUUID = root_node->Field_Name-Root_UUID
+                    FieldNameTotalEtag = root_node->Field_Name-total_etag
+                    FieldNameUUID = root_node->Field_Name-uuid
+                    ExtensibilityElementSuffix = root_node->extensibility_element_suffix
+                    ) )
+     FAILED   DATA(failed_update_root_bo_node2)
+     REPORTED DATA(reported_update_root_bo_node2).
+
+
+
+
+
+    "read copied project header data
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP
+    ENTITY Project
+    ALL FIELDS
+    WITH VALUE #( ( %is_draft        = if_abap_behv=>mk-on
+                    RapboUUID = mapped-project[ 1 ]-RapboUUID  ) )
+    RESULT DATA(copied_rapbos).
+
+    CHECK lines( copied_rapbos ) = 1.
+
+
+    "get created fields
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP
+                  ENTITY node
+                  BY \_field
+                  ALL  FIELDS
+                  WITH VALUE #( ( %is_draft   = if_abap_behv=>mk-on
+                                  NodeUUID    = copied_root_nodes[ 1 ]-NodeUUID  ) )
+                  RESULT DATA(new_fields).
+
+
+*  rapbo_node-EntityName
+    "When the project is marked as extensible tables of the source project have a dummy field.
+
+    LOOP AT new_fields INTO DATA(new_field).
+      IF line_exists( root_node->lt_fields[ name = new_field-dbtablefield  ] ).
+        update_field-FieldUUID = new_field-FieldUUID.
+        update_field-%is_draft = if_abap_behv=>mk-on.
+        update_field-CdsViewField = root_node->lt_fields[ name = new_field-dbtablefield  ]-cds_view_field.
+        APPEND update_field TO update_fields.
+      ENDIF.
+    ENDLOOP.
+
+
+
+    " loop at nodes of the source project beside the root node
+
+    LOOP AT root_node->all_childnodes INTO DATA(rapbo_node).
+
+      cid += 1.
+
+      "get copied rapbo nodes
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP
+                    ENTITY Project BY \_node
+                    ALL  FIELDS
+                    WITH VALUE #( ( %is_draft   = if_abap_behv=>mk-on
+                                    RapboUUID = mapped-project[ 1 ]-RapboUUID  ) )
+                    RESULT DATA(copied_rapbo_nodes).
+
+      "get uuid of parent node
+      DATA(uuid_of_parent_node) = copied_rapbo_nodes[ EntityName = rapbo_node->parent_node->EntityName ]-NodeUUID.
+
+      MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+      ENTITY node
+        EXECUTE addChildNode
+          FROM VALUE #( (
+                              %tky = VALUE #(  %is_draft = if_abap_behv=>mk-on
+                                                NodeUUID = uuid_of_parent_node )
+                              %param-entity_name = rapbo_node->EntityName
+                              %param-DataSourceName = rapbo_node->data_source_name
+                              %param-DataSourceType = root_node->data_source_type
+          ) )
+
+      MAPPED   DATA(mapped_add_child)
+      FAILED   DATA(failed_add_child)
+      REPORTED DATA(reported_add_child).
+
+      "in a second modify we set the field names according to the data from the source project
+      MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+      ENTITY Node
+      UPDATE FIELDS (
+*                        DataSource
+                      FieldNameCreatedAt FieldNameCreatedby FieldNameEtagMaster FieldNameLastChangedAt FieldNameLastChangedBy
+                      FieldNameLocLastChangedAt FieldNameObjectID FieldNameParentUUID FieldNameRootUUID FieldNameTotalEtag
+                      FieldNameUUID
+                      extensibilityElementSuffix
+                      )
+      WITH VALUE #( (
+
+                                 NodeUUID = mapped_add_child-node[ 1 ]-NodeUUID
+                                 %is_draft = if_abap_behv=>mk-on
+*                                   DataSource = rapbo_node-DataSource
+                                 "check if the following fields have to be set using a seperate EML call
+                                 fieldnamecreatedat = rapbo_node->field_name-created_at
+                                 fieldnamecreatedby = rapbo_node->field_name-created_by
+                                 fieldnameetagmaster = rapbo_node->field_name-etag_master
+                                 fieldnamelastchangedat = rapbo_node->field_name-last_changed_at
+                                 fieldnamelastchangedby = rapbo_node->field_name-last_changed_by
+                                 fieldnameloclastchangedat = rapbo_node->field_name-local_instance_last_changed_at
+                                 fieldnameobjectid = rapbo_node->object_id
+                                 fieldnameparentuuid = rapbo_node->field_name-parent_uuid
+                                 fieldnamerootuuid = rapbo_node->field_name-root_uuid
+                                 fieldnametotaletag = rapbo_node->field_name-total_etag
+                                 FieldNameUUID = rapbo_node->field_name-uuid
+                                 extensibilityElementSuffix = rapbo_node->extensibility_element_suffix
+
+                      ) )
+       FAILED   DATA(failed_update_child_bo_node2)
+       REPORTED DATA(reported_update_child_bo_node2).
+
+
+*        LOOP AT mapped_add_child-field INTO DATA(mapped_add_child_field).
+
+* ENTITY Project BY \_node
+*                      ALL  FIELDS
+*                      WITH VALUE #( ( %is_draft   = if_abap_behv=>mk-on
+*                                      RapboUUID = mapped-project[ 1 ]-RapboUUID  ) )
+*                      RESULT DATA(copied_rapbo_nodes).
+
+      "get created fields
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP
+                    ENTITY node
+                    BY \_field
+                    ALL  FIELDS
+                    WITH VALUE #( ( %is_draft   = if_abap_behv=>mk-on
+                                    NodeUUID    = mapped_add_child-node[ 1 ]-NodeUUID  ) )
+                    RESULT new_fields.
+
+
+*  rapbo_node-EntityName
+
+*LOOP AT new_fields INTO DATA(new_field).
+*      IF line_exists( root_node->lt_fields[ name = new_field-dbtablefield  ] ).
+*        update_field-FieldUUID = new_field-FieldUUID.
+*        update_field-%is_draft = if_abap_behv=>mk-on.
+*        update_field-CdsViewField = root_node->lt_fields[ name = new_field-dbtablefield  ]-cds_view_field.
+*        APPEND update_field TO update_fields.
+*      ENDIF.
+*    ENDLOOP.
+
+
+      LOOP AT new_fields INTO new_field.
+        IF line_exists( rapbo_node->lt_fields[ name = new_field-dbtablefield  ] ).
+          update_field-FieldUUID = new_field-FieldUUID.
+          update_field-%is_draft = if_abap_behv=>mk-on.
+          update_field-CdsViewField = rapbo_node->lt_fields[ name = new_field-dbtablefield  ]-cds_view_field.
+          APPEND update_field TO update_fields.
+        ENDIF.
+      ENDLOOP.
+
+    ENDLOOP.
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+            ENTITY Field
+            UPDATE FIELDS (
+                            CdsViewField
+                            )
+                          WITH
+                      update_fields
+                   FAILED   DATA(failed_update_child_bo_node3)
+                   REPORTED DATA(reported_update_child_bo_node3).
+
+*    APPEND VALUE #(
+*     "von der quelle hier im Schlüssel
+*                     rapbouuid  = rapbo-RapboUUID "  mapped-rapgeneratorbo[ 1 ]-RapNodeUUID
+*                     %is_draft = rapbo-%is_draft "  mapped-rapgeneratorbo[ 1 ]-%is_draft
+*                     "hier steht was rauskommt
+*                     "also mapping der alten auf neue keys
+*                     %param = VALUE #( %is_draft = mapped-project[ 1 ]-%is_draft
+*                                       %key      = mapped-project[ 1 ]-%key ) ) TO result.
+
+  ENDMETHOD.
+
+
+  METHOD zz_add_business_configuration.
+
+    DATA framework_message TYPE zdmo_cl_rap_node=>t_framework_message_fields.
+
+    TRY.
+        CLEAR framework_message.
+        framework_message-message = 'Messages from business configuration registration'.
+        framework_message-severity = 'I'.
+        APPEND framework_message TO c_framework_messages.
+
+
+        DATA(lo_business_configuration) = mbc_cp_api=>business_configuration(
+          iv_identifier = root_node->manage_business_config_names-identifier
+          iv_namespace  = root_node->manage_business_config_names-namespace
+        ).
+
+        lo_business_configuration->create(
+          iv_name                      = root_node->manage_business_config_names-name
+          iv_description               = root_node->manage_business_config_names-description
+          iv_service_binding           = CONV #( to_upper( root_node->rap_root_node_objects-service_binding ) )
+          iv_service_name              = CONV #( to_upper( root_node->rap_root_node_objects-service_binding ) )
+          iv_service_version           = 0001
+          iv_root_entity_set           = root_node->entityname
+          iv_transport                 = CONV #( mo_transport )
+          iv_skip_root_entity_list_rep = root_node->is_virtual_root( )
+        ).
+
+        CLEAR framework_message.
+        framework_message-severity = 'S'.
+        framework_message-message = |{ root_node->manage_business_config_names-identifier } registered successfully.| .
+        APPEND framework_message TO  c_framework_messages.
+
+      CATCH cx_mbc_api_exception INTO DATA(lx_mbc_api_exception).
+
+        put_exception_occured = abap_true.
+
+        DATA(lt_messages) = lx_mbc_api_exception->if_xco_news~get_messages( ).
+
+        CLEAR framework_message.
+        LOOP AT lt_messages INTO DATA(lo_message).
+          framework_message-severity = lo_message->value-msgty.
+          framework_message-message =  lo_message->get_text( ).
+          APPEND framework_message TO c_framework_messages.
+        ENDLOOP.
+    ENDTRY.
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_generator.clas.xml b/src/zdmo_cl_rap_generator.clas.xml
new file mode 100644
index 0000000..7723f2a
--- /dev/null
+++ b/src/zdmo_cl_rap_generator.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GENERATOR</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>RAP Generator</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_generator_asyn.clas.abap b/src/zdmo_cl_rap_generator_asyn.clas.abap
new file mode 100644
index 0000000..e7bbe53
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_asyn.clas.abap
@@ -0,0 +1,138 @@
+CLASS zdmo_cl_rap_generator_asyn DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_serializable_object .
+    INTERFACES if_bgmc_operation .
+    INTERFACES if_bgmc_op_single_tx_uncontr .
+    INTERFACES if_abap_parallel.
+
+    METHODS constructor
+      IMPORTING
+        i_json_string              TYPE ZDMO_R_RAPG_ProjectTP-JsonString
+        i_package_language_version TYPE ZDMO_R_RAPG_ProjectTP-PackageLanguageVersion
+        i_rap_bo_uuid              TYPE  ZDMO_R_RAPG_ProjectTP-RapBoUUID OPTIONAL.
+
+
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA json_string TYPE ZDMO_R_RAPG_ProjectTP-JsonString.
+    DATA package_language_version TYPE ZDMO_R_RAPG_ProjectTP-PackageLanguageVersion.
+    DATA rap_bo_uuid TYPE  ZDMO_R_RAPG_ProjectTP-RapBoUUID.
+    METHODS start_generator.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GENERATOR_ASYN IMPLEMENTATION.
+
+
+  METHOD constructor.
+    json_string = i_json_string.
+    package_language_version = i_package_language_version.
+    rap_bo_uuid              = i_rap_bo_uuid.
+  ENDMETHOD.
+
+
+  METHOD if_abap_parallel~do.
+    start_generator(  ).
+  ENDMETHOD.
+
+
+  METHOD if_bgmc_op_single_tx_uncontr~execute.
+    start_generator(  ).
+  ENDMETHOD.
+
+
+  METHOD start_generator.
+    DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+    IF rap_bo_uuid IS NOT INITIAL.
+
+      READ ENTITIES OF ZDMO_R_RAPG_ProjectTP
+        ENTITY Project
+            ALL FIELDS WITH VALUE #( ( %key-RapBoUUID = rap_bo_uuid
+                                 ) )
+        RESULT DATA(items)
+        FAILED DATA(read_failed).
+
+      "Fill job status fields
+      MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+       ENTITY Project
+           UPDATE FIELDS ( JobStatus JobStatusCriticality JobStatusText )
+           WITH VALUE #( FOR item IN items ( %key = item-%key
+                                             JobStatus = 'R'
+                                             JobStatusCriticality = '2' "orange
+                                             JobStatusText = 'Running'
+                                                      ) )
+       REPORTED DATA(update_reported).
+
+      COMMIT ENTITIES .
+      COMMIT WORK.
+    ENDIF.
+
+    CASE package_language_version.
+
+      WHEN zdmo_cl_rap_node=>package_abap_language_version-standard.
+        DATA(rap_generator_on_prem) = zdmo_cl_rap_generator=>create_for_on_prem_development( json_string ).
+        DATA(framework_messages) = rap_generator_on_prem->generate_bo( ).
+
+
+      WHEN zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform.
+
+        "If in on premise systems packages with the language version abap_for_sap_cloud_platform are used
+        "we have to use the xco_cp libraries for generation and
+        "we have to use the xco on prem libraries for reading
+
+        IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_true.
+          DATA(rap_generator) = zdmo_cl_rap_generator=>create_for_on_prem_development( json_string ).
+        ELSE.
+          rap_generator = zdmo_cl_rap_generator=>create_for_cloud_development( json_string ).
+        ENDIF.
+
+        framework_messages = rap_generator->generate_bo( ).
+
+      WHEN OTHERS.
+
+        IF rap_bo_uuid IS NOT INITIAL.
+          "Fill job status fields
+          MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+           ENTITY Project
+               UPDATE FIELDS ( JobStatus JobStatusCriticality JobStatusText )
+               WITH VALUE #( FOR item IN items ( %key = item-%key
+                                                 JobStatus = 'A'
+                                                 JobStatusCriticality = '1' "orange
+                                                 JobStatusText = 'Aborted'
+                                                          ) )
+           REPORTED DATA(update_reported_aborted).
+          COMMIT ENTITIES .
+          COMMIT WORK.
+        ENDIF.
+
+        RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+          EXPORTING
+            textid = zdmo_cx_rap_generator=>root_cause_exception.
+
+
+    ENDCASE.
+
+    IF rap_bo_uuid IS NOT INITIAL.
+
+      "Fill job status fields
+      MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+       ENTITY Project
+           UPDATE FIELDS ( JobStatus JobStatusCriticality JobStatusText )
+           WITH VALUE #( FOR item IN items ( %key = item-%key
+                                             JobStatus = 'F'
+                                             JobStatusCriticality = '3' "green
+                                             JobStatusText = 'Finished'
+                                                      ) )
+       REPORTED DATA(update_reported_finished).
+      COMMIT ENTITIES .
+      COMMIT WORK.
+
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_generator_asyn.clas.xml b/src/zdmo_cl_rap_generator_asyn.clas.xml
new file mode 100644
index 0000000..0faa65b
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_asyn.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GENERATOR_ASYN</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>run RAP Generator asynchronously</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_generator_base.clas.abap b/src/zdmo_cl_rap_generator_base.clas.abap
new file mode 100644
index 0000000..0470fc2
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_base.clas.abap
@@ -0,0 +1,197 @@
+CLASS zdmo_cl_rap_generator_base DEFINITION ABSTRACT
+  PUBLIC
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    DATA : mo_environment               TYPE REF TO if_xco_cp_gen_env_dev_system,
+           mo_put_operation             TYPE REF TO if_xco_cp_gen_d_o_put,
+           mo_draft_tabl_put_operation  TYPE REF TO if_xco_cp_gen_d_o_put,
+           mo_put_operation1            TYPE REF TO if_xco_cp_gen_d_o_put,
+           mo_put_operation2            TYPE REF TO if_xco_cp_gen_d_o_put,
+           mo_srvb_put_operation        TYPE REF TO if_xco_cp_gen_d_o_put,
+           mo_patch_operation           TYPE REF TO if_xco_cp_gen_o_patch_mass,
+           mo_bdef_specification        TYPE REF TO if_xco_cp_gen_bdef_s_form,
+           mo_table_specification       TYPE REF TO if_xco_cp_gen_tabl_dbt_s_form,
+           mo_struct_specification      TYPE REF TO if_xco_cp_gen_tabl_str_s_form,
+           mo_service_def_specification TYPE REF TO if_xco_cp_gen_srvd_s_form.
+    METHODS get_environment IMPORTING i_transport          TYPE sxco_transport OPTIONAL
+                            RETURNING VALUE(r_environment) TYPE REF TO if_xco_cp_gen_env_dev_system.
+    METHODS get_put_operation IMPORTING i_environment          TYPE REF TO if_xco_cp_gen_env_dev_system
+                              RETURNING VALUE(r_put_operation) TYPE REF TO if_xco_cp_gen_d_o_put .
+    METHODS get_put_operation_for_devc IMPORTING i_environment          TYPE REF TO if_xco_cp_gen_env_dev_system
+                                       RETURNING VALUE(r_put_operation) TYPE REF TO if_xco_cp_gen_devc_d_o_put  .
+    METHODS get_patch_operation IMPORTING i_environment            TYPE REF TO if_xco_cp_gen_env_dev_system
+                                RETURNING VALUE(r_patch_operation) TYPE REF TO if_xco_cp_gen_o_patch_mass.
+*    DATA : mo_environment             TYPE REF TO if_xco_gen_environment,
+*           mo_put_operation           TYPE REF TO if_xco_gen_o_mass_put,
+*           mo_put_operation1          TYPE REF TO if_xco_gen_o_mass_put,
+*           mo_put_operation2          TYPE REF TO if_xco_gen_o_mass_put,
+*           mo_draft_tabl_put_operation TYPE REF TO if_xco_gen_o_mass_put,
+*           mo_srvb_put_operation      TYPE REF TO if_xco_gen_o_mass_put,
+*           mo_patch_operation         type ref to if_xco_gen_o_patch_mass,
+*           mo_bdef_specification       TYPE REF TO if_xco_gen_bdef_s_form,
+*           mo_table_specification       TYPE REF TO if_xco_gen_tabl_dbt_s_form,
+*           mo_struct_specification      TYPE REF TO if_xco_gen_tabl_str_s_form,
+*           mo_service_def_specification TYPE REF TO if_xco_gen_srvd_s_form.
+*    METHODS get_environment IMPORTING i_transport          TYPE sxco_transport OPTIONAL
+*                            RETURNING VALUE(r_environment) TYPE REF TO if_xco_gen_environment.
+*    METHODS get_put_operation_for_devc IMPORTING i_environment          TYPE REF TO if_xco_gen_environment
+*                                       RETURNING VALUE(r_put_operation) TYPE REF TO if_xco_gen_devc_o_put     .
+*    METHODS get_put_operation IMPORTING i_environment          TYPE REF TO if_xco_gen_environment
+*                              RETURNING VALUE(r_put_operation) TYPE REF TO if_xco_gen_o_mass_put  .
+*    METHODS get_patch_operation IMPORTING i_environment            TYPE REF TO if_xco_gen_environment
+*                                RETURNING VALUE(r_patch_operation) TYPE REF TO if_xco_gen_o_patch_mass.
+
+  PROTECTED SECTION.
+    METHODS cds_p_view_set_provider_cntrct IMPORTING i_projection_view_spcification TYPE REF TO if_xco_gen_ddls_s_fo_p_view .
+    METHODS cds_i_view_set_provider_cntrct IMPORTING i_interface_view_spcification TYPE REF TO if_xco_gen_ddls_s_fo_p_view .
+    METHODS set_extensible_for_mapping IMPORTING io_mapping TYPE REF TO if_xco_gen_bdef_s_fo_b_mapping .
+    METHODS set_bdef_extensible_options IMPORTING io_specification LIKE mo_bdef_specification.
+    METHODS set_table_enhancement_cat_any  IMPORTING io_specification LIKE mo_table_specification.
+    METHODS set_struct_enhancement_cat_any  IMPORTING io_specification LIKE mo_struct_specification.
+    METHODS set_service_definition_annos IMPORTING io_specification LIKE mo_service_def_specification
+                                                   io_rap_bo_node   TYPE REF TO zdmo_cl_rap_node.
+    METHODS add_include_structure_to_table IMPORTING io_rap_bo_node   TYPE REF TO ZDMO_cl_rap_node
+                                           RETURNING VALUE(r_success) TYPE abap_bool.
+
+
+
+    METHODS put_operation_execute IMPORTING i_put_operation   TYPE REF TO if_xco_cp_gen_d_o_put
+                                            i_skip_activation TYPE abap_boolean OPTIONAL
+                                  RETURNING VALUE(r_result)   TYPE REF TO if_xco_gen_o_put_result.
+*    METHODS put_operation_execute IMPORTING i_put_operation   TYPE REF TO if_xco_gen_o_mass_put
+*                                            i_skip_activation TYPE abap_boolean OPTIONAL
+*                                  RETURNING VALUE(r_result)   TYPE REF TO if_xco_gen_o_put_result.
+  PRIVATE SECTION.
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GENERATOR_BASE IMPLEMENTATION.
+
+
+  METHOD add_include_structure_to_table.
+
+    DATA extension_include_name TYPE sxco_ad_object_name .
+    DATA  table_name  TYPE sxco_dbt_object_name  .
+
+    extension_include_name = to_upper( io_rap_bo_node->rap_node_objects-extension_include ).
+    table_name = to_upper( io_rap_bo_node->data_source_name ).
+
+    DATA(xco_library) = NEW zdmo_cl_rap_xco_on_prem_lib( ).
+
+    IF xco_library->on_premise_branch_is_used(  ).
+      xco_library->add_include_structure_to_table(
+        table_name             = table_name
+        extension_include_name = extension_include_name
+      ).
+    ELSE.
+      "valid only for cloud
+      DATA(lo_change_specification) = mo_patch_operation->for-tabl-for-database_table->add_object( table_name )->create_change_specification( ).
+      lo_change_specification->for-insert->add_include( )->set_structure( extension_include_name ).
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD cds_i_view_set_provider_cntrct.
+    "valid as of 2022
+    i_interface_view_spcification->set_provider_contract( io_provider_contract = xco_cp_cds=>provider_contract->transactional_interface ).
+  ENDMETHOD.
+
+
+  METHOD cds_p_view_set_provider_cntrct.
+    "valid as of 2022
+    i_projection_view_spcification->set_provider_contract( io_provider_contract = xco_cp_cds=>provider_contract->transactional_query ).
+  ENDMETHOD.
+
+
+  METHOD get_environment.
+    r_environment = xco_cp_generation=>environment->dev_system( i_transport )  .
+*    IF i_transport IS NOT INITIAL.
+*      r_environment = xco_generation=>environment->transported( i_transport ).
+*    ELSE.
+*      r_environment = xco_generation=>environment->local.
+*    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_patch_operation.
+    r_patch_operation = i_environment->create_patch_operation(  ).
+*   r_patch_operation = i_environment->create_mass_patch_operation(  ).
+  ENDMETHOD.
+
+
+  METHOD get_put_operation.
+    r_put_operation = i_environment->create_put_operation(  ).
+*    r_put_operation = i_environment->create_mass_put_operation( ).
+  ENDMETHOD.
+
+
+  METHOD get_put_operation_for_devc.
+    "on prem interface of environment does not offer "for-devc"
+    r_put_operation = i_environment->for-devc->create_put_operation( ).
+  ENDMETHOD.
+
+
+  METHOD put_operation_execute.
+    "On premise there is no skip activation available
+*    IF i_skip_activation = abap_true.
+*      i_put_operation->add_option( XCO_GENERATION=>OPTION->SKIP_ACTIVATION  ).
+*      r_result =  i_put_operation->execute(  ).
+*      RETURN.
+*    ENDIF.
+    r_result =  i_put_operation->execute( ).
+  ENDMETHOD.
+
+
+  METHOD set_bdef_extensible_options.
+    "valid as of 2023
+    io_specification->set_extensible_options(
+                        VALUE #(
+                        ( xco_cp_behavior_definition=>extensible_option->with_additional_save  )
+                        ( xco_cp_behavior_definition=>extensible_option->with_determinations_on_modify  )
+                        ( xco_cp_behavior_definition=>extensible_option->with_determinations_on_save  )
+                        ( xco_cp_behavior_definition=>extensible_option->with_validations_on_save  )
+                        )
+                         ).
+  ENDMETHOD.
+
+
+  METHOD set_extensible_for_mapping.
+    "valid as of 2023
+    io_mapping->set_extensible(  )->set_corresponding(  ).
+  ENDMETHOD.
+
+
+  METHOD set_service_definition_annos.
+    "valid as of 2023
+    IF io_rap_bo_node->is_extensible(  ) = abap_true.
+      "add @AbapCatalog.extensibility.extensible: true
+      io_specification->add_annotation( 'AbapCatalog.extensibility.extensible' )->value->build( )->add_boolean( abap_true ).
+    ENDIF.
+
+    "check if custom entities will be generated.
+    "if yes the leading entity is an r-view rather than a p-view
+    IF io_rap_bo_node->data_source_type = zdmo_cl_rap_node=>data_source_types-abstract_entity OR
+       io_rap_bo_node->data_source_type = zdmo_cl_rap_node=>data_source_types-abap_type .
+      io_specification->add_annotation( 'ObjectModel.leadingEntity.name' )->value->build( )->add_string( CONV #( io_rap_bo_node->rap_node_objects-cds_view_r ) ).
+    ELSE.
+      io_specification->add_annotation( 'ObjectModel.leadingEntity.name' )->value->build( )->add_string( CONV #( io_rap_bo_node->rap_node_objects-cds_view_p ) ).
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_struct_enhancement_cat_any.
+    "valid as of 2402
+    io_specification->set_enhancement_category( xco_cp_table=>enhancement_category->extensible_any ).
+  ENDMETHOD.
+
+
+  METHOD set_table_enhancement_cat_any.
+    "valid as of 2402
+    io_specification->set_enhancement_category( xco_cp_table=>enhancement_category->extensible_any ).
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_generator_base.clas.xml b/src/zdmo_cl_rap_generator_base.clas.xml
new file mode 100644
index 0000000..c86da45
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_base.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GENERATOR_BASE</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Wrapper for xco environment</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_generator_console.clas.abap b/src/zdmo_cl_rap_generator_console.clas.abap
new file mode 100644
index 0000000..5ed4510
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_console.clas.abap
@@ -0,0 +1,143 @@
+CLASS zdmo_cl_rap_generator_console DEFINITION
+  PUBLIC
+  INHERITING FROM cl_xco_cp_adt_simple_classrun
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+
+  PROTECTED SECTION.
+    METHODS main REDEFINITION.
+    METHODS get_json_string
+      RETURNING VALUE(json_string) TYPE string.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GENERATOR_CONSOLE IMPLEMENTATION.
+
+
+  METHOD get_json_string.
+    json_string = '{' && |\r\n|  &&
+                  '"namespace":"Z",' && |\r\n|  &&
+                  '"package":"Z_PROJ_TEST",' && |\r\n|  &&
+                  '"dataSourceType":"table",' && |\r\n|  &&
+                  '"bindingType":"odata_v4_ui",' && |\r\n|  &&
+                  '"implementationType":"managed_uuid",' && |\r\n|  &&
+                  '"prefix":"",' && |\r\n|  &&
+                  '"suffix":"_99",' && |\r\n|  &&
+                  '"draftEnabled":true,' && |\r\n|  &&
+                  '"multiInlineEdit":false,' && |\r\n|  &&
+                  '"isCustomizingTable":false,' && |\r\n|  &&
+                  '"addBusinessConfigurationRegistration":false,' && |\r\n|  &&
+*                  '"transportRequest":"PM1K900006",' && |\r\n|  &&
+                  '"publishservice":true,' && |\r\n|  &&
+                  '"addbasiciviews":false,' && |\r\n|  &&
+                  '"isextensible":false,' && |\r\n|  &&
+                  '"hierarchy":' && |\r\n|  &&
+                  '{' && |\r\n|  &&
+                  ' "entityname":"SalesORder",' && |\r\n|  &&
+                  ' "dataSource":"ZDMO_UUID_HEADER",' && |\r\n|  &&
+                  ' "objectid":"SALESORDER_ID",' && |\r\n|  &&
+                  ' "uuid":"HEADER_UUID",' && |\r\n|  &&
+                  ' "parentUUID":"",' && |\r\n|  &&
+                  ' "rootUUID":"",' && |\r\n|  &&
+                  ' "etagMaster":"LOCAL_LAST_CHANGED_AT",' && |\r\n|  &&
+                  ' "totalEtag":"LAST_CHANGED_AT",' && |\r\n|  &&
+                  ' "lastChangedAt":"LAST_CHANGED_AT",' && |\r\n|  &&
+                  ' "lastChangedBy":"LAST_CHANGED_BY",' && |\r\n|  &&
+                  ' "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",' && |\r\n|  &&
+                  ' "createdAt":"CREATED_AT",' && |\r\n|  &&
+                  ' "createdBy":"CREATED_BY",' && |\r\n|  &&
+
+
+
+                  ' "Children":' && |\r\n|  &&
+                  ' [' && |\r\n|  &&
+                  '  {' && |\r\n|  &&
+                  '   "entityname":"Item",' && |\r\n|  &&
+                  '   "dataSource":"ZDMO_UUID_ITEM",' && |\r\n|  &&
+                  '   "objectid":"ITEM_ID",' && |\r\n|  &&
+                  '   "uuid":"ITEM_UUID",' && |\r\n|  &&
+                  '   "parentUUID":"PARENT_UUID",' && |\r\n|  &&
+                  '   "rootUUID":"",' && |\r\n|  &&
+                  '   "etagMaster":"LOCAL_LAST_CHANGED_AT",' && |\r\n|  &&
+                  '   "totalEtag":"",' && |\r\n|  &&
+                  '   "lastChangedAt":"",' && |\r\n|  &&
+                  '   "lastChangedBy":"",' && |\r\n|  &&
+                  '   "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",' && |\r\n|  &&
+                  '   "createdAt":"",' && |\r\n|  &&
+                  '   "createdBy":"",' && |\r\n|  &&
+
+
+                  '   "Children":' && |\r\n|  &&
+                  '   [' && |\r\n|  &&
+                  '    {' && |\r\n|  &&
+                  '     "entityname":"SubItem",' && |\r\n|  &&
+                  '     "dataSource":"ZDMO_UUID_S_ITEM",' && |\r\n|  &&
+                  '     "objectid":"SCHEDULE_LINE_ID",' && |\r\n|  &&
+                  '     "uuid":"SCHED_LINE_UUID",' && |\r\n|  &&
+                  '     "parentUUID":"PARENT_UUID",' && |\r\n|  &&
+                  '     "rootUUID":"ROOT_UUID",' && |\r\n|  &&
+                  '     "etagMaster":"LOCAL_LAST_CHANGED_AT",' && |\r\n|  &&
+                  '     "totalEtag":"",' && |\r\n|  &&
+                  '     "lastChangedAt":"",' && |\r\n|  &&
+                  '     "lastChangedBy":"",' && |\r\n|  &&
+                  '     "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",' && |\r\n|  &&
+                  '     "createdAt":"",' && |\r\n|  &&
+                  '     "createdBy":""' && |\r\n|  &&
+
+
+                  '    }' && |\r\n|  &&
+                  '   ]' && |\r\n|  &&
+                  '  }' && |\r\n|  &&
+                  ' ]' && |\r\n|  &&
+                  '}' && |\r\n|  &&
+                  '}' .
+  ENDMETHOD.
+
+
+  METHOD main.
+    TRY.
+        DATA rap_generator_exception_occurd TYPE abap_bool.
+        DATA(json_string) = get_json_string(  ).
+
+        DATA(on_prem_xco_lib) = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+        IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_true.
+          DATA(rap_generator_on_prem) = ZDMO_cl_rap_generator=>create_for_on_prem_development( json_string ).
+          DATA(framework_messages) = rap_generator_on_prem->generate_bo( ).
+          rap_generator_exception_occurd = rap_generator_on_prem->exception_occured( ).
+          IF rap_generator_exception_occurd = abap_true.
+            out->write( |Caution: Exception occured | ) .
+            out->write( |Check repository objects of RAP BO { rap_generator_on_prem->get_rap_bo_name(  ) }.| ) .
+          ELSE.
+            out->write( |RAP BO { rap_generator_on_prem->get_rap_bo_name(  ) }  generated successfully| ) .
+          ENDIF.
+        ELSE.
+          DATA(rap_generator) = ZDMO_cl_rap_generator=>create_for_cloud_development( json_string ).
+          LOOP AT rap_generator->root_node->lt_fields INTO DATA(field).
+            out->write( |field-built_in_type { field-built_in_type }| ).
+            out->write( |field-built_in_type_decimals { field-built_in_type_decimals }| ).
+            out->write( |field-built_in_type_length { field-built_in_type_length }| ).
+
+          ENDLOOP.
+          EXIT.
+          framework_messages = rap_generator->generate_bo( ).
+
+
+          rap_generator_exception_occurd = rap_generator->exception_occured( ).
+          IF rap_generator_exception_occurd = abap_true.
+            out->write( |Caution: Exception occured | ) .
+            out->write( |Check repository objects of RAP BO { rap_generator->get_rap_bo_name(  ) }.| ) .
+          ELSE.
+            out->write( |RAP BO { rap_generator->get_rap_bo_name(  ) }  generated successfully| ) .
+          ENDIF.
+        ENDIF.
+      CATCH ZDMO_cx_rap_generator INTO DATA(rap_generator_exception).
+        out->write( 'RAP Generator has raised the following exception:' ) .
+        out->write( rap_generator_exception->get_text(  ) ).
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_generator_console.clas.xml b/src/zdmo_cl_rap_generator_console.clas.xml
new file mode 100644
index 0000000..499615a
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_console.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GENERATOR_CONSOLE</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>zcl_rap_generator_console_demo</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_generator_del.clas.abap b/src/zdmo_cl_rap_generator_del.clas.abap
new file mode 100644
index 0000000..011e8e6
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_del.clas.abap
@@ -0,0 +1,1737 @@
+CLASS zdmo_cl_rap_generator_del DEFINITION
+INHERITING FROM zdmo_cl_rap_generator_base
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+
+    METHODS constructor
+      IMPORTING
+        i_boname TYPE ZDMO_R_RAPG_ProjectTP-BoName.
+
+    METHODS rap_gen_project_objects_exist
+      IMPORTING
+        i_rap_generator_project           TYPE ZDMO_R_RAPG_ProjectTP
+      RETURNING
+        VALUE(r_repository_objects_exist) TYPE abap_bool.
+
+    METHODS start_deletion.
+
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+
+    TYPES : BEGIN OF t_log_entry,
+              DetailLevel TYPE ballevel,
+              Severity    TYPE symsgty,
+              Text        TYPE  bapi_msg,
+              TimeStamp   TYPE timestamp,
+            END OF t_log_entry.
+    TYPES : t_log_entries TYPE STANDARD TABLE OF t_log_entry.
+
+    DATA boname TYPE zdmo_rap_gen_entityname.
+    DATA bo_data TYPE ZDMO_R_RAPG_ProjectTP.
+
+    DATA json_string TYPE ZDMO_R_RAPG_ProjectTP-JsonString.
+    DATA package_language_version TYPE ZDMO_R_RAPG_ProjectTP-PackageLanguageVersion.
+    DATA rap_bo_uuid TYPE  ZDMO_R_RAPG_ProjectTP-RapBoUUID.
+    DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib.
+
+    DATA delete_objects_in_package TYPE sxco_package.
+    DATA demo_mode TYPE abap_boolean VALUE abap_false.
+
+
+
+    DATA test_bo_name TYPE ZDMO_R_RAPG_ProjectTP-BoName VALUE 'ZR_SalesOrderTP_LOG3'.
+*    DATA rap_bo_name TYPE ZDMO_R_RAPG_ProjectTP-BoName.
+    DATA perform_srvb_is_active_check TYPE abap_bool VALUE abap_false.
+
+    "run in background Y/N?
+*    DATA run_in_background TYPE abap_bool VALUE abap_true.
+    DATA run_in_background TYPE abap_bool VALUE abap_false.
+
+    "run in foreground Y/N?
+    DATA run_in_foreground TYPE abap_bool VALUE abap_true.
+*    DATA run_in_foreground TYPE abap_bool VALUE abap_false.
+
+*    DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib.
+    DATA generated_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects.
+    DATA generated_repository_object TYPE zdmo_cl_rap_generator=>t_generated_repository_object.
+
+    DATA out TYPE REF TO if_oo_adt_classrun_out.
+*    DATA application_log TYPE REF TO if_bali_log .
+
+    METHODS add_log_entries_for_rap_bo IMPORTING i_rap_bo_name    TYPE sxco_cds_object_name OPTIONAL
+                                                 i_log_entries    TYPE t_log_entries
+                                       RETURNING VALUE(r_success) TYPE abap_boolean.
+
+    METHODS generated_objects_are_deleted
+      IMPORTING
+*               i_rap_bo_name                      TYPE sxco_ar_object_name
+                i_repository_objects               TYPE zdmo_cl_rap_generator=>t_generated_repository_objects
+      EXPORTING r_existing_repository_objects      TYPE zdmo_cl_rap_generator=>t_generated_repository_objects
+      RETURNING VALUE(r_objects_have_been_deleted) TYPE abap_bool.
+
+    METHODS get_root_exception
+      IMPORTING !ix_exception  TYPE REF TO cx_root
+      RETURNING VALUE(rx_root) TYPE REF TO cx_root .
+
+    METHODS add_findings_to_output
+      IMPORTING i_task_name      TYPE bapi_msg
+                i_findings       TYPE REF TO if_xco_gen_o_findings
+      RETURNING VALUE(r_success) TYPE abap_bool
+*      RAISING   cx_bali_runtime
+      .
+    METHODS add_text_to_app_log_or_console
+      IMPORTING i_text     TYPE cl_bali_free_text_setter=>ty_text
+                i_severity TYPE cl_bali_free_text_setter=>ty_severity DEFAULT if_bali_constants=>c_severity_status
+*      RAISING   cx_bali_runtime
+      .
+    METHODS get_objects_from_package
+      IMPORTING i_package                   TYPE sxco_package
+      RETURNING VALUE(r_repository_objects) TYPE zdmo_cl_rap_generator=>t_generated_repository_objects.
+    METHODS get_objects_from_rap_generator
+      IMPORTING i_rap_bo_name               TYPE sxco_ar_object_name
+      RETURNING VALUE(r_repository_objects) TYPE zdmo_cl_rap_generator=>t_generated_repository_objects.
+    METHODS delete_generated_objects
+      IMPORTING i_rap_bo_name        TYPE sxco_ar_object_name
+                i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects.
+    METHODS get_locking_transport
+      IMPORTING i_object_type      TYPE if_xco_gen_o_finding=>tv_object_type
+                i_object_name      TYPE if_xco_gen_o_finding=>tv_object_name
+      RETURNING VALUE(r_transport) TYPE sxco_transport.
+    METHODS service_binding_is_published
+      IMPORTING i_object_name         TYPE if_xco_gen_o_finding=>tv_object_name
+      RETURNING VALUE(r_is_published) TYPE abap_bool.
+
+
+    METHODS delete_service_bindings
+      IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects
+*                i_environment        TYPE REF TO if_xco_cp_gen_env_dev_system
+*      RAISING   cx_bali_runtime
+      .
+    METHODS delete_service_definitions
+      IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects
+*                i_environment        TYPE REF TO if_xco_cp_gen_env_dev_system
+*      RAISING   cx_bali_runtime
+      .
+    METHODS delete_behavior_definitions
+      IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects
+*                i_environment        TYPE REF TO if_xco_cp_gen_env_dev_system
+*      RAISING   cx_bali_runtime
+      .
+    METHODS delete_metadata_extensions
+      IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects
+*                i_environment        TYPE REF TO if_xco_cp_gen_env_dev_system
+*      RAISING   cx_bali_runtime
+      .
+    METHODS delete_cds_views
+      IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects
+*                i_environment        TYPE REF TO if_xco_cp_gen_env_dev_system
+*      RAISING   cx_bali_runtime
+      .
+    METHODS delete_classes
+      IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects
+*                i_environment        TYPE REF TO if_xco_cp_gen_env_dev_system
+*      RAISING   cx_bali_runtime
+      .
+    METHODS delete_draft_tables
+      IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects
+*                i_environment        TYPE REF TO if_xco_cp_gen_env_dev_system
+*      RAISING   cx_bali_runtime
+      .
+    METHODS delete_structures
+      IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects
+*                i_environment        TYPE REF TO if_xco_cp_gen_env_dev_system
+*      RAISING   cx_bali_runtime
+      .
+    METHODS Delete_RAP_Generator_Project
+      IMPORTING
+        i_rap_bo_name TYPE sxco_ar_object_name
+*      RAISING
+*        cx_bali_runtime
+      .
+
+    METHODS delete_release_state
+      IMPORTING object_type                       TYPE if_abap_api_state=>ty_object_directory_type
+                object_name                       TYPE if_abap_api_state=>ty_object_directory_name
+                sub_object_type                   TYPE if_abap_api_state=>ty_sub_object_type  OPTIONAL
+                sub_object_name                   TYPE if_abap_api_state=>ty_sub_object_name  OPTIONAL
+*                release_contract                  TYPE if_abap_api_state=>ty_release_contract
+                request                           TYPE if_abap_api_state=>ty_request
+      RETURNING VALUE(r_release_state_is_deleted) TYPE abap_bool.
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GENERATOR_DEL IMPLEMENTATION.
+
+
+  METHOD add_findings_to_output.
+
+    DATA text TYPE c LENGTH 200 .
+    DATA(finding_texts) = i_findings->get( ).
+
+**********************************************************************
+
+    IF finding_texts IS NOT INITIAL.
+      LOOP AT finding_texts INTO DATA(finding_text).
+        text = |{ finding_text->object_type } { finding_text->object_name } { finding_text->message->get_text(  ) }|.
+        add_text_to_app_log_or_console(
+          i_text     = text
+          i_severity = finding_text->message->value-msgty
+        ).
+      ENDLOOP.
+    ENDIF.
+
+**********************************************************************
+
+
+    DATA log_entry TYPE t_log_entry.
+    DATA log_entries TYPE t_log_entries.
+
+    log_entry-text = i_task_name.
+    log_entry-detaillevel = 1.
+    log_entry-severity = 'S'.
+
+    IF i_findings->contain_warnings(  ).
+      log_entry-severity = 'W'.
+    ENDIF.
+
+    IF i_findings->contain_errors(  ).
+      log_entry-severity = 'E'.
+    ENDIF.
+
+    APPEND log_entry TO log_entries.
+
+    finding_texts = i_findings->get( ).
+
+    IF finding_texts IS NOT INITIAL.
+      LOOP AT finding_texts INTO finding_text.
+        log_entry-text = |{ finding_text->object_type } { finding_text->object_name } { finding_text->message->get_text(  ) }|.
+        log_entry-severity = finding_text->message->value-msgty.
+        log_entry-detaillevel = 2.
+        APPEND log_entry TO log_entries.
+      ENDLOOP.
+    ENDIF.
+
+    r_success = add_log_entries_for_rap_bo(
+           i_rap_bo_name = CONV #( boname )
+           i_log_entries = log_entries
+         ).
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD add_log_entries_for_rap_bo.
+
+    DATA create_rapbolog_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Log.
+
+    DATA create_raplog_cba_line TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Log.
+    DATA log_entries LIKE create_raplog_cba_line-%target.
+    DATA log_entry LIKE LINE OF log_entries.
+*    DATA log_entries TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\log   .
+*    DATA log_entry TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\\log   .
+    DATA n TYPE i.
+    DATA time_stamp TYPE timestampl.
+
+    GET TIME STAMP FIELD time_stamp.
+
+    SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP  WHERE boname = @boname
+          INTO @DATA(rap_generator_bo).
+
+    CHECK sy-subrc = 0.
+
+    LOOP AT i_log_entries INTO DATA(my_log_entry).
+      n += 1.
+      log_entry = VALUE #(     %is_draft = if_abap_behv=>mk-off
+                               %cid      = |test{ n }|
+                               Severity = my_log_entry-Severity
+                               DetailLevel = my_log_entry-DetailLevel
+                               Text = my_log_entry-Text
+                               TimeStamp = time_stamp
+                               ).
+      APPEND log_entry TO log_entries.
+    ENDLOOP.
+
+    create_rapbolog_cba = VALUE #( ( %is_draft = if_abap_behv=>mk-off
+                                     %key-rapbouuid = rap_generator_bo-RapboUUID
+                                     %target   = log_entries ) ) .
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+             ENTITY project
+                   CREATE BY \_Log
+                   FIELDS (
+                           LogItemNumber
+                           DetailLevel
+                           Severity
+                           Text
+                           TimeStamp
+                   )
+                   WITH create_rapbolog_cba
+             MAPPED   DATA(mapped)
+             FAILED   DATA(failed)
+             REPORTED DATA(reported).
+
+
+    IF mapped-log IS NOT INITIAL.
+      COMMIT ENTITIES.
+      COMMIT WORK.
+      r_success = abap_true.
+    ENDIF.
+    IF failed-log IS NOT INITIAL.
+      r_success = abap_false.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD add_text_to_app_log_or_console.
+
+    DATA log_entry TYPE t_log_entry.
+    DATA log_entries TYPE t_log_entries.
+
+    log_entry-text = i_text.
+    log_entry-detaillevel = 1.
+    log_entry-severity = i_severity.
+    APPEND log_entry TO log_entries.
+
+    IF boname IS NOT INITIAL.
+      add_log_entries_for_rap_bo(
+             i_rap_bo_name = CONV #( boname )
+             i_log_entries = log_entries
+           ).
+    ENDIF.
+
+*    DATA(application_log_free_text) = cl_bali_free_text_setter=>create(
+*      severity = i_severity " if_bali_constants=>c_severity_status
+*      text     = i_text ).
+*    application_log_free_text->set_detail_level( detail_level = '1' ).
+*    application_log->add_item( item = application_log_free_text ).
+*    cl_bali_log_db=>get_instance( )->save_log(
+*                                               log = application_log
+*                                               assign_to_current_appl_job = abap_true
+*                                               ).
+
+
+
+*    ELSE.
+
+  ENDMETHOD.
+
+
+  METHOD constructor.
+    super->constructor( ).
+    boname = i_boname.
+    SELECT SINGLE *  FROM ZDMO_R_RAPG_ProjectTP WHERE BoName = @i_boname
+                                                    INTO @bo_data .
+    DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+    IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true.
+      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD delete_behavior_definitions.
+    DATA task_name TYPE bapi_msg VALUE 'delete behavior definitions'.
+    "begin change
+    DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r.
+    DATA object_name TYPE sxco_cds_object_name.
+    DATA(delete_operation) = mo_environment->for-bdef->create_delete_operation( ).
+    "end change
+    DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects  .
+    LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type.
+      APPEND repository_object TO del_repository_objects.
+      object_name = to_upper( repository_object-object_name ).
+      delete_operation->add_object( object_name ).
+      add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ).
+    ENDLOOP.
+    CHECK del_repository_objects IS NOT INITIAL.
+
+    IF bo_data-isExtensible = abap_true.
+      LOOP AT del_repository_objects INTO DATA(del_repository_object).
+        delete_release_state(
+          EXPORTING
+            object_type                = del_repository_object-object_type
+            object_name                = del_repository_object-object_name
+            request                    = del_repository_object-transport_request
+      RECEIVING
+         r_release_state_is_deleted = DATA(release_state_is_deleted)
+        ).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete release state { object_type } { object_name } - errors occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+      ENDLOOP.
+    ENDIF.
+
+    TRY.
+        DATA(delete_operation_result) = delete_operation->execute( ).
+        IF delete_operation_result->findings->contain_errors(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - errors occured.|
+            i_severity = if_bali_constants=>c_severity_error
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_warnings(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - warnings were raised.|
+            i_severity = if_bali_constants=>c_severity_warning
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_errors(  ) = abap_false AND
+           delete_operation_result->findings->contain_warnings(  ) = abap_false.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation was successfull.|
+            i_severity = if_bali_constants=>c_severity_status
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->get(  ) IS NOT INITIAL.
+          add_text_to_app_log_or_console( |Findings.| ).
+          add_findings_to_output(
+            i_task_name = task_name
+            i_findings  = delete_operation_result->findings
+          ).
+*          CATCH cx_bali_runtime.( delete_operation_result->findings ).
+        ENDIF.
+      CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        add_findings_to_output(
+          i_task_name = task_name
+          i_findings  = xco_delete_exception->findings
+        ).
+*        CATCH cx_bali_runtime.( xco_delete_exception->findings ).
+      CATCH cx_root INTO DATA(srvb_deletion_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext(  ) ).
+        add_text_to_app_log_or_console(
+          i_text     = delete_operation_text
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+    ENDTRY.
+  ENDMETHOD.
+
+
+  METHOD delete_cds_views.
+    DATA task_name TYPE bapi_msg VALUE 'delete cds views'.
+    "begin change
+    DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>node_object_types-cds_view_r.
+    DATA object_name TYPE sxco_cds_object_name.
+    DATA(delete_operation) = mo_environment->for-ddls->create_delete_operation( ).
+    "end change
+    DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects  .
+    LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type.
+      APPEND repository_object TO del_repository_objects.
+      object_name = to_upper( repository_object-object_name ).
+      delete_operation->add_object( object_name ).
+      add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ).
+    ENDLOOP.
+    CHECK del_repository_objects IS NOT INITIAL.
+
+    IF bo_data-isExtensible = abap_true.
+      LOOP AT del_repository_objects INTO DATA(del_repository_object).
+        delete_release_state(
+          EXPORTING
+            object_type                = del_repository_object-object_type
+            object_name                = del_repository_object-object_name
+            request                    = del_repository_object-transport_request
+      RECEIVING
+         r_release_state_is_deleted = DATA(release_state_is_deleted)
+        ).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete release state { object_type } { object_name } - errors occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+      ENDLOOP.
+    ENDIF.
+
+
+    TRY.
+        DATA(delete_operation_result) = delete_operation->execute( ).
+        IF delete_operation_result->findings->contain_errors(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - errors occured.|
+            i_severity = if_bali_constants=>c_severity_error
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_warnings(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - warnings were raised.|
+            i_severity = if_bali_constants=>c_severity_warning
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_errors(  ) = abap_false AND
+           delete_operation_result->findings->contain_warnings(  ) = abap_false.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation was successfull.|
+            i_severity = if_bali_constants=>c_severity_status
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->get(  ) IS NOT INITIAL.
+          add_text_to_app_log_or_console( |Findings.| ).
+          add_findings_to_output(
+            i_task_name = task_name
+            i_findings  = delete_operation_result->findings
+          ).
+*          CATCH cx_bali_runtime.( delete_operation_result->findings ).
+        ENDIF.
+      CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        add_findings_to_output(
+          i_task_name = task_name
+          i_findings  = xco_delete_exception->findings
+        ).
+*        CATCH cx_bali_runtime.( xco_delete_exception->findings ).
+      CATCH cx_root INTO DATA(srvb_deletion_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext(  ) ).
+        add_text_to_app_log_or_console(
+          i_text     = delete_operation_text
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+    ENDTRY.
+  ENDMETHOD.
+
+
+  METHOD delete_classes.
+    DATA task_name TYPE bapi_msg VALUE 'delete classes'.
+    "begin change
+    DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>node_object_types-behavior_implementation.
+    DATA object_name TYPE sxco_ad_object_name.
+    DATA(delete_operation) = mo_environment->for-clas->create_delete_operation( ).
+    "end change
+    DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects  .
+    LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type.
+      APPEND repository_object TO del_repository_objects.
+      object_name = to_upper( repository_object-object_name ).
+      delete_operation->add_object( object_name ).
+      add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ).
+    ENDLOOP.
+    CHECK del_repository_objects IS NOT INITIAL.
+    TRY.
+        DATA(delete_operation_result) = delete_operation->execute( ).
+        IF delete_operation_result->findings->contain_errors(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - errors occured.|
+            i_severity = if_bali_constants=>c_severity_error
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_warnings(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - warnings were raised.|
+            i_severity = if_bali_constants=>c_severity_warning
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_errors(  ) = abap_false AND
+           delete_operation_result->findings->contain_warnings(  ) = abap_false.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation was successfull.|
+            i_severity = if_bali_constants=>c_severity_status
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->get(  ) IS NOT INITIAL.
+          add_text_to_app_log_or_console( |Findings.| ).
+          add_findings_to_output(
+            i_task_name = task_name
+            i_findings  = delete_operation_result->findings
+          ).
+*          CATCH cx_bali_runtime.( delete_operation_result->findings ).
+        ENDIF.
+      CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        add_findings_to_output(
+          i_task_name = task_name
+          i_findings  = xco_delete_exception->findings
+        ).
+*        CATCH cx_bali_runtime.( xco_delete_exception->findings ).
+      CATCH cx_root INTO DATA(srvb_deletion_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext(  ) ).
+        add_text_to_app_log_or_console(
+          i_text     = delete_operation_text
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+    ENDTRY.
+  ENDMETHOD.
+
+
+  METHOD delete_draft_tables.
+    DATA task_name TYPE bapi_msg VALUE 'delete draft tables'.
+    "begin change
+    DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>node_object_types-draft_table.
+    DATA object_name TYPE sxco_dbt_object_name .
+    DATA(delete_operation) = mo_environment->for-tabl-for-database_table->create_delete_operation( ).
+    "end change
+    add_text_to_app_log_or_console( |Delete operation - warnings were raised.| ).
+    DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects  .
+    LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type.
+      APPEND repository_object TO del_repository_objects.
+      object_name = to_upper( repository_object-object_name ).
+      delete_operation->add_object( CONV #( object_name ) ).
+      add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ).
+    ENDLOOP.
+    CHECK del_repository_objects IS NOT INITIAL.
+    TRY.
+        DATA(delete_operation_result) = delete_operation->execute( ).
+        IF delete_operation_result->findings->contain_errors(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - errors occured.|
+            i_severity = if_bali_constants=>c_severity_error
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_warnings(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - warnings were raised.|
+            i_severity = if_bali_constants=>c_severity_warning
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_errors(  ) = abap_false AND
+           delete_operation_result->findings->contain_warnings(  ) = abap_false.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation was successfull.|
+            i_severity = if_bali_constants=>c_severity_status
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->get(  ) IS NOT INITIAL.
+          add_text_to_app_log_or_console( |Findings.| ).
+          add_findings_to_output(
+            i_task_name = task_name
+            i_findings  = delete_operation_result->findings
+          ).
+*          CATCH cx_bali_runtime.( delete_operation_result->findings ).
+        ENDIF.
+      CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        add_findings_to_output(
+          i_task_name = task_name
+          i_findings  = xco_delete_exception->findings
+        ).
+*        CATCH cx_bali_runtime.( xco_delete_exception->findings ).
+      CATCH cx_root INTO DATA(srvb_deletion_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext(  ) ).
+        add_text_to_app_log_or_console(
+          i_text     = delete_operation_text
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+    ENDTRY.
+  ENDMETHOD.
+
+
+  METHOD delete_generated_objects.
+
+    DATA transport_request TYPE sxco_transport.
+    DATA transport_requests TYPE STANDARD TABLE OF sxco_transport.
+
+    DATA repository_objects_in_transprt TYPE zdmo_cl_rap_generator=>t_generated_repository_objects  .
+
+    DATA text  TYPE cl_bali_free_text_setter=>ty_text  .
+
+    LOOP AT i_repository_objects INTO DATA(repository_object).
+      transport_request = repository_object-transport_request.
+*      IF transport_request IS NOT INITIAL.
+      COLLECT transport_request INTO transport_requests.
+*      ENDIF.
+    ENDLOOP.
+
+*    DATA(rap_bo_name_in_upper_case) = to_upper( i_rap_bo_name ).
+*    SELECT SINGLE  ABAPPackage FROM I_CustABAPObjDirectoryEntry
+*    WHERE ABAPObject = @rap_bo_name_in_upper_case
+*      AND ABAPObjectType = @zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r
+*    INTO @DATA(package).
+
+    SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE BoName = @i_rap_bo_name
+                                               INTO @DATA(rap_bo_header_data).
+
+    SELECT SINGLE * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @rap_bo_header_data-RapboUUID
+                                                     INTO @DATA(rap_bo_root_node_data).
+
+    DATA(my_bdef) = xco_lib->get_behavior_definition( CONV sxco_cds_object_name( rap_bo_header_data-BoName ) ).
+    DATA(my_srvb) = xco_lib->get_service_binding( CONV sxco_srvb_object_name( rap_bo_root_node_data-ServiceBinding ) ).
+
+    "@todo - add more checks
+    IF my_srvb->if_xco_ar_object~exists(  ).
+      DATA(package) = my_srvb->content(  )->service_binding->if_xco_ar_object~get_package(  )->name.
+    ELSEIF my_bdef->if_xco_ar_object~exists( ).
+      package = my_bdef->content(  )->behavior_definition->if_xco_ar_object~get_package(  )->name.
+    ENDIF.
+
+    package = bo_data-PackageName.
+
+*    IF lines( transport_requests ) > 1.
+*
+*      "if several transport requests are used take the first one and delete related objects
+*      "deletion has to be run several times until all objects have been deleted.
+*
+*      transport_request = transport_requests[ 1 ] .
+*
+*    ELSEIF lines( transport_requests ) = 1.
+*
+*      transport_request = transport_requests[ 1 ] .
+*
+*    ELSE.
+
+*    IF delete_objects_in_package IS NOT INITIAL.
+*      package = delete_objects_in_package.
+*    ENDIF.
+    IF xco_lib->get_package( package )->exists( ) = abap_true.
+      DATA(package_records_changes) = xco_lib->get_package( package )->read( )-property-record_object_changes.
+    ELSE.
+      add_text_to_app_log_or_console( |Package { package } does not exist.| ).
+*      EXIT.
+    ENDIF.
+
+    "generate a new transport request
+    IF package_records_changes = abap_true.
+      DATA(lo_transport_target) = xco_lib->get_package( package
+                )->read( )-property-transport_layer->get_transport_target( ).
+      DATA(new_transport_object) = xco_cp_cts=>transports->workbench( lo_transport_target->value )->create_request( |Delete RAP Business object - entity name: { i_rap_bo_name } | ).
+      DATA(new_transport_request) = new_transport_object->value.
+    ENDIF.
+
+    LOOP AT transport_requests INTO transport_request.
+
+      DATA(transport_request_used) = transport_request.
+
+      CLEAR repository_objects_in_transprt.
+
+      LOOP AT i_repository_objects INTO DATA(repository_object_in_transport) WHERE transport_request = transport_request_used.
+        APPEND repository_object_in_transport TO repository_objects_in_transprt.
+      ENDLOOP.
+
+      IF transport_request_used = ''.
+        transport_request_used = new_transport_request.
+      ENDIF.
+
+      add_text_to_app_log_or_console( |Use transport request { transport_request_used }| ).
+
+*    DATA(mo_environment) = xco_cp_generation=>environment->dev_system( transport_request )  .
+
+********************************************************************************
+      "cloud
+      mo_environment = get_environment( transport_request_used ) .
+
+*    mo_environment = xco_cp_generation=>environment->dev_system( transport_request )  .
+********************************************************************************
+
+**********************************************************************
+      "on premise
+*    IF xco_lib->get_package( package  )->read( )-property-record_object_changes = abap_true.
+*      mo_environment = xco_generation=>environment->transported( transport_request ).
+*    ELSE.
+*      mo_environment = xco_generation=>environment->local.
+*    ENDIF.
+**********************************************************************
+
+      delete_service_bindings( repository_objects_in_transprt ).
+      delete_service_definitions( repository_objects_in_transprt ).
+      delete_behavior_definitions( repository_objects_in_transprt ).
+      delete_metadata_extensions( repository_objects_in_transprt ).
+      delete_cds_views( repository_objects_in_transprt ).
+      delete_classes( repository_objects_in_transprt ).
+      "the tables that are used as a data source will not be deleted since they have not been generated
+      delete_draft_tables( repository_objects_in_transprt ).
+      delete_structures( repository_objects_in_transprt ).
+
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD delete_metadata_extensions.
+    DATA task_name TYPE bapi_msg VALUE 'metadata extensions'.
+    "begin change
+    DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>node_object_types-meta_data_extension.
+    DATA object_name TYPE sxco_cds_object_name.
+    DATA(delete_operation) = mo_environment->for-ddlx->create_delete_operation( ).
+    "end change
+    DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects  .
+    LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type.
+      APPEND repository_object TO del_repository_objects.
+      object_name = to_upper( repository_object-object_name ).
+      delete_operation->add_object( object_name ).
+      add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ).
+    ENDLOOP.
+    CHECK del_repository_objects IS NOT INITIAL.
+    TRY.
+        DATA(delete_operation_result) = delete_operation->execute( ).
+        IF delete_operation_result->findings->contain_errors(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - errors occured.|
+            i_severity = if_bali_constants=>c_severity_error
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_warnings(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - warnings were raised.|
+            i_severity = if_bali_constants=>c_severity_warning
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_errors(  ) = abap_false AND
+           delete_operation_result->findings->contain_warnings(  ) = abap_false.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation was successfull.|
+            i_severity = if_bali_constants=>c_severity_status
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->get(  ) IS NOT INITIAL.
+          add_text_to_app_log_or_console( |Findings.| ).
+          add_findings_to_output(
+            i_task_name = task_name
+            i_findings  = delete_operation_result->findings
+          ).
+*          CATCH cx_bali_runtime.( delete_operation_result->findings ).
+        ENDIF.
+      CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        add_findings_to_output(
+          i_task_name = task_name
+          i_findings  = xco_delete_exception->findings
+        ).
+*        CATCH cx_bali_runtime.( xco_delete_exception->findings ).
+      CATCH cx_root INTO DATA(srvb_deletion_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext(  ) ).
+        add_text_to_app_log_or_console(
+          i_text     = delete_operation_text
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+    ENDTRY.
+  ENDMETHOD.
+
+
+  METHOD Delete_RAP_Generator_Project.
+
+
+  ENDMETHOD.
+
+
+  METHOD delete_release_state.
+
+    DATA release_contract TYPE if_abap_api_state=>ty_release_contract.
+    DATA log_entry TYPE t_log_entry.
+    DATA log_entries TYPE t_log_entries.
+
+    TRY.
+
+        CASE object_type.
+
+          WHEN 'DDLS'.
+            DATA(api_state_handler) = cl_abap_api_state=>create_instance( api_key = VALUE #(
+                 object_type     = object_type
+                 object_name     = to_upper( object_name ) "'ZRAP630E_Shop_051' )
+                 sub_object_type = 'CDS_STOB'
+                 sub_object_name     = to_upper( object_name ) "'ZRAP630E_Shop_051' )
+                 ) ).
+
+          WHEN 'STRU'.
+            "internally we use object_type 'STRU' to be able to choose the correct
+            "xco generation api ->for->structure vs. ->for->table
+
+            api_state_handler = cl_abap_api_state=>create_instance( api_key = VALUE #(
+                            object_type     = 'TABL'
+                            object_name     = to_upper( object_name ) "'zrap630sshop_051' )
+                            ) ).
+
+          WHEN OTHERS.
+
+            api_state_handler = cl_abap_api_state=>create_instance( api_key = VALUE #(
+                  object_type     = object_type
+                  object_name     = to_upper( object_name ) "'zrap630sshop_051' )
+                  ) ).
+
+        ENDCASE.
+
+        release_contract = zdmo_cl_rap_node=>release_contract_c1.
+
+        IF api_state_handler->is_released(
+                    EXPORTING
+                      release_contract         = release_contract
+                      use_in_cloud_development = abap_true
+                      use_in_key_user_apps     = abap_false
+                  ).
+          r_release_state_is_deleted = abap_false.
+          api_state_handler->delete_release_state(
+                 release_contract = zdmo_cl_rap_node=>release_contract_c1
+                 request   = request
+               ).
+          r_release_state_is_deleted = abap_true.
+        ELSE.
+          r_release_state_is_deleted = abap_true.
+        ENDIF.
+
+        release_contract = zdmo_cl_rap_node=>release_contract_c0.
+
+        IF api_state_handler->is_released(
+                    EXPORTING
+                      release_contract         = release_contract
+                      use_in_cloud_development = abap_true
+                      use_in_key_user_apps     = abap_false
+                  ).
+          r_release_state_is_deleted = abap_false.
+          api_state_handler->delete_release_state(
+                 release_contract = zdmo_cl_rap_node=>release_contract_c0
+                 request   = request
+               ).
+          r_release_state_is_deleted = abap_true.
+        ELSE.
+          r_release_state_is_deleted = abap_true.
+        ENDIF.
+
+
+      CATCH cx_abap_api_state INTO DATA(bdef_del_rel_state_exception).
+
+
+        log_entry-text = |Delete release state - { release_contract } of { object_type } { object_name } .|.
+        log_entry-severity = 'E'.
+        log_entry-detaillevel = 1.
+        APPEND log_entry TO log_entries.
+
+        log_entry-text = | { bdef_del_rel_state_exception->get_text( ) }.|.
+        log_entry-detaillevel = 2.
+        APPEND log_entry TO log_entries.
+
+        add_log_entries_for_rap_bo(
+                   i_rap_bo_name = CONV #( boname )
+                   i_log_entries = log_entries
+                 ).
+
+    ENDTRY.
+
+  ENDMETHOD.
+
+
+  METHOD delete_service_bindings.
+    DATA task_name TYPE bapi_msg VALUE 'service bindings'.
+    "begin change
+    DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>root_node_object_types-service_binding.
+    DATA object_name TYPE sxco_srvb_object_name.
+    DATA(delete_operation) = mo_environment->for-srvb->create_delete_operation( ).
+    "end change
+    DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects  .
+    LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type.
+      APPEND repository_object TO del_repository_objects.
+      object_name = to_upper( repository_object-object_name ).
+      delete_operation->add_object( object_name ).
+      add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ).
+    ENDLOOP.
+    CHECK del_repository_objects IS NOT INITIAL.
+    TRY.
+        DATA(delete_operation_result) = delete_operation->execute( ).
+        IF delete_operation_result->findings->contain_errors(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - errors occured.|
+            i_severity = if_bali_constants=>c_severity_error
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_warnings(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - warnings were raised.|
+            i_severity = if_bali_constants=>c_severity_warning
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_errors(  ) = abap_false AND
+           delete_operation_result->findings->contain_warnings(  ) = abap_false.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation was successfull.|
+            i_severity = if_bali_constants=>c_severity_status
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->get(  ) IS NOT INITIAL.
+          add_text_to_app_log_or_console( |Findings.| ).
+          add_findings_to_output(
+            i_task_name = task_name
+            i_findings  = delete_operation_result->findings
+          ).
+*          CATCH cx_bali_runtime.( delete_operation_result->findings ).
+        ENDIF.
+      CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        add_findings_to_output(
+          i_task_name = task_name
+          i_findings  = xco_delete_exception->findings
+        ).
+*        CATCH cx_bali_runtime.( xco_delete_exception->findings ).
+      CATCH cx_root INTO DATA(srvb_deletion_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext(  ) ).
+        add_text_to_app_log_or_console(
+          i_text     = delete_operation_text
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+    ENDTRY.
+  ENDMETHOD.
+
+
+  METHOD delete_service_definitions.
+    DATA task_name TYPE bapi_msg VALUE 'service definitions'.
+    "begin change
+    DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>root_node_object_types-service_definition.
+    DATA object_name TYPE sxco_srvd_object_name.
+    DATA(delete_operation) = mo_environment->for-srvd->create_delete_operation( ).
+    "end change
+    DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects  .
+    LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type.
+      APPEND repository_object TO del_repository_objects.
+      object_name = to_upper( repository_object-object_name ).
+      delete_operation->add_object( object_name ).
+      add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ).
+    ENDLOOP.
+    CHECK del_repository_objects IS NOT INITIAL.
+    TRY.
+        DATA(delete_operation_result) = delete_operation->execute( ).
+        IF delete_operation_result->findings->contain_errors(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - errors occured.|
+            i_severity = if_bali_constants=>c_severity_error
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_warnings(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - warnings were raised.|
+            i_severity = if_bali_constants=>c_severity_warning
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_errors(  ) = abap_false AND
+           delete_operation_result->findings->contain_warnings(  ) = abap_false.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation was successfull.|
+            i_severity = if_bali_constants=>c_severity_status
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->get(  ) IS NOT INITIAL.
+          add_text_to_app_log_or_console( |Findings.| ).
+          add_findings_to_output(
+            i_task_name = task_name
+            i_findings  = delete_operation_result->findings
+          ).
+*          CATCH cx_bali_runtime.( delete_operation_result->findings ).
+        ENDIF.
+      CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        add_findings_to_output(
+          i_task_name = task_name
+          i_findings  = xco_delete_exception->findings
+        ).
+*        CATCH cx_bali_runtime.( xco_delete_exception->findings ).
+      CATCH cx_root INTO DATA(srvb_deletion_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext(  ) ).
+        add_text_to_app_log_or_console(
+          i_text     = delete_operation_text
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+    ENDTRY.
+  ENDMETHOD.
+
+
+  METHOD delete_structures.
+    DATA task_name TYPE bapi_msg VALUE 'structures'.
+    "begin change
+    DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>node_object_types-control_structure.
+    DATA object_name TYPE sxco_ad_object_name .
+    DATA(delete_operation) = mo_environment->for-tabl-for-structure->create_delete_operation( ).
+    "end change
+    DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects  .
+    LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type.
+      APPEND repository_object TO del_repository_objects.
+      object_name = to_upper( repository_object-object_name ).
+      delete_operation->add_object( object_name ).
+      add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ).
+    ENDLOOP.
+    CHECK del_repository_objects IS NOT INITIAL.
+    IF bo_data-isExtensible = abap_true.
+      LOOP AT del_repository_objects INTO DATA(del_repository_object).
+        delete_release_state(
+          EXPORTING
+            object_type                = del_repository_object-object_type
+            object_name                = del_repository_object-object_name
+            request                    = del_repository_object-transport_request
+      RECEIVING
+         r_release_state_is_deleted = DATA(release_state_is_deleted)
+        ).
+        add_text_to_app_log_or_console(
+           i_text     = |Delete release state { object_type } { object_name } - errors occured.|
+           i_severity = if_bali_constants=>c_severity_error
+         ).
+      ENDLOOP.
+    ENDIF.
+
+    TRY.
+        DATA(delete_operation_result) = delete_operation->execute( ).
+        IF delete_operation_result->findings->contain_errors(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - errors occured.|
+            i_severity = if_bali_constants=>c_severity_error
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_warnings(  ) = abap_true.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation - warnings were raised.|
+            i_severity = if_bali_constants=>c_severity_warning
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->contain_errors(  ) = abap_false AND
+           delete_operation_result->findings->contain_warnings(  ) = abap_false.
+          add_text_to_app_log_or_console(
+            i_text     = |Delete operation was successfull.|
+            i_severity = if_bali_constants=>c_severity_status
+          ).
+        ENDIF.
+        IF delete_operation_result->findings->get(  ) IS NOT INITIAL.
+          add_text_to_app_log_or_console( |Findings.| ).
+          add_findings_to_output(
+            i_task_name = task_name
+            i_findings  = delete_operation_result->findings
+          ).
+*          CATCH cx_bali_runtime.( delete_operation_result->findings ).
+        ENDIF.
+      CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        add_findings_to_output(
+          i_task_name = task_name
+          i_findings  = xco_delete_exception->findings
+        ).
+*        CATCH cx_bali_runtime.( xco_delete_exception->findings ).
+      CATCH cx_root INTO DATA(srvb_deletion_exception).
+        add_text_to_app_log_or_console(
+          i_text     = |Delete operation - Exception occured.|
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+        DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext(  ) ).
+        add_text_to_app_log_or_console(
+          i_text     = delete_operation_text
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+    ENDTRY.
+  ENDMETHOD.
+
+
+  METHOD generated_objects_are_deleted.
+
+    DATA object_name TYPE if_xco_gen_o_finding=>tv_object_name .
+    DATA object_type  TYPE if_xco_gen_o_finding=>tv_object_type.
+
+    DATA number_of_objects_found TYPE i.
+
+
+    r_objects_have_been_deleted = abap_false.
+
+    LOOP AT i_repository_objects INTO DATA(repository_object).
+
+      object_name = to_upper( repository_object-object_name ).
+
+      IF to_upper( repository_object-object_type ) = 'STRU'.
+        object_type = 'TABL'.
+      ELSE.
+        object_type = to_upper( repository_object-object_type ).
+      ENDIF.
+
+      "when an object has been deleted but the transport request has not been released yet
+      "it will show up in I_CustABAPObjDirectoryEntry with the flag ABAPObjectIsDeleted = 'X'
+
+      DATA(object_still_exists) = xco_lib->get_abap_obj_directory_entry(
+        EXPORTING
+          i_abap_object_type            = object_type
+          i_abap_object_category        = 'R3TR'
+          i_abap_object                 = object_name
+      ).
+
+*      SELECT SINGLE * FROM I_CustABAPObjDirectoryEntry
+*      WHERE ABAPObject = @object_name
+*        AND ABAPObjectType = @object_type
+*        AND ABAPObjectIsDeleted = @abap_false
+*      INTO @DATA(object_still_exists).
+*
+*      SELECT SINGLE * FROM I_ABAPObjectDirectoryEntry
+*           WHERE ABAPObject = @object_name
+*             AND ABAPObjectType = @object_type
+*             AND ABAPObjectIsDeleted = @abap_false
+*           INTO @DATA(object_still_exists2).
+
+      IF object_still_exists IS NOT INITIAL.
+        IF object_still_exists-ABAPObjectIsDeleted = abap_false .
+          number_of_objects_found += 1.
+          APPEND repository_object TO r_existing_repository_objects.
+        ENDIF.
+      ENDIF.
+
+    ENDLOOP.
+
+    IF number_of_objects_found = 0.
+      r_objects_have_been_deleted = abap_true.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD get_locking_transport.
+
+    DATA   object_type TYPE if_xco_gen_o_finding=>tv_object_type  .
+
+    IF i_object_type = 'STRU'.
+      object_type = 'TABL'.
+    ELSE.
+      object_type = i_object_type.
+    ENDIF.
+
+    DATA(lo_transport_lock) = xco_cp_abap_repository=>object->for(
+      iv_type = object_type
+      iv_name = i_object_name
+    )->if_xco_cts_changeable~get_object( )->get_lock( ).
+
+
+    " we have not only to retrieve the locking task but the request to which the locking task belongs
+    " the transport_lock->get_transport() e.g. delivered the value PMDK900274.
+    " But when trying to delete objects like BDEF this failed with an error message such as
+    " Object R3TR BDEF ZR_BDTSTRAVELTP is already locked in request PMDK900273 of user CB0000000019
+
+    IF lo_transport_lock->exists( ) EQ abap_true.
+      DATA(locking_transport) = lo_transport_lock->get_transport( ).
+      r_transport = xco_cp_cts=>transport->for( locking_transport )->get_request(  )->value.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD get_objects_from_package.
+    DATA generated_repository_object TYPE zdmo_cl_rap_generator=>t_generated_repository_object.
+
+*    SELECT * FROM I_ABAPObjectDirectoryEntry WHERE ABAPPackage = @i_package
+*                                              INTO TABLE @DATA(objects_in_package) .
+
+    DATA(objects_in_package) = xco_lib->get_objects_in_package( i_package ).
+
+    LOOP AT objects_in_package INTO DATA(object_in_package).
+      generated_repository_object-object_name = object_in_package-ABAPObject.
+      generated_repository_object-object_type = object_in_package-ABAPObjectType.
+      generated_repository_object-transport_request = get_locking_transport(
+      i_object_type = generated_repository_object-object_type
+      i_object_name = generated_repository_object-object_name
+    ).
+      APPEND generated_repository_object TO r_repository_objects.
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD get_objects_from_rap_generator.
+    DATA generated_repository_object TYPE zdmo_cl_rap_generator=>t_generated_repository_object.
+
+    SELECT SINGLE RapboUUID  FROM ZDMO_R_RAPG_ProjectTP WHERE BoName = @i_rap_bo_name
+                                                    INTO @DATA(rapnodeuuid) .
+
+    SELECT * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @RapNodeUUID
+                                             INTO TABLE @DATA(bo_generated_objects).
+
+    LOOP AT bo_generated_objects INTO DATA(bo_generated_object).
+
+      generated_repository_object-hierarchy_distance_from_root = bo_generated_object-HierarchyDistanceFromRoot.
+
+      IF bo_generated_object-IsRootNode = abap_true.
+        IF bo_generated_object-ServiceBinding IS NOT INITIAL.
+          generated_repository_object-object_name = bo_generated_object-ServiceBinding.
+          generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding.
+          generated_repository_object-transport_request = get_locking_transport(
+            i_object_type = generated_repository_object-object_type
+            i_object_name = generated_repository_object-object_name
+          ).
+          APPEND generated_repository_object TO r_repository_objects.
+        ENDIF.
+        IF bo_generated_object-ServiceDefinition IS NOT INITIAL.
+          generated_repository_object-object_name = bo_generated_object-ServiceDefinition.
+          generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_definition.
+          generated_repository_object-transport_request = get_locking_transport(
+            i_object_type = generated_repository_object-object_type
+            i_object_name = generated_repository_object-object_name
+          ).
+          APPEND generated_repository_object TO r_repository_objects.
+        ENDIF.
+        IF bo_generated_object-CdsRView IS NOT INITIAL.
+          "bdef and cds r-view have the same name
+          generated_repository_object-object_name = bo_generated_object-CdsRView.
+          generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r.
+          generated_repository_object-transport_request = get_locking_transport(
+            i_object_type = generated_repository_object-object_type
+            i_object_name = generated_repository_object-object_name
+          ).
+          generated_repository_object-transport_request = get_locking_transport(
+            i_object_type = generated_repository_object-object_type
+            i_object_name = generated_repository_object-object_name
+          ).
+          APPEND generated_repository_object TO r_repository_objects.
+        ENDIF.
+        IF bo_generated_object-CdsPView IS NOT INITIAL.
+          "projection bdef and cds pr-view have the same name
+          generated_repository_object-object_name = bo_generated_object-CdsPView.
+          generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_P.
+          generated_repository_object-transport_request = get_locking_transport(
+            i_object_type = generated_repository_object-object_type
+            i_object_name = generated_repository_object-object_name
+          ).
+          APPEND generated_repository_object TO r_repository_objects.
+        ENDIF.
+        IF bo_generated_object-CdsIView IS NOT INITIAL.
+          "projection bdef and cds pr-view have the same name
+          generated_repository_object-object_name = bo_generated_object-CdsiView.
+          generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_i.
+          generated_repository_object-transport_request = get_locking_transport(
+            i_object_type = generated_repository_object-object_type
+            i_object_name = generated_repository_object-object_name
+          ).
+          APPEND generated_repository_object TO r_repository_objects.
+        ENDIF.
+      ENDIF.
+      "cds views
+      IF bo_generated_object-CdsRView IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-CdsRView.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_r.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+      IF bo_generated_object-CdsiView IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-CdsiView.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_i.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+
+      "basic i view
+
+      IF bo_generated_object-CdsIViewBasic IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-CdsIViewBasic.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_i.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+
+      " extension include view
+
+      IF bo_generated_object-ExtensionIncludeView IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-ExtensionIncludeView.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-extension_include_view.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+
+
+      IF bo_generated_object-DraftQueryView IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-DraftQueryView.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-draft_query_view.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+
+      "cds projection view and metadata extension
+      IF bo_generated_object-CdsPView IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-CdsPView.
+        "add entry for projection view
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_p.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+        "add entry for metadata extension
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-meta_data_extension.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+      "Classes
+      IF bo_generated_object-BehaviorImplementationClass IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-BehaviorImplementationClass.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-behavior_implementation.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+      IF bo_generated_object-QueryImplementationClass IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-QueryImplementationClass.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-query_implementation.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+      "tables and structures
+      IF bo_generated_object-DraftTableName IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-DraftTableName.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-draft_table.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+      IF bo_generated_object-ControlStructure IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-ControlStructure.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-control_structure.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+
+      IF bo_generated_object-ExtensionInclude IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-ExtensionInclude.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-extension_include.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+
+      IF bo_generated_object-BehaviorImplementationClass IS NOT INITIAL.
+        generated_repository_object-object_name = bo_generated_object-BehaviorImplementationClass.
+        generated_repository_object-object_type = 'CLAS'.
+        generated_repository_object-transport_request = get_locking_transport(
+          i_object_type = generated_repository_object-object_type
+          i_object_name = generated_repository_object-object_name
+        ).
+        APPEND generated_repository_object TO r_repository_objects.
+      ENDIF.
+
+    ENDLOOP.
+
+    "remove objects that have been deleted from the list
+*
+*    generated_objects_are_deleted(
+*      EXPORTING
+*        i_rap_bo_name                 = i_rap_bo_name
+*        i_repository_objects          = r_repository_objects
+*      IMPORTING
+*        r_existing_repository_objects = r_repository_objects
+*      RECEIVING
+*        r_objects_have_been_deleted   = DATA(objects_have_been_deleted)
+*    ).
+
+    SORT r_repository_objects BY hierarchy_distance_from_root ASCENDING object_type ASCENDING object_type ASCENDING.
+
+  ENDMETHOD.
+
+
+  METHOD get_root_exception.
+    rx_root = ix_exception.
+    WHILE rx_root->previous IS BOUND.
+      rx_root ?= rx_root->previous.
+    ENDWHILE.
+  ENDMETHOD.
+
+
+  METHOD rap_gen_project_objects_exist.
+
+    DATA generated_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects.
+    DATA generated_repository_object TYPE zdmo_cl_rap_generator=>t_generated_repository_object.
+
+*    DATA on_prem_xco_lib  TYPE REF TO zdmo_cl_rap_xco_lib.
+*    DATA xco_lib  TYPE REF TO zdmo_cl_rap_xco_lib.
+*
+*    on_prem_xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+*
+*    IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_true.
+*      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+*    ELSE.
+*      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+*    ENDIF.
+
+    SELECT * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @i_rap_generator_project-RapboUUID
+                                                  INTO TABLE @DATA(rapbo_nodes).
+
+    LOOP AT rapbo_nodes INTO DATA(rapbo_node).
+      "get repository object names and types
+
+      CLEAR generated_repository_objects.
+
+      IF rapbo_node-ServiceBinding IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-ServiceBinding.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-ServiceDefinition IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-ServiceDefinition.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_definition.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-CdsRView IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-CdsRView.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r.
+        APPEND generated_repository_object TO generated_repository_objects.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_r.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-CdsPView IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-CdsPView.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_p.
+        APPEND generated_repository_object TO generated_repository_objects.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_p.
+        APPEND generated_repository_object TO generated_repository_objects.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-meta_data_extension.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-CdsiView IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-CdsiView.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_i.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-ControlStructure IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-ControlStructure.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-control_structure.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-BehaviorImplementationClass IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-BehaviorImplementationClass.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-behavior_implementation.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      IF rapbo_node-DraftTableName IS NOT INITIAL.
+        generated_repository_object-object_name = rapbo_node-DraftTableName.
+        generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-draft_table.
+        APPEND generated_repository_object TO generated_repository_objects.
+      ENDIF.
+
+      LOOP AT generated_repository_objects INTO generated_repository_object.
+
+        CASE generated_repository_object-object_type.
+
+          WHEN zdmo_cl_rap_node=>root_node_object_types-service_binding.
+            IF xco_lib->get_service_binding( CONV sxco_srvb_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>root_node_object_types-service_definition.
+            IF xco_lib->get_service_definition( CONV sxco_srvd_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r. "this checks also for behavior projection 'BDEF'
+            IF xco_lib->get_behavior_definition( CONV sxco_cds_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>node_object_types-behavior_implementation. "checks also for query implementation 'CLAS'
+            IF xco_lib->get_class( CONV  sxco_ao_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>node_object_types-cds_view_r. "this checks also for i- and p-views as well as for custom entities
+            IF xco_lib->get_view( CONV  sxco_cds_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>node_object_types-control_structure.
+            IF xco_lib->get_structure( CONV  sxco_ad_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN zdmo_cl_rap_node=>node_object_types-draft_table.
+            IF xco_lib->get_database_table( CONV  sxco_dbt_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN  zdmo_cl_rap_node=>node_object_types-meta_data_extension.
+            IF xco_lib->get_metadata_extension( CONV  sxco_cds_object_name(  generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true.
+              r_repository_objects_exist = abap_true.
+            ENDIF.
+          WHEN OTHERS.
+            "do nothing
+        ENDCASE.
+
+      ENDLOOP.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD service_binding_is_published.
+
+    r_is_published = abap_false.
+
+    "object names in I_CustABAPObjDirectoryEntry are stored in upper case
+    "( ABAPObjectCategory = 'R3TR' ABAPObjectType = 'SIA6' ABAPObject = 'ZUI_BDTSTRAVEL_O4_0001_G4BA_IBS'
+
+    DATA(filter_string) = to_upper( i_object_name && '%' ).
+
+    SELECT * FROM I_CustABAPObjDirectoryEntry WHERE ABAPObject LIKE @filter_string
+                                                AND ABAPObjectType = 'SIA6'
+                                               INTO TABLE @DATA(published_srvb_entries).
+
+    IF lines( published_srvb_entries ) > 0.
+      r_is_published = abap_true.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD start_deletion.
+
+    TRY.
+*        IF application_log IS INITIAL.
+*          create_application_log(  ).
+*        ENDIF.
+
+        add_text_to_app_log_or_console( 'start method start_deletion( )' ).
+
+
+        add_text_to_app_log_or_console( |checking rap bo { BoName }| ).
+
+        DATA(objects_to_be_deleted_1) = get_objects_from_rap_generator( BoName ).
+
+
+        "remove objects that have been deleted from the list
+
+        generated_objects_are_deleted(
+          EXPORTING
+*            i_rap_bo_name                 = rap_generator_bo-BoName
+            i_repository_objects          = objects_to_be_deleted_1
+          IMPORTING
+            r_existing_repository_objects = DATA(objects_to_be_deleted)
+          RECEIVING
+            r_objects_have_been_deleted   = DATA(objects_have_been_deleted)
+        ).
+
+
+        LOOP AT objects_to_be_deleted INTO DATA(object_to_be_deleted).
+          add_text_to_app_log_or_console( | Type: { object_to_be_deleted-object_type } Name: { object_to_be_deleted-object_name } locked by cts: { object_to_be_deleted-transport_request }| ).
+*        ENDLOOP.
+
+          "unpublish service binding
+*        IF line_exists( objects_to_be_deleted[ object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding ]  ).
+          IF object_to_be_deleted-object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding.
+            DATA(service_binding_to_be_deleted) = objects_to_be_deleted[ object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding ].
+
+            "in cloud we have a validation that checks whether the service binding is still published
+            IF xco_lib->service_binding_is_published( CONV sxco_srvb_object_name(  service_binding_to_be_deleted-object_name ) ).
+              add_text_to_app_log_or_console( |Service binding { service_binding_to_be_deleted-object_name } is published. | ).
+              IF demo_mode = abap_false.
+                add_text_to_app_log_or_console( |unpublishing { service_binding_to_be_deleted-object_name }  | ).
+                xco_lib->un_publish_service_binding( CONV sxco_srvb_object_name(  service_binding_to_be_deleted-object_name ) ).
+              ENDIF.
+            ENDIF.
+
+            IF xco_lib->service_binding_is_published( CONV sxco_srvb_object_name(  service_binding_to_be_deleted-object_name ) ) = abap_false.
+              add_text_to_app_log_or_console( |Service binding { service_binding_to_be_deleted-object_name } is not published.| ).
+            ENDIF.
+
+          ENDIF.
+        ENDLOOP.
+        "start deletion
+        add_text_to_app_log_or_console( |Start deleting generated objects| ).
+
+        IF demo_mode = abap_false.
+
+          delete_generated_objects(
+            i_rap_bo_name        = BoName
+            i_repository_objects = objects_to_be_deleted
+          ).
+
+
+
+          IF generated_objects_are_deleted(
+*                   i_rap_bo_name        = rap_generator_bo-BoName
+                 i_repository_objects = objects_to_be_deleted
+               ) = abap_true.
+
+            add_text_to_app_log_or_console(
+              i_text     = |All objects of { BoName } have been deleted. |
+              i_severity = if_bali_constants=>c_severity_status
+            ).
+
+*                  Delete_RAP_Generator_Project( rap_generator_bo-BoName ).
+
+          ELSE.
+            add_text_to_app_log_or_console(
+              i_text     = |Not all objects of { BoName } have been deleted. |
+              i_severity = if_bali_constants=>c_severity_error
+            ).
+          ENDIF.
+        ENDIF.
+
+
+*      CATCH cx_bali_runtime INTO DATA(application_log_exception).
+      CATCH cx_root INTO DATA(application_log_exception).
+
+        DATA(exception_text) = application_log_exception->get_text(  ).
+        exception_text = |Exception was raised: { exception_text }|.
+        add_text_to_app_log_or_console(
+          i_text     = CONV #( exception_text )
+          i_severity = if_bali_constants=>c_severity_error
+        ).
+
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_generator_del.clas.xml b/src/zdmo_cl_rap_generator_del.clas.xml
new file mode 100644
index 0000000..5b70ffe
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_del.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GENERATOR_DEL</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>run RAP Generator via bgPF</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_generator_del_asyn.clas.abap b/src/zdmo_cl_rap_generator_del_asyn.clas.abap
new file mode 100644
index 0000000..8a406e8
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_del_asyn.clas.abap
@@ -0,0 +1,108 @@
+CLASS zdmo_cl_rap_generator_del_asyn DEFINITION
+INHERITING FROM zdmo_cl_rap_generator_base
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_serializable_object .
+    INTERFACES if_bgmc_operation .
+    INTERFACES if_bgmc_op_single_tx_uncontr .
+    INTERFACES if_abap_parallel.
+
+    METHODS constructor
+      IMPORTING
+        i_boname TYPE ZDMO_R_RAPG_ProjectTP-BoName.
+
+
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+
+    TYPES : BEGIN OF t_log_entry,
+              DetailLevel TYPE ballevel,
+              Severity    TYPE symsgty,
+              Text        TYPE  bapi_msg,
+              TimeStamp   TYPE timestamp,
+            END OF t_log_entry.
+    DATA boname TYPE zdmo_rap_gen_entityname.
+    METHODS start_deletion.
+
+    METHODS get_root_exception
+      IMPORTING !ix_exception  TYPE REF TO cx_root
+      RETURNING VALUE(rx_root) TYPE REF TO cx_root .
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GENERATOR_DEL_ASYN IMPLEMENTATION.
+
+
+  METHOD constructor.
+    super->constructor( ).
+    boname = i_boname.
+  ENDMETHOD.
+
+
+  METHOD get_root_exception.
+    rx_root = ix_exception.
+    WHILE rx_root->previous IS BOUND.
+      rx_root ?= rx_root->previous.
+    ENDWHILE.
+  ENDMETHOD.
+
+
+  METHOD if_abap_parallel~do.
+    start_deletion(  ).
+  ENDMETHOD.
+
+
+  METHOD if_bgmc_op_single_tx_uncontr~execute.
+    start_deletion(  ).
+  ENDMETHOD.
+
+
+  METHOD start_deletion.
+
+    SELECT SINGLE rapbouuid FROM ZDMO_R_RAPG_ProjectTP WHERE boname = @boname INTO @DATA(rap_bo_uuid).
+
+    READ ENTITIES OF ZDMO_R_RAPG_ProjectTP
+     ENTITY Project
+     ALL FIELDS WITH VALUE #( ( %key-RapBoUUID = rap_bo_uuid
+                          ) )
+       RESULT DATA(items)
+       FAILED DATA(read_failed).
+
+    "Fill job status fields
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+     ENTITY Project
+         UPDATE FIELDS ( JobStatus JobStatusCriticality JobStatusText )
+         WITH VALUE #( FOR item IN items ( %key = item-%key
+                                           JobStatus = 'R'
+                                           JobStatusCriticality = '2' "green
+                                           JobStatusText = 'Running'
+                                                    ) )
+     REPORTED DATA(update_reported_finished1).
+    COMMIT ENTITIES .
+    COMMIT WORK.
+
+
+    DATA(rap_generator_del) = NEW zdmo_cl_rap_generator_del( boname ).
+    rap_generator_del->start_deletion(  ).
+
+    "Fill job status fields
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+     ENTITY Project
+         UPDATE FIELDS ( JobStatus JobStatusCriticality JobStatusText )
+         WITH VALUE #( FOR item IN items ( %key = item-%key
+                                           JobStatus = 'F'
+                                           JobStatusCriticality = '3' "green
+                                           JobStatusText = 'Finished'
+                                                    ) )
+     REPORTED DATA(update_reported_finished).
+    COMMIT ENTITIES .
+    COMMIT WORK.
+
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_generator_del_asyn.clas.xml b/src/zdmo_cl_rap_generator_del_asyn.clas.xml
new file mode 100644
index 0000000..4067354
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_del_asyn.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GENERATOR_DEL_ASYN</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>run RAP Generator asynchronously</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_generator_strtbgpf.clas.abap b/src/zdmo_cl_rap_generator_strtbgpf.clas.abap
new file mode 100644
index 0000000..3912540
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_strtbgpf.clas.abap
@@ -0,0 +1,85 @@
+CLASS zdmo_cl_rap_generator_strtbgpf DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+                i_bgpf_del_operation TYPE REF TO zdmo_cl_rap_generator_del_asyn OPTIONAL
+                i_bgpf_operation     TYPE REF TO zdmo_cl_rap_generator_asyn OPTIONAL
+                i_operation_text     TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    CLASS-METHODS create_for_del_bgpf
+      IMPORTING
+        i_bgpf_del_operation TYPE REF TO zdmo_cl_rap_generator_del_asyn
+        i_operation_text     TYPE string
+      RETURNING
+        VALUE(result)        TYPE REF TO zdmo_cl_rap_generator_strtbgpf.
+
+    CLASS-METHODS create_for_bgpf
+      IMPORTING
+        i_bgpf_operation TYPE REF TO zdmo_cl_rap_generator_asyn
+        i_operation_text TYPE string
+      RETURNING
+        VALUE(result)    TYPE REF TO zdmo_cl_rap_generator_strtbgpf.
+
+    METHODS start_execution.
+
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA bgpf_operation TYPE REF TO zdmo_cl_rap_generator_asyn .
+    DATA bgpf_del_operation TYPE REF TO zdmo_cl_rap_generator_del_asyn .
+    DATA async_process_name TYPE string.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GENERATOR_STRTBGPF IMPLEMENTATION.
+
+
+  METHOD constructor.
+
+    super->constructor( ).
+
+    IF i_bgpf_del_operation IS NOT INITIAL.
+      bgpf_del_operation = i_bgpf_del_operation.
+    ELSEIF i_bgpf_operation IS NOT INITIAL.
+      bgpf_operation = i_bgpf_operation.
+    ENDIF.
+    async_process_name = i_operation_text.
+
+  ENDMETHOD.
+
+
+  METHOD create_for_bgpf.
+    result = NEW #( i_bgpf_operation =  i_bgpf_operation
+                    i_operation_text = i_operation_text ).
+  ENDMETHOD.
+
+
+  METHOD create_for_del_bgpf.
+    result = NEW #( i_bgpf_del_operation =  i_bgpf_del_operation
+                    i_operation_text = i_operation_text ).
+  ENDMETHOD.
+
+
+  METHOD start_execution.
+    TRY.
+        DATA(background_process) = cl_bgmc_process_factory=>get_default(  )->create(  ).
+
+        IF bgpf_del_operation IS NOT INITIAL.
+          background_process->set_operation_tx_uncontrolled( bgpf_del_operation ).
+          background_process->set_name( CONV #( async_process_name ) ).
+        ELSEIF bgpf_operation IS NOT INITIAL.
+          background_process->set_operation_tx_uncontrolled( bgpf_operation ).
+          background_process->set_name( CONV #( async_process_name ) ).
+        ENDIF.
+        background_process->save_for_execution(  ).
+      CATCH cx_bgmc.
+        "handle exception
+        assert 1 = 2.
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_generator_strtbgpf.clas.xml b/src/zdmo_cl_rap_generator_strtbgpf.clas.xml
new file mode 100644
index 0000000..97f8ca0
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_strtbgpf.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GENERATOR_STRTBGPF</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Start BGPGF</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_generator_test.clas.abap b/src/zdmo_cl_rap_generator_test.clas.abap
new file mode 100644
index 0000000..ff3f5a1
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_test.clas.abap
@@ -0,0 +1,812 @@
+CLASS zdmo_cl_rap_generator_test DEFINITION
+  PUBLIC
+  INHERITING FROM cl_xco_cp_adt_simple_classrun
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+
+  PROTECTED SECTION.
+    METHODS main REDEFINITION.
+    METHODS get_json_string
+      RETURNING VALUE(json_string) TYPE string.
+  PRIVATE SECTION.
+
+    TYPES : tt_bo_data   TYPE STANDARD TABLE OF ZDMO_R_RAPG_ProjectTP,
+            tt_node_data TYPE STANDARD TABLE OF ZDMO_R_RAPG_NodeTP.
+
+    TYPES : t_bo_data   TYPE  ZDMO_R_RAPG_ProjectTP,
+            t_node_data TYPE  ZDMO_R_RAPG_NodeTP.
+    TYPES t_mapped  TYPE RESPONSE FOR MAPPED EARLY ZDMO_R_RAPG_ProjectTP.
+    TYPES t_failed TYPE RESPONSE FOR FAILED EARLY ZDMO_R_RAPG_ProjectTP.
+    TYPES t_reported TYPE RESPONSE FOR REPORTED EARLY ZDMO_R_RAPG_ProjectTP.
+
+
+    DATA: generate_repository_objects TYPE abap_bool VALUE abap_false,
+          running_in_test_mode        TYPE abap_bool,
+          PackageNameForAllTests      TYPE sxco_package,
+          suffixForAllTests           TYPE sxco_ar_object_name.
+
+
+    DATA mapped TYPE t_mapped.
+    DATA failed TYPE t_failed.
+    DATA reported TYPE t_reported.
+
+    DATA update_node TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\node.
+    DATA update_rapbo TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project.
+
+    DATA update_node_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\node .
+    DATA update_rapbo_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project.
+
+    DATA wait_time_in_seconds TYPE i VALUE 1 .
+
+    DATA  et_parameters TYPE if_apj_rt_exec_object=>tt_templ_val  .
+
+
+
+
+    METHODS: create_managed_uuid ,
+
+      create_managed_semantic ,
+
+      create_unmanaged_semantic ,
+
+      create_unmanaged_abstract,
+
+      create_managed_uuid_O2 ,
+
+      create_three_level_uuid
+        IMPORTING i_bo_data   TYPE tt_bo_data
+                  i_node_data TYPE tt_node_data,
+
+      create_two_level_semantic
+        IMPORTING i_bo_data   TYPE tt_bo_data
+                  i_node_data TYPE tt_node_data.
+
+
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_GENERATOR_TEST IMPLEMENTATION.
+
+
+  METHOD create_managed_semantic.
+
+
+    DATA : bo_data       TYPE tt_bo_data,
+           node_data     TYPE tt_node_data,
+           unique_string TYPE string VALUE 'f7nkQ'.
+
+    bo_data = VALUE #( (
+                             PackageName         = packagenameforalltests
+                             Prefix              = 'M_'
+                             Suffix              = suffixforalltests
+                             ImplementationType  = zdmo_cl_rap_node=>implementation_type-managed_semantic
+                             BindingType         = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui
+                             DataSourceType      = zdmo_cl_rap_node=>data_source_types-table
+                             DraftEnabled        = abap_true
+                         )
+                         ).
+
+    node_data = VALUE #( (
+                          entityname        = |Holiday|
+                          DataSource        = 'ZDMO_fcal_holi'
+                       )
+                       (
+                          entityname        = |HolidayText|
+                          DataSource        = 'ZDMO_fcal_holi_t'
+                       )
+                       ).
+
+    create_two_level_semantic(
+      i_bo_data   = bo_data
+      i_node_data = node_data
+    ).
+
+  ENDMETHOD.
+
+
+  METHOD create_managed_uuid.
+
+    DATA : bo_data       TYPE tt_bo_data,
+           node_data     TYPE tt_node_data,
+           unique_string TYPE string VALUE 'f7nkQ'.
+
+    bo_data = VALUE #( (
+                         PackageName         = packagenameforalltests
+                         Prefix              = 'UUID_'
+                         Suffix              = suffixforalltests
+                         ImplementationType  = zdmo_cl_rap_node=>implementation_type-managed_uuid
+                         BindingType         = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui
+                         DataSourceType      = zdmo_cl_rap_node=>data_source_types-table
+                         DraftEnabled        = abap_true
+                         TransportRequest    = ''
+                     )
+                     ).
+
+    node_data = VALUE #( (
+                          entityname        = |Header|
+                          DataSource        = to_upper( 'zdmo_uuid_header' )
+                          FieldNameObjectID = to_upper( 'salesorder_id' )
+                       )
+                       (
+
+                          entityname        = |Item|
+                          DataSource        = to_upper( 'zdmo_uuid_item' )
+                          FieldNameObjectID = to_upper( 'item_id' )
+                       )
+                        (
+                          entityname           = |SubItem|
+                          FieldNameRootUUID    = to_upper( 'root_uuid' )
+                          FieldNameParentUUID  = to_upper( 'parent_uuid' )
+                          DataSource           = to_upper( 'zdmo_uuid_s_item' )
+                          FieldNameObjectID    = to_upper( 'schedule_line_id' )
+                       )
+                       ).
+
+    create_three_level_uuid(
+      i_bo_data   = bo_Data
+      i_node_data = node_data
+    ).
+
+
+  ENDMETHOD.
+
+
+  METHOD create_managed_uuid_o2.
+
+    DATA : bo_data       TYPE tt_bo_data,
+           node_data     TYPE tt_node_data,
+           unique_string TYPE string VALUE 'f7nkQ'.
+
+    bo_data = VALUE #( (
+                        PackageName         = packagenameforalltests
+                        Prefix              = 'O2_'
+                        Suffix              = suffixforalltests
+                        ImplementationType  = zdmo_cl_rap_node=>implementation_type-managed_uuid
+                        BindingType         = zdmo_cl_rap_node=>binding_type_name-odata_v2_ui
+                        DataSourceType      = zdmo_cl_rap_node=>data_source_types-table
+                        DraftEnabled        = abap_true
+                         TransportRequest    = ''
+                    )
+                    ).
+
+    node_data = VALUE #( (
+                          entityname        = |Header|
+                          DataSource        = to_upper( 'zdmo_uuid_header' )
+                          FieldNameObjectID = to_upper( 'salesorder_id' )
+                       )
+                       (
+
+                          entityname        = |Item|
+                          DataSource        = to_upper( 'zdmo_uuid_item' )
+                          FieldNameObjectID = to_upper( 'item_id' )
+                       )
+                        (
+                          entityname           = |SubItem|
+                          FieldNameRootUUID    = to_upper( 'root_uuid' )
+                          FieldNameParentUUID  = to_upper( 'parent_uuid' )
+                          DataSource           = to_upper( 'zdmo_uuid_s_item' )
+                          FieldNameObjectID    = to_upper( 'schedule_line_id' )
+                       )
+                       ).
+
+    create_three_level_uuid(
+      i_bo_data   = bo_data
+      i_node_data = node_data
+    ).
+
+
+  ENDMETHOD.
+
+
+  METHOD create_three_level_uuid.
+
+    DATA(bo_data) = i_bo_data.
+    DATA(node_data) = i_node_data.
+
+    "create BO and root node
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+      ENTITY Project
+        EXECUTE createProjectAndRootNode
+          FROM VALUE #( (
+          %cid = 'ROOT1'
+
+*          %param-packagename = bo_data[ 1 ]-PackageName
+          %param-BdefImplementationType = ''
+          %param-BindingType = ''
+          %param-DataSourceType = ''
+          %param-DraftEnabled = ''
+          %param-entityname = node_data[ 1 ]-EntityName
+          %param-data_source_name = ''
+          ) )
+      MAPPED   DATA(mapped)
+      FAILED   DATA(failed)
+      REPORTED DATA(reported).
+
+    " expect no failures and messages
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+
+    " expect a newly created record in mapped tables
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbo'  act = mapped-rapgeneratorbo  ).
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbonode' act = mapped-rapgeneratorbonode ).
+
+
+    DATA(my_rapnodeuuid) = mapped-project[ 1 ]-RapboUUID.
+    DATA(my_rootnodeuuid) = mapped-node[ 1 ]-NodeUUID.
+
+
+    "set fields for RAP BO
+    CLEAR update_rapbo_line.
+    CLEAR update_rapbo.
+    MOVE-CORRESPONDING bo_data[ 1 ] TO update_rapbo_line.
+    update_rapbo_line-%tky = VALUE #( %is_draft = if_abap_behv=>mk-on RapboUUID = my_rapnodeuuid ).
+    APPEND update_rapbo_line TO update_rapbo.
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+          ENTITY project
+                UPDATE FIELDS (
+                          suffix
+                          prefix
+*                          ImplementationType
+*                          DataSourceType
+*                          BindingType
+*                          DraftEnabled
+                           TransportRequest
+                         ) WITH update_rapbo
+       FAILED   failed
+       REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed to set bo header data'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported to set bo header data' act = reported ).
+
+
+    "set fields for root node
+    "first set data source, then set objectID field
+    CLEAR update_node_line.
+    CLEAR update_node.
+    MOVE-CORRESPONDING node_data[ 1 ] TO update_node_line.
+    update_node_line-%tky = VALUE #(  %is_draft = if_abap_behv=>mk-on NodeUUID = my_rootnodeuuid ).
+    APPEND update_node_line TO update_node.
+
+*    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+*              ENTITY Node
+*                    UPDATE FIELDS (
+*                               DataSource
+*                             ) WITH update_node
+*           FAILED   failed
+*           REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+              ENTITY Node
+                    UPDATE FIELDS (
+                               FieldNameObjectID
+                             ) WITH update_node
+           FAILED   failed
+           REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+
+    "add child node
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+      ENTITY node
+        EXECUTE addChildDataSourceTable
+          FROM VALUE #( (
+                              %tky = VALUE #(  %is_draft = if_abap_behv=>mk-on
+                                                NodeUUID = my_rootnodeuuid )
+                              %param-entity_name = node_data[ 2 ]-EntityName
+                              %param-DataSourceName = node_data[ 2 ]-DataSource
+          ) )
+      MAPPED   mapped
+      FAILED   failed
+      REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbonode' act = mapped-rapgeneratorbonode ).
+
+    DATA(my_childnodeuuid) = mapped-node[ 1 ]-NodeUUID.
+
+    "set fields for child node
+    "first set data source, then set objectID field
+    CLEAR update_node_line.
+    CLEAR update_node.
+    MOVE-CORRESPONDING node_data[ 2 ] TO update_node_line.
+    update_node_line-%tky = VALUE #(  %is_draft = if_abap_behv=>mk-on NodeUUID = my_childnodeuuid ).
+    APPEND update_node_line TO update_node.
+
+*    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+*           ENTITY Node
+*                 UPDATE FIELDS (
+*                            DataSource
+*                          ) WITH update_node
+*        FAILED   failed
+*        REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+            ENTITY Node
+                     UPDATE FIELDS (
+                                FieldNameObjectID
+                              ) WITH update_node
+            FAILED   failed
+            REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+
+
+    "add grand child node
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+      ENTITY node
+        EXECUTE addChildDataSourceTable
+          FROM VALUE #( (
+                              %tky = VALUE #(  %is_draft = if_abap_behv=>mk-on
+                                                NodeUUID = my_rootnodeuuid )
+                              %param-entity_name = node_data[ 3 ]-EntityName
+                              %param-DataSourceName = node_data[ 3 ]-DataSource
+          ) )
+      MAPPED   mapped
+      FAILED   failed
+      REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbonode' act = mapped-rapgeneratorbonode ).
+
+    DATA(my_grandchildnodeuuid) = mapped-node[ 1 ]-NodeUUID.
+
+    "set fields for grand child node
+    "first set data source, then set objectID field
+    CLEAR update_node_line.
+    CLEAR update_node.
+    MOVE-CORRESPONDING node_data[ 3 ] TO update_node_line.
+    update_node_line-%tky = VALUE #(  %is_draft = if_abap_behv=>mk-on NodeUUID = my_grandchildnodeuuid ).
+    APPEND update_node_line TO update_node.
+
+*    MODIFY ENTITIES OF ZDMO_r_rapgeneratorbo
+*           ENTITY RAPGeneratorBONode
+*                 UPDATE FIELDS (
+*                            DataSource
+*                          ) WITH update_node
+*        FAILED   failed
+*        REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+              ENTITY Node
+                       UPDATE FIELDS (
+                                  FieldNameObjectID
+                                  FieldNameRootUUID
+                                  FieldNameParentUUID
+                                ) WITH update_node
+              FAILED   failed
+              REPORTED reported.
+
+    "activate instance
+    MODIFY ENTITY ZDMO_R_RAPG_ProjectTP
+        EXECUTE
+            Activate FROM VALUE #( ( %key-RapboUUID = my_rapnodeuuid ) )
+        MAPPED DATA(mapped_active)
+        FAILED DATA(failed_active)
+        REPORTED DATA(reported_active).
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed_active'   act = failed_active ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported_active' act = reported_active ).
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped_active-rapgeneratorbo' act = mapped_active-rapgeneratorbo ).
+
+    "commit data
+    COMMIT ENTITIES RESPONSES
+           FAILED   DATA(commit_failed)
+           REPORTED DATA(commit_reported).
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'commit_failed'   act = commit_failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'commit_reported' act = commit_reported ).
+
+    "check committed data
+
+    SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE RapboUUID = @my_rapnodeuuid INTO @DATA(rapbo).
+
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'No RAP BO found' act = rapbo ).
+
+    SELECT * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @rapbo-RapboUUID INTO TABLE @DATA(rapbonodes).
+
+    DATA(number_of_entities) = lines( rapbonodes ).
+    DATA(expected_number_of_entities) = lines( node_data ).
+
+    "cl_abap_unit_assert=>assert_equals( act = rapbonodes[ 1 ]-HeaderUUID exp = rapbo-RapNodeUUID ).
+    "cl_abap_unit_assert=>assert_equals( act = number_of_entities exp = expected_number_of_entities ).
+
+    "generate repository objects
+*    MODIFY ENTITY ZDMO_r_rapgeneratorbo
+*        EXECUTE
+*            createBO FROM VALUE #( (
+*                                                %tky = VALUE #(  %is_draft = if_abap_behv=>mk-off
+*                                                rapNodeUUID = my_rapnodeuuid )
+**             %key-RapNodeUUID = my_rapnodeuuid
+*             ) )
+*        MAPPED mapped
+*        FAILED failed
+*        REPORTED reported.
+*
+*    "cl_abap_unit_assert=>assert_initial( msg = 'failed - generate objects' act = failed ).
+*    "cl_abap_unit_assert=>assert_initial( msg = 'reported - generate objects' act = reported ).
+*
+*    COMMIT ENTITIES RESPONSES
+*           FAILED   DATA(commit_failed2)
+*           REPORTED DATA(commit_reported2).
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed2 - generate objects' act = commit_failed2 ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported2 - generate objects' act = commit_reported2 ).
+
+    et_parameters = VALUE #(
+    ( selname = zdmo_cl_rap_node=>job_selection_name
+      kind = if_apj_dt_exec_object=>parameter
+      sign = 'I'
+      option = 'EQ'
+      low = rapbo-BoName )
+  ).
+
+    TRY.
+        DATA rap_job TYPE REF TO zdmo_cl_rap_gen_in_background.
+
+        rap_job = NEW #(  ).
+
+
+        rap_job->if_apj_rt_exec_object~execute( it_parameters = et_parameters ).
+      CATCH cx_apj_rt_content INTO DATA(job_exception).
+
+    ENDTRY.
+
+  ENDMETHOD.
+
+
+  METHOD create_two_level_semantic.
+
+    DATA(bo_data) = i_bo_data.
+    DATA(node_data) = i_node_data.
+
+    "create BO and root node
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+      ENTITY Project
+            EXECUTE createProjectAndRootNode
+          FROM VALUE #( (
+          %cid = 'ROOT1'
+
+*          %param-packagename = bo_data[ 1 ]-PackageName
+          %param-BdefImplementationType = ''
+          %param-BindingType = ''
+          %param-DataSourceType = ''
+          %param-DraftEnabled = ''
+          %param-entityname = node_data[ 1 ]-EntityName
+          %param-data_source_name = ''
+          ) ).
+
+    " expect no failures and messages
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+
+    " expect a newly created record in mapped tables
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbo'  act = mapped-rapgeneratorbo  ).
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbonode' act = mapped-rapgeneratorbonode ).
+
+
+    DATA(my_rapnodeuuid) = mapped-project[ 1 ]-RapboUUID.
+    DATA(my_rootnodeuuid) = mapped-node[ 1 ]-NodeUUID.
+
+
+    "set fields for RAP BO
+    CLEAR update_rapbo_line.
+    CLEAR update_rapbo.
+    MOVE-CORRESPONDING bo_data[ 1 ] TO update_rapbo_line.
+    update_rapbo_line-%tky = VALUE #( %is_draft = if_abap_behv=>mk-on RapboUUID = my_rapnodeuuid ).
+    APPEND update_rapbo_line TO update_rapbo.
+
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+          ENTITY Project
+                UPDATE FIELDS (
+                         Prefix
+                         Suffix
+*                         ImplementationType
+*                         BindingType
+*                         DataSourceType
+*                         DraftEnabled
+                           TransportRequest
+                         ) WITH update_rapbo
+       FAILED   failed
+       REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed to set bo header data'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported to set bo header data' act = reported ).
+
+
+    "set fields for root node
+    "first set data source, then set objectID field
+    CLEAR update_node_line.
+    CLEAR update_node.
+    MOVE-CORRESPONDING node_data[ 1 ] TO update_node_line.
+    update_node_line-%tky = VALUE #(  %is_draft = if_abap_behv=>mk-on NodeUUID = my_rootnodeuuid ).
+    APPEND update_node_line TO update_node.
+
+*    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+*              ENTITY Node
+*                    UPDATE FIELDS (
+*                               DataSource
+*                             ) WITH update_node
+*           FAILED   failed
+*           REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+
+    "add child node
+    MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+      ENTITY node
+        EXECUTE addChildDataSourceTable
+          FROM VALUE #( (
+                              %tky = VALUE #(  %is_draft = if_abap_behv=>mk-on
+                                                NodeUUID = my_rootnodeuuid )
+                              %param-entity_name = node_data[ 2 ]-EntityName
+          ) )
+      MAPPED   mapped
+      FAILED   failed
+      REPORTED reported.
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbonode' act = mapped-rapgeneratorbonode ).
+
+    DATA(my_childnodeuuid) = mapped-node[ 1 ]-NodeUUID.
+
+    "set fields for child node
+    "first set data source, then set objectID field
+    CLEAR update_node_line.
+    CLEAR update_node.
+    MOVE-CORRESPONDING node_data[ 2 ] TO update_node_line.
+    update_node_line-%tky = VALUE #(  %is_draft = if_abap_behv=>mk-on NodeUUID = my_childnodeuuid ).
+    APPEND update_node_line TO update_node.
+
+
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed'   act = failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ).
+
+    IF  node_data[ 2 ]-FieldNameEtagMaster IS NOT INITIAL.
+
+      CLEAR update_node_line.
+      CLEAR update_node.
+      MOVE-CORRESPONDING node_data[ 2 ] TO update_node_line.
+      update_node_line-FieldNameEtagMaster =  node_data[ 2 ]-FieldNameEtagMaster.
+      update_node_line-%tky = VALUE #(  %is_draft = if_abap_behv=>mk-on NodeUUID = my_childnodeuuid ).
+      APPEND update_node_line TO update_node.
+
+      MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP
+             ENTITY Node
+                   UPDATE FIELDS (
+                              FieldNameEtagMaster
+                            ) WITH update_node
+          FAILED   failed
+          REPORTED reported.
+
+      "cl_abap_unit_assert=>assert_initial( msg = 'failed to set etag master'   act = failed ).
+      "cl_abap_unit_assert=>assert_initial( msg = 'reported to set etag master' act = reported ).
+
+    ENDIF.
+
+    "activate instance
+    MODIFY ENTITY ZDMO_R_RAPG_ProjectTP
+        EXECUTE
+            Activate FROM VALUE #( ( %key-RapboUUID = my_rapnodeuuid ) )
+        MAPPED DATA(mapped_active)
+        FAILED DATA(failed_active)
+        REPORTED DATA(reported_active).
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'failed_active'   act = failed_active ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'reported_active' act = reported_active ).
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped_active-rapgeneratorbo' act = mapped_active-rapgeneratorbo ).
+
+    "commit data
+    COMMIT ENTITIES RESPONSES
+           FAILED   DATA(commit_failed)
+           REPORTED DATA(commit_reported).
+
+    "cl_abap_unit_assert=>assert_initial( msg = 'commit_failed'   act = commit_failed ).
+    "cl_abap_unit_assert=>assert_initial( msg = 'commit_reported' act = commit_reported ).
+
+    "check committed data
+
+    SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE RapboUUID = @my_rapnodeuuid INTO @DATA(rapbo).
+
+    "cl_abap_unit_assert=>assert_not_initial( msg = 'No RAP BO found' act = rapbo ).
+
+    SELECT * FROM ZDMO_R_RAPG_NodeTP  WHERE rapboUUID = @rapbo-RapboUUID INTO TABLE @DATA(rapbonodes).
+
+    DATA(number_of_entities) = lines( rapbonodes ).
+    DATA(expected_number_of_entities) = lines( node_data ).
+
+    "cl_abap_unit_assert=>assert_equals( act = rapbonodes[ 1 ]-HeaderUUID exp = rapbo-RapNodeUUID ).
+    "cl_abap_unit_assert=>assert_equals( act = number_of_entities exp = expected_number_of_entities ).
+
+*    "generate repository objects
+*    MODIFY ENTITY ZDMO_r_rapgeneratorbo
+*        EXECUTE
+*            createBO FROM VALUE #( (
+*                                                %tky = VALUE #(  %is_draft = if_abap_behv=>mk-off
+*                                                rapNodeUUID = my_rapnodeuuid )
+**             %key-RapNodeUUID = my_rapnodeuuid
+*             ) )
+*        MAPPED mapped
+*        FAILED failed
+*        REPORTED reported.
+*
+*    "cl_abap_unit_assert=>assert_initial( msg = 'failed - generate objects' act = failed ).
+*    "cl_abap_unit_assert=>assert_initial( msg = 'reported - generate objects' act = reported ).
+*
+*    COMMIT ENTITIES RESPONSES
+*           FAILED   DATA(commit_failed2)
+*           REPORTED DATA(commit_reported2).
+*
+*    "cl_abap_unit_assert=>assert_initial( msg = 'failed2 - generate objects' act = commit_failed2 ).
+*    "cl_abap_unit_assert=>assert_initial( msg = 'reported2 - generate objects' act = commit_reported2 ).
+*
+*
+*
+
+
+    et_parameters = VALUE #(
+       ( selname = zdmo_cl_rap_node=>job_selection_name
+         kind = if_apj_dt_exec_object=>parameter
+         sign = 'I'
+         option = 'EQ'
+         low = rapbo-BoName )
+     ).
+
+    TRY.
+        DATA rap_job TYPE REF TO zdmo_cl_rap_gen_in_background.
+
+        rap_job = NEW #(  ).
+
+
+        rap_job->if_apj_rt_exec_object~execute( it_parameters = et_parameters ).
+      CATCH cx_apj_rt_content INTO DATA(job_exception).
+
+    ENDTRY.
+
+  ENDMETHOD.
+
+
+  METHOD create_unmanaged_abstract.
+
+
+    DATA : bo_data       TYPE tt_bo_data,
+           node_data     TYPE tt_node_data,
+           unique_string TYPE string VALUE 'f7nkQ'.
+
+    bo_data = VALUE #( (
+                             PackageName         = packagenameforalltests
+                             Prefix              = 'A_'
+                             Suffix              = suffixforalltests
+                             ImplementationType  = zdmo_cl_rap_node=>implementation_type-unmanaged_semantic
+                             BindingType         = zdmo_cl_rap_node=>binding_type_name-odata_v2_ui
+                             DataSourceType      = zdmo_cl_rap_node=>data_source_types-abstract_entity
+                             DraftEnabled        = abap_FALSE
+                              TransportRequest    = ''
+                         )
+                         ).
+
+    node_data = VALUE #( (
+                          entityname        = |SalesOrder|
+                          DataSource        = 'ZDMO_TEST_ABSTRACT_ROOT_ENTITY'
+                       )
+                       (
+                          entityname        = |Item|
+                          DataSource        = 'ZDMO_TEST_ABSTRACT_CHILDENTITY'
+                          FieldNameEtagMaster = 'DELIVERYDATE'
+                       )
+                       ).
+
+    create_two_level_semantic(
+      i_bo_data   = bo_data
+      i_node_data = node_data
+    ).
+
+
+  ENDMETHOD.
+
+
+  METHOD create_unmanaged_semantic.
+
+    DATA : bo_data       TYPE tt_bo_data,
+           node_data     TYPE tt_node_data,
+           unique_string TYPE string VALUE 'f7nkQ'.
+
+    bo_data = VALUE #( (
+                             PackageName         = packagenameforalltests
+                             Prefix              = 'U_'
+                             Suffix              = suffixforalltests
+                             ImplementationType  = zdmo_cl_rap_node=>implementation_type-unmanaged_semantic
+                             BindingType         = zdmo_cl_rap_node=>binding_type_name-odata_v2_ui
+                             DataSourceType      = zdmo_cl_rap_node=>data_source_types-table
+                             DraftEnabled        = abap_FALSE
+                              TransportRequest    = ''
+                         )
+                         ).
+
+    node_data = VALUE #( (
+                          entityname        = |Holiday|
+                          DataSource        = 'ZDMO_fcal_holi'
+                       )
+                       (
+                          entityname        = |HolidayText|
+                          DataSource        = 'ZDMO_fcal_holi_t'
+                       )
+                       ).
+
+    create_two_level_semantic(
+      i_bo_data   = bo_data
+      i_node_data = node_data
+    ).
+
+
+  ENDMETHOD.
+
+
+  METHOD get_json_string.
+    json_string = '{ "Info" : "to be replaced with your JSON string" }' .
+  ENDMETHOD.
+
+
+  METHOD main.
+
+
+    out->write( 'start' ).
+    WAIT UP TO 10 SECONDS.
+    out->write( 'finish' ).
+    EXIT.
+    PackageNameForAllTests = 'ZDMO_DELETE_TESTS_EML3'.
+    suffixForAllTests      = '_35'  .
+    running_in_test_mode = abap_false.
+
+    TRY.
+
+        out->write( 'run create_managed_semantic' ).
+        create_managed_semantic( ).
+        out->write( |waiting { wait_time_in_seconds } seconds| ).
+        WAIT UP TO wait_time_in_seconds SECONDS.
+
+        out->write( 'run create_managed_uuid' ).
+        create_managed_uuid(  ).
+        out->write( |waiting { wait_time_in_seconds } seconds| ).
+        WAIT UP TO wait_time_in_seconds SECONDS.
+
+        out->write( 'run create_managed_uuid_o2' ).
+        create_managed_uuid_o2(  ).
+        out->write( |waiting { wait_time_in_seconds } seconds| ).
+        WAIT UP TO wait_time_in_seconds SECONDS.
+
+        out->write( 'run create_unmanaged_abstract' ).
+        create_unmanaged_abstract(  ).
+        out->write( |waiting { wait_time_in_seconds } seconds| ).
+        WAIT UP TO wait_time_in_seconds SECONDS.
+
+        out->write( 'run create_unmanaged_semantic' ).
+        create_unmanaged_semantic(  ).
+
+
+      CATCH ZDMO_cx_rap_generator INTO DATA(rap_generator_exception).
+        out->write( 'The following exception has been raised:' ) .
+        out->write( rap_generator_exception->get_text(  ) ).
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_generator_test.clas.xml b/src/zdmo_cl_rap_generator_test.clas.xml
new file mode 100644
index 0000000..e2b5984
--- /dev/null
+++ b/src/zdmo_cl_rap_generator_test.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_GENERATOR_TEST</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>zcl_rap_generator_console_demo</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_node.clas.abap b/src/zdmo_cl_rap_node.clas.abap
new file mode 100644
index 0000000..3818a43
--- /dev/null
+++ b/src/zdmo_cl_rap_node.clas.abap
@@ -0,0 +1,7097 @@
+CLASS zdmo_cl_rap_node DEFINITION
+  PUBLIC
+  CREATE PUBLIC
+*  GLOBAL FRIENDS ZDMO_cl_rap_xco_json_visitor
+  .
+
+  PUBLIC SECTION.
+
+    CONSTANTS:
+
+      job_template_name             TYPE cl_apj_dt_create_content=>ty_template_name VALUE 'ZDMO_RAP_GEN_JOB_TEMPLATE',
+      job_catalog_name              TYPE cl_apj_dt_create_content=>ty_catalog_name VALUE 'ZDMO_RAP_GEN_CATALOG_ENTRY',
+      job_class_name                TYPE cl_apj_dt_create_content=>ty_class_name VALUE 'ZDMO_CL_RAP_GEN_IN_BACKGROUND',
+      job_del_template_name         TYPE cl_apj_dt_create_content=>ty_template_name VALUE 'ZDMO_RAP_DEL_JOB_TEMPLATE',
+      job_del_catalog_name          TYPE cl_apj_dt_create_content=>ty_catalog_name VALUE 'ZDMO_RAP_DEL_CATALOG_ENTRY',
+      job_del_class_name            TYPE cl_apj_dt_create_content=>ty_class_name VALUE 'ZDMO_CL_RAP_DEL_APPL_JOB',
+      job_del_class_name_op         TYPE cl_apj_dt_create_content=>ty_class_name VALUE 'ZDMO_CL_RAP_DEL_APPL_JOB',
+      job_catalog_text              TYPE cl_apj_dt_create_content=>ty_text VALUE 'RAP Generator',
+      job_template_text             TYPE cl_apj_dt_create_content=>ty_text VALUE 'RAP Generator',
+      "job_selection_name            TYPE c LENGTH 8   VALUE 'I_VIEW',
+      job_selection_name            TYPE c LENGTH 8   VALUE 'BO_NAME',
+      job_selection_description     TYPE c LENGTH 255 VALUE 'RAP business object name',
+      application_log_object_name   TYPE if_bali_object_handler=>ty_object VALUE 'ZDMO_RAP_GEN_APPLLOG',
+      application_log_object_text   TYPE if_bali_object_handler=>ty_object_text  VALUE 'Application Log of the RAP Generator',
+      application_log_sub_obj1_name TYPE if_bali_object_handler=>ty_object VALUE 'ZDMO_RAP_GEN_JOB',
+      application_log_sub_obj1_text TYPE if_bali_object_handler=>ty_object_text  VALUE 'Detail information',
+
+      minimal_search_string_length  TYPE i VALUE 2,
+
+      strict_mode_2                 TYPE i VALUE 2,
+
+      dummy_field_name              TYPE sxco_ad_field_name  VALUE 'DUMMY_FIELD',
+      dummy_field_cds_name          TYPE sxco_cds_field_name VALUE 'DummyField',
+      extension_association_name    TYPE sxco_cds_association_name VALUE 'Extension',
+
+      BEGIN OF AbapCatalog_enhancement,
+        quotaMaximumFields TYPE i VALUE 500,
+        quotaMaximumBytes  TYPE i VALUE 8160,
+        quotaShareCustomer TYPE i VALUE 50,
+        quotaSharePartner  TYPE i VALUE 50,
+      END OF AbapCatalog_enhancement,
+
+      BEGIN OF package_type,
+        development_package TYPE sychar01 VALUE ' ',
+        main_package        TYPE sychar01 VALUE 'X',
+        structure_package   TYPE sychar01 VALUE 'S',
+      END OF package_type,
+
+      BEGIN OF package_abap_language_version,
+        standard                    TYPE sychar01 VALUE ' ',
+        abap_for_key_users          TYPE sychar01 VALUE '2',
+        abap_for_sap_cloud_platform TYPE sychar01 VALUE '5',
+      END OF package_abap_language_version,
+
+      BEGIN OF enhancement_category,
+        not_classified                 TYPE n LENGTH 1 VALUE '0',
+        cannot_be_enhanced             TYPE n LENGTH 1 VALUE '1',
+        can_be_enhanced_c_like         TYPE n LENGTH 1 VALUE '2',
+        can_be_enhanced_c_like_or_nmrc TYPE n LENGTH 1 VALUE '3',
+        can_be_enhanced_deep           TYPE n LENGTH 1 VALUE '4',
+      END OF enhancement_category,
+
+      "the RAP generator only supports certain combinations of implementation type and key type
+      BEGIN OF implementation_type,
+        managed_uuid       TYPE string VALUE 'managed_uuid',
+        managed_semantic   TYPE string VALUE 'managed_semantic',
+        unmanaged_semantic TYPE string VALUE 'unmanaged_semantic',
+      END OF implementation_type,
+
+      BEGIN OF bdef_implementation_type,
+        managed   TYPE string VALUE 'managed',
+        unmanaged TYPE string VALUE 'unmanaged',
+      END OF bdef_implementation_type,
+
+      BEGIN OF abap_language_version,
+        standard                   TYPE string VALUE 'standard',
+        abap_for_cloud_development TYPE string VALUE 'abap_for_cloud_development',
+      END OF abap_language_version,
+
+      BEGIN OF additional_fields_object_types,
+        cds_interface_view        TYPE string VALUE 'cds_interface_view',
+        cds_restricted_reuse_view TYPE string VALUE 'cds_restricted_reuse_view',
+        cds_projection_view       TYPE string VALUE 'cds_projection_view',
+        draft_table               TYPE string VALUE 'draft_table',
+      END OF additional_fields_object_types,
+
+      BEGIN OF root_node_repository_objects,
+        behavior_definition_r TYPE string VALUE 'behavior_definition',
+        behavior_definition_p TYPE string VALUE 'behavior_definition_projection',
+        behavior_definition_i TYPE string VALUE 'behavior_definition_interface',
+        service_definition    TYPE string VALUE 'service_definition',
+        service_binding       TYPE string VALUE 'service_binding',
+        sap_object_type       TYPE string VALUE 'sap_object_type',
+      END OF root_node_repository_objects,
+
+      BEGIN OF node_repository_objects,
+        custom_entity           TYPE string VALUE 'custom_entity',
+        custom_query_impl_class TYPE string VALUE 'custom_query_implementation_class',
+        cds_view_i              TYPE string VALUE 'cds_interface_view',
+        cds_view_i_basic        TYPE string VALUE 'cds_interface_view_basic',
+        cds_view_r              TYPE string VALUE 'cds_restricted_reuse_view',
+        cds_view_p              TYPE string VALUE 'cds_projection_view',
+        extension_include       TYPE string VALUE 'extension_include',
+        extension_include_view  TYPE string VALUE 'extension_include_view',
+        draft_query_view        TYPE string VALUE 'draft_query_view',
+        meta_data_extension     TYPE string VALUE 'metadata_extension_view',
+        behavior_implementation TYPE string VALUE 'behavior_implementation_class',
+        draft_table             TYPE string VALUE 'draft_table',
+        control_structure       TYPE string VALUE 'control_structure',
+        sap_object_node_type    TYPE string VALUE 'sap_object_node_type',
+      END OF node_repository_objects,
+
+      BEGIN OF data_source_types,
+        table           TYPE string VALUE 'table',
+        cds_view        TYPE string VALUE 'cds_view',
+        abap_type       TYPE string VALUE 'abap_type',
+        structure       TYPE string VALUE 'structure',
+        abstract_entity TYPE string VALUE 'abstract_entity',
+      END OF data_source_types,
+
+      BEGIN OF cardinality,
+        zero_to_one TYPE string VALUE 'zero_to_one',
+        one         TYPE string VALUE 'one',
+        zero_to_n   TYPE string VALUE 'zero_to_n',
+        one_to_n    TYPE string VALUE 'one_to_n',
+        one_to_one  TYPE string VALUE 'one_to_one',
+      END OF cardinality,
+
+
+      BEGIN OF additionalbinding_usage,
+        filter            TYPE string VALUE 'FILTER',
+        filter_and_result TYPE string VALUE 'FILTER_AND_RESULT',
+        result            TYPE string VALUE 'RESULT',
+      END OF additionalbinding_usage,
+
+      BEGIN OF binding_type_name,
+        odata_v4_ui      TYPE string VALUE 'odata_v4_ui',
+        odata_v2_ui      TYPE string VALUE 'odata_v2_ui',
+        odata_v4_web_api TYPE string VALUE 'odata_v4_web_api',
+        odata_v2_web_api TYPE string VALUE 'odata_v2_web_api',
+      END OF binding_type_name,
+
+      BEGIN OF  protocol_version_suffix,
+        odata_v2 TYPE string VALUE '_O2',
+        odata_v4 TYPE string VALUE '_O4',
+      END OF protocol_version_suffix,
+
+      BEGIN OF binding_type_prefix,
+        ui      TYPE string VALUE 'UI_',
+        web_api TYPE string VALUE 'API_',
+      END OF binding_type_prefix,
+
+      BEGIN OF node_object_prefix,
+        custom_entity           TYPE string VALUE 'R_',
+        custom_query_impl_class TYPE string VALUE 'CL_CE_',
+        cds_view_i              TYPE string VALUE 'I_',
+        cds_view_r              TYPE string VALUE 'R_',
+        behavior_definition_r   TYPE string VALUE 'R_',
+        behavior_definition_i   TYPE string VALUE 'I_',
+        "ddic_view_i             TYPE sxco_dbt_object_name,
+        cds_view_p              TYPE string VALUE 'C_',
+        behavior_definition_p   TYPE string VALUE 'C_',
+        meta_data_extension     TYPE string VALUE 'C_',
+        behavior_implementation TYPE string VALUE 'BP_R_',
+        "avoid error - Underscore not permitted at 2nd or 3rd position
+        control_structure       TYPE string VALUE 'S',
+        extension_include_view  TYPE string VALUE 'E_',
+        draft_query_view        TYPE string VALUE 'R_',
+        "avoid error - Underscore not permitted at 2nd or 3rd position
+        extension_include       TYPE string VALUE 'S',
+      END OF node_object_prefix,
+
+      BEGIN OF node_object_suffix,
+        control_structure        TYPE string VALUE '_X',
+        draft_table              TYPE c VALUE 'D',
+        "new suffix TP
+        transactional_processing TYPE string VALUE 'TP',
+        draft_query_view         TYPE string VALUE '_D',
+      END OF node_object_suffix,
+
+
+      BEGIN OF max_length_object_type,
+        bdef TYPE i VALUE 30,
+        ddls TYPE i VALUE 30,
+        ddlx TYPE i VALUE 30,
+        srvd TYPE i VALUE 30,
+        stru TYPE i VALUE 30,
+        srvb TYPE i VALUE 26,
+        clas TYPE i VALUE 30,
+        devc TYPE i VALUE 20,
+        tabl TYPE i VALUE 16,
+        smbc TYPE i VALUE 20,
+        ront TYPE i VALUE 30,
+        nont TYPE i VALUE 30,
+      END OF max_length_object_type,
+
+      BEGIN OF root_node_object_suffix,
+        behavior_definition_i TYPE string VALUE 'I_',
+        behavior_definition_p TYPE string VALUE 'C_',
+        service_definition    TYPE string VALUE 'C_',
+        service_binding       TYPE string VALUE 'C_',
+      END OF root_node_object_suffix,
+
+      BEGIN OF root_node_object_types,
+        behavior_definition_r TYPE sxco_ar_object_type VALUE 'BDEF',
+        behavior_definition_p TYPE sxco_ar_object_type VALUE 'BDEF',
+        behavior_definition_i TYPE sxco_ar_object_type VALUE 'BDEF',
+        service_binding       TYPE sxco_ar_object_type VALUE 'SRVB',
+        service_definition    TYPE sxco_ar_object_type VALUE 'SRVD',
+      END OF root_node_object_types,
+
+      BEGIN OF node_object_types,
+        cds_view_i              TYPE sxco_ar_object_type VALUE 'DDLS',
+        cds_view_i_basic        TYPE sxco_ar_object_type VALUE 'DDLS',
+        cds_view_r              TYPE sxco_ar_object_type VALUE 'DDLS',
+        cds_view_p              TYPE sxco_ar_object_type VALUE 'DDLS',
+        meta_data_extension     TYPE sxco_ar_object_type VALUE 'DDLX',
+        behavior_implementation TYPE sxco_ar_object_type VALUE 'CLAS',
+        query_implementation    TYPE sxco_ar_object_type VALUE 'CLAS',
+        custom_entity           TYPE sxco_ar_object_type VALUE 'DDLS',
+        extension_include_view  TYPE sxco_ar_object_type VALUE 'DDLS',
+        draft_query_view        TYPE sxco_ar_object_type VALUE 'DDLS',
+        "internally we use 'STRU'
+        "in xco we have to use
+        "for tables
+        "i_environment->for-tabl-for-database_table->create_delete_operation( ).
+        "and the following code for structures
+        "i_environment->for-tabl-for-structure->create_delete_operation( ).
+        control_structure       TYPE sxco_ar_object_type VALUE 'STRU',
+        extension_include       TYPE sxco_ar_object_type VALUE 'STRU',
+        "***
+        draft_table             TYPE sxco_ar_object_type VALUE 'TABL',
+      END OF node_object_types,
+
+
+      supported_binding_types  TYPE string VALUE 'odata_v4_ui, odata_v2_ui, odata_v4_web_api, odata_v2_web_api',
+
+      uuid_type                TYPE cl_xco_ad_built_in_type=>tv_type   VALUE 'RAW',
+      uuid_length              TYPE cl_xco_ad_built_in_type=>tv_length  VALUE 16,
+
+      singleton_field_name     TYPE sxco_cds_field_name  VALUE 'SingletonID',
+      singleton_suffix         TYPE string VALUE '_S',
+      singleton_child_tab_name TYPE string VALUE 'child_tab',
+
+      release_contract_c0      TYPE if_abap_api_state=>ty_release_contract VALUE 'C0',
+      release_contract_c1      TYPE if_abap_api_state=>ty_release_contract VALUE 'C1'
+      .
+
+
+
+    .
+
+
+    TYPES:
+
+      BEGIN OF t_framework_message_fields,
+        severity    TYPE symsgty,
+        object_TYPE TYPE if_xco_gen_o_finding=>tv_object_type,
+        object_name TYPE if_xco_gen_o_finding=>tv_object_name,
+        message     TYPE string,
+      END OF t_framework_message_fields,
+
+      tt_framework_message_fields TYPE STANDARD TABLE OF t_framework_message_fields WITH EMPTY KEY,
+
+      BEGIN OF root_cause_textid,
+        msgid TYPE symsgid,
+        msgno TYPE symsgno,
+        attr1 TYPE scx_attrname,
+        attr2 TYPE scx_attrname,
+        attr3 TYPE scx_attrname,
+        attr4 TYPE scx_attrname,
+      END OF root_cause_textid.
+
+    TYPES:
+      BEGIN OF ts_manage_buiness_config,
+        namespace   TYPE if_mbc_cp_api_business_config=>ty_namespace,
+        identifier  TYPE if_mbc_cp_api_business_config=>ty_identifier,
+        name        TYPE if_mbc_cp_api_business_config=>ty_name,
+        description TYPE if_mbc_cp_api_business_config=>ty_description,
+      END OF ts_manage_buiness_config.
+
+
+    TYPES:
+      BEGIN OF ts_field_name,
+        client                         TYPE string,
+        uuid                           TYPE string,
+        parent_uuid                    TYPE string,
+        root_uuid                      TYPE string,
+        created_by                     TYPE string,
+        created_at                     TYPE string,
+        last_changed_by                TYPE string,
+        last_changed_at                TYPE string,
+        local_instance_last_changed_at TYPE string,
+        local_instance_last_changed_by TYPE string,
+        language                       TYPE string,
+        etag_master                    TYPE string,
+        total_etag                     TYPE string,
+
+      END OF ts_field_name.
+
+    TYPES:
+      BEGIN OF ts_dataelement_name,
+        client                         TYPE string,
+        uuid                           TYPE string,
+        parent_uuid                    TYPE string,
+        root_uuid                      TYPE string,
+        created_by                     TYPE string,
+        created_at                     TYPE string,
+        last_changed_by                TYPE string,
+        last_changed_at                TYPE string,
+        local_instance_last_changed_at TYPE string,
+        local_instance_last_changed_by TYPE string,
+        language                       TYPE string,
+        etag_master                    TYPE string,
+        total_etag                     TYPE string,
+
+      END OF ts_dataelement_name.
+
+    TYPES:
+      BEGIN OF ts_builtintypeelement_name,
+        client   TYPE string,
+        language TYPE string,
+      END OF ts_builtintypeelement_name.
+
+    TYPES :  tt_childnodes TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node WITH EMPTY KEY.
+    TYPES :  ty_childnode TYPE REF TO zdmo_cl_rap_node.
+
+    TYPES :  tt_semantic_key_fields TYPE TABLE OF sxco_ad_field_name.
+    TYPES :
+      BEGIN OF ts_semantic_key,
+        name           TYPE sxco_ad_field_name,
+        cds_view_field TYPE sxco_ad_field_name,
+      END OF ts_semantic_key.
+    TYPES    : tt_semantic_key TYPE TABLE OF  ts_semantic_key.
+
+    TYPES:
+      BEGIN OF ts_field,
+        name                   TYPE sxco_ad_object_name,
+        doma                   TYPE sxco_ad_object_name,
+        data_element           TYPE sxco_ad_object_name,
+        key_indicator          TYPE abap_bool,
+        not_null               TYPE abap_bool,
+        domain_fixed_value     TYPE abap_bool,
+        cds_view_field         TYPE sxco_cds_field_name,
+        has_association        TYPE abap_bool,
+        has_valuehelp          TYPE abap_bool,
+        currencycode           TYPE sxco_cds_field_name,
+        unitofmeasure          TYPE sxco_cds_field_name,
+        is_data_element        TYPE abap_bool,
+        is_built_in_type       TYPE abap_bool,
+        is_hidden              TYPE abap_bool,
+        is_currencycode        TYPE abap_bool,
+        is_unitofmeasure       TYPE abap_bool,
+        "built_in_type_object TYPE REF TO cl_xco_ad_built_in_type,
+        built_in_type          TYPE c LENGTH 50 , " like abap_ cl_xco_ad_built_in_type=>tv_type,
+        built_in_type_length   TYPE cl_xco_ad_built_in_type=>tv_length,
+        built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals,
+      END OF ts_field.
+
+    TYPES : tt_fields TYPE STANDARD TABLE OF ts_field WITH EMPTY KEY.
+
+    TYPES : tt_fields_default_key TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY.
+
+    TYPES:
+      BEGIN OF ts_node_objects,
+        custom_entity           TYPE sxco_cds_object_name,
+        custom_query_impl_class TYPE sxco_ao_object_name,
+        cds_view_i              TYPE sxco_cds_object_name,
+        cds_view_i_basic        TYPE sxco_cds_object_name,
+        cds_view_r              TYPE sxco_cds_object_name,
+        ddic_view_i             TYPE sxco_dbt_object_name,
+        cds_view_p              TYPE sxco_cds_object_name,
+        meta_data_extension     TYPE sxco_cds_object_name,
+        alias                   TYPE sxco_ddef_alias_name,
+        behavior_implementation TYPE sxco_ao_object_name,
+        control_structure       TYPE sxco_ad_object_name,
+        draft_query_view        TYPE sxco_cds_object_name,
+        extension_include_view  TYPE sxco_cds_object_name,
+        extension_include       TYPE sxco_ad_object_name,
+        sap_object_node_type    TYPE sxco_cds_object_name,
+      END OF ts_node_objects.
+
+
+
+
+    TYPES:
+      BEGIN OF ts_root_node_objects,
+        behavior_definition_r TYPE sxco_cds_object_name,
+        behavior_definition_p TYPE sxco_cds_object_name,
+        behavior_definition_i TYPE sxco_cds_object_name,
+        service_definition    TYPE sxco_ao_object_name,
+        service_binding       TYPE sxco_ao_object_name,
+        sap_object_type       TYPE sxco_cds_object_name,
+      END OF ts_root_node_objects.
+
+    TYPES:
+      BEGIN OF ts_additional_fields_old,
+        field_name             TYPE string,
+        alias                  TYPE sxco_ddef_alias_name,
+        data_element           TYPE sxco_ad_object_name,
+        built_in_type          TYPE cl_xco_ad_built_in_type=>tv_type,
+        built_in_type_length   TYPE cl_xco_ad_built_in_type=>tv_length,
+        built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals,
+        localized              TYPE abap_bool,
+      END OF ts_additional_fields_old,
+
+      tt_additional_fields_old TYPE STANDARD TABLE OF ts_additional_fields_old WITH DEFAULT KEY.
+
+    TYPES:
+      BEGIN OF ts_additional_fields,
+        name                      TYPE string,
+        cds_view_field            TYPE sxco_ddef_alias_name,
+        data_element              TYPE sxco_ad_object_name,
+        built_in_type             TYPE cl_xco_ad_built_in_type=>tv_type,
+        built_in_type_length      TYPE cl_xco_ad_built_in_type=>tv_length,
+        built_in_type_decimals    TYPE cl_xco_ad_built_in_type=>tv_decimals,
+        is_hidden                 TYPE abap_bool,
+        localized                 TYPE abap_bool,
+        cds_interface_view        TYPE abap_bool,
+        cds_restricted_reuse_view TYPE abap_bool,
+        cds_projection_view       TYPE abap_bool,
+        draft_table               TYPE abap_bool,
+      END OF ts_additional_fields,
+
+      tt_additional_fields TYPE STANDARD TABLE OF ts_additional_fields WITH DEFAULT KEY.
+
+
+    TYPES:
+      BEGIN OF ts_objects_with_add_fields,
+        object            TYPE string,
+        additional_fields TYPE tt_additional_fields_old,
+      END OF ts_objects_with_add_fields,
+
+      tt_objects_with_add_fields TYPE STANDARD TABLE OF ts_objects_with_add_fields WITH DEFAULT KEY.
+
+    TYPES:
+      BEGIN OF ts_abap_type,
+        prefix    TYPE sxco_ao_object_name,
+        type_name TYPE   sxco_ao_component_name,
+      END OF ts_abap_type.
+
+    TYPES:
+      BEGIN OF ts_condition_fields,
+        projection_field  TYPE sxco_cds_field_name,
+        association_field TYPE sxco_cds_field_name,
+      END OF ts_condition_fields,
+
+
+      tt_condition_fields TYPE STANDARD TABLE OF ts_condition_fields WITH EMPTY KEY,
+
+      BEGIN OF ts_assocation,
+        name                 TYPE sxco_ddef_alias_name,
+        target               TYPE sxco_cds_object_name,
+        condition_components TYPE tt_condition_fields,
+        cardinality          TYPE string,
+      END OF ts_assocation,
+
+      tt_assocation TYPE STANDARD TABLE OF ts_assocation,
+
+      BEGIN OF ts_additionalbinding,
+        localelement TYPE sxco_cds_field_name,
+        element      TYPE sxco_cds_field_name,
+        usage        TYPE string,
+      END OF ts_additionalbinding,
+
+      tt_addtionalbinding TYPE STANDARD TABLE OF ts_additionalbinding WITH DEFAULT KEY,
+
+      BEGIN OF ts_valuehelp,
+        name              TYPE sxco_cds_object_name,
+        alias             TYPE sxco_ddef_alias_name,
+        localelement      TYPE sxco_cds_field_name,
+        element           TYPE sxco_cds_field_name,
+        additionalbinding TYPE tt_addtionalbinding,
+        useforvalidation  TYPE abap_bool,
+      END OF ts_valuehelp,
+
+      tt_valuehelp TYPE STANDARD TABLE OF ts_valuehelp WITH DEFAULT KEY
+
+      .
+
+    DATA generate_only_node_hierachy TYPE abap_bool.
+
+    DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib.
+    DATA data_source_type    TYPE string READ-ONLY.
+    DATA lt_valuehelp TYPE tt_valuehelp READ-ONLY.
+    DATA lt_objects_with_add_fields TYPE tt_objects_with_add_fields READ-ONLY.
+    DATA lt_messages TYPE TABLE OF string READ-ONLY.
+    DATA field_name TYPE ts_field_name READ-ONLY.
+    DATA dataelement_name TYPE ts_dataelement_name READ-ONLY.
+    DATA builtintype_name TYPE ts_builtintypeelement_name READ-ONLY.
+    DATA lt_association TYPE tt_assocation READ-ONLY.
+    DATA rap_node_objects TYPE ts_node_objects READ-ONLY.
+    DATA rap_root_node_objects TYPE ts_root_node_objects READ-ONLY.
+    DATA lt_fields TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY READ-ONLY.
+    DATA lt_additional_fields TYPE STANDARD TABLE OF ts_additional_fields WITH DEFAULT KEY READ-ONLY.
+    DATA lt_all_fields TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY READ-ONLY.
+    DATA lt_fields_persistent_table TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY READ-ONLY.
+    DATA table_name          TYPE sxco_dbt_object_name READ-ONLY.
+    DATA structure_name      TYPE sxco_ad_object_name READ-ONLY.
+    DATA abap_type_name TYPE string.
+    DATA semantic_key TYPE tt_semantic_key.
+    DATA suffix              TYPE string READ-ONLY.
+    DATA prefix              TYPE string READ-ONLY.
+    DATA namespace           TYPE string READ-ONLY.
+
+    DATA entityname          TYPE sxco_ddef_alias_name READ-ONLY.
+    DATA node_number         TYPE i READ-ONLY.
+    DATA object_id           TYPE sxco_ad_field_name READ-ONLY.
+    DATA object_id_cds_field_name TYPE sxco_ad_field_name READ-ONLY.
+    DATA all_childnodes TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node READ-ONLY.
+    DATA childnodes TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node READ-ONLY.
+    DATA root_node TYPE REF TO zdmo_cl_rap_node READ-ONLY.
+    DATA parent_node TYPE REF TO zdmo_cl_rap_node READ-ONLY.
+    DATA is_finalized           TYPE abap_bool READ-ONLY .
+    DATA package          TYPE sxco_package READ-ONLY.
+    DATA lt_mapping TYPE HASHED TABLE OF  if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping
+                                  WITH UNIQUE KEY cds_view_field dbtable_field.
+    DATA ls_mapping TYPE if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping  .
+    DATA transactional_behavior TYPE abap_bool READ-ONLY.
+    DATA multi_edit TYPE abap_bool READ-ONLY.
+    DATA manage_business_configuration TYPE abap_bool READ-ONLY.
+    DATA manage_business_config_names TYPE ts_manage_buiness_config READ-ONLY.
+    DATA publish_service            TYPE abap_bool READ-ONLY.
+    DATA add_basic_i_views            TYPE abap_bool READ-ONLY.
+    DATA add_sap_object_type          TYPE abap_bool READ-ONLY.
+    DATA cds_view_name TYPE string READ-ONLY.
+    DATA data_source_name TYPE string READ-ONLY.
+    DATA persistent_table_name TYPE string READ-ONLY.
+    DATA draft_table_name TYPE sxco_dbt_object_name READ-ONLY.
+    DATA binding_type TYPE string READ-ONLY.
+    DATA transport_request TYPE string READ-ONLY.
+    DATA draft_enabled TYPE abap_bool READ-ONLY .
+    DATA useuppercamelcase TYPE abap_bool READ-ONLY .
+    DATA skip_activation TYPE abap_bool READ-ONLY.
+    DATA add_meta_data_extensions TYPE abap_bool READ-ONLY.
+    DATA is_customizing_table TYPE abap_bool READ-ONLY.
+    DATA create_table TYPE abap_bool READ-ONLY.
+    DATA extensibility_element_Suffix TYPE string READ-ONLY.
+
+    DATA mimic_adt_wizard TYPE abap_bool READ-ONLY.
+
+    DATA view_type_value TYPE sychar01." ddddlsrctype . "char01 .
+
+    DATA association_targets TYPE STANDARD TABLE OF sxco_cds_object_name WITH EMPTY KEY READ-ONLY.
+    DATA composition_targets TYPE STANDARD TABLE OF sxco_cds_object_name WITH EMPTY KEY READ-ONLY.
+
+    " DATA rap_generator_xco_lib TYPE REF TO zif_rap_generator_xco_lib.
+    METHODS todo
+      IMPORTING todo TYPE string.
+
+    METHODS constructor
+      IMPORTING io_xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_xco_lib
+      IMPORTING io_xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_has_transactional_behavior
+      IMPORTING iv_value TYPE abap_bool .
+
+    METHODS set_add_sap_object_type
+      IMPORTING iv_value TYPE abap_bool DEFAULT abap_true.
+
+    METHODS set_generate_only_node_hierach
+      IMPORTING iv_value TYPE abap_bool.
+
+    METHODS add_multi_edit
+      IMPORTING iv_value TYPE abap_bool.
+
+    METHODS add_to_manage_business_config
+      IMPORTING iv_value TYPE abap_bool .
+
+    METHODS generate_bil
+      RETURNING VALUE(result) TYPE abap_bool.
+
+    METHODS generate_custom_entity
+      RETURNING VALUE(result) TYPE abap_bool.
+
+    METHODS set_mbc_namespace.
+
+
+    METHODS set_mbc_identifier
+      IMPORTING iv_value TYPE string . "if_mbc_cp_api_business_config=>ty_identifier.
+
+    METHODS set_mbc_name
+      IMPORTING iv_value TYPE  string. "if_mbc_cp_api_business_config=>ty_name.
+
+    METHODS set_mbc_description
+      IMPORTING iv_value TYPE string. "if_mbc_cp_api_business_config=>ty_description.
+
+    METHODS set_is_customizing_table
+      IMPORTING iv_value TYPE abap_bool.
+
+    METHODS  set_publish_service
+      IMPORTING iv_value TYPE abap_bool .
+
+    METHODS set_add_basic_i_views
+      IMPORTING iv_value TYPE abap_bool.
+
+    METHODS set_mimic_adt_wizard
+      IMPORTING iv_value TYPE abap_bool.
+
+    METHODS  set_draft_enabled
+      IMPORTING iv_value TYPE abap_bool .
+
+    METHODS set_add_meta_data_extensions
+      IMPORTING iv_value TYPE abap_bool .
+
+    METHODS set_skip_activation
+      IMPORTING iv_value TYPE abap_bool .
+
+    METHODS check_data_elements_of_fields.
+
+    METHODS set_mapping
+      IMPORTING it_field_mappings TYPE if_xco_gen_bdef_s_fo_b_mapping=>tt_field_mapping OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_package
+      IMPORTING VALUE(iv_package) TYPE sxco_package
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_entity_name
+      IMPORTING VALUE(iv_entity_name) TYPE sxco_ddef_alias_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_ext_element_Suffix
+      IMPORTING VALUE(iv_ext_element_Suffix) TYPE string OPTIONAL
+      RAISING   zdmo_cx_rap_Generator.
+
+    METHODS get_implementation_type
+      RETURNING VALUE(rv_implementation_type) TYPE string.
+
+    METHODS get_root_exception
+      IMPORTING
+        !ix_exception  TYPE REF TO cx_root
+      RETURNING
+        VALUE(rx_root) TYPE REF TO cx_root .
+
+    METHODS get_root_cause_textid
+      IMPORTING
+                ix_previous                 TYPE REF TO cx_root
+      RETURNING VALUE(rs_root_cause_textid) TYPE root_cause_textid.
+
+    METHODS set_implementation_type
+      IMPORTING
+                VALUE(iv_implementation_type) TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+
+
+    METHODS add_child
+      RETURNING VALUE(ro_child_node)
+                  TYPE REF TO zdmo_cl_rap_node
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS add_virtual_root_node
+      RETURNING VALUE(ro_virtual_root_node)
+                  TYPE REF TO zdmo_cl_rap_node
+      RAISING   ZDMO_cx_rap_generator.
+
+
+
+    METHODS check_parameter
+      IMPORTING
+                iv_parameter_name TYPE string
+                iv_value          TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS check_table_package_assignment
+      RAISING ZDMO_cx_rap_generator.
+
+    METHODS finalize
+      RAISING ZDMO_cx_rap_generator.
+
+    METHODS validate_bo
+      RAISING ZDMO_cx_rap_generator.
+
+    METHODS get_fields
+      RAISING ZDMO_cx_rap_generator.
+
+    METHODS set_fields
+      IMPORTING it_fields TYPE tt_fields
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS get_fields_persistent_table
+      RAISING ZDMO_cx_rap_generator.
+
+    METHODS set_namespace
+      IMPORTING
+                iv_namespace TYPE sxco_ar_object_name OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_prefix
+      IMPORTING
+                iv_prefix TYPE    sxco_ar_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_suffix
+      IMPORTING
+                iv_suffix TYPE    sxco_ar_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_parent
+      IMPORTING
+                io_parent_node TYPE REF TO zdmo_cl_rap_node
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_root
+      IMPORTING
+                io_root_node TYPE REF TO zdmo_cl_rap_node
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS is_root RETURNING VALUE(rv_is_root) TYPE abap_bool.
+
+    METHODS is_extensible RETURNING VALUE(rv_is_extensible) TYPE abap_bool.
+
+    METHODS is_virtual_root RETURNING VALUE(rv_is_virtual_root) TYPE abap_bool.
+
+    METHODS is_child RETURNING VALUE(rv_is_child) TYPE abap_bool.
+
+    METHODS is_uuid_based RETURNING VALUE(r_is_uuid_based) TYPE abap_bool.
+
+    METHODS is_grand_child_or_deeper RETURNING VALUE(rv_is_grand_child) TYPE abap_bool.
+
+    METHODS set_table
+      IMPORTING
+                iv_table TYPE sxco_ar_object_name OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_cds_view
+      IMPORTING
+                iv_cds_view TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_structure
+      IMPORTING
+                iv_structure TYPE sxco_ad_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_abap_type
+      IMPORTING iv_abap_type TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS split_and_check_abap_type_name
+      IMPORTING iv_abap_type_name TYPE string
+      EXPORTING ev_class_name     TYPE sxco_ao_object_name
+                ev_type_name      TYPE sxco_ao_component_name .
+
+    METHODS table_is_locked_by_transport
+      IMPORTING iv_table_name       TYPE sxco_dbt_object_name
+      RETURNING VALUE(rv_transport) TYPE sxco_transport.
+
+    METHODS set_data_source
+      IMPORTING
+                iv_data_source TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_binding_type
+      IMPORTING
+                iv_binding_type TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_transport_request
+      IMPORTING
+                iv_transport_request TYPE sxco_transport OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_persistent_table
+      IMPORTING
+                iv_persistent_table TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_draft_table
+      IMPORTING
+                iv_draft_table TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_data_source_type
+      IMPORTING
+                iv_data_source_type TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS has_childs
+      RETURNING VALUE(rv_has_childs) TYPE abap_bool.
+
+    METHODS set_semantic_key_fields
+      IMPORTING it_semantic_key TYPE tt_semantic_key_fields
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_cds_i_view
+      IMPORTING iv_name                   TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_cds_i_view_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_cds_r_view
+      IMPORTING iv_name                   TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_cds_r_view_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_cds_i_view_basic
+      IMPORTING iv_name                         TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_cds_i_view_name_basic) TYPE sxco_cds_object_name
+      RAISING   zdmo_cx_rap_generator.
+
+    METHODS set_name_custom_entity
+      IMPORTING iv_name                      TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_custom_entity_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_cds_p_view
+      IMPORTING iv_name                   TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_cds_p_view_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_mde
+      IMPORTING iv_name            TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_mde_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+
+    METHODS set_name_behavior_impl
+      IMPORTING iv_name                     TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_behavior_imp_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_custom_query_impl
+      IMPORTING iv_name                           TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_custom_query_impl_class) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_behavior_def_r
+      IMPORTING iv_name                       TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_behavior_dev_i_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_behavior_def_i
+      IMPORTING iv_name                       TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_behavior_dev_i_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_behavior_def_p
+      IMPORTING iv_name                       TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_behavior_dev_p_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_service_definition
+      IMPORTING iv_name                           TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_service_definition_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_service_binding
+      IMPORTING iv_name                        TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_service_binding_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_control_structure
+      IMPORTING iv_name                           TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_controle_structure_name) TYPE sxco_dbt_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_extension_include
+      IMPORTING iv_name                          TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_extension_include_name) TYPE sxco_dbt_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_extension_incl_view
+      IMPORTING iv_name                               TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_extension_include_view_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_draft_query_view
+      IMPORTING iv_name                         TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_draft_query_view_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_sap_object_type
+      IMPORTING iv_name                        TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_sap_object_type_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_name_sap_node_object_type
+      IMPORTING iv_name                             TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_sap_object_node_type_name) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS is_consistent
+      RETURNING VALUE(rv_is_consistent) TYPE abap_bool.
+
+    METHODS set_field_name_client
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_language
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_uuid
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_parent_uuid
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_root_uuid
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_created_by
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_created_at
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_last_changed_by
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_last_changed_at
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_loc_last_chg_at
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_loc_last_chg_by
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_etag_master
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS set_field_name_total_etag
+      IMPORTING iv_string TYPE string OPTIONAL
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS add_association
+      IMPORTING
+        iv_name             TYPE sxco_ddef_alias_name
+        iv_target           TYPE sxco_cds_object_name
+        it_condition_fields TYPE tt_condition_fields
+        iv_cardinality      TYPE string
+      RAISING
+        ZDMO_cx_rap_generator.
+
+
+    METHODS add_valuehelp
+      IMPORTING
+        "alias used in service definition
+        iv_alias              TYPE sxco_ddef_alias_name
+        "name of CDS view used as value help
+        iv_name               TYPE sxco_cds_object_name
+        iv_localelement       TYPE sxco_cds_field_name
+        iv_element            TYPE sxco_cds_field_name
+        it_additional_binding TYPE tt_addtionalbinding OPTIONAL
+        iv_useForValidation   TYPE abap_bool OPTIONAL
+      RAISING
+        ZDMO_cx_rap_generator.
+
+*    METHODS add_additional_fields_old
+*      IMPORTING
+*        iv_object            TYPE string
+*        it_additional_fields TYPE tt_additional_fields.
+
+    METHODS add_additional_fields
+      IMPORTING
+        it_additional_fields TYPE tt_additional_fields.
+
+    METHODS add_additonal_to_all_fields.
+
+    METHODS add_fields_to_all_fields.
+
+
+    METHODS add_valuehelp_for_curr_quan.
+
+    METHODS add_valuehelp_for_language.
+
+    METHODS set_create_table
+      IMPORTING iv_create_table TYPE abap_bool DEFAULT abap_true.
+
+    METHODS set_is_root_node
+      "  IMPORTING io_is_root_node TYPE abap_bool OPTIONAL.
+      IMPORTING io_is_root_node TYPE abap_bool DEFAULT abap_true.
+
+    METHODS set_is_virtual_root_node
+      IMPORTING io_is_root_node TYPE abap_bool OPTIONAL.
+
+    METHODS set_object_id
+      IMPORTING
+        iv_object_id TYPE sxco_ad_field_name OPTIONAL
+      RAISING
+        ZDMO_cx_rap_generator.
+
+    METHODS set_is_abstract_or_cust_entity
+      IMPORTING iv_value TYPE abap_bool DEFAULT abap_true.
+
+    METHODS set_is_extensible
+      IMPORTING iv_value TYPE abap_bool DEFAULT abap_true.
+
+    METHODS is_abstract_or_custom_entity
+      RETURNING VALUE(rv_is_abstract_or_cust_entity) TYPE abap_bool.
+
+  PROTECTED SECTION.
+
+  PRIVATE SECTION.
+
+    DATA is_abstract_or_cust_entity TYPE abap_bool.
+    DATA todos TYPE TABLE OF string WITH EMPTY KEY .
+    DATA is_test_run TYPE abap_bool.
+    DATA implementationtype  TYPE string.
+    DATA is_root_node        TYPE abap_bool.
+    DATA bo_is_extensible    TYPE abap_bool.
+
+    DATA is_virtual_root_node TYPE abap_bool.
+    DATA is_child_node       TYPE abap_bool.
+    DATA is_grand_child_node TYPE abap_bool.
+    DATA bo_node_is_consistent  TYPE abap_bool.
+    DATA keytype             TYPE string.
+
+    METHODS add_additional_fields_old
+      IMPORTING
+        iv_object            TYPE string
+        it_additional_fields TYPE tt_additional_fields_old.
+
+
+    METHODS add_to_all_childnodes
+      IMPORTING VALUE(io_child_node) TYPE REF TO zdmo_cl_rap_node.
+
+    METHODS add_child_node_hierarchy
+      IMPORTING
+                child_node TYPE REF TO zdmo_cl_rap_node
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS check_repository_object_name
+      IMPORTING
+                iv_type TYPE sxco_ar_object_type
+                iv_name TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS get_extensib_element_suffix
+      IMPORTING i_number                              TYPE i
+      RETURNING VALUE(r_extensibility_element_suffix) TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS get_unique_repository_obj_name
+      IMPORTING
+                i_repository_object_type             TYPE string
+      RETURNING VALUE(unique_repository_object_name) TYPE string
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS right_string
+      IMPORTING
+                iv_length        TYPE i
+                iv_string        TYPE string
+      RETURNING VALUE(rv_string) TYPE string.
+
+    METHODS set_number
+      IMPORTING
+                iv_number TYPE i
+      RAISING   cx_parameter_invalid.
+    METHODS set_repository_object_names.
+
+
+
+    METHODS admin_fields_exist
+      RETURNING VALUE(rv_admin_fields_exists) TYPE abap_bool.
+
+    METHODS field_name_exists_in_cds_view
+      IMPORTING
+                iv_field_name               TYPE string
+      RETURNING VALUE(rv_field_name_exists) TYPE abap_bool.
+
+
+    METHODS field_name_exists_in_db_table
+      IMPORTING
+                iv_field_name               TYPE string
+      RETURNING VALUE(rv_field_name_exists) TYPE abap_bool.
+
+    METHODS get_database_table_fields
+      IMPORTING
+        io_database_table TYPE REF TO if_xco_database_table
+      EXPORTING
+        et_fields         TYPE tt_fields_default_key  .
+
+    METHODS get_valid_draft_table_name
+      IMPORTING iv_name                    TYPE sxco_dbt_object_name OPTIONAL
+      RETURNING VALUE(rv_ddic_i_view_name) TYPE sxco_dbt_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS get_valid_table_name
+      IMPORTING iv_name                    TYPE sxco_dbt_object_name OPTIONAL
+                draft_table_suffix         TYPE c DEFAULT space
+      RETURNING VALUE(rv_ddic_i_view_name) TYPE sxco_dbt_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS get_field
+      IMPORTING
+                name            TYPE ts_field-name
+      RETURNING VALUE(rs_field) TYPE ts_field.
+
+    METHODS get_abap_type_components
+      IMPORTING
+                name             TYPE string
+      RETURNING VALUE(et_fields) TYPE tt_fields_default_key  .
+
+    METHODS get_structure_components
+      IMPORTING
+                io_components    TYPE REF TO if_xco_ad_structure
+      RETURNING VALUE(et_fields)
+                  TYPE tt_fields_default_key  .
+
+    METHODS get_fields_cds_view
+      IMPORTING
+                io_cds_view_name TYPE sxco_cds_object_name
+      RETURNING VALUE(et_fields)
+                  TYPE tt_fields_default_key  .
+
+    METHODS      read_data_element
+      IMPORTING
+        io_data_element TYPE REF TO if_xco_ad_data_element
+        is_fields       TYPE ts_field
+      EXPORTING
+        es_fields       TYPE ts_field .
+
+    METHODS      read_domain
+      IMPORTING
+        io_domain TYPE REF TO if_xco_domain
+        is_fields TYPE ts_field
+      EXPORTING
+        es_fields TYPE ts_field.
+
+    METHODS is_alpha_numeric
+      IMPORTING iv_string                  TYPE string
+      RETURNING VALUE(rv_is_alpha_numeric) TYPE abap_bool.
+
+    METHODS is_alphabetical_character_only
+      IMPORTING iv_string                           TYPE string
+      RETURNING VALUE(rv_is_alphabetical_char_only) TYPE abap_bool.
+
+    METHODS contains_no_blanks
+      IMPORTING iv_string                    TYPE string
+      RETURNING VALUE(rv_contains_no_blanks) TYPE abap_bool.
+
+    METHODS underscore_at_pos_2_3
+      IMPORTING iv_string                          TYPE string
+      RETURNING VALUE(rv_no_underscore_at_pos_2_3) TYPE abap_bool.
+
+    METHODS get_valid_mbc_identifier
+      IMPORTING iv_name                  TYPE sxco_cds_object_name OPTIONAL
+      RETURNING VALUE(rv_mbc_identifier) TYPE sxco_cds_object_name
+      RAISING   ZDMO_cx_rap_generator.
+
+    METHODS Check_repository_object_exists
+      IMPORTING
+        iv_type                         TYPE string
+        iv_name                         TYPE string
+      RETURNING
+        VALUE(rv_object_already_exists) TYPE abap_bool.
+
+    METHODS repo_object_name_is_used_in_bo
+      IMPORTING
+        iv_type                               TYPE string
+        iv_name                               TYPE string
+      RETURNING
+        VALUE(rv_repo_obj_name_is_used_in_bo) TYPE abap_bool.
+
+    METHODS repo_obj_name_used_in_rap_gen
+      IMPORTING
+        iv_type                              TYPE string
+        iv_name                              TYPE string
+      RETURNING
+        VALUE(rv_repo_obj_name_used_rap_gen) TYPE abap_bool.
+
+    METHODS GET_ABAP_DDIC_FROM_Int_TYPE
+      IMPORTING
+        iv_ABAP_DDIC_TYPE     TYPE  abap_typekind
+        iv_length             TYPE i
+        iv_decimals           TYPE i
+      EXPORTING
+        rv_Internal_ABAP_type TYPE cl_xco_ad_built_in_type=>tv_type
+        rv_length             TYPE cl_xco_ad_built_in_type=>tv_length
+        rv_decimals           TYPE cl_xco_ad_built_in_type=>tv_decimals   .
+
+    METHODS build_repository_object_name
+      IMPORTING
+        i_repository_object_type        TYPE string
+        i_entityname_abbreviated        TYPE string
+*        i_binding                       TYPE string
+        i_unique_hex_number             TYPE xstring
+      RETURNING
+        VALUE(r_repository_object_name) TYPE string.
+
+
+*  unique_repository_object_name = |{ namespace }{ node_object_prefix-behavior_definition_r }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|.
+
+ENDCLASS.
+
+
+
+CLASS zdmo_cl_rap_node IMPLEMENTATION.
+
+
+  METHOD add_additional_fields.
+    LOOP AT it_additional_fields INTO DATA(additonal_field).
+      APPEND  additonal_field  TO lt_additional_fields.
+    ENDLOOP.
+*    "lt_all_fields = lt_fields.
+*    DATA all_fields_line LIKE LINE OF lt_all_fields.
+*    LOOP AT lt_additional_fields INTO DATA(additional_field).
+*      MOVE-CORRESPONDING additional_field TO all_fields_line.
+*      APPEND all_fields_line TO lt_all_fields.
+*    ENDLOOP.
+  ENDMETHOD.
+
+
+  METHOD add_additional_fields_old.
+
+
+    DATA lv_object TYPE string.
+    DATA ls_additional_fields TYPE ts_additional_fields_old.
+    DATA ls_object_with_add_fields  TYPE ts_objects_with_add_fields.
+
+    CASE to_lower( iv_object ).
+
+      WHEN additional_fields_object_types-cds_interface_view. "'CDS_INTERFACE_VIEW'.
+      WHEN additional_fields_object_types-cds_projection_view.
+      WHEN additional_fields_object_types-draft_table.
+      WHEN OTHERS.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>cannot_add_additional_fields
+            mv_value = iv_object.
+    ENDCASE.
+
+    ls_object_with_add_fields-object = iv_object.
+    ls_object_with_add_fields-additional_fields = it_additional_fields.
+
+    APPEND ls_object_with_add_fields TO lt_objects_with_add_fields.
+
+  ENDMETHOD.
+
+
+  METHOD add_additonal_to_all_fields.
+    DATA all_fields_line LIKE LINE OF lt_all_fields.
+    LOOP AT lt_additional_fields INTO DATA(additional_field).
+      MOVE-CORRESPONDING additional_field TO all_fields_line.
+      APPEND all_fields_line TO lt_all_fields.
+    ENDLOOP.
+  ENDMETHOD.
+
+
+  METHOD add_association.
+    DATA lv_target TYPE string.
+    DATA ls_assocation TYPE ts_assocation.
+
+    check_parameter(
+      EXPORTING
+        iv_parameter_name = 'Association'         ##NO_TEXT
+        iv_value          = CONV #( iv_name )
+    ).
+
+    lv_target = to_upper( iv_target ).
+
+    DATA(underscore) = substring( val = iv_name  len = 1 ).
+
+    IF underscore <> '_'.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>starts_not_with_underscore
+          mv_value = CONV #( iv_name ).
+    ENDIF.
+
+
+    IF  iv_cardinality = cardinality-one OR iv_cardinality = cardinality-one_to_n OR
+             iv_cardinality = cardinality-zero_to_n OR iv_cardinality = cardinality-zero_to_one
+             OR iv_cardinality = cardinality-one_to_one.
+      ls_assocation-cardinality = iv_cardinality.
+    ELSE.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>assocation_is_not_supported
+          mv_value = iv_cardinality.
+    ENDIF.
+
+    FIELD-SYMBOLS: <fields> TYPE ts_field.
+
+    "we only support the simple case where the condition contains only one field
+    " IF lines( it_condition_fields ) = 1.
+    LOOP AT lt_fields  ASSIGNING <fields> WHERE cds_view_field = it_condition_fields[ 1 ]-projection_field.
+      <fields>-has_association = abap_true.
+    ENDLOOP.
+
+    "Make sure that the association is also using UpperCamelCase
+    "IF useuppercamelcase = abap_true.
+    "  ls_assocation-name = xco_cp=>string( iv_name )->split( '_' )->compose( xco_cp_string=>composition->pascal_case )->value.
+    "ELSE.
+    ls_assocation-name = iv_name.
+    "ENDIF.
+    ls_assocation-target = iv_target.
+    ls_assocation-condition_components = it_condition_fields.
+
+    APPEND  ls_assocation TO lt_association.
+
+    " ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD add_child.
+
+    DATA lt_all_childnodes  TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node .
+
+    DATA   ls_childnode  TYPE REF TO zdmo_cl_rap_node  .
+
+    ro_child_node = NEW zdmo_cl_rap_node( ).
+
+
+    "get settings from parent node
+    ro_child_node->set_parent( me ).
+    ro_child_node->set_root( me->root_node ).
+    ro_child_node->set_namespace( CONV #( me->namespace ) ).
+    ro_child_node->set_prefix( CONV #( me->prefix ) ).
+    ro_child_node->set_suffix( CONV #( me->suffix ) ).
+    ro_child_node->set_implementation_type( me->get_implementation_type(  ) ).
+    ro_child_node->set_data_source_type( me->data_source_type ).
+    ro_child_node->set_xco_lib( me->xco_lib ).
+    ro_child_node->set_draft_enabled( draft_enabled ).
+    ro_child_node->set_is_customizing_table( me->is_customizing_table ).
+    ro_child_node->set_has_transactional_behavior( transactional_behavior ).
+    ro_child_node->set_create_table( create_table ).
+    ro_child_node->set_mimic_adt_wizard( mimic_adt_wizard ).
+    ro_child_node->set_number( lines( me->root_node->all_childnodes ) + 1 ).
+    ro_child_node->set_add_basic_i_views( me->add_basic_i_views ).
+    ro_child_node->set_is_extensible( me->is_extensible( ) ).
+    ro_child_node->set_add_sap_object_type( me->add_sap_object_type ).
+
+
+    "extensibility_element_suffix is set for each entity separately
+    "unique value based on the node_number
+*    IF me->is_extensible(  ) = abap_true and me->extensibility_element_suffix is initial.
+*      DATA(extensibility_suffix_child) = get_extensib_element_suffix( ro_child_node->node_number ).
+*      ro_child_node->set_ext_element_suffix( extensibility_suffix_child ).
+*    ENDIF.
+    APPEND ro_child_node TO childnodes.
+
+    lt_all_childnodes = me->root_node->all_childnodes.
+    me->root_node->add_to_all_childnodes( ro_child_node ).
+
+  ENDMETHOD.
+
+
+  METHOD add_child_node_hierarchy.
+    "todo
+    "delete root node flag from child_node
+    "set parent_node to me
+    "set root_node to me
+    "loop at all childnodes and set root node to me
+
+* loop at child_node->all_childnodes into data(all_childnode).
+*
+* ENDLOOP.
+
+    IF all_childnodes IS INITIAL.
+      "add the node itself and all of its child nodes to all_childnodes
+      APPEND child_node TO all_childnodes.
+      LOOP AT child_node->all_childnodes INTO DATA(grand_child).
+        APPEND grand_child TO all_childnodes.
+      ENDLOOP.
+
+    ENDIF.
+
+    IF childnodes IS INITIAL.
+      APPEND child_node TO childnodes.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD add_fields_to_all_fields.
+    CLEAR lt_all_fields.
+    INSERT LINES OF lt_fields INTO TABLE lt_all_fields.
+  ENDMETHOD.
+
+
+  METHOD add_multi_edit.
+    multi_edit = iv_value.
+  ENDMETHOD.
+
+
+  METHOD add_to_all_childnodes.
+    APPEND io_child_node TO all_childnodes.
+  ENDMETHOD.
+
+
+  METHOD add_to_manage_business_config.
+    manage_business_configuration = iv_value.
+  ENDMETHOD.
+
+
+  METHOD add_valuehelp.
+
+    DATA lv_target TYPE string.
+    DATA ls_valuehelp TYPE ts_valuehelp.
+    FIELD-SYMBOLS: <fields> TYPE ts_field.
+
+    lv_target = to_upper( iv_name ).
+
+    ls_valuehelp-alias = iv_alias.
+    ls_valuehelp-element = iv_element.
+    ls_valuehelp-localelement = iv_localelement.
+    ls_valuehelp-name = iv_name.
+
+    IF iv_useforvalidation IS NOT INITIAL.
+      ls_valuehelp-useforvalidation = iv_useforvalidation.
+    ENDIF.
+
+    IF it_additional_binding IS NOT INITIAL.
+
+      LOOP AT it_additional_binding INTO DATA(ls_additional_binding).
+
+        CASE ls_additional_binding-usage .
+          WHEN additionalbinding_usage-filter .
+          WHEN additionalbinding_usage-filter_and_result.
+          WHEN additionalbinding_usage-result .
+          WHEN '' .
+          WHEN OTHERS.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>usage_is_not_supported
+                mv_value = ls_additional_binding-usage.
+        ENDCASE.
+
+      ENDLOOP.
+
+    ENDIF.
+
+
+    ls_valuehelp-additionalbinding = it_additional_binding.
+
+    APPEND ls_valuehelp TO lt_valuehelp.
+
+    LOOP AT lt_fields  ASSIGNING <fields> WHERE cds_view_field = iv_localelement.
+      <fields>-has_valuehelp = abap_true.
+    ENDLOOP.
+
+
+  ENDMETHOD.
+
+
+  METHOD add_valuehelp_for_curr_quan.
+    "add valuehelp for currency fields and quantity fields
+    LOOP AT lt_fields INTO DATA(field).
+      IF field-currencycode IS NOT INITIAL.
+
+        LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field_curr>) WHERE name = field-currencycode.
+          <field_curr>-is_currencycode = abap_true.
+*          <field_curr>-is_hidden = abap_true.
+        ENDLOOP.
+
+        "add_valuehelp  will set the flag has_valuehelp to abap_true
+        IF lt_fields[ name = field-currencycode ]-has_valuehelp = abap_false.
+          add_valuehelp(
+            EXPORTING
+              iv_alias              = 'Currency'
+              iv_name               = 'I_Currency'
+              iv_localelement       = lt_fields[ name = field-currencycode ]-cds_view_field
+              iv_element            = 'Currency'
+              iv_useforvalidation   = abap_true
+          ).
+        ENDIF.
+      ENDIF.
+      IF field-unitofmeasure IS NOT INITIAL.
+
+        LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field_quan>) WHERE name = field-unitofmeasure.
+          <field_quan>-is_unitofmeasure = abap_true.
+*          <field_quan>-is_hidden = abap_true.
+        ENDLOOP.
+
+        "add_valuehelp  will set the flag has_valuehelp to abap_true
+        IF lt_fields[ name = field-unitofmeasure ]-has_valuehelp = abap_false.
+          add_valuehelp(
+            EXPORTING
+              iv_alias              = 'UnitOfMeasure'
+              iv_name               = 'I_UnitOfMeasure'
+              iv_localelement       = lt_fields[ name = field-unitofmeasure ]-cds_view_field
+              iv_element            = 'UnitOfMeasure'
+              iv_useforvalidation   = abap_true
+          ).
+        ENDIF.
+      ENDIF.
+
+    ENDLOOP.
+  ENDMETHOD.
+
+
+  METHOD add_valuehelp_for_language.
+    "add valuehelp for currency fields and quantity fields
+
+    CHECK field_name-language IS NOT INITIAL.
+
+    LOOP AT lt_fields INTO DATA(field).
+      IF field_name-language = to_upper( field-name ) AND field-has_valuehelp = abap_false.
+        add_valuehelp(
+              EXPORTING
+                iv_alias              = 'Language'
+                iv_name               = 'I_Language'
+                iv_localelement       = field-cds_view_field
+                iv_element            = 'Language'
+                iv_useforvalidation   = abap_true
+            ).
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+
+
+  METHOD add_virtual_root_node.
+
+    ro_virtual_root_node = NEW zdmo_cl_rap_node( ).
+
+    ro_virtual_root_node->set_namespace( CONV #( me->namespace ) ).
+    ro_virtual_root_node->set_prefix( CONV #( me->prefix ) ).
+    ro_virtual_root_node->set_suffix( CONV #( me->suffix ) ).
+    ro_virtual_root_node->set_implementation_type( me->get_implementation_type(  ) ).
+    ro_virtual_root_node->set_data_source_type( data_source_types-cds_view ).
+    ro_virtual_root_node->set_xco_lib( me->xco_lib ).
+    ro_virtual_root_node->set_binding_type( me->binding_type ).
+
+    ro_virtual_root_node->set_draft_enabled( me->draft_enabled ).
+    ro_virtual_root_node->set_entity_name( |{ me->entityname }{ singleton_suffix }| ).
+
+    ro_virtual_root_node->set_transport_request( CONV #( me->transport_request ) ).
+    ro_virtual_root_node->set_package( me->package ).
+    ro_virtual_root_node->set_is_customizing_table( me->is_customizing_table ).
+    ro_virtual_root_node->add_to_manage_business_config( me->manage_business_configuration ).
+
+    "ro_virtual_root_node->set_is_virtual_root_node( ).
+
+    ro_virtual_root_node->add_child_node_hierarchy( me ).
+    ro_virtual_root_node->set_is_virtual_root_node( ).
+    me->set_is_root_node( abap_false ).
+    me->set_parent( ro_virtual_root_node ).
+    me->set_root( ro_virtual_root_node ).
+
+    me->add_additional_fields(
+                                 VALUE #(
+                                       (
+                                         name = '1'
+                                         cds_view_field = 'SingletonID'
+                                         built_in_type = 'INT1'
+                                         cds_interface_view = abap_true
+                                         cds_restricted_reuse_view = abap_true
+                                         cds_projection_view = abap_true
+                                         draft_table = abap_true
+                                         )
+                                       )
+                                      ).
+
+    LOOP AT me->all_childnodes INTO DATA(childnode).
+      childnode->set_root( ro_virtual_root_node ).
+      childnode->add_additional_fields(
+                            VALUE #(
+                                  (
+                                    name = '1'
+                                    cds_view_field = 'SingletonID'
+                                    built_in_type = 'INT1'
+                                    cds_interface_view = abap_true
+                                    cds_restricted_reuse_view = abap_true
+                                    cds_projection_view = abap_true
+                                    draft_table = abap_true
+                                    )
+                                  )
+                                 ).
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD admin_fields_exist.
+
+    rv_admin_fields_exists = abap_true.
+
+    IF draft_enabled = abap_true.
+      "local_instance_last_changed_at
+      "last_changed_at
+    ELSE.
+      "last_changed_at
+    ENDIF.
+
+
+
+  ENDMETHOD.
+
+
+  METHOD build_repository_object_name.
+
+    DATA(entityname_abbreviated) = i_entityname_abbreviated.
+
+    DATA protocol_version TYPE string.
+    DATA binding TYPE string.
+
+    DATA object_specific_prefix TYPE string.
+    DATA object_specific_suffix TYPE string.
+
+    DATA unique_hex_number TYPE c LENGTH 2.
+
+    IF i_unique_hex_number = 00.
+      unique_hex_number = ''.
+    ELSE.
+      unique_hex_number = i_unique_hex_number.
+    ENDIF.
+
+    CASE binding_type.
+      WHEN binding_type_name-odata_v2_ui.
+        protocol_version = protocol_version_suffix-odata_v2.
+        binding = binding_type_prefix-ui .
+      WHEN binding_type_name-odata_v4_ui.
+        protocol_version = protocol_version_suffix-odata_v4.
+        binding = binding_type_prefix-ui.
+      WHEN binding_type_name-odata_v2_web_api.
+        protocol_version = protocol_version_suffix-odata_v2.
+        binding = binding_type_prefix-web_api.
+      WHEN binding_type_name-odata_v4_web_api.
+        protocol_version = protocol_version_suffix-odata_v4.
+        binding = binding_type_prefix-web_api.
+    ENDCASE.
+
+    DATA(prefix_wo_underscore) = prefix.
+    REPLACE '_' IN prefix_wo_underscore WITH ''.
+
+    "prepare for the support of read-only services. Add 'TP' to object names
+
+    IF transactional_behavior = abap_true.
+      DATA(suffix_transctional_processing) = node_object_suffix-transactional_processing.
+    ELSE.
+      suffix_transctional_processing = ''.
+    ENDIF.
+
+    CASE i_repository_object_type.
+
+        "root node repository objects
+      WHEN root_node_repository_objects-behavior_definition_r.  "'BDEF'.
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-behavior_definition_r }|   && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|.
+      WHEN root_node_repository_objects-behavior_definition_i.  "'BDEF'.
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-behavior_definition_i }|   && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|.
+      WHEN root_node_repository_objects-behavior_definition_p.  "'BDEF'.
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-behavior_definition_p }|   && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|.
+      WHEN root_node_repository_objects-service_binding.        "'SRVB'.
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ binding }|                                    && |{ entityname_abbreviated }{ unique_hex_number }{ protocol_version }{ suffix }|.
+      WHEN   root_node_repository_objects-service_definition.   "'SRVD' .
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ binding }|                                    && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|.
+      WHEN   root_node_repository_objects-sap_object_type.   "'RONT' .
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ root_node->entityname }|                                                    && |{ unique_hex_number }{ suffix }|.
+
+
+        "node repository objects
+      WHEN  node_repository_objects-cds_view_i.                  "'DDLS' .
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-cds_view_i }|              && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|.
+      WHEN  node_repository_objects-cds_view_i_basic.            "'DDLS' .
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-cds_view_i }|              && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|.
+      WHEN  node_repository_objects-cds_view_r.                  "'DDLS' .
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-cds_view_r }|              && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|.
+      WHEN  node_repository_objects-cds_view_p.                  "'DDLS' .
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-cds_view_p }|              && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|.
+      WHEN node_repository_objects-meta_data_extension.          "'DDLX'.
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-meta_data_extension }|     && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|.
+      WHEN node_repository_objects-behavior_implementation.      "'CLAS'.
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-behavior_implementation }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|.
+      WHEN  node_repository_objects-custom_entity.               "'DDLS' .
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-custom_entity }|           && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|.
+      WHEN node_repository_objects-custom_query_impl_class.      "'CLAS'.
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-custom_query_impl_class }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|.
+      WHEN node_repository_objects-control_structure.            "'STRU'.
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-control_structure }|       && |{ entityname_abbreviated }{ unique_hex_number }{ node_object_suffix-control_structure }{ suffix }|.
+      WHEN node_repository_objects-draft_table.                  "'TABL'.
+        r_repository_object_name =  |{ namespace }{ prefix_wo_underscore }|                                       && |{ entityname_abbreviated }{ unique_hex_number }{ node_object_suffix-draft_table }{ suffix }|.
+        "objects needed for extensions
+
+      WHEN  node_repository_objects-extension_include_view.            "'DDLS' .
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-extension_include_view }|              && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|.
+      WHEN  node_repository_objects-extension_include.            "Structure' .
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-extension_include }|                  && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|.
+      WHEN  node_repository_objects-draft_query_view.            "DDLS' .
+        r_repository_object_name =  |{ namespace }{ prefix }| && |{ node_object_prefix-draft_query_view }|                  && |{ entityname_abbreviated }{ unique_hex_number }{ node_object_suffix-draft_query_view }{ suffix }|.
+      WHEN  node_repository_objects-sap_object_node_type.            "NONT' .
+        "SAP Object Node Type Name = SAP Object Type Name for Root Node
+        IF me->is_root(  ).
+          r_repository_object_name =  |{ namespace }{ prefix }| && |{ root_node->entityname }|                                                       && |{ unique_hex_number }{ suffix }|.
+          "r_repository_object_name =  root_node->rap_root_node_objects-sap_object_type.
+        ELSE.
+*          r_repository_object_name =  |{ namespace }{ prefix }| && |{ root_node->entityname }|                                                            && |{ entityname_abbreviated  }{ unique_hex_number }{ suffix }|.
+          r_repository_object_name =  |{ namespace }{ prefix }| && |{ entityname }|                                                                  && |{ unique_hex_number }{ suffix }|.
+        ENDIF.
+    ENDCASE.
+
+  ENDMETHOD.
+
+
+  METHOD check_data_elements_of_fields.
+
+    "@todo:
+    "add package1 as an attribute to the class zdmo_cl_rap_node so that it does not have to be calculated
+    "every time
+    "the same as the language version of the package.
+
+*    DATA(package1) = xco_lib->get_package( package ).
+*    DATA(abap_language_version_number) = xco_lib->get_abap_language_version( package ).
+
+
+    LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<line>).
+
+      IF <line>-is_data_element EQ abap_true.
+
+        DATA(data_element) = xco_cp_abap_repository=>object->dtel->for( <line>-data_element ).
+
+        "fallback to builtin types
+        IF data_element->exists(  ) = abap_false.
+*          IF data_element->content( )->has_underlying_built_in_type( ).
+*            DATA(underlying_built_in_type) = data_element->content( )->get_underlying_built_in_type( ).
+*            <line>-built_in_type = underlying_built_in_type->type.
+*            <line>-built_in_type_length = underlying_built_in_type->length.
+*            <line>-built_in_type_decimals = underlying_built_in_type->decimals.
+          <line>-is_built_in_type = abap_true.
+          <line>-is_data_element = abap_false.
+*          ENDIF.
+        ENDIF.
+*          DATA api_state TYPE REF TO cl_xco_ars_api_state .
+*          TRY.
+*              data_element->get_api_state( RECEIVING ro_api_state = api_state ).
+*            CATCH cx_root INTO DATA(get_api_state_exc).
+*          ENDTRY.
+*          IF api_state IS INITIAL.
+**        IF  api_state->get_release_state( )->value <> 'RELEASED' AND
+**            abap_language_version_number = zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform.
+*
+**          IF data_element->content( )->has_underlying_built_in_type( ).
+*
+*            DATA(underlying_built_in_type) = data_element->content( )->get_underlying_built_in_type( ).
+*
+*            <line>-built_in_type = underlying_built_in_type->type.
+*            <line>-built_in_type_length = underlying_built_in_type->length.
+*            <line>-built_in_type_decimals = underlying_built_in_type->decimals.
+*            <line>-is_built_in_type = abap_true.
+*            <line>-is_data_element = abap_false.
+*
+**          ENDIF.
+*
+*          ELSEIF  api_state->get_release_state( )->value <> 'RELEASED' AND
+*              abap_language_version_number = zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform.
+*
+**          IF data_element->content( )->has_underlying_built_in_type( ).
+*            underlying_built_in_type = data_element->content( )->get_underlying_built_in_type( ).
+*
+*            <line>-built_in_type = underlying_built_in_type->type.
+*            <line>-built_in_type_length = underlying_built_in_type->length.
+*            <line>-built_in_type_decimals = underlying_built_in_type->decimals.
+*            <line>-is_built_in_type = abap_true.
+*            <line>-is_data_element = abap_false.
+*
+**          ENDIF.
+*
+*          ENDIF.
+*
+*
+*
+*        ENDIF.
+
+      ENDIF.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD check_parameter.
+
+    "IF iv_value IS INITIAL.
+    "  RAISE EXCEPTION TYPE ZDMO_CX_RAP_GENERATOR
+    "    EXPORTING
+    "      textid            = ZDMO_CX_RAP_GENERATOR=>parameter_is_initial
+    "      mv_parameter_name = |Object:{ iv_parameter_name } |.
+    "ENDIF.
+
+    "@todo
+    "Simply return if iv_value is intial?
+
+    "search for spaces
+    IF contains_no_blanks( CONV #( iv_value ) ) = abap_false.
+      APPEND |Name of { iv_parameter_name } { iv_value } contains spaces| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>contains_spaces
+          mv_value = |Object:{ iv_parameter_name } Name:{ iv_value }|.
+    ENDIF.
+
+    "search for non alpha numeric characters
+    IF is_alpha_numeric( CONV #( iv_value ) ) = abap_false.
+      APPEND |Name of { iv_parameter_name } { iv_value } contains non alpha numeric characters| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>non_alpha_numeric_characters
+          mv_value = |Object:{ iv_parameter_name } Name:{ iv_value }|.
+    ENDIF.
+
+    "check length
+    DATA(lv_max_length) = 30.
+
+    IF strlen( iv_value ) > lv_max_length.
+      APPEND |Name of { iv_value } is too long ( { lv_max_length } chararcters max)| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid        = ZDMO_cx_rap_generator=>is_too_long
+          mv_value      = |{ iv_value } ({ strlen( iv_value ) })|
+          mv_max_length = lv_max_length.
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD Check_repository_object_exists.
+
+    rv_object_already_exists = abap_false.
+
+
+    TRY.
+        CASE iv_type.
+          WHEN 'BDEF' .
+            IF  xco_lib->get_behavior_definition( CONV #( iv_name ) )->exists( ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+          WHEN 'DDLS' .
+            IF  xco_lib->get_data_definition( CONV #( iv_name ) )->exists( ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+          WHEN 'DDLX' .
+            IF  xco_lib->get_metadata_extension( CONV #( iv_name ) )->exists( ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+          WHEN 'SRVD' .
+            IF  xco_lib->get_service_definition( CONV #( iv_name ) )->if_xco_ar_object~exists(  ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+          WHEN 'SRVB'.
+            IF  xco_lib->get_service_binding( CONV #( iv_name ) )->if_xco_ar_object~exists(  ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+          WHEN 'CLAS'.
+            IF  xco_lib->get_class( CONV #( iv_name ) )->exists( ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+          WHEN 'DEVC'.
+            IF  xco_lib->get_package( CONV #( iv_name ) )->exists( ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+          WHEN 'TABL'.
+            IF  xco_lib->get_database_table( CONV #( iv_name ) )->exists( ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+          WHEN 'STRU'.
+            IF  xco_lib->get_structure( CONV #( iv_name ) )->exists( ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+
+          WHEN 'RONT'.
+            "todo xco_lib
+            IF  xco_lib->get_sap_object_type( CONV #( iv_name ) )->exists( ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+          WHEN 'NONT'.
+            "todo xco_lib
+            IF  xco_lib->get_sap_object_node_type( CONV #( iv_name ) )->exists( ).
+              rv_object_already_exists = abap_true.
+            ENDIF.
+
+          WHEN 'SMBC'.
+*        IF  xco_lib->get_structure( CONV #( lv_name ) )->exists( ).
+*          lv_object_already_exists = abap_true.
+*        ENDIF.
+
+
+            DATA(first_letter_mbc_namespace) = substring( val = me->namespace  len = 1 ).
+
+            "The MBC registration API uses a namespace only if it is a "real" namespace.
+            "If a customer namespace 'Y' or 'Z' is used or if
+            "SAP objects are created such as I_Test that also do not have a namespace
+            "then the MBC namespace must be initial.
+
+            CASE first_letter_mbc_namespace.
+              WHEN '/' .
+                DATA(abap_object_mbc_name) = namespace && iv_name.
+              WHEN 'Y' OR 'Z'.
+                abap_object_mbc_name = namespace && iv_name.
+              WHEN OTHERS.
+                abap_object_mbc_name = iv_name.
+            ENDCASE.
+
+            SELECT * FROM i_custabapobjdirectoryentry WHERE
+            abapobject = @abap_object_mbc_name AND abapobjectcategory = 'R3TR' AND abapobjecttype = 'SMBC' INTO TABLE @DATA(lt_smbc).
+
+            IF lines( lt_smbc ) = 1.
+              rv_object_already_exists = abap_true.
+            ENDIF.
+
+          WHEN OTHERS.
+        ENDCASE.
+
+      CATCH cx_root INTO DATA(catch_xco_exc).
+
+        DATA(text) = catch_xco_exc->get_text(  ).
+        "in certain edge cases (clas could not be deleted completely)
+        "the xco libraries raise an error message
+        "CX_XCO_DEP_FM_CALL_EXCEPTION
+        "in case xco runs into an exception
+        "we assume that the object exists to be on the safe side
+        rv_object_already_exists = abap_true.
+    ENDTRY.
+
+  ENDMETHOD.
+
+
+  METHOD check_repository_object_name.
+
+    "parameters have to be set to upper case
+    "this will not be necessary in an upcoming release
+
+    DATA lv_max_length TYPE i.
+    DATA(lv_type) = to_upper( iv_type ).
+    DATA(lv_name) = to_upper( iv_name ).
+    DATA lv_object_already_exists TYPE abap_bool.
+
+    DATA(number_of_characters_namespace) = strlen( namespace ).
+    DATA(object_name_without_namespace) = substring( val = lv_name off = number_of_characters_namespace ).
+
+    "check if repository already exists
+
+    lv_object_already_exists = Check_repository_object_exists( iv_type = lv_type
+                                                               iv_name = lv_name ).
+
+    IF lv_object_already_exists = abap_true.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid     = ZDMO_cx_rap_generator=>repository_already_exists
+          mv_value   = lv_name
+          mv_value_2 = lv_type.
+    ENDIF.
+
+
+
+
+    CASE lv_type.
+      WHEN 'BDEF' OR 'DDLS' OR 'DDLX' OR 'SRVD' OR 'STRU'.
+        lv_max_length = 30.
+      WHEN 'SRVB'.
+        lv_max_length = 26.
+      WHEN 'CLAS'.
+        lv_max_length = 30.
+      WHEN 'DEVC'.
+        lv_max_length = 20.
+      WHEN 'TABL'.
+        lv_max_length = 16.
+      WHEN 'SMBC'.
+        lv_max_length = 20.
+      WHEN 'RONT' OR 'NONT'.
+        lv_max_length = 30.
+      WHEN OTHERS.
+    ENDCASE.
+
+    IF lv_type = 'STRU'.
+      lv_type = 'TABL(Structure)'.
+    ENDIF.
+
+    IF lv_type = 'TABL'.
+      lv_type = 'TABL(Database Table)'.
+    ENDIF.
+
+    "search for non alpha numeric characters
+    IF is_alpha_numeric( CONV #( object_name_without_namespace ) ) = abap_false.
+      APPEND |Name of { lv_type } { lv_name } contains non alpha numeric characters| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>non_alpha_numeric_characters
+          mv_value = | { lv_type }:{ lv_name }|.
+    ENDIF.
+
+    "search for spaces
+    IF contains_no_blanks( CONV #( lv_name ) ) = abap_false.
+      APPEND |Name of { lv_type } { lv_name } contains spaces| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>contains_spaces
+          mv_value = |Object Type: { lv_type } Object Name:{ lv_name }|.
+    ENDIF.
+
+    "check length
+    IF strlen( lv_name ) > lv_max_length.
+      APPEND |Name of { lv_type } is too long ( { lv_max_length } chararcters max)| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid        = ZDMO_cx_rap_generator=>is_too_long
+          mv_value      = |{ lv_name } ({ strlen( lv_name ) })|
+          mv_max_length = lv_max_length.
+    ENDIF.
+
+    "Check table and structures for "Underscore not permitted at 2nd or 3rd position"
+    IF ( lv_type = 'TABL(Database Table)' OR lv_type = 'TABL(Structure)' ) AND
+         underscore_at_pos_2_3( lv_name ) = abap_true.
+      APPEND |Name of { lv_name } - underscore not permitted at 2nd or 3rd position| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>underscore_not_at_pos_2_3
+          mv_value = lv_name.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD check_table_package_assignment.
+
+    "check if tables that shall be used
+    "and the package that has been provided
+    "reside in the same software component
+
+    " Get name of the software component of the package
+    "DATA(package_object) = xco_cp_abap_repository=>object->devc->for( package ).
+    DATA(package_object) = xco_lib->get_package( package ).
+
+    DATA(swc_name_package) = package_object->read( )-property-software_component->name.
+
+    "Compare with software components of tables
+    "check table of root node
+
+    "create object for table
+    "DATA(lo_database_table) = xco_cp_abap_dictionary=>database_table( root_node->table_name ).
+    DATA(lo_database_table) = xco_lib->get_database_table( root_node->table_name ).
+    " Get package.
+    DATA(package_of_db_table) = lo_database_table->if_xco_ar_object~get_package( )->read( ).
+    " Software component.
+    DATA(swc_name_db_table) = package_of_db_table-property-software_component->name.
+
+    IF swc_name_package <> swc_name_db_table.
+      IF NOT swc_name_db_table = 'ZDMO_SAP'  AND  swc_name_db_table = 'ZLOCAL'.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid          = ZDMO_cx_rap_generator=>software_comp_do_not_match
+            mv_table_name   = CONV #( root_node->table_name )
+            mv_package_name = CONV #( package ).
+      ENDIF.
+    ENDIF.
+
+    "check tables of child nodes
+
+    IF root_node->has_childs(  ).
+      LOOP AT root_node->all_childnodes INTO DATA(ls_childnode).
+
+        "lo_database_table = xco_cp_abap_dictionary=>database_table( ls_childnode->table_name ).
+        lo_database_table = xco_lib->get_database_table( ls_childnode->table_name ).
+
+        package_of_db_table = lo_database_table->if_xco_ar_object~get_package( )->read( ).
+        swc_name_db_table = package_of_db_table-property-software_component->name.
+        IF swc_name_package <> swc_name_db_table.
+          IF NOT swc_name_db_table = 'ZDMO_SAP'  AND  swc_name_db_table = 'ZLOCAL'.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid          = ZDMO_cx_rap_generator=>software_comp_do_not_match
+                mv_table_name   = CONV #( ls_childnode->table_name )
+                mv_package_name = CONV #( package ).
+          ENDIF.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+
+
+
+  ENDMETHOD.
+
+
+  METHOD constructor.
+
+    IF io_xco_lib IS NOT INITIAL.
+      xco_lib = io_xco_lib.
+    ELSE.
+      xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ).
+    ENDIF.
+
+    bo_node_is_consistent = abap_true.
+    is_finalized = abap_false.
+*    draft_enabled = abap_false.
+    useuppercamelcase = abap_true.
+    add_meta_data_extensions = abap_true.
+    skip_activation = abap_false.
+    add_sap_object_type = abap_true.
+
+*    field_name-client          = 'CLIENT'.
+*    field_name-uuid            = 'UUID'.
+*    field_name-parent_uuid     = 'PARENT_UUID'.
+*    field_name-root_uuid       = 'ROOT_UUID'.
+*    field_name-created_by      = 'CREATED_BY'.
+*    field_name-created_at      = 'CREATED_AT'.
+*    field_name-last_changed_by = 'LAST_CHANGED_BY'.
+*    field_name-last_changed_at = 'LAST_CHANGED_AT'.
+*    field_name-local_instance_last_changed_at = 'LOCAL_LAST_CHANGED_AT'.
+*    field_name-local_instance_last_changed_by = 'LOCAL_LAST_CHANGED_BY'.
+*    field_name-language        = 'SPRAS'.
+*    field_name-etag_master     = 'LOCAL_LAST_CHANGED_AT'.
+*    field_name-total_etag      = 'LAST_CHANGED_AT'.
+
+    builtintype_name-client = 'CLNT'.
+    builtintype_name-language = 'LANG'.
+
+    dataelement_name-client = 'MANDT'.
+    dataelement_name-language = 'SPRAS'.
+    dataelement_name-etag_master = 'ABP_LOCINST_LASTCHANGE_TSTMPL'.
+    dataelement_name-total_etag = 'ABP_LASTCHANGE_TSTMPL'.
+
+    dataelement_name-last_changed_by = 'ABP_LASTCHANGE_USER'.
+    dataelement_name-last_changed_at = 'ABP_LASTCHANGE_TSTMPL'.
+    dataelement_name-created_by = 'ABP_CREATION_USER'.
+    dataelement_name-created_at = 'ABP_CREATION_TSTMPL'.
+    dataelement_name-local_instance_last_changed_by = 'ABP_LOCINST_LASTCHANGE_USER'.
+    dataelement_name-local_instance_last_changed_at = 'ABP_LOCINST_LASTCHANGE_TSTMPL'.
+
+    publish_service = abap_true.
+    transactional_behavior = abap_true.
+*    binding_type = binding_type_name-odata_v4_ui.
+
+    "xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ).
+    "xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+
+    TEST-SEAM runs_as_cut.
+      is_test_run = abap_false.
+    END-TEST-SEAM.
+
+  ENDMETHOD.
+
+
+  METHOD contains_no_blanks.
+    rv_contains_no_blanks = abap_true.
+    FIND ALL OCCURRENCES OF REGEX  '[[:space:]]' IN iv_string RESULTS DATA(blanks).
+    IF blanks IS NOT INITIAL.
+      rv_contains_no_blanks = abap_false.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD field_name_exists_in_cds_view.
+    rv_field_name_exists = abap_false.
+    LOOP AT lt_fields INTO DATA(ls_field).
+      IF ls_field-cds_view_field = iv_field_name.
+        rv_field_name_exists = abap_true.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+
+
+  METHOD field_name_exists_in_db_table.
+    "safety measure if field name in JSON is not upper case
+    DATA(lv_field_name_upper) = to_upper( iv_field_name ).
+    "Check the field list contains a field with this name
+    rv_field_name_exists = boolc( line_exists( lt_fields[ name = lv_field_name_upper ] ) ).
+
+  ENDMETHOD.
+
+
+  METHOD finalize.
+    "namespace must be set for root node
+    "namespace for child objects will be set in method add_child( )
+
+    IF me->is_extensible(  ) = abap_true AND me->extensibility_element_suffix IS INITIAL.
+      DATA(extensibility_suffix_child) = get_extensib_element_suffix( me->node_number ).
+      me->set_ext_element_suffix( extensibility_suffix_child ).
+    ENDIF.
+
+    "extensible RAP BO's the generator enforces the use of SAPObjectTypes and SAPObjectNodeTypes
+    IF me->is_extensible(  ) = abap_true.
+      me->set_add_sap_object_type( abap_true ) .
+    ENDIF.
+
+    DATA manage_business_cfg_identifier TYPE if_mbc_cp_api_business_config=>ty_identifier.
+
+    IF namespace IS INITIAL.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid = ZDMO_cx_rap_generator=>no_namespace_set.
+    ENDIF.
+
+    IF create_table = abap_true AND table_name IS INITIAL.
+      table_name = get_valid_table_name(
+                           "iv_name            = space
+                           draft_table_suffix = space
+                         )
+                         .
+    ENDIF.
+
+    IF create_table = abap_true AND persistent_table_name IS INITIAL.
+      persistent_table_name = table_name.
+    ENDIF.
+    IF create_table = abap_true AND lt_fields_persistent_table IS INITIAL.
+      lt_fields_persistent_table = lt_fields.
+    ENDIF.
+
+    "check if table used as a data source is #extensible_any
+    IF bo_is_extensible = abap_true AND create_table = abap_false.
+
+      DATA has_extension_include TYPE abap_bool.
+      DATA(database_table) = xco_lib->get_database_table( iv_name = to_upper( table_name ) ).
+      DATA(database_table_content) = database_table->content( ).
+      DATA(enhancement_category) = database_table_content->get_enhancement_category( )->value.
+      IF enhancement_category NE zdmo_cl_rap_node=>enhancement_category-can_be_enhanced_deep.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid        = ZDMO_cx_rap_generator=>table_not_extensible
+            mv_table_name = CONV #( table_name )
+            mv_value      = CONV #( 'EXTENSIBLE_ANY' ).
+      ENDIF.
+
+    ENDIF.
+
+
+
+    CASE data_source_type.
+      WHEN data_source_types-table.
+        IF table_name IS INITIAL.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>no_data_source_set
+              mv_entity = entityname.
+        ENDIF.
+      WHEN data_source_types-cds_view OR data_source_types-abstract_entity.
+        IF cds_view_name IS INITIAL.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>no_data_source_set
+              mv_entity = entityname.
+        ENDIF.
+    ENDCASE.
+    IF implementationtype = implementation_type-unmanaged_semantic OR
+         implementationtype = implementation_type-managed_semantic.
+      IF semantic_key IS INITIAL .
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid = ZDMO_cx_rap_generator=>no_semantic_key_set.
+      ENDIF.
+    ENDIF.
+
+    IF object_id IS INITIAL.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>no_object_id_set
+          mv_entity = entityname.
+    ENDIF.
+
+    IF lt_fields IS INITIAL.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>no_fields_found
+          mv_entity = entityname.
+    ENDIF.
+
+    "set root_uuid
+*    IF is_grand_child_or_deeper(  ).
+*      set_field_name_root_uuid( root_node->field_name-uuid ).
+*    ENDIF.
+
+    add_valuehelp_for_curr_quan(  ).
+    "add additional checks from methods add_valuehelp( ), set_semantic_key_fields( ) and ADD ASSOCIATION( )
+
+    add_valuehelp_for_language(  ).
+
+    LOOP AT lt_valuehelp INTO DATA(value_help).
+      LOOP AT lt_fields  ASSIGNING FIELD-SYMBOL(<field_wo_value_help>) WHERE cds_view_field = value_help-localelement.
+        <field_wo_value_help>-has_valuehelp = abap_true.
+      ENDLOOP.
+    ENDLOOP.
+
+    "hide administrative fields
+    "hide guid based fields
+    LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field_hidden>).
+      CASE to_upper( <field_hidden>-name ).
+        WHEN field_name-uuid.
+          <field_hidden>-is_hidden = abap_true.
+        WHEN field_name-last_changed_at.
+          <field_hidden>-is_hidden = abap_true.
+        WHEN field_name-last_changed_by .
+          <field_hidden>-is_hidden = abap_true.
+        WHEN field_name-created_at .
+          <field_hidden>-is_hidden = abap_true.
+        WHEN field_name-created_by .
+          <field_hidden>-is_hidden = abap_true.
+        WHEN field_name-parent_uuid .
+          <field_hidden>-is_hidden = abap_true.
+        WHEN field_name-root_uuid .
+          <field_hidden>-is_hidden = abap_true.
+        WHEN field_name-local_instance_last_changed_at.
+          <field_hidden>-is_hidden = abap_true.
+        WHEN field_name-local_instance_last_changed_by.
+          <field_hidden>-is_hidden = abap_true.
+      ENDCASE.
+    ENDLOOP.
+    "for custom entities the key has to be specified via the json file
+    IF data_source_type = data_source_types-structure.
+      LOOP AT semantic_key INTO DATA(ls_semantic_key).
+        LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field_without_key>) WHERE name = ls_semantic_key-name.
+          <field_without_key>-key_indicator = abap_true.
+        ENDLOOP.
+      ENDLOOP.
+      "to get key fields on top we have to sort by key_indicator descending
+      SORT lt_fields BY key_indicator DESCENDING name ASCENDING.
+    ENDIF.
+
+    "fill lt_all_fields only after lt_fields is finalized (e.g. is_hidden is added)
+    add_fields_to_all_fields(  ).
+    add_additonal_to_all_fields(  ).
+
+    "if get_fields( ) is called before set_field_name_client
+    "the client field is added to the mapping though it must not be part of it
+
+    DELETE lt_mapping WHERE dbtable_field = field_name-client.
+
+    validate_bo( ).
+
+    set_repository_object_names(  ).
+
+
+    IF lt_messages IS NOT INITIAL AND is_root(  ) = abap_false.
+      APPEND | Messages from { entityname } | TO me->root_node->lt_messages.
+      APPEND LINES OF lt_messages TO me->root_node->lt_messages.
+    ENDIF.
+
+    IF bo_node_is_consistent = abap_true.
+      is_finalized = abap_true.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD generate_bil.
+
+    "for the root node we need the method get_global_authorization
+    "since authorization master( global ) is set in BDEF
+    DATA(is_root) = is_root(  ).
+
+    "virtual root node needs several methods in BIL
+    DATA(is_virtual_root_node) = is_virtual_root(  ).
+
+    "all nodes that use managed_uuid need a determination for the field object_id
+    IF get_implementation_type(  )  = zdmo_cl_rap_node=>implementation_type-managed_uuid.
+      DATA(is_managed_uuid) = abap_true.
+    ENDIF.
+
+    "all nodes that use managed_managed need a determination for the field object_id
+    IF get_implementation_type(  )  = zdmo_cl_rap_node=>implementation_type-managed_semantic.
+      DATA(is_managed_semantic) = abap_true.
+    ENDIF.
+
+    "all nodes of an unmanged BO need methods such as create, read, read by association being implemented
+    IF get_implementation_type(  )  = zdmo_cl_rap_node=>implementation_type-unmanaged_semantic .
+      DATA(is_unmanaged_semantic) = abap_true.
+    ENDIF.
+
+*    IF is_managed_semantic = abap_true.
+*      result = abap_false.
+*      EXIT.
+*    ENDIF.
+
+    result = xsdbool(
+    (
+**********************************************************************
+** Begin of deletion 2108
+**********************************************************************
+                      is_root = abap_true OR
+**********************************************************************
+** End of deletion 2108
+**********************************************************************
+                      is_virtual_root_node = abap_true OR
+                      is_managed_uuid = abap_true OR
+                      is_customizing_table = abap_true OR
+                      is_unmanaged_semantic = abap_true
+                      OR
+                      is_managed_semantic = abap_true
+                      )
+                      "if transactional_behavior is ABAP_FALSE no
+                      "BIL must be created
+                      AND
+                      transactional_behavior = abap_true
+                      ).
+
+
+
+  ENDMETHOD.
+
+
+  METHOD generate_custom_entity.
+
+    IF data_source_type = data_source_types-abap_type OR
+       data_source_type = data_source_types-structure OR
+       is_abstract_or_custom_entity(  ) .
+
+      result = abap_true.
+
+    ELSE.
+
+      result = abap_false.
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD get_abap_ddic_from_int_type.
+
+
+*Fixed Value
+*
+*Description
+
+*'ACCP'  Posting Period YYYYMM
+*'CHAR'  Character String
+*'CLNT'  Client
+*'CUKY'  Currency key for currency fields
+*'CURR'  Currency Field in BCD Format
+*'D16D'  Decimal floating point number saved in BCD format
+*'D16N'  Floating point number (native HANA type SMALLDECIMAL)
+*'D16R'  Decimal floating point number saved as binary number
+*'D16S'  Decimal floating point number with scaling (obsolete)
+*'D34D'  Decimal floating point number saved in BCD format
+*'D34N'  Floating point number (native HANA type DECIMAL)
+*'D34R'  Decimal floating point number saved as binary number
+*'D34S'  Decimal floating point number with scaling (obsolete)
+*'DATN'  Date in format YYYYMMDD (native HANA type DATE)
+*'DATS'  Date in Format YYYYMMDD
+*'DEC'  Packed Number in BCD Format
+*'FLTP'  Floating Point Number
+*'GGM1'  Geometry (EWKB representation)
+*'INT1'  1-Byte Integer, 0 to 255
+*'INT2'  2-byte integer, -32768 to 32767
+*'INT4'  4-byte integer, -2147483648 to +2147483647
+*'INT8'  8-Byte Integer
+*'LANG'  Language key
+*'LCHR'  Long Character String
+*'LRAW'  Long Byte String
+*'NUMC'  Numerical Text
+*'PREC'  Obsolete Data Type
+*'QUAN'  Quantity Field in BCD Format
+*'RAW'  Byte Sequence
+*'RSTR'  Byte String (BLOB)
+*'SSTR'  Character String
+*'STRG'  Character String (CLOB)
+*'TIMN'  Time in format HHMMSS (native HANA type TIME)
+*'TIMS'  Time in Format HHMMSS
+*'UNIT'  Unit key of a quantity field
+*'UTCL'  Time stamp (native HANA type TIMESTAMP)
+*'VARC'  Obsolete Data Type
+
+
+    CASE   iv_abap_ddic_type  .
+      WHEN 'C'.
+        rv_internal_abap_type = 'CHAR'.
+        rv_length = iv_length.
+        rv_decimals = iv_decimals.
+      WHEN 'B'.
+        rv_internal_abap_type = 'INT1'.
+        rv_length = 3.
+        rv_decimals = 0.
+      WHEN 'S'.
+        rv_internal_abap_type = 'INT2'.
+        rv_length = 5.
+        rv_decimals = 0.
+      WHEN 'I'.
+        rv_internal_abap_type = 'INT4'.
+        rv_length = 10.
+        rv_decimals = 0.
+      WHEN 'INT8'.
+        rv_internal_abap_type = 'INT8'.
+        rv_length = 19.
+        rv_decimals = 0.
+      WHEN 'F'.
+        rv_internal_abap_type = 'fltp'.
+        rv_length = 16.
+        rv_decimals = 16.
+      WHEN 'D'.
+        rv_internal_abap_type = 'dats'.
+        rv_length = 8.
+        rv_decimals = 0.
+      WHEN 'T'.
+        rv_internal_abap_type = 'tims'.
+        rv_length = 6.
+        rv_decimals = 0.
+      WHEN OTHERS.
+        "todo : Raise an exception instead?
+        rv_internal_abap_type = 'CHAR'.
+        rv_length = iv_length.
+        rv_decimals = iv_decimals.
+    ENDCASE.
+
+
+
+  ENDMETHOD.
+
+
+  METHOD get_abap_type_components.
+
+    DATA abap_class TYPE REF TO if_xco_ao_class  .
+    DATA abap_type TYPE REF TO if_xco_ao_c_type .
+    DATA abap_class_name TYPE sxco_ao_object_name .
+    DATA abap_type_name TYPE sxco_ao_component_name.
+
+    split_and_check_abap_type_name(
+      EXPORTING
+        iv_abap_type_name = name
+      IMPORTING
+        ev_class_name     = abap_class_name
+        ev_type_name      = abap_type_name
+    ).  "( abap_type_name ).
+
+    "abap class and type have been checked in split_and_check_abap_type_name( )
+    abap_class = xco_cp_abap=>class( abap_class_name ).
+    abap_type = abap_class->definition->section-public->component->type( abap_type_name ).
+
+    DATA(typing_method) = abap_type->content( )->get_typing_method( ).
+    DATA(typing_definition) = abap_type->content( )->get_typing_definition( ).
+
+    IF typing_method->value = 1 AND typing_definition->has_value( ) = abap_true.
+      DATA(structure) = xco_lib->get_structure( CONV #( typing_definition->get_value( ) ) ).
+    ENDIF.
+    "io_components  type ref to if_xco_ad_structure
+    IF structure IS NOT INITIAL.
+      et_fields = get_structure_components( structure ).
+      "the name of the structure is needed for the statement
+      "mapping for <structure name> control <control structure> in BDEF
+      structure_name = structure->name.
+    ELSE.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid     = ZDMO_cx_rap_generator=>invalid_abap_type_name
+          mv_value   = | { abap_type_name } |
+          mv_entity  = entityname
+          mv_value_2 = | ABAP type not supported. |.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD get_database_table_fields.
+
+    DATA table_fields  TYPE ts_field  .
+
+    DATA(ls_database_table) = io_database_table->content( )->get( ).
+
+    LOOP AT io_database_table->fields->all->get( ) INTO DATA(lo_field).
+      CLEAR table_fields.
+      DATA(lo_field_content) =  lo_field->content( ).
+      DATA(lo_field_content_type) = lo_field_content->get_type(  ).
+      DATA(ls_field) = lo_field_content->get( ).
+
+      table_fields-name = lo_field->name.
+      IF useuppercamelcase = abap_true.
+        "table_fields-cds_view_field = to_mixed( table_fields-name ).
+        table_fields-cds_view_field = xco_cp=>string( table_fields-name )->split( '_' )->compose( xco_cp_string=>composition->pascal_case )->value.
+      ELSE.
+        table_fields-cds_view_field = table_fields-name.
+      ENDIF.
+
+      "add hardcoded mappings
+      CASE table_fields-name.
+        WHEN 'SPRAS'.
+          IF useuppercamelcase = abap_true.
+            table_fields-cds_view_field = 'Language'.
+          ENDIF.
+      ENDCASE.
+
+      table_fields-key_indicator = ls_field-key_indicator.
+      table_fields-not_null =  ls_field-not_null.
+      table_fields-is_data_element = lo_field_content_type->is_data_element( ).
+      table_fields-is_built_in_type = lo_field_content_type->is_built_in_type(  ).
+      IF table_fields-is_built_in_type = abap_true.
+        table_fields-built_in_type  = lo_field_content_type->get_built_in_type(  )->type.
+        table_fields-built_in_type_length = lo_field_content_type->get_built_in_type(  )->length.
+        table_fields-built_in_type_decimals = lo_field_content_type->get_built_in_type(  )->decimals.
+      ENDIF.
+      IF table_fields-name = 'QUANTITY'.
+        DATA(a) = 1.
+      ENDIF.
+      IF ls_field-type->is_data_element( ) EQ abap_true.
+        DATA(lo_data_element) = ls_field-type->get_data_element( ).
+
+*        data(data_element) = xco_lib->get_data_element( lo_data_element->name ).
+
+
+        IF lo_data_element->content( )->has_underlying_built_in_type( ).
+          DATA(underlying_built_in_type) = lo_data_element->content( )->get_underlying_built_in_type( ).
+
+*        IF xco_abap_dictionary=>data_element( lo_data_element->name )->content( )->has_underlying_built_in_type( ).
+*          DATA(underlying_built_in_type) = xco_abap_dictionary=>data_element( lo_data_element->name )->content( )->get_underlying_built_in_type( ).
+
+*        IF xco_cp_abap_dictionary=>data_element( lo_data_element->name )->content( )->has_underlying_built_in_type( ).
+*          DATA(underlying_built_in_type) = xco_cp_abap_dictionary=>data_element( lo_data_element->name )->content( )->get_underlying_built_in_type( ).
+
+          table_fields-built_in_type = underlying_built_in_type->type .
+          table_fields-built_in_type_decimals = underlying_built_in_type->decimals .
+          table_fields-built_in_type_length = underlying_built_in_type->length .
+        ENDIF.
+
+
+        IF lo_data_element->exists(  ) = abap_true.
+          table_fields-data_element = lo_data_element->name.
+*          DATA api_state TYPE REF TO cl_xco_ars_api_state .
+*          lo_data_element->get_api_state( RECEIVING ro_api_state = api_state ).
+*          "in on prem systems the xco library will find any data element
+*          "if package has language version abap_for_cloud_development we have to ensure
+*          "that the data element is released
+*          IF api_state->get_release_state( )->value = 'RELEASED' .
+*
+*            table_fields-data_element = lo_data_element->name.
+*
+*          ELSE.
+*
+*
+*          ENDIF.
+        ELSE.
+
+          "if xco cannot find the data element it is not released
+          "we have hence to fall back on built in types.
+
+          table_fields-is_data_element = abap_false.
+          table_fields-is_built_in_type = abap_true.
+
+        ENDIF.
+
+*        read_data_element(
+*          EXPORTING
+*            io_data_element = lo_data_element
+*            is_fields       = table_fields
+*          IMPORTING
+*            es_fields       = table_fields
+*        ).
+
+*      ELSE.
+*        IF ls_field-type->is_built_in_type(  ) = abap_true.
+*          table_fields-built_in_type  = ls_field-type->get_built_in_type(  )->type.
+*          table_fields-built_in_type_length = ls_field-type->get_built_in_type(  )->length.
+*          table_fields-built_in_type_decimals = ls_field-type->get_built_in_type(  )->decimals.
+*        ENDIF.
+      ENDIF.
+
+      DATA(currency_quantity) = ls_field-currency_quantity.
+
+      IF currency_quantity IS NOT INITIAL.
+        CASE table_fields-built_in_type.
+          WHEN 'CURR'.
+            table_fields-currencycode = ls_field-currency_quantity-reference_field.
+          WHEN 'QUAN'.
+            table_fields-unitofmeasure = ls_field-currency_quantity-reference_field.
+        ENDCASE.
+      ENDIF.
+
+      IF to_upper( right_string( iv_length = 2 iv_string = CONV #( table_fields-cds_view_field ) ) ) = 'ID'.
+        table_fields-cds_view_field = substring( val = table_fields-cds_view_field len = strlen( table_fields-cds_view_field ) - 2 ) && 'ID' .
+      ENDIF.
+
+      IF to_upper( right_string( iv_length = 4 iv_string = CONV #( table_fields-cds_view_field ) ) ) = 'UUID'.
+        table_fields-cds_view_field = substring( val = table_fields-cds_view_field len = strlen( table_fields-cds_view_field ) - 4 ) && 'UUID' .
+      ENDIF.
+
+      APPEND table_fields TO et_fields.
+
+    ENDLOOP.
+  ENDMETHOD.
+
+
+  METHOD get_extensib_element_suffix.
+
+    DATA alphabet TYPE string.
+    DATA test TYPE string.
+    DATA base TYPE i .
+    DATA number TYPE i.
+    DATA pos1 TYPE i.
+    DATA pos2 TYPE i.
+    DATA pos3 TYPE i.
+
+    alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
+    base = strlen( alphabet ).
+
+    pos1 = i_number DIV base.
+    pos2 = i_number - pos1 * base.
+
+
+    CASE namespace.
+
+      WHEN 'Z' OR 'Y'.
+
+        IF i_number < base * base.
+          DATA(character_1) = substring( val = alphabet off = pos1 len = 1 ).
+          DATA(character_2) = substring( val = alphabet off = pos2 len = 1 ).
+          r_extensibility_element_suffix = namespace && character_1 && character_2.
+        ELSE.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>too_many_nodes
+              mv_value  = | { i_number } |
+              mv_entity = | 'Z.' & Max { base } x { base } possible.|.
+        ENDIF.
+
+      WHEN OTHERS.
+
+        IF i_number < base * base * base.
+          character_1 = substring( val = alphabet off = pos1 len = 1 ).
+          character_2 = substring( val = alphabet off = pos2 len = 1 ).
+          "For SAP or partner objects more than 625 nodes can
+          "be used ;-)
+          r_extensibility_element_suffix = 'Z' && character_1 && character_2.
+        ELSE.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>too_many_nodes
+              mv_value  = | { i_number } |
+              mv_entity = | Max { base } x { base } x { base } possible.|.
+        ENDIF.
+
+    ENDCASE.
+*if namespace
+*r_extensibility_element_suffix =
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD get_field.
+    "search fields from data source
+    READ TABLE lt_fields INTO rs_field WITH KEY name = to_upper( name ).
+    IF sy-subrc = 0.
+      RETURN.
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD get_fields.
+
+
+
+    DATA lo_struct_desc           TYPE REF TO cl_abap_structdescr.
+    DATA lo_type_desc             TYPE REF TO cl_abap_typedescr.
+    DATA lt_components TYPE cl_abap_structdescr=>component_table .
+    DATA ls_components LIKE LINE OF lt_components.
+    DATA dref_table TYPE REF TO data.
+    DATA ls_fields TYPE ts_field.
+    DATA semantic_key_fields  TYPE tt_semantic_key_fields .
+
+
+    CASE data_source_type.
+
+      WHEN data_source_types-table.
+
+
+        TEST-SEAM get_mock_data_fields.
+          "importing io_read_state  type ref to cl_xco_ad_object_read_state default xco_abap_dictionary=>object_read_state->active_version
+
+          DATA(lo_database_table) = xco_lib->get_database_table( iv_name = table_name  ).
+
+          get_database_table_fields(
+               EXPORTING
+                 io_database_table = lo_database_table
+               IMPORTING
+                 et_fields         = lt_fields
+             ).
+
+
+        END-TEST-SEAM.
+
+*        set_mapping(  ).
+
+      WHEN data_source_types-structure.
+
+        DATA(lo_structure) = xco_lib->get_structure( iv_name = structure_name  ).
+
+        lt_fields = get_structure_components( lo_structure ).
+
+
+*        set_mapping(  ).
+
+      WHEN data_source_types-abap_type.
+
+        lt_fields = get_abap_type_components( abap_type_name ).
+
+*        set_mapping(  ).
+
+      WHEN data_source_types-cds_view OR data_source_types-abstract_entity.
+
+        lt_fields = get_fields_cds_view( CONV #( cds_view_name ) ). "  abap_type_components( abap_type_name ).
+
+
+
+      WHEN OTHERS.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>invalid_data_source_type
+            mv_value = data_source_type.
+
+
+    ENDCASE.
+
+    "determine automatically the name of the fields for the client key field and the language key field
+    "since there are different combinations possible that use either a dataelement or a built-in type
+    " e.g.
+    "key client : mandt;
+    "key client : abap.clnt
+    "key langu  : spras;
+    "key langu  : abap.lang;
+
+    set_field_name_client( ).
+    set_field_name_language( ).
+
+    "field name of client field must be known before semantic key fields are determined
+
+    IF data_source_type <> data_source_types-structure AND
+       data_source_type <> data_source_types-abap_type .
+
+
+
+      IF implementationtype = implementation_type-managed_semantic OR
+         implementationtype = implementation_type-unmanaged_semantic.
+
+        CLEAR semantic_key_fields.
+        CLEAR semantic_key.
+
+        LOOP AT lt_fields INTO ls_fields WHERE key_indicator = abap_true AND name <> field_name-client.
+          APPEND ls_fields-name TO semantic_key_fields.
+        ENDLOOP.
+
+        set_semantic_key_fields( semantic_key_fields ).
+
+      ENDIF.
+    ENDIF.
+
+    "data source field names have be set to upper-case
+    "this is required if cds views or abstract entities
+    "are used as a data source
+
+    LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<line>).
+      <line>-name = to_upper( <line>-name ).
+    ENDLOOP.
+
+    "fill lt_all_fields with the fields read from the data source.
+    "add additional fields to lt_all_fields if additional fields are added
+    "in add_additional_fields_2
+    " lt_all_fields = lt_fields.
+
+    set_mapping(  ).
+
+* throws errors
+    check_data_elements_of_fields(  ).
+
+  ENDMETHOD.
+
+
+  METHOD get_fields_cds_view.
+    TYPES:
+      BEGIN OF ts_semantics_amount,
+        currencycode TYPE string,
+      END OF ts_semantics_amount.
+    DATA semantic_amount TYPE ts_semantics_amount.
+
+    TYPES:
+      BEGIN OF ts_semantics_quantity,
+        unitofmeasure TYPE string,
+      END OF ts_semantics_quantity.
+    DATA semantic_quantity TYPE ts_semantics_quantity.
+
+    TYPES :
+      BEGIN OF ts_field_name,
+        field_name TYPE sxco_cds_field_name,
+      END OF ts_field_name.
+
+    DATA association_field_names TYPE STANDARD TABLE OF ts_field_name WITH EMPTY KEY.
+    DATA composition_field_names TYPE STANDARD TABLE OF ts_field_name WITH EMPTY KEY.
+
+
+
+    DATA ls_fields TYPE ts_field.
+    DATA lo_fields TYPE sxco_t_cds_fields  .
+    DATA lo_assoc TYPE sxco_t_cds_associations .
+    DATA lo_composition TYPE sxco_t_cds_compositions .
+
+    DATA(lo_data_definition) = xco_lib->get_data_definition( CONV #( io_cds_view_name ) ).
+    DATA(view_type) = lo_data_definition->get_type( ).
+
+    CLEAR lo_assoc.
+    CLEAR lo_composition.
+
+**lo_assoc = lo_data_definition->entity( )->associations->all->get(  ).
+**        lo_composition = lo_data_definition->view_entity( )->compositions->all->get(  ).
+*        lo_fields = lo_data_definition->entity( )->fields->all->get(  ).
+*        view_type_value = view_type->value.
+
+**********************************************************************
+    " method entity( ) works for getting fields for all entity types
+    CASE view_type .
+      WHEN xco_cp_data_definition=>type->view_entity.
+        lo_assoc = lo_data_definition->view_entity( )->associations->all->get(  ).
+        lo_composition = lo_data_definition->view_entity( )->compositions->all->get(  ).
+        lo_fields = lo_data_definition->view_entity( )->fields->all->get(  ).
+        view_type_value = view_type->value.
+
+*        DATA(view_entity) = xco_lib->get_view_entity(  CONV #( io_cds_view_name ) ).
+*
+*        DATA(lo_view_entity_Fields) = view_entity->fields->all->get(  ).
+
+        TRY.
+            DATA(components_view) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( io_cds_view_name ) )->get_components(  ).
+          CATCH cx_sy_rtti_type_not_released INTO DATA(cx_released_check_failed).
+
+            DATA(rtti_released_check_text) = cx_released_check_failed->get_text(  ).
+*
+
+          CATCH cx_root INTO DATA(cx_rtti_problem_view_entity).
+
+
+            DATA(rtti_problem_view_entity_text) = cx_rtti_problem_view_entity->get_text(  ).
+*            DATA(rtti_problem_view_entity_root) = cl_message_helper=>get_latest_t100_exception( cx_rtti_problem_view_entity )->if_message~get_longtext( ).
+
+
+            "do nothing
+            "when components_view is initial we will only see the
+            "field names in the value help
+        ENDTRY.
+
+      WHEN xco_cp_data_definition=>type->view.
+        lo_assoc = lo_data_definition->view( )->associations->all->get(  ).
+        lo_composition = lo_data_definition->view( )->compositions->all->get(  ).
+        lo_fields = lo_data_definition->view( )->fields->all->get(  ).
+        view_type_value = view_type->value.
+        "get value of annotation @AbapCatalog.sqlViewName
+        "to retrieve the name of the sql view name
+
+
+*        DATA(view) = xco_lib->get_view_entity(  CONV #( io_cds_view_name ) ).
+*
+*        DATA(lo_view_Fields) = view->fields->all->get(  ).
+*
+*        lo_fields = lo_view_Fields.
+        TRY.
+            components_view = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( io_cds_view_name ) )->get_components(  ).
+          CATCH cx_root INTO DATA(cx_rtti_problem_view).
+
+            DATA(rtti_problem_view_text) = cx_rtti_problem_view->get_text(  ).
+
+*            DATA(rtti_problem_view_root) = cl_message_helper=>get_latest_t100_exception( cx_rtti_problem_view )->if_message~get_longtext( ).
+
+            "do nothing
+            "when components_view is initial we will only see the
+            "field names in the value help
+        ENDTRY.
+
+      WHEN xco_cp_data_definition=>type->abstract_entity.
+        set_is_abstract_or_cust_entity(  ).
+        lo_fields = lo_data_definition->abstract_entity( )->fields->all->get(  ).
+        " in abstract and custom entities associations and compositions are defined as fields
+        LOOP AT lo_fields INTO DATA(lo_field).
+          IF lo_field->content(  )->get(  )-association-target IS NOT INITIAL.
+            APPEND lo_field->name TO association_field_names.
+            APPEND lo_field->content(  )->get(  )-association-target TO association_targets.
+          ENDIF.
+          IF lo_field->content(  )->get(  )-composition-target IS NOT INITIAL.
+            APPEND lo_field->name TO  composition_field_names.
+            APPEND lo_field->content(  )->get(  )-composition-target TO composition_targets.
+          ENDIF.
+        ENDLOOP.
+        view_type_value = view_type->value.
+
+      WHEN xco_cp_data_definition=>type->custom_entity.
+
+        set_is_abstract_or_cust_entity(  ).
+        lo_fields = lo_data_definition->custom_entity( )->fields->all->get(  ).
+        " in abstract and custom entities associations and compositions are defined as fields
+        LOOP AT lo_fields INTO lo_field.
+          IF lo_field->content(  )->get(  )-association-target IS NOT INITIAL.
+            APPEND lo_field->name TO association_field_names.
+            APPEND lo_field->content(  )->get(  )-association-target TO association_targets.
+          ENDIF.
+          IF lo_field->content(  )->get(  )-composition-target IS NOT INITIAL.
+            APPEND lo_field->name TO  composition_field_names.
+            APPEND lo_field->content(  )->get(  )-composition-target TO composition_targets.
+          ENDIF.
+        ENDLOOP.
+        view_type_value = view_type->value.
+
+      WHEN OTHERS.
+
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid    = ZDMO_cx_rap_generator=>view_type_not_supported
+            mv_value  = | { view_type->value } |
+            mv_entity = entityname.
+
+
+    ENDCASE.
+
+
+    LOOP AT lo_assoc INTO DATA(assoc).
+      APPEND to_upper( assoc->name ) TO association_field_names.
+      IF NOT assoc->content(  )->get_to_parent_indicator(  ).
+        APPEND assoc->content(  )->get_target( ) TO association_targets.
+      ENDIF.
+    ENDLOOP.
+    LOOP AT lo_composition INTO DATA(composition_field).
+      APPEND to_upper( composition_field->content( )->get(  )-alias ) TO composition_field_names.
+      APPEND composition_field->content(  )->composition->target TO composition_targets.
+    ENDLOOP.
+
+
+
+
+    DATA is_association TYPE abap_bool.
+    DATA is_composition TYPE abap_bool.
+
+    LOOP AT lo_fields INTO lo_field.
+
+      CLEAR ls_fields.
+      CLEAR is_association.
+      CLEAR is_composition.
+
+      IF line_exists( association_field_names[ field_name = lo_field->name ] ).
+        is_association = abap_true.
+      ENDIF.
+
+      IF line_exists( composition_field_names[ field_name = lo_field->name ] ).
+        is_composition = abap_true.
+      ENDIF.
+
+      "only add "real" fields to the field list
+
+      IF is_association = abap_false AND is_composition = abap_false.
+
+
+        " DATA(underscore) = substring( val = lo_field->name  len = 1 ).
+
+        "skip associations that are added as field names as well
+        "   IF underscore <> '_'.
+
+        ls_fields-name = lo_field->name.
+        DATA(field_content) = lo_field->content( )->get( ).
+*        IF field_content-alias IS INITIAL.
+*          ls_fields-cds_view_field = ls_fields-name.
+*        ELSE.
+*          ls_fields-cds_view_field = field_content-alias.
+*        ENDIF.
+
+        "This would retrieve field names such as _ageny.name when
+        "defined as _agency.name = AgencyName
+
+*        ls_fields-name = field_content-expression->if_xco_text~get_lines( )->join( )->value.
+
+        ls_fields-name = field_content-original_name.
+        ls_fields-cds_view_field = field_content-original_name.
+
+        ls_fields-key_indicator =  field_content-key_indicator.
+
+        DATA(aggregated_annotations) = xco_lib->get_aggregated_annotations( lo_field ).
+
+        IF aggregated_annotations->contain( 'SEMANTICS.AMOUNT' ).
+          TRY.
+              DATA(semantics_amount_annotation) = aggregated_annotations->pick( 'SEMANTICS.AMOUNT' )->get_value( ).
+              semantics_amount_annotation->write_to(  REF #( semantic_amount ) ).
+              IF semantic_amount IS NOT INITIAL.
+                ls_fields-currencycode = to_upper( semantic_amount-currencycode ) .
+              ENDIF.
+            CATCH cx_root INTO DATA(exception).
+          ENDTRY.
+        ENDIF.
+
+        "for example @Semantics.quantity.unitOfMeasure: 'QuantityUnit'
+        IF aggregated_annotations->contain( 'SEMANTICS.QUANTITY' ).
+          TRY.
+              DATA(semantics_quantity_annotation) = aggregated_annotations->pick( 'SEMANTICS.QUANTITY' )->get_value( ).
+              semantics_quantity_annotation->write_to(  REF #( semantic_quantity ) ).
+              IF semantic_quantity IS NOT INITIAL.
+                ls_fields-unitofmeasure = to_upper( semantic_quantity-unitofmeasure ).
+              ENDIF.
+            CATCH cx_root INTO exception.
+          ENDTRY.
+        ENDIF.
+
+        "retrieve data elements or built in types
+
+        DATA(field_type) = lo_field->content( )->get_type(  ).
+
+        "For views (CDS views with a SQL view) and entity views "field_type" turned out to be initial.
+        "For abstract entities it works
+        "To work around this blocker and to enable the use case of generating services
+        "based on Service Consumption Models (which are generating abstract entities)
+        "we skip filling the information of data elements and built in types for
+        "views and view entities for now
+
+        "now we use RTTI to get the required information
+        "information is needed to determine administrative fields such as etags when
+        "data source is an entity or a view entity
+
+        IF field_type IS NOT INITIAL.
+
+          IF field_type->is_data_element(  ).
+
+            ls_fields-is_data_element = abap_true.
+
+            DATA(lo_data_element) = field_type->get_data_element( ).
+
+*        IF lo_data_element->exists(  ) = abap_true.
+            ls_fields-data_element = lo_data_element->name.
+*            read_data_element(
+*              EXPORTING
+*                io_data_element = lo_data_element
+*                is_fields       = ls_fields
+*              IMPORTING
+*                es_fields       = ls_fields
+*            ).
+
+          ELSEIF field_type->is_built_in_type(  ).
+
+            ls_fields-is_built_in_type = abap_true.
+
+            ls_fields-built_in_type  = field_type->get_built_in_type(  )->type.
+            ls_fields-built_in_type_length = field_type->get_built_in_type(  )->length.
+            ls_fields-built_in_type_decimals = field_type->get_built_in_type(  )->decimals.
+
+
+
+
+          ENDIF.
+
+        ELSE.
+
+          CASE view_type .
+            WHEN xco_cp_data_definition=>type->view_entity OR
+                 xco_cp_data_definition=>type->view.
+
+              "components_view will be initial if the RTTI call above fails.
+
+              DATA(ls_fields_name_to_upper) = to_upper( ls_fields-name ).
+
+              IF line_exists( components_view[ name = ls_fields_name_to_upper ] ).
+                DATA(data_element_via_rtti) = components_view[ name = ls_fields_name_to_upper ]-type->get_relative_name(  ).
+                IF data_element_via_rtti IS NOT INITIAL.
+                  ls_fields-is_data_element = abap_true.
+                  ls_fields-data_element = data_element_via_rtti.
+                ELSE.
+                  ls_fields-is_built_in_type = abap_true.
+                ENDIF.
+
+
+
+                "map type_kind 'C' to 'CHAR'
+
+                "rv_internal_abap_type is of type char4
+
+                get_abap_ddic_from_int_type(
+                  EXPORTING
+                    iv_abap_ddic_type     = components_view[ name = ls_fields_name_to_upper ]-type->type_kind
+                    iv_length             = components_view[ name = ls_fields_name_to_upper ]-type->length
+                    iv_decimals           = components_view[ name = ls_fields_name_to_upper ]-type->decimals
+                  IMPORTING
+                    rv_internal_abap_type = DATA(built_in_type) "ls_fields-built_in_type
+                    rv_length             = ls_fields-built_in_type_length
+                    rv_decimals           = ls_fields-built_in_type_decimals
+                ).
+
+                ls_fields-built_in_type = built_in_type.
+
+*                  ls_fields-built_in_type  = data_type_in_ABAP_Dictionary.
+*                  ls_fields-built_in_type_length = components_view[ name = ls_fields-name ]-type->length.
+*                  ls_fields-built_in_type_decimals = components_view[ name = ls_fields-name ]-type->decimals.
+
+              ENDIF.
+          ENDCASE.
+
+        ENDIF.
+        "abstract entities created from service consumption models
+        "contain an additional field for each field that contains
+        "a value control information
+
+        IF ls_fields-data_element NE 'RAP_CP_ODATA_VALUE_CONTROL'.
+          APPEND ls_fields TO et_fields.
+        ENDIF.
+
+      ENDIF.
+
+    ENDLOOP.
+
+    DATA a TYPE i.
+    a = 2.
+
+  ENDMETHOD.
+
+
+  METHOD get_fields_persistent_table.
+
+    DATA lt_components TYPE cl_abap_structdescr=>component_table .
+    DATA ls_fields TYPE ts_field.
+    DATA(lo_database_table) = xco_lib->get_database_table( CONV  sxco_dbt_object_name( persistent_table_name ) ).
+    DATA(lt_fields_from_xco) = lo_database_table->fields->all->get( ).
+    LOOP AT lt_fields_from_xco INTO DATA(ls_fields_from_xco).
+      ls_fields-name = ls_fields_from_xco->name.
+      APPEND ls_fields TO lt_fields_persistent_table.
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD get_implementation_type.
+    rv_implementation_type = implementationtype.
+  ENDMETHOD.
+
+
+  METHOD get_root_cause_textid.
+    "error and success messages
+    TYPES: BEGIN OF ty_exception_text,
+             msgv1(50),
+             msgv2(50),
+             msgv3(50),
+             msgv4(50),
+           END OF ty_exception_text.
+
+    DATA : lx_root_cause     TYPE REF TO cx_root,
+           ls_exception_text TYPE ty_exception_text.
+
+    "the caller of this method should retrieve the error message of the root cause
+    "that has been originally raised by the config facade
+
+    lx_root_cause = ix_previous.
+
+    WHILE lx_root_cause->previous IS BOUND.
+      lx_root_cause = lx_root_cause->previous.    " Get the exception that caused this exception
+    ENDWHILE.
+
+    "move the (long) text to a structure with 4 fields of length 50 characters each
+    "error messages longer than 200 characters are truncated.
+    "no exception is thrown opposed to using substring
+    ls_exception_text = lx_root_cause->get_longtext( ).
+
+    IF ls_exception_text IS INITIAL.
+      ls_exception_text = lx_root_cause->get_text( ).
+    ENDIF.
+
+    rs_root_cause_textid-attr1 = CONV #( ls_exception_text-msgv1 ).
+    rs_root_cause_textid-attr2 = CONV #( ls_exception_text-msgv2 ).
+    rs_root_cause_textid-attr3 = CONV #( ls_exception_text-msgv3 ).
+    rs_root_cause_textid-attr4 = CONV #( ls_exception_text-msgv4 ).
+    rs_root_cause_textid-msgid = 'ZDMO_CM_RAP_GEN_MSG'.
+    rs_root_cause_textid-msgno = 016.
+
+  ENDMETHOD.
+
+
+  METHOD get_root_exception.
+    rx_root = ix_exception.
+    WHILE rx_root->previous IS BOUND.
+      rx_root ?= rx_root->previous.
+    ENDWHILE.
+  ENDMETHOD.
+
+
+  METHOD get_structure_components.
+
+    DATA table_fields  TYPE ts_field  .
+
+    LOOP AT io_components->components->all->get( ) INTO DATA(lo_field).
+      CLEAR table_fields.
+      DATA(lo_field_content) =  lo_field->content( ).
+      DATA(lo_field_content_type) = lo_field_content->get_type(  ).
+      DATA(ls_field) = lo_field_content->get( ).
+
+      table_fields-name = lo_field->name.
+      IF useuppercamelcase = abap_true.
+        "table_fields-cds_view_field = to_mixed( table_fields-name ).
+        table_fields-cds_view_field = xco_cp=>string( table_fields-name )->split( '_' )->compose( xco_cp_string=>composition->pascal_case )->value.
+      ELSE.
+        table_fields-cds_view_field = table_fields-name.
+      ENDIF.
+
+      "add hardcoded mappings
+      CASE table_fields-name.
+        WHEN 'SPRAS'.
+          IF useuppercamelcase = abap_true.
+            table_fields-cds_view_field = 'Language'.
+          ENDIF.
+      ENDCASE.
+
+      table_fields-is_data_element = lo_field_content_type->is_data_element( ).
+      table_fields-is_built_in_type = lo_field_content_type->is_built_in_type(  ).
+      IF table_fields-is_built_in_type = abap_true.
+        table_fields-built_in_type  = lo_field_content_type->get_built_in_type(  )->type.
+        table_fields-built_in_type_length = lo_field_content_type->get_built_in_type(  )->length.
+        table_fields-built_in_type_decimals = lo_field_content_type->get_built_in_type(  )->decimals.
+      ENDIF.
+      IF table_fields-name = 'QUANTITY'.
+        DATA(a) = 1.
+      ENDIF.
+      IF ls_field-type->is_data_element( ) EQ abap_true.
+        DATA(lo_data_element) = ls_field-type->get_data_element( ).
+
+        read_data_element(
+          EXPORTING
+            io_data_element = lo_data_element
+            is_fields       = table_fields
+          IMPORTING
+            es_fields       = table_fields
+        ).
+
+      ELSE.
+        IF ls_field-type->is_built_in_type(  ) = abap_true.
+          table_fields-built_in_type  = ls_field-type->get_built_in_type(  )->type.
+          table_fields-built_in_type_length = ls_field-type->get_built_in_type(  )->length.
+          table_fields-built_in_type_decimals = ls_field-type->get_built_in_type(  )->decimals.
+        ENDIF.
+      ENDIF.
+
+      DATA(currency_quantity) = ls_field-currency_quantity.
+
+      IF currency_quantity IS NOT INITIAL.
+        CASE table_fields-built_in_type.
+          WHEN 'CURR'.
+            table_fields-currencycode = ls_field-currency_quantity-reference_field.
+          WHEN 'QUAN'.
+            table_fields-unitofmeasure = ls_field-currency_quantity-reference_field.
+        ENDCASE.
+      ENDIF.
+
+      IF to_upper( right_string( iv_length = 2 iv_string = CONV #( table_fields-cds_view_field ) ) ) = 'ID'.
+        table_fields-cds_view_field = substring( val = table_fields-cds_view_field len = strlen( table_fields-cds_view_field ) - 2 ) && 'ID' .
+      ENDIF.
+
+      IF to_upper( right_string( iv_length = 4 iv_string = CONV #( table_fields-cds_view_field ) ) ) = 'UUID'.
+        table_fields-cds_view_field = substring( val = table_fields-cds_view_field len = strlen( table_fields-cds_view_field ) - 4 ) && 'UUID' .
+      ENDIF.
+
+      APPEND table_fields TO et_fields.
+
+    ENDLOOP.
+
+
+  ENDMETHOD.
+
+
+  METHOD get_unique_repository_obj_name.
+
+    DATA(object_already_exists) = abap_false.
+    DATA max_length_repo_object_name TYPE i.
+    DATA(repository_object_type) =  i_repository_object_type .
+    DATA(number_of_characters_namespace) = strlen( namespace ).
+
+    " CL_CE_ - characters used in custom query implementation class
+    " UI__O4 - characters used in service binding
+    " S_X    - characters used in control structure
+    " BP_I   - characters used in behavior implementation class
+    " R_TP   - characters used in basic restricted view (transactional processing)
+    " => Max Number is +6
+
+    "prepare for the support of read-only services. Add 'TP' to object names
+
+*    IF transactional_behavior = abap_true.
+*      DATA(suffix_transctional_processing) = node_object_suffix-transactional_processing.
+*    ELSE.
+*      suffix_transctional_processing = ''.
+*    ENDIF.
+
+    DATA(mandatory_obj_name_components) =  to_upper( namespace ) &&  to_upper( prefix )  && to_upper( suffix  ) && 'CL_CE_'.
+    DATA(length_mandatory_name_comp) = strlen( mandatory_obj_name_components ).
+
+    DATA(repository_object_tadir_type) = 'R3TR'.
+
+
+    CASE repository_object_type.
+
+        "root node repository objects
+      WHEN root_node_repository_objects-behavior_definition_r.
+        repository_object_tadir_type = 'BDEF'.
+        max_length_repo_object_name = max_length_object_type-bdef.
+      WHEN root_node_repository_objects-behavior_definition_p.
+        repository_object_tadir_type = 'BDEF'.
+        max_length_repo_object_name = max_length_object_type-bdef.
+      WHEN root_node_repository_objects-behavior_definition_i.
+        repository_object_tadir_type = 'BDEF'.
+        max_length_repo_object_name = max_length_object_type-bdef.
+      WHEN root_node_repository_objects-service_binding.
+        repository_object_tadir_type = 'SRVB'.
+        max_length_repo_object_name = max_length_object_type-srvb.
+      WHEN   root_node_repository_objects-service_definition.
+        repository_object_tadir_type = 'SRVD' .
+        max_length_repo_object_name = max_length_object_type-srvd.
+      WHEN root_node_repository_objects-sap_object_type.
+        repository_object_tadir_type = 'RONT'.
+        max_length_repo_object_name = max_length_object_type-ront.
+        "node repository objects
+      WHEN  node_repository_objects-cds_view_i.
+        repository_object_tadir_type = 'DDLS' .
+        max_length_repo_object_name = max_length_object_type-ddls.
+      WHEN  node_repository_objects-cds_view_i_basic.
+        repository_object_tadir_type = 'DDLS' .
+        max_length_repo_object_name = max_length_object_type-ddls.
+      WHEN  node_repository_objects-cds_view_r.
+        repository_object_tadir_type = 'DDLS' .
+        max_length_repo_object_name = max_length_object_type-ddls.
+      WHEN  node_repository_objects-cds_view_p.
+        repository_object_tadir_type = 'DDLS' .
+        max_length_repo_object_name = max_length_object_type-ddls.
+      WHEN node_repository_objects-meta_data_extension.
+        repository_object_tadir_type = 'DDLX'.
+        max_length_repo_object_name = max_length_object_type-ddlx.
+      WHEN node_repository_objects-behavior_implementation.
+        repository_object_tadir_type = 'CLAS'.
+        max_length_repo_object_name = max_length_object_type-clas.
+      WHEN  node_repository_objects-custom_entity.
+        repository_object_tadir_type = 'DDLS' .
+        max_length_repo_object_name = max_length_object_type-ddls.
+      WHEN node_repository_objects-custom_query_impl_class.
+        repository_object_tadir_type = 'CLAS'.
+        max_length_repo_object_name = max_length_object_type-clas.
+      WHEN node_repository_objects-control_structure.
+        repository_object_tadir_type = 'STRU'.
+        max_length_repo_object_name = max_length_object_type-stru.
+      WHEN node_repository_objects-draft_table.
+        repository_object_tadir_type = 'TABL'.
+        max_length_repo_object_name = max_length_object_type-tabl.
+
+      WHEN node_repository_objects-extension_include.
+        repository_object_tadir_type = 'STRU'.
+        max_length_repo_object_name = max_length_object_type-stru.
+      WHEN node_repository_objects-extension_include_view.
+        repository_object_tadir_type = 'DDLS' .
+        max_length_repo_object_name = max_length_object_type-ddls.
+      WHEN node_repository_objects-draft_query_view.
+        repository_object_tadir_type = 'DDLS' .
+        max_length_repo_object_name = max_length_object_type-ddls.
+      WHEN node_repository_objects-sap_object_node_type.
+        repository_object_tadir_type = 'NONT'.
+        max_length_repo_object_name = max_length_object_type-nont.
+    ENDCASE.
+
+    DATA(remaining_num_characters) = max_length_repo_object_name - length_mandatory_name_comp.
+
+    IF strlen( entityname ) > remaining_num_characters - 3.
+      DATA(entityname_abbreviated) = substring( val = entityname len = remaining_num_characters - 3 ).
+    ELSE.
+      entityname_abbreviated = entityname.
+    ENDIF.
+
+
+    DATA protocol_version TYPE string.
+*    DATA binding TYPE string.
+*
+*    CASE binding_type.
+*      WHEN binding_type_name-odata_v2_ui.
+*        protocol_version = protocol_version_suffix-odata_v2.
+*        binding = binding_type_prefix-ui .
+*      WHEN binding_type_name-odata_v4_ui.
+*        protocol_version = protocol_version_suffix-odata_v4.
+*        binding = binding_type_prefix-ui.
+*      WHEN binding_type_name-odata_v2_web_api.
+*        protocol_version = protocol_version_suffix-odata_v2.
+*        binding = binding_type_prefix-web_api.
+*      WHEN binding_type_name-odata_v4_web_api.
+*        protocol_version = protocol_version_suffix-odata_v4.
+*        binding = binding_type_prefix-web_api.
+*    ENDCASE.
+
+*    DATA(prefix_wo_underscore) = prefix.
+*    REPLACE '_' IN prefix_wo_underscore WITH ''.
+
+    DATA(is_valid_repo_object_name) = abap_false.
+
+    DATA unique_number TYPE i.
+
+    unique_number       = 0.
+    DATA(unique_hex_number) = CONV xstring( unique_number ).
+
+*    lv_name = |{ namespace }{ prefix }{ lv_entityname }{ unique_hex_number }{ suffix }|.
+
+    unique_repository_object_name = build_repository_object_name(
+                                      i_repository_object_type = repository_object_type
+                                      i_entityname_abbreviated = entityname_abbreviated
+                                      i_unique_hex_number      = unique_hex_number
+                                    ).
+
+*    CASE repository_object_type.
+*
+*        "root node repository objects
+*      WHEN root_node_repository_objects-behavior_definition_r.  "'BDEF'.
+*        unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-behavior_definition_r }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|.
+*      WHEN root_node_repository_objects-behavior_definition_p.  "'BDEF'.
+*        unique_repository_object_name = |{ namespace }{ prefix  }{ node_object_prefix-behavior_definition_p }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|.
+*      WHEN root_node_repository_objects-service_binding.        "'SRVB'.
+*        unique_repository_object_name = |{ namespace }{ binding }{ prefix }{ entityname_abbreviated }{ protocol_version }{ suffix }|.
+*      WHEN   root_node_repository_objects-service_definition.   "'SRVD' .
+*        unique_repository_object_name =  |{ namespace }{ prefix }{ entityname_abbreviated }{ suffix }|.
+*
+*        "node repository objects
+*      WHEN  node_repository_objects-cds_view_i.                  "'DDLS' .
+*        unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-cds_view_i }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|.
+*      WHEN  node_repository_objects-cds_view_r.                  "'DDLS' .
+*        unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-cds_view_r }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|.
+*      WHEN  node_repository_objects-cds_view_p.                  "'DDLS' .
+*        unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-cds_view_p }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|.
+*      WHEN node_repository_objects-meta_data_extension.          "'DDLX'.
+*        unique_repository_object_name =  |{ namespace }{ prefix }{ node_object_prefix-meta_data_extension }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|.
+*      WHEN node_repository_objects-behavior_implementation.      "'CLAS'.
+*        unique_repository_object_name =  |{ namespace }{ prefix }{ node_object_prefix-behavior_implementation }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|.
+*      WHEN  node_repository_objects-custom_entity.               "'DDLS' .
+*        unique_repository_object_name =  |{ namespace }{ prefix }{ node_object_prefix-custom_entity }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|.
+*      WHEN node_repository_objects-custom_query_impl_class.      "'CLAS'.
+*        unique_repository_object_name =  |{ namespace }{ prefix }{ node_object_prefix-custom_query_impl_class }{ entityname_abbreviated }{ suffix }|.
+*      WHEN node_repository_objects-control_structure.            "'STRU'.
+*        unique_repository_object_name =  |{ namespace }{ prefix }{ node_object_prefix-control_structure }{ entityname_abbreviated }{ node_object_suffix-control_structure }{ suffix }|.
+*      WHEN node_repository_objects-draft_table.                  "'TABL'.
+*        unique_repository_object_name = |{ namespace }{ prefix_wo_underscore }{ entityname_abbreviated }{ node_object_suffix-draft_table }{ suffix }|.
+*
+*    ENDCASE.
+
+*    lv_name = to_upper( lv_name ).
+
+    WHILE is_valid_repo_object_name = abap_false AND unique_number < 255 .
+
+
+
+      "check if a repository object name with the same name exists elsewhere in the BO
+
+      IF repo_object_name_is_used_in_bo(
+               iv_type = CONV string( repository_object_tadir_type )
+               iv_name = unique_repository_object_name
+             ).
+
+        is_valid_repo_object_name = abap_false.
+
+      ELSE.
+
+        "check if a repository object with this name already exists.
+
+        IF check_repository_object_exists(
+          EXPORTING
+            iv_type                  = CONV string( repository_object_tadir_type )
+            iv_name                  = unique_repository_object_name
+            ).
+
+          is_valid_repo_object_name = abap_false.
+
+        ELSE.
+
+          "check if the repository object name is already used in another RAP Generator BO project
+
+          IF repo_obj_name_used_in_rap_gen(
+          EXPORTING
+            iv_type                  = CONV string( repository_object_tadir_type )
+            iv_name                  = unique_repository_object_name
+            ).
+
+            is_valid_repo_object_name = abap_false.
+
+          ELSE.
+
+            "only when the object name is not used in the bo and
+            "if it does not exist as repository object we can create a new object
+
+            is_valid_repo_object_name = abap_true.
+
+          ENDIF.
+
+        ENDIF.
+
+      ENDIF.
+
+      IF is_valid_repo_object_name = abap_false.
+        unique_number += 1 .
+        unique_hex_number = CONV xstring( unique_number ).
+        "lv_name =  to_upper( namespace ) &&  to_upper( prefix )  && to_upper( lv_entityname ) && unique_hex_number && 'D' && to_upper( suffix  ).
+*        lv_name = |{ namespace }{ prefix }{ lv_entityname }{ unique_hex_number }{ suffix }|.
+
+        unique_repository_object_name = build_repository_object_name(
+                                             i_repository_object_type = repository_object_type
+                                             i_entityname_abbreviated = entityname_abbreviated
+                                             i_unique_hex_number      = unique_hex_number
+                                           ).
+
+*        CASE repository_object_type.
+*
+*            "root node repository objects
+*          WHEN root_node_repository_objects-behavior_definition_r.  "'BDEF'.
+*            unique_repository_object_name = |{ namespace }{ node_object_prefix-behavior_definition_r }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|.
+*          WHEN root_node_repository_objects-behavior_definition_p.  "'BDEF'.
+*            unique_repository_object_name = |{ namespace }{ node_object_prefix-behavior_definition_p }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|.
+*          WHEN root_node_repository_objects-service_binding.        "'SRVB'.
+*            unique_repository_object_name = |{ namespace }{ binding }{ prefix }{ entityname_abbreviated }{ protocol_version }{ unique_hex_number }{ suffix }|.
+*          WHEN   root_node_repository_objects-service_definition.   "'SRVD' .
+*            unique_repository_object_name =  |{ namespace }{ prefix }{ entityname_abbreviated }{ unique_hex_number }{ suffix }|.
+*
+*            "node repository objects
+*          WHEN  node_repository_objects-cds_view_i.                  "'DDLS' .
+*            unique_repository_object_name = |{ namespace }{ node_object_prefix-cds_view_i }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|.
+*          WHEN  node_repository_objects-cds_view_r.                  "'DDLS' .
+*            unique_repository_object_name = |{ namespace }{ node_object_prefix-cds_view_r }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|.
+*          WHEN  node_repository_objects-cds_view_p.                  "'DDLS' .
+*            unique_repository_object_name = |{ namespace }{ node_object_prefix-cds_view_p }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|.
+*          WHEN node_repository_objects-meta_data_extension.          "'DDLX'.
+*            unique_repository_object_name =  |{ namespace }{ node_object_prefix-meta_data_extension }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|.
+*          WHEN node_repository_objects-behavior_implementation.      "'CLAS'.
+*            unique_repository_object_name =  |{ namespace }{ node_object_prefix-behavior_implementation }{ prefix }{ entityname_abbreviated }{ unique_hex_number }{ suffix }|.
+*          WHEN  node_repository_objects-custom_entity.               "'DDLS' .
+*            unique_repository_object_name =  |{ namespace }{ node_object_prefix-custom_entity }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|.
+*          WHEN node_repository_objects-custom_query_impl_class.      "'CLAS'.
+*            unique_repository_object_name =  |{ namespace }{ node_object_prefix-custom_query_impl_class }{ prefix }{ entityname_abbreviated }{ unique_hex_number }{ suffix }|.
+*          WHEN node_repository_objects-control_structure.            "'STRU'.
+*            unique_repository_object_name =  |{ namespace }{ node_object_prefix-control_structure }{ prefix }{ entityname_abbreviated }{ node_object_suffix-control_structure }{ unique_hex_number }{ suffix }|.
+*          WHEN node_repository_objects-draft_table.                  "'TABL'.
+*            unique_repository_object_name = |{ namespace }{ prefix_wo_underscore }{ entityname_abbreviated }{ node_object_suffix-draft_table }{ unique_hex_number }{ suffix }|.
+*
+*        ENDCASE.
+
+      ENDIF.
+    ENDWHILE.
+
+  ENDMETHOD.
+
+
+  METHOD get_valid_draft_table_name.
+
+    rv_ddic_i_view_name = get_valid_table_name(
+                            iv_name            = iv_name
+                            draft_table_suffix = node_object_suffix-draft_table
+                          ).
+
+  ENDMETHOD.
+
+
+  METHOD get_valid_mbc_identifier.
+
+    "lv_name will be shortened to 16 characters
+    DATA lv_name TYPE string.
+    DATA lv_entityname TYPE sxco_ddef_alias_name.
+    DATA is_valid_mbc_identifier TYPE abap_bool.
+    DATA li_counter TYPE i.
+
+    IF iv_name IS INITIAL.
+      "      DATA(lv_name) = ||.
+
+
+      DATA(lv_mandatory_name_components) =   to_upper( prefix )  && to_upper( suffix  ).
+      DATA(max_length_mandatory_name_comp) = 10.
+      DATA(length_mandatory_name_comp) = strlen( lv_mandatory_name_components ).
+      DATA(remaining_num_characters) = 20 - length_mandatory_name_comp.
+
+      IF length_mandatory_name_comp > max_length_mandatory_name_comp.
+        APPEND |{ lv_mandatory_name_components } mandatory components are too long more than { max_length_mandatory_name_comp } characters| TO lt_messages.
+        bo_node_is_consistent = abap_false.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid        = ZDMO_cx_rap_generator=>is_too_long
+            mv_value      = |{ lv_mandatory_name_components } mandatory components for MBC identifier |
+            mv_max_length = max_length_mandatory_name_comp.
+      ENDIF.
+
+      IF strlen( entityname ) > remaining_num_characters - 3.
+        lv_entityname = substring( val = entityname len = remaining_num_characters - 3 ).
+      ELSE.
+        lv_entityname = entityname.
+      ENDIF.
+
+      is_valid_mbc_identifier = abap_false.
+
+      li_counter       = 0.
+      DATA(unique_hex_number) = CONV xstring( li_counter ).
+
+      lv_name = |{ prefix }{ lv_entityname }{ unique_hex_number }{ suffix }|.
+      lv_name = to_upper( lv_name ).
+
+      WHILE is_valid_mbc_identifier = abap_false AND li_counter < 255 .
+        "check if a table with this name alreardy exists.
+
+        DATA(first_letter_mbc_namespace) = substring( val = me->namespace  len = 1 ).
+
+        "The MBC registration API uses a namespace only if it is a "real" namespace.
+        "If a customer namespace 'Y' or 'Z' is used or if
+        "SAP objects are created such as I_Test that also do not have a namespace
+        "then the MBC namespace must be initial.
+
+        CASE first_letter_mbc_namespace.
+          WHEN '/' .
+            DATA(abap_object_mbc_name) = namespace && lv_name.
+          WHEN 'Y' OR 'Z'.
+            abap_object_mbc_name = namespace && lv_name.
+          WHEN OTHERS.
+            abap_object_mbc_name = lv_name.
+        ENDCASE.
+
+        SELECT * FROM i_custabapobjdirectoryentry WHERE
+        abapobject = @abap_object_mbc_name AND abapobjectcategory = 'R3TR' AND abapobjecttype = 'SMBC' INTO TABLE @DATA(lt_smbc).
+
+        IF lines( lt_smbc ) = 0.
+          is_valid_mbc_identifier = abap_true.
+        ENDIF.
+
+
+
+*        IF NOT xco_lib->get_database_table( CONV #( lv_name ) )->exists( ).
+*          is_valid_draft_table_name = abap_true.
+*        ENDIF.
+*
+*        "check if a table with the same existis elsewhere in the BO
+*        IF root_node->draft_table_name = lv_name.
+*          is_valid_draft_table_name = abap_false.
+*        ELSE.
+*          "check if draft table name is used elsewhere in the BO
+*          LOOP AT me->root_node->all_childnodes INTO DATA(lo_bo_node).
+*            IF lo_bo_node->draft_table_name = lv_name.
+*              is_valid_draft_table_name = abap_false.
+*            ENDIF.
+*          ENDLOOP.
+*        ENDIF.
+        IF is_valid_mbc_identifier = abap_false.
+          li_counter       = li_counter + 1.
+          unique_hex_number = CONV xstring( li_counter ).
+          lv_name = |{ prefix }{ lv_entityname }{ unique_hex_number }{ suffix }|.
+          lv_name = to_upper( lv_name ).
+        ENDIF.
+      ENDWHILE.
+
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    "check if name already exists within the BO
+
+
+    check_repository_object_name(
+     EXPORTING
+       iv_type = 'SMBC'
+       iv_name = lv_name
+   ).
+
+    "rap_node_objects-ddic_view_i = lv_name.
+    rv_mbc_identifier = lv_name.
+    "rv_ = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD get_valid_table_name.
+
+    "lv_name will be shortened to 16 characters
+    DATA lv_name TYPE string.
+    DATA lv_entityname TYPE sxco_ddef_alias_name.
+    DATA is_valid_table_name TYPE abap_bool.
+    DATA li_counter TYPE i.
+    "DATA draft_suffix TYPE c LENGTH 1 VALUE 'D'.
+
+    IF iv_name IS INITIAL.
+      "      DATA(lv_name) = ||.
+
+      DATA(prefix_wo_underscore) = prefix.
+      REPLACE '_' IN prefix_wo_underscore WITH ''.
+
+      DATA(lv_mandatory_name_components) =  to_upper( namespace ) &&  to_upper( prefix_wo_underscore )  && to_upper( suffix  ).
+      DATA(max_length_mandatory_name_comp) = 11.
+      DATA(length_mandatory_name_comp) = strlen( lv_mandatory_name_components ).
+      DATA(remaining_num_characters) = 16 - length_mandatory_name_comp.
+
+      IF length_mandatory_name_comp > max_length_mandatory_name_comp.
+        APPEND |{ lv_mandatory_name_components } mandatory components are too long more than { max_length_mandatory_name_comp } characters| TO lt_messages.
+        bo_node_is_consistent = abap_false.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid        = ZDMO_cx_rap_generator=>is_too_long
+            mv_value      = |{ lv_mandatory_name_components } mandatory components for draft table |
+            mv_max_length = max_length_mandatory_name_comp.
+      ENDIF.
+
+      IF strlen( entityname ) > remaining_num_characters - 3.
+        lv_entityname = substring( val = entityname len = remaining_num_characters - 3 ).
+      ELSE.
+        lv_entityname = entityname.
+      ENDIF.
+
+
+      is_valid_table_name = abap_false.
+
+      li_counter       = 0.
+      DATA(unique_hex_number) = CONV xstring( li_counter ).
+      "lv_name =  to_upper( namespace ) &&  to_upper( prefix )  && to_upper( lv_entityname ) && unique_hex_number && 'D' && to_upper( suffix  ).
+      lv_name = |{ namespace }{ prefix_wo_underscore }{ lv_entityname }{ unique_hex_number }{ draft_table_suffix }{ suffix }|.
+      lv_name = to_upper( lv_name ).
+
+      WHILE is_valid_table_name = abap_false AND li_counter < 255 .
+        "check if a table with this name alreardy exists.
+
+        IF NOT xco_lib->get_database_table( CONV #( lv_name ) )->exists( ).
+          is_valid_table_name = abap_true.
+        ENDIF.
+        IF root_node IS NOT INITIAL.
+          "check if a table with the same existis elsewhere in the BO
+          IF root_node->draft_table_name = lv_name.
+            is_valid_table_name = abap_false.
+          ELSE.
+            "check if draft table name is used elsewhere in the BO
+            LOOP AT me->root_node->all_childnodes INTO DATA(lo_bo_node).
+              IF lo_bo_node->draft_table_name = lv_name.
+                is_valid_table_name = abap_false.
+              ENDIF.
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+
+        IF is_valid_table_name = abap_false.
+          li_counter       = li_counter + 1.
+          unique_hex_number = CONV xstring( li_counter ).
+          "lv_name =  to_upper( namespace ) &&  to_upper( prefix )  && to_upper( lv_entityname ) && unique_hex_number && 'D' && to_upper( suffix  ).
+          lv_name = |{ namespace }{ prefix_wo_underscore }{ lv_entityname }{ unique_hex_number }{ draft_table_suffix }{ suffix }|.
+          lv_name = to_upper( lv_name ).
+        ENDIF.
+      ENDWHILE.
+
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    "check if name already exists within the BO
+    TEST-SEAM is_not_a_root_node.
+
+    END-TEST-SEAM.
+
+    check_repository_object_name(
+     EXPORTING
+       iv_type = 'TABL'
+       iv_name = lv_name
+   ).
+
+    "rap_node_objects-ddic_view_i = lv_name.
+
+    rv_ddic_i_view_name = lv_name.
+  ENDMETHOD.
+
+
+  METHOD has_childs.
+    IF childnodes IS NOT INITIAL.
+      rv_has_childs = abap_true.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD is_abstract_or_custom_entity.
+    rv_is_abstract_or_cust_entity =  is_abstract_or_cust_entity.
+  ENDMETHOD.
+
+
+  METHOD is_alphabetical_character_only.
+    rv_is_alphabetical_char_only = abap_true.
+    FIND ALL OCCURRENCES OF REGEX '[^a-zA-Z]' IN iv_string RESULTS DATA(non_alphabetical_characters).
+    IF non_alphabetical_characters IS NOT INITIAL.
+      rv_is_alphabetical_char_only = abap_false.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD is_alpha_numeric.
+    rv_is_alpha_numeric = abap_true.
+    FIND ALL OCCURRENCES OF REGEX '[^[:word:]]' IN iv_string RESULTS DATA(non_alpha_numeric_characters).
+    IF non_alpha_numeric_characters IS NOT INITIAL.
+      rv_is_alpha_numeric = abap_false.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD is_child.
+    rv_is_child = abap_false.
+    IF me->root_node = me->parent_node AND
+    me->is_root(  ) = abap_false.
+      rv_is_child = abap_true.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD is_consistent.
+    rv_is_consistent = bo_node_is_consistent.
+  ENDMETHOD.
+
+
+  METHOD is_extensible.
+    rv_is_extensible = bo_is_extensible.
+  ENDMETHOD.
+
+
+  METHOD is_grand_child_or_deeper.
+    rv_is_grand_child = abap_false.
+    IF me->root_node <> me->parent_node.
+      rv_is_grand_child = abap_true.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD is_root.
+    rv_is_root = is_root_node.
+  ENDMETHOD.
+
+
+  METHOD is_uuid_based.
+
+    SELECT * FROM @lt_fields AS fields WHERE key_indicator  = @abap_true INTO TABLE @DATA(result_uuid).
+
+    DELETE result_uuid WHERE data_element = dataelement_name-client.
+    DELETE result_uuid WHERE built_in_type = builtintype_name-client.
+
+    DATA(numberofrecords) = lines( result_uuid ).
+    "the underlying built in type must be of type RAW and length 16
+    "@todo: the check for the data element can be removed once we can check for
+    "the built in type of a non released domain
+
+    IF numberofrecords = 1 AND ( result_uuid[ 1 ]-data_element = 'SYSUUID_X16' OR
+                                 result_uuid[ 1 ]-data_element = 'XSDUUID_RAW'
+                               ).
+      r_is_uuid_based = abap_true.
+    ELSEIF numberofrecords = 1 AND result_uuid[ 1 ]-built_in_type = uuid_type AND
+                                   result_uuid[ 1 ]-built_in_type_length = uuid_length .
+      r_is_uuid_based = abap_true.
+    ELSE.
+      r_is_uuid_based = abap_false.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD is_virtual_root.
+    rv_is_virtual_root = is_virtual_root_node.
+  ENDMETHOD.
+
+
+  METHOD read_data_element.
+
+    es_fields   = is_fields.
+    es_fields-data_element = io_data_element->name.
+
+    DATA(ls_data_element) = io_data_element->content( )->get( ).
+
+    "The call of is_domain( ) fails if:
+    "a) a built in type such as CUKY is used
+    "b) if language version 5 is used and if the underlying domain is not c1-released.
+    "   In this case the check for existence failed < 2102 since the domain was not visible for the XCO_CP libraries
+    "   As of 2102 the following call shall be used
+    "   xco_cp_abap_dictionary=>data_element( ‘…’ )->content( )->has/get_underlying_built_in_type( )
+
+
+    IF ls_data_element-data_type->is_domain( ) EQ abap_true.
+      DATA(lo_domain) = ls_data_element-data_type->get_domain( ).
+
+      DATA api_state TYPE REF TO cl_xco_ars_api_state .
+      lo_domain->get_api_state( RECEIVING ro_api_state = api_state ).
+*        IF api_state->get_release_state( )->value = 'RELEASED'.
+
+      DATA(package1) = xco_lib->get_package( package ).
+      DATA(software_compontent) = package1->read(  )-property-software_component.
+      DATA(abap_language_version_number) = xco_lib->get_abap_language_version( package ).
+
+*      CASE abap_language_version_number.
+*        WHEN zdmo_cl_rap_node=>package_abap_language_version-standard.
+*
+*        WHEN zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform.
+*
+*
+*
+*        WHEN OTHERS.
+*          "abap language version of package is not supported
+*          ASSERT 1 = 2.
+*      ENDCASE.
+
+
+      IF lo_domain->exists(  ) = abap_true AND
+         api_state->get_release_state( )->value = 'RELEASED' AND
+         abap_language_version_number = zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform.
+
+        read_domain(
+          EXPORTING
+            io_domain = lo_domain
+            is_fields = es_fields
+          IMPORTING
+            es_fields =  es_fields
+        ).
+
+      ELSEIF lo_domain->exists(  ) = abap_true AND
+             abap_language_version_number = zdmo_cl_rap_node=>package_abap_language_version-standard.
+
+        read_domain(
+          EXPORTING
+            io_domain = lo_domain
+            is_fields = es_fields
+          IMPORTING
+            es_fields =  es_fields
+        ).
+
+      ELSE.
+*
+*        es_fields-built_in_type = ls_data_element-data_type->get_built_in_type(  )->type.
+*        es_fields-built_in_type_length = ls_data_element-data_type->get_built_in_type(  )->length.
+*        es_fields-built_in_type_decimals = ls_data_element-data_type->get_built_in_type(  )->decimals.
+        "@todo:
+        "add code to call the methods
+        "if_xco_dtel_data_type~GET_UNDERLYING_BUILT_IN_TYPE
+        "if_xco_dtel_data_type~HAS_UNDERLYING_BUILT_IN_TYPE
+
+
+        IF xco_cp_abap_dictionary=>data_element( es_fields-data_element )->content( )->has_underlying_built_in_type( ).
+          DATA(underlying_built_in_type) = xco_cp_abap_dictionary=>data_element( es_fields-data_element )->content( )->get_underlying_built_in_type( ).
+
+          es_fields-built_in_type = underlying_built_in_type->type.
+          es_fields-built_in_type_length = underlying_built_in_type->length.
+          es_fields-built_in_type_decimals = underlying_built_in_type->decimals.
+
+        ENDIF.
+
+      ENDIF.
+    ELSE.
+      IF ls_data_element-data_type->is_built_in_type(  ) = abap_true.
+        es_fields-built_in_type  = ls_data_element-data_type->get_built_in_type(  )->type.
+        es_fields-built_in_type_length = ls_data_element-data_type->get_built_in_type(  )->length.
+        es_fields-built_in_type_decimals = ls_data_element-data_type->get_built_in_type(  )->decimals.
+      ENDIF.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD read_domain.
+
+    es_fields   = is_fields.
+    es_fields-doma = io_domain->name.
+
+    DATA(lo_read_state) = xco_cp_abap_dictionary=>object_read_state->active_version.
+
+    DATA(ls_domain) = io_domain->content( lo_read_state )->get( ).
+
+    DATA(domain_built_in_type) = ls_domain-format->get_built_in_type(  ).
+    IF domain_built_in_type IS NOT INITIAL.
+      es_fields-built_in_type = domain_built_in_type->type.
+      es_fields-built_in_type_length = domain_built_in_type->length.
+      es_fields-built_in_type_decimals = domain_built_in_type->decimals.
+    ENDIF.
+
+    DATA(domain_fixed_values) = io_domain->fixed_values->all->get( lo_read_state ).
+
+    IF domain_fixed_values IS NOT INITIAL.
+      es_fields-domain_fixed_value = abap_true.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD repo_object_name_is_used_in_bo.
+
+    rv_repo_obj_name_is_used_in_bo = abap_false.
+
+    IF  root_node IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    "check root repo names
+
+    CASE iv_type.
+      WHEN 'BDEF'.
+        IF Iv_name = root_node->rap_root_node_objects-behavior_definition_r OR
+           iv_name = root_node->rap_root_node_objects-behavior_definition_p.
+          rv_repo_obj_name_is_used_in_bo = abap_true.
+        ENDIF.
+      WHEN 'SRVD'.
+        IF Iv_name = root_node->rap_root_node_objects-service_definition.
+          rv_repo_obj_name_is_used_in_bo = abap_true.
+        ENDIF.
+      WHEN 'SRVB'.
+        IF Iv_name = root_node->rap_root_node_objects-service_binding.
+          rv_repo_obj_name_is_used_in_bo = abap_true.
+        ENDIF.
+      WHEN 'SMBC'.
+        IF Iv_name = root_node->manage_business_config_names-identifier.
+          rv_repo_obj_name_is_used_in_bo = abap_true.
+        ENDIF.
+    ENDCASE.
+
+    CASE iv_type.
+      WHEN 'DDLS' .
+        IF Iv_name = root_node->rap_node_objects-cds_view_r OR
+           iv_name = root_node->rap_node_objects-cds_view_p OR
+           iv_name = root_node->rap_node_objects-cds_view_i OR
+           iv_name = root_node->rap_node_objects-cds_view_i_basic.
+          rv_repo_obj_name_is_used_in_bo = abap_true.
+        ENDIF.
+      WHEN 'DDLX'.
+        IF Iv_name = root_node->rap_node_objects-meta_data_extension.
+          rv_repo_obj_name_is_used_in_bo = abap_true.
+        ENDIF.
+      WHEN 'STRU'.
+        IF Iv_name = root_node->rap_node_objects-control_structure.
+          rv_repo_obj_name_is_used_in_bo = abap_true.
+        ENDIF.
+      WHEN 'CLAS'.
+        IF Iv_name = root_node->rap_node_objects-behavior_implementation.
+          rv_repo_obj_name_is_used_in_bo = abap_true.
+        ENDIF.
+      WHEN 'TABL'.
+        IF Iv_name = root_node->draft_table_name.
+          rv_repo_obj_name_is_used_in_bo = abap_true.
+        ENDIF.
+    ENDCASE.
+
+
+    "check if draft table name is used elsewhere in the BO
+    LOOP AT me->root_node->all_childnodes INTO DATA(lo_bo_node).
+
+      CASE iv_type.
+        WHEN 'DDLS' .
+          IF Iv_name = lo_bo_node->rap_node_objects-cds_view_r OR
+             iv_name = lo_bo_node->rap_node_objects-cds_view_p OR
+             iv_name = root_node->rap_node_objects-cds_view_i OR
+             iv_name = root_node->rap_node_objects-cds_view_i_basic.
+            rv_repo_obj_name_is_used_in_bo = abap_true.
+          ENDIF.
+        WHEN 'DDLX'.
+          IF Iv_name = lo_bo_node->rap_node_objects-meta_data_extension.
+            rv_repo_obj_name_is_used_in_bo = abap_true.
+          ENDIF.
+        WHEN 'STRU'.
+          IF Iv_name = lo_bo_node->rap_node_objects-control_structure.
+            rv_repo_obj_name_is_used_in_bo = abap_true.
+          ENDIF.
+        WHEN 'CLAS'.
+          IF Iv_name = lo_bo_node->rap_node_objects-behavior_implementation.
+            rv_repo_obj_name_is_used_in_bo = abap_true.
+          ENDIF.
+        WHEN 'TABL'.
+          IF Iv_name = lo_bo_node->draft_table_name.
+            rv_repo_obj_name_is_used_in_bo = abap_true.
+          ENDIF.
+      ENDCASE.
+
+
+    ENDLOOP.
+
+
+
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD repo_obj_name_used_in_rap_gen.
+
+    rv_repo_obj_name_used_rap_gen = abap_false.
+
+    "check repository object names used in other rap generator projects
+
+    CASE iv_type.
+      WHEN 'BDEF'.
+        SELECT SINGLE CdsRView FROM ZDMO_R_RAPG_NodeTP WHERE CdsRView = @iv_name INTO @DATA(bdef_name_is_used).
+        SELECT SINGLE CdsRView FROM ZDMO_R_RAPG_NodeTPDraft WHERE CdsRView = @iv_name INTO @DATA(bdef_name_is_used_in_draft).
+        IF bdef_name_is_used IS NOT INITIAL OR bdef_name_is_used_in_draft IS NOT INITIAL.
+          rv_repo_obj_name_used_rap_gen = abap_true.
+        ENDIF.
+      WHEN 'SRVD'.
+        SELECT SINGLE ServiceDefinition FROM ZDMO_R_RAPG_NodeTP WHERE ServiceDefinition = @iv_name INTO @DATA(srvd_name_is_used).
+        SELECT SINGLE ServiceDefinition FROM ZDMO_R_RAPG_NodeTPDraft WHERE Servicedefinition = @iv_name INTO @DATA(srvd_name_is_used_in_draft).
+        IF srvd_name_is_used IS NOT INITIAL OR srvd_name_is_used_in_draft IS NOT INITIAL.
+          rv_repo_obj_name_used_rap_gen = abap_true.
+        ENDIF.
+      WHEN 'SRVB'.
+        SELECT SINGLE ServiceBinding  FROM ZDMO_R_RAPG_NodeTP WHERE   ServiceBinding  = @iv_name INTO @DATA(srvb_name_is_used).
+        SELECT SINGLE ServiceDefinition FROM ZDMO_R_RAPG_NodeTPDraft WHERE Servicedefinition = @iv_name INTO @DATA(srvb_name_is_used_in_draft).
+        IF srvb_name_is_used IS NOT INITIAL OR srvb_name_is_used_in_draft IS NOT INITIAL.
+          rv_repo_obj_name_used_rap_gen = abap_true.
+        ENDIF.
+      WHEN 'SMBC'.
+        SELECT SINGLE BusinessConfName FROM ZDMO_R_RAPG_ProjectTP WHERE     BusinessConfName  = @iv_name INTO @DATA(smbc_name_is_used).
+        SELECT SINGLE BusinessConfName FROM ZDMO_R_RAPG_ProjectTPDraft WHERE   BusinessConfName  = @iv_name INTO @DATA(smbc_name_is_used_in_draft).
+        IF smbc_name_is_used IS NOT INITIAL OR smbc_name_is_used_in_draft IS NOT INITIAL.
+          rv_repo_obj_name_used_rap_gen = abap_true.
+        ENDIF.
+    ENDCASE.
+
+    CASE iv_type.
+      WHEN 'DDLS' .
+        SELECT SINGLE CdsRView FROM ZDMO_R_RAPG_NodeTP WHERE CdsRView = @iv_name INTO @DATA(cdsr_name_is_used).
+        SELECT SINGLE CdsRView FROM ZDMO_R_RAPG_NodeTPDraft WHERE CdsRView = @iv_name INTO @DATA(cdsr_name_is_used_in_draft).
+        SELECT SINGLE CdsPView FROM ZDMO_R_RAPG_NodeTP WHERE CdsPView = @iv_name INTO @DATA(cdsp_name_is_used).
+        SELECT SINGLE CdsPView FROM ZDMO_R_RAPG_NodeTPDraft WHERE CdsPView = @iv_name INTO @DATA(cdsp_name_is_used_in_draft).
+
+        SELECT SINGLE CdsiView FROM ZDMO_R_RAPG_NodeTP WHERE CdsiView = @iv_name INTO @DATA(cdsi_name_is_used).
+        SELECT SINGLE CdsiView FROM ZDMO_R_RAPG_NodeTPDraft WHERE CdsiView = @iv_name INTO @DATA(cdsi_name_is_used_in_draft).
+
+* @todo add check when RAP BO is changed
+        SELECT SINGLE CdsiViewBasic FROM ZDMO_R_RAPG_NodeTP WHERE CdsiViewbasic = @iv_name INTO @DATA(cdsi_name_basic_is_used).
+        SELECT SINGLE cdsiviewbasic FROM ZDMO_R_RAPG_NodeTPDraft WHERE CdsiViewbasic = @iv_name INTO @DATA(cdsi_name_bas_is_used_in_draft).
+
+        IF cdsr_name_is_used IS NOT INITIAL OR cdsr_name_is_used_in_draft IS NOT INITIAL OR
+           cdsp_name_is_used IS NOT INITIAL OR cdsp_name_is_used_in_draft IS NOT INITIAL OR
+           cdsi_name_is_used IS NOT INITIAL OR cdsi_name_is_used_in_draft IS NOT INITIAL OR
+           cdsi_name_basic_is_used IS NOT INITIAL OR cdsi_name_bas_is_used_in_draft IS NOT INITIAL
+           .
+          rv_repo_obj_name_used_rap_gen = abap_true.
+        ENDIF.
+      WHEN 'DDLX'.
+        SELECT SINGLE MdeView FROM ZDMO_R_RAPG_NodeTP WHERE MdeView = @iv_name INTO @DATA(Mde_name_is_used).
+        SELECT SINGLE MdeView FROM ZDMO_R_RAPG_NodeTPDraft WHERE MdeView = @iv_name INTO @DATA(mde_name_is_used_in_draft).
+        IF Mde_name_is_used IS NOT INITIAL OR Mde_name_is_used_in_draft IS NOT INITIAL.
+          rv_repo_obj_name_used_rap_gen = abap_true.
+        ENDIF.
+      WHEN 'STRU'.
+        SELECT SINGLE ControlStructure  FROM ZDMO_R_RAPG_NodeTP WHERE ControlStructure  = @iv_name INTO @DATA(stru_name_is_used).
+        SELECT SINGLE ControlStructure  FROM ZDMO_R_RAPG_NodeTPDraft WHERE ControlStructure = @iv_name INTO @DATA(stru_name_is_used_in_draft).
+        IF stru_name_is_used IS NOT INITIAL OR stru_name_is_used_in_draft IS NOT INITIAL.
+          rv_repo_obj_name_used_rap_gen = abap_true.
+        ENDIF.
+      WHEN 'CLAS'.
+        SELECT SINGLE  BehaviorImplementationClass   FROM ZDMO_R_RAPG_NodeTP WHERE  BehaviorImplementationClass   = @iv_name INTO @DATA(clas_name_is_used).
+        SELECT SINGLE  BehaviorImplementationClass   FROM ZDMO_R_RAPG_NodeTPDraft WHERE  BehaviorImplementationClass  = @iv_name INTO @DATA(clas_name_is_used_in_draft).
+        IF clas_name_is_used IS NOT INITIAL OR clas_name_is_used_in_draft IS NOT INITIAL.
+          rv_repo_obj_name_used_rap_gen = abap_true.
+        ENDIF.
+      WHEN 'TABL'.
+        SELECT SINGLE  DraftTableName    FROM ZDMO_R_RAPG_NodeTP WHERE  DraftTableName    = @iv_name INTO @DATA(tabl_name_is_used).
+        SELECT SINGLE  DraftTableName    FROM ZDMO_R_RAPG_NodeTPDraft WHERE  DraftTableName   = @iv_name INTO @DATA(tabl_name_is_used_in_draft).
+        IF tabl_name_is_used IS NOT INITIAL OR tabl_name_is_used_in_draft IS NOT INITIAL.
+          rv_repo_obj_name_used_rap_gen = abap_true.
+        ENDIF.
+    ENDCASE.
+  ENDMETHOD.
+
+
+  METHOD right_string.
+    DATA(length_of_string) = strlen( iv_string ).
+    IF length_of_string >= iv_length.
+      rv_string = substring( val = iv_string off = length_of_string - iv_length len = iv_length ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD set_abap_type.
+
+    abap_type_name = to_upper( iv_abap_type ) .
+
+    split_and_check_abap_type_name( abap_type_name ).
+
+*    DATA(typing_method) = abap_type->content( )->get_typing_method( ).
+*    DATA(typing_definition) = abap_type->content( )->get_typing_definition( ).
+*
+*    IF typing_method->value = 1 AND typing_definition->has_value( ) = abap_true.
+*      DATA(structure) = xco_lib->get_structure( CONV #( typing_definition->get_value( ) ) ).
+*    ENDIF.
+
+
+
+    get_fields(  ).
+
+  ENDMETHOD.
+
+
+  METHOD set_add_basic_i_views.
+    add_basic_i_views = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_add_meta_data_extensions.
+    add_meta_data_extensions = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_add_sap_object_type.
+    add_sap_object_type = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_binding_type.
+    IF iv_binding_type = binding_type_name-odata_v2_ui OR iv_binding_type = binding_type_name-odata_v4_ui
+    OR iv_binding_type = binding_type_name-odata_v2_web_api OR iv_binding_type = binding_type_name-odata_v4_web_api
+    OR iv_binding_type = '' .
+      binding_type = iv_binding_type.
+    ELSE.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid     = ZDMO_cx_rap_generator=>invalid_binding_type
+          mv_value   = binding_type
+          mv_value_2 = supported_binding_types.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD set_cds_view.
+
+    DATA(lv_cds_view) = to_upper( iv_cds_view ) .
+
+
+    SELECT * FROM i_apisforsapcloudplatform WHERE releasedobjecttype = 'CDS_STOB' AND releasedobjectname = @lv_cds_view INTO TABLE @DATA(lt_result)..
+
+    "check if CDS view used as target exists
+    IF  lt_result IS INITIAL .
+      IF xco_lib->get_data_definition( CONV #(  lv_cds_view )  )->exists( ) = abap_false .
+        APPEND | CDS View {  lv_cds_view  } does not exist | TO lt_messages.
+        bo_node_is_consistent = abap_false.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>cds_view_does_not_exist
+            mv_value = CONV #( lv_cds_view ).
+      ENDIF.
+    ENDIF.
+
+*      DATA(cds_view_state) = xco_lib->get_data_definition( CONV #( lv_cds_view ) )->get_state( xco_cp_abap_dictionary=>object_read_state->active_version ).
+*
+*      "DATA(check_state_active) =  xco_cp_abap_dictionary=>object_state->active.
+*
+*      IF  cds_view_state <> xco_cp_abap_dictionary=>object_state->active.
+*        APPEND | Table { lv_table } is not active | TO lt_messages.
+*        bo_node_is_consistent = abap_false.
+*        RAISE EXCEPTION TYPE ZDMO_CX_RAP_GENERATOR
+*          EXPORTING
+*            textid   = ZDMO_CX_RAP_GENERATOR=>table_is_inactive
+*            mv_value = CONV #( lv_table ).
+*      ENDIF.
+
+
+    cds_view_name = lv_cds_view.
+
+
+
+    get_fields(  ).
+
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD set_create_table.
+    create_table = iv_create_table.
+  ENDMETHOD.
+
+
+  METHOD set_data_source.
+
+    CASE data_source_type.
+      WHEN data_source_types-table.
+        set_table( CONV sxco_ar_object_name( iv_data_source ) ).
+      WHEN data_source_types-cds_view OR data_source_types-abstract_entity.
+        set_cds_view( CONV sxco_cds_object_name( iv_data_source ) ).
+      WHEN data_source_types-structure.
+        set_structure( CONV sxco_ad_object_name( iv_data_source ) )  .
+      WHEN data_source_types-abap_type.
+        set_abap_type( iv_data_source ).
+      WHEN OTHERS.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid = ZDMO_cx_rap_generator=>invalid_data_source_type.
+    ENDCASE.
+    data_source_name = iv_data_source .
+
+
+  ENDMETHOD.
+
+
+  METHOD set_data_source_type.
+
+    CASE iv_data_source_type.
+
+      WHEN ''.
+        "do nothing and return
+      WHEN 'table'.
+        data_source_type = data_source_types-table.
+      WHEN 'cds_view'.
+        data_source_type = data_source_types-cds_view.
+      WHEN 'abap_type'.
+        data_source_type = data_source_types-abap_type.
+      WHEN 'structure'.
+        data_source_type = data_source_types-structure.
+      WHEN 'abstract_entity'  .
+        data_source_type = data_source_types-abstract_entity.
+      WHEN OTHERS.
+
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>invalid_data_source_type
+            mv_value = iv_data_source_type.
+
+    ENDCASE.
+
+  ENDMETHOD.
+
+
+  METHOD set_draft_enabled.
+    draft_enabled = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_entity_name.
+
+    DATA lt_all_childnodes  TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node .
+
+    check_parameter(
+          EXPORTING
+            iv_parameter_name = 'Entity'                  ##NO_TEXT
+            iv_value          = CONV #( iv_entity_name )
+        ).
+
+    IF me->root_node IS NOT INITIAL.
+
+      lt_all_childnodes = me->root_node->all_childnodes.
+
+      LOOP AT lt_all_childnodes INTO DATA(ls_childnode).
+        IF ls_childnode->entityname = iv_entity_name.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>entity_name_is_not_unique
+              mv_entity = ls_childnode->entityname.
+        ENDIF.
+      ENDLOOP.
+
+    ENDIF.
+
+    entityname = iv_entity_name .
+    rap_node_objects-alias = entityname.
+
+  ENDMETHOD.
+
+
+  METHOD set_ext_element_suffix.
+
+    DATA lt_all_childnodes  TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node .
+
+    IF iv_ext_element_suffix IS NOT INITIAL.
+
+      IF strlen( iv_ext_element_suffix ) NE 3.
+        bo_node_is_consistent = abap_false.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>invalid_ext_element_Suffix
+            mv_value = |{ iv_ext_element_suffix } |.
+      ENDIF.
+
+      IF is_alphabetical_character_only( iv_ext_element_suffix ) = abap_false.
+        bo_node_is_consistent = abap_false.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>invalid_ext_element_Suffix
+            mv_value = |{ iv_ext_element_suffix } |.
+      ENDIF.
+
+      IF me->root_node IS NOT INITIAL.
+
+        lt_all_childnodes = me->root_node->all_childnodes.
+
+        IF me->root_node->extensibility_element_suffix = iv_ext_element_suffix.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>ext_elem_suffix_is_not_unique
+              mv_value  = me->root_node->extensibility_element_Suffix
+              mv_entity = me->root_node->entityname.
+        ENDIF.
+
+        LOOP AT lt_all_childnodes INTO DATA(ls_childnode).
+          IF ls_childnode->extensibility_element_Suffix = iv_ext_element_suffix.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid    = ZDMO_cx_rap_generator=>ext_elem_suffix_is_not_unique
+                mv_value  = ls_childnode->extensibility_element_Suffix
+                mv_entity = ls_childnode->entityname.
+          ENDIF.
+        ENDLOOP.
+
+      ENDIF.
+
+
+      extensibility_element_Suffix = iv_ext_element_suffix.
+    ELSE.
+
+*       IF bo_is_extensible = abap_true.
+*        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+*          EXPORTING
+*            textid = ZDMO_cx_rap_generator=>no_ext_element_suffix_set.
+      extensibility_element_Suffix = get_extensib_element_suffix( node_number ).
+
+*      ENDIF.
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_fields.
+
+    DATA  semantic_key_fields  TYPE tt_semantic_key_fields  .
+    lt_fields = it_fields.
+    todo( 'method set_fields. Add validation for lt_fields.' ).
+
+    set_field_name_client( ).
+    set_field_name_language( ).
+
+    set_mapping(  ).
+
+    CASE implementationtype .
+      WHEN implementation_type-managed_semantic OR
+           implementation_type-unmanaged_semantic.
+
+        LOOP AT lt_fields INTO DATA(ls_fields) WHERE key_indicator = abap_true AND name <> field_name-client.
+          APPEND ls_fields-name TO semantic_key_fields.
+        ENDLOOP.
+
+      WHEN implementation_type-managed_uuid.
+
+        APPEND object_id TO semantic_key_fields.
+
+      WHEN OTHERS.
+
+        ASSERT 1 = 2.
+
+    ENDCASE.
+
+    set_semantic_key_fields( semantic_key_fields ).
+
+    lt_fields_persistent_table = lt_fields.
+
+  ENDMETHOD.
+
+
+  METHOD set_field_name_client.
+    DATA number_of_client_fields TYPE i VALUE 0.
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+            EXPORTING
+              iv_parameter_name = 'field_name-client'
+              iv_value          = iv_string
+          ).
+      field_name-client = to_upper( iv_string ).
+      EXIT.
+    ELSE.
+      LOOP AT lt_fields INTO DATA(field) WHERE key_indicator = abap_true.
+        "key client : mandt;
+        "or
+        "key client : abap.clnt
+        IF ( field-is_data_element  = abap_true AND field-data_element  = dataelement_name-client ) OR
+           ( field-is_built_in_type = abap_true AND field-built_in_type = builtintype_name-client  ).
+          field_name-client = to_upper( field-name ).
+          number_of_client_fields += 1.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+    IF field_name-client IS INITIAL.
+      field_name-client = 'MANDT'.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD set_field_name_created_at.
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+        EXPORTING
+          iv_parameter_name = 'field_name-created_at'
+          iv_value          = iv_string
+      ).
+      field_name-created_at = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    SELECT * FROM @lt_fields AS fields WHERE data_element  = @dataelement_name-created_at INTO TABLE @DATA(result_fields).
+
+    IF line_exists( result_fields[ data_element = dataelement_name-created_at  ] ).
+      field_name-created_at = to_upper( result_fields[ data_element = dataelement_name-created_at ]-name ).
+      EXIT.
+    ENDIF.
+
+    "finally check if field follows certain naming conventions and uses data elements used
+    "commonly to store timestamps
+
+    LOOP AT lt_fields INTO DATA(ls_field) WHERE ( name CS 'created' AND name CS 'at')
+                                            AND ( data_element = 'TZNTSTMPL' OR
+                                                  data_element = 'TIMESTAMPL' OR
+                                                  data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ).
+      field_name-created_at = to_upper( ls_field-name )     .
+      EXIT.
+    ENDLOOP.
+
+
+  ENDMETHOD.
+
+
+  METHOD set_field_name_created_by.
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+        EXPORTING
+          iv_parameter_name = 'field_name-created_by'
+          iv_value          = iv_string
+      ).
+      field_name-created_by = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    SELECT * FROM @lt_fields AS fields WHERE data_element  = @dataelement_name-created_by INTO TABLE @DATA(result_fields).
+
+    IF line_exists( result_fields[ data_element = dataelement_name-created_by ] ).
+      field_name-created_by = to_upper( result_fields[ data_element = dataelement_name-created_by ]-name ).
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_field_name_etag_master.
+
+
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+              EXPORTING
+                iv_parameter_name = 'field_name-etag_master'
+                iv_value          = iv_string
+            ).
+      field_name-etag_master = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    SELECT * FROM @lt_fields AS fields WHERE data_element  = @dataelement_name-local_instance_last_changed_at INTO TABLE @DATA(result_fields).
+
+    IF line_exists( result_fields[ data_element = dataelement_name-local_instance_last_changed_at ] ).
+      field_name-etag_master = to_upper( result_fields[ data_element = dataelement_name-local_instance_last_changed_at ]-name ).
+      EXIT.
+    ENDIF.
+
+
+    LOOP AT lt_fields INTO DATA(ls_field) WHERE ( name CS 'local' AND name CS 'last' AND name CS 'changed')
+                                             AND ( data_element = 'TZNTSTMPL' OR
+                                                  data_element = 'TIMESTAMPL' OR
+                                                  data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ).
+      field_name-etag_master = to_upper( ls_field-name )     .
+      EXIT.
+    ENDLOOP.
+
+    IF field_name-etag_master IS NOT INITIAL.
+      EXIT.
+    ENDIF.
+
+    LOOP AT lt_fields INTO ls_field WHERE ( name CS 'changed')
+                                             AND ( data_element = 'TZNTSTMPL' OR
+                                                  data_element = 'TIMESTAMPL' OR
+                                                  data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ).
+      field_name-etag_master = to_upper( ls_field-name )     .
+      EXIT.
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD set_field_name_language.
+    DATA number_of_langu_fields TYPE i VALUE 0.
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+                EXPORTING
+                  iv_parameter_name = 'field_name-language'
+                  iv_value          = iv_string
+              ).
+      field_name-language = to_upper( iv_string ).
+      EXIT.
+    ELSE.
+      LOOP AT lt_fields INTO DATA(field) WHERE key_indicator = abap_true.
+        "key langu     : spras;
+        "or
+        "key langu      : abap.lang;
+        IF ( field-is_data_element  = abap_true AND field-data_element  = dataelement_name-language ) OR
+           ( field-is_built_in_type = abap_true AND field-built_in_type = builtintype_name-language ).
+          field_name-language = to_upper( field-name ).
+          number_of_langu_fields += 1.
+
+*          add_valuehelp(
+*              EXPORTING
+*               iv_alias              = 'Language'
+*               iv_name               = 'I_Language'
+*               iv_localelement       = field-cds_view_field
+*               iv_element            = 'Language'
+*              ).
+
+
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD set_field_name_last_changed_at.
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+        EXPORTING
+          iv_parameter_name = 'field_name-last_changed_at'
+          iv_value          = iv_string
+      ).
+      field_name-last_changed_at = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    SELECT * FROM @lt_fields AS fields WHERE data_element  = @dataelement_name-last_changed_at INTO TABLE @DATA(result_fields).
+
+    IF line_exists( result_fields[ data_element = dataelement_name-last_changed_at ] ).
+      field_name-last_changed_at = to_upper( result_fields[ data_element = dataelement_name-last_changed_at ]-name ).
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_field_name_last_changed_by.
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+            EXPORTING
+              iv_parameter_name = 'field_name-last_changed_by'
+              iv_value          = iv_string
+          ).
+      field_name-last_changed_by = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    SELECT * FROM @lt_fields AS fields WHERE data_element  = @dataelement_name-last_changed_by INTO TABLE @DATA(result_fields).
+
+    IF line_exists( result_fields[ data_element = dataelement_name-last_changed_by ] ).
+      field_name-last_changed_by = to_upper( result_fields[ data_element = dataelement_name-last_changed_by ]-name ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD set_field_name_loc_last_chg_at.
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+        EXPORTING
+          iv_parameter_name = 'field_name-local_last_changed_at'
+          iv_value          = iv_string
+      ).
+      field_name-local_instance_last_changed_at = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    SELECT * FROM @lt_fields AS fields WHERE data_element  = @dataelement_name-local_instance_last_changed_at INTO TABLE @DATA(result_fields).
+
+    IF line_exists( result_fields[ data_element = dataelement_name-local_instance_last_changed_at ] ).
+      field_name-local_instance_last_changed_at = to_upper( result_fields[ data_element = dataelement_name-local_instance_last_changed_at ]-name ).
+    ENDIF.
+
+    LOOP AT lt_fields INTO DATA(ls_field) WHERE ( name CS 'local' AND name CS 'last' AND name CS 'changed')
+                                             AND ( data_element = 'TZNTSTMPL' OR
+                                                  data_element = 'TIMESTAMPL' OR
+                                                  data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ).
+      field_name-local_instance_last_changed_at = to_upper( ls_field-name )     .
+      EXIT.
+    ENDLOOP.
+
+    IF field_name-local_instance_last_changed_at IS NOT INITIAL.
+      EXIT.
+    ENDIF.
+
+    LOOP AT lt_fields INTO ls_field WHERE ( name CS 'changed')
+                                             AND ( data_element = 'TZNTSTMPL' OR
+                                                  data_element = 'TIMESTAMPL' OR
+                                                  data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ).
+      field_name-local_instance_last_changed_at = to_upper( ls_field-name )     .
+      EXIT.
+    ENDLOOP.
+
+
+
+
+
+
+
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD set_field_name_loc_last_chg_by.
+
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+            EXPORTING
+              iv_parameter_name = 'field_name-local_last_changed_by'
+              iv_value          = iv_string
+          ).
+      field_name-local_instance_last_changed_by = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    SELECT * FROM @lt_fields AS fields WHERE data_element  = @dataelement_name-local_instance_last_changed_by INTO TABLE @DATA(result_fields).
+
+    IF line_exists( result_fields[ data_element = dataelement_name-local_instance_last_changed_by ] ).
+      field_name-local_instance_last_changed_by = to_upper( result_fields[ data_element = dataelement_name-local_instance_last_changed_by ]-name ).
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_field_name_parent_uuid.
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+            EXPORTING
+              iv_parameter_name = 'field_name-parent_uuid'
+              iv_value          = iv_string
+          ).
+      field_name-parent_uuid = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    IF implementationtype = implementation_type-managed_uuid.
+
+      SELECT * FROM @lt_fields AS fields WHERE (  key_indicator  = @abap_false AND
+                                                  ( data_element = 'SYSUUID_X16' OR
+                                                    data_element = 'XSDUUID_RAW'
+                                                    OR
+                                                    ( built_in_type = @uuid_type AND
+                                                      built_in_type_length = @uuid_length )
+                                                     )
+
+
+
+                                                )
+      INTO TABLE @DATA(result_uuid).
+
+      DATA(numberofrecords) = lines( result_uuid ).
+
+      "the underlying built in type must be of type RAW and length 16
+      "@todo: the check for the data element can be removed once we can check for
+      "the built in type of a non released domain
+
+      IF numberofrecords = 1.
+        " that's ok
+        field_name-parent_uuid = to_upper( result_uuid[ 1 ]-name ).
+        EXIT.
+      ENDIF.
+
+      IF numberofrecords > 1.
+        LOOP AT result_uuid INTO DATA(ls_field) WHERE ( name CS 'parent' AND name CS 'uuid').
+          field_name-parent_uuid = to_upper( ls_field-name )     .
+          EXIT.
+        ENDLOOP.
+      ENDIF.
+
+
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD set_field_name_root_uuid.
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+        EXPORTING
+          iv_parameter_name = 'field_name-root_uuid'
+          iv_value          = iv_string
+      ).
+      field_name-root_uuid = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    IF implementationtype = implementation_type-managed_uuid.
+
+      SELECT * FROM @lt_fields AS fields WHERE (  key_indicator  = @abap_false AND
+                                                  ( data_element = 'SYSUUID_X16' OR
+                                                    data_element = 'XSDUUID_RAW'
+                                                     OR
+                                                    ( built_in_type = @uuid_type AND
+                                                      built_in_type_length = @uuid_length )
+                                                     )
+                                                )
+      INTO TABLE @DATA(result_uuid).
+
+      DATA(numberofrecords) = lines( result_uuid ).
+
+      "the underlying built in type must be of type RAW and length 16
+      "@todo: the check for the data element can be removed once we can check for
+      "the built in type of a non released domain
+
+      IF numberofrecords < 2.
+        EXIT.
+      ENDIF.
+
+*      field_name-root_uuid = to_upper( result_uuid[ 1 ]-name ).
+
+
+      LOOP AT result_uuid INTO DATA(ls_field) WHERE ( name CS 'root' AND name CS 'uuid').
+        field_name-root_uuid = to_upper( ls_field-name )     .
+        EXIT.
+      ENDLOOP.
+
+
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD set_field_name_total_etag.
+    "if value is set externally, take this one
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+            EXPORTING
+              iv_parameter_name = 'field_name-total_etag'
+              iv_value          = iv_string
+          ).
+      field_name-total_etag = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    IF draft_enabled = abap_false.
+      EXIT.
+    ENDIF.
+    "if no value is provided check for a standard data element
+    IF line_exists( lt_fields[ data_element = dataelement_name-last_changed_at ] ).
+      field_name-total_etag = to_upper( lt_fields[ data_element = dataelement_name-last_changed_at ]-name ).
+      EXIT.
+    ENDIF.
+
+    LOOP AT lt_fields INTO DATA(ls_field) WHERE (  name CS 'last' AND name CS 'changed') AND NOT ( name CS 'local' )
+                                             AND ( data_element = 'TZNTSTMPL' OR
+                                                  data_element = 'TIMESTAMPL' OR
+                                                  data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ).
+      field_name-total_etag = to_upper( ls_field-name )     .
+      EXIT.
+    ENDLOOP.
+
+    IF field_name-total_etag IS NOT INITIAL.
+      EXIT.
+    ENDIF.
+
+    "finally check if field follows certain naming conventions and uses data elements used
+    "commonly to store timestamps
+
+    LOOP AT lt_fields INTO ls_field WHERE ( name CS 'changed')
+                                             AND ( data_element = 'TZNTSTMPL' OR
+                                                  data_element = 'TIMESTAMPL' OR
+                                                  data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ).
+      field_name-total_etag = to_upper( ls_field-name )     .
+      EXIT.
+    ENDLOOP.
+
+  ENDMETHOD.
+
+
+  METHOD set_field_name_uuid.
+
+    IF iv_string IS NOT INITIAL.
+      check_parameter(
+            EXPORTING
+              iv_parameter_name = 'field_name-uuid'
+              iv_value          = iv_string
+          ).
+      field_name-uuid = to_upper( iv_string ).
+      EXIT.
+    ENDIF.
+
+    IF implementationtype = implementation_type-managed_uuid.
+
+      SELECT * FROM @lt_fields AS fields WHERE key_indicator  = @abap_true  AND name <> @field_name-client
+                                          INTO TABLE @DATA(result_uuid).
+
+      DATA(numberofrecords) = lines( result_uuid ).
+
+      "the underlying built in type must be of type RAW and length 16
+      "@todo: the check for the data element can be removed once we can check for
+      "the built in type of a non released domain
+
+      IF numberofrecords = 1 AND ( result_uuid[ 1 ]-data_element = 'SYSUUID_X16' OR
+                                   result_uuid[ 1 ]-data_element = 'XSDUUID_RAW' ).
+        " that's ok
+        field_name-uuid = to_upper( result_uuid[ 1 ]-name ).
+      ELSEIF numberofrecords = 1 AND result_uuid[ 1 ]-built_in_type = uuid_type AND
+                                   result_uuid[ 1 ]-built_in_type_length = uuid_length .
+        field_name-uuid = to_upper( result_uuid[ 1 ]-name ).
+      ENDIF.
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_generate_only_node_hierach.
+    generate_only_node_hierachy = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_has_transactional_behavior.
+    transactional_behavior = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_implementation_type.
+
+    CASE iv_implementation_type.
+
+      WHEN ''.
+        "do nothing
+      WHEN implementation_type-managed_uuid.
+        implementationtype = implementation_type-managed_uuid.
+      WHEN implementation_type-managed_semantic.
+        implementationtype = implementation_type-managed_semantic.
+      WHEN implementation_type-unmanaged_semantic.
+        implementationtype = implementation_type-unmanaged_semantic.
+      WHEN OTHERS.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>implementation_type_not_valid
+            mv_value = iv_implementation_type.
+    ENDCASE.
+
+  ENDMETHOD.
+
+
+  METHOD set_is_abstract_or_cust_entity.
+    is_abstract_or_cust_entity = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_is_customizing_table.
+    is_customizing_table = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_is_extensible.
+    bo_is_extensible = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_is_root_node.
+    is_root_node = io_is_root_node.
+    IF is_root_node = abap_true.
+      set_root( me ).
+      set_parent( me ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD set_is_virtual_root_node.
+
+
+    is_virtual_root_node = abap_true.
+    set_is_root_node(  ).
+    "CLEAR childnodes.
+    "CLEAR all_childnodes.
+
+    "field_name-last_changed_at =  |max ({ singleton_child_tab_name }.last_changed_at)|  .
+    field_name-total_etag =  |max ({ singleton_child_tab_name }.{ childnodes[ 1 ]->field_name-total_etag } )|  .
+    lt_fields = VALUE #(
+*      (
+*       name = 'CLIENT'
+*       cds_view_field = 'Client'
+*       key_indicator = 'X'
+*       is_data_element = 'X'
+*       data_element = 'MANDT'
+*       )
+      (
+       name = '1'
+       cds_view_field = singleton_field_name
+       key_indicator = 'X'
+       is_built_in_type = 'X'
+       built_in_type = 'INT1'
+       built_in_type_length = 3
+       )
+
+
+     ).
+
+
+
+    "DATA semantic_key_fields  TYPE tt_semantic_key  .
+    semantic_key = VALUE #( ( name = '1' cds_view_field = singleton_field_name ) ).
+    object_id = '1'.
+    object_id_cds_field_name = singleton_field_name .
+    is_finalized = abap_true.
+    cds_view_name = 'I_Language'.
+
+
+    me->add_additional_fields(
+                                 VALUE #(
+                                 "localInstanceLastChangedAt is used the customizing table becomes a child entity
+                                 "of the virtual root node
+                                       (
+                                         "name = field_name-last_changed_at
+                                         name = field_name-total_etag
+                                         cds_view_field = 'LastChangedAtMax'
+                                         data_element = 'TIMESTAMPL'
+                                         cds_interface_view = abap_true
+                                         cds_restricted_reuse_view = abap_true
+                                         cds_projection_view = abap_true
+                                         draft_table = abap_true
+                                         )
+                                          "cast( '' as sxco_transport) as Request,
+                                        (
+                                         name = |cast( '' as sxco_transport)|
+                                         cds_view_field = 'Request'
+                                         data_element = 'sxco_transport'
+                                         cds_interface_view = abap_true
+                                         cds_restricted_reuse_view = abap_true
+                                         cds_projection_view = abap_true
+                                         draft_table = abap_true
+                                         )
+                                         "cast( 'X' as abap_boolean) as HideTransport,
+                                         (
+                                         name = |cast( 'X' as abap_boolean)|
+                                         cds_view_field = 'HideTransport'
+                                         data_element = 'abap_boolean'
+                                         cds_interface_view = abap_true
+                                         cds_restricted_reuse_view = abap_true
+                                         cds_projection_view = abap_true
+                                         draft_table = abap_true
+                                         is_hidden = abap_true
+                                         )
+                                       )
+                                      ).
+
+    "fill lt_all_fields only after lt_fields is finalized (e.g. is_hidden is added)
+    add_fields_to_all_fields(  ).
+    add_additonal_to_all_fields(  ).
+
+    data_source_name = 'I_Language'.
+    " data_source_type = ''
+    "set_ddic_view_i_name(  ).
+    "misuse the logic to create unique name for sql view for i view
+    DATA(draft_tab_name) = get_valid_draft_table_name(  ).
+    set_name_draft_table( CONV #( draft_tab_name ) ). "ddic_view_i
+    set_name_cds_i_view(  ).
+    set_name_cds_r_view(  ).
+    set_name_cds_p_view(  ).
+    set_name_mde(  ).
+    set_name_behavior_impl(  ).
+    set_name_behavior_def_r(  ).
+    set_name_behavior_def_p(  ).
+    set_name_service_definition(  ).
+    set_name_service_binding(  ).
+    IF manage_business_configuration = abap_true.
+
+      IF manage_business_config_names-identifier IS INITIAL.
+
+        DATA(valid_mbc_identifier) = get_valid_mbc_identifier(  ).
+
+        set_mbc_identifier( CONV #( valid_mbc_identifier ) ).
+      ENDIF.
+
+      IF   manage_business_config_names-name IS INITIAL.
+        set_mbc_name( CONV #(  |{ root_node->rap_node_objects-alias }{ root_node->suffix } maintenance| )  ).
+      ENDIF.
+
+      IF   manage_business_config_names-description IS INITIAL.
+        set_mbc_description( CONV #(  |identifier { manage_business_config_names-identifier }| )  ).
+      ENDIF.
+
+      set_mbc_namespace(  ).
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_mapping.
+    "an automatic mapping can only be calculated if the data source is a table
+    CLEAR lt_mapping.
+
+    IF data_source_type = data_source_types-table
+    OR data_source_type = data_source_types-structure
+    OR data_source_type = data_source_types-abap_type.
+
+
+      IF it_field_mappings IS NOT INITIAL.
+
+        LOOP AT it_field_mappings INTO DATA(ls_field_mapping) WHERE dbtable_field  <> field_name-client.
+
+          "field_is_not_in_datasource
+          "field_is_not_in_cds_view
+
+          IF field_name_exists_in_db_table( CONV #( ls_field_mapping-dbtable_field ) ) = abap_true.
+            ls_mapping-dbtable_field = to_upper( ls_field_mapping-dbtable_field ).
+            ls_mapping-cds_view_field =  ls_field_mapping-cds_view_field .
+
+            "if external mapping is used
+            " the name of the cds view field is being adapted to the field set by the external mapping
+            " the automatic calculated mapping is adapted as well
+
+            LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field>) WHERE name = to_upper( ls_field_mapping-dbtable_field ).
+              <field>-cds_view_field = ls_field_mapping-cds_view_field.
+            ENDLOOP.
+
+            INSERT ls_mapping INTO TABLE lt_mapping.
+
+          ELSE.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid        = ZDMO_cx_rap_generator=>field_is_not_in_datasource
+                mv_table_name = CONV #( table_name )
+                mv_value      = CONV #( ls_field_mapping-dbtable_field ).
+          ENDIF.
+
+        ENDLOOP.
+      ENDIF.
+
+      "add mapping for fields that have not been mapped externally
+      LOOP AT lt_fields INTO  DATA(ls_fields).
+
+        ls_mapping-dbtable_field =  ls_fields-name .
+        ls_mapping-cds_view_field =  ls_fields-cds_view_field .
+
+        DATA(mapping_exists) = xsdbool( line_exists( lt_mapping[ dbtable_field = ls_fields-name ] ) ).
+        "boolc( line_exists( lt_fields[ name = lv_field_name_upper ] ) ).
+
+        IF mapping_exists = abap_false AND ls_fields-name  <> field_name-client.
+          INSERT ls_mapping INTO TABLE lt_mapping.
+        ENDIF.
+      ENDLOOP.
+
+
+    ELSEIF ( data_source_type = data_source_types-cds_view OR data_source_type = data_source_types-abstract_entity ) AND
+             it_field_mappings IS NOT INITIAL. "data source is a CDS view and mapping is defined
+
+      LOOP AT it_field_mappings INTO ls_field_mapping.
+
+        IF field_name_exists_in_db_table( CONV #( ls_field_mapping-dbtable_field ) ) = abap_false.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid        = ZDMO_cx_rap_generator=>field_is_not_in_datasource
+              mv_table_name = CONV #( table_name )
+              mv_value      = CONV #( ls_field_mapping-dbtable_field ).
+        ENDIF.
+
+        IF field_name_exists_in_cds_view( CONV #( ls_field_mapping-cds_view_field ) ) = abap_false.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>field_is_not_in_cds_view
+              mv_entity = CONV #( entityname )
+              mv_value  = CONV #( ls_field_mapping-dbtable_field ).
+        ENDIF.
+
+        ls_mapping-dbtable_field = ls_field_mapping-dbtable_field.
+        ls_mapping-cds_view_field =  ls_field_mapping-cds_view_field .
+        IF  ls_field_mapping-dbtable_field  <> field_name-client.
+          INSERT ls_mapping INTO TABLE lt_mapping.
+        ENDIF.
+      ENDLOOP.
+
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD set_mbc_description.
+    "  check_parameter(
+    "    EXPORTING
+    "      iv_parameter_name = 'manage_business_config_names-description'
+    "      iv_value          = CONV string( iv_value )
+    "  ).
+    manage_business_config_names-description = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_mbc_identifier.
+    check_repository_object_name(
+      EXPORTING
+        iv_type = 'SMBC'
+        iv_name = iv_value
+    ).
+
+    DATA(first_letter_mbc_namespace) = substring( val = me->namespace  len = 1 ).
+
+    "The MBC registration API uses a namespace only if it is a "real" namespace.
+    "If a customer namespace 'Y' or 'Z' is used or if
+    "SAP objects are created such as I_Test that also do not have a namespace
+    "then the MBC namespace must be initial.
+
+    CASE first_letter_mbc_namespace.
+      WHEN '/' .
+        " DATA(abap_object_mbc_name) = namespace && lv_name.
+        manage_business_config_names-identifier = iv_value.
+      WHEN 'Y' OR 'Z'.
+        "abap_object_mbc_name = namespace && lv_name.
+        manage_business_config_names-identifier = namespace && iv_value.
+      WHEN OTHERS.
+        "abap_object_mbc_name = lv_name.
+        manage_business_config_names-identifier = iv_value.
+    ENDCASE.
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD set_mbc_name.
+    "  check_parameter(
+    "    EXPORTING
+    "      iv_parameter_name = 'manage_business_config_names-name'
+    "      iv_value          =  iv_value
+    "  ).
+    manage_business_config_names-name = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_mbc_namespace.
+
+    DATA(first_letter_mbc_namespace) = substring( val = me->namespace  len = 1 ).
+
+    "The MBC registration API uses a namespace only if it is a "real" namespace.
+    "If a customer namespace 'Y' or 'Z' is used or if
+    "SAP objects are created such as I_Test that also do not have a namespace
+    "then the MBC namespace must be initial.
+
+    CASE first_letter_mbc_namespace.
+      WHEN '/' .
+        manage_business_config_names-namespace = namespace.
+      WHEN 'Y' OR 'Z'.
+        manage_business_config_names-namespace = ''.
+      WHEN OTHERS.
+        manage_business_config_names-namespace = ''.
+    ENDCASE.
+
+  ENDMETHOD.
+
+
+  METHOD set_mimic_adt_wizard.
+    mimic_adt_wizard = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_namespace.
+
+    IF iv_namespace IS NOT INITIAL.
+
+      DATA(number_of_characters) = strlen( iv_namespace ).
+      DATA(first_character) = substring( val = iv_namespace  len = 1 ).
+      DATA(last_character) =  substring( val = iv_namespace off = number_of_characters - 1  len = 1 ).
+
+      IF to_upper( first_character ) = 'Z' OR
+         to_upper( first_character ) = 'Y'.
+        check_parameter(
+          EXPORTING
+             iv_parameter_name = 'Namespace'
+             iv_value          = CONV #( iv_namespace )
+          ).
+
+
+      ELSEIF first_character = '/' AND last_character = '/'.
+
+        DATA(remaining_characters) = substring( val = iv_namespace off = 1  len = number_of_characters - 2 ).
+
+        check_parameter(
+          EXPORTING
+             iv_parameter_name = 'Namespace without slashes'
+             iv_value          = CONV #( remaining_characters )
+          ).
+
+      ELSE.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>invalid_namespace
+            mv_value = |iv_namespace|.
+      ENDIF.
+
+      namespace = iv_namespace.
+
+    ELSEIF package IS NOT INITIAL.
+
+      DATA(first_character_package) = substring( val = package  off = 0 len = 1 ).
+      DATA(package_name_length) = strlen( package ).
+
+      IF to_upper( first_character_package ) = '$'. " package = '$TMP'.
+        namespace = 'Z'.
+        EXIT.
+      ENDIF.
+
+      FIND ALL OCCURRENCES OF '/'
+         IN package
+         IGNORING CASE             " case insensitive
+         RESULTS DATA(result). " TYPE match_result_tab
+
+      IF lines( result ) = 2.
+        CHECK result[ 1 ]-offset = 0.
+        namespace = substring( val = package  len = result[ 2 ]-offset + 1 ).
+        EXIT.
+      ENDIF.
+
+*      DATA(first_character_package) = substring( val = package  off = 0 len = 1 ).
+*      DATA(package_name_length) = strlen( package ).
+
+      IF to_upper( first_character_package ) = 'Y'.
+        namespace = 'Y'.
+        EXIT.
+      ENDIF.
+
+      IF to_upper( first_character_package ) =  'Z'.
+        namespace = 'Z'.
+        EXIT.
+      ENDIF.
+
+      IF package_name_length > strlen( 'TEST_' ).
+        IF substring( val = package  len = strlen( 'TEST_' )   ) = 'TEST_' .
+          namespace = 'Z'.
+          EXIT.
+        ENDIF.
+      ENDIF.
+
+      namespace = ''.
+      EXIT.
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_behavior_def_i.
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-behavior_definition_i ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+          EXPORTING
+            iv_type = 'BDEF'
+            iv_name = lv_name
+        ).
+
+
+    IF is_root( ).
+      rap_root_node_objects-behavior_definition_i = lv_name.
+      rv_behavior_dev_i_name = lv_name.
+    ELSEIF is_test_run = abap_true.
+      rap_root_node_objects-behavior_definition_i = lv_name.
+      rv_behavior_dev_i_name = lv_name.
+    ELSE.
+      APPEND | { me->entityname } is not a root node. BDEF for an interface view is only generated for the root node| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>is_not_a_root_node
+          mv_entity = me->entityname.
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD set_name_behavior_def_p.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }C_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-behavior_definition_p ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+
+    check_repository_object_name(
+          EXPORTING
+            iv_type = 'BDEF'
+            iv_name = lv_name
+        ).
+
+    IF is_root( ).
+      rap_root_node_objects-behavior_definition_p = lv_name.
+      rv_behavior_dev_p_name = lv_name.
+    ELSEIF is_test_run = abap_true.
+      rap_root_node_objects-behavior_definition_p = lv_name.
+      rv_behavior_dev_p_name = lv_name.
+    ELSE.
+      APPEND | { me->entityname } is not a root node. BDEF for a projection view is only generated for the root node| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>is_not_a_root_node
+          mv_entity = me->entityname.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_behavior_def_r.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-behavior_definition_r ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+          EXPORTING
+            iv_type = 'BDEF'
+            iv_name = lv_name
+        ).
+
+
+    IF is_root( ).
+      rap_root_node_objects-behavior_definition_r = lv_name.
+      rv_behavior_dev_i_name = lv_name.
+    ELSEIF is_test_run = abap_true.
+      rap_root_node_objects-behavior_definition_r = lv_name.
+      rv_behavior_dev_i_name = lv_name.
+    ELSE.
+      APPEND | { me->entityname } is not a root node. BDEF for an interface view is only generated for the root node| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>is_not_a_root_node
+          mv_entity = me->entityname.
+    ENDIF.
+
+
+
+  ENDMETHOD.
+
+
+  METHOD set_name_behavior_impl.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }BP_I_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-behavior_implementation ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+       EXPORTING
+          iv_type = 'CLAS'
+          iv_name = lv_name
+         ).
+
+    rap_node_objects-behavior_implementation = lv_name.
+    rv_behavior_imp_name = lv_name.
+
+
+  ENDMETHOD.
+
+
+  METHOD set_name_cds_i_view.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-cds_view_i ).
+*                      CATCH zdmo_cx_rap_generator.
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+      EXPORTING
+        iv_type = 'DDLS'
+        iv_name = lv_name
+    ).
+
+    rap_node_objects-cds_view_i = lv_name.
+
+    rv_cds_i_view_name = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_cds_i_view_basic.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-cds_view_i_basic ).
+*                      CATCH zdmo_cx_rap_generator.
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+      EXPORTING
+        iv_type = 'DDLS'
+        iv_name = lv_name
+    ).
+
+    rap_node_objects-cds_view_i_basic = lv_name.
+
+    rv_cds_i_view_name_basic = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_cds_p_view.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }C_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-cds_view_p ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+         EXPORTING
+           iv_type = 'DDLS'
+           iv_name = lv_name
+       ).
+
+    rap_node_objects-cds_view_p = lv_name.
+
+    rv_cds_p_view_name = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_cds_r_view.
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-cds_view_r ).
+*                      CATCH zdmo_cx_rap_generator.
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+      EXPORTING
+        iv_type = 'DDLS'
+        iv_name = lv_name
+    ).
+
+    rap_node_objects-cds_view_r = lv_name.
+
+    rv_cds_r_view_name = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_control_structure.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }S{ prefix }{ entityname }_X{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-control_structure ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    "four letter acronym for structures is normally 'TABL' but this is also used for tables.
+    "unfortunately tables in DDIC only allow names of length 16
+    "so using another abbreviation
+
+    check_repository_object_name(
+      EXPORTING
+        iv_type = 'STRU'
+        iv_name = lv_name
+    ).
+
+    rap_node_objects-control_structure = lv_name.
+
+    rv_controle_structure_name = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_custom_entity.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-custom_entity ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+      EXPORTING
+        iv_type = 'DDLS'
+        iv_name = lv_name
+    ).
+
+    rap_node_objects-custom_entity = lv_name.
+
+    rv_custom_entity_name = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_custom_query_impl.
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }CL_CE_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-custom_query_impl_class ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+       EXPORTING
+          iv_type = 'CLAS'
+          iv_name = lv_name
+         ).
+
+    rap_node_objects-custom_query_impl_class = lv_name.
+    rv_custom_query_impl_class = lv_name.
+  ENDMETHOD.
+
+
+  METHOD set_name_draft_query_view.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }C_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-draft_query_view ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+         EXPORTING
+           iv_type = 'DDLS'
+           iv_name = lv_name
+       ).
+
+    rap_node_objects-draft_query_view = lv_name.
+
+    rv_draft_query_view_name = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_draft_table.
+
+    IF iv_draft_table IS INITIAL.
+      draft_table_name = get_valid_draft_table_name(  ).
+    ELSE.
+
+      DATA(lv_table) = to_upper( iv_draft_table ) .
+
+      check_repository_object_name(
+        EXPORTING
+           iv_type = 'TABL'
+           iv_name = lv_table
+       ).
+
+      draft_table_name =  lv_table .
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_extension_include.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }_S_EXT{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-extension_include ).
+
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    "four letter acronym for structures is normally 'TABL' but this is also used for tables.
+    "unfortunately tables in DDIC only allow names of length 16
+    "so using another abbreviation
+
+    check_repository_object_name(
+      EXPORTING
+        iv_type = 'STRU'
+        iv_name = lv_name
+    ).
+
+    rap_node_objects-extension_include = lv_name.
+
+    rv_extension_include_name = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_extension_incl_view.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }C_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-extension_include_view ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+         EXPORTING
+           iv_type = 'DDLS'
+           iv_name = lv_name
+       ).
+
+    rap_node_objects-extension_include_view = lv_name.
+
+    rv_extension_include_view_name = lv_name.
+
+
+  ENDMETHOD.
+
+
+  METHOD set_name_mde.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }C_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-meta_data_extension ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+
+    IF lv_name IS INITIAL.
+      APPEND | Projection view name is still initial | TO lt_messages.
+      bo_node_is_consistent = abap_false.
+    ENDIF.
+
+    check_repository_object_name(
+       EXPORTING
+         iv_type = 'DDLX'
+         iv_name = lv_name
+     ).
+
+    rap_node_objects-meta_data_extension = lv_name.
+
+    rv_mde_name  = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_sap_node_object_type.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-sap_object_node_type ).
+*                      CATCH zdmo_cx_rap_generator.
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+      EXPORTING
+        iv_type = 'NONT'
+        iv_name = lv_name
+    ).
+
+    rap_node_objects-sap_object_node_type = lv_name.
+
+    rv_sap_object_node_type_name = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_sap_object_type.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-sap_object_type ).
+*                      CATCH zdmo_cx_rap_generator.
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+      EXPORTING
+        iv_type = 'RONT'
+        iv_name = lv_name
+    ).
+
+    rap_root_node_objects-sap_object_type = lv_name.
+
+    rv_sap_object_type_name = lv_name.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_service_binding.
+
+    " From SAP Online Help
+    " Use the prefix
+    " UI_ if the service is exposed as a UI service.
+    " API_ if the service is exposed as Web API.
+    " Use the suffix
+    " _O2 if the service is bound to OData protocol version 2.
+    " _O4 if the service is bound to OData protocol version 4.
+    " Example: ZDMO_UI_TRAVEL_U_O2
+
+    DATA protocol_version TYPE string.
+    DATA binding TYPE string.
+
+    CASE binding_type.
+      WHEN binding_type_name-odata_v2_ui.
+        protocol_version = protocol_version_suffix-odata_v2.
+        binding = binding_type_prefix-ui .
+      WHEN binding_type_name-odata_v4_ui.
+        protocol_version = protocol_version_suffix-odata_v4.
+        binding = binding_type_prefix-ui.
+      WHEN binding_type_name-odata_v2_web_api.
+        protocol_version = protocol_version_suffix-odata_v2.
+        binding = binding_type_prefix-web_api.
+      WHEN binding_type_name-odata_v4_web_api.
+        protocol_version = protocol_version_suffix-odata_v4.
+        binding = binding_type_prefix-web_api.
+    ENDCASE.
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }{ binding }{ prefix }{ entityname }{ suffix }{ protocol_version }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-service_binding ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    IF rap_root_node_objects-service_definition IS INITIAL.
+      APPEND | service binding name is still initial | TO lt_messages.
+      bo_node_is_consistent = abap_false.
+    ENDIF.
+
+    check_repository_object_name(
+       EXPORTING
+         iv_type = 'SRVB'
+         iv_name = lv_name
+     ).
+
+
+    IF is_root( ).
+      rap_root_node_objects-service_binding = lv_name.
+      rv_service_binding_name = lv_name.
+    ELSEIF is_test_run = abap_true.
+      rap_root_node_objects-service_binding = lv_name.
+      rv_service_binding_name = lv_name.
+    ELSE.
+      APPEND | { me->entityname } is not a root node. Service binding can only be created for the root node| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>is_not_a_root_node
+          mv_entity = me->entityname.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_name_service_definition.
+
+    " Since a service definition - as a part of a business service - does not have different types or different specifications, there is (in general) no need for a prefix or suffix to differentiate meaning.
+    " Example: ZDMO_TRAVEL_U
+    " However, in use cases where no reuse of the same service definition is planned for UI and API services, the prefix may follow the rules of the service binding.
+    " Example: ZDMO_UI_TRAVEL_U
+
+    IF iv_name IS INITIAL.
+*      DATA(lv_name) = |{ namespace }{ prefix }{ entityname }{ suffix }|.
+      DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-service_definition ).
+    ELSE.
+      lv_name = iv_name.
+    ENDIF.
+
+    check_repository_object_name(
+          EXPORTING
+            iv_type = 'SRVD'
+            iv_name = lv_name
+        ).
+
+
+    IF is_root( ).
+      rap_root_node_objects-service_definition = lv_name.
+      rv_service_definition_name = lv_name.
+    ELSEIF is_test_run = abap_true.
+      rap_root_node_objects-service_definition = lv_name.
+      rv_service_definition_name = lv_name.
+    ELSE.
+      APPEND | { me->entityname } is not a root node. Service defintion can only be created for the root node| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>is_not_a_root_node
+          mv_entity = me->entityname.
+    ENDIF.
+
+
+
+  ENDMETHOD.
+
+
+  METHOD set_number.
+    node_number = iv_number.
+  ENDMETHOD.
+
+
+  METHOD set_object_id.
+
+    IF iv_object_id IS NOT INITIAL.
+      check_parameter(
+            EXPORTING
+               iv_parameter_name = 'ObjectId'
+               iv_value          = CONV #( iv_object_id )
+            ).
+
+      object_id = to_upper( iv_object_id ).
+      EXIT.
+    ENDIF.
+
+    "determine object_id (=semantic key field) from semantic key fields
+    IF implementationtype = implementation_type-managed_semantic OR
+       implementationtype = implementation_type-unmanaged_semantic.
+
+
+
+      IF is_root_node = abap_true AND line_exists( semantic_key[ 1 ] ).
+        object_id = semantic_key[ 1 ].
+      ENDIF.
+
+      IF ( is_child_node = abap_true OR is_grand_child_node = abap_true ) AND
+         line_exists( parent_node->semantic_key[ 1 ] ) AND
+         line_exists( semantic_key[ 1 ] ).
+
+        LOOP AT semantic_key INTO DATA(semantic_key_field).
+          IF NOT line_exists( parent_node->semantic_key[ name = semantic_key_field-name ] ).
+            object_id = semantic_key_field-name.
+            EXIT.
+          ENDIF.
+        ENDLOOP.
+
+      ENDIF.
+
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD set_package.
+
+    IF NOT xco_lib->get_package( iv_package )->exists(  ) OR iv_package IS INITIAL.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>package_does_not_exist
+          mv_value = CONV #( iv_package ).
+    ENDIF.
+
+    package = iv_package.
+    package = to_upper( package ).
+
+  ENDMETHOD.
+
+
+  METHOD set_parent.
+    IF io_parent_node IS NOT INITIAL.
+      parent_node = io_parent_node.
+    ELSE.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid            = ZDMO_cx_rap_generator=>parameter_is_initial
+          mv_parameter_name = 'Parent node' ##NO_TEXT.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD set_persistent_table.
+
+    todo( 'METHOD set_persistent_table. Check if method should be called if data_source is table' ).
+
+    DATA(lv_table) = to_upper( iv_persistent_table ) .
+
+    persistent_table_name =  iv_persistent_table .
+
+    IF create_table = abap_true.
+
+      lt_fields_persistent_table = lt_fields.
+
+    ELSE.
+
+      IF data_source_type = data_source_types-table  OR
+         data_source_type = data_source_types-cds_view OR
+         data_source_type = data_source_types-abstract_entity.
+        "check if table exists
+        IF xco_lib->get_database_table(  CONV #( lv_table ) )->exists( ) = abap_false.
+          APPEND | Table { lv_table } does not exist| TO lt_messages.
+          bo_node_is_consistent = abap_false.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>table_does_not_exist
+              mv_value = CONV #( lv_table ).
+        ENDIF.
+
+        get_fields_persistent_table(  ).
+
+        " ELSEIF data_source_type = data_source_types-structure.
+        " @todo
+        "
+        " ELSEIF data_source_type = data_source_types-abap_type.
+        " @todo
+
+      ENDIF.
+
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD set_prefix.
+    check_parameter(
+      EXPORTING
+         iv_parameter_name = 'Prefix'                  ##NO_TEXT
+         iv_value          = CONV #( iv_prefix )
+      ).
+
+    prefix = iv_prefix.
+
+  ENDMETHOD.
+
+
+  METHOD set_publish_service.
+    publish_service = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_repository_object_names.
+
+    set_name_cds_r_view( rap_node_objects-cds_view_r ).
+    set_name_cds_i_view( rap_node_objects-cds_view_i ).
+    set_name_cds_i_view_basic( rap_node_objects-cds_view_i_basic ).
+    "we are using view entities as of 2008 and don't need to generate DDIC views anymore
+    "set_ddic_view_i_name(  ).
+    set_name_custom_entity( rap_node_objects-cds_view_r ).
+    set_name_custom_query_impl( rap_node_objects-custom_query_impl_class ).
+    set_name_cds_p_view( rap_node_objects-cds_view_p ).
+    set_name_mde( rap_node_objects-cds_view_p  ).
+    set_name_behavior_impl( rap_node_objects-behavior_implementation  ).
+
+    set_name_control_structure( rap_node_objects-control_structure ).
+
+
+    set_name_draft_query_view( rap_node_objects-draft_query_view ) .
+    set_name_extension_include( rap_node_objects-extension_include ).
+    set_name_extension_incl_view( rap_node_objects-extension_include_view ).
+
+    set_name_sap_node_object_type( rap_node_objects-sap_object_node_type ).
+
+    IF is_root(  ).
+      set_name_behavior_def_r( rap_node_objects-cds_view_r ).
+      set_name_behavior_def_p( rap_node_objects-cds_view_p ).
+      set_name_behavior_def_i( rap_node_objects-cds_view_i ).
+      set_name_service_definition( rap_root_node_objects-service_definition ).
+      set_name_service_binding( rap_root_node_objects-service_binding ).
+      set_name_sap_object_type( rap_root_node_objects-sap_object_type ).
+    ENDIF.
+
+    IF manage_business_configuration = abap_true.
+
+      IF manage_business_config_names-identifier IS INITIAL.
+
+
+        DATA(valid_mbc_identifier) = get_valid_mbc_identifier(  ).
+        set_mbc_identifier( CONV #(  valid_mbc_identifier )  ).
+
+      ENDIF.
+
+      IF   manage_business_config_names-name IS INITIAL.
+        set_mbc_name( CONV #(  |{ root_node->rap_node_objects-alias }{ root_node->suffix } maintenance| )  ).
+      ENDIF.
+
+      IF   manage_business_config_names-description IS INITIAL.
+        set_mbc_description( CONV #(  |identifier { manage_business_config_names-identifier }| )  ).
+      ENDIF.
+
+      set_mbc_namespace(  ).
+
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD set_root.
+    IF  io_root_node IS INITIAL.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid            = ZDMO_cx_rap_generator=>parameter_is_initial
+          mv_parameter_name = 'Parent node' ##NO_TEXT.
+    ENDIF.
+    IF me <> io_root_node.
+      root_node = io_root_node.
+    ELSE.
+
+      IF me->is_root(  ) .
+        root_node = io_root_node.
+      ELSE.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid    = ZDMO_cx_rap_generator=>is_not_a_root_node
+            mv_entity = io_root_node->entityname.
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_semantic_key_fields.
+    DATA ls_semantic_key TYPE ts_semantic_key.
+    IF it_semantic_key IS INITIAL.
+
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid            = ZDMO_cx_rap_generator=>parameter_is_initial
+          mv_parameter_name = 'Semantic key field(s)' ##NO_TEXT.
+
+    ELSE.
+
+      CLEAR semantic_key.
+
+      LOOP AT it_semantic_key INTO DATA(ls_semantic_key_field).
+
+        "the cds view field name will be retrieved in the
+        "finalize method because it can not
+        "be assumed at this point that set_datasource
+        "has already been called.
+        "This is because JSON files are used as input where the order of items
+        "is arbitrary
+        "Hence the order of the methods for setting the values cannot be enforced
+        "the semantic key field is  data base field. The name has to be converted
+        "to uppercase since otherwise checks for field names will fail
+
+        ls_semantic_key-name = to_upper( ls_semantic_key_field ).
+        APPEND ls_semantic_key TO semantic_key.
+
+      ENDLOOP.
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_skip_activation.
+    skip_activation = iv_value.
+  ENDMETHOD.
+
+
+  METHOD set_structure.
+
+    DATA(lv_structure) = to_upper( iv_structure ) .
+
+
+
+
+    "check if structure exists and structure has an active version
+    IF xco_lib->get_structure( CONV #( lv_structure ) )->exists( ) = abap_false .
+      APPEND | Structure { lv_structure } does not exist| TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>table_does_not_exist
+          mv_value = CONV #( lv_structure ).
+    ENDIF.
+
+    DATA(structure_state) = xco_lib->get_structure( CONV #( lv_structure ) )->get_state( xco_cp_abap_dictionary=>object_read_state->active_version ).
+
+    DATA(check_state_active) =  xco_cp_abap_dictionary=>object_state->active.
+
+    IF  structure_state <> xco_cp_abap_dictionary=>object_state->active.
+      APPEND | Structure { lv_structure } is not active | TO lt_messages.
+      bo_node_is_consistent = abap_false.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid   = ZDMO_cx_rap_generator=>table_is_inactive
+          mv_value = CONV #( lv_structure ).
+    ENDIF.
+
+    structure_name = lv_structure.
+
+    set_persistent_table( CONV #( lv_structure ) ).
+
+    get_fields(  ).
+
+
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD set_suffix.
+
+    check_parameter(
+      EXPORTING
+         iv_parameter_name = 'Prefix'              ##NO_TEXT
+         iv_value          = CONV #( iv_suffix )
+      ).
+    IF iv_suffix IS NOT INITIAL.
+      suffix = |{ iv_suffix }| .
+    ELSE.
+      suffix = iv_suffix.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD set_table.
+
+    DATA(lv_table) = to_upper( iv_table ) .
+
+    IF create_table = abap_true.
+
+      table_name = get_valid_table_name(
+                     iv_name            = CONV #( lv_table )
+                     draft_table_suffix = space
+                   )
+                   .
+      set_persistent_table( CONV #( lv_table ) ).
+    ELSE.
+
+      TEST-SEAM omit_table_existence_check.
+
+        "check if table exists and table has an active version
+        IF xco_lib->get_database_table( CONV #( lv_table ) )->exists( ) = abap_false .
+          APPEND | Table { lv_table } does not exist| TO lt_messages ##NO_TEXT .
+          bo_node_is_consistent = abap_false.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>table_does_not_exist
+              mv_value = lv_table.
+        ENDIF.
+
+*        data(table_delivery_class) = xco_lib->get_database_table( CONV #( lv_table ) )->content(  )->get(  )-delivery_class->value.
+
+        DATA(table_state) = xco_lib->get_database_table( CONV #( lv_table ) )->get_state( xco_cp_abap_dictionary=>object_read_state->active_version ).
+
+        DATA(check_state_active) =  xco_cp_abap_dictionary=>object_state->active.
+
+        IF  table_state <> xco_cp_abap_dictionary=>object_state->active.
+          APPEND | Table { lv_table } is not active | TO lt_messages ##NO_TEXT .
+          bo_node_is_consistent = abap_false.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>table_is_inactive
+              mv_value = lv_table.
+        ENDIF.
+      END-TEST-SEAM.
+
+      table_name = lv_table.
+
+      set_persistent_table( CONV #( lv_table ) ).
+
+      get_fields(  ).
+
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD set_transport_request.
+
+    "set_transport request is also called at end of set_package( )
+    "this method will try to reuse any suitable modifiable transport that already exists for that package and that
+    "is owned by the developer
+    "If nevertheless a transport request is set externally this will overrule the automatic selection
+    "If no transport can be found a new transport will be generated
+
+    IF me->package IS NOT INITIAL.
+
+      DATA(record_object_changes) = xco_lib->get_package( me->package  )->read( )-property-record_object_changes.
+
+      IF record_object_changes = abap_false AND iv_transport_request IS NOT INITIAL.
+        DATA(error_details) = |{ me->package } does not record changes.|.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid     = ZDMO_cx_rap_generator=>invalid_transport_request
+            mv_value   = CONV #( iv_transport_request )
+            mv_value_2 = error_details.
+      ELSEIF record_object_changes = abap_false AND iv_transport_request IS INITIAL..
+        EXIT.
+      ENDIF.
+    ELSE.
+      IF me->transport_request IS INITIAL.
+        "no package set, no transport can be set
+        EXIT.
+      ENDIF.
+    ENDIF.
+
+
+    "if transport request is provided take this one
+    IF iv_transport_request IS NOT INITIAL.
+
+      DATA(transport_object) = xco_cp_cts=>transport->for( iv_transport_request ).
+
+      IF transport_object->exists(  ) = abap_false.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>transport_does_not_exist
+            mv_value = CONV #( iv_transport_request ).
+      ENDIF.
+
+      DATA(transport_status) = transport_object->get_status(  )->value.
+      DATA(transport_desired_status) = xco_cp_transport=>status->modifiable->value.
+
+      error_details = | Transport request is not modifiable.|.
+
+      IF  transport_status =  transport_desired_status .
+        transport_request = iv_transport_request.
+      ELSE.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid     = ZDMO_cx_rap_generator=>invalid_transport_request
+            mv_value   = CONV #( iv_transport_request )
+            mv_value_2 = error_details.
+      ENDIF.
+
+      "check if there is a modifiable transport request for this developer and this package
+    ELSEIF me->package IS NOT INITIAL.
+
+      IF xco_lib->get_package( me->package  )->read( )-property-record_object_changes = abap_true.
+
+
+
+
+
+        "check if table is locked by a transport. if yes, take this one
+        IF me->data_source_type = data_source_types-table AND create_table = abap_false..
+          DATA(transport_locking_table) = table_is_locked_by_transport( table_name ).
+          IF transport_locking_table IS NOT INITIAL.
+            transport_request = transport_locking_table.
+          ENDIF.
+
+          "get transport from package
+        ELSE.
+
+          DATA(lo_transport_target) = xco_lib->get_package( me->package
+            )->read( )-property-transport_layer->get_transport_target( ).
+
+          DATA(lo_status_filter) = xco_cp_transport=>filter->status( xco_cp_transport=>status->modifiable ).
+          DATA(lo_owner_filter) = xco_cp_transport=>filter->owner( xco_cp_abap_sql=>constraint->equal( sy-uname ) ).
+          DATA(lo_request_type_filter) = xco_cp_transport=>filter->request_type( xco_cp_transport=>type->workbench_request ).
+          DATA(lo_request_target_filter) = xco_cp_transport=>filter->request_target( xco_cp_abap_sql=>constraint->equal( lo_transport_target->value ) ).
+
+          DATA(lt_transports) = xco_cp_cts=>transports->where( VALUE #(
+            ( lo_status_filter )
+            ( lo_owner_filter )
+            ( lo_request_type_filter )
+            ( lo_request_target_filter )
+          ) )->resolve( xco_cp_transport=>resolution->request ).
+
+          "similar logic as in ADT. Select the first suitable transport request
+          "and only if no modifiable transport request for the transport target can be found
+          "create a new transport request for the transport target
+
+          IF lt_transports IS NOT INITIAL.
+            transport_request = lt_transports[ 1 ]->value.
+          ELSE.
+            DATA(new_transport_object) = xco_cp_cts=>transports->workbench( lo_transport_target->value  )->create_request( |RAP Business object - entity name: { me->entityname } | ).
+            transport_request = new_transport_object->value.
+          ENDIF.
+
+        ENDIF.
+
+      ENDIF.
+
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD set_xco_lib.
+    xco_lib = io_xco_lib.
+  ENDMETHOD.
+
+
+  METHOD split_and_check_abap_type_name.
+
+    DATA abap_class_name TYPE sxco_ao_object_name .
+    DATA abap_type_name TYPE sxco_ao_component_name.
+
+    DATA abap_class  TYPE REF TO if_xco_ao_class.
+    DATA abap_type  TYPE REF TO if_xco_ao_c_type.
+
+
+    SPLIT iv_abap_type_name AT '=>' INTO abap_class_name abap_type_name.
+
+    abap_class = xco_cp_abap=>class( abap_class_name ).
+
+    IF abap_class IS INITIAL.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid     = ZDMO_cx_rap_generator=>invalid_abap_type_name
+          mv_value   = | { iv_abap_type_name } |
+          mv_entity  = entityname
+          mv_value_2 = | { abap_class_name } not found |.
+    ENDIF.
+
+    abap_type = abap_class->definition->section-public->component->type( abap_type_name ).
+
+    IF abap_type IS INITIAL.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid     = ZDMO_cx_rap_generator=>invalid_abap_type_name
+          mv_value   = | { iv_abap_type_name } |
+          mv_entity  = entityname
+          mv_value_2 = | { abap_type_name } not found in class { abap_class_name } |.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD table_is_locked_by_transport.
+
+    DATA(lo_database_table) = xco_lib->get_database_table( iv_name = iv_table_name  ).
+
+    DATA(lo_lock) = lo_database_table->if_xco_cts_changeable~get_object(
+        )->get_lock( ).
+
+    IF lo_lock->exists( ) EQ abap_true.
+      rv_transport = lo_lock->get_transport( ).
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD todo.
+    APPEND todo TO todos.
+  ENDMETHOD.
+
+
+  METHOD underscore_at_pos_2_3.
+    DATA underscore TYPE string VALUE '_'.
+    rv_no_underscore_at_pos_2_3 = abap_true.
+    DATA(string_pos_2_and_3) = substring( val = iv_string  len = 2 off = 1 ).
+    FIND ALL OCCURRENCES OF underscore IN
+         string_pos_2_and_3
+         RESULTS DATA(underscores_at_2_3).
+    IF underscores_at_2_3 IS INITIAL.
+      rv_no_underscore_at_pos_2_3 = abap_false.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD validate_bo.
+
+    DATA(package_type) = xco_lib->get_package( root_node->package )->read(  )-property-package_type->value.
+
+    IF package_type <> zdmo_cl_rap_node=>package_type-development_package.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid          = ZDMO_cx_rap_generator=>invalid_package_type
+          mv_value        = CONV #( package_type )
+          mv_package_name = CONV #( root_node->package ).
+    ENDIF.
+
+
+    IF data_source_type = data_source_types-table.
+      "check if the client field (usually CLNT does exist
+
+      SELECT * FROM @lt_fields AS fields WHERE name  = @field_name-client AND
+                                               key_indicator = @abap_true
+      INTO TABLE @DATA(result_client) .
+
+      IF result_client IS INITIAL.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>clnt_is_not_key_field
+            mv_value = field_name-client.
+      ENDIF.
+    ENDIF.
+
+    IF generate_custom_entity(  ) AND draft_enabled = abap_true.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>no_draft_for_cust_entites
+          mv_entity = entityname.
+    ENDIF.
+
+
+    "avoid error
+    "ETag delegation not supported for unmanaged query implementation
+    IF ( is_child( ) OR is_grand_child_or_deeper(  ) ) AND
+        generate_custom_entity(  ).
+      IF NOT line_exists( lt_fields[ name = field_name-etag_master ] ).
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid    = ZDMO_cx_rap_generator=>no_etag_delegation_support
+            mv_entity = entityname.
+      ENDIF.
+    ENDIF.
+    "validate uuid key field structure, domains and names
+
+    DATA key_fields TYPE string.
+
+    IF implementationtype = implementation_type-managed_uuid.
+
+      SELECT * FROM @lt_fields AS fields WHERE name  = @field_name-uuid INTO TABLE @DATA(result_uuid).
+
+      IF result_uuid IS INITIAL.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>field_uuid_missing
+            mv_value = CONV #( field_name-uuid ).
+      ENDIF.
+
+      DATA(numberofrecords) = lines( result_uuid ).
+      "the underlying built in type must be of type RAW and length 16
+      "@todo: the check for the data element can be removed once we can check for
+      "the built in type of a non released domain
+
+      IF numberofrecords = 1 AND ( to_upper( result_uuid[ 1 ]-data_element ) = 'SYSUUID_X16' OR
+                                   to_upper( result_uuid[ 1 ]-data_element ) = 'XSDUUID_RAW' ).
+        " that's ok
+      ELSEIF numberofrecords = 1 AND
+         (  result_uuid[ 1 ]-built_in_type_length <> uuid_length OR result_uuid[ 1 ]-built_in_type <> uuid_type ).
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>uuid_has_invalid_data_type
+            mv_value = CONV #( field_name-uuid ).
+      ENDIF.
+
+      SELECT * FROM @lt_fields AS fields WHERE key_indicator  = @abap_true
+                                           AND name <> @field_name-client
+                                           INTO TABLE @result_uuid.
+
+      IF result_uuid IS INITIAL.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid    = ZDMO_cx_rap_generator=>has_no_key_field
+            mv_entity = entityname.
+      ENDIF.
+
+      numberofrecords = lines( result_uuid ).
+
+
+      IF numberofrecords = 1 AND  result_uuid[ 1 ]-name <> field_name-uuid.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid    = ZDMO_cx_rap_generator=>uuid_is_not_key_field
+            mv_entity = entityname
+            mv_value  = field_name-uuid.
+      ENDIF.
+
+      IF numberofrecords > 1.
+
+        LOOP AT result_uuid INTO DATA(result_uuid_line).
+          IF key_fields IS INITIAL.
+            key_fields =  result_uuid_line-name.
+          ELSE.
+            key_fields =  key_fields && ',' && result_uuid_line-name.
+          ENDIF.
+        ENDLOOP.
+
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid    = ZDMO_cx_rap_generator=>more_than_one_key_field
+            mv_entity = entityname
+            mv_value  = key_fields.
+      ENDIF.
+
+
+
+      IF is_child( ) OR is_grand_child_or_deeper(  ).
+
+        SELECT * FROM @lt_fields AS fields WHERE name  = @field_name-parent_uuid INTO TABLE @DATA(result_parent_uuid).
+
+        IF result_parent_uuid IS INITIAL.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>field_parent_uuid_missing
+              mv_value = CONV #( field_name-parent_uuid ).
+        ENDIF.
+
+        numberofrecords = lines( result_parent_uuid ).
+
+        IF numberofrecords = 1 AND  ( result_parent_uuid[ 1 ]-data_element = 'SYSUUID_X16' OR
+                                      result_parent_uuid[ 1 ]-data_element = 'XSDUUID_RAW' ).
+          " that's ok
+        ELSEIF numberofrecords = 1 AND
+           ( result_parent_uuid[ 1 ]-built_in_type_length <> uuid_length OR result_parent_uuid[ 1 ]-built_in_type <> uuid_type ).
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>uuid_has_invalid_data_type
+              mv_value = CONV #( field_name-parent_uuid ).
+        ENDIF.
+
+      ENDIF.
+
+      IF is_grand_child_or_deeper(  ).
+
+        SELECT * FROM @lt_fields AS fields WHERE name  = @field_name-root_uuid INTO TABLE @DATA(result_root_uuid).
+
+        IF result_root_uuid IS INITIAL.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>field_root_uuid_missing
+              mv_value = CONV #( field_name-root_uuid ).
+        ENDIF.
+
+        numberofrecords = lines( result_root_uuid ).
+
+        IF numberofrecords = 1 AND  ( result_root_uuid[ 1 ]-data_element = 'SYSUUID_X16' OR
+                                      result_root_uuid[ 1 ]-data_element = 'XSDUUID_RAW' ).
+
+          " that's ok
+        ELSEIF numberofrecords = 1 AND
+           ( result_root_uuid[ 1 ]-built_in_type_length <> uuid_length OR result_root_uuid[ 1 ]-built_in_type <> uuid_type ).
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>uuid_has_invalid_data_type
+              mv_value = CONV #( field_name-root_uuid ).
+        ENDIF.
+
+      ENDIF.
+
+
+    ENDIF.
+
+
+    "validate if a name for the draft_table has been specified
+
+    IF me->draft_enabled = abap_true AND me->draft_table_name IS INITIAL.
+
+      draft_table_name = get_valid_draft_table_name(  ).
+
+      IF draft_table_name IS INITIAL.
+
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid         = ZDMO_cx_rap_generator=>no_draft_table_specified
+            mv_root_entity = me->root_node->entityname
+            mv_entity      = me->entityname.
+      ENDIF.
+    ENDIF.
+
+
+
+
+    IF root_node->draft_enabled = abap_true.
+
+      "validate if total etag field is present in the root entity of the draft enabled BO
+      IF is_root(  ).
+
+        IF line_exists( lt_fields[ name = field_name-total_etag  ] ).
+          "DATA(last_changed_at) = lt_fields[ name = field_name-last_changed_at ]-cds_view_field.
+        ELSEIF line_exists( lt_additional_fields[ name = field_name-total_etag ] ).
+          "last_changed_at = lt_additional_fields[ name = field_name-last_changed_at ]-cds_view_field.
+        ELSE.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>field_total_etag_missing
+              mv_entity = entityname.
+        ENDIF.
+
+      ENDIF.
+
+      "validate if local etag field is present in each node of the draft enabled BO
+      " remove this check and use etag _dependent by instead
+*      IF line_exists( lt_fields[ name = field_name-local_instance_last_changed_at ] ).
+*        "DATA(last_changed_at) = lt_fields[ name = field_name-last_changed_at ]-cds_view_field.
+*      ELSEIF line_exists( lt_additional_fields[ name = field_name-local_instance_last_changed_at ] ).
+*        "last_changed_at = lt_additional_fields[ name = field_name-last_changed_at ]-cds_view_field.
+*      ELSE.
+*        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+*          EXPORTING
+*            textid    = ZDMO_cx_rap_generator=>field_local_etag_missing
+*            mv_value  = field_name-local_instance_last_changed_at
+*            mv_entity = entityname.
+*      ENDIF.
+
+
+    ENDIF.
+
+    "check if an etag has been specified
+    IF line_exists( lt_fields[ name = field_name-etag_master ] ).
+    ELSEIF line_exists( lt_additional_fields[ name = field_name-etag_master ] ).
+    ELSE.
+      IF is_root(  ).
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid    = ZDMO_cx_rap_generator=>field_etag_master_missing
+            mv_entity = entityname.
+      ELSE.
+        APPEND |In entity: { entityname } no etag field has been specified { field_name-created_by } | TO lt_messages.
+      ENDIF.
+    ENDIF.
+
+    "created_by            : syuname;
+    "last_changed_by       : syuname;
+    "local_last_changed_at : timestampl;
+
+    IF  implementationtype = implementation_type-managed_semantic OR
+        implementationtype = implementation_type-managed_uuid.
+      IF is_root(  ).
+        IF line_exists( lt_fields[ name = field_name-created_by ] ).
+        ELSEIF line_exists( lt_additional_fields[ name = field_name-created_by ] ).
+        ELSE.
+          APPEND |{ entityname } is a managed BO. But { field_name-created_by } is not mapped| TO lt_messages.
+        ENDIF.
+
+        IF line_exists( lt_fields[ name = field_name-created_at ] ).
+        ELSEIF line_exists( lt_additional_fields[ name = field_name-created_at ] ).
+        ELSE.
+          APPEND |{ entityname } is a managed BO. But { field_name-created_at } is not mapped| TO lt_messages.
+        ENDIF.
+
+        IF line_exists( lt_fields[ name = field_name-last_changed_by ] ).
+        ELSEIF line_exists( lt_additional_fields[ name = field_name-last_changed_by ] ).
+        ELSE.
+          APPEND |{ entityname } is a managed BO. But { field_name-last_changed_by } is not mapped| TO lt_messages.
+        ENDIF.
+
+        IF line_exists( lt_fields[ name = field_name-last_changed_at ] ).
+        ELSEIF line_exists( lt_additional_fields[ name = field_name-last_changed_at ] ).
+        ELSE.
+          APPEND |{ entityname } is a managed BO. But { field_name-last_changed_at } is not mapped| TO lt_messages.
+        ENDIF.
+      ENDIF.
+      IF line_exists( lt_fields[ name = field_name-local_instance_last_changed_at ] ).
+      ELSEIF line_exists( lt_additional_fields[ name = field_name-local_instance_last_changed_at ] ).
+      ELSE.
+        APPEND |{ entityname } is a managed BO. But { field_name-local_instance_last_changed_at } is not mapped| TO lt_messages.
+      ENDIF.
+
+    ENDIF.
+
+    "created_by            : syuname;
+    "created_at            : timestampl;
+    "last_changed_by       : syuname;
+    "last_changed_at       : timestampl;
+    "local_last_changed_at : timestampl;
+
+
+
+
+    "validate value helps
+
+    DATA lv_target TYPE string.
+    DATA ls_valuehelp TYPE ts_valuehelp.
+    FIELD-SYMBOLS: <fields> TYPE ts_field.
+
+    LOOP AT lt_valuehelp INTO ls_valuehelp.
+
+      lv_target = to_upper( ls_valuehelp-name ).
+
+      SELECT * FROM i_apisforsapcloudplatform WHERE releasedobjecttype = 'CDS_STOB' AND releasedobjectname = @lv_target INTO TABLE @DATA(lt_result)..
+
+      "check if CDS view used as target exists
+      IF NOT ( lt_result IS NOT INITIAL OR xco_lib->get_data_definition( CONV #(  lv_target ) )->exists( ) ).
+        APPEND | CDS View {  lv_target  } does not exist | TO lt_messages.
+        bo_node_is_consistent = abap_false.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>cds_view_does_not_exist
+            mv_value = CONV #( lv_target ).
+      ENDIF.
+
+      "@todo - check if table name can be omitted for
+      "BO's that have structure as a data source
+      IF table_name IS INITIAL.
+        CASE   data_source_type.
+          WHEN  data_source_types-structure.
+          WHEN  data_source_types-abap_type.
+          WHEN  data_source_types-cds_view.
+          WHEN  data_source_types-abstract_entity.
+          WHEN OTHERS.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid = ZDMO_cx_rap_generator=>no_table_set.
+        ENDCASE.
+      ENDIF.
+
+      IF NOT field_name_exists_in_cds_view( CONV #(  ls_valuehelp-localelement  ) ).
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid    = ZDMO_cx_rap_generator=>not_a_field_in_cds_view
+            mv_value  = CONV #( ls_valuehelp-localelement )
+            mv_entity = me->entityname.
+      ENDIF.
+
+    ENDLOOP.
+
+    "validate associations
+
+    LOOP AT lt_association INTO DATA(ls_assocation).
+
+      lv_target = to_upper( ls_assocation-target ).
+
+      SELECT * FROM i_apisforsapcloudplatform WHERE releasedobjecttype = 'CDS_STOB' AND releasedobjectname = @lv_target INTO TABLE @lt_result.
+
+      "check if CDS view used as target exists
+      IF NOT ( lt_result IS NOT INITIAL OR xco_lib->get_data_definition( CONV #(  lv_target ) )->exists( ) ).
+        APPEND | CDS View {  lv_target  } does not exist | TO lt_messages.
+        bo_node_is_consistent = abap_false.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>cds_view_does_not_exist
+            mv_value = CONV #( lv_target ).
+      ENDIF.
+
+
+      LOOP AT ls_assocation-condition_components INTO DATA(ls_condition_fields).
+        IF NOT field_name_exists_in_cds_view( CONV #( ls_condition_fields-projection_field ) ).
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid    = ZDMO_cx_rap_generator=>not_a_field_in_cds_view
+              mv_value  = CONV #( ls_condition_fields-projection_field )
+              mv_entity = me->entityname.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+
+    "validate object id
+    IF object_id IS INITIAL.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>no_object_id_set
+          mv_entity = entityname.
+    ELSE.
+      DATA object_id_upper_case  TYPE sxco_ad_field_name.
+      object_id_upper_case = to_upper( object_id ).
+
+      SELECT SINGLE * FROM @lt_fields AS db_field WHERE name  = @object_id_upper_case INTO @DATA(result).
+      IF result IS INITIAL.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid        = ZDMO_cx_rap_generator=>field_is_not_in_datasource
+            mv_value      = CONV #( object_id_upper_case )
+            mv_table_name = CONV #( table_name ).
+      ENDIF.
+
+      object_id_cds_field_name = result-cds_view_field.
+
+    ENDIF.
+
+    "validate uuid key field
+
+    IF implementationtype = implementation_type-managed_uuid.
+
+    ENDIF.
+
+    " validate semantic key fields
+
+    IF implementationtype = implementation_type-unmanaged_semantic OR
+            implementationtype = implementation_type-managed_semantic.
+
+      IF semantic_key IS INITIAL.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid = ZDMO_cx_rap_generator=>no_semantic_key_set.
+      ENDIF.
+
+      FIELD-SYMBOLS <ls_semantic_key> LIKE LINE OF semantic_key.
+
+      LOOP AT semantic_key ASSIGNING <ls_semantic_key>.
+
+        SELECT SINGLE * FROM @lt_fields AS semantickeyalias WHERE name  = @<ls_semantic_key>-name INTO @DATA(resultsemantickeyalias).
+
+        IF resultsemantickeyalias IS INITIAL.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid                = ZDMO_cx_rap_generator=>sematic_key_is_not_in_table
+              mv_semantic_key_field = CONV #( <ls_semantic_key>-name )
+              mv_table_name         = CONV #( table_name ).
+        ELSE.
+          <ls_semantic_key>-cds_view_field = resultsemantickeyalias-cds_view_field.
+        ENDIF.
+        CLEAR resultsemantickeyalias.
+      ENDLOOP.
+
+      "mark semantic key fields as key fields in lt_fields
+      IF data_source_type = data_source_types-structure OR
+         data_source_type = data_source_types-abap_type.
+        LOOP AT semantic_key INTO DATA(semantic_key_field).
+          LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<line>) WHERE name = semantic_key_field-name.
+            <line>-key_indicator = abap_true.
+          ENDLOOP.
+        ENDLOOP.
+      ENDIF.
+
+
+    ENDIF.
+
+    "validate mapping
+
+    LOOP AT lt_mapping INTO DATA(ls_field_mapping).
+
+      DATA(lv_dbtablefield) = to_upper( ls_field_mapping-dbtable_field ).
+
+
+      "check if database table field is part of the persistence table
+      "if table is set as datasource it is automatically set as persistence table
+      "if an unmanaged scenario is used no mapping can be derived from the data source
+      "or from the persistence table
+      IF implementationtype <> implementation_type-unmanaged_semantic.
+        SELECT SINGLE * FROM @lt_fields_persistent_table AS db_field WHERE name  = @lv_dbtablefield INTO @DATA(result_dbtable_field).
+
+        IF result_dbtable_field IS INITIAL.
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid        = ZDMO_cx_rap_generator=>field_is_not_in_datasource
+              mv_value      = CONV #( ls_field_mapping-dbtable_field )
+              mv_table_name = CONV #( table_name ).
+        ENDIF.
+        CLEAR result_dbtable_field.
+      ENDIF.
+
+
+      SELECT SINGLE * FROM @lt_fields AS cds_view_field WHERE cds_view_field  = @ls_field_mapping-cds_view_field INTO @DATA(result_cds_view_field).
+      IF result_cds_view_field IS INITIAL.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid    = ZDMO_cx_rap_generator=>field_is_not_in_cds_view
+            mv_value  = CONV #( ls_field_mapping-cds_view_field )
+            mv_entity = CONV #( rap_node_objects-cds_view_r ).
+      ENDIF.
+      CLEAR result_cds_view_field.
+    ENDLOOP.
+
+    "check prerequisites for manage business configuration app
+
+    IF me->manage_business_configuration = abap_true.
+
+      IF me->draft_enabled = abap_false.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>not_draft_enabled
+            mv_value = CONV #( me->root_node->entityname ).
+      ENDIF.
+
+      IF me->binding_type <> binding_type_name-odata_v4_ui.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>no_ui_v4_service_binding
+            mv_value = CONV #( me->root_node->entityname ).
+      ENDIF.
+
+
+
+    ENDIF.
+
+    IF me->root_node->publish_service = abap_true
+       AND me->root_node->skip_activation = abap_true.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid = ZDMO_cx_rap_generator=>publish_needs_active_srvd.
+
+      .
+    ENDIF.
+
+    "validate settings for customizing table and mbc app
+
+    IF is_customizing_table = abap_true AND is_grand_child_or_deeper(  ).
+      "&1 Grandchild nodes are not supported for &2 = &3.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid     = ZDMO_cx_rap_generator=>grand_child_not_supported
+          mv_entity  = entityname
+          mv_value   = 'iscustomizingtable'
+          mv_value_2 = 'abap_true'.
+
+    ENDIF.
+
+    IF manage_business_configuration = abap_true AND  is_grand_child_or_deeper(  ).
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid     = ZDMO_cx_rap_generator=>grand_child_not_supported
+          mv_entity  = entityname
+          mv_value   = 'addtomanagebusinessconfiguration'
+          mv_value_2 = 'abap_true'.
+    ENDIF.
+
+    IF data_source_type = data_source_types-structure.
+
+
+
+    ENDIF.
+
+    IF multi_edit = abap_true AND
+       ( binding_type <> binding_type_name-odata_v4_ui OR
+         draft_enabled = abap_false ).
+
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid    = ZDMO_cx_rap_generator=>mult_edit_not_supported
+          mv_entity = entityname.
+
+    ENDIF.
+
+    IF is_customizing_table = abap_true.
+
+      DATA(customizing_database_table) = xco_lib->get_database_table( iv_name = table_name  ).
+
+      DATA(delivery_class) = customizing_database_table->content( )->get_delivery_class(  )->value.
+
+      IF delivery_class <> 'C'.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid     = ZDMO_cx_rap_generator=>delivery_class_c_required
+            mv_value   = CONV #( table_name )
+            mv_value_2 = CONV #( delivery_class ).
+      ENDIF.
+
+    ENDIF.
+
+    IF bo_is_extensible = abap_true AND extensibility_element_suffix IS INITIAL.
+      RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+        EXPORTING
+          textid = ZDMO_cx_rap_generator=>no_ext_element_suffix_set.
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_node.clas.testclasses.abap b/src/zdmo_cl_rap_node.clas.testclasses.abap
new file mode 100644
index 0000000..1012428
--- /dev/null
+++ b/src/zdmo_cl_rap_node.clas.testclasses.abap
@@ -0,0 +1,1402 @@
+*"* use this source file for your ABAP unit test classes
+CLASS ltc_rap_node DEFINITION FINAL FOR TESTING
+  DURATION MEDIUM
+  RISK LEVEL HARMLESS.
+  PUBLIC SECTION.
+
+  PRIVATE SECTION.
+
+    CONSTANTS:
+      gc_namespace_z                 TYPE sxco_ar_object_name VALUE 'Z',
+      gc_namespace_contains_blanks   TYPE sxco_ar_object_name VALUE 'Z T',
+      gc_namespace_contains_nonalpha TYPE sxco_ar_object_name VALUE 'Z$T',
+      gc_root_entity_name            TYPE sxco_ddef_alias_name VALUE 'Travel',
+      gc_root_entity_name_too_long   TYPE sxco_ddef_alias_name VALUE 'T012345678901234567890123456789',
+      gc_root_ent_contains_blanks    TYPE sxco_ddef_alias_name VALUE 'Trav  el',
+      gc_root_ent_contains_nonalpha  TYPE sxco_ddef_alias_name VALUE 'Trave&l',
+      gc_prefix_rap                  TYPE sxco_ar_object_name VALUE 'RAP_',
+      gc_prefix_contains_blanks      TYPE sxco_ar_object_name VALUE 'R AP_',
+      gc_prefix_contains_nonalpha    TYPE sxco_ar_object_name VALUE 'R%P_',
+      gc_suffix_4711                 TYPE sxco_ar_object_name VALUE '_4711',
+      gc_suffix_contains_blanks      TYPE sxco_ar_object_name VALUE '_4 11',
+      gc_suffix_contains_nonalpha    TYPE sxco_ar_object_name VALUE '_4&11',
+      gc_protocol_version_odata_v4   TYPE sxco_ar_object_name VALUE '_O4',
+      gc_binding_ui                  TYPE sxco_ar_object_name VALUE 'UI_',
+      gc_ddic_view_i_name_z          TYPE sxco_dbt_object_name  VALUE 'TRAV00',
+      gc_entity_child1               TYPE sxco_ddef_alias_name VALUE 'Booking',
+      gc_entity_child2               TYPE sxco_ddef_alias_name VALUE 'Booking2',
+      gc_entity_grandchild11         TYPE sxco_ddef_alias_name VALUE 'BookingSuppl',
+      "managed uuid scenario with data source table
+      gc_root_table_mu               TYPE sxco_dbt_object_name  VALUE 'ZDMO_rapgen_bo',
+      gc_child_table_mu              TYPE sxco_dbt_object_name  VALUE 'ZDMO_rapgen_node',
+      gc_grandchild_table_mu         TYPE sxco_dbt_object_name  VALUE 'ZDMO_a_bksuppl_d',
+
+      gc_root_table_uuid             TYPE string VALUE 'travel_uuid',
+      gc_child_table_uuid            TYPE string VALUE 'booking_uuid',
+      gc_grand_child_table_uuid      TYPE string VALUE 'booksuppl_uuid',
+      "object id
+      gc_root_table_sem_key_mu       TYPE string VALUE 'TRAVEL_ID',
+      gc_child_table_sem_key_mu      TYPE string VALUE 'BOOKING_ID',
+      gc_grandchild_table_sem_key_mu TYPE string VALUE 'booking_supplement_id',
+      gc_etag_master_mu              TYPE string VALUE 'lastchangedat',
+      "view
+      gc_view_name                   TYPE string VALUE 'I_Country',
+      gc_view_object_id              TYPE sxco_ad_field_name  VALUE 'Country',
+      gc_view_etag_master            TYPE string VALUE 'CountryThreeLetterISOCode',
+      "view entity
+      gc_view_entity_name            TYPE string VALUE 'DDCDS_CUSTOMER_DOMAIN_VALUE',
+      gc_view_entity_object_id       TYPE sxco_ad_field_name  VALUE 'domain_name',
+      gc_view_entity_etag_master     TYPE string VALUE 'value_high',
+      "abstract entity
+      "ZDMO_TEST_ABSTRACT_CHILDENTITY
+      gc_abstract_entity_name        TYPE string VALUE 'D_SELECTCUSTOMIZINGTRANSPTREQP ',
+      gc_abstract_entity_object_id   TYPE sxco_ad_field_name  VALUE 'TransportRequestID',
+      gc_abstract_entity_etag_master TYPE string VALUE 'TransportRequestID'
+      .
+
+
+    .
+
+    TYPES:
+      BEGIN OF ts_field,
+        name               TYPE sxco_ad_object_name,
+        doma               TYPE sxco_ad_object_name,
+        key_indicator      TYPE abap_bool,
+        not_null           TYPE abap_bool,
+        domain_fixed_value TYPE abap_bool,
+        cds_view_field     TYPE sxco_cds_field_name,
+      END OF ts_field.
+
+    DATA:
+      mo_cut     TYPE REF TO zdmo_cl_rap_node,
+      mo_xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib.
+
+    CLASS-METHODS:
+      class_setup,
+      class_teardown.
+
+    METHODS: setup,
+      teardown,
+      set_namespace FOR TESTING RAISING cx_static_check,
+      set_prefix FOR TESTING RAISING cx_static_check,
+      set_suffix FOR TESTING RAISING cx_static_check,
+      set_cds_view_i_name FOR TESTING RAISING cx_static_check,
+      set_cds_view_p_name FOR TESTING RAISING cx_static_check,
+      set_mde_name FOR TESTING RAISING cx_static_check,
+
+      set_behavior_def_i_name FOR TESTING RAISING cx_static_check ,
+      set_behavior_def_p_name FOR TESTING RAISING cx_static_check ,
+      set_behavior_impl_name FOR TESTING RAISING cx_static_check ,
+      set_service_definition_name FOR TESTING RAISING cx_static_check,
+      set_service_binding_name FOR TESTING RAISING cx_static_check,
+      set_entityname FOR TESTING RAISING cx_static_check,
+      create_a_root_node FOR TESTING RAISING cx_static_check,
+      create_root_with_childs FOR TESTING RAISING cx_static_check,
+
+      set_table FOR TESTING RAISING cx_static_check,
+      get_fields_from_table FOR TESTING RAISING cx_static_check,
+      get_fields_from_view FOR TESTING RAISING cx_static_check,
+      get_fields_from_view_entity FOR TESTING RAISING cx_static_check,
+      get_fields_from_abstractentity FOR TESTING RAISING cx_static_check,
+      check_for_key_field_uuid FOR TESTING RAISING cx_static_check,
+      check_for_parent_key_field FOR TESTING RAISING cx_static_check,
+      check_for_client_field FOR TESTING RAISING cx_static_check,
+      check_for_root_key_field FOR TESTING RAISING cx_static_check,
+      check_set_objectid_wo_data_src FOR TESTING RAISING cx_static_check,
+      "managed scenario
+      create_root_with_childs_u FOR TESTING RAISING cx_static_check.
+
+
+ENDCLASS.
+
+CLASS zdmo_cl_rap_node DEFINITION LOCAL FRIENDS ltc_rap_node.
+
+CLASS ltc_rap_node IMPLEMENTATION.
+
+  METHOD class_setup.
+    "create test doubles for the following tables that are read or written to by this class
+    "this should be only done once we thus do this in the class method class_setup
+
+
+
+  ENDMETHOD.
+
+  METHOD class_teardown.
+
+  ENDMETHOD.
+
+  METHOD setup.
+
+    "mo_xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+    mo_xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib(  ).
+
+    "create test data so that three different nodes can be created
+
+    DATA lt_fields_gc_root_mu TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY.
+    DATA lt_fields_gc_child_mu TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY.
+    DATA lt_fields_gc_grandchild_mu TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY.
+
+    lt_fields_gc_root_mu = VALUE #(
+    ( name = 'CLIENT' key_indicator = 'X'  not_null = 'X' cds_view_field = 'Client' )
+    ( name = 'UUID' key_indicator = 'X'  not_null = 'X' cds_view_field = 'Uuid' )
+    ( name = 'TRAVEL_ID' cds_view_field = 'TravelId' )
+    ( name = 'AGENCY_ID' cds_view_field = 'AgencyId' )
+    ( name = 'CUSTOMER_ID' cds_view_field = 'CustomerId' )
+    ( name = 'BEGIN_DATE' cds_view_field = 'BeginDate' )
+    ( name = 'END_DATE' cds_view_field = 'EndDate' )
+    ( name = 'BOOKING_FEE' cds_view_field = 'BookingFee' )
+    ( name = 'TOTAL_PRICE' cds_view_field = 'TotalPrice' )
+    ( name = 'CURRENCY_CODE' cds_view_field = 'CurrencyCode' )
+    ( name = 'DESCRIPTION' cds_view_field = 'Description' )
+    ( name = 'OVERALL_STATUS' cds_view_field = 'OverallStatus' )
+    ( name = 'CREATED_BY' cds_view_field = 'CreatedBy' )
+    ( name = 'CREATED_AT' cds_view_field = 'CreatedAt' )
+    ( name = 'LAST_CHANGED_BY' cds_view_field = 'LastChangedBy' )
+    ( name = 'LAST_CHANGED_AT' cds_view_field = 'LastChangedAt' )
+    ).
+
+    lt_fields_gc_child_mu = VALUE #(
+    ( name = 'CLIENT' key_indicator = 'X'  not_null = 'X' cds_view_field = 'Client' )
+    ( name = 'UUID' key_indicator = 'X'  not_null = 'X' cds_view_field = 'Uuid' )
+    ( name = 'PARENT_UUID' cds_view_field = 'ParentUuid' )
+    ( name = 'BOOKING_ID' cds_view_field = 'BookingId' )
+    ( name = 'BOOKING_DATE' cds_view_field = 'BookingDate' )
+    ( name = 'CUSTOMER_ID' cds_view_field = 'CustomerId' )
+    ( name = 'CARRIER_ID' cds_view_field = 'CarrierId' )
+    ( name = 'CONNECTION_ID' cds_view_field = 'ConnectionId' )
+    ( name = 'FLIGHT_DATE' cds_view_field = 'FlightDate' )
+    ( name = 'FLIGHT_PRICE' cds_view_field = 'FlightPrice' )
+    ( name = 'CURRENCY_CODE' cds_view_field = 'CurrencyCode' )
+    ( name = 'BOOKING_STATUS' cds_view_field = 'BookingStatus' )
+    ).
+
+    lt_fields_gc_grandchild_mu = VALUE #(
+    ( name = 'CLIENT' key_indicator = 'X'  not_null = 'X' cds_view_field = 'Client' )
+    ( name = 'UUID' key_indicator = 'X'  not_null = 'X' cds_view_field = 'Uuid' )
+    ( name = 'PARENT_UUID' cds_view_field = 'ParentUuid' )
+    ( name = 'ROOT_UUID' cds_view_field = 'RootUuid' )
+    ( name = 'BOOKING_SUPPL_ID' cds_view_field = 'BookingSupplId' )
+    ( name = 'ARTICLE' cds_view_field = 'Article' )
+    ).
+
+  ENDMETHOD.
+
+  METHOD teardown.
+    "teardown is called for every test. So if data exists it should be cleared
+  ENDMETHOD.
+
+  METHOD set_namespace.
+
+    DATA : lv_namespace TYPE string.
+
+    "Given is a node object
+    TRY.
+        mo_cut = NEW #( ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    "When the namespace is set to 'Z'
+    "Then the member variable namespace of the node must have the value 'Z' as well
+    TRY.
+        mo_cut->set_entity_name( gc_root_entity_name ).
+        mo_cut->set_namespace( gc_namespace_z  ).
+        lv_namespace = mo_cut->namespace.
+        cl_abap_unit_assert=>assert_equals( exp = gc_namespace_z act = lv_namespace ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    "When a namespace that contains blanks is set then an exception with
+    "message id : ZDMO_cx_rap_generator=>contains_spaces-msgid
+    "message number : ZDMO_cx_rap_generator=>contains_spaces-msgno
+    "must be raised
+
+    TRY.
+        mo_cut->set_namespace( gc_namespace_contains_blanks ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator .
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+    ENDTRY.
+
+    "When a namespace that contains non alpha numeric characters is set
+    "then an exception with
+    "message id : ZDMO_cx_rap_generator=>NON_ALPHA_NUMERIC_CHARACTERS-msgid
+    "message number : ZDMO_cx_rap_generator=>NON_ALPHA_NUMERIC_CHARACTERS-msgno
+    "must be raised
+
+    TRY.
+        mo_cut->set_namespace( gc_namespace_contains_nonalpha ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+    ENDTRY.
+  ENDMETHOD.
+
+  METHOD set_prefix.
+
+    DATA : lv_prefix TYPE string.
+
+    TRY.
+        mo_cut = NEW #( ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+
+        lv_prefix = mo_cut->prefix.
+        cl_abap_unit_assert=>assert_equals( exp = gc_prefix_rap act = lv_prefix ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_prefix( gc_prefix_contains_blanks ).
+        lv_prefix = mo_cut->prefix.
+        cl_abap_unit_assert=>assert_equals( exp = gc_prefix_rap act = lv_prefix ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator .
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_prefix( gc_prefix_contains_nonalpha ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator .
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD set_suffix.
+
+    DATA : lv_suffix TYPE string.
+
+    TRY.
+        mo_cut = NEW #( ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_entity_name( gc_root_entity_name ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        lv_suffix = mo_cut->suffix.
+        cl_abap_unit_assert=>assert_equals( exp = gc_suffix_4711 act = lv_suffix ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_suffix( gc_suffix_contains_blanks ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator .
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_suffix( gc_suffix_contains_nonalpha ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator .
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD set_cds_view_i_name.
+    "check
+    DATA(lv_expected_name) = |{ gc_namespace_z  }I_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+    DATA lv_name TYPE string.
+    " Given is a node object
+
+    TRY.
+        mo_cut = NEW #( ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_entity_name( gc_root_entity_name ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_name_cds_i_view(  ).
+        lv_name = mo_cut->rap_node_objects-cds_view_i.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD set_cds_view_p_name.
+    "check
+    "|{ namespace }C_{ prefix }{ entityname }{ suffix }|.
+    DATA(lv_expected_name) = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+    DATA lv_name TYPE string.
+
+    " Given is a node object
+    TRY.
+        mo_cut = NEW #( ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_entity_name( gc_root_entity_name ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_name_cds_p_view(  ).
+        lv_name = mo_cut->rap_node_objects-cds_view_p.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD set_mde_name.
+    DATA(lv_expected_name) = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+    DATA lv_name TYPE string.
+    " Given is a node object
+    TRY.
+        mo_cut = NEW #( ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+    TRY.
+        mo_cut->set_entity_name( gc_root_entity_name ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_name_mde(  ).
+        lv_name = mo_cut->rap_node_objects-meta_data_extension.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+  ENDMETHOD.
+
+
+  METHOD set_behavior_def_i_name.
+    "check
+    TEST-INJECTION runs_as_cut.
+      is_test_run = abap_true.
+    END-TEST-INJECTION.
+
+    DATA(lv_expected_name) = |{ gc_namespace_z  }I_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+
+    DATA lv_name TYPE string.
+    " Given is a node object
+
+    TRY.
+        mo_cut = NEW #( ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_entity_name( gc_root_entity_name ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_name_behavior_def_r(  ).
+        lv_name = mo_cut->rap_root_node_objects-behavior_definition_r.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD set_behavior_def_p_name.
+
+    TEST-INJECTION runs_as_cut.
+      is_test_run = abap_true.
+    END-TEST-INJECTION.
+
+    DATA(lv_expected_name) = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+
+    DATA lv_name TYPE string.
+    " Given is a node object
+    TRY.
+        mo_cut = NEW #( ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_entity_name( gc_root_entity_name ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_name_behavior_def_p(  ).
+        lv_name = mo_cut->rap_root_node_objects-behavior_definition_p.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD set_behavior_impl_name.
+
+    DATA(lv_expected_name) = |{ gc_namespace_z  }BP_I_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+
+    DATA lv_name TYPE string.
+    " Given is a node object
+
+    TRY.
+        mo_cut = NEW #( ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_entity_name( gc_root_entity_name ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_name_behavior_impl(  ).
+        lv_name = mo_cut->rap_node_objects-behavior_implementation.
+
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD set_entityname.
+
+    DATA(lv_expected_name) = gc_root_entity_name .
+
+    DATA lv_name TYPE string.
+    " Given is a node object
+    TRY.
+        mo_cut = NEW #( ).
+        mo_cut->set_entity_name( gc_root_entity_name ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    lv_name = mo_cut->entityname.
+    cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+    TRY.
+        mo_cut = NEW #( ).
+        mo_cut->set_entity_name( gc_root_ent_contains_blanks ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator .
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+
+    ENDTRY.
+
+    TRY.
+        mo_cut = NEW #(  ).
+        mo_cut->set_entity_name( gc_root_ent_contains_nonalpha ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator .
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD set_service_binding_name.
+
+    TEST-INJECTION runs_as_cut.
+      is_test_run = abap_true.
+    END-TEST-INJECTION.
+
+    "WHEN binding_type_name-odata_v4_ui.
+    " protocol_version = protocol_version_suffix-odata_v4.
+    " binding = binding_type_prefix-ui.
+    " DATA(lv_name) =  |{ namespace }{ binding }{ prefix }{ entityname }{ suffix }{ protocol_version }|.
+    DATA(lv_expected_name) = |{ gc_namespace_z  }{ gc_binding_ui }{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }{ gc_protocol_version_odata_v4 }|.
+
+    DATA lv_name TYPE string.
+    " Given is a node object
+    TRY.
+        mo_cut = NEW #( ).
+
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+*          gc_protocol_version_odata_v4   TYPE sxco_ar_object_name VALUE '_O4',
+*      gc_binding_ui                  TYPE sxco_ar_object_name VALUE 'UI_',
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_binding_type( mo_cut->binding_type_name-odata_v4_ui ).
+
+        mo_cut->set_name_service_binding( ).
+        lv_name = mo_cut->rap_root_node_objects-service_binding.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    " lv_expected_name = |{ gc_namespace_z  }UI_{ gc_root_entity_name_too_long }_M|.
+
+    TRY.
+        mo_cut = NEW #( ).
+        mo_cut->set_entity_name(  gc_root_entity_name_too_long ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_namespace( gc_namespace_z ).
+        "mo_cut->set_prefix( gc_prefix_rap ).
+        "mo_cut->set_suffix( gc_suffix_1234 ).
+        mo_cut->set_name_service_binding( ).
+        lv_name = mo_cut->rap_root_node_objects-service_binding.
+        cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>is_too_long not raised' ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>is_too_long-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>is_too_long-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD set_service_definition_name.
+    TEST-INJECTION runs_as_cut.
+      is_test_run = abap_true.
+    END-TEST-INJECTION.
+
+    " DATA(lv_name) =  |{ namespace }{ prefix }{ entityname }{ suffix }|..
+    DATA(lv_expected_name) = |{ gc_namespace_z  }{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+
+    DATA lv_name TYPE string.
+    " Given is a node object
+    TRY.
+        mo_cut = NEW #( ).
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_name_service_definition(  ).
+        lv_name = mo_cut->rap_root_node_objects-service_definition.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+  ENDMETHOD.
+
+  METHOD create_a_root_node.
+    DATA(lv_expected_name) = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+
+    DATA lv_name TYPE string.
+    DATA root_node_flag TYPE abap_boolean.
+
+
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_is_root_node( ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_data_source_type( mo_cut->data_source_types-table ).
+        "parameters are not mandatory
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        "node specific settings
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_data_source( CONV #( gc_root_table_MU ) ).
+        mo_cut->set_object_id(   CONV #( gc_root_table_sem_key_mu  ) ).
+        mo_cut->set_field_name_uuid( gc_root_table_uuid  ).
+        mo_cut->finalize( ).
+        lv_name = mo_cut->rap_node_objects-cds_view_p.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+        root_node_flag = mo_cut->is_root_node.
+        cl_abap_unit_assert=>assert_equals( exp = abap_true act = root_node_flag ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+  ENDMETHOD.
+
+  METHOD create_root_with_childs.
+
+    DATA lv_name TYPE string.
+    DATA lv_expected_name TYPE string.
+
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_is_root_node( ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_data_source_type( mo_cut->data_source_types-table ).
+        "parameters are not mandatory
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        "node specific settings
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_data_source( CONV #( gc_root_table_MU ) ).
+        mo_cut->set_object_id(   CONV #( gc_root_table_sem_key_mu  ) ).
+        mo_cut->set_field_name_uuid( to_upper( 'travel_uuid' ) ).
+        mo_cut->finalize(  ).
+
+
+        DATA(child1_bo) = mo_cut->add_child( ).
+        child1_bo->set_entity_name( gc_entity_child1 ).
+        child1_bo->set_data_source( 'ZDMO_a_booking_d' ).
+        child1_bo->set_object_id( 'BOOKING_ID' ).
+        child1_bo->set_field_name_uuid( to_upper( 'booking_uuid' ) ).
+        child1_bo->finalize(  ).
+
+        DATA(child2_bo) = mo_cut->add_child( ).
+        child2_bo->set_entity_name( gc_entity_child2 ).
+        child2_bo->set_data_source( 'ZDMO_a_booking_d' ).
+        child2_bo->set_object_id( 'BOOKING_ID' ).
+        child2_bo->set_field_name_uuid( to_upper( 'booking_uuid' ) ).
+        child2_bo->finalize(  ).
+
+        DATA(child11_bo) = child1_bo->add_child( ).
+        child11_bo->set_entity_name( gc_entity_grandchild11  ).
+        child11_bo->set_data_source( 'ZDMO_a_bksuppl_d' ).
+        child11_bo->set_object_id( to_upper( 'booking_supplement_id' ) ).
+        child11_bo->set_field_name_uuid( to_upper( 'booksuppl_uuid' ) ).
+        child11_bo->finalize(  ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        lv_expected_name = |{ gc_namespace_z  }I_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+        lv_name = mo_cut->rap_root_node_objects-behavior_definition_r.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+        lv_expected_name = |{ gc_namespace_z  }I_{ gc_prefix_rap }{ gc_entity_child1 }{ gc_suffix_4711 }|.
+        lv_name = child1_bo->rap_node_objects-cds_view_i.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+        lv_expected_name = |{ gc_namespace_z  }BP_I_{ gc_prefix_rap }{ gc_entity_child2 }{ gc_suffix_4711 }|.
+        lv_name = child2_bo->rap_node_objects-behavior_implementation.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+        lv_expected_name = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_entity_grandchild11 }{ gc_suffix_4711 }|.
+        lv_name = child11_bo->rap_node_objects-cds_view_p.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+        lv_expected_name = |{ gc_root_entity_name }|.
+        lv_name = child11_bo->root_node->entityname.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+  ENDMETHOD.
+
+  METHOD get_fields_from_table.
+
+    DATA(lv_expected_name) = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+
+    DATA(lv_tablename) = gc_grandchild_table_mu.
+    "DATA(lv_tablename) = gc_child_table.
+
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ).
+        mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ).
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        "ZDMO_agency
+        mo_cut->set_table( CONV #( lv_tablename ) ).
+        mo_cut->get_fields( ).
+        DATA(lt_fields) = mo_cut->lt_fields.
+        "cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>root_cause_exception not raised' ).
+        cl_abap_unit_assert=>assert_not_initial(
+          EXPORTING
+            act              = lt_fields
+            msg              = 'No fields retrieved'
+        ).
+        LOOP AT mo_cut->lt_fields  INTO  DATA(ls_header_fields) WHERE  name  <> mo_cut->field_name-client.
+          IF ls_header_fields-name = mo_cut->field_name-root_uuid.
+            DATA(lv_root_uuid) = ls_header_fields-name.
+          ENDIF.
+        ENDLOOP.
+
+        cl_abap_unit_assert=>assert_equals( msg = |Table { lv_tablename } has no field { mo_cut->field_name-root_uuid }| exp = mo_cut->field_name-root_uuid act = lv_root_uuid ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+
+
+    ENDTRY.
+
+
+    "ZDMO_cx_rap_generator=>table_does_not_exist
+  ENDMETHOD.
+
+
+  METHOD get_fields_from_view.
+
+    DATA(lv_expected_name) = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+
+    DATA(lv_view_name) = gc_view_name.
+    "DATA(lv_tablename) = gc_child_table.
+
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-unmanaged_semantic ).
+        mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-cds_view ).
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_object_id( CONV #( gc_view_object_id ) ).
+        mo_cut->set_field_name_etag_master( gc_view_etag_master ).
+        "ZDMO_agency
+        mo_cut->set_cds_view( CONV #( lv_view_name ) ).
+        mo_cut->get_fields( ).
+        DATA(lt_fields) = mo_cut->lt_fields.
+        "cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>root_cause_exception not raised' ).
+        cl_abap_unit_assert=>assert_not_initial(
+          EXPORTING
+            act              = lt_fields
+            msg              = 'No fields retrieved'
+        ).
+*        LOOP AT mo_cut->lt_fields  INTO  DATA(ls_header_fields) WHERE  name  <> mo_cut->field_name-client.
+*          IF ls_header_fields-name = mo_cut->field_name-etag_master.
+*            DATA(lv_etag_master) = ls_header_fields-name.
+*          ENDIF.
+*        ENDLOOP.
+        READ TABLE mo_cut->lt_fields WITH KEY name = mo_cut->field_name-etag_master INTO DATA(ls_etag_master).
+        IF sy-subrc = 0.
+          DATA(lv_etag_master) = ls_etag_master-name.
+        ENDIF.
+        cl_abap_unit_assert=>assert_equals( msg = |View { lv_view_name } has no field { mo_cut->field_name-etag_master }| exp = mo_cut->field_name-etag_master act = lv_etag_master ).
+
+
+        DATA(no_data_element_internal_type) = abap_false.
+
+        LOOP AT mo_cut->lt_fields  INTO  DATA(ls_header_fields).
+
+          IF ls_header_fields-is_built_in_type = abap_false AND
+             ls_header_fields-is_data_element = abap_false.
+
+            cl_abap_unit_assert=>fail( msg = |Data source: { mo_cut->data_source_name } Field: { ls_header_Fields-name }  No data element and internal type found. | ).
+
+          ENDIF.
+        ENDLOOP.
+
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+
+
+    ENDTRY.
+
+
+
+  ENDMETHOD.
+
+  METHOD get_fields_from_view_entity.
+
+    DATA(lv_expected_name) = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+
+    DATA(lv_view_name) = gc_view_entity_name.
+    "DATA(lv_tablename) = gc_child_table.
+
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-unmanaged_semantic ).
+        mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-cds_view ).
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_object_id( CONV #( gc_view_entity_object_id ) ).
+        mo_cut->set_field_name_etag_master( gc_view_entity_etag_master ).
+        "ZDMO_agency
+        mo_cut->set_cds_view( CONV #( lv_view_name ) ).
+        mo_cut->get_fields( ).
+        DATA(lt_fields) = mo_cut->lt_fields.
+        "cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>root_cause_exception not raised' ).
+        cl_abap_unit_assert=>assert_not_initial(
+          EXPORTING
+            act              = lt_fields
+            msg              = 'No fields retrieved'
+        ).
+
+*        LOOP AT mo_cut->lt_fields  INTO  DATA(ls_header_fields) WHERE  name  <> mo_cut->field_name-client.
+*          IF ls_header_fields-name = mo_cut->field_name-etag_master.
+*            DATA(lv_etag_master) = ls_header_fields-name.
+*          ENDIF.
+*        ENDLOOP.
+
+        READ TABLE mo_cut->lt_fields WITH KEY name = mo_cut->field_name-etag_master INTO DATA(ls_etag_master).
+        IF sy-subrc = 0.
+          DATA(lv_etag_master) = ls_etag_master-name.
+        ENDIF.
+
+        cl_abap_unit_assert=>assert_equals( msg = |View { lv_view_name } has no field { mo_cut->field_name-etag_master }| exp = mo_cut->field_name-etag_master act = lv_etag_master ).
+
+
+        DATA(no_data_element_internal_type) = abap_false.
+
+        LOOP AT mo_cut->lt_fields  INTO  DATA(ls_header_fields).
+
+          IF ls_header_fields-is_built_in_type = abap_false AND
+             ls_header_fields-is_data_element = abap_false.
+
+            cl_abap_unit_assert=>fail( msg = |Data source: { mo_cut->data_source_name } Field: { ls_header_Fields-name }  No data element and internal type found. | ).
+
+          ENDIF.
+        ENDLOOP.
+
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+
+
+    ENDTRY.
+
+
+
+  ENDMETHOD.
+
+
+  METHOD get_fields_from_abstractentity.
+
+    DATA(lv_expected_name) = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+
+    DATA(lv_view_name) = gc_abstract_entity_name.
+    "DATA(lv_tablename) = gc_child_table.
+
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-unmanaged_semantic ).
+        mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-cds_view ).
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_object_id( CONV #( gc_abstract_entity_object_id ) ).
+        mo_cut->set_field_name_etag_master( gc_abstract_entity_etag_master ).
+        "ZDMO_agency
+        mo_cut->set_cds_view( CONV #( lv_view_name ) ).
+        mo_cut->get_fields( ).
+        DATA(lt_fields) = mo_cut->lt_fields.
+        "cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>root_cause_exception not raised' ).
+        cl_abap_unit_assert=>assert_not_initial(
+          EXPORTING
+            act              = lt_fields
+            msg              = 'No fields retrieved'
+        ).
+*        LOOP AT mo_cut->lt_fields  INTO  DATA(ls_header_fields) WHERE  name  <> mo_cut->field_name-client.
+*          IF ls_header_fields-name = mo_cut->field_name-etag_master.
+*            DATA(lv_etag_master) = ls_header_fields-name.
+*          ENDIF.
+*        ENDLOOP.
+
+        READ TABLE mo_cut->lt_fields WITH KEY name = mo_cut->field_name-etag_master INTO DATA(ls_etag_master).
+        IF sy-subrc = 0.
+          DATA(lv_etag_master) = ls_etag_master-name.
+        ENDIF.
+
+        cl_abap_unit_assert=>assert_equals( msg = |View { lv_view_name } has no field { mo_cut->field_name-etag_master }| exp = mo_cut->field_name-etag_master act = lv_etag_master ).
+
+
+        DATA(no_data_element_internal_type) = abap_false.
+
+        LOOP AT mo_cut->lt_fields  INTO  DATA(ls_header_fields).
+
+          IF ls_header_fields-is_built_in_type = abap_false AND
+             ls_header_fields-is_data_element = abap_false.
+
+            cl_abap_unit_assert=>fail( msg = |Data source: { mo_cut->data_source_name } Field: { ls_header_Fields-name }  No data element and internal type found. | ).
+
+          ENDIF.
+        ENDLOOP.
+
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+
+
+    ENDTRY.
+
+
+
+  ENDMETHOD.
+
+
+  METHOD set_table.
+    DATA(lv_expected_name) = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node(  ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+
+    TRY.
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ).
+
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_table( 'DoesNotExist' ).
+        cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>table_does_not_exist not raised' ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>table_does_not_exist-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>table_does_not_exist-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+
+
+    ENDTRY.
+    "ZDMO_cx_rap_generator=>table_does_not_exist
+  ENDMETHOD.
+
+  METHOD check_set_objectid_wo_data_src.
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node( ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+
+
+
+
+    TRY.
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_data_source_type( mo_cut->data_source_types-table ).
+        mo_cut->set_implementation_type( mo_cut->implementation_type-managed_uuid  ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        "mo_cut->set_table( CONV #( gc_root_table_MU ) ).
+        mo_cut->set_object_id(   CONV #( gc_root_table_sem_key_mu  ) ).
+        mo_cut->finalize(  ).
+        cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>no_datasource_set not raised' ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>no_data_source_set-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>no_data_source_set-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD check_for_key_field_uuid.
+
+    TEST-INJECTION get_mock_data_fields.
+
+      lt_fields = VALUE #(
+     ( name = 'CLIENT' key_indicator = 'X'  not_null = 'X' cds_view_field = 'Client' )
+     "( name = 'UUID' key_indicator = 'X'  not_null = 'X' cds_view_field = 'Uuid' )
+     ( name = 'TRAVEL_ID' cds_view_field = 'TravelId' )
+     ( name = 'AGENCY_ID' cds_view_field = 'AgencyId' )
+     ( name = 'CUSTOMER_ID' cds_view_field = 'CustomerId' )
+     ( name = 'BEGIN_DATE' cds_view_field = 'BeginDate' )
+     ( name = 'END_DATE' cds_view_field = 'EndDate' )
+     ( name = 'BOOKING_FEE' cds_view_field = 'BookingFee' )
+     ( name = 'TOTAL_PRICE' cds_view_field = 'TotalPrice' )
+     ( name = 'CURRENCY_CODE' cds_view_field = 'CurrencyCode' )
+     ( name = 'DESCRIPTION' cds_view_field = 'Description' )
+     ( name = 'OVERALL_STATUS' cds_view_field = 'OverallStatus' )
+     ( name = 'CREATED_BY' cds_view_field = 'CreatedBy' )
+     ( name = 'CREATED_AT' cds_view_field = 'CreatedAt' )
+     ( name = 'LAST_CHANGED_BY' cds_view_field = 'LastChangedBy' )
+     ( name = 'LAST_CHANGED_AT' cds_view_field = 'LastChangedAt' )
+     ).
+
+    END-TEST-INJECTION.
+
+
+    TRY.
+
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+
+
+
+
+    TRY.
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ).
+
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+
+
+        mo_cut->set_data_source( CONV #( gc_root_table_MU ) ).
+        mo_cut->set_object_id( CONV sxco_ad_field_name( gc_root_table_sem_key_mu )    ).
+        mo_cut->finalize(  ).
+
+        cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>field_uuid_missing not raised' ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_uuid_missing-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_uuid_missing-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+
+    ENDTRY.
+
+
+  ENDMETHOD.
+
+  METHOD check_for_client_field.
+    TEST-INJECTION get_mock_data_fields.
+
+      lt_fields = VALUE #(
+     ( name = 'WRONGCLIENT' key_indicator = 'X'   not_null = 'X' cds_view_field = 'Client' )
+     ( name = 'UUID' key_indicator = 'X'  data_element = 'SYSUUID_X16' not_null = 'X' cds_view_field = 'Uuid' )
+     ( name = 'TRAVEL_ID' cds_view_field = 'TravelId' )
+     ( name = 'AGENCY_ID' cds_view_field = 'AgencyId' )
+     ( name = 'CUSTOMER_ID' cds_view_field = 'CustomerId' )
+     ( name = 'BEGIN_DATE' cds_view_field = 'BeginDate' )
+     ( name = 'END_DATE' cds_view_field = 'EndDate' )
+     ( name = 'BOOKING_FEE' cds_view_field = 'BookingFee' )
+     ( name = 'TOTAL_PRICE' cds_view_field = 'TotalPrice' )
+     ( name = 'CURRENCY_CODE' cds_view_field = 'CurrencyCode' )
+     ( name = 'DESCRIPTION' cds_view_field = 'Description' )
+     ( name = 'OVERALL_STATUS' cds_view_field = 'OverallStatus' )
+     ( name = 'CREATED_BY' cds_view_field = 'CreatedBy' )
+     ( name = 'CREATED_AT' cds_view_field = 'CreatedAt' )
+     ( name = 'LAST_CHANGED_BY' cds_view_field = 'LastChangedBy' )
+     ( name = 'LAST_CHANGED_AT' cds_view_field = 'LastChangedAt' )
+     ).
+
+    END-TEST-INJECTION.
+
+
+    TRY.
+
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+
+
+
+
+    TRY.
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ).
+
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+
+
+        mo_cut->set_data_source( CONV #( gc_root_table_MU ) ).
+        mo_cut->set_object_id( CONV sxco_ad_field_name( gc_root_table_sem_key_mu )    ).
+        mo_cut->finalize(  ).
+
+        cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>CLNT_is_not_key_field not raised' ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>CLNT_is_not_key_field-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>CLNT_is_not_key_field-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD check_for_parent_key_field.
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+
+
+
+
+    TRY.
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ).
+
+
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_root( mo_cut  ).
+        mo_cut->set_parent( mo_cut ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ).
+        mo_cut->set_object_id( CONV #( gc_root_table_sem_key_mu ) ).
+        mo_cut->set_table( CONV #( gc_root_table_MU ) ).
+        mo_cut->set_field_name_uuid( gc_root_table_uuid  ).
+        mo_cut->set_object_id( CONV sxco_ad_field_name( gc_root_table_sem_key_mu )    ).
+        " mo_cut->set_semantic_key_fields( VALUE #( ( CONV #( gc_root_table_sem_key_mu  ) ) ) ).
+        mo_cut->finalize(  ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        DATA(child1_bo) = mo_cut->add_child(  ).
+        child1_bo->set_entity_name( gc_entity_child1 ).
+        child1_bo->set_table( iv_table = CONV #( gc_child_table_MU ) ).
+        child1_bo->set_object_id( CONV #( gc_child_table_sem_key_mu ) ).
+        child1_bo->set_field_name_uuid( gc_child_table_uuid  ).
+        child1_bo->set_field_name_parent_uuid( 'does_not_exist'  ).
+        child1_bo->finalize(  ).
+
+        cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>field_parent_uuid_missing not raised' ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_parent_uuid_missing-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_parent_uuid_missing-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+
+
+    ENDTRY.
+
+  ENDMETHOD.
+
+  METHOD check_for_root_key_field.
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+
+
+
+
+    TRY.
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ).
+        mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ).
+
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_root( mo_cut  ).
+        mo_cut->set_parent( mo_cut ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_object_id( CONV #( gc_root_table_sem_key_mu ) ).
+        mo_cut->set_table( CONV #( gc_root_table_MU ) ).
+        mo_cut->set_field_name_uuid( gc_root_table_uuid ).
+        "mo_cut->set_semantic_key_fields( VALUE #( ( CONV #( gc_root_table_sem_key_mu  ) ) ) ).
+        mo_cut->finalize(  ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        DATA(child1_bo) = mo_cut->add_child( ).
+        child1_bo->set_entity_name( gc_entity_child1 ).
+        child1_bo->set_table( iv_table = CONV #( gc_child_table_MU ) ).
+        "child1_bo->set_semantic_key_fields( it_semantic_key = VALUE #( ( CONV #( gc_child_table_sem_key_mu ) ) ) ).
+        child1_bo->set_object_id( CONV #( gc_child_table_sem_key_mu ) ).
+        child1_bo->set_field_name_uuid( gc_child_table_uuid ).
+        child1_bo->finalize(  ).
+
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+
+    ENDTRY.
+
+    TRY.
+        DATA(child11_bo) = child1_bo->add_child( ).
+        child11_bo->set_entity_name( gc_entity_grandchild11 ).
+        child11_bo->set_table( iv_table = CONV #( gc_grandchild_table_mu ) ).
+        "child11_bo->set_semantic_key_fields( it_semantic_key = VALUE #( ( CONV #( gc_child_table_sem_key_mu ) ) ) ).
+        child11_bo->set_object_id( CONV #( gc_grandchild_table_sem_key_mu ) ).
+        child11_bo->set_field_name_uuid( gc_grand_child_table_uuid ).
+        child11_bo->set_field_name_root_uuid( 'does_not_exist' ).
+        child11_bo->finalize(  ).
+
+        cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>field_root_uuid_missing not raised' ).
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_root_uuid_missing-msgid
+                                            act = lx_rap_generator->if_t100_message~t100key-msgid ).
+
+        cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_root_uuid_missing-msgno
+                                            act = lx_rap_generator->if_t100_message~t100key-msgno ).
+
+
+    ENDTRY.
+  ENDMETHOD.
+
+  METHOD create_root_with_childs_u.
+    DATA lv_name TYPE string.
+    DATA lv_expected_name TYPE string.
+
+    TRY.
+        mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ).
+      CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator).
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+        mo_cut->set_is_root_node(  ).
+        mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-unmanaged_semantic ).
+
+        mo_cut->set_entity_name(  gc_root_entity_name ).
+        mo_cut->set_root( mo_cut  ).
+        mo_cut->set_parent( mo_cut ).
+        mo_cut->set_object_id(   CONV #( gc_root_table_sem_key_mu  ) ).
+        mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ).
+        mo_cut->set_namespace( gc_namespace_z ).
+        mo_cut->set_prefix( gc_prefix_rap ).
+        mo_cut->set_suffix( gc_suffix_4711 ).
+        mo_cut->set_table( 'ZDMO_TRAVEL' ).
+        mo_cut->set_semantic_key_fields( VALUE #( ( 'TRAVEL_ID' ) ) ).
+        mo_cut->set_field_name_etag_master( gc_etag_master_mu ).
+        mo_cut->finalize(  ).
+
+        DATA(child1_bo) = mo_cut->add_child(  ).
+        child1_bo->set_entity_name( gc_entity_child1 ).
+        child1_bo->set_table( iv_table = 'ZDMO_BOOKING' ).
+        child1_bo->set_object_id( 'BOOKING_ID' ).
+        child1_bo->set_semantic_key_fields( it_semantic_key = VALUE #( ( 'BOOKING_ID' ) ( 'TRAVEL_ID' ) ) ).
+        child1_bo->finalize(  ).
+
+        DATA(child2_bo) = mo_cut->add_child(  ).
+        child2_bo->set_entity_name( gc_entity_child2 ).
+        child2_bo->set_table( iv_table = 'ZDMO_BOOKING' ).
+        child2_bo->set_object_id( 'BOOKING_ID' ).
+        child2_bo->set_semantic_key_fields( it_semantic_key = VALUE #( ( 'BOOKING_ID' ) ( 'TRAVEL_ID' ) ) ).
+        child2_bo->finalize(  ).
+
+
+        DATA(child11_bo) = child1_bo->add_child(  ).
+        child11_bo->set_entity_name( gc_entity_grandchild11 ).
+        child11_bo->set_table( iv_table = 'ZDMO_BOOK_SUPPL' ).
+        child11_bo->set_semantic_key_fields( it_semantic_key = VALUE #( ( 'BOOKING_SUPPLEMENT_ID' ) ( 'BOOKING_ID' ) ( 'TRAVEL_ID' ) ) ).
+        child11_bo->set_object_id( 'BOOKING_SUPPLEMENT_ID').
+        child11_bo->finalize(  ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+
+    TRY.
+
+        lv_expected_name = |{ gc_namespace_z  }I_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|.
+        lv_name = mo_cut->rap_root_node_objects-behavior_definition_r.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+        lv_expected_name = |{ gc_namespace_z  }I_{ gc_prefix_rap }{ gc_entity_child1 }{ gc_suffix_4711 }|.
+        lv_name = child1_bo->rap_node_objects-cds_view_i.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+        lv_expected_name = |{ gc_namespace_z  }BP_I_{ gc_prefix_rap }{ gc_entity_child2 }{ gc_suffix_4711 }|.
+        lv_name = child2_bo->rap_node_objects-behavior_implementation.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+        lv_expected_name = |{ gc_namespace_z  }C_{ gc_prefix_rap }{ gc_entity_grandchild11 }{ gc_suffix_4711 }|.
+        lv_name = child11_bo->rap_node_objects-cds_view_p.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+        lv_expected_name = |{ gc_root_entity_name }|.
+        lv_name = child11_bo->root_node->entityname.
+        cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ).
+
+      CATCH ZDMO_cx_rap_generator INTO lx_rap_generator.
+        cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text(  ) ).
+    ENDTRY.
+  ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_node.clas.xml b/src/zdmo_cl_rap_node.clas.xml
new file mode 100644
index 0000000..782556b
--- /dev/null
+++ b/src/zdmo_cl_rap_node.clas.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_NODE</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>node proxy base class</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+    <WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_xco_cloud_lib.clas.abap b/src/zdmo_cl_rap_xco_cloud_lib.clas.abap
new file mode 100644
index 0000000..1bfa706
--- /dev/null
+++ b/src/zdmo_cl_rap_xco_cloud_lib.clas.abap
@@ -0,0 +1,266 @@
+CLASS zdmo_cl_rap_xco_cloud_lib DEFINITION INHERITING FROM ZDMO_cl_rap_xco_lib
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+
+    METHODS get_aggregated_annotations REDEFINITION.
+    METHODS get_behavior_definition REDEFINITION.
+    METHODS get_class REDEFINITION.
+    METHODS get_database_table REDEFINITION.
+    METHODS get_data_definition REDEFINITION.
+    METHODS get_metadata_extension REDEFINITION.
+    METHODS get_package REDEFINITION.
+    METHODS get_service_binding REDEFINITION.
+    METHODS get_service_definition REDEFINITION.
+    METHODS get_structure REDEFINITION.
+    METHODS get_view_entity REDEFINITION.
+    METHODS get_view REDEFINITION.
+    METHODS get_entity REDEFINITION.
+    METHODS get_abstract_entity REDEFINITION.
+    METHODS get_views REDEFINITION.
+    METHODS get_tables REDEFINITION.
+    METHODS get_structures REDEFINITION.
+    METHODS get_packages REDEFINITION.
+    METHODS service_binding_is_published REDEFINITION.
+    METHODS get_abap_obj_directory_entry REDEFINITION.
+    METHODS get_objects_in_package REDEFINITION.
+
+    METHODS publish_service_binding REDEFINITION.
+    METHODS un_publish_service_binding REDEFINITION.
+
+    METHODS get_sap_object_node_type REDEFINITION.
+    METHODS get_sap_object_type REDEFINITION.
+
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+
+
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_XCO_CLOUD_LIB IMPLEMENTATION.
+
+
+  METHOD get_abap_obj_directory_entry.
+    SELECT SINGLE * FROM
+     I_CustABAPObjDirectoryEntry "ObjDirectoryEntry
+     WHERE ABAPObjectType = @i_abap_object_type
+       AND ABAPObjectCategory = @i_abap_object_category
+       AND ABAPObject = @i_abap_object
+       INTO CORRESPONDING FIELDS OF @r_abap_object_directory_entry.
+  ENDMETHOD.
+
+
+  METHOD get_abstract_entity.
+    ro_abstract_entity = xco_cp_cds=>abstract_entity( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD  get_aggregated_annotations.
+    ro_aggregated_annotations = xco_cp_cds=>annotations->aggregated->of( io_field ).
+  ENDMETHOD.
+
+
+  METHOD  get_behavior_definition.
+    ro_behavior_definition = xco_cp_abap_repository=>object->bdef->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD  get_class.
+    ro_class = xco_cp_abap_repository=>object->clas->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD  get_database_table.
+    ro_table = xco_cp_abap_repository=>object->tabl->database_table->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD  get_data_definition.
+    ro_data_definition = xco_cp_abap_repository=>object->ddls->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD get_entity.
+    ro_entity = xco_cp_cds=>entity( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD  get_metadata_extension.
+    ro_metadata_extension  = xco_cp_abap_repository=>object->ddlx->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD get_objects_in_package.
+    SELECT * FROM I_CustABAPObjDirectoryEntry WHERE ABAPPackage = @i_package
+                                              INTO CORRESPONDING FIELDS OF TABLE @r_objects_in_package .
+  ENDMETHOD.
+
+
+  METHOD  get_package.
+    ro_package = xco_cp_abap_repository=>object->devc->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD get_packages.
+    IF it_filters IS NOT INITIAL.
+      rt_packages =  xco_cp_abap_repository=>objects->devc->where( it_Filters
+*       VALUE #(
+*                                              ( io_filter )
+*                                              )
+                                              )->in( xco_cp_abap=>repository )->get( ).
+    ELSE.
+      rt_packages = xco_cp_abap_repository=>objects->devc->all->in( xco_cp_abap=>repository )->get( ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_sap_object_node_type.
+    ro_sap_object_node_type = xco_cp_abap_repository=>object->nont->for( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD get_sap_object_type.
+    ro_sap_object_type = xco_cp_abap_repository=>object->ront->for( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD  get_service_binding.
+    ro_service_binding = xco_cp_abap_repository=>object->srvb->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD  get_service_definition.
+    ro_service_definition = xco_cp_abap_repository=>object->srvd->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD  get_structure.
+    ro_structure = xco_cp_abap_repository=>object->tabl->structure->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD get_structures.
+    IF it_filters IS NOT INITIAL.
+      rt_structures =  xco_cp_abap_repository=>objects->tabl->structures->where( it_filters
+*       VALUE #(
+*                                              ( io_filter )
+*                                              )
+                                              )->in( xco_cp_abap=>repository )->get( ).
+    ELSE.
+      rt_structures = xco_cp_abap_repository=>objects->tabl->structures->all->in( xco_cp_abap=>repository )->get( ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_tables.
+    IF it_filters IS NOT INITIAL.
+      rt_tables = xco_cp_abap_repository=>objects->tabl->database_tables->where( it_filters
+*      VALUE #(
+*                                  ( io_filter )
+*                                  )
+                                  )->in( xco_cp_abap=>repository )->get( ).
+
+    ELSE.
+      rt_tables = xco_cp_abap_repository=>objects->tabl->database_tables->all->in( xco_cp_abap=>repository )->get( ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_view.
+    ro_view = xco_cp_cds=>view( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD get_views.
+    IF it_filters IS NOT INITIAL.
+      rt_data_definitions =  xco_cp_abap_repository=>objects->ddls->where( it_filters
+*                                             VALUE #(
+*                                              ( io_filter )
+*                                              )
+                                              )->in( xco_cp_abap=>repository )->get( ).
+    ELSE.
+      rt_data_definitions = xco_cp_abap_repository=>objects->ddls->all->in( xco_cp_abap=>repository )->get( ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_view_entity.
+    ro_view_entity = xco_cp_cds=>view_entity( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD publish_service_binding.
+*    DATA(lo_service_binding) = xco_cp_abap_repository=>object->srvb->for( '$SERVICE_BINDING_NAME$' ).
+
+    DATA(lo_service_binding) = get_service_binding( i_service_binding ).
+
+    " First we check whether the local service endpoint for LO_SERVICE_BINDING is
+    " currently published.
+    DATA(lv_is_published) = xco_cp_service_binding=>local_service_endpoint->odata_v4->is_published( lo_service_binding ).
+
+    " Depending on whether the local service endpoint is currently published we either
+    " trigger an unpublish or a publish of the local service endpoint.
+    DATA lo_operation TYPE REF TO if_xco_srvb_operation.
+
+    IF lv_is_published EQ abap_false.
+*      lo_operation = xco_cp_service_binding=>local_service_endpoint->odata_v4->operation->unpublish( lo_service_binding ).
+*    ELSE.
+      lo_operation = xco_cp_service_binding=>local_service_endpoint->odata_v4->operation->publish( lo_service_binding ).
+      " Note that both a publish as well as an unpublish operation are concrete
+      " realizations of an IF_XCO_SRVB_OPERATION and can thus be treated uniformly.
+      " Regardless of the concrete realization of the operation, its execution can
+      " always be triggered via the method EXECUTE.
+      lo_operation->execute( ).
+    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD service_binding_is_published.
+    r_is_published = abap_false.
+
+    "object names in I_CustABAPObjDirectoryEntry are stored in upper case
+    "( ABAPObjectCategory = 'R3TR' ABAPObjectType = 'SIA6' ABAPObject = 'ZUI_BDTSTRAVEL_O4_0001_G4BA_IBS'
+
+    DATA(filter_string) = to_upper( i_service_binding && '%' ).
+
+    SELECT * FROM I_CustABAPObjDirectoryEntry WHERE ABAPObject LIKE @filter_string
+                                                AND ABAPObjectType = 'SIA6'
+                                               INTO TABLE @DATA(published_srvb_entries).
+
+    IF lines( published_srvb_entries ) > 0.
+      r_is_published = abap_true.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD un_publish_service_binding.
+
+    DATA(lo_service_binding) = get_service_binding( i_service_binding ).
+
+    " First we check whether the local service endpoint for LO_SERVICE_BINDING is
+    " currently published.
+    DATA(lv_is_published) = xco_cp_service_binding=>local_service_endpoint->odata_v4->is_published( lo_service_binding ).
+
+    " Depending on whether the local service endpoint is currently published we either
+    " trigger an unpublish or a publish of the local service endpoint.
+    DATA lo_operation TYPE REF TO if_xco_srvb_operation.
+
+    IF lv_is_published EQ abap_true.
+      lo_operation = xco_cp_service_binding=>local_service_endpoint->odata_v4->operation->unpublish( lo_service_binding ).
+*    ELSE.
+*      lo_operation = xco_cp_service_binding=>local_service_endpoint->odata_v4->operation->publish( lo_service_binding ).
+      " Note that both a publish as well as an unpublish operation are concrete
+      " realizations of an IF_XCO_SRVB_OPERATION and can thus be treated uniformly.
+      " Regardless of the concrete realization of the operation, its execution can
+      " always be triggered via the method EXECUTE.
+      lo_operation->execute( ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_xco_cloud_lib.clas.xml b/src/zdmo_cl_rap_xco_cloud_lib.clas.xml
new file mode 100644
index 0000000..c13172e
--- /dev/null
+++ b/src/zdmo_cl_rap_xco_cloud_lib.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_XCO_CLOUD_LIB</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>xco cloud apis</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_xco_json_visitor.clas.abap b/src/zdmo_cl_rap_xco_json_visitor.clas.abap
new file mode 100644
index 0000000..12989c9
--- /dev/null
+++ b/src/zdmo_cl_rap_xco_json_visitor.clas.abap
@@ -0,0 +1,969 @@
+CLASS zdmo_cl_rap_xco_json_visitor DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES:
+      if_xco_json_tree_visitor.
+    DATA root_node  TYPE REF TO ZDMO_cl_rap_node READ-ONLY.
+
+    METHODS constructor
+      IMPORTING io_root_node TYPE REF TO ZDMO_cl_rap_node
+      RAISING   ZDMO_cx_rap_generator.
+
+    DATA visits                     TYPE string_table READ-ONLY.
+
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+
+    TYPES: BEGIN OF t_valuehelp,
+             alias              TYPE sxco_ddef_alias_name,
+             name               TYPE sxco_cds_object_name,
+             local_element      TYPE sxco_cds_field_name,
+             element            TYPE sxco_cds_field_name,
+             additional_binding TYPE ZDMO_cl_rap_node=>tt_addtionalbinding,
+             useforvalidation   TYPE abap_bool,
+           END OF t_valuehelp.
+
+    TYPES: BEGIN OF t_association,
+             name             TYPE sxco_ddef_alias_name,
+             target           TYPE sxco_cds_object_name,
+             cardinality      TYPE string,
+             condition_fields TYPE ZDMO_cl_rap_node=>tt_condition_fields,
+           END OF t_association.
+
+*    TYPES : BEGIN OF t_objects_with_add_fields,
+*              object            TYPE string,
+*              additional_fields TYPE ZDMO_cl_rap_node=>tt_additional_fields_old,
+*              "localized         TYPE abap_bool,
+*            END OF t_objects_with_add_fields.
+
+
+    TYPES tt_node_number TYPE STANDARD TABLE OF i.
+
+    DATA:
+
+      json_schema                TYPE string,
+      parent_node                TYPE REF TO ZDMO_cl_rap_node,
+      last_visited_member        TYPE string,
+      current_node               TYPE REF TO ZDMO_cl_rap_node,
+      object_number              TYPE i,
+      array_level                TYPE i,
+      array_level_children       TYPE i,
+      array_level_valuehelps     TYPE i,
+      array_level_associations   TYPE i,
+      array_level_obj_with_add_f TYPE i,
+      in_value_helps             TYPE abap_bool,
+      in_additional_binding      TYPE abap_bool,
+      in_associations            TYPE abap_bool,
+      in_conditions              TYPE abap_bool,
+      in_mapping                 TYPE abap_bool,
+      in_fields                  TYPE abap_bool,
+      "in_objects_with_add_fields TYPE abap_bool,
+      in_additional_fields       TYPE abap_bool,
+      in_keys                    TYPE abap_bool,
+      additional_binding         TYPE ZDMO_cl_rap_node=>ts_additionalbinding,
+      value_help                 TYPE t_valuehelp,
+      condition_fields           TYPE ZDMO_cl_rap_node=>ts_condition_fields,
+      association                TYPE t_association,
+      additional_field           TYPE ZDMO_cl_rap_node=>ts_additional_fields,
+      additional_fields          TYPE ZDMO_cl_rap_node=>tt_additional_fields,
+*      objects_with_add_fields    TYPE t_objects_with_add_fields,
+      field_mappings             TYPE HASHED TABLE OF  if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping
+                                    WITH UNIQUE KEY cds_view_field dbtable_field,
+      field_mapping              TYPE if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping,
+      key_fields                 TYPE TABLE OF sxco_ad_field_name,
+      field                      TYPE ZDMO_cl_rap_node=>ts_field,
+      fields                     TYPE ZDMO_cl_rap_node=>tt_fields,
+      node_number_stack          TYPE tt_node_number.
+
+    DATA last_entity TYPE string.
+
+    METHODS in_any_array RETURNING VALUE(r_in_any_array) TYPE abap_bool.
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_XCO_JSON_VISITOR IMPLEMENTATION.
+
+
+  METHOD constructor.
+    root_node = io_root_node.
+  ENDMETHOD.
+
+
+  METHOD if_xco_json_tree_visitor~enter_array.
+    array_level += 1.
+    CASE last_visited_member.
+      WHEN 'keys'.
+        CLEAR key_fields.
+        in_keys = abap_true.
+      WHEN 'children'.
+        APPEND |Enter array , node_number { current_node->node_number } , last_visited_member { last_visited_member }  , entity { current_node->entityname }| TO visits.
+
+*        IF current_node->is_child(  ) OR current_node->is_grand_child_or_deeper(  ).
+*          parent_node = current_node.
+*        ENDIF.
+        parent_node = current_node.
+
+*        in_children = abap_true.
+        array_level_children = array_level.
+      WHEN 'valuehelps'.
+        in_value_helps = abap_true.
+        array_level_valuehelps = array_level.
+      WHEN 'additionalbinding'.
+        in_additional_binding = abap_true.
+      WHEN 'associations'.
+        in_associations = abap_true.
+        array_level_associations = array_level.
+      WHEN 'conditions'.
+        in_conditions = abap_true.
+*      WHEN 'objectswithadditionalfields'.
+*        in_objects_with_add_fields = abap_true.
+*        array_level_obj_with_add_f = array_level.
+      WHEN 'additionalfields'.
+        in_additional_fields = abap_true.
+      WHEN 'mapping'.
+        in_mapping = abap_true.
+      WHEN 'fields'.
+        in_fields = abap_true.
+      WHEN OTHERS.
+        RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+          EXPORTING
+            textid   = ZDMO_cx_rap_generator=>invalid_json_array_name
+            mv_value = last_visited_member.
+    ENDCASE.
+
+  ENDMETHOD.
+
+
+  METHOD if_xco_json_tree_visitor~enter_object.
+
+    object_number += 1.
+
+    IF last_visited_member = 'hierarchy'.
+      DATA(a) = 1.
+    ENDIF.
+
+    IF in_additional_binding = abap_true.
+      CLEAR additional_binding.
+    ENDIF.
+
+    IF in_conditions = abap_true.
+      CLEAR condition_fields.
+    ENDIF.
+
+    IF in_additional_fields = abap_true.
+      CLEAR additional_field.
+    ENDIF.
+
+    IF in_mapping  = abap_true.
+      CLEAR field_mapping.
+    ENDIF.
+
+    IF in_fields = abap_true.
+      CLEAR field.
+    ENDIF.
+
+
+
+    IF in_additional_binding = abap_false AND
+       in_associations = abap_false AND
+       in_value_helps = abap_false AND
+       in_conditions = abap_false AND
+       in_mapping  = abap_false AND
+       in_fields = abap_false AND
+       "in_objects_with_add_fields = abap_false AND
+       in_additional_fields = abap_false.
+
+      IF object_number > 1.
+
+        DATA(is_in_any_array) = in_any_array(  ).
+
+        IF current_node IS INITIAL.
+          parent_node = root_node.
+          current_node = root_node.
+        ELSE.
+          current_node = parent_node->add_child( ).
+        ENDIF.
+
+        APPEND current_node->node_number TO node_number_stack.
+
+        DATA(msg) = |Enter obj , node_number { current_node->node_number }, last_visited_member { last_visited_member } parent  { parent_node->entityname } last  { last_entity }| .
+        msg = msg && |object number { object_number }|.
+        msg = msg && |array_level { array_level }|.
+        msg = msg && |array_level_children { array_level_children }|.
+        APPEND msg TO visits.
+      ENDIF.
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD if_xco_json_tree_visitor~leave_array.
+
+    array_level -= 1.
+
+    IF in_additional_binding = abap_true .
+      in_additional_binding = abap_false.
+    ELSEIF in_value_helps = abap_true .
+      in_value_helps = abap_false.
+    ELSEIF in_conditions = abap_true.
+      in_conditions = abap_false.
+    ELSEIF in_associations = abap_true.
+      in_associations = abap_false.
+    ELSEIF in_additional_fields = abap_true.
+      in_additional_fields = abap_false.
+
+      IF object_number = 1.
+        root_node->add_additional_fields(
+          EXPORTING
+            "iv_object            = objects_with_add_fields-object
+            it_additional_fields = additional_fields
+        ).
+        CLEAR additional_fields.
+
+      ELSE.
+        current_node->add_additional_fields(
+          EXPORTING
+            "iv_object            = objects_with_add_fields-object
+            it_additional_fields = additional_fields
+        ).
+        CLEAR additional_fields.
+      ENDIF.
+
+*    ELSEIF in_objects_with_add_fields = abap_true.
+*      in_objects_with_add_fields = abap_false.
+
+    ELSEIF in_mapping = abap_true.
+      in_mapping = abap_false.
+
+      IF object_number = 1.
+        root_node->set_mapping(
+            it_field_mappings = field_mappings
+        ).
+        CLEAR field_mappings.
+      ELSE.
+        current_node->set_mapping(
+            it_field_mappings = field_mappings
+        ).
+        CLEAR field_mappings.
+      ENDIF.
+
+    ELSEIF in_fields = abap_true.
+      in_fields = abap_false.
+
+      IF object_number = 1.
+        root_node->set_fields(
+            it_fields = fields
+        ).
+
+      ELSE.
+        current_node->set_fields(
+            it_fields = fields
+        ).
+
+      ENDIF.
+
+*      loop at fields into data(field) where n.
+*
+*
+*      ENDLOOP.
+
+      CLEAR fields.
+      CLEAR field_mappings.
+
+
+    ELSEIF in_keys = abap_true.
+      in_keys = abap_false.
+      current_node->set_semantic_key_fields( key_fields  ).
+      CLEAR key_fields.
+    ELSE.
+
+      DATA(is_in_any_array) = in_any_array(  ).
+      DATA(a) = last_visited_member.
+
+
+
+
+      IF current_node->is_grand_child_or_deeper( ).
+        parent_node = current_node->parent_node->parent_node.
+*        current_node = current_node->parent_node.
+      ENDIF.
+
+      IF current_node->is_child(  ).
+        parent_node = current_node->parent_node.
+*        parent_node = root_node.
+*        current_node = current_node->parent_node.
+      ENDIF.
+
+      APPEND |Leave array , node_number { current_node->node_number } , last_visited_member { last_visited_member }  , entity { current_node->entityname } parent { parent_node->entityname } | TO visits.
+
+
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD if_xco_json_tree_visitor~leave_object.
+
+    object_number -= 1.
+
+    "add valuehelp
+
+    IF in_additional_binding = abap_true.
+      APPEND additional_binding TO value_help-additional_binding.
+    ENDIF.
+
+    IF in_additional_binding = abap_false AND
+     in_value_helps = abap_true.
+      IF object_number = 1.
+        root_node->add_valuehelp(
+          EXPORTING
+            iv_alias              = value_help-alias
+            iv_name               = value_help-name
+            iv_localelement       = value_help-local_element
+            iv_element            = value_help-element
+            it_additional_binding = value_help-additional_binding
+        ).
+        CLEAR value_help.
+*CATCH ZDMO_cx_rap_generator.
+      ELSE.
+        current_node->add_valuehelp(
+                 EXPORTING
+                   iv_alias              = value_help-alias
+                   iv_name               = value_help-name
+                   iv_localelement       = value_help-local_element
+                   iv_element            = value_help-element
+                   it_additional_binding = value_help-additional_binding
+               ).
+        CLEAR value_help.
+      ENDIF.
+    ENDIF.
+
+    " add association
+
+    IF in_conditions = abap_true.
+      APPEND condition_fields TO association-condition_fields.
+    ENDIF.
+
+    IF in_conditions = abap_false AND
+     in_associations = abap_true.
+      IF object_number = 1.
+        root_node->add_association(
+          EXPORTING
+            iv_name             = association-name
+            iv_target           = association-target
+            it_condition_fields = association-condition_fields
+            iv_cardinality      = association-cardinality
+        ).
+*        CATCH ZDMO_cx_rap_generator.
+        CLEAR association.
+*CATCH ZDMO_cx_rap_generator.
+      ELSE.
+        current_node->add_association(
+          EXPORTING
+            iv_name             = association-name
+            iv_target           = association-target
+            it_condition_fields = association-condition_fields
+            iv_cardinality      = association-cardinality
+        ).
+        CLEAR association.
+      ENDIF.
+    ENDIF.
+
+    "add additonal fields
+
+    IF in_additional_fields = abap_true.
+      APPEND additional_field TO additional_fields.
+    ENDIF.
+
+
+
+    "add mapping
+
+    IF in_mapping = abap_true.
+      INSERT field_mapping INTO TABLE field_mappings.
+    ENDIF.
+
+    "add a field to the field list
+    IF in_fields = abap_true.
+      INSERT field INTO TABLE fields.
+    ENDIF.
+
+    "check if we are leaving the object that defines a node
+
+    IF in_any_array(  ) = abap_false.
+
+      DATA(a) = last_visited_member.
+
+      DATA(num_of_childnodes) = lines( root_node->all_childnodes ).
+      DATA(num_of_parentnode) = current_node->parent_node->node_number.
+*      current_node = root_node->all_childnodes[ num_of_childnodes ].
+      APPEND |Leave object , node_number { current_node->node_number } , last_visited_member { last_visited_member }, entity { current_node->entityname } | TO visits.
+    ENDIF.
+    "current_node->finalize( ).
+
+  ENDMETHOD.
+
+
+  METHOD if_xco_json_tree_visitor~on_end.
+
+
+
+    LOOP AT root_node->all_childnodes INTO DATA(childnode).
+      childnode->finalize(  ).
+    ENDLOOP.
+
+    root_node->finalize(  ).
+
+*    DATA(my_bo_generator) = NEW zcl_rap_bo_generator(
+*  iv_package          = root_node->package
+*  io_rap_bo_root_node = root_node
+*  ).
+*
+*    DATA(lt_todos) = my_bo_generator->generate_bo(  ).
+
+  ENDMETHOD.
+
+
+  METHOD if_xco_json_tree_visitor~on_start.
+
+    CLEAR object_number.
+    "root_node = NEW ZDMO_cl_rap_node(  ).
+    "root_node->set_is_root_node( ).
+
+  ENDMETHOD.
+
+
+  METHOD if_xco_json_tree_visitor~visit_boolean.
+    DATA error_message TYPE string.
+*    CHECK iv_value IS NOT INITIAL.
+    IF object_number = 1.
+      CASE last_visited_member.
+
+        WHEN 'transactionalbehavior'.
+          root_node->set_has_transactional_behavior( iv_value ).
+        WHEN 'publishservice'.
+          root_node->set_publish_service( iv_value ).
+        WHEN 'addbasiciviews'.
+          root_node->set_add_basic_i_views( iv_value ).
+        WHEN 'isextensible'.
+          root_node->set_is_extensible( iv_value ).
+        WHEN 'draftenabled'.
+          root_node->set_draft_enabled( iv_value ).
+        WHEN 'addbusinessconfigurationregistration' .
+          root_node->add_to_manage_business_config( iv_value ).
+        WHEN 'skipactivation'.
+          root_node->set_skip_activation( iv_value ).
+        WHEN 'addmetadataextensions'.
+          root_node->set_add_meta_data_extensions( iv_value ).
+        WHEN 'iscustomizingtable'.
+          root_node->set_is_customizing_table( iv_value ).
+        WHEN 'multiinlineedit'.
+          root_node->add_multi_edit( iv_value ).
+        WHEN 'generateonlynodehierachy'.
+          root_node->set_generate_only_node_hierach( iv_value ).
+        WHEN 'createtable'.
+          root_node->set_create_table( iv_value ).
+        WHEN 'mimicadtwizard'.
+          root_node->set_mimic_adt_wizard( iv_value ).
+        when 'addsapobjecttype'  .
+          root_node->set_add_sap_object_type( iv_value ).
+        WHEN OTHERS.
+
+          error_message = |{ last_visited_member } in entity { root_node->entityname }| ##NO_TEXT.
+
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+              mv_value = error_message.
+
+      ENDCASE.
+    ENDIF.
+
+
+    IF object_number > 1.
+
+      IF      in_value_helps = abap_true.
+
+        CASE last_visited_member .
+          WHEN 'useforvalidation' .
+            value_help-useforvalidation = iv_value .
+        ENDCASE.
+
+
+
+      ELSEIF in_additional_fields = abap_true.
+
+        CASE last_visited_member .
+          WHEN 'localized'.
+            additional_field-localized = iv_value.
+          WHEN 'cdsinterfaceview'.
+            additional_field-cds_interface_view = iv_value .
+          WHEN 'cdsRestrictedReuseView'.
+            additional_field-cds_restricted_reuse_view = iv_value .
+          WHEN 'cdsprojectionview'.
+            additional_field-cds_projection_view  = iv_value .
+          WHEN 'drafttable'.
+            additional_field-draft_table   = iv_value .
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in objects with add. fields| ##NO_TEXT.
+
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+      ELSEIF in_fields = abap_true.
+
+        CASE last_visited_member .
+          WHEN 'iskey'.
+            field-key_indicator =  iv_value .
+          WHEN 'notnull'.
+            field-not_null =  iv_value .
+          WHEN 'isdomainfixedvalue'.
+            field-domain_fixed_value =  iv_value .
+          WHEN 'ishidden'.
+            field-is_hidden =  iv_value .
+          WHEN 'hasassociation'.
+            field-has_association =  iv_value .
+          WHEN 'hasvaluehelp'.
+            field-has_valuehelp =  iv_value .
+          WHEN 'isdataelement'.
+            field-is_data_element =  iv_value .
+          WHEN 'isbuiltintype'.
+            field-is_built_in_type =  iv_value .
+          WHEN 'iscurrencycode'.
+            field-is_currencycode =  iv_value .
+          WHEN 'isunitofmeasure'.
+            field-is_unitofmeasure =  iv_value .
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in fields| ##NO_TEXT.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD if_xco_json_tree_visitor~visit_member.
+
+    "we want to use camelCase in the json file
+    "but we do not want to enforce it here
+
+    last_visited_member = to_lower( iv_name ).
+
+    IF in_keys = abap_true.
+      DATA(key_field) = iv_name.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD if_xco_json_tree_visitor~visit_number.
+    DATA error_message TYPE string.
+    CHECK iv_value IS NOT INITIAL.
+    IF object_number = 1.
+      CASE last_visited_member.
+
+*        WHEN 'transactionalbehavior'.
+*          root_node->add_transactional_behavior( iv_value ).
+
+        WHEN OTHERS.
+
+          error_message = |{ last_visited_member } in entity { root_node->entityname }| ##NO_TEXT.
+
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+              mv_value = error_message.
+
+      ENDCASE.
+    ENDIF.
+
+
+    IF object_number > 1.
+
+      IF in_additional_fields = abap_true.
+
+        CASE last_visited_member .
+          WHEN 'builtintypelength'.
+            additional_field-built_in_type_length = iv_value.
+          WHEN 'builtintypedecimals'.
+            additional_field-built_in_type_decimals = iv_value .
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in objects with add. fields| ##NO_TEXT.
+
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+      ELSEIF in_fields = abap_true.
+
+        CASE last_visited_member .
+          WHEN 'builtintypelength'.
+            field-built_in_type_length =  iv_value .
+          WHEN 'builtintypedecimals'.
+            field-built_in_type_decimals =  iv_value .
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in fields| ##NO_TEXT.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD if_xco_json_tree_visitor~visit_string.
+
+    DATA error_message TYPE string.
+
+    IF iv_value IS INITIAL.
+      EXIT.
+    ENDIF.
+
+    IF in_keys = abap_true.
+      APPEND iv_value TO key_fields.
+    ENDIF.
+
+    IF object_number = 1.
+      CASE last_visited_member.
+
+
+        WHEN '$schema'.
+          json_schema = iv_value.
+        WHEN 'implementationtype'.
+          root_node->set_implementation_type( iv_value ).
+        WHEN 'namespace'.
+          root_node->set_namespace( CONV sxco_ar_object_name( iv_value ) ).
+        WHEN 'suffix'.
+          root_node->set_suffix( CONV sxco_ar_object_name( iv_value ) ).
+        WHEN 'prefix'.
+          root_node->set_prefix( CONV sxco_ar_object_name( iv_value ) ).
+        WHEN 'package'.
+          root_node->set_package( CONV sxco_package( iv_value ) ).
+        WHEN 'datasourcetype'.
+          root_node->set_data_source_type( iv_value  ).
+        WHEN 'bindingtype'.
+          root_node->set_binding_type(  iv_value  ).
+        WHEN 'transportrequest'.
+          root_node->set_transport_request( CONV #( iv_value ) ).
+        WHEN 'businessconfigurationname'.
+          root_node->set_mbc_name( iv_value  ).
+        WHEN 'businessconfigurationidentifier'  .
+          root_node->set_mbc_identifier( iv_value ).
+        WHEN 'businessconfigurationdescription'.
+          root_node->set_mbc_description( iv_value ).
+          "WHEN 'extensibilityelementsuffix'.
+          "  root_node->set_ext_element_suffix( iv_value ).
+        WHEN OTHERS.
+
+          error_message = |{ last_visited_member } in entity { root_node->entityname }| ##NO_TEXT.
+
+          RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+            EXPORTING
+              textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+              mv_value = error_message.
+
+      ENDCASE.
+    ENDIF.
+
+    IF object_number > 1.
+
+      IF in_additional_binding = abap_true.
+
+        CASE last_visited_member .
+
+          WHEN 'localelement'.
+            additional_binding-localelement = iv_value.
+          WHEN 'element'.
+            additional_binding-element = iv_value.
+          WHEN 'usage'.
+            additional_binding-usage = iv_value.
+          WHEN OTHERS.
+
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in additionalBinding| ##NO_TEXT.
+
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+      ELSEIF in_value_helps = abap_true.
+
+        CASE last_visited_member .
+          WHEN 'alias' .
+            value_help-alias = CONV sxco_cds_object_name( iv_value ).
+          WHEN 'name' .
+            value_help-name = CONV sxco_cds_object_name( iv_value ).
+          WHEN 'localelement'.
+            value_help-local_element = CONV sxco_cds_field_name( iv_value ).
+          WHEN 'element'.
+            value_help-element = CONV sxco_cds_field_name( iv_value ).
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in valueHelps| ##NO_TEXT.
+
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+
+      ELSEIF in_conditions = abap_true.
+
+        CASE last_visited_member .
+          WHEN 'projectionfield'.
+            condition_fields-projection_field = iv_value.
+          WHEN 'associationfield'.
+            condition_fields-association_field = iv_value.
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in conditions| ##NO_TEXT.
+
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+      ELSEIF in_associations = abap_true.
+
+        CASE last_visited_member .
+          WHEN 'name'.
+            association-name = CONV sxco_ddef_alias_name( iv_value ).
+          WHEN 'target' .
+            association-target = CONV sxco_cds_object_name( iv_value ).
+          WHEN 'cardinality'.
+            association-cardinality = iv_value.
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in associations| ##NO_TEXT.
+
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+      ELSEIF in_additional_fields = abap_true.
+
+        CASE last_visited_member .
+          WHEN 'name'.
+            additional_field-name = iv_value.
+          WHEN 'cdsviewfield'.
+            additional_field-cds_view_field = iv_value.
+          WHEN 'dataelement' .
+            additional_field-data_element  = iv_value.
+          WHEN 'builtintype'  .
+            additional_field-built_in_type = iv_value.
+          WHEN 'builtintypelength'.
+            additional_field-built_in_type_length = iv_value.
+          WHEN 'builtintypedecimals'.
+            additional_field-built_in_type_decimals = iv_value.
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in additional fields| ##NO_TEXT.
+
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+*      ELSEIF in_objects_with_add_fields = abap_true.
+*
+*        CASE last_visited_member .
+*          WHEN 'object'.
+*            objects_with_add_fields-object =  iv_value .
+*
+*          WHEN OTHERS.
+*            error_message = |{ last_visited_member } in entity { current_node->entityname } in objects with add. fields|.
+*
+*            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+*              EXPORTING
+*                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+*                mv_value = error_message.
+*        ENDCASE.
+
+      ELSEIF in_mapping = abap_true.
+        CASE last_visited_member .
+          WHEN 'dbtable_field'.
+            field_mapping-dbtable_field = CONV sxco_cds_field_name( iv_value ).
+          WHEN 'cds_view_field' .
+            field_mapping-cds_view_field = CONV sxco_cds_field_name( iv_value ).
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in mapping| ##NO_TEXT.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+      ELSEIF in_fields = abap_true.
+
+        CASE last_visited_member .
+          WHEN 'abapfieldname'.
+            field-name = CONV sxco_cds_field_name( iv_value ).
+          WHEN 'domain' .
+            field-doma = CONV sxco_cds_field_name( iv_value ).
+          WHEN 'dataelement'.
+            field-data_element = CONV sxco_cds_field_name( iv_value ).
+          WHEN 'cdsviewfieldname'.
+            field-cds_view_field = CONV sxco_cds_field_name( iv_value ).
+          WHEN 'builtintype'.
+            field-built_in_type = CONV sxco_cds_field_name( iv_value ).
+          WHEN 'currencycode'.
+            field-currencycode = CONV sxco_cds_field_name( iv_value ).
+          WHEN 'unitofmeasure'.
+            field-unitofmeasure = CONV sxco_cds_field_name( iv_value ).
+
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname } in fields| ##NO_TEXT.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+        ENDCASE.
+
+
+      ELSEIF in_keys = abap_true.
+        DATA(test) = iv_value.
+      ELSE.
+
+        CASE last_visited_member .
+          WHEN 'keys'.
+            "do nothing
+
+          WHEN 'entityname'.
+            current_node->set_entity_name( CONV #( iv_value ) ).
+            last_entity = iv_value.
+          WHEN 'datasource'.
+            current_node->set_data_source( iv_value  ).
+          WHEN 'persistenttable' .
+            current_node->set_persistent_table(  iv_value  ).
+          WHEN 'objectid'.
+            "current_node->set_semantic_key_fields( it_semantic_key = VALUE #( ( CONV #( iv_value ) ) ) ).
+            current_node->set_object_id( CONV sxco_ad_field_name( iv_value ) ).
+          WHEN 'uuid'.
+            current_node->set_field_name_uuid( iv_value ).
+          WHEN 'parentuuid'.
+            current_node->set_field_name_parent_uuid( iv_value ).
+          WHEN 'rootuuid'.
+            current_node->set_field_name_root_uuid( iv_value ).
+          WHEN 'createdby'.
+            current_node->set_field_name_created_by( iv_value ).
+          WHEN 'createdat'.
+            current_node->set_field_name_created_at( iv_value ).
+          WHEN 'lastchangedby'.
+            current_node->set_field_name_last_changed_by( iv_value ).
+          WHEN 'lastchangedat'.
+            current_node->set_field_name_last_changed_at( iv_value ).
+          WHEN 'localinstancelastchangedat'.
+            current_node->set_field_name_loc_last_chg_at( iv_value ).
+          WHEN 'localinstancelastchangedby'.
+            current_node->set_field_name_loc_last_chg_by( iv_value ).
+          WHEN 'etagmaster'.
+            current_node->set_field_name_etag_master( iv_value ).
+          WHEN 'totaletag'.
+            current_node->set_field_name_total_etag( iv_value ).
+          WHEN 'client'.
+            current_node->set_field_name_client( iv_value ).
+          WHEN 'language'.
+            current_node->set_field_name_language( iv_value ).
+          WHEN 'drafttable'.
+            current_node->set_name_draft_table( iv_value ).
+          WHEN 'cdsinterfaceview' .
+            current_node->set_name_cds_i_view( CONV #( iv_value ) ).
+          WHEN 'cdsinterfaceviewbasic'.
+            current_node->set_name_cds_i_view_basic( CONV #( iv_value ) ).
+          WHEN 'cdsrestrictedreuseview'  .
+            current_node->set_name_cds_r_view( CONV #( iv_value ) ).
+          WHEN 'cdsprojectionview'.
+            current_node->set_name_cds_p_view( CONV #( iv_value ) ).
+          WHEN 'metadataextensionview'.
+            current_node->set_name_mde( CONV #( iv_value ) ).
+          WHEN 'behaviorimplementationclass'.
+            current_node->set_name_behavior_impl( CONV #( iv_value )  ).
+          WHEN 'servicedefinition'.
+            current_node->set_name_service_definition( CONV #( iv_value )  ).
+          WHEN 'servicebinding'.
+            current_node->set_name_service_binding( CONV #( iv_value )  ).
+          WHEN 'controlstructure'.
+            current_node->set_name_control_structure( CONV #( iv_value )  ).
+          WHEN 'customqueryimplementationclass'.
+            current_node->set_name_custom_query_impl( CONV #( iv_value )  ).
+          WHEN 'extensioninclude'.
+            current_node->set_name_extension_include( CONV #( iv_value )  ).
+          WHEN 'extensionincludeview'.
+            current_node->set_name_extension_incl_view( CONV #( iv_value )  ).
+          WHEN 'draftqueryview'.
+            current_node->set_name_draft_query_view( CONV #( iv_value )  ).
+
+          WHEN 'sapobjecttype'.
+            current_node->set_name_sap_object_type( CONV #( iv_value )  ).
+          WHEN 'sapobjectnodetype'.
+            current_node->set_name_sap_node_object_type( CONV #( iv_value )  ).
+
+          WHEN 'extensibilityelementsuffix'.
+            current_node->set_ext_element_suffix(  iv_value ).
+
+          WHEN 'textelement' .
+            error_message = |{ last_visited_member } in entity { current_node->entityname }| ##NO_TEXT.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>not_implemented
+                mv_value = error_message.
+          WHEN 'description'.
+            error_message = |{ last_visited_member } in entity { current_node->entityname }| ##NO_TEXT.
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>not_implemented
+                mv_value = error_message.
+          WHEN OTHERS.
+            error_message = |{ last_visited_member } in entity { current_node->entityname }| ##NO_TEXT.
+
+            RAISE EXCEPTION TYPE ZDMO_cx_rap_generator
+              EXPORTING
+                textid   = ZDMO_cx_rap_generator=>invalid_json_property_name
+                mv_value = error_message.
+
+
+        ENDCASE.
+
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD in_any_array.
+    r_in_any_array = abap_true.
+    IF in_additional_binding = abap_false AND
+       in_additional_fields = abap_false AND
+       in_associations = abap_false AND
+       in_conditions = abap_false AND
+       in_fields = abap_false AND
+       in_keys = abap_false AND
+       in_mapping = abap_false AND
+       in_value_helps = abap_false.
+      r_in_any_array = abap_false.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_xco_json_visitor.clas.xml b/src/zdmo_cl_rap_xco_json_visitor.clas.xml
new file mode 100644
index 0000000..96c9ecb
--- /dev/null
+++ b/src/zdmo_cl_rap_xco_json_visitor.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_XCO_JSON_VISITOR</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>traverse rap json file</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_xco_lib.clas.abap b/src/zdmo_cl_rap_xco_lib.clas.abap
new file mode 100644
index 0000000..528b14f
--- /dev/null
+++ b/src/zdmo_cl_rap_xco_lib.clas.abap
@@ -0,0 +1,336 @@
+CLASS zdmo_cl_rap_xco_lib DEFINITION ABSTRACT
+  PUBLIC
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+
+    TYPES t_abap_obj_directory_entries TYPE STANDARD TABLE OF I_CustABAPObjDirectoryEntry WITH DEFAULT KEY.
+    TYPES t_abap_obj_directory_entry TYPE I_CustABAPObjDirectoryEntry.
+
+    DATA todos TYPE TABLE OF string WITH EMPTY KEY READ-ONLY.
+
+    CLASS-METHODS create_xco_lib
+      RETURNING
+        VALUE(result) TYPE REF TO zdmo_cl_rap_xco_lib.
+
+    METHODS get_service_definition     IMPORTING iv_name                      TYPE sxco_srvd_object_name
+                                       RETURNING VALUE(ro_service_definition) TYPE REF TO if_xco_service_definition  .
+    METHODS get_service_binding        IMPORTING iv_name                   TYPE sxco_srvb_object_name
+                                       RETURNING VALUE(ro_service_binding) TYPE REF TO if_xco_service_binding  .
+    METHODS get_behavior_definition    IMPORTING iv_name                       TYPE sxco_cds_object_name
+                                       RETURNING VALUE(ro_behavior_definition) TYPE REF TO if_xco_behavior_definition  .
+    METHODS get_class                  IMPORTING iv_name         TYPE  sxco_ao_object_name "sxco_cds_object_name
+                                       RETURNING VALUE(ro_class) TYPE REF TO if_xco_ao_class  .
+    METHODS get_package                IMPORTING iv_name           TYPE sxco_package
+                                       RETURNING VALUE(ro_package) TYPE REF TO if_xco_package   .
+    METHODS get_database_table         IMPORTING iv_name         TYPE sxco_dbt_object_name
+                                       RETURNING VALUE(ro_table) TYPE REF TO if_xco_database_table  .
+    METHODS get_structure              IMPORTING iv_name             TYPE  sxco_ad_object_name
+                                       RETURNING VALUE(ro_structure) TYPE REF TO if_xco_ad_structure   .
+    METHODS get_data_definition        IMPORTING iv_name                   TYPE sxco_cds_object_name
+                                       RETURNING VALUE(ro_data_definition) TYPE REF TO if_xco_data_definition .
+    METHODS get_metadata_extension     IMPORTING iv_name                      TYPE sxco_cds_object_name
+                                       RETURNING VALUE(ro_metadata_extension) TYPE REF TO if_xco_metadata_extension  .
+    METHODS get_view_entity            IMPORTING iv_name               TYPE sxco_cds_object_name
+                                       RETURNING VALUE(ro_view_entity) TYPE REF TO if_xco_cds_view_entity .
+    METHODS get_view                   IMPORTING iv_name        TYPE sxco_cds_object_name
+                                       RETURNING VALUE(ro_view) TYPE REF TO if_xco_cds_view .
+    METHODS get_entity                 IMPORTING iv_name          TYPE sxco_cds_object_name
+                                       RETURNING VALUE(ro_entity) TYPE REF TO if_xco_cds_entity .
+    METHODS get_abstract_entity        IMPORTING iv_name                   TYPE sxco_cds_object_name
+                                       RETURNING VALUE(ro_abstract_entity) TYPE REF TO if_xco_cds_entity .
+    METHODS get_sap_object_type        IMPORTING iv_name                   TYPE sxco_cds_object_name
+                                       RETURNING VALUE(ro_sap_object_type) TYPE REF TO if_xco_sap_object_type .
+    METHODS get_sap_object_node_type   IMPORTING iv_name                        TYPE sxco_cds_object_name
+                                       RETURNING VALUE(ro_sap_object_node_type) TYPE REF TO if_xco_sap_object_node_type .
+
+    METHODS get_aggregated_annotations IMPORTING io_field                         TYPE REF TO if_xco_cds_field
+                                       RETURNING VALUE(ro_aggregated_annotations) TYPE REF TO if_xco_cds_annotations .
+    METHODS add_draft_include          IMPORTING table_name TYPE sxco_dbt_object_name.
+
+    METHODS add_include_structure_to_table IMPORTING table_name             TYPE sxco_dbt_object_name
+                                                     extension_include_name TYPE sxco_ad_object_name.
+
+    METHODS add_enh_cat_to_table IMPORTING table_name TYPE sxco_dbt_object_name.
+
+    METHODS add_enh_cat_and_anno_to_struct IMPORTING ext_include_structure_name   TYPE sxco_ad_object_name
+                                                     extensibility_element_suffix TYPE string.
+
+    METHODS method_exists_in_interface IMPORTING interface_name       TYPE any
+                                                 method_name          TYPE c
+                                       RETURNING VALUE(method_exists) TYPE abap_bool.
+    METHODS method_exists_in_class IMPORTING class_name           TYPE any
+                                             method_name          TYPE c
+                                   RETURNING VALUE(method_exists) TYPE abap_bool.
+    METHODS attribute_exists_in_class IMPORTING class_name              TYPE any
+                                                attribute_name          TYPE c
+                                      RETURNING VALUE(attribute_exists) TYPE abap_bool.
+    METHODS attribute_exists_in_interface IMPORTING interface_name          TYPE any
+                                                    attribute_name          TYPE c
+                                          RETURNING VALUE(attribute_exists) TYPE abap_bool.
+
+    METHODS  get_tables                IMPORTING it_filters       TYPE sxco_t_ar_filters OPTIONAL "io_filter type ref to if_xco_ar_filter OPTIONAL
+                                       RETURNING VALUE(rt_tables) TYPE sxco_t_database_tables.
+    METHODS  get_structures            IMPORTING it_filters           TYPE sxco_t_ar_filters OPTIONAL "io_filter type ref to if_xco_ar_filter OPTIONAL
+                                       RETURNING VALUE(rt_structures) TYPE sxco_t_ad_structures .
+    METHODS  get_views                 IMPORTING it_filters                 TYPE sxco_t_ar_filters OPTIONAL"type ref to if_xco_ar_filter OPTIONAL
+                                       RETURNING VALUE(rt_data_definitions) TYPE sxco_t_data_definitions .
+    METHODS  get_packages              IMPORTING it_filters         TYPE sxco_t_ar_filters OPTIONAL"io_filter type ref to if_xco_ar_filter OPTIONAL
+                                       RETURNING VALUE(rt_packages) TYPE sxco_t_packages  .
+
+    METHODS  todo                      IMPORTING todo TYPE string.
+
+    METHODS  on_premise_branch_is_used RETURNING VALUE(r_value) TYPE abap_bool.
+
+    METHODS get_abap_language_version  IMPORTING iv_name                        TYPE sxco_package
+                                       RETURNING VALUE(r_abap_language_version) TYPE sychar01 .
+
+
+    METHODS get_root_exception IMPORTING ix_exception   TYPE REF TO cx_root
+                               RETURNING VALUE(rx_root) TYPE REF TO cx_root  .
+
+    METHODS publish_service_binding IMPORTING i_service_binding TYPE sxco_srvb_object_name
+                                    RAISING   zdmo_cx_rap_generator.
+
+    METHODS un_publish_service_binding IMPORTING i_service_binding TYPE sxco_srvb_object_name
+                                       RAISING   zdmo_cx_rap_generator .
+
+    METHODS service_binding_is_published IMPORTING i_service_binding     TYPE sxco_srvb_object_name
+                                         RETURNING VALUE(r_is_published) TYPE abap_bool
+                                         RAISING   zdmo_cx_rap_generator.
+
+    METHODS get_ABAP_Obj_Directory_Entry IMPORTING i_ABAP_Object_Type                   TYPE t_abap_obj_directory_entry-ABAPObjectType "trobjtype "= 'DEVC'
+                                                   i_ABAP_Object_Category               TYPE t_abap_obj_directory_entry-ABAPObjectCategory "= 'R3TR'
+                                                   i_ABAP_Object                        TYPE t_abap_obj_directory_entry-ABAPObject " @delete_objects_in_package
+                                         RETURNING VALUE(r_ABAP_Object_Directory_Entry) TYPE t_abap_obj_directory_entry.
+
+    METHODS get_objects_in_package IMPORTING i_package                   TYPE sxco_package
+                                   RETURNING VALUE(r_objects_in_package) TYPE t_abap_obj_directory_entries.
+
+
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_XCO_LIB IMPLEMENTATION.
+
+
+  METHOD add_draft_include.
+
+  ENDMETHOD.
+
+
+  METHOD add_enh_cat_and_anno_to_struct.
+
+  ENDMETHOD.
+
+
+  METHOD add_enh_cat_to_table.
+
+  ENDMETHOD.
+
+
+  METHOD add_include_structure_to_table.
+
+  ENDMETHOD.
+
+
+  METHOD attribute_exists_in_class.
+    attribute_exists = abap_false.
+    DATA(descr_ref_class) = CAST cl_abap_classdescr( cl_abap_typedescr=>describe_by_name( class_name ) ).
+    IF line_exists( descr_ref_class->attributes[ name = to_upper( attribute_name ) ]  ).
+      attribute_exists = abap_true.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD attribute_exists_in_interface.
+    attribute_exists = abap_false.
+    DATA(descr_ref_intf) = CAST cl_abap_intfdescr( cl_abap_typedescr=>describe_by_name( interface_name ) ).
+    IF line_exists( descr_ref_intf->attributes[ name = to_upper( attribute_name ) ]  ).
+      attribute_exists = abap_true.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD create_xco_lib.
+    DATA xco_on_prem_lib TYPE REF TO ZDMO_cl_rap_xco_on_prem_lib.
+    xco_on_prem_lib = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+    IF xco_on_prem_lib->on_premise_branch_is_used(  ).
+      result = NEW ZDMO_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      result = NEW ZDMO_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_abap_language_version.
+    r_abap_language_version = ZDMO_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform. "abap_language_version-abap_for_cloud_development.
+  ENDMETHOD.
+
+
+  METHOD get_abap_obj_directory_entry.
+
+  ENDMETHOD.
+
+
+  METHOD get_abstract_entity.
+
+  ENDMETHOD.
+
+
+  METHOD get_aggregated_annotations.
+
+  ENDMETHOD.
+
+
+  METHOD get_behavior_definition.
+
+  ENDMETHOD.
+
+
+  METHOD get_class.
+
+  ENDMETHOD.
+
+
+  METHOD get_database_table.
+
+  ENDMETHOD.
+
+
+  METHOD get_data_definition.
+
+  ENDMETHOD.
+
+
+  METHOD get_entity.
+
+  ENDMETHOD.
+
+
+  METHOD get_metadata_extension.
+
+  ENDMETHOD.
+
+
+  METHOD get_objects_in_package.
+
+  ENDMETHOD.
+
+
+  METHOD get_package.
+
+  ENDMETHOD.
+
+
+  METHOD get_packages.
+
+  ENDMETHOD.
+
+
+  METHOD get_root_exception.
+    rx_root = ix_exception.
+    WHILE rx_root->previous IS BOUND.
+      rx_root ?= rx_root->previous.
+    ENDWHILE.
+  ENDMETHOD.
+
+
+  METHOD get_sap_object_node_type.
+
+  ENDMETHOD.
+
+
+  METHOD get_sap_object_type.
+
+  ENDMETHOD.
+
+
+  METHOD get_service_binding.
+
+  ENDMETHOD.
+
+
+  METHOD get_service_definition.
+
+  ENDMETHOD.
+
+
+  METHOD get_structure.
+
+  ENDMETHOD.
+
+
+  METHOD get_structures.
+
+  ENDMETHOD.
+
+
+  METHOD get_tables.
+
+  ENDMETHOD.
+
+
+  METHOD get_view.
+
+  ENDMETHOD.
+
+
+  METHOD get_views.
+
+  ENDMETHOD.
+
+
+  METHOD get_view_entity.
+
+  ENDMETHOD.
+
+
+  METHOD method_exists_in_class.
+    method_exists = abap_false.
+    DATA(descr_ref_class) = CAST cl_abap_classdescr( cl_abap_typedescr=>describe_by_name( class_name ) ).
+    IF line_exists( descr_ref_class->methods[ name = to_upper( method_name ) ] ).
+      method_exists = abap_true.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD method_exists_in_interface.
+    method_exists = abap_false.
+    DATA(descr_ref_intf) = CAST cl_abap_intfdescr( cl_abap_typedescr=>describe_by_name( interface_name ) ).
+    IF line_exists( descr_ref_intf->methods[ name = to_upper( method_name ) ] ).
+      method_exists = abap_true.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD on_premise_branch_is_used.
+    r_value = abap_false.
+  ENDMETHOD.
+
+
+  METHOD publish_service_binding.
+
+  ENDMETHOD.
+
+
+  METHOD service_binding_is_published.
+
+  ENDMETHOD.
+
+
+  METHOD todo.
+    APPEND todo TO todos.
+  ENDMETHOD.
+
+
+  METHOD un_publish_service_binding.
+*    RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+*      EXPORTING
+*        textid   = zdmo_cx_rap_generator=>method_not_implemented
+*        mv_value = 'un_publish_service_binding'.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_xco_lib.clas.xml b/src/zdmo_cl_rap_xco_lib.clas.xml
new file mode 100644
index 0000000..ca36e2f
--- /dev/null
+++ b/src/zdmo_cl_rap_xco_lib.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_XCO_LIB</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Abstract class xco apis</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cl_rap_xco_on_prem_lib.clas.abap b/src/zdmo_cl_rap_xco_on_prem_lib.clas.abap
new file mode 100644
index 0000000..5441d28
--- /dev/null
+++ b/src/zdmo_cl_rap_xco_on_prem_lib.clas.abap
@@ -0,0 +1,909 @@
+CLASS zdmo_cl_rap_xco_on_prem_lib DEFINITION INHERITING FROM ZDMO_cl_rap_xco_lib
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    METHODS get_aggregated_annotations REDEFINITION.
+    METHODS get_behavior_definition REDEFINITION.
+    METHODS get_class REDEFINITION.
+    METHODS get_database_table REDEFINITION.
+    METHODS get_data_definition REDEFINITION.
+    METHODS get_metadata_extension REDEFINITION.
+    METHODS get_package REDEFINITION.
+    METHODS get_service_binding REDEFINITION.
+    METHODS get_service_definition REDEFINITION.
+    METHODS get_structure REDEFINITION.
+    METHODS get_view_entity REDEFINITION.
+    METHODS get_view REDEFINITION.
+    METHODS get_entity REDEFINITION.
+    METHODS get_abstract_entity REDEFINITION.
+    METHODS add_draft_include REDEFINITION.
+    METHODS get_structures REDEFINITION.
+    METHODS get_tables REDEFINITION.
+    METHODS get_views REDEFINITION.
+    METHODS get_packages REDEFINITION.
+    METHODS on_premise_branch_is_used REDEFINITION.
+    METHODS get_abap_language_version REDEFINITION.
+    METHODS publish_service_binding REDEFINITION.
+    METHODS un_publish_service_binding REDEFINITION.
+    METHODS service_binding_is_published REDEFINITION.
+    METHODS get_abap_obj_directory_entry REDEFINITION.
+    METHODS get_objects_in_package REDEFINITION.
+    METHODS add_include_structure_to_table REDEFINITION.
+    METHODS add_enh_cat_to_table REDEFINITION.
+    METHODS add_enh_cat_and_anno_to_struct REDEFINITION.
+    METHODS get_sap_object_node_type redefinition.
+    methods get_sap_object_type REDEFINITION.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CL_RAP_XCO_ON_PREM_LIB IMPLEMENTATION.
+
+
+  METHOD add_draft_include.
+*    DATA:
+*      draft_template_table_name TYPE ddobjname,
+*      draft_table_name          TYPE ddobjname,
+*      lv_return                 TYPE syst_subrc,
+*      lt_dd03p                  TYPE TABLE OF dd03p,
+*      lt_dd03p_draft            TYPE TABLE OF dd03p,
+*      lt_dd12v                  TYPE TABLE OF dd12v,
+*      lt_dd17v                  TYPE TABLE OF dd17v,
+*      ls_dd02v                  TYPE dd02v,
+*      ls_dd09l                  TYPE dd09l,
+*      state                     TYPE ddgotstate,
+*      position                  TYPE i.
+*
+*    FIELD-SYMBOLS:
+*      <ls_dd03p>           TYPE dd03p.
+*
+*    draft_template_table_name  = 'ZDMO_DRAFT_INCL'.
+*    draft_table_name  = table_name.
+*
+*    "get information about draft include from template table
+*
+*    CALL FUNCTION 'DDIF_TABL_GET'
+*      EXPORTING
+*        name          = draft_template_table_name
+*        state         = 'A'
+*      IMPORTING
+*        gotstate      = state
+*        dd02v_wa      = ls_dd02v
+*        dd09l_wa      = ls_dd09l
+*      TABLES
+*        dd03p_tab     = lt_dd03p_draft
+*        dd12v_tab     = lt_dd12v
+*        dd17v_tab     = lt_dd17v
+*      EXCEPTIONS
+*        illegal_input = 1
+*        OTHERS        = 2.
+*
+*    IF sy-subrc <> 0.
+*      "RAISE EXCEPTION TYPE cx_cnv_indx_iuuc.
+*      ASSERT 1 = 0.
+*
+*    ENDIF.
+*
+*    "get draft table information.
+*    CALL FUNCTION 'DDIF_TABL_GET'
+*      EXPORTING
+*        name          = draft_table_name
+*        state         = 'A'
+*      IMPORTING
+*        gotstate      = state
+*        dd02v_wa      = ls_dd02v
+*        dd09l_wa      = ls_dd09l
+*      TABLES
+*        dd03p_tab     = lt_dd03p
+*        dd12v_tab     = lt_dd12v
+*        dd17v_tab     = lt_dd17v
+*      EXCEPTIONS
+*        illegal_input = 1
+*        OTHERS        = 2.
+*
+*    IF sy-subrc <> 0.
+*      ASSERT 1 = 0.
+*    ENDIF.
+*
+*    "add draft include structure to draft table
+*    IF lt_dd03p IS NOT INITIAL.
+*
+*
+*      position = lines( lt_dd03p ).
+*
+*
+*      LOOP AT lt_dd03p_draft INTO DATA(ls_dd03p_draft)  .
+*        ls_dd03p_draft-tabname = draft_table_name.
+*
+*        CASE ls_dd03p_draft-fieldname.
+*          WHEN '.INCLUDE'.
+*            position += 1.
+*            ls_dd03p_draft-position = position.
+*            APPEND ls_dd03p_draft TO lt_dd03p.
+*          WHEN 'DRAFTENTITYCREATIONDATETIME' .
+*            position += 1.
+*            ls_dd03p_draft-position = position.
+*            APPEND ls_dd03p_draft TO lt_dd03p.
+*          WHEN 'DRAFTENTITYLASTCHANGEDATETIME'.
+*            position += 1.
+*            ls_dd03p_draft-position = position.
+*            APPEND ls_dd03p_draft TO lt_dd03p.
+*          WHEN 'DRAFTADMINISTRATIVEDATAUUID' .
+*            position += 1.
+*            ls_dd03p_draft-position = position.
+*            APPEND ls_dd03p_draft TO lt_dd03p.
+*          WHEN 'DRAFTENTITYOPERATIONCODE' .
+*            position += 1.
+*            ls_dd03p_draft-position = position.
+*            APPEND ls_dd03p_draft TO lt_dd03p.
+*          WHEN 'HASACTIVEENTITY' .
+*            position += 1.
+*            ls_dd03p_draft-position = position.
+*            APPEND ls_dd03p_draft TO lt_dd03p.
+*          WHEN'DRAFTFIELDCHANGES'.
+*            position += 1.
+*            ls_dd03p_draft-position = position.
+*            APPEND ls_dd03p_draft TO lt_dd03p.
+*        ENDCASE.
+*      ENDLOOP.
+*    ELSE.
+*      ASSERT 1 = 0.
+*    ENDIF.
+*
+*    "change draft table
+*    CALL FUNCTION 'DDIF_TABL_PUT'
+*      EXPORTING
+*        name              = draft_table_name
+*        dd02v_wa          = ls_dd02v
+*        dd09l_wa          = ls_dd09l
+*      TABLES
+*        dd03p_tab         = lt_dd03p
+*      EXCEPTIONS
+*        tabl_not_found    = 1
+*        name_inconsistent = 2
+*        tabl_inconsistent = 3
+*        put_failure       = 4
+*        put_refused       = 5
+*        OTHERS            = 6.
+*
+*    IF sy-subrc <> 0.
+*      ASSERT 1 = 0.
+*    ELSE.
+*
+*      CALL FUNCTION 'DDIF_TABL_ACTIVATE'
+*        EXPORTING
+*          name        = draft_table_name
+*          auth_chk    = ' '
+*        IMPORTING
+*          rc          = lv_return
+*        EXCEPTIONS
+*          not_found   = 1
+*          put_failure = 2
+*          OTHERS      = 3.
+*      IF sy-subrc <> 0.
+*        ASSERT 1 = 0.
+*      ENDIF.
+*    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD add_enh_cat_and_anno_to_struct.
+
+*    DATA: change_structure_name TYPE ddobjname,
+*          lv_return         TYPE syst_subrc,
+*          lt_dd03p          TYPE TABLE OF dd03p,
+*          lt_dd03p_ext_incl TYPE TABLE OF dd03p,
+*          lt_dd12v          TYPE TABLE OF dd12v,
+*          lt_dd17v          TYPE TABLE OF dd17v,
+*          ls_dd02v          TYPE dd02v,
+*          ls_dd09l          TYPE dd09l,
+*          state             TYPE ddgotstate,
+*          position          TYPE i.
+*
+*    FIELD-SYMBOLS:
+*      <ls_dd03p>           TYPE dd03p.
+*
+*    "type must be exactly the type being used by DDIF function modules
+*    change_structure_name = to_upper( ext_include_structure_name ).
+*
+*
+*
+*    "get table information.
+*    CALL FUNCTION 'DDIF_TABL_GET'
+*      EXPORTING
+*        name          = change_structure_name
+*        state         = 'A'
+*      IMPORTING
+*        gotstate      = state
+*        dd02v_wa      = ls_dd02v
+*        dd09l_wa      = ls_dd09l
+*      TABLES
+*        dd03p_tab     = lt_dd03p
+*        dd12v_tab     = lt_dd12v
+*        dd17v_tab     = lt_dd17v
+*      EXCEPTIONS
+*        illegal_input = 1
+*        OTHERS        = 2.
+*
+*    IF sy-subrc <> 0.
+*      ASSERT 1 = 0.
+*    ENDIF.
+*
+*    "for structure change ls_dd02v-EXCLASS = '4' and set quota and extensibility suffix
+*
+*    ls_dd02v-exclass = zdmo_cl_rap_node=>enhancement_category-can_be_enhanced_deep. "'4'.
+*    ls_dd02v-field_suffix =  extensibility_element_suffix.
+*    ls_dd02v-quota_max_fields = zdmo_cl_rap_node=>abapcatalog_enhancement-quotamaximumfields.
+*    ls_dd02v-quota_max_bytes = zdmo_cl_rap_node=>abapcatalog_enhancement-quotamaximumbytes.
+*    ls_dd02v-quota_share_partner = zdmo_cl_rap_node=>abapcatalog_enhancement-quotasharepartner.
+*    ls_dd02v-quota_share_customer = zdmo_cl_rap_node=>abapcatalog_enhancement-quotasharecustomer.
+*
+*    "change table
+*    CALL FUNCTION 'DDIF_TABL_PUT'
+*      EXPORTING
+*        name              = change_structure_name
+*        dd02v_wa          = ls_dd02v
+*        dd09l_wa          = ls_dd09l
+*      TABLES
+*        dd03p_tab         = lt_dd03p
+*      EXCEPTIONS
+*        tabl_not_found    = 1
+*        name_inconsistent = 2
+*        tabl_inconsistent = 3
+*        put_failure       = 4
+*        put_refused       = 5
+*        OTHERS            = 6.
+*
+*    IF sy-subrc <> 0.
+*      ASSERT 1 = 0.
+*    ELSE.
+*
+*      CALL FUNCTION 'DDIF_TABL_ACTIVATE'
+*        EXPORTING
+*          name        = change_structure_name
+*          auth_chk    = ' '
+*        IMPORTING
+*          rc          = lv_return
+*        EXCEPTIONS
+*          not_found   = 1
+*          put_failure = 2
+*          OTHERS      = 3.
+*      IF sy-subrc <> 0.
+*        ASSERT 1 = 0.
+*      ENDIF.
+*    ENDIF.
+
+
+  ENDMETHOD.
+
+
+  METHOD add_enh_cat_to_table.
+
+*    DATA: change_table_name TYPE ddobjname,
+*          lv_return         TYPE syst_subrc,
+*          lt_dd03p          TYPE TABLE OF dd03p,
+*          lt_dd03p_ext_incl TYPE TABLE OF dd03p,
+*          lt_dd12v          TYPE TABLE OF dd12v,
+*          lt_dd17v          TYPE TABLE OF dd17v,
+*          ls_dd02v          TYPE dd02v,
+*          ls_dd09l          TYPE dd09l,
+*          state             TYPE ddgotstate,
+*          position          TYPE i.
+*
+*    FIELD-SYMBOLS:
+*      <ls_dd03p>           TYPE dd03p.
+*
+*    "type must be exactly the type being used by DDIF function modules
+*    change_table_name = to_upper( table_name ).
+*
+*    "get table information.
+*    CALL FUNCTION 'DDIF_TABL_GET'
+*      EXPORTING
+*        name          = change_table_name
+*        state         = 'A'
+*      IMPORTING
+*        gotstate      = state
+*        dd02v_wa      = ls_dd02v
+*        dd09l_wa      = ls_dd09l
+*      TABLES
+*        dd03p_tab     = lt_dd03p
+*        dd12v_tab     = lt_dd12v
+*        dd17v_tab     = lt_dd17v
+*      EXCEPTIONS
+*        illegal_input = 1
+*        OTHERS        = 2.
+*
+*    IF sy-subrc <> 0.
+*      ASSERT 1 = 0.
+*    ENDIF.
+*
+*    "for table change ls_dd02v-EXCLASS = '4'.
+*    ls_dd02v-exclass = '4'.
+*
+*    "change table
+*    CALL FUNCTION 'DDIF_TABL_PUT'
+*      EXPORTING
+*        name              = change_table_name
+*        dd02v_wa          = ls_dd02v
+*        dd09l_wa          = ls_dd09l
+*      TABLES
+*        dd03p_tab         = lt_dd03p
+*      EXCEPTIONS
+*        tabl_not_found    = 1
+*        name_inconsistent = 2
+*        tabl_inconsistent = 3
+*        put_failure       = 4
+*        put_refused       = 5
+*        OTHERS            = 6.
+*
+*    IF sy-subrc <> 0.
+*      ASSERT 1 = 0.
+*    ELSE.
+*
+*      CALL FUNCTION 'DDIF_TABL_ACTIVATE'
+*        EXPORTING
+*          name        = change_table_name
+*          auth_chk    = ' '
+*        IMPORTING
+*          rc          = lv_return
+*        EXCEPTIONS
+*          not_found   = 1
+*          put_failure = 2
+*          OTHERS      = 3.
+*      IF sy-subrc <> 0.
+*        ASSERT 1 = 0.
+*      ENDIF.
+*    ENDIF.
+*
+
+
+  ENDMETHOD.
+
+
+  METHOD add_include_structure_to_table.
+
+*
+*    DATA: change_table_name TYPE ddobjname,
+*          lv_return         TYPE syst_subrc,
+*          lt_dd03p          TYPE TABLE OF dd03p,
+*          lt_dd03p_ext_incl TYPE TABLE OF dd03p,
+*          lt_dd12v          TYPE TABLE OF dd12v,
+*          lt_dd17v          TYPE TABLE OF dd17v,
+*          ls_dd02v          TYPE dd02v,
+*          ls_dd09l          TYPE dd09l,
+*          state             TYPE ddgotstate,
+*          position          TYPE i.
+*
+*    FIELD-SYMBOLS:
+*      <ls_dd03p>           TYPE dd03p.
+*
+*    "type must be exactly the type being used by DDIF function modules
+*    change_table_name = table_name.
+*
+*    "get table information.
+*    CALL FUNCTION 'DDIF_TABL_GET'
+*      EXPORTING
+*        name          = change_table_name
+*        state         = 'A'
+*      IMPORTING
+*        gotstate      = state
+*        dd02v_wa      = ls_dd02v
+*        dd09l_wa      = ls_dd09l
+*      TABLES
+*        dd03p_tab     = lt_dd03p
+*        dd12v_tab     = lt_dd12v
+*        dd17v_tab     = lt_dd17v
+*      EXCEPTIONS
+*        illegal_input = 1
+*        OTHERS        = 2.
+*
+*    IF sy-subrc <> 0.
+*      ASSERT 1 = 0.
+*    ENDIF.
+*
+*    "information about extension include
+*
+*    lt_dd03p_ext_incl = VALUE #(
+*    ( tabname = |{ change_table_name }|  fieldname = '.INCLUDE' ddlanguage = '' position = '0002' keyflag = '' mandatory = ''
+*    rollname = '' checktable = '' adminfield = '0' inttype = '' intlen = '000000' reftable = '' precfield =
+*    |{ extension_include_name }| reffield = '' conrout = '' notnull = '' domname = '' routputlen = '000000' memoryid = '' logflag =
+*    '' headlen = '00' scrlen1 = '00' scrlen2 = '00' scrlen3 = '00' dtelglobal = '' dtelmaster = '' reservedte = '' datatype
+*    = '' leng = '000000' outputlen = '000000' decimals = '000000' lowercase = '' signflag = '' langflag = '' valexi = ''
+*    entitytab = '' convexit = '' mask = '      S' masklen = '0000' actflag = '' ddtext = '' reptext = '' scrtext_s = ''
+*    scrtext_m = '' scrtext_l = '' dommaster = '' reservedom = '' domglobal = '' domname3l = '' shlporigin = '' shlpname =
+*    '' shlpfield = '' tabletype = '' depth = '00' comptype = 'S' deffdname = '' groupname = '' reftype = '' proxytype = ''
+*    languflag = '' exclass = '0' ltrflddis = '' bidictrlc = '' dbposition = '0000' anonymous = '' outputstyle = '00'
+*    nohistory = '' ampmformat = '' streamorloc = '' strorlocpos = '00' sql_passvalue = '' is_virtual = '' is_calculated =
+*    '' extendname = '' srs_id = '0000000000' )
+*    ( tabname = |{ change_table_name }| fieldname = 'DUMMY_FIELD' ddlanguage = '' position = '0003' keyflag = '' mandatory = ''
+*    rollname = '' checktable = '' adminfield = '1' inttype = 'C' intlen = '000002' reftable = '' precfield = '' reffield =
+*    '' conrout = '' notnull = '' domname = '' routputlen = '000000' memoryid = '' logflag = '' headlen = '00' scrlen1 =
+*    '00' scrlen2 = '00' scrlen3 = '00' dtelglobal = '' dtelmaster = '' reservedte = '' datatype = 'CHAR' leng = '000001'
+*    outputlen = '000000' decimals = '000000' lowercase = '' signflag = '' langflag = '' valexi = '' entitytab = '' convexit
+*    = '' mask = '  CHAR' masklen = '0000' actflag = '' ddtext = '' reptext = '' scrtext_s = '' scrtext_m = '' scrtext_l =
+*    '' dommaster = '' reservedom = '' domglobal = '' domname3l = '' shlporigin = '' shlpname = '' shlpfield = '' tabletype
+*    = '' depth = '00' comptype = '' deffdname = '' groupname = '' reftype = '' proxytype = '' languflag = '' exclass = '0'
+*    ltrflddis = '' bidictrlc = '' dbposition = '0000' anonymous = '' outputstyle = '00' nohistory = '' ampmformat = ''
+*    streamorloc = '' strorlocpos = '00' sql_passvalue = '' is_virtual = '' is_calculated = '' extendname = '' srs_id =
+*    '0000000000' )
+*     ) .
+*
+*    "add extension include structure to table
+*    IF lt_dd03p IS NOT INITIAL.
+*
+*      position = lines( lt_dd03p ).
+*
+*      LOOP AT lt_dd03p_ext_incl INTO DATA(ls_dd03p_draft)  .
+*        position += 1.
+*        ls_dd03p_draft-position = position.
+*        APPEND ls_dd03p_draft TO lt_dd03p.
+*      ENDLOOP.
+*
+*    ELSE.
+*      ASSERT 1 = 0.
+*    ENDIF.
+*
+*    "change table
+*    CALL FUNCTION 'DDIF_TABL_PUT'
+*      EXPORTING
+*        name              = change_table_name
+*        dd02v_wa          = ls_dd02v
+*        dd09l_wa          = ls_dd09l
+*      TABLES
+*        dd03p_tab         = lt_dd03p
+*      EXCEPTIONS
+*        tabl_not_found    = 1
+*        name_inconsistent = 2
+*        tabl_inconsistent = 3
+*        put_failure       = 4
+*        put_refused       = 5
+*        OTHERS            = 6.
+*
+*    IF sy-subrc <> 0.
+*      ASSERT 1 = 0.
+*    ELSE.
+*
+*      CALL FUNCTION 'DDIF_TABL_ACTIVATE'
+*        EXPORTING
+*          name        = change_table_name
+*          auth_chk    = ' '
+*        IMPORTING
+*          rc          = lv_return
+*        EXCEPTIONS
+*          not_found   = 1
+*          put_failure = 2
+*          OTHERS      = 3.
+*      IF sy-subrc <> 0.
+*        ASSERT 1 = 0.
+*      ENDIF.
+*    ENDIF.
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD get_abap_language_version.
+*    r_abap_language_version = xco_abap_language_version=>object_type->devc->get_object_language_version( CONV #( iv_name ) )->get_value(  ).
+  ENDMETHOD.
+
+
+  METHOD get_abap_obj_directory_entry.
+*    SELECT SINGLE * FROM
+*     I_ABAPObjectDirectoryEntry "ObjDirectoryEntry
+*     WHERE ABAPObjectType = @i_abap_object_type
+*       AND ABAPObjectCategory = @i_abap_object_category
+*       AND ABAPObject = @i_abap_object
+*       INTO CORRESPONDING FIELDS OF @r_abap_object_directory_entry.
+  ENDMETHOD.
+
+
+  METHOD get_abstract_entity.
+*    IF method_exists_in_class(
+*         class_name  = 'xco_cds'
+*         method_name = 'abstract_entity'
+*       ).
+*      CALL METHOD xco_cds=>('abstract_entity')
+*        EXPORTING
+*          iv_name            = iv_name
+*        RECEIVING
+*          ro_abstract_entity = ro_abstract_entity.
+*    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD  get_aggregated_annotations.
+*    ro_aggregated_annotations = xco_cds=>annotations->aggregated->of( io_field ).
+  ENDMETHOD.
+
+
+  METHOD  get_behavior_definition.
+*    ro_behavior_definition = xco_abap_repository=>object->bdef->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD  get_class.
+*    ro_class = xco_abap_repository=>object->clas->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD  get_database_table.
+*    ro_table = xco_abap_repository=>object->tabl->database_table->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD  get_data_definition.
+*    ro_data_definition = xco_abap_repository=>object->ddls->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD get_entity.
+*    ro_entity = xco_cds=>view_entity( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD  get_metadata_extension.
+*    ro_metadata_extension  = xco_abap_repository=>object->ddlx->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD get_objects_in_package.
+*    SELECT * FROM I_ABAPObjectDirectoryEntry WHERE ABAPPackage = @i_package
+*                                              INTO CORRESPONDING FIELDS OF TABLE @r_objects_in_package .
+  ENDMETHOD.
+
+
+  METHOD  get_package.
+*    ro_package = xco_abap_repository=>object->devc->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD get_packages.
+*    IF it_filters IS NOT INITIAL.
+*      rt_packages =  xco_abap_repository=>objects->devc->where( it_filters )->in( xco_cp_abap=>repository )->get( ).
+*    ELSE.
+*      rt_packages = xco_abap_repository=>objects->devc->all->in( xco_cp_abap=>repository )->get( ).
+*    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_sap_object_node_type.
+*    ro_sap_object_node_type = xco_abap_repository=>object->nont->for( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD get_sap_object_type.
+*    ro_sap_object_type = xco_abap_repository=>object->ront->for( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD  get_service_binding.
+*    ro_service_binding = xco_abap_repository=>object->srvb->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD  get_service_definition.
+*    ro_service_definition = xco_abap_repository=>object->srvd->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD  get_structure.
+*    ro_structure = xco_abap_repository=>object->tabl->structure->for( iv_name  ).
+  ENDMETHOD.
+
+
+  METHOD get_structures.
+**    IF io_filter IS NOT INITIAL.
+**      rt_structures =  xco_abap_repository=>objects->tabl->structures->where( VALUE #(
+**                                              ( io_filter )
+**                                              ) )->in( xco_abap=>repository )->get( ).
+**    ELSE.
+**      rt_structures = xco_abap_repository=>objects->tabl->structures->all->in( xco_abap=>repository )->get( ).
+**    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_tables.
+*    IF it_filters IS NOT INITIAL.
+*      rt_tables = xco_abap_repository=>objects->tabl->database_tables->where( it_filters )->in( xco_abap=>repository )->get( ).
+*
+*    ELSE.
+*      rt_tables = xco_abap_repository=>objects->tabl->database_tables->all->in( xco_abap=>repository )->get( ).
+*    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_view.
+*    ro_view = xco_cds=>view( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD get_views.
+*    IF it_filters IS NOT INITIAL.
+*      rt_data_definitions =  xco_abap_repository=>objects->ddls->where( it_filters )->in( xco_abap=>repository )->get( ).
+*    ELSE.
+*      rt_data_definitions = xco_abap_repository=>objects->ddls->all->in( xco_abap=>repository )->get( ).
+*    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD get_view_entity.
+*    ro_view_entity = xco_cds=>view_entity( iv_name ).
+  ENDMETHOD.
+
+
+  METHOD on_premise_branch_is_used.
+    "get default value abap_false
+    super->on_premise_branch_is_used(  ).
+*    r_value = abap_true.
+  ENDMETHOD.
+
+
+  METHOD publish_service_binding.
+*    CHECK get_service_binding( i_service_binding )->if_xco_ar_object~exists(  ).
+*    DATA(service_binding_name_to_upper) = to_upper( i_service_binding ).
+*    DATA(service_binding) = get_service_binding( CONV #( service_binding_name_to_upper ) ).
+*    DATA(package) =  service_binding->if_xco_ar_object~get_package(  ).
+*    DATA(transport_target) = package->read( )-property-transport_layer->get_transport_target( ).
+*    DATA(transport_target_name) = transport_target->value.
+*    DATA(new_transport_object) = xco_cts=>transports->customizing( iv_target = transport_target_name )->create_request( |Publish: { i_service_binding } | ).
+*    DATA(transport_request) = new_transport_object->value.
+*    DATA(service_binding_name) = to_upper( i_service_binding ).
+*    IF service_binding_is_published( i_service_binding ) = abap_false.
+*      DATA(service_binding_type) = service_binding->content( )->get_binding_type( )->value.
+*      IF service_binding_type-bind_type = 'ODATA'.
+*
+*        CASE service_binding_type-bind_type_version .
+*          WHEN 'V4'.
+*            TRY.
+*
+*                /iwfnd/cl_v4_cof_facade=>publish_group(
+*                  EXPORTING
+*                    iv_group_id        = CONV /iwfnd/v4_med_group_id( service_binding_name )
+*                    iv_system_alias    = 'LOCAL'
+**               iv_do_not_transport = ABAP_true
+*                    iv_suppress_dialog = abap_true
+*                  CHANGING
+*                    cv_transport       = transport_request
+*                ).
+*              CATCH /iwfnd/cx_gateway INTO DATA(publish_locally_exception).
+*                DATA(root_exception_text) = get_root_exception( publish_locally_exception )->get_text( ).
+*                RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+*                  EXPORTING
+*                    textid   = zdmo_cx_rap_generator=>service_binding_publish_err
+*                    mv_value = root_exception_text.
+*            ENDTRY.
+*
+*          WHEN  'V2'.
+*
+*            DATA: lo_config_facade  TYPE REF TO /iwfnd/cl_cof_facade.
+*            DATA: lx_cof     TYPE REF TO /iwfnd/cx_cof.
+*            DATA: lx_previous  TYPE REF TO cx_root  .
+*            DATA: lx_root_cause  TYPE REF TO /iwfnd/cx_base  .
+*            DATA: lv_service_id TYPE /iwfnd/med_mdl_srg_identifier.
+*            DATA: lv_service_name_tech TYPE /iwfnd/med_mdl_srg_name ##NEEDED.
+*
+*            " activate service
+*
+*            DATA(a) = 2.
+*
+*            TRY.
+*                lo_config_facade = /iwfnd/cl_cof_facade=>get_instance( ).
+*
+*                lo_config_facade->activate_service(
+*                  EXPORTING
+*                    iv_service_name_bep    = CONV #( service_binding_name )
+*                    iv_service_version_bep = '0001'
+*                    iv_prefix              = 'Z'
+*                    iv_system_alias        = 'LOCAL'
+*                    iv_package             = '$TMP'
+**                    iv_process_mode        = /iwfnd/if_mgw_core_types=>gcs_process_mode-co_deployed_only
+*                    iv_shorten_long_names  = abap_true
+*                    iv_suppress_dialog     = abap_true
+*                  IMPORTING
+*                    ev_srg_identifier      = lv_service_id
+*                    ev_tech_service_name   = lv_service_name_tech
+*                    ).
+*
+*
+*                DATA(result) = lv_service_id.
+*
+*              CATCH cx_root INTO lx_previous.
+*
+*                WHILE lx_previous->previous IS NOT INITIAL ."BOUND.
+*                  lx_previous = lx_previous->previous.    " Get the exception that caused this exception
+*                  TRY.
+*                      lx_root_cause ?= lx_previous.
+*                    CATCH cx_sy_move_cast_error.
+*                  ENDTRY.
+*                ENDWHILE.
+*
+*                DATA(root_cause) = lx_root_cause->get_text( ).
+*
+*                RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+*                  EXPORTING
+*                    textid   = zdmo_cx_rap_generator=>service_binding_publish_err
+*                    mv_value = root_cause.
+*
+*            ENDTRY.
+*
+*
+*          WHEN OTHERS.
+*            DATA(b) = service_binding_type-bind_type.
+*            DATA(c) = service_binding_type-bind_type_version.
+*        ENDCASE.
+*      ENDIF.
+*    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD service_binding_is_published.
+*    r_is_published = abap_false.
+*    CHECK get_service_binding( i_service_binding )->if_xco_ar_object~exists(  ).
+*    DATA(service_binding_name_to_upper) = to_upper( i_service_binding ).
+*    DATA(service_binding) = get_service_binding( CONV #( service_binding_name_to_upper ) ).
+*    DATA(service_binding_type) = service_binding->content( )->get_binding_type( )->value.
+*
+*    IF service_binding_type-bind_type = 'ODATA' AND service_binding_type-bind_type_version = 'V4'.
+*      TRY.
+*          /iwfnd/cl_v4_cof_facade=>get_published_groups(
+*            IMPORTING
+*              et_publish_group_info = DATA(published_service_groups) ).
+*        CATCH /iwfnd/cx_gateway INTO DATA(get_service_groups_exception).
+*          DATA(root_exception_text) = get_root_exception( get_service_groups_exception )->get_text( ).
+*          RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+*            EXPORTING
+*              textid     = zdmo_cx_rap_generator=>root_cause_exception
+*              mv_value   = 'Error getting service groups'
+*              mv_value_2 = root_exception_text.
+*          EXIT.
+*      ENDTRY.
+*
+*      IF line_exists( published_service_groups[ group_id = service_binding_name_to_upper ] ).  " Service group is already published
+*        r_is_published = abap_true.
+*      ELSE.
+*        r_is_published = abap_false.
+*      ENDIF.
+*
+*    ELSEIF service_binding_type-bind_type = 'ODATA' AND service_binding_type-bind_type_version = 'V2'.
+*
+*      DATA: lo_config_facade  TYPE REF TO /iwfnd/cl_cof_facade.
+*      DATA: lx_cof     TYPE REF TO /iwfnd/cx_cof.
+*      DATA:   lx_previous  TYPE REF TO cx_root  .
+*      DATA: lx_root_cause  TYPE REF TO /iwfnd/cx_base  .
+*      DATA: lv_service_id TYPE /iwfnd/med_mdl_srg_identifier.
+*      DATA: lv_service_name_tech TYPE /iwfnd/med_mdl_srg_name ##NEEDED.
+*
+*
+*
+*      TRY.
+*
+*          " activate service
+*          lo_config_facade = /iwfnd/cl_cof_facade=>get_instance( ).
+*          lo_config_facade->is_service_active(
+*            EXPORTING
+*              iv_service_name_bep    = CONV #( service_binding_name_to_upper )
+*              iv_service_version_bep = '0001'
+**       iv_prefix              =
+**       iv_shorten_long_names  =
+*     IMPORTING
+*       ev_active              = r_is_published
+*          ).
+**   CATCH /iwfnd/cx_cof.
+*        CATCH cx_root INTO DATA(v2_check_activation_exc).
+*
+*          DATA(root_exception_text2) = get_root_exception( v2_check_activation_exc )->get_text( ).
+*
+*          RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+*            EXPORTING
+*              textid     = zdmo_cx_rap_generator=>root_cause_exception
+*              mv_value   = 'Error checking if service binding is active'
+*              mv_value_2 = root_exception_text2.
+*
+*
+*      ENDTRY.
+*    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD un_publish_service_binding.
+*    CHECK get_service_binding( i_service_binding )->if_xco_ar_object~exists(  ).
+*    DATA(service_binding_name_to_upper) = to_upper( i_service_binding ).
+*    DATA(service_binding) = get_service_binding( CONV #( service_binding_name_to_upper ) ).
+*    DATA(package) =  service_binding->if_xco_ar_object~get_package(  ).
+*    DATA(transport_target) = package->read( )-property-transport_layer->get_transport_target( ).
+*    DATA(transport_target_name) = transport_target->value.
+*    DATA(new_transport_object) = xco_cts=>transports->customizing( iv_target = transport_target_name )->create_request( |Unpublish: { i_service_binding } | ).
+*    DATA(transport_request) = new_transport_object->value.
+*
+*    IF service_binding_is_published( i_service_binding ) = abap_true.
+*
+*      DATA(service_binding_type) = service_binding->content( )->get_binding_type( )->value.
+*
+*      IF service_binding_type-bind_type = 'ODATA' .
+*
+*        CASE service_binding_type-bind_type_version.
+*
+*          WHEN 'V4'.
+*
+*            TRY.
+*                DATA(service_binding_name) = to_upper( i_service_binding ).
+*                /iwfnd/cl_v4_cof_facade=>unpublish_group(
+*                  EXPORTING
+*                    iv_group_id        = CONV /iwfnd/v4_med_group_id( service_binding_name )
+*                    iv_suppress_dialog = abap_true
+*                  CHANGING
+*                    cv_transport       = transport_request
+*                ).
+*              CATCH /iwfnd/cx_gateway INTO DATA(un_publish_locally_exception).
+*                "handle exception
+*                DATA(root_exception_text) = get_root_exception( un_publish_locally_exception )->get_text( ).
+*                RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+*                  EXPORTING
+*                    textid   = zdmo_cx_rap_generator=>service_binding_un_publish_err
+*                    mv_value = root_exception_text.
+*            ENDTRY.
+*
+*          WHEN 'V2'.
+*
+*            " do nothing right now yet
+*
+*            DATA: lo_config_facade  TYPE REF TO /iwfnd/cl_cof_facade.
+*            DATA: lx_cof     TYPE REF TO /iwfnd/cx_cof.
+*            DATA:   lx_previous  TYPE REF TO cx_root  .
+*            DATA: lx_root_cause  TYPE REF TO /iwfnd/cx_base  .
+*            DATA: lv_service_id TYPE /iwfnd/med_mdl_srg_identifier.
+*            DATA: lv_service_name_tech TYPE /iwfnd/med_mdl_srg_name ##NEEDED.
+*
+*            TRY.
+*
+*                DATA object_name TYPE /iwfnd/med_mdl_srg_name .
+*                object_name = service_binding_name_to_upper.
+**-check whether service group already exists
+*                SELECT SINGLE srv_identifier FROM /iwfnd/i_med_srh
+*                  INTO @DATA(lv_srg_identifier)
+*                    WHERE object_name     = @object_name
+*                    AND   service_version = '0001'.
+*
+*                IF sy-subrc EQ 0.
+*
+*                  " deactivate service
+*                  lo_config_facade = /iwfnd/cl_cof_facade=>get_instance( ).
+*                  lo_config_facade->deactivate_service(
+*                    iv_service_identifier = lv_srg_identifier
+**            iv_transport_cust     = space
+**            iv_transport_dev      = space
+**            iv_suppress_dialog    =
+*                  ).
+**          CATCH /iwfnd/cx_cof.
+*
+*                ENDIF.
+*
+*              CATCH cx_root INTO DATA(v2_check_activation_exc).
+*
+*                DATA(root_exception_text2) = get_root_exception( v2_check_activation_exc )->get_text( ).
+*
+*                RAISE EXCEPTION TYPE zdmo_cx_rap_generator
+*                  EXPORTING
+*                    textid     = zdmo_cx_rap_generator=>root_cause_exception
+*                    mv_value   = 'Error checking if service binding is active'
+*                    mv_value_2 = root_exception_text2.
+*
+*
+*            ENDTRY.
+*
+*        ENDCASE.
+*
+*      ENDIF.
+*
+*    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cl_rap_xco_on_prem_lib.clas.xml b/src/zdmo_cl_rap_xco_on_prem_lib.clas.xml
new file mode 100644
index 0000000..ffad09b
--- /dev/null
+++ b/src/zdmo_cl_rap_xco_on_prem_lib.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CL_RAP_XCO_ON_PREM_LIB</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>xco on premise apis</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cm_rap_gen_msg.msag.xml b/src/zdmo_cm_rap_gen_msg.msag.xml
new file mode 100644
index 0000000..4242421
--- /dev/null
+++ b/src/zdmo_cm_rap_gen_msg.msag.xml
@@ -0,0 +1,524 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_MSAG" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <T100A>
+    <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+    <MASTERLANG>E</MASTERLANG>
+    <STEXT>Message class for the RAP Generator</STEXT>
+   </T100A>
+   <T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>001</MSGNR>
+     <TEXT>&amp;1 is neither a child node nor a grand child node of the root entity &amp;2.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>002</MSGNR>
+     <TEXT>&amp;1 contains non alpha numeric characters.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>003</MSGNR>
+     <TEXT>&amp;1 contains spaces.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>004</MSGNR>
+     <TEXT>&amp;1 is too long. (&amp;2 characters max).</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>005</MSGNR>
+     <TEXT>Node &amp;1 is not consistent</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>006</MSGNR>
+     <TEXT>&amp;1 is not a supported implementation type.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>007</MSGNR>
+     <TEXT>No namespace has been set for the root node.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>008</MSGNR>
+     <TEXT>Node &amp;1 is not finalized.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>009</MSGNR>
+     <TEXT>Node &amp;1 is not a root node.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>010</MSGNR>
+     <TEXT>The specified semantic key field &amp;1 is not a field of table &amp;2</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>011</MSGNR>
+     <TEXT>Repository object &amp;1 already exists</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>012</MSGNR>
+     <TEXT>Cannot check object type &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>013</MSGNR>
+     <TEXT>Parameter &amp;1 is initial.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>014</MSGNR>
+     <TEXT>Package &amp;1 does not exist</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>015</MSGNR>
+     <TEXT>Table &amp;1 does not exist.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>016</MSGNR>
+     <TEXT>&amp;1 &amp;2 &amp;3 &amp;4</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>017</MSGNR>
+     <TEXT>Table contains no UUID based key field &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>018</MSGNR>
+     <TEXT>Table contains no field &amp;1 for parent uuid</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>019</MSGNR>
+     <TEXT>Table contains no field &amp;1 for root uuid</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>020</MSGNR>
+     <TEXT>No table name set</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>021</MSGNR>
+     <TEXT>No semantic key set</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>022</MSGNR>
+     <TEXT>Object name &amp;1 is not unique within BO</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>023</MSGNR>
+     <TEXT>Table &amp;1 and package &amp;2 are not in the same software component</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>024</MSGNR>
+     <TEXT>CDS view &amp;1 does not exist</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>025</MSGNR>
+     <TEXT>Association name must start with an underscore &apos;_&apos;.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>026</MSGNR>
+     <TEXT>Wrong cardinality. Use one, one_to_n, zero_to_n or zero_to_one.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>027</MSGNR>
+     <TEXT>&amp;1 is not a field name in cds view of entity &amp;2.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>028</MSGNR>
+     <TEXT>Wrong usage &amp;1. Use FILTER, FILTER_AND_RESULT or RESULT.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>029</MSGNR>
+     <TEXT>Invalid json array name &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>030</MSGNR>
+     <TEXT>Invalid json object name &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>031</MSGNR>
+     <TEXT>Invalid json property name &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>032</MSGNR>
+     <TEXT>Field &amp;1 is not in data source &amp;2</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>033</MSGNR>
+     <TEXT>Field &amp;1 is not in cds view &amp;2</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>034</MSGNR>
+     <TEXT>No objectId set in &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>035</MSGNR>
+     <TEXT>Invalid data source type &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>036</MSGNR>
+     <TEXT>No data source set for entity &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>037</MSGNR>
+     <TEXT>Value of namespace &amp;1 is not valid. Use Y..., Z... or /.../.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>038</MSGNR>
+     <TEXT>&amp;1 is not the key field of &amp;2.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>039</MSGNR>
+     <TEXT>Type of &amp;1 is not UUID in 16 Bytes (Raw Format)</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>040</MSGNR>
+     <TEXT>Entity &amp;1 has too many key fields &amp;2. Only one of type UUID is allowed.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>041</MSGNR>
+     <TEXT>Entity &amp;1 has no key field.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>042</MSGNR>
+     <TEXT>Invalid binding type &amp;1. Use &amp;2 instead.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>043</MSGNR>
+     <TEXT>Invalid transport request &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>044</MSGNR>
+     <TEXT>No draft table specified for entity &amp;1 in draft enabled BO &amp;2.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>045</MSGNR>
+     <TEXT>Table &amp;1 is inactive.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>046</MSGNR>
+     <TEXT>Cannot add additional fields to object type &amp;1.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>047</MSGNR>
+     <TEXT>&amp;1 not implemented. Additional info &amp;2.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>048</MSGNR>
+     <TEXT>&amp;1 not draft enabled</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>049</MSGNR>
+     <TEXT>&amp;1 has no UI V4 service binding</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>050</MSGNR>
+     <TEXT>Admin field &amp;1 is missing in table &amp;2</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>051</MSGNR>
+     <TEXT>Tranport request &amp;1 does not exist</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>052</MSGNR>
+     <TEXT>Underscore not permitted at 2nd or 3rd position object name &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>053</MSGNR>
+     <TEXT>publish_service = abap_true and skip_activation = abap_true not possible</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>054</MSGNR>
+     <TEXT>&amp;1 Grandchild nodes are not supported for &amp;2 = &amp;3.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>055</MSGNR>
+     <TEXT>No total etag field found in &amp;2.  lastChangedAt mapped as &amp;1.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>056</MSGNR>
+     <TEXT>No etag master field found in &amp;2. Etag master mapped as &amp;1.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>057</MSGNR>
+     <TEXT>ABAP type &amp;1 specified for &amp;2 is not valid: &amp;3.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>058</MSGNR>
+     <TEXT>For multi-edit BO &amp;1 must be draft enabled and must use OData V4</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>059</MSGNR>
+     <TEXT>For customizing BO &amp;1 must be draft enabled and must use OData V4</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>060</MSGNR>
+     <TEXT>Customizing table &amp;1 must use delivery class &apos;C&apos; not &apos;&amp;2&apos;.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>061</MSGNR>
+     <TEXT>&amp;1: view type &amp;2 not supported</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>062</MSGNR>
+     <TEXT>Entity &amp;1 does not contain any fields.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>063</MSGNR>
+     <TEXT>&amp;1: No draft support for custom entities.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>064</MSGNR>
+     <TEXT>Job scheduling error &amp;1 &amp;2</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>065</MSGNR>
+     <TEXT>&amp;1: Invalid package type &amp;2</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>066</MSGNR>
+     <TEXT>&amp;1: Set Etag master in custom child entities.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>067</MSGNR>
+     <TEXT>For multi-edit and cust. only use datasource type &apos;table&apos; not &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>068</MSGNR>
+     <TEXT>For multi-edit and cust. only use imp. type &apos;managed_semantic&apos; not &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>069</MSGNR>
+     <TEXT>Services registered in Maintain Business Conf. App can only have 2 Levels</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>070</MSGNR>
+     <TEXT>Mandatory field &amp;1 for entity &amp;2 is initial</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>071</MSGNR>
+     <TEXT>Mandatory field &amp;1 for rap generator project &amp;2 is initial</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>072</MSGNR>
+     <TEXT>&amp;1: No OData V4 support for custom entities.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>073</MSGNR>
+     <TEXT>Service Binding &amp;1 is still published. Unpulish it and close tab in ADT.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>074</MSGNR>
+     <TEXT>Service binding - publishing error &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>075</MSGNR>
+     <TEXT>Service binding - un-publishing error &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>076</MSGNR>
+     <TEXT>Method not implemented &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>077</MSGNR>
+     <TEXT>Generated repository objects still exist for rap bo &amp;1</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>078</MSGNR>
+     <TEXT>&amp;1: OData V4 UI servicebindings require draft</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>079</MSGNR>
+     <TEXT>Datasource type &amp;3 does not support impl. type &amp;1, only &amp;2.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>080</MSGNR>
+     <TEXT>Extension element suffix &amp;1 must consist of 3 alphabetical characters.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>081</MSGNR>
+     <TEXT>No extension element suffix set</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>082</MSGNR>
+     <TEXT>Extension element suffix &amp;1 in entity &amp;2 is not unique</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>083</MSGNR>
+     <TEXT>RAP BO has too many node &amp;1. Reason: &amp;2.</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>084</MSGNR>
+     <TEXT>Table &amp;1 locked by transport &amp;2</TEXT>
+    </T100>
+    <T100>
+     <SPRSL>E</SPRSL>
+     <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB>
+     <MSGNR>085</MSGNR>
+     <TEXT>Table &amp;1 is not extensible &amp;2</TEXT>
+    </T100>
+   </T100>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cx_rap_gen_custom_entity.clas.abap b/src/zdmo_cx_rap_gen_custom_entity.clas.abap
new file mode 100644
index 0000000..112dfae
--- /dev/null
+++ b/src/zdmo_cx_rap_gen_custom_entity.clas.abap
@@ -0,0 +1,46 @@
+CLASS zdmo_cx_rap_gen_custom_entity DEFINITION
+  PUBLIC
+  INHERITING FROM cx_rap_query_provider
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        !textid   LIKE if_t100_message=>t100key OPTIONAL
+        !previous LIKE previous OPTIONAL .
+
+    CONSTANTS:
+
+      BEGIN OF query_failed,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '016',
+        attr1 TYPE scx_attrname VALUE 'attr1',
+        attr2 TYPE scx_attrname VALUE 'attr2',
+        attr3 TYPE scx_attrname VALUE 'attr3',
+        attr4 TYPE scx_attrname VALUE 'attr4',
+      END OF query_failed
+      .
+
+
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CX_RAP_GEN_CUSTOM_ENTITY IMPLEMENTATION.
+
+
+  METHOD constructor ##ADT_SUPPRESS_GENERATION.
+    super->constructor( previous = previous ).
+
+    CLEAR me->textid.
+    IF textid IS INITIAL.
+      if_t100_message~t100key = if_t100_message=>default_textid.
+    ELSE.
+      if_t100_message~t100key = textid.
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cx_rap_gen_custom_entity.clas.xml b/src/zdmo_cx_rap_gen_custom_entity.clas.xml
new file mode 100644
index 0000000..c66037e
--- /dev/null
+++ b/src/zdmo_cx_rap_gen_custom_entity.clas.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CX_RAP_GEN_CUSTOM_ENTITY</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Exceptions raised by custom entities</DESCRIPT>
+    <CATEGORY>40</CATEGORY>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_cx_rap_generator.clas.abap b/src/zdmo_cx_rap_generator.clas.abap
new file mode 100644
index 0000000..2f94d39
--- /dev/null
+++ b/src/zdmo_cx_rap_generator.clas.abap
@@ -0,0 +1,772 @@
+CLASS zdmo_cx_rap_generator DEFINITION
+  PUBLIC
+  INHERITING FROM cx_xco_runtime_exception
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+
+*    INTERFACES if_t100_dyn_msg .
+*    INTERFACES if_t100_message .
+
+    CONSTANTS:
+
+      gc_msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+
+
+      BEGIN OF is_no_child_nor_grandchild,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '001',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE 'MV_ROOT_ENTITY',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF is_no_child_nor_grandchild,
+      BEGIN OF non_alpha_numeric_characters,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '002',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF non_alpha_numeric_characters,
+      BEGIN OF contains_spaces,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '003',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF contains_spaces,
+      BEGIN OF is_too_long,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '004',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_MAX_LENGTH',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF is_too_long,
+      BEGIN OF node_is_not_consistent,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '005',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF node_is_not_consistent,
+      BEGIN OF entity_name_is_not_unique,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '005',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF entity_name_is_not_unique,
+      BEGIN OF implementation_type_not_valid,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '006',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF implementation_type_not_valid,
+      BEGIN OF no_namespace_set,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '007',
+        attr1 TYPE scx_attrname VALUE '',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_namespace_set,
+      BEGIN OF node_is_not_finalized,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '008',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF node_is_not_finalized,
+      BEGIN OF is_not_a_root_node,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '009',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF is_not_a_root_node,
+      BEGIN OF sematic_key_is_not_in_table,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '010',
+        attr1 TYPE scx_attrname VALUE 'MV_SEMANTIC_KEY_FIELD',
+        attr2 TYPE scx_attrname VALUE 'MV_TABLE_NAME',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF sematic_key_is_not_in_table,
+      BEGIN OF repository_already_exists,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '011',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF repository_already_exists,
+      BEGIN OF cannot_check_object_type,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '012',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF cannot_check_object_type,
+      BEGIN OF parameter_is_initial,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '013',
+        attr1 TYPE scx_attrname VALUE 'MV_PARAMETER_NAME',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF parameter_is_initial,
+      BEGIN OF package_does_not_exist,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '014',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF package_does_not_exist,
+      BEGIN OF table_does_not_exist,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '015',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF table_does_not_exist,
+      BEGIN OF root_cause_exception,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '016',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE 'MV_PARAMETER',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF root_cause_exception,
+      BEGIN OF field_uuid_missing,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '017',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF field_uuid_missing,
+      BEGIN OF field_parent_uuid_missing,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '018',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF field_parent_uuid_missing,
+      BEGIN OF field_root_uuid_missing,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '019',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF field_root_uuid_missing,
+      BEGIN OF no_table_set,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '020',
+        attr1 TYPE scx_attrname VALUE '',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_table_set,
+      BEGIN OF no_semantic_key_set,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '021',
+        attr1 TYPE scx_attrname VALUE '',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_semantic_key_set,
+      BEGIN OF object_name_is_not_unique,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '022',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF object_name_is_not_unique,
+      BEGIN OF software_comp_do_not_match,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '023',
+        attr1 TYPE scx_attrname VALUE 'MV_TABLE_NAME',
+        attr2 TYPE scx_attrname VALUE 'MV_PACKAGE_NAME',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF software_comp_do_not_match,
+      BEGIN OF cds_view_does_not_exist,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '024',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF cds_view_does_not_exist,
+      BEGIN OF starts_not_with_underscore,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '025',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF starts_not_with_underscore,
+      BEGIN OF assocation_is_not_supported,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '026',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF assocation_is_not_supported,
+      BEGIN OF not_a_field_in_cds_view,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '027',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF not_a_field_in_cds_view,
+      BEGIN OF usage_is_not_supported,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '028',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF usage_is_not_supported,
+      BEGIN OF invalid_json_array_name,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '029',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF invalid_json_array_name,
+      BEGIN OF invalid_json_object_name,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '030',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF invalid_json_object_name,
+      BEGIN OF invalid_json_property_name,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '031',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF invalid_json_property_name,
+      BEGIN OF field_is_not_in_datasource,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '032',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_TABLE_NAME',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF field_is_not_in_datasource,
+      BEGIN OF field_is_not_in_cds_view,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '033',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF field_is_not_in_cds_view,
+
+      BEGIN OF no_object_id_set,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '034',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_object_id_set,
+      BEGIN OF invalid_data_source_type,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '035',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF invalid_data_source_type,
+      BEGIN OF no_data_source_set,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '036',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_data_source_set,
+      BEGIN OF invalid_namespace,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '037',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF invalid_namespace,
+      BEGIN OF uuid_is_not_key_field,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '038',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF uuid_is_not_key_field,
+      BEGIN OF uuid_has_invalid_data_type,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '039',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF uuid_has_invalid_data_type,
+      BEGIN OF more_than_one_key_field,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '040',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF more_than_one_key_field,
+      BEGIN OF has_no_key_field,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '041',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF has_no_key_field,
+      BEGIN OF invalid_binding_type,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '042',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF invalid_binding_type,
+      BEGIN OF invalid_transport_request,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '043',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE2',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF invalid_transport_request,
+      BEGIN OF no_draft_table_specified,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '044',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE 'MV_ROOT_ENTITY',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_draft_table_specified,
+      BEGIN OF table_is_inactive,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '045',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF table_is_inactive,
+      BEGIN OF cannot_add_additional_fields,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '046',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF cannot_add_additional_fields,
+
+      BEGIN OF not_implemented,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '047',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF not_implemented,
+      BEGIN OF not_draft_enabled,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '048',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF not_draft_enabled,
+      BEGIN OF no_ui_v4_service_binding,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '049',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_ui_v4_service_binding,
+      BEGIN OF admin_field_missing,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '050',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF admin_field_missing,
+      BEGIN OF transport_does_not_exist,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '051',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF transport_does_not_exist,
+      BEGIN OF underscore_not_at_pos_2_3,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '052',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF underscore_not_at_pos_2_3,
+      BEGIN OF publish_needs_active_srvd,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '053',
+        attr1 TYPE scx_attrname VALUE '',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF publish_needs_active_srvd,
+      BEGIN OF grand_child_not_supported,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '054',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr3 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF grand_child_not_supported,
+      BEGIN OF field_total_etag_missing,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '055',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF field_total_etag_missing,
+      BEGIN OF field_etag_master_missing,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '056',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF field_etag_master_missing,
+      BEGIN OF invalid_abap_type_name,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '057',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr3 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF invalid_abap_type_name,
+      BEGIN OF clnt_is_not_key_field,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '038',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF clnt_is_not_key_field,
+      BEGIN OF mult_edit_not_supported,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '058',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF mult_edit_not_supported,
+      BEGIN OF delivery_class_c_required,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '060',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF delivery_class_c_required,
+      BEGIN OF view_type_not_supported,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '061',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF view_type_not_supported,
+      BEGIN OF no_fields_found,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '062',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_fields_found,
+      BEGIN OF no_draft_for_cust_entites,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '063',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_draft_for_cust_entites,
+      BEGIN OF job_scheduling_error,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '064',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF job_scheduling_error,
+      BEGIN OF invalid_package_type,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '065',
+        attr1 TYPE scx_attrname VALUE 'MV_PACKAGE_NAME',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF invalid_package_type,
+      BEGIN OF no_etag_delegation_support,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '066',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_etag_delegation_support,
+      BEGIN OF multi_edit_datasource_type,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '067',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF multi_edit_datasource_type,
+      BEGIN OF multi_edit_implementation_type,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '068',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF multi_edit_implementation_type,
+      BEGIN OF exceeds_max_mbc_hierachy_level,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '069',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF exceeds_max_mbc_hierachy_level,
+      BEGIN OF mandatory_field_for_entity,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '070',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF mandatory_field_for_entity,
+      BEGIN OF mandatory_field_for_project,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '071',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF mandatory_field_for_project,
+      BEGIN OF no_odatav4_for_cust_entites,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '072',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_odatav4_for_cust_entites,
+      BEGIN OF service_binding_is_published,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '073',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF service_binding_is_published,
+      BEGIN OF service_binding_publish_err,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '074',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF service_binding_publish_err,
+      BEGIN OF service_binding_un_publish_err,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '075',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF service_binding_un_publish_err,
+      BEGIN OF method_not_implemented,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '076',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF method_not_implemented,
+      BEGIN OF generated_objects_still_exist,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '077',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF generated_objects_still_exist,
+      BEGIN OF no_odatav4_UI_srvb_wo_draft,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '078',
+        attr1 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_odatav4_UI_srvb_wo_draft
+      ,
+      "Datasource type &3 does not support impl. type &1, only &2.
+      BEGIN OF data_source_invalid_imp_type,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '079',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE 'MV_PARAMETER_NAME',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF data_source_invalid_imp_type,
+      BEGIN OF invalid_ext_element_Suffix,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '080',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF invalid_ext_element_Suffix,
+      BEGIN OF no_ext_element_Suffix_set,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '081',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE '',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF no_ext_element_Suffix_set,
+      BEGIN OF ext_elem_suffix_is_not_unique,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '082',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_ENTITY',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF ext_elem_suffix_is_not_unique,
+      BEGIN OF too_many_nodes,
+        msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '083',
+        attr1 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE_2',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF too_many_nodes,
+      begin of table_locked_by_transport,
+      msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '084',
+        attr1 TYPE scx_attrname VALUE 'MV_TABLE_NAME',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF table_locked_by_transport,
+      begin of table_not_extensible,
+      msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG',
+        msgno TYPE symsgno VALUE '085',
+        attr1 TYPE scx_attrname VALUE 'MV_TABLE_NAME',
+        attr2 TYPE scx_attrname VALUE 'MV_VALUE',
+        attr3 TYPE scx_attrname VALUE '',
+        attr4 TYPE scx_attrname VALUE '',
+      END OF table_not_extensible
+            .
+
+
+
+    DATA mv_entity  TYPE sxco_ddef_alias_name.
+    DATA mv_root_entity  TYPE sxco_ddef_alias_name.
+    DATA mv_value TYPE string.
+    DATA mv_value_2 TYPE string.
+    DATA mv_max_length TYPE i.
+    DATA mv_parameter_name TYPE string.
+    DATA mv_semantic_key_field TYPE string.
+    DATA mv_table_name TYPE string.
+    DATA mv_package_name TYPE string.
+
+    CLASS-METHODS class_constructor .
+    METHODS constructor
+      IMPORTING
+        !textid                LIKE if_t100_message=>t100key OPTIONAL
+        !previous              LIKE previous OPTIONAL
+        !mv_entity             TYPE sxco_ddef_alias_name OPTIONAL
+        !mv_root_entity        TYPE sxco_ddef_alias_name OPTIONAL
+        !mv_value              TYPE string OPTIONAL
+        !mv_value_2            TYPE string OPTIONAL
+        !mv_max_length         TYPE i OPTIONAL
+        !mv_parameter_name     TYPE string OPTIONAL
+        !mv_semantic_key_field TYPE string OPTIONAL
+        !mv_table_name         TYPE string OPTIONAL
+        !mv_package_name       TYPE string OPTIONAL .
+
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZDMO_CX_RAP_GENERATOR IMPLEMENTATION.
+
+
+  METHOD class_constructor.
+  ENDMETHOD.
+
+
+  METHOD constructor ##ADT_SUPPRESS_GENERATION.
+    CALL METHOD super->constructor
+      EXPORTING
+        previous = previous
+        textid   = textid.
+    me->mv_entity = mv_entity.
+    me->mv_root_entity = mv_root_entity.
+    me->mv_value = mv_value.
+    me->mv_value_2 = mv_value_2.
+    me->mv_max_length = mv_max_length.
+    me->mv_parameter_name = mv_parameter_name.
+    me->mv_semantic_key_field = mv_semantic_key_field.
+    me->mv_table_name  =       mv_table_name.
+    me->mv_package_name = mv_package_name.
+    CLEAR me->textid.
+    IF textid IS INITIAL.
+      if_t100_message~t100key = if_t100_message=>default_textid.
+    ELSE.
+      if_t100_message~t100key = textid.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_cx_rap_generator.clas.xml b/src/zdmo_cx_rap_generator.clas.xml
new file mode 100644
index 0000000..4c9317d
--- /dev/null
+++ b/src/zdmo_cx_rap_generator.clas.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_CX_RAP_GENERATOR</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>Exceptions RAP Generator</DESCRIPT>
+    <CATEGORY>40</CATEGORY>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_draft_incl.tabl.xml b/src/zdmo_draft_incl.tabl.xml
new file mode 100644
index 0000000..93d2869
--- /dev/null
+++ b/src/zdmo_draft_incl.tabl.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_DRAFT_INCL</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <LANGDEP>X</LANGDEP>
+    <DDTEXT>Draft table with include used as a template</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>1</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_DRAFT_INCL</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <NOTNULL>X</NOTNULL>
+     <DATATYPE>CLNT</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CLNT</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SEMANTIC_KEY</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000010</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000005</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>.INCLUDE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <PRECFIELD>SYCH_BDL_DRAFT_ADMIN_INC</PRECFIELD>
+     <MASK>      S</MASK>
+     <DDTEXT>Standard Include for Draft Administration (BDL Syntax Check)</DDTEXT>
+     <COMPTYPE>S</COMPTYPE>
+     <GROUPNAME>%ADMIN</GROUPNAME>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_DRAFT_INCL</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_fcal_holi.tabl.xml b/src/zdmo_fcal_holi.tabl.xml
new file mode 100644
index 0000000..99cc02b
--- /dev/null
+++ b/src/zdmo_fcal_holi.tabl.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_FCAL_HOLI</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <DDTEXT>Holiday Calendar</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <MAINFLAG>X</MAINFLAG>
+    <CONTFLAG>C</CONTFLAG>
+    <EXCLASS>1</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_FCAL_HOLI</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>MANDT</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HOLIDAY_ID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>ZDMO_FCAL_HOLIDAY_ID</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>MONTH_OF_HOLIDAY</FIELDNAME>
+     <ROLLNAME>FDT_MONTH</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DAY_OF_HOLIDAY</FIELDNAME>
+     <ROLLNAME>FDT_DAY_OF_MONTH</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CONFIGDEPRECATIONCODE</FIELDNAME>
+     <ROLLNAME>CONFIG_DEPRECATION_CODE</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_FCAL_HOLI</TABNAME>
+     <CCLASS>CUS_DEV_SUP_RO</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_fcal_holi_t.tabl.xml b/src/zdmo_fcal_holi_t.tabl.xml
new file mode 100644
index 0000000..00c37ac
--- /dev/null
+++ b/src/zdmo_fcal_holi_t.tabl.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_FCAL_HOLI_T</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <DDTEXT>Holiday Calendar Text Table</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <MAINFLAG>X</MAINFLAG>
+    <CONTFLAG>C</CONTFLAG>
+    <EXCLASS>1</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_FCAL_HOLI_T</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <UEBERSETZ>X</UEBERSETZ>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>MANDT</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SPRAS</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SPRAS</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <SHLPORIGIN>D</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+     <LANGUFLAG>X</LANGUFLAG>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HOLIDAY_ID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>ZDMO_FCAL_HOLIDAY_ID</ROLLNAME>
+     <CHECKTABLE>ZDMO_FCAL_HOLI</CHECKTABLE>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <SHLPORIGIN>P</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FCAL_DESCRIPTION</FIELDNAME>
+     <ROLLNAME>SXCO_AO_SHORT_DESCRIPTION</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+   </DD03P_TABLE>
+   <DD05M_TABLE>
+    <DD05M>
+     <FIELDNAME>HOLIDAY_ID</FIELDNAME>
+     <FORTABLE>ZDMO_FCAL_HOLI_T</FORTABLE>
+     <FORKEY>CLIENT</FORKEY>
+     <CHECKTABLE>ZDMO_FCAL_HOLI</CHECKTABLE>
+     <CHECKFIELD>CLIENT</CHECKFIELD>
+     <PRIMPOS>0001</PRIMPOS>
+     <DOMNAME>MANDT</DOMNAME>
+     <DATATYPE>CLNT</DATATYPE>
+     <LENG>000003</LENG>
+    </DD05M>
+    <DD05M>
+     <FIELDNAME>HOLIDAY_ID</FIELDNAME>
+     <FORTABLE>ZDMO_FCAL_HOLI_T</FORTABLE>
+     <FORKEY>HOLIDAY_ID</FORKEY>
+     <CHECKTABLE>ZDMO_FCAL_HOLI</CHECKTABLE>
+     <CHECKFIELD>HOLIDAY_ID</CHECKFIELD>
+     <PRIMPOS>0002</PRIMPOS>
+     <DOMNAME>ZDMO_FCAL_HOLIDAY_ID</DOMNAME>
+     <DATATYPE>NUMC</DATATYPE>
+     <LENG>000006</LENG>
+    </DD05M>
+   </DD05M_TABLE>
+   <DD08V_TABLE>
+    <DD08V>
+     <FIELDNAME>HOLIDAY_ID</FIELDNAME>
+     <CHECKTABLE>ZDMO_FCAL_HOLI</CHECKTABLE>
+     <FRKART>TEXT</FRKART>
+     <CARD>CN</CARD>
+     <CHECKFLAG>X</CHECKFLAG>
+     <CARDLEFT>1</CARDLEFT>
+    </DD08V>
+   </DD08V_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_FCAL_HOLI_T</TABNAME>
+     <CCLASS>CUS_DEV_SUP_RO</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_fcal_holiday_id.doma.xml b/src/zdmo_fcal_holiday_id.doma.xml
new file mode 100644
index 0000000..0085cc7
--- /dev/null
+++ b/src/zdmo_fcal_holiday_id.doma.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD01V>
+    <DOMNAME>ZDMO_FCAL_HOLIDAY_ID</DOMNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DATATYPE>NUMC</DATATYPE>
+    <LENG>000006</LENG>
+    <OUTPUTLEN>000006</OUTPUTLEN>
+    <DDTEXT>Holiday ID</DDTEXT>
+    <DOMMASTER>E</DOMMASTER>
+   </DD01V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_fcal_holiday_id.dtel.xml b/src/zdmo_fcal_holiday_id.dtel.xml
new file mode 100644
index 0000000..ecfdf0f
--- /dev/null
+++ b/src/zdmo_fcal_holiday_id.dtel.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD04V>
+    <ROLLNAME>ZDMO_FCAL_HOLIDAY_ID</ROLLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DOMNAME>ZDMO_FCAL_HOLIDAY_ID</DOMNAME>
+    <HEADLEN>55</HEADLEN>
+    <SCRLEN1>10</SCRLEN1>
+    <SCRLEN2>20</SCRLEN2>
+    <SCRLEN3>40</SCRLEN3>
+    <DDTEXT>Holiday ID</DDTEXT>
+    <REPTEXT>Holiday ID</REPTEXT>
+    <SCRTEXT_S>id</SCRTEXT_S>
+    <SCRTEXT_M>Holiday ID</SCRTEXT_M>
+    <SCRTEXT_L>Holiday ID</SCRTEXT_L>
+    <DTELMASTER>E</DTELMASTER>
+    <REFKIND>D</REFKIND>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+   </DD04V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_gen_rap110_single.clas.abap b/src/zdmo_gen_rap110_single.clas.abap
new file mode 100644
index 0000000..95ddff2
--- /dev/null
+++ b/src/zdmo_gen_rap110_single.clas.abap
@@ -0,0 +1,2586 @@
+CLASS zdmo_gen_rap110_single DEFINITION
+
+INHERITING FROM zdmo_cl_rap_generator_base
+**************************************************************************
+**
+** Welcome to the RAP110 travel exercise generator!
+**
+** STAND: 2023-05-08 --> OKAY
+** Adjust superpackage and TR
+** ...
+**************************************************************************
+
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_oo_adt_classrun.
+    METHODS constructor
+      IMPORTING i_unique_suffix TYPE string OPTIONAL.
+
+  PROTECTED SECTION.
+
+  PRIVATE SECTION.
+
+
+    CONSTANTS:
+      co_prefix             TYPE string           VALUE 'ZRAP110_',
+      co_zlocal_package     TYPE sxco_package     VALUE 'ZLOCAL',
+*      co_zrap110_ex_package TYPE sxco_package     VALUE 'ZRAP110_EXERCISES'.
+      co_zrap110_ex_package TYPE sxco_package     VALUE 'ZLOCAL'.
+*      co_zrap110_ex_package TYPE sxco_package VALUE 'ZRAP110_DRYRUN'.
+
+
+
+
+
+
+
+
+
+    DATA xco_on_prem_library TYPE REF TO zdmo_cl_rap_xco_on_prem_lib.
+    DATA xco_lib             TYPE REF TO zdmo_cl_rap_xco_lib.
+    DATA package_name           TYPE sxco_package .
+    DATA unique_suffix          TYPE string.
+*    DATA mo_environment         TYPE REF TO if_xco_cp_gen_env_dev_system.
+    DATA transport              TYPE sxco_transport .
+    "database tables
+    DATA table_name_root        TYPE sxco_dbt_object_name.
+    DATA table_name_child       TYPE sxco_dbt_object_name.
+    DATA draft_table_name_root  TYPE sxco_dbt_object_name.
+    DATA draft_table_name_child TYPE sxco_dbt_object_name.
+    DATA data_generator_class_name TYPE sxco_ad_object_name.
+    DATA calc_travel_elem_class_name TYPE sxco_ad_object_name.
+    DATA calc_booking_elem_class_name TYPE sxco_ad_object_name.
+    DATA eml_playground_class_name TYPE sxco_ad_object_name.
+    "CDS views
+    DATA r_view_name_travel   TYPE sxco_cds_object_name.
+    DATA r_view_name_booking  TYPE sxco_cds_object_name.
+    DATA c_view_name_travel   TYPE sxco_cds_object_name.
+    DATA c_view_name_booking  TYPE sxco_cds_object_name.
+    DATA i_view_name_travel   TYPE sxco_cds_object_name.
+    DATA i_view_name_booking  TYPE sxco_cds_object_name.
+    DATA create_mde_files     TYPE abap_bool.
+    "Behavior pools
+    DATA beh_impl_name_travel   TYPE sxco_ao_object_name.
+    DATA beh_impl_name_booking  TYPE sxco_ao_object_name.
+    "business service
+    DATA srv_definition_name    TYPE sxco_srvd_object_name.
+    DATA srv_binding_o4_name    TYPE sxco_srvb_service_name.
+    DATA debug_modus            TYPE abap_bool VALUE abap_true.
+
+
+    TYPES: BEGIN OF t_table_fields,
+             field                  TYPE sxco_ad_field_name,
+             is_key                 TYPE abap_bool,
+             not_null               TYPE abap_bool,
+             currencyCode           TYPE sxco_cds_field_name,
+             unitOfMeasure          TYPE sxco_cds_field_name,
+             data_element           TYPE sxco_ad_object_name,
+             built_in_type          TYPE cl_xco_ad_built_in_type=>tv_type,
+             built_in_type_length   TYPE cl_xco_ad_built_in_type=>tv_length,
+             built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals,
+           END OF t_table_fields.
+
+    TYPES: tt_fields TYPE STANDARD TABLE OF t_table_fields WITH KEY field.
+
+    METHODS create_tables IMPORTING  io_out TYPE REF TO if_oo_adt_classrun_out .
+
+    METHODS create_rap_bo IMPORTING out          TYPE REF TO if_oo_adt_classrun_out
+                          EXPORTING eo_root_node TYPE REF TO zdmo_cl_rap_node .
+    METHODS delete_iview_and_mde IMPORTING  out TYPE REF TO if_oo_adt_classrun_out .
+
+    METHODS create_abs_ent_a_create_travel IMPORTING out          TYPE REF TO if_oo_adt_classrun_out .
+    METHODS create_abs_ent_a_daystoflight  IMPORTING out          TYPE REF TO if_oo_adt_classrun_out.
+    METHODS create_abs_ent_a_travel        IMPORTING out          TYPE REF TO if_oo_adt_classrun_out.
+
+    METHODS create_number_range IMPORTING out TYPE REF TO if_oo_adt_classrun_out.
+
+    METHODS create_additional_objects IMPORTING out TYPE REF TO if_oo_adt_classrun_out.
+
+    METHODS get_unique_suffix     IMPORTING VALUE(s_prefix)     TYPE string RETURNING VALUE(s_unique_suffix) TYPE string.
+    METHODS create_transport      RETURNING VALUE(lo_transport) TYPE sxco_transport.
+    METHODS create_super_package. "only needed on-prem
+    METHODS create_package        IMPORTING VALUE(lo_transport) TYPE sxco_transport.
+    METHODS create_package_in_zlocal IMPORTING VALUE(lo_transport) TYPE sxco_transport.
+
+
+*    METHODS generate_table        IMPORTING io_put_operation        TYPE REF TO if_xco_cp_gen_d_o_put
+*                                            table_fields            TYPE tt_fields
+*                                            table_name              TYPE sxco_dbt_object_name
+*                                            table_short_description TYPE if_xco_cp_gen_tabl_dbt_s_form=>tv_short_description.
+*
+*    METHODS generate_data_generator_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put .
+*    METHODS generate_virt_elem_trav_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put .
+*    METHODS generate_virt_elem_book_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put .
+*    METHODS generate_eml_playground_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put .
+
+    METHODS generate_table        IMPORTING io_put_operation        LIKE mo_put_operation "  TYPE REF TO if_xco_gen_o_mass_put
+                                            table_fields            TYPE tt_fields
+                                            table_name              TYPE sxco_dbt_object_name
+                                            table_short_description TYPE if_xco_cp_gen_tabl_dbt_s_form=>tv_short_description.
+
+    METHODS generate_data_generator_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation LIKE mo_put_operation .
+    METHODS generate_virt_elem_trav_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation LIKE mo_put_operation .
+    METHODS generate_virt_elem_book_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation LIKE mo_put_operation .
+    METHODS generate_eml_playground_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation LIKE mo_put_operation.
+
+
+
+
+
+
+*    METHODS generate_data.
+    METHODS get_root_table_fields  RETURNING VALUE(root_table_fields) TYPE tt_fields.
+    METHODS get_child_table_fields RETURNING VALUE(child_table_fields) TYPE tt_fields.
+*
+*    METHODS release_data_generator_class  IMPORTING VALUE(lo_transport) TYPE sxco_transport.
+    METHODS get_json_string           RETURNING VALUE(json_string) TYPE string.
+    METHODS generate_cds_mde    IMPORTING io_out       TYPE REF TO if_oo_adt_classrun_out
+                                          io_root_node TYPE REF TO zdmo_cl_rap_node .
+ENDCLASS.
+
+
+
+CLASS ZDMO_GEN_RAP110_SINGLE IMPLEMENTATION.
+
+
+  METHOD constructor.
+    super->constructor( ).
+
+    xco_on_prem_library = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+    "check whether being on cloud or on prem
+    IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_true.
+      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+
+    IF i_unique_suffix IS INITIAL.
+      unique_suffix          = get_unique_suffix( co_prefix ).
+    ELSE.
+      unique_suffix = i_unique_suffix.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD create_abs_ent_a_create_travel.
+
+    TRY.
+        DATA(mo_put_operation2) = get_put_operation( mo_environment  ).
+        DATA(lo_interface_specification) = mo_put_operation2->for-ddls->add_object( |ZRAP110_A_Create_Travel_{ unique_suffix }|
+        )->set_package( package_name
+        )->create_form_specification( ).
+        "add entity description
+        DATA(lo_abstract_entity) = lo_interface_specification->set_short_description( 'Parameter for Creating Travel+Booking'
+        )->add_abstract_entity( ).
+        "add view annotation
+        lo_abstract_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Parameter for Creating Travel+Booking' ).
+        " Add fields.
+        DATA(lo_identifier) = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'customer_id' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/customer_id' ) ).
+
+
+        DATA(lo_valuebuilder) = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ).
+        lo_valuebuilder->begin_array(
+                   )->begin_record(
+                     )->add_member( 'entity'
+                        )->begin_record(
+                           )->add_member( 'name' )->add_string( CONV #( '/DMO/I_Customer_StdVH' )
+                           )->add_member( 'element' )->add_string( CONV #( 'CustomerID' )
+                        )->end_record( ).
+
+*          lo_valuebuilder->add_member( 'additionalBinding'
+*            )->begin_array( ).
+*            DATA(lo_record) = lo_valuebuilder->begin_record(
+*              )->add_member( 'localElement' )->add_string( CONV #( ls_additionalbinding-localelement )
+*              )->add_member( 'element' )->add_string( CONV #( ls_additionalbinding-element )
+*              ).
+*            IF ls_additionalbinding-usage IS NOT INITIAL.
+*              lo_record->add_member( 'usage' )->add_enum( CONV #( ls_additionalbinding-usage ) ).
+*            ENDIF.
+*            lo_valuebuilder->end_record(  ).
+*          lo_valuebuilder->end_array( ).
+        lo_valuebuilder->end_record( )->end_array( ).
+
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'carrier_id' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/carrier_id' ) ).
+
+
+        lo_valuebuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ).
+        lo_valuebuilder->begin_array(
+                   )->begin_record(
+                     )->add_member( 'entity'
+                        )->begin_record(
+                           )->add_member( 'name' )->add_string( CONV #( '/DMO/I_Flight_StdVH' )
+                           )->add_member( 'element' )->add_string( CONV #( 'AirlineID' )
+                        )->end_record( ).
+
+        lo_valuebuilder->add_member( 'additionalBinding'
+          )->begin_array( ).
+        DATA(lo_record) = lo_valuebuilder->begin_record(
+          )->add_member( 'localElement' )->add_string( CONV #( 'flight_date' )
+          )->add_member( 'element' )->add_string( CONV #( 'FlightDate' )
+          ).
+        lo_record->add_member( 'usage' )->add_enum( CONV #( 'RESULT' ) ).
+        lo_valuebuilder->end_record(  ).
+
+        lo_record = lo_valuebuilder->begin_record(
+          )->add_member( 'localElement' )->add_string( CONV #( 'connection_id' )
+          )->add_member( 'element' )->add_string( CONV #( 'ConnectionID' )
+          ).
+        lo_record->add_member( 'usage' )->add_enum( CONV #( 'RESULT' ) ).
+
+
+        lo_valuebuilder->end_record(  ).
+        lo_valuebuilder->end_array( ).
+        lo_valuebuilder->end_record( )->end_array( ).
+
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'connection_id' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/connection_id' ) ).
+
+        lo_valuebuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ).
+        lo_valuebuilder->begin_array(
+                   )->begin_record(
+                     )->add_member( 'entity'
+                        )->begin_record(
+                           )->add_member( 'name' )->add_string( CONV #( '/DMO/I_Flight_StdVH' )
+                           )->add_member( 'element' )->add_string( CONV #( 'AirlineID' )
+                        )->end_record( ).
+
+        lo_valuebuilder->add_member( 'additionalBinding'
+          )->begin_array( ).
+
+        lo_record = lo_valuebuilder->begin_record(
+          )->add_member( 'localElement' )->add_string( CONV #( 'flight_date' )
+          )->add_member( 'element' )->add_string( CONV #( 'FlightDate' )
+          ).
+        lo_record->add_member( 'usage' )->add_enum( CONV #( 'RESULT' ) ).
+        lo_valuebuilder->end_record(  ).
+
+        lo_record = lo_valuebuilder->begin_record(
+          )->add_member( 'localElement' )->add_string( CONV #( 'carrier_id' )
+          )->add_member( 'element' )->add_string( CONV #( 'AirlineID' )
+          ).
+        lo_record->add_member( 'usage' )->add_enum( CONV #( 'FILTER_AND_RESULT' ) ).
+        lo_valuebuilder->end_record(  ).
+
+        lo_valuebuilder->end_array( ).
+
+        lo_valuebuilder->end_record( )->end_array( ).
+
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'flight_date' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/flight_date' ) ).
+
+        lo_valuebuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ).
+        lo_valuebuilder->begin_array(
+                   )->begin_record(
+                     )->add_member( 'entity'
+                        )->begin_record(
+                           )->add_member( 'name' )->add_string( CONV #( '/DMO/I_Flight_StdVH' )
+                           )->add_member( 'element' )->add_string( CONV #( 'AirlineID' )
+                        )->end_record( ).
+
+        lo_valuebuilder->add_member( 'additionalBinding'
+          )->begin_array( ).
+        lo_record = lo_valuebuilder->begin_record(
+          )->add_member( 'localElement' )->add_string( CONV #( 'carrier_id' )
+          )->add_member( 'element' )->add_string( CONV #( 'AirlineID' )
+          ).
+        lo_record->add_member( 'usage' )->add_enum( CONV #( 'FILTER_AND_RESULT' ) ).
+        lo_valuebuilder->end_record(  ).
+
+        lo_record = lo_valuebuilder->begin_record(
+          )->add_member( 'localElement' )->add_string( CONV #( 'connection_id' )
+          )->add_member( 'element' )->add_string( CONV #( 'ConnectionID' )
+          ).
+        lo_record->add_member( 'usage' )->add_enum( CONV #( 'FILTER_AND_RESULT' ) ).
+
+        lo_valuebuilder->end_record(  ).
+        lo_valuebuilder->end_array( ).
+        lo_valuebuilder->end_record( )->end_array( ).
+
+        DATA(lo_result) = mo_put_operation2->execute( ).
+
+        " handle findings
+        DATA(lo_findings) = lo_result->findings.
+        DATA(lt_findings) = lo_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            out->write( lt_findings ).
+          ENDIF.
+        ENDIF.
+
+      CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception).
+        out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception )->if_message~get_longtext( ) ).
+        DATA(class_gen_findings) = class_gen_exception->findings.
+        lt_findings = class_gen_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO DATA(finding).
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+    ENDTRY.
+
+  ENDMETHOD.
+
+
+  METHOD create_abs_ent_a_daystoflight.
+    TRY.
+        DATA(mo_put_operation2) = get_put_operation( mo_environment  ).
+        DATA(lo_interface_specification) = mo_put_operation2->for-ddls->add_object( |ZRAP110_A_DaysToFlight_{ unique_suffix }|
+        )->set_package( package_name
+        )->create_form_specification( ).
+        "add entity description
+        DATA(lo_abstract_entity) = lo_interface_specification->set_short_description( 'Abstract entity for Days To Flight'
+        )->add_abstract_entity( ).
+        "add view annotation
+        lo_abstract_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Abstract entity for Days To Flight' ).
+        " Add fields.
+        DATA(lo_identifier) = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'initial_days_to_flight' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( 'abap.int4' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'remaining_days_to_flight' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( 'abap.int4' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'booking_status_indicator' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( 'abap.int4' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'days_to_flight_indicator' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( 'abap.int4' ) ).
+
+        DATA(lo_result) = mo_put_operation2->execute( ).
+
+        " handle findings
+        DATA(lo_findings) = lo_result->findings.
+        DATA(lt_findings) = lo_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            out->write( lt_findings ).
+          ENDIF.
+        ENDIF.
+
+      CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception).
+        out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception )->if_message~get_longtext( ) ).
+        DATA(class_gen_findings) = class_gen_exception->findings.
+        lt_findings = class_gen_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO DATA(finding).
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+    ENDTRY.
+
+  ENDMETHOD.
+
+
+  METHOD create_abs_ent_a_travel. "Abstract entity for Travel
+    TRY.
+        DATA(mo_put_operation2) = get_put_operation( mo_environment  ).
+        DATA(lo_interface_specification) = mo_put_operation2->for-ddls->add_object( |ZRAP110_A_TRAVEL_{ unique_suffix }|
+        )->set_package( package_name
+        )->create_form_specification( ).
+        "add entity description
+        DATA(lo_abstract_entity) = lo_interface_specification->set_short_description( 'Parameter for Creating Travel+Booking'
+        )->add_abstract_entity( ).
+        "add view annotation
+        lo_abstract_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Parameter for Creating Travel+Booking' ).
+        " Add fields.
+        DATA(lo_identifier) = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'travel_id' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/travel_id' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'agency_id' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/agency_id' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'customer_id' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/customer_id' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'overall_status' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/overall_status' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'description' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/description' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'total_price' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/total_price' ) ).
+        lo_identifier->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'currency_code' ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'currency_code' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/currency_code' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'begin_date' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/begin_date' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'end_date' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/end_date' ) ).
+        lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'email_address' )
+        )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/email_address' ) ).
+
+        DATA(lo_result) = mo_put_operation2->execute( ).
+
+        " handle findings
+        DATA(lo_findings) = lo_result->findings.
+        DATA(lt_findings) = lo_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            out->write( lt_findings ).
+          ENDIF.
+        ENDIF.
+
+      CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception).
+        out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception )->if_message~get_longtext( ) ).
+        DATA(class_gen_findings) = class_gen_exception->findings.
+        lt_findings = class_gen_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO DATA(finding).
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+    ENDTRY.
+  ENDMETHOD.
+
+
+  METHOD create_additional_objects.
+    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+    TRY.
+        "generate Travel virtual element class
+        IF debug_modus = abap_true.
+          out->write( 'generate Travel virtual element class' ).
+        ENDIF.
+        DATA(mo_put_operation2) = get_put_operation( mo_environment  ).
+        generate_virt_elem_trav_class(
+          EXPORTING
+            io_put_operation       = mo_put_operation2
+            lo_transport            = transport
+        ).
+        DATA(lo_result) = mo_put_operation2->execute( ).
+
+        " handle findings
+        DATA(lo_findings) = lo_result->findings.
+        DATA(lt_findings) = lo_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            out->write( lt_findings ).
+          ENDIF.
+        ENDIF.
+
+      CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception).
+        DATA(class_gen_findings) = class_gen_exception->findings.
+        lt_findings = class_gen_findings->get( ).
+        IF debug_modus = abap_true.
+          out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception )->if_message~get_longtext( ) ).
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO DATA(finding).
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+    ENDTRY.
+
+    TRY.
+        "generate Booking virtual element class
+        DATA(mo_put_operation3) = get_put_operation( mo_environment  ).
+        generate_virt_elem_book_class(
+          EXPORTING
+            io_put_operation       = mo_put_operation3
+            lo_transport            = transport
+        ).
+
+        lo_result = mo_put_operation3->execute( ).
+
+        " handle findings
+        lo_findings = lo_result->findings.
+        lt_findings = lo_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            out->write( lt_findings ).
+          ENDIF.
+        ENDIF.
+
+      CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception_02).
+        DATA(class_gen_findings_02) = class_gen_exception_02->findings.
+        lt_findings = class_gen_findings_02->get( ).
+        IF debug_modus = abap_true.
+          out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception_02 )->if_message~get_longtext( ) ).
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO finding.
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+    ENDTRY.
+    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+    TRY.
+        "generate Booking virtual element class
+        DATA(mo_put_operation4) = get_put_operation( mo_environment  ).
+        generate_data_generator_class(
+          EXPORTING
+            io_put_operation       = mo_put_operation4
+            lo_transport            = transport
+        ).
+
+        lo_result = mo_put_operation4->execute( ).
+
+        " handle findings
+        lo_findings = lo_result->findings.
+        lt_findings = lo_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            out->write( lt_findings ).
+          ENDIF.
+        ENDIF.
+
+      CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception_03).
+        out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception_03 )->if_message~get_longtext( ) ).
+        DATA(class_gen_findings_03) = class_gen_exception_03->findings.
+        lt_findings = class_gen_findings_03->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO finding.
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+    ENDTRY.
+    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+    TRY.
+        "generate EML playground class class
+        DATA(mo_put_operation5) = get_put_operation( mo_environment  ).
+        generate_eml_playground_class(
+          EXPORTING
+            io_put_operation       = mo_put_operation5
+            lo_transport            = transport
+        ).
+
+        lo_result = mo_put_operation5->execute( ).
+
+        " handle findings
+        lo_findings = lo_result->findings.
+        lt_findings = lo_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            out->write( lt_findings ).
+          ENDIF.
+        ENDIF.
+
+      CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception_05).
+        out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception_05 )->if_message~get_longtext( ) ).
+        DATA(class_gen_findings_05) = class_gen_exception_05->findings.
+        lt_findings = class_gen_findings_05->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO finding.
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+    ENDTRY.
+
+    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ENDE
+    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+  ENDMETHOD.
+
+
+  METHOD create_number_range.
+    DATA:
+      lv_object   TYPE cl_numberrange_objects=>nr_attributes-object,
+      lv_devclass TYPE cl_numberrange_objects=>nr_attributes-devclass,
+      lv_corrnr   TYPE cl_numberrange_objects=>nr_attributes-corrnr.
+
+    DATA: lt_interval TYPE cl_numberrange_intervals=>nr_interval,
+          ls_interval TYPE cl_numberrange_intervals=>nr_nriv_line.
+
+    ls_interval-nrrangenr  = '01'.
+    ls_interval-fromnumber = '00000001'.
+    ls_interval-tonumber   = '99999999'.
+    ls_interval-procind    = 'I'.
+    APPEND ls_interval TO lt_interval.
+
+
+    DATA: group_id   TYPE string,
+          error_flag TYPE c.
+
+    group_id = unique_suffix.
+
+    CLEAR error_flag.
+
+    lv_object   = |ZRAP110{ group_id }|.
+    lv_devclass = |ZRAP110_{ group_id }|.
+    lv_corrnr   = transport.
+
+    TRY.
+        cl_numberrange_objects=>create(
+          EXPORTING
+            attributes = VALUE #( object     = lv_object
+                                  domlen     = '/DMO/TRAVEL_ID'
+                                  percentage = 10
+                                  buffer     = abap_false
+                                  noivbuffer = 0
+                                  devclass   = lv_devclass
+                                  corrnr     = lv_corrnr )
+            obj_text   = VALUE #( object     = lv_object
+                                  langu      = 'E'
+                                  txt        = |RAP110 Travel ID group { group_id }|
+                                  txtshort   = 'RAP110 Travel ID' )
+          IMPORTING
+            errors     = DATA(lt_errors)
+            returncode = DATA(lv_returncode)
+            ).
+
+      CATCH cx_nr_object_not_found INTO DATA(lx_nr_object_not_found).
+        ASSERT 1 = 1.  error_flag = '1'.
+
+      CATCH cx_number_ranges INTO DATA(lx_number_ranges).
+        ASSERT 1 = 1.  error_flag = '2'.
+
+    ENDTRY.
+
+
+    TRY.
+
+        CALL METHOD cl_numberrange_intervals=>create
+          EXPORTING
+            interval  = lt_interval
+            object    = lv_object
+            subobject = ' '
+          IMPORTING
+            error     = DATA(lv_error)
+            error_inf = DATA(ls_error)
+            error_iv  = DATA(lt_error_iv)
+            warning   = DATA(lv_warning).
+
+      CATCH cx_nr_object_not_found INTO lx_nr_object_not_found.
+        ASSERT 1 = 1.  error_flag = '3'.
+
+      CATCH cx_number_ranges INTO lx_number_ranges.
+        ASSERT 1 = 1.  error_flag = '4'.
+
+    ENDTRY.
+
+    COMMIT WORK.
+
+    IF error_flag > 0.
+      out->write( |Number Range Object: { lv_object }   Package: { lv_devclass }   Transport: { lv_corrnr }   Error: { error_flag }| ).
+    ELSE.
+      out->write( |Number Range Object: { lv_object }   Package: { lv_devclass } created.| ).
+    ENDIF.
+
+
+
+  ENDMETHOD.
+
+
+  METHOD create_package.
+    DATA(package_environment) = get_environment( lo_transport ).
+    DATA(lo_put_operation) = get_put_operation_for_devc( package_environment ).
+    DATA(lo_specification) = lo_put_operation->add_object( package_name )->create_form_specification( ).
+    lo_specification->set_short_description( '#Generated RAP110  tutorial package' ).
+    lo_specification->properties->set_super_package( co_zrap110_ex_package )->set_software_component( co_zlocal_package ).
+    DATA(lo_result) = lo_put_operation->execute( ).
+  ENDMETHOD.
+
+
+  METHOD create_package_in_zlocal.
+    DATA(package_environment) = get_environment( lo_transport ).
+    DATA(lo_put_operation) = get_put_operation_for_devc( package_environment ).
+    DATA(lo_specification) = lo_put_operation->add_object( package_name )->create_form_specification( ).
+    lo_specification->set_short_description( '#Generated RAP110  tutorial package' ).
+    lo_specification->properties->set_super_package( co_zlocal_package )->set_software_component( co_zlocal_package ).
+    DATA(lo_result) = lo_put_operation->execute( ).
+  ENDMETHOD.
+
+
+  METHOD create_rap_bo.
+
+    DATA(json_string)              = get_json_string(  ).            " get json document
+
+    "BO generation
+    TRY.
+        DATA(rap_bo_generator) = zdmo_cl_rap_generator=>create_for_cloud_development( json_string ).
+        eo_root_node = rap_bo_generator->root_node.
+
+        DATA(lt_todos)         = rap_bo_generator->generate_bo(  ).
+        IF debug_modus = abap_true.
+          " handle findings
+          out->write( | rap bo generated { rap_bo_generator->root_node->rap_node_objects-cds_view_r }| ).
+          LOOP AT lt_todos INTO DATA(ls_todo).
+            out->write( ls_todo-message ).
+          ENDLOOP.
+        ENDIF.
+      CATCH cx_xco_gen_put_exception INTO DATA(bo_gen_exception).
+        out->write( cl_message_helper=>get_latest_t100_exception( bo_gen_exception )->if_message~get_longtext( ) ).
+        DATA(bo_gen_findings) = bo_gen_exception->findings.
+        DATA(lt_findings) = bo_gen_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO DATA(finding).
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+      CATCH zdmo_cx_rap_generator INTO DATA(rap_generator_exception).
+        IF debug_modus = abap_true.
+          out->write( cl_message_helper=>get_latest_t100_exception( rap_generator_exception )->if_message~get_longtext( ) ).
+        ENDIF.
+        EXIT.
+    ENDTRY.
+
+  ENDMETHOD.
+
+
+  METHOD create_super_package.
+    DATA(lo_environment) = get_environment(  ).
+    DATA(lo_put_operation) = get_put_operation_for_devc( lo_environment ).
+    DATA(lo_specification) = lo_put_operation->add_object( co_zlocal_package )->create_form_specification( ).
+    lo_specification->set_short_description( 'RAP110 tutorial super package' ).
+    lo_specification->properties->set_software_component( 'LOCAL' ).
+    lo_put_operation->execute( ).
+  ENDMETHOD.
+
+
+  METHOD create_tables.
+
+    mo_environment                 = get_environment( transport ).
+    mo_put_operation               = get_put_operation( mo_environment )."->create_put_operation( ).
+    DATA(lo_objects_put_operation) = get_put_operation( mo_environment ).
+
+    DATA(lo_table_root)            = xco_cp_abap_repository=>object->tabl->for( CONV #( table_name_root ) ).
+    DATA(lo_table_child)           = xco_cp_abap_repository=>object->tabl->for( CONV #( table_name_child ) ).
+
+    DATA table_generated TYPE abap_bool.
+    DATA table_exists TYPE abap_bool.
+
+    DATA(root_table_fields)        = get_root_table_fields(  ).
+    DATA(child_table_fields)       = get_child_table_fields(  ).
+
+    IF lo_table_root->exists(
+    io_origin = xco_cp_table=>origin->local(  )
+       )   = abap_false AND
+       lo_table_child->exists(
+       io_origin = xco_cp_table=>origin->local(  )
+       ) = abap_false.
+
+      "generate of travel table
+      generate_table(
+        EXPORTING
+          io_put_operation         = lo_objects_put_operation
+          table_fields             = root_table_fields
+          table_name               = table_name_root
+          table_short_description  = 'Travel data'
+      ).
+      "generate of booking table
+      generate_table(
+        EXPORTING
+          io_put_operation        = lo_objects_put_operation
+          table_fields            = child_table_fields
+          table_name              = table_name_child
+          table_short_description = 'Booking data'
+      ).
+
+      TRY.
+          "create the tables
+          DATA(lo_result) = lo_objects_put_operation->execute( ).
+          IF debug_modus = abap_true.
+            io_out->write( | - Table { table_name_child } has been created.| ).
+            io_out->write( | - Table { table_name_root } has been created.| ).
+
+            " handle findings
+            DATA(lo_findings) = lo_result->findings.
+            DATA(lt_findings) = lo_findings->get( ).
+            IF lt_findings IS NOT INITIAL.
+              io_out->write( lt_findings ).
+            ENDIF.
+          ENDIF.
+        CATCH cx_xco_gen_put_exception INTO DATA(table_exception).
+          io_out->write( cl_message_helper=>get_latest_t100_exception( table_exception )->if_message~get_longtext( ) ).
+          DATA(table_findings) = table_exception->findings.
+          lt_findings = table_findings->get( ).
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO DATA(finding).
+              io_out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+          EXIT.
+      ENDTRY.
+    ELSE.
+      table_exists = abap_true.
+      io_out->write( | - Table { table_name_root } already exists.| ).
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD create_transport.
+    DATA(ls_package) = xco_lib->get_package( co_zlocal_package ).
+    IF ls_package->read( )-property-record_object_changes = abap_true.
+*    DATA(ls_package) = xco_cp_abap_repository=>package->for( co_zlocal_package )->read( ).
+      DATA(lv_transport_layer) = ls_package->read( )-property-transport_layer->value.
+      DATA(lv_transport_target) = ls_package->read( )-property-transport_layer->get_transport_target( )->value.
+      DATA(lo_transport_request) = xco_cp_cts=>transports->workbench( lv_transport_target )->create_request( '#Generated RAP110 tutorial transport request' ).
+      lo_transport = lo_transport_request->value.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD delete_iview_and_mde.
+    "CDS MDE deletion and generation
+    TRY.
+
+        DATA lv_del_transport   TYPE sxco_transport.
+        lv_del_transport = transport.
+        IF debug_modus = abap_true.
+          out->write( |use transport for deletion { lv_del_transport }| ).
+        ENDIF.
+        IF lv_del_transport IS INITIAL.
+          DATA(cts_obj) = xco_cp_abap_repository=>object->for(
+          EXPORTING
+          iv_type = 'DDLX'
+          iv_name = to_upper(   c_view_name_travel )
+            )->if_xco_cts_changeable~get_object( ).
+          lv_del_transport = cts_obj->get_lock( )->get_transport( ).
+          lv_del_transport = xco_cp_cts=>transport->for( lv_del_transport )->get_request( )->value.
+        ENDIF.
+
+        DATA(mo_environment2) = get_environment( lv_del_transport ).
+*          mo_environment2 = get_environment( lv_del_transport ). "xco_cp_generation=>environment->dev_system( lv_del_transport ).
+        DATA(lo_delete_ddlx_operation) = mo_environment2->for-ddlx->create_delete_operation( ).
+        lo_delete_ddlx_operation->add_object( c_view_name_travel ).
+        lo_delete_ddlx_operation->add_object( c_view_name_booking ).
+        DATA(result_del_ddlx) = lo_delete_ddlx_operation->execute( ).
+
+        IF debug_modus = abap_true.
+          out->write( |Success: deleting CDS MDE objects| ).
+          DATA(lt_findings) = result_del_ddlx->findings->get(  ).
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO DATA(finding).
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+
+        DATA(lo_delete_bdef_iview_operation) = mo_environment2->for-bdef->create_delete_operation( ).
+        lo_delete_bdef_iview_operation->add_object( i_view_name_travel ).
+
+        IF debug_modus = abap_true.
+          out->write( |add object i bdef for deletion { i_view_name_travel  } | ).
+        ENDIF.
+        DATA(result_del_bdef) = lo_delete_bdef_iview_operation->execute( ).
+
+        IF debug_modus = abap_true.
+          out->write( |Success: deleting bdef interface | ).
+          lt_findings = result_del_bdef->findings->get(  ).
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO finding.
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+
+        DATA(lo_delete_cds_iview_operation) = mo_environment2->for-ddls->create_delete_operation( ).
+        lo_delete_cds_iview_operation->add_object( i_view_name_travel ).
+        lo_delete_cds_iview_operation->add_object( i_view_name_booking ).
+        IF debug_modus = abap_true.
+          out->write( |add object i view for deletion { i_view_name_travel  } and { i_view_name_booking  } | ).
+        ENDIF.
+        DATA(result_del_ddls) = lo_delete_cds_iview_operation->execute( ).
+
+        IF debug_modus = abap_true.
+          out->write( |Success: deleting CDS interface objects| ).
+          lt_findings = result_del_ddls->findings->get(  ).
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO finding.
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+
+      CATCH cx_xco_gen_put_exception INTO DATA(bo_del_exception).
+        out->write( 'error occured' ).
+        out->write( cl_message_helper=>get_latest_t100_exception( bo_del_exception )->if_message~get_longtext( ) ).
+        DATA(bo_del_findings) = bo_del_exception->findings.
+        lt_findings = bo_del_findings->get( ).
+        IF debug_modus = abap_true.
+          IF lt_findings IS NOT INITIAL.
+            LOOP AT lt_findings INTO finding.
+              out->write( finding->message->get_text(  ) ).
+            ENDLOOP.
+          ENDIF.
+        ENDIF.
+    ENDTRY.
+
+  ENDMETHOD.
+
+
+  METHOD generate_cds_mde.
+
+    DATA: pos              TYPE i VALUE 0,
+          lo_field         TYPE REF TO if_xco_gen_ddlx_s_fo_field,
+          lv_del_transport TYPE sxco_transport.
+
+*    DATA(json_string)              = get_json_string(  ).            " get json document
+*    DATA(rap_bo_generator) = zdmo_cl_rap_generator=>create_for_cloud_development( json_string ).
+    DATA(io_rap_bo_node) =  io_root_node  .
+
+    DATA(cts_obj) = xco_cp_abap_repository=>object->for(
+    EXPORTING
+    iv_type = 'DDLX'
+    iv_name = to_upper( c_view_name_travel )
+    )->if_xco_cts_changeable~get_object( ).
+    lv_del_transport = cts_obj->get_lock( )->get_transport( ).
+    lv_del_transport = xco_cp_cts=>transport->for( lv_del_transport )->get_request( )->value.
+
+    DATA(mo_environment)   = xco_cp_generation=>environment->dev_system( lv_del_transport ).
+    DATA(mo_put_operation) = mo_environment->create_put_operation( ).
+*    DATA(lv_package)       = io_rap_bo_node->root_node->package.
+
+
+
+    DATA(lo_specification) = mo_put_operation->for-ddlx->add_object(  io_rap_bo_node->rap_node_objects-meta_data_extension
+      )->set_package( package_name
+      )->create_form_specification( ).
+
+    lo_specification->set_short_description( |MDE for { io_rap_bo_node->rap_node_objects-alias }|
+      )->set_layer( xco_cp_metadata_extension=>layer->customer
+      )->set_view( io_rap_bo_node->rap_node_objects-cds_view_p ). .
+
+    lo_specification->add_annotation( 'UI' )->value->build(
+    )->begin_record(
+        )->add_member( 'headerInfo'
+         )->begin_record(
+          )->add_member( 'typeName' )->add_string( io_rap_bo_node->rap_node_objects-alias && ''
+          )->add_member( 'typeNamePlural' )->add_string( io_rap_bo_node->rap_node_objects-alias && 's'
+          )->add_member( 'title'
+            )->begin_record(
+              )->add_member( 'type' )->add_enum( 'STANDARD'
+              )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && ''
+              )->add_member( 'value' )->add_string( io_rap_bo_node->object_id_cds_field_name && ''
+        )->end_record(
+        )->end_record(
+      "presentationVariant: [ { sortOrder: [{ by: 'TravelID', direction:  #DESC }], visualizations: [{type: #AS_LINEITEM}] }] }
+      )->add_member( 'presentationVariant'
+        )->begin_array(
+          )->begin_record(
+          )->add_member( 'sortOrder'
+            )->begin_array(
+             )->begin_record(
+              )->add_member( 'by' )->add_string( 'TravelID'
+               )->add_member( 'direction' )->add_enum( 'DESC'
+             )->end_record(
+            )->end_array(
+          )->add_member( 'visualizations'
+          )->begin_array(
+             )->begin_record(
+               )->add_member( 'type' )->add_enum( 'AS_LINEITEM'
+             )->end_record(
+            )->end_array(
+          )->end_record(
+          )->end_array(
+          )->end_record(  ).
+
+
+    LOOP AT io_rap_bo_node->lt_fields INTO  DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client.
+      "increase position
+      pos += 10.
+      lo_field = lo_specification->add_field( ls_header_fields-cds_view_field ).
+
+      "put facet annotation in front of the first
+      IF pos = 10.
+        IF io_rap_bo_node->is_root(  ) = abap_true.
+          IF io_rap_bo_node->has_childs(  ).
+            lo_field->add_annotation( 'UI.facet' )->value->build(
+              )->begin_array(
+                )->begin_record(
+                  )->add_member( 'id' )->add_string( 'idCollection'
+                  )->add_member( 'type' )->add_enum( 'COLLECTION'
+                  )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && ''
+                  )->add_member( 'position' )->add_number( 10
+                )->end_record(
+                )->begin_record(
+                  )->add_member( 'id' )->add_string( 'idIdentification'
+                  )->add_member( 'parentId' )->add_string( 'idCollection'
+                  )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+                  )->add_member( 'label' )->add_string( 'General Information'
+                  )->add_member( 'position' )->add_number( 10
+                )->end_record(
+                )->begin_record(
+                  )->add_member( 'id' )->add_string( 'idLineitem'
+                  )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE'
+                  )->add_member( 'label' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && ''
+                  )->add_member( 'position' )->add_number( 20
+                  )->add_member( 'targetElement' )->add_string( '_' && io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias
+                )->end_record(
+              )->end_array( ).
+          ELSE.
+            lo_field->add_annotation( 'UI.facet' )->value->build(
+              )->begin_array(
+                )->begin_record(
+                  )->add_member( 'id' )->add_string( 'idCollection'
+                  )->add_member( 'type' )->add_enum( 'COLLECTION'
+                  )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && ''
+                  )->add_member( 'position' )->add_number( 10
+                )->end_record(
+                )->begin_record(
+                  )->add_member( 'id' )->add_string( 'idIdentification'
+                  )->add_member( 'parentId' )->add_string( 'idCollection'
+                  )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+                  )->add_member( 'label' )->add_string( 'General Information'
+                  )->add_member( 'position' )->add_number( 10
+                )->end_record(
+              )->end_array( ).
+          ENDIF.
+        ELSE.
+          IF io_rap_bo_node->has_childs(  ).
+            lo_field->add_annotation( 'UI.facet' )->value->build(
+              )->begin_array(
+                )->begin_record(
+*                  )->add_member( 'id' )->add_string( CONV #( 'id' && io_rap_bo_node->rap_node_objects-alias )
+                  )->add_member( 'id' )->add_string( 'id' && io_rap_bo_node->rap_node_objects-alias
+                  )->add_member( 'purpose' )->add_enum( 'STANDARD'
+                  )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+                  )->add_member( 'label' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-alias )
+                  )->add_member( 'position' )->add_number( 10
+                )->end_record(
+                )->begin_record(
+                    )->add_member( 'id' )->add_string( 'idLineitem'
+                    )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE'
+                    )->add_member( 'label' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && ''
+                    )->add_member( 'position' )->add_number( 20
+                    )->add_member( 'targetElement' )->add_string( '_' && io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias
+                  )->end_record(
+              )->end_array( ).
+          ELSE.
+            lo_field->add_annotation( 'UI.facet' )->value->build(
+              )->begin_array(
+                )->begin_record(
+*                  )->add_member( 'id' )->add_string( CONV #( 'id' && io_rap_bo_node->rap_node_objects-alias )
+                  )->add_member( 'id' )->add_string( 'id' && io_rap_bo_node->rap_node_objects-alias
+                  )->add_member( 'purpose' )->add_enum( 'STANDARD'
+                  )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE'
+                  )->add_member( 'label' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-alias )
+                  )->add_member( 'position' )->add_number( 10
+                )->end_record(
+              )->end_array( ).
+          ENDIF.
+        ENDIF.
+      ENDIF.
+
+      CASE to_upper( ls_header_fields-name ).
+        WHEN io_rap_bo_node->field_name-uuid.
+          "hide technical key field (uuid)
+          lo_field->add_annotation( 'UI.hidden' )->value->build(  )->add_boolean( iv_value =  abap_true ).
+
+        WHEN io_rap_bo_node->field_name-last_changed_by OR
+             io_rap_bo_node->field_name-last_changed_at OR
+             io_rap_bo_node->field_name-created_at OR io_rap_bo_node->field_name-created_by OR
+             io_rap_bo_node->field_name-local_instance_last_changed_at OR
+             io_rap_bo_node->field_name-parent_uuid OR io_rap_bo_node->field_name-root_uuid OR
+             'MIME_TYPE' OR 'FILE_NAME'.
+          "hide administrative fields and guid-based fields
+          lo_field->add_annotation( 'UI.hidden' )->value->build(  )->add_boolean( iv_value =  abap_true ).
+
+*        WHEN 'LAST_CHANGED_AT' OR
+*             'CREATED_BY' OR 'LOCAL_CREATED_AT' OR 'LOCAL_LAST_CHANGED_BY'
+          .
+          "do nothing. Admin fields not needed on the UI.
+
+        WHEN 'CURRENCY_CODE'.
+          "do nothing. The currency will be automatically displayed with the associated amount fields
+
+*          """""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+*          "display field only on object page
+*          DATA(lo_valuebuilder) = lo_field->add_annotation( 'UI.lineItem' )->value->build( ).
+*          DATA(lo_record) = lo_valuebuilder->begin_array(
+*          )->begin_record(
+*              )->add_member( 'position' )->add_number( pos  ").
+*              )->add_member( 'importance' )->add_enum( 'HIGH').
+*
+*          "label for fields based on a built-in type
+*          IF ls_header_fields-is_data_element = abap_false.
+*            lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ).
+*          ENDIF.
+*          lo_valuebuilder->end_record( )->end_array( ).
+*
+*          lo_valuebuilder = lo_field->add_annotation( 'UI.identification' )->value->build( ).
+*          lo_record = lo_valuebuilder->begin_array(
+*          )->begin_record(
+*              )->add_member( 'position' )->add_number( pos ).
+*          IF ls_header_fields-is_data_element = abap_false.
+*            lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ).
+*          ENDIF.
+*          lo_valuebuilder->end_record( )->end_array( ).
+
+        WHEN OTHERS.
+          "display field
+          DATA lo_valuebuilder TYPE REF TO if_xco_gen_cds_s_fo_ann_v_bldr .
+
+          IF ls_header_fields-name <> 'CURRENCY_CODE'  AND ls_header_fields-name <> 'DESCRIPTION'
+            AND ls_header_fields-name <> 'TOTAL_PRICE' AND ls_header_fields-name <> 'BOOKING_FEE'
+            AND ls_header_fields-name <> 'BEGIN_DATE'  AND ls_header_fields-name <> 'END_DATE'
+            AND ls_header_fields-name <> 'ATTACHMENT'.
+            " line item page
+            lo_valuebuilder = lo_field->add_annotation( 'UI.lineItem' )->value->build( ).
+            DATA(lo_record) = lo_valuebuilder->begin_array(
+            )->begin_record(
+                )->add_member( 'position' )->add_number( pos  ").
+                )->add_member( 'importance' )->add_enum( 'HIGH').
+
+            "label for fields based on a built-in type
+            IF ls_header_fields-is_data_element = abap_false.
+              lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ).
+            ENDIF.
+            lo_valuebuilder->end_record( )->end_array( ).
+          ENDIF.
+
+          "object page
+          lo_valuebuilder = lo_field->add_annotation( 'UI.identification' )->value->build( ).
+          lo_record = lo_valuebuilder->begin_array(
+          )->begin_record(
+              )->add_member( 'position' )->add_number( pos ).
+          IF ls_header_fields-is_data_element = abap_false.
+            lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ).
+          ENDIF.
+          "add label
+          IF ls_header_fields-name = 'ATTACHMENT'.
+            lo_record->add_member( 'label' )->add_string( CONV #( 'Upload a File' ) ).
+          ENDIF.
+          lo_valuebuilder->end_record( )->end_array( ).
+
+          "text alignment
+          IF ls_header_fields-name = 'CUSTOMER_ID' .
+            lo_field->add_annotation( 'UI.textArrangement' )->value->build(  )->add_enum( iv_value =  'TEXT_FIRST' ).
+          ELSEIF ls_header_fields-name = 'OVERALL_STATUS' OR ls_header_fields-name = 'BOOKING_STATUS'.
+            lo_field->add_annotation( 'UI.textArrangement' )->value->build(  )->add_enum( iv_value =  'TEXT_ONLY' ).
+          ENDIF.
+
+          "selection fields
+          IF
+             ls_header_fields-name = 'TRAVEL_ID' OR
+             ls_header_fields-name = 'CUSTOMER_ID' OR
+             ls_header_fields-name = 'AGENCY_ID' .
+
+            lo_field->add_annotation( 'UI.selectionField' )->value->build(
+            )->begin_array(
+            )->begin_record(
+                )->add_member( 'position' )->add_number( pos
+              )->end_record(
+            )->end_array( ).
+          ENDIF.
+          IF io_rap_bo_node->is_root(  ) = abap_true AND
+             io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-managed_uuid  AND
+             ls_header_fields-name = io_rap_bo_node->object_id.
+
+            lo_field->add_annotation( 'UI.selectionField' )->value->build(
+            )->begin_array(
+            )->begin_record(
+                )->add_member( 'position' )->add_number( pos
+              )->end_record(
+            )->end_array( ).
+          ENDIF.
+      ENDCASE.
+    ENDLOOP.
+
+    TRY.
+
+        mo_put_operation->execute(  ).
+
+      CATCH cx_xco_gen_put_exception INTO DATA(bo_del_exception).
+        IF debug_modus = abap_true.
+          io_out->write( 'error occured' ).
+          io_out->write( cl_message_helper=>get_latest_t100_exception( bo_del_exception )->if_message~get_longtext( ) ).
+          DATA(bo_del_findings) = bo_del_exception->findings.
+          DATA(lt_findings) = bo_del_findings->get( ).
+          IF lt_findings IS NOT INITIAL.
+            IF debug_modus = abap_true.
+              LOOP AT lt_findings INTO DATA(finding).
+                io_out->write( finding->message->get_text(  ) ).
+              ENDLOOP.
+            ENDIF.
+          ENDIF.
+        ENDIF.
+    ENDTRY.
+
+  ENDMETHOD.
+
+
+  METHOD generate_data_generator_class.
+    EXIT.  "comment this line out if generation is needed
+
+    DATA(lo_specification) = io_put_operation->for-clas->add_object(  data_generator_class_name
+                                      )->set_package( package_name
+                                      )->create_form_specification( ).
+    lo_specification->set_short_description( |This class generates the test data| ).
+
+    lo_specification->set_short_description( 'Data generator class' ).
+    lo_specification->definition->add_interface( 'if_oo_adt_classrun' ).
+    lo_specification->implementation->add_method( |if_oo_adt_classrun~main|
+      )->set_source( VALUE #(
+
+        " business logic to fill both tables with demo data
+        ( |      DELETE FROM ('{ table_name_root }').| )
+        ( |     " insert travel demo data | )
+        ( |     INSERT ('{ table_name_root }')  FROM ( | )
+        ( |         SELECT | )
+
+        ( |           FROM /dmo/travel AS travel | )
+        ( |           FIELDS | )
+        ( |             travel~travel_id        AS travel_id, | )
+        ( |             travel~agency_id        AS agency_id, | )
+        ( |             travel~customer_id      AS customer_id, | )
+        ( |             travel~begin_date       AS begin_date, | )
+        ( |             travel~end_date         AS end_date, | )
+        ( |             travel~booking_fee      AS booking_fee, | )
+        ( |             travel~total_price      AS total_price, | )
+        ( |             travel~currency_code    AS currency_code, | )
+        ( |             travel~description      AS description, | )
+        ( |             CASE travel~status    "Status [N(New) \| P(Planned) \| B(Booked) \| X(Cancelled)] | )
+        ( |               WHEN 'N' THEN 'O' | )
+        ( |               WHEN 'P' THEN 'O' | )
+        ( |               WHEN 'B' THEN 'A' | )
+        ( |               ELSE 'X' | )
+        ( |             END                     AS overall_status,  "Travel Status [A(Accepted) \| O(Open) \| X(Cancelled)] | )
+        ( |             travel~createdby        AS created_by, | )
+        ( |             travel~createdat        AS created_at, | )
+        ( |             travel~lastchangedby    AS last_changed_by, | )
+        ( |             travel~lastchangedat    AS last_changed_at | )
+        ( |             ORDER BY travel_id UP TO 5 ROWS | )
+        ( |       ). | )
+        ( |     COMMIT WORK. | )
+
+        ( |     " define FROM clause dynamically | )
+        ( |     DATA: dyn_table_name TYPE string. | )
+        ( |     dyn_table_name = \| /dmo/booking    AS booking  \| | )
+        ( |                  && \| JOIN \{ '{ table_name_root }' \} AS z \|  | )
+        ( |                  && \| ON   booking~travel_id = z~travel_id \|. | )
+
+        ( |     DELETE FROM ('{ table_name_child }'). | )
+        ( |     " insert booking demo data | )
+        ( |     INSERT ('{ table_name_child }') FROM ( | )
+        ( |         SELECT | )
+        ( |           FROM (dyn_table_name) | )
+        ( |           FIELDS | )
+        ( |             z~travel_id             AS travel_id           , | )
+        ( |             booking~booking_id      AS booking_id            , | )
+        ( |             booking~booking_date    AS booking_date          ,| )
+        ( |             booking~customer_id     AS customer_id           ,| )
+        ( |             booking~carrier_id      AS carrier_id            ,| )
+        ( |             booking~connection_id   AS connection_id         ,| )
+        ( |             booking~flight_date     AS flight_date           ,| )
+        ( |             booking~flight_price    AS flight_price          ,| )
+        ( |             booking~currency_code   AS currency_code         ,| )
+        ( |             CASE z~overall_status    ""Travel Status [A(Accepted) \| O(Open) \| X(Cancelled)]| )
+        ( |               WHEN 'O' THEN 'N'| )
+        ( |               WHEN 'P' THEN 'N'| )
+        ( |               WHEN 'A' THEN 'B'| )
+        ( |               ELSE 'X'| )
+        ( |             END                     AS booking_status,   "Booking Status [N(New) \| B(Booked) \| X(Cancelled)]| )
+        ( |             z~last_changed_at       AS last_changed_at| )
+        ( |       ).| )
+        ( |     COMMIT WORK.| )
+
+      ) ).
+
+  ENDMETHOD.
+
+
+  METHOD generate_eml_playground_class.
+
+    eml_playground_class_name = |zrap110_eml_playground_{ unique_suffix }|.
+
+    DATA(lo_specification) = io_put_operation->for-clas->add_object(  eml_playground_class_name
+                                      )->set_package( package_name
+                                      )->create_form_specification( ).
+    lo_specification->set_short_description( | EML Playground Class ({ unique_suffix })| ).
+    lo_specification->definition->add_interface( 'if_oo_adt_classrun' ).
+    lo_specification->implementation->add_method( |if_oo_adt_classrun~main|
+      )->set_source( VALUE #(
+      "EML with function
+        ( |     "declare internal table using derived type | )
+        ( |     DATA travel_keys TYPE TABLE FOR READ IMPORT ZRAP110_R_TravelTP_{ unique_suffix } . | )
+        ( |  | )
+        ( |     "fill in relevant travel keys for READ request | )
+        ( |     travel_keys = VALUE #( ( TravelID = 'xxxxx' ) | )
+        ( |                           "( TravelID = '...' ) | )
+        ( |                          ).  | )
+        ( |  | )
+        ( |     "insert your coding here  | )
+        ( |     "read _travel_ instances for specified key  | )
+        ( |     READ ENTITIES OF ZRAP110_R_TravelTP_{ unique_suffix }  | )
+        ( |       ENTITY Travel  | )
+        ( |*        ALL FIELDS       | )
+        ( |        FIELDS ( TravelID AgencyID CustomerID BeginDate EndDate )       | )
+        ( |        WITH travel_keys       | )
+        ( |    RESULT DATA(lt_travels_read)       | )
+        ( |    FAILED DATA(failed)       | )
+        ( |    REPORTED DATA(reported).       | )
+        ( |       | )
+        ( |    "console output       | )
+        ( |    out->write( \| ***Exercise 10: Implement the Base BO Behavior - Functions*** \| ). | )
+        ( |*    out->write( lt_travels_read ). | )
+        ( |    IF failed IS NOT INITIAL. | )
+        ( |      out->write( \|- [ERROR] Cause for failed read: \{ failed-travel[ 1 ]-%fail-cause \} \| ). | )
+        ( |    ENDIF.       | )
+        ( |       | )
+        ( |    "read relevant booking instances | )
+        ( |    READ ENTITIES OF ZRAP110_R_TravelTP_{ unique_suffix } | )
+        ( |      ENTITY Travel BY \\_Booking    | )
+        ( |        FROM CORRESPONDING #( lt_travels_read ) | )
+        ( |        RESULT DATA(lt_bookings_read) | )
+        ( |    LINK DATA(travels_to_bookings).       | )
+        ( |       | )
+        ( |*    "execute function getDaysToFlight   | )
+        ( |*    READ ENTITIES OF ZRAP110_R_TravelTP_{ unique_suffix }   | )
+        ( |*      ENTITY Booking   | )
+        ( |*        EXECUTE getDaysToFlight   | )
+        ( |*          FROM VALUE #( FOR link IN travels_to_bookings ( %tky = link-target-%tky ) )   | )
+        ( |*    RESULT DATA(days_to_flight).       | )
+        ( |*       | )
+        ( |*    "output result structure   | )
+        ( |*    LOOP AT days_to_flight ASSIGNING FIELD-SYMBOL(<days_to_flight>).   | )
+        ( |*      out->write( \| TravelID = \{ <days_to_flight>-%tky-TravelID \} \|  ).   | )
+        ( |*      out->write( \| BookingID = \{ <days_to_flight>-%tky-BookingID \} \| ).   | )
+        ( |*      out->write( \| RemainingDaysToFlight  = \{ <days_to_flight>-%param-remaining_days_to_flight \} \| ).   | )
+        ( |*      out->write( \| InitialDaysToFlight = \{ <days_to_flight>-%param-initial_days_to_flight \} \| ).   | )
+        ( |*      out->write( \| ---------------           \| ).   | )
+        ( |*    ENDLOOP.       | )
+        ( |       | )
+      ) ).
+*
+  ENDMETHOD.
+
+
+  METHOD generate_table.
+    DATA(lo_specification) = io_put_operation->for-tabl-for-database_table->add_object( table_name
+              )->set_package( package_name
+               )->create_form_specification( ).
+
+    lo_specification->set_short_description( table_short_description ).
+    lo_specification->set_data_maintenance( xco_cp_database_table=>data_maintenance->allowed_with_restrictions ).
+    lo_specification->set_delivery_class( xco_cp_database_table=>delivery_class->c ).
+
+    DATA database_table_field  TYPE REF TO if_xco_gen_tabl_dbt_s_fo_field  .
+
+    LOOP AT table_fields INTO DATA(table_field_line).
+      database_table_field = lo_specification->add_field( table_field_line-field  ).
+
+      IF table_field_line-is_key = abap_true.
+        database_table_field->set_key_indicator( ).
+      ENDIF.
+      IF table_field_line-not_null = abap_true.
+        database_table_field->set_not_null( ).
+      ENDIF.
+      IF table_field_line-currencycode IS NOT INITIAL.
+        database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( table_name ) ) )->set_reference_field( to_upper( table_field_line-currencycode ) ).
+      ENDIF.
+      IF table_field_line-unitofmeasure IS NOT INITIAL.
+        database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( table_name ) ) )->set_reference_field( to_upper( table_field_line-unitofmeasure ) ).
+      ENDIF.
+      IF table_field_line-data_element IS NOT INITIAL.
+        database_table_field->set_type( xco_cp_abap_dictionary=>data_element( table_field_line-data_element ) ).
+      ELSE.
+        CASE  to_lower( table_field_line-built_in_type ).
+          WHEN 'accp'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->accp ).
+          WHEN 'clnt'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->clnt ).
+          WHEN 'cuky'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->cuky ).
+          WHEN 'dats'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dats ).
+          WHEN 'df16_raw'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_raw ).
+          WHEN 'df34_raw'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_raw ).
+          WHEN 'fltp'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->fltp ).
+          WHEN 'int1'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int1 ).
+          WHEN 'int2'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int2 ).
+          WHEN 'int4'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int4 ).
+          WHEN 'int8'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int8 ).
+          WHEN 'lang'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lang ).
+          WHEN 'tims'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->tims ).
+          WHEN 'char'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->char( table_field_line-built_in_type_length  ) ).
+          WHEN 'curr'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->curr(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'dec'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dec(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'df16_dec'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_dec(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'df34_dec'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_dec(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+          WHEN 'lchr' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lchr( table_field_line-built_in_type_length  ) ).
+          WHEN 'lraw'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lraw( table_field_line-built_in_type_length  ) ).
+          WHEN 'numc'   .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->numc( table_field_line-built_in_type_length  ) ).
+          WHEN 'quan' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->quan(
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                              ) ).
+          WHEN 'raw'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->raw( table_field_line-built_in_type_length  ) ).
+          WHEN 'rawstring'.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->rawstring( table_field_line-built_in_type_length  ) ).
+          WHEN 'sstring' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->sstring( table_field_line-built_in_type_length  ) ).
+          WHEN 'string' .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->string( table_field_line-built_in_type_length  ) ).
+          WHEN 'unit'  .
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->unit( table_field_line-built_in_type_length  ) ).
+          WHEN OTHERS.
+            database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->for(
+                                              iv_type     = to_upper( table_field_line-built_in_type )
+                                              iv_length   = table_field_line-built_in_type_length
+                                              iv_decimals = table_field_line-built_in_type_decimals
+                                            ) ).
+        ENDCASE.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+
+
+  METHOD generate_virt_elem_book_class.
+
+    DATA(lo_specification) = io_put_operation->for-clas->add_object(  calc_booking_elem_class_name
+                                      )->set_package( package_name
+                                      )->create_form_specification( ).
+
+    lo_specification->set_short_description( |Calculate Booking Virtual Elements| ).
+*    lo_specification->definition->add_interface( 'if_sadl_exit_calc_element_read' ).
+*    lo_specification->implementation->add_method( |if_sadl_exit_calc_element_read~get_calculation_info |
+*      )->set_source( VALUE #(
+*
+*        ( |     IF iv_entity EQ 'ZRAP110_C_BOOKINGTP_{ unique_suffix }'. "Booking BO node | )
+*        ( |      LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_booking_calc_element>).  | )
+*        ( |        CASE <fs_booking_calc_element>.  | )
+*        ( |          WHEN 'INITIALDAYSTOFLIGHT'.  | )
+*        ( |            COLLECT `BOOKINGDATE` INTO et_requested_orig_elements.  | )
+*        ( |            COLLECT `FLIGHTDATE` INTO et_requested_orig_elements.  | )
+*        ( |  | )
+*        ( |          WHEN 'REMAININGDAYSTOFLIGHT'.  | )
+*        ( |            COLLECT `FLIGHTDATE` INTO et_requested_orig_elements.  | )
+*        ( |  | )
+*        ( |          WHEN 'DAYSTOFLIGHTINDICATOR'.  | )
+*        ( |            COLLECT `FLIGHTDATE` INTO et_requested_orig_elements.  | )
+*        ( |  | )
+*        ( |          WHEN 'BOOKINGSTATUSINDICATOR'.  | )
+*        ( |            COLLECT `BOOKINGSTATUS` INTO et_requested_orig_elements.  | )
+*        ( |  | )
+*        ( |        ENDCASE.  | )
+*        ( |      ENDLOOP.  | )
+*        ( |    ENDIF. | )
+*        ( |  | )
+*      ) ).
+
+*    lo_specification->implementation->add_method( |if_sadl_exit_calc_element_read~calculate |
+*    )->set_source( VALUE #(
+*    ( |    IF it_requested_calc_elements IS INITIAL. | )
+*    ( |      EXIT. | )
+*    ( |    ENDIF. | )
+*    ( |  | )
+*    ( |    LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_req_calc_elements>). | )
+*    ( |  | )
+*    ( |      CASE <fs_req_calc_elements>. | )
+*    ( |          "virtual elements from BOOKING entity | )
+*    ( |        WHEN 'INITIALDAYSTOFLIGHT'   OR 'REMAININGDAYSTOFLIGHT' | )
+*    ( |          OR 'DAYSTOFLIGHTINDICATOR' OR 'BOOKINGSTATUSINDICATOR'. | )
+*    ( |  | )
+*    ( |          DATA lt_book_original_data TYPE STANDARD TABLE OF ZRAP110_C_BookingTP_{ unique_suffix } WITH DEFAULT KEY. | )
+*    ( |          lt_book_original_data = CORRESPONDING #( it_original_data ). | )
+*    ( |          LOOP AT lt_book_original_data ASSIGNING FIELD-SYMBOL(<fs_book_original_data>). | )
+*    ( |  | )
+*    ( |*            <fs_book_original_data> = zrap110_calc_book_elem_{ unique_suffix }=>calculate_days_to_flight( <fs_book_original_data> ). | )
+*    ( |  | )
+*    ( |          ENDLOOP. | )
+*    ( |  | )
+*    ( |          ct_calculated_data = CORRESPONDING #( lt_book_original_data ). | )
+*    ( |  | )
+*    ( |      ENDCASE. | )
+*    ( |    ENDLOOP. | )
+*    ) ).
+*
+*    lo_specification->definition->remove_interface( 'if_sadl_exit' ).
+
+  ENDMETHOD.
+
+
+  METHOD generate_virt_elem_trav_class.
+
+    DATA(lo_specification) = io_put_operation->for-clas->add_object(  calc_travel_elem_class_name
+                                      )->set_package( package_name
+                                      )->create_form_specification( ).
+
+    lo_specification->set_short_description( |Calculate Travel Virtual Elements| ).
+*    lo_specification->definition->add_interface( 'if_sadl_exit_calc_element_read' ).
+*    lo_specification->implementation->add_method( |if_sadl_exit_calc_element_read~get_calculation_info |
+*      )->set_source( VALUE #(
+*
+*        ( |     IF iv_entity EQ 'ZRAP110_C_TRAVELTP_{ unique_suffix }'. "Travel BO node | )
+*        ( |      LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_travel_calc_element>).  | )
+*        ( |        CASE <fs_travel_calc_element>.  | )
+*        ( |          WHEN 'OVERALLSTATUSINDICATOR'.  | )
+*        ( |            APPEND 'OVERALLSTATUS' TO et_requested_orig_elements.  | )
+*        ( |  | )
+*        ( |        ENDCASE.  | )
+*        ( |      ENDLOOP.  | )
+*        ( |    ENDIF. | )
+*        ( |  | )
+*      ) ).
+
+*    lo_specification->implementation->add_method( |if_sadl_exit_calc_element_read~calculate |
+*    )->set_source( VALUE #(
+*    ( |    IF it_requested_calc_elements IS INITIAL. | )
+*    ( |      EXIT. | )
+*    ( |    ENDIF. | )
+*    ( |  | )
+*    ( |    LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_req_calc_elements>). | )
+*    ( |      CASE <fs_req_calc_elements>. | )
+*    ( |          "virtual elements from TRAVEL entity | )
+*    ( |        WHEN 'OVERALLSTATUSINDICATOR'. | )
+*    ( |  | )
+*    ( |          DATA lt_trav_original_data TYPE STANDARD TABLE OF ZRAP110_C_TravelTP_{ unique_suffix } WITH DEFAULT KEY. | )
+*    ( |          lt_trav_original_data = CORRESPONDING #( it_original_data ). | )
+*    ( |          LOOP AT lt_trav_original_data ASSIGNING FIELD-SYMBOL(<fs_trav_original_data>). | )
+*    ( |  | )
+*    ( |*            <fs_trav_original_data> = zrap110_calc_trav_elem_{ unique_suffix }=>calculate_trav_status_ind( <fs_trav_original_data> ). | )
+*    ( |  | )
+*    ( |          ENDLOOP. | )
+*    ( |  | )
+*    ( |          ct_calculated_data = CORRESPONDING #( lt_trav_original_data ). | )
+*    ( |  | )
+*    ( |      ENDCASE. | )
+*    ( |    ENDLOOP. | )
+*    ) ).
+*
+*    lo_specification->definition->remove_interface( 'if_sadl_exit' ).
+
+  ENDMETHOD.
+
+
+  METHOD get_child_table_fields.
+    child_table_fields = VALUE tt_fields(
+                   ( field         = 'client'
+                     data_element  = 'mandt'
+                     is_key        = 'X'
+                     not_null      = 'X' )
+                   ( field         = 'travel_id'
+                     data_element  = '/dmo/travel_id'
+                     is_key        = 'X'
+                     not_null      = 'X' )
+                   ( field         = 'booking_id'
+                     data_element  = '/dmo/booking_id'
+                     is_key        = 'X'
+                     not_null      = 'X' )
+                   ( field         = 'booking_date'
+                     data_element  = '/dmo/booking_date' )
+                   ( field         = 'customer_id'
+                     data_element  = '/dmo/customer_id' )
+                   ( field         = 'carrier_id'
+                     data_element  = '/dmo/carrier_id' )
+                   ( field         = 'connection_id'
+                     data_element  = '/dmo/connection_id' )
+                   ( field         = 'flight_date'
+                     data_element  = '/dmo/flight_date' )
+                   ( field         = 'flight_price'
+                     data_element  = '/dmo/flight_price'
+                     currencycode  = 'currency_code'  )
+                   ( field         = 'currency_code'
+                     data_element  = '/dmo/currency_code' )
+                   ( field         = 'booking_status'
+                     data_element  = '/dmo/booking_status' )
+                   ( field         = 'local_last_changed_at'
+                     data_element  = 'abp_locinst_lastchange_tstmpl' )
+                   ).
+  ENDMETHOD.
+
+
+  METHOD get_json_string.
+
+    " build the json document
+    json_string =
+
+|\{\r\n| &
+|    "namespace":"Z",\r\n| &
+|    "package":"{ package_name }", \r\n| &
+|    "bindingType":"odata_v4_ui",    \r\n| &
+|    "implementationType":"managed_semantic",\r\n| &
+|    "prefix":"RAP110_",\r\n| &
+|    "suffix":"_{ unique_suffix }",\r\n| &
+|    "datasourcetype": "table",\r\n| &
+|    "draftEnabled":true,\r\n| &
+**********
+|    "createtable":true,\r\n| &
+**********
+
+
+|    "multiInlineEdit":false,\r\n| &
+|    "isCustomizingTable":false,\r\n| &
+|    "addBusinessConfigurationRegistration":false,\r\n| &
+|    "transportRequest":"{ transport }",\r\n| &
+|\r\n| &
+|    "hierarchy":\r\n| &
+|    \{\r\n| &
+|    "entityname":"Travel",\r\n| &
+|    "dataSource":"{ table_name_root }",\r\n| &
+|    "objectid":"TRAVEL_ID",\r\n| &
+|    "uuid":"",\r\n| &
+|    "parentUUID":"",\r\n| &
+|    "rootUUID":"",\r\n| &
+|    "etagMaster":"LOCAL_LAST_CHANGED_AT",\r\n| &
+|    "totalEtag":"LAST_CHANGED_AT",\r\n| &
+|    "lastChangedAt":"LAST_CHANGED_AT",\r\n| &
+|    "lastChangedBy":"",\r\n| &
+|    "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",\r\n| &
+|    "createdAt":"CREATED_AT",\r\n| &
+|    "createdBy":"",\r\n| &
+|    "draftTable":"{ draft_table_name_root }",\r\n| &
+* |    "cdsInterfaceView":"{ i_view_name_travel  }",\r\n| &
+|    "cdsRestrictedReuseView":"{ r_view_name_travel  }",\r\n| &
+|    "cdsProjectionView":"{ c_view_name_travel  }",\r\n| &
+|    "metadataExtensionView":"{ c_view_name_travel  }",\r\n| &
+|\r\n| &
+|    "behaviorImplementationClass":"{ beh_impl_name_travel }",\r\n| &
+|    \r\n| &
+|    "serviceDefinition":"{ srv_definition_name }",\r\n| &
+|    "serviceBinding":"{ srv_binding_o4_name }",\r\n| &
+|    "controlStructure":"",\r\n| &
+|    "customQueryImplementationClass":"",\r\n| &
+|    "associations": [ \r\n| &
+|        \{\r\n| &
+|            "name": "_Agency",\r\n| &
+|            "target": "/DMO/I_Agency",\r\n| &
+|            "cardinality": "zero_to_one",\r\n| &
+|            "conditions": [\r\n| &
+|            \{\r\n| &
+|                "projectionField": "AgencyID",\r\n| &
+|                "associationField": "AgencyID"    \r\n| &
+|            \}\r\n| &
+|            ]\r\n| &
+|        \},\r\n| &
+|        \{\r\n| &
+|            "name": "_Customer",\r\n| &
+|            "target": "/DMO/I_Customer",\r\n| &
+|            "cardinality": "zero_to_one",\r\n| &
+|            "conditions": [\r\n| &
+|            \{\r\n| &
+|                "projectionField": "CustomerID",\r\n| &
+|                "associationField": "CustomerID"    \r\n| &
+|            \}\r\n| &
+|            ]\r\n| &
+|        \},\r\n| &
+|        \{\r\n| &
+|            "name": "_OverallStatus",\r\n| &
+|            "target": "/DMO/I_Overall_Status_VH",\r\n| &
+|            "cardinality": "one_to_one",\r\n| &
+|            "conditions": [\r\n| &
+|            \{\r\n| &
+|                "projectionField": "OverallStatus",\r\n| &
+|                "associationField": "OverallStatus"    \r\n| &
+|            \}\r\n| &
+|            ]\r\n| &
+|        \},\r\n| &
+|        \{\r\n| &
+|            "name": "_Currency",\r\n| &
+|            "target": "I_Currency",\r\n| &
+|            "cardinality": "zero_to_one",\r\n| &
+|            "conditions": [\r\n| &
+|            \{\r\n| &
+|                "projectionField": "CurrencyCode",\r\n| &
+|                "associationField": "Currency"    \r\n| &
+|            \}\r\n| &
+|            ]\r\n| &
+|        \}\r\n| &
+|    ], | &
+|    "valueHelps": [ \r\n| &
+|       \{\r\n| &
+|           "alias": "Agency",\r\n| &
+|           "name": "/DMO/I_Agency_StdVH",\r\n| &
+|           "localElement": "AgencyID",\r\n| &
+|           "element": "AgencyID"\r\n| &
+|       \},\r\n| &
+|       \{\r\n| &
+|           "alias": "CustomerVh",\r\n| &
+|           "name": "/DMO/I_Customer_StdVH",\r\n| &
+|           "localElement": "CustomerID",\r\n| &
+|           "element": "CustomerID"\r\n| &
+|       \},\r\n| &
+|       \{\r\n| &
+|           "alias": "CurrencyVh",\r\n| &
+|           "name": "I_CurrencyStdVH",\r\n| &
+|           "localElement": "CurrencyCode",\r\n| &
+|           "element": "Currency"\r\n| &
+|       \},\r\n| &
+|       \{\r\n| &
+|           "alias": "OverallStatusVh",\r\n| &
+|           "name": "/DMO/I_Overall_Status_VH",\r\n| &
+|           "localElement": "OverallStatus",\r\n| &
+|           "element": "OverallStatus"\r\n| &
+|       \}\r\n| &
+|    ], | &&
+*""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+*|        "objectswithadditionalfields": [| && |\r\n|  &&
+*'            {' && |\r\n|  &&
+*'                "object": "cds_projection_view",' && |\r\n|  &&
+*'                "additionalfields": [' && |\r\n|  &&
+*'                    {' && |\r\n|  &&
+*'                        "fieldname": "_Agency.Name",' && |\r\n|  &&
+*'                        "alias": "AgencyName"' && |\r\n|  &&
+*'                    },' && |\r\n|  &&
+*'                    {' && |\r\n|  &&
+*'                        "fieldname": "_Customer.LastName",' && |\r\n|  &&
+*'                        "alias": "CustomerName"' && |\r\n|  &&
+*'                    }' && |\r\n|  &&
+*'                ]' && |\r\n|  &&
+*'            }' && |\r\n|  &&
+*'        ],' && |\r\n|  &&
+
+
+*|         \{\r\n| &
+*|           "fieldname": "_OverallStatus._Text.Text",\r\n| &
+*|           "alias": "OverallStatusText",\r\n| &
+*|           "localized": "true"\r\n| &
+*|         \}\r\n| &
+
+*""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+*|    "mapping":\r\n| &
+*|    [\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"CLIENT",\r\n| &
+*|    "cds_view_field":"Client"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"TRAVEL_ID",\r\n| &
+*|    "cds_view_field":"TravelID"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"AGENCY_ID",\r\n| &
+*|    "cds_view_field":"AgencyID"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"CUSTOMER_ID",\r\n| &
+*|    "cds_view_field":"CustomerID"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"BEGIN_DATE",\r\n| &
+*|    "cds_view_field":"BeginDate"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"END_DATE",\r\n| &
+*|    "cds_view_field":"EndDate"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"BOOKING_FEE",\r\n| &
+*|    "cds_view_field":"BookingFee"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"TOTAL_PRICE",\r\n| &
+*|    "cds_view_field":"TotalPrice"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"CURRENCY_CODE",\r\n| &
+*|    "cds_view_field":"CurrencyCode"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"DESCRIPTION",\r\n| &
+*|    "cds_view_field":"Description"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"ATTACHMENT",\r\n| &
+*|    "cds_view_field":"Attachment"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"MIME_TYPE",\r\n| &
+*|    "cds_view_field":"MimeType"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"FILE_NAME",\r\n| &
+*|    "cds_view_field":"FileName"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"OVERALL_STATUS",\r\n| &
+*|    "cds_view_field":"OverallStatus"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"CREATED_BY",\r\n| &
+*|    "cds_view_field":"CreatedBy"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"LOCAL_CREATED_AT",\r\n| &
+*|    "cds_view_field":"LocalCreatedAt"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"LOCAL_LAST_CHANGED_BY",\r\n| &
+*|    "cds_view_field":"LocalLastChangedBy"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"LOCAL_LAST_CHANGED_AT",\r\n| &
+*|    "cds_view_field":"LocalLastChangedAt"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"LAST_CHANGED_AT",\r\n| &
+*|    "cds_view_field":"LastChangedAt"\r\n| &
+*|    \}\r\n| &
+*|    ],\r\n| &&
+
+**********************************************************************
+
+'"fields": [' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CLIENT",' && |\r\n|  &&
+'            "dataelement": "MANDT",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "iskey": true,' && |\r\n|  &&
+'            "notnull": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "TRAVEL_ID",' && |\r\n|  &&
+'            "dataelement": "/dmo/travel_id",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "iskey": true,' && |\r\n|  &&
+'            "notnull": true,' && |\r\n|  &&
+'            "cdsviewfieldname": "TravelID"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "AGENCY_ID",' && |\r\n|  &&
+'            "dataelement": "/dmo/agency_id",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "cdsviewfieldname": "AgencyID"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CUSTOMER_ID",' && |\r\n|  &&
+'            "dataelement": "/dmo/customer_id",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "cdsviewfieldname": "CustomerID"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "BEGIN_DATE",' && |\r\n|  &&
+'            "dataelement": "/dmo/begin_date",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "cdsviewfieldname": "BeginDate"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "END_DATE",' && |\r\n|  &&
+'            "dataelement": "/dmo/end_date",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "cdsviewfieldname": "EndDate"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "BOOKING_FEE",' && |\r\n|  &&
+'            "dataelement": "/dmo/booking_fee",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "currencycode": "CURRENCY_CODE",' && |\r\n|  &&
+'            "cdsviewfieldname": "BookingFee"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "TOTAL_PRICE",' && |\r\n|  &&
+'            "dataelement": "/dmo/total_price",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "currencycode": "CURRENCY_CODE",' && |\r\n|  &&
+'            "cdsviewfieldname": "TotalPrice"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CURRENCY_CODE",' && |\r\n|  &&
+'            "dataelement": "/dmo/currency_code",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "cdsviewfieldname": "CurrencyCode"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "DESCRIPTION",' && |\r\n|  &&
+'            "dataelement": "/dmo/description",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "cdsviewfieldname": "Description"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "OVERALL_STATUS",' && |\r\n|  &&
+'            "dataelement": "/dmo/overall_status",' && |\r\n|  &&
+'            "cdsviewfieldname": "OverallStatus",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "ATTACHMENT",' && |\r\n|  &&
+'            "dataelement": "/dmo/attachment",' && |\r\n|  &&
+'            "cdsviewfieldname": "Attachment",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "MIME_TYPE",' && |\r\n|  &&
+'            "dataelement": "/dmo/mime_type",' && |\r\n|  &&
+'            "cdsviewfieldname": "MimeType",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "FILE_NAME",' && |\r\n|  &&
+'            "dataelement": "/dmo/filename",' && |\r\n|  &&
+'            "cdsviewfieldname": "FileName",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "LAST_CHANGED_AT",' && |\r\n|  &&
+'            "dataelement": "ABP_LASTCHANGE_TSTMPL",' && |\r\n|  &&
+'            "cdsviewfieldname": "LastChangedAt",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CREATED_BY",' && |\r\n|  &&
+'            "dataelement": "abp_creation_user",' && |\r\n|  &&
+'            "cdsviewfieldname": "CreatedBy",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CREATED_AT",' && |\r\n|  &&
+'            "dataelement": "abp_creation_tstmpl",' && |\r\n|  &&
+'            "cdsviewfieldname": "CreatedAt",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "LOCAL_LAST_CHANGED_BY",' && |\r\n|  &&
+'            "dataelement": "abp_locinst_lastchange_user",' && |\r\n|  &&
+'            "cdsviewfieldname": "LocalLastChangedBy",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "LOCAL_LAST_CHANGED_AT",' && |\r\n|  &&
+'            "dataelement": "abp_locinst_lastchange_tstmpl",' && |\r\n|  &&
+'            "cdsviewfieldname": "LocalLastChangedAt",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        }' && |\r\n|  &&
+'    ],' &&
+
+
+**********
+
+|    "Children":\r\n| &
+|    [\r\n| &
+|    \{\r\n| &
+|    "entityname":"Booking",\r\n| &
+|    "dataSource":"{ table_name_child }",\r\n| &
+|    "objectid":"BOOKING_ID",\r\n| &
+|    "uuid":"",\r\n| &
+|    "parentUUID":"",\r\n| &
+|    "rootUUID":"",\r\n| &
+|    "etagMaster":"LOCAL_LAST_CHANGED_AT",\r\n| &
+|    "totalEtag":"",\r\n| &
+|    "lastChangedAt":"",\r\n| &
+|    "lastChangedBy":"",\r\n| &
+|    "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",\r\n| &
+|    "createdAt":"",\r\n| &
+|    "createdBy":"",\r\n| &
+|    "draftTable":"{ draft_table_name_child }",\r\n| &
+* |    "cdsInterfaceView":"{ i_view_name_booking }",\r\n| &
+|    "cdsRestrictedReuseView":"{ r_view_name_booking }",\r\n| &
+|    "cdsProjectionView":"{ c_view_name_booking }",\r\n| &
+|    "metadataExtensionView":"{ c_view_name_booking }",\r\n| &
+|    "behaviorImplementationClass":"{ beh_impl_name_booking }",\r\n| &
+|    "serviceDefinition":"",\r\n| &
+|    "serviceBinding":"",\r\n| &
+|    "controlStructure":"",\r\n| &
+|    "customQueryImplementationClass":"",\r\n| &
+|    "associations": [ \r\n| &
+|        \{\r\n| &
+|            "name": "_Customer",\r\n| &
+|            "target": "/DMO/I_Customer",\r\n| &
+|            "cardinality": "one_to_one",\r\n| &
+|            "conditions": [\r\n| &
+|            \{\r\n| &
+|                "projectionField": "CustomerID",\r\n| &
+|                "associationField": "CustomerID"    \r\n| &
+|            \}\r\n| &
+|            ]\r\n| &
+|        \},\r\n| &
+|        \{\r\n| &
+|            "name": "_Carrier",\r\n| &
+|            "target": "/DMO/I_Carrier",\r\n| &
+|            "cardinality": "one_to_one",\r\n| &
+|            "conditions": [\r\n| &
+|            \{\r\n| &
+|                "projectionField": "CarrierID",\r\n| &
+|                "associationField": "AirlineID"    \r\n| &
+|            \}\r\n| &
+|            ]\r\n| &
+|        \},\r\n| &
+|        \{\r\n| &
+|            "name": "_Connection",\r\n| &
+|            "target": "/DMO/I_Connection",\r\n| &
+|            "cardinality": "one_to_one",\r\n| &
+|            "conditions": [\r\n| &
+|            \{\r\n| &
+|                "projectionField": "CarrierID",\r\n| &
+|                "associationField": "AirlineID"    \r\n| &
+|            \},\r\n| &
+|            \{\r\n| &
+|                "projectionField": "ConnectionID",\r\n| &
+|                "associationField": "ConnectionID"    \r\n| &
+|            \}\r\n| &
+|            ]\r\n| &
+|        \},\r\n| &
+|        \{\r\n| &
+|            "name": "_Flight",\r\n| &
+|            "target": "/DMO/I_Flight",\r\n| &
+|            "cardinality": "one_to_one",\r\n| &
+|            "conditions": [\r\n| &
+|            \{\r\n| &
+|                "projectionField": "CarrierID",\r\n| &
+|                "associationField": "AirlineID"    \r\n| &
+|            \},\r\n| &
+|            \{\r\n| &
+|                "projectionField": "ConnectionID",\r\n| &
+|                "associationField": "ConnectionID"    \r\n| &
+|            \},\r\n| &
+|            \{\r\n| &
+|                "projectionField": "FlightDate",\r\n| &
+|                "associationField": "FlightDate"    \r\n| &
+|            \}\r\n| &
+|            ]\r\n| &
+|        \},\r\n| &
+|        \{\r\n| &
+|            "name": "_BookingStatus",\r\n| &
+|            "target": "/DMO/I_Booking_Status_VH",\r\n| &
+|            "cardinality": "one_to_one",\r\n| &
+|            "conditions": [\r\n| &
+|            \{\r\n| &
+|                "projectionField": "BookingStatus",\r\n| &
+|                "associationField": "BookingStatus"    \r\n| &
+|            \}\r\n| &
+|            ]\r\n| &
+|        \},\r\n| &
+|        \{\r\n| &
+|            "name": "_Currency",\r\n| &
+|            "target": "I_Currency",\r\n| &
+|            "cardinality": "zero_to_one",\r\n| &
+|            "conditions": [\r\n| &
+|            \{\r\n| &
+|                "projectionField": "CurrencyCode",\r\n| &
+|                "associationField": "Currency"    \r\n| &
+|            \}\r\n| &
+|            ]\r\n| &
+|        \}\r\n| &
+|    ], | &
+|    "valueHelps": [ \r\n| &
+|       \{\r\n| &
+|           "alias": "CustomerVh",\r\n| &
+|           "name": "/DMO/I_Customer_StdVH",\r\n| &
+|           "localElement": "CustomerID",\r\n| &
+|           "element": "CustomerID"\r\n| &
+|       \},\r\n| &
+|       \{\r\n| &
+|           "alias": "Airline",\r\n| &
+|           "name": "/DMO/I_Flight",\r\n| &
+|           "localElement": "CarrierID",\r\n| &
+|           "element": "AirlineID",\r\n| &
+|           "additionalBinding": [ \r\n| &
+|              \{\r\n| &
+|                  "localElement": "FlightDate",\r\n| &
+|                  "element": "FlightDate"\r\n| &
+|                 ,"usage": "RESULT"\r\n| &
+|              \},\r\n| &
+|              \{\r\n| &
+|                  "localElement": "ConnectionID",\r\n| &
+|                  "element": "ConnectionID"\r\n| &
+|                 ,"usage": "RESULT"\r\n| &
+|              \}, \r\n| &
+|              \{\r\n| &
+|                  "localElement": "FlightPrice",\r\n| &
+|                  "element": "Price"\r\n| &
+|                 ,"usage": "RESULT"\r\n| &
+|              \},  \r\n| &
+|              \{\r\n| &
+|                  "localElement": "CurrencyCode",\r\n| &
+|                  "element": "CurrencyCode"\r\n| &
+|                 ,"usage": "RESULT"\r\n| &
+|              \}  \r\n| &
+|           ]\r\n| &
+|       \},\r\n| &
+|       \{\r\n| &
+|           "alias": "Flight",\r\n| &
+|           "name": "/DMO/I_Flight",\r\n| &
+|           "localElement": "ConnectionID",\r\n| &
+|           "element": "ConnectionID",\r\n| &
+|           "additionalBinding": [ \r\n| &
+|              \{\r\n| &
+|                  "localElement": "FlightDate",\r\n| &
+|                  "element": "FlightDate"\r\n| &
+|                 ,"usage": "RESULT"\r\n| &
+|              \},\r\n| &
+|              \{\r\n| &
+|                  "localElement": "CarrierID",\r\n| &
+|                  "element": "AirlineID"\r\n| &
+|                 ,"usage": "FILTER_AND_RESULT"\r\n| &
+|              \}, \r\n| &
+|              \{\r\n| &
+|                  "localElement": "FlightPrice",\r\n| &
+|                  "element": "Price"\r\n| &
+|                 ,"usage": "RESULT"\r\n| &
+|              \},  \r\n| &
+|              \{\r\n| &
+|                  "localElement": "CurrencyCode",\r\n| &
+|                  "element": "CurrencyCode"\r\n| &
+|                 ,"usage": "RESULT"\r\n| &
+|              \}  \r\n| &
+|           ]\r\n| &
+|       \},\r\n| &
+|       \{\r\n| &
+|           "alias": "Date",\r\n| &
+|           "name": "/DMO/I_Flight",\r\n| &
+|           "localElement": "FlightDate",\r\n| &
+|           "element": "FlightDate",\r\n| &
+|           "additionalBinding": [ \r\n| &
+|              \{\r\n| &
+|                  "localElement": "CarrierID",\r\n| &
+|                  "element": "AirlineID"\r\n| &
+|                 ,"usage": "FILTER_AND_RESULT"\r\n| &
+|              \}, \r\n| &
+|              \{\r\n| &
+|                  "localElement": "ConnectionID",\r\n| &
+|                  "element": "ConnectionID"\r\n| &
+|                 ,"usage": "FILTER_AND_RESULT"\r\n| &
+|              \},\r\n| &
+|              \{\r\n| &
+|                  "localElement": "FlightPrice",\r\n| &
+|                  "element": "Price"\r\n| &
+|                 ,"usage": "RESULT"\r\n| &
+|              \},  \r\n| &
+|              \{\r\n| &
+|                  "localElement": "CurrencyCode",\r\n| &
+|                  "element": "CurrencyCode"\r\n| &
+|                 ,"usage": "RESULT"\r\n| &
+|              \}  \r\n| &
+|           ]\r\n| &
+|       \},\r\n| &
+|       \{\r\n| &
+|           "alias": "Date",\r\n| &
+|           "name": "/DMO/I_Flight",\r\n| &
+|           "localElement": "FlightPrice",\r\n| &
+|           "element": "Price",\r\n| &
+|           "additionalBinding": [ \r\n| &
+|              \{\r\n| &
+|                  "localElement": "CarrierID",\r\n| &
+|                  "element": "AirlineID"\r\n| &
+|                 ,"usage": "FILTER_AND_RESULT"\r\n| &
+|              \}, \r\n| &
+|              \{\r\n| &
+|                  "localElement": "ConnectionID",\r\n| &
+|                  "element": "ConnectionID"\r\n| &
+|                 ,"usage": "FILTER_AND_RESULT"\r\n| &
+|              \},\r\n| &
+|              \{\r\n| &
+|                  "localElement": "FlightDate",\r\n| &
+|                  "element": "FlightDate"\r\n| &
+|                 ,"usage": "FILTER_AND_RESULT"\r\n| &
+|              \},  \r\n| &
+|              \{\r\n| &
+|                  "localElement": "CurrencyCode",\r\n| &
+|                  "element": "CurrencyCode"\r\n| &
+|                 ,"usage": "RESULT"\r\n| &
+|              \}  \r\n| &
+|           ]\r\n| &
+|       \},\r\n| &
+|       \{\r\n| &
+|           "alias": "Currencyvh2",\r\n| &
+|           "name": "I_CurrencyStdVH",\r\n| &
+|           "localElement": "CurrencyCode",\r\n| &
+|           "element": "Currency"\r\n| &
+|       \},\r\n| &
+|       \{\r\n| &
+|           "alias": "BookingStatus",\r\n| &
+|           "name": "/DMO/I_Booking_Status_VH",\r\n| &
+|           "localElement": "BookingStatus",\r\n| &
+|           "element": "BookingStatus"\r\n| &
+|       \}\r\n| &
+|    ], | &&
+*""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+*| "objectswithadditionalfields": [ | && |\r\n|  &&
+*'                    {' && |\r\n|  &&
+*'                        "object": "cds_projection_view",' && |\r\n|  &&
+*'                        "additionalfields": [' && |\r\n|  &&
+*'                            {' && |\r\n|  &&
+*'                                "fieldname": "_Customer.LastName",' && |\r\n|  &&
+*'                                "alias": "CustomerName"' && |\r\n|  &&
+*'                            },' && |\r\n|  &&
+*'                            {' && |\r\n|  &&
+*'                                "fieldname": "_Carrier.LastName",' && |\r\n|  &&
+*'                                "alias": "CarrierName"' && |\r\n|  &&
+*'                            }' && |\r\n|  &&
+*'                        ]' && |\r\n|  &&
+*'                    }' && |\r\n|  &&
+*'                ],' && |\r\n|  &&
+
+*|         \{\r\n| &
+*|           "fieldname": "_BookingStatus._Text.Text",\r\n| &
+*|           "alias": "BookingStatusText",\r\n| &
+*|           "localized": "true" \r\n| &
+*|         \}\r\n| &
+
+*""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+*|    "mapping":\r\n| &
+*|    [\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"CLIENT",\r\n| &
+*|    "cds_view_field":"Client"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"TRAVEL_ID",\r\n| &
+*|    "cds_view_field":"TravelID"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"BOOKING_ID",\r\n| &
+*|    "cds_view_field":"BookingID"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"BOOKING_DATE",\r\n| &
+*|    "cds_view_field":"BookingDate"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"CUSTOMER_ID",\r\n| &
+*|    "cds_view_field":"CustomerID"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"CARRIER_ID",\r\n| &
+*|    "cds_view_field":"CarrierID"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"CONNECTION_ID",\r\n| &
+*|    "cds_view_field":"ConnectionID"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"FLIGHT_DATE",\r\n| &
+*|    "cds_view_field":"FlightDate"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"FLIGHT_PRICE",\r\n| &
+*|    "cds_view_field":"FlightPrice"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"CURRENCY_CODE",\r\n| &
+*|    "cds_view_field":"CurrencyCode"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"BOOKING_STATUS",\r\n| &
+*|    "cds_view_field":"BookingStatus"\r\n| &
+*|    \},\r\n| &
+*|    \{\r\n| &
+*|    "dbtable_field":"LOCAL_LAST_CHANGED_AT",\r\n| &
+*|    "cds_view_field":"LocalLastChangedAt"\r\n| &
+*|    \}\r\n| &
+*|    ],\r\n| &&
+
+************
+'"fields": [' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CLIENT",' && |\r\n|  &&
+'            "dataelement": "MANDT",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "iskey": true,' && |\r\n|  &&
+'            "notnull": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "TRAVEL_ID",' && |\r\n|  &&
+'            "dataelement": "/dmo/travel_id",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "cdsviewfieldname": "TravelID",' && |\r\n|  &&
+'            "iskey": true,' && |\r\n|  &&
+'            "notnull": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "BOOKING_ID",' && |\r\n|  &&
+'            "dataelement": "/dmo/booking_id",' && |\r\n|  &&
+'            "cdsviewfieldname": "BookingID",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "iskey": true,' && |\r\n|  &&
+'            "notnull": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "BOOKING_DATE",' && |\r\n|  &&
+'            "dataelement": "/dmo/booking_date",' && |\r\n|  &&
+'            "cdsviewfieldname": "BookingDate",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CUSTOMER_ID",' && |\r\n|  &&
+'            "dataelement": "/dmo/customer_id",' && |\r\n|  &&
+'            "cdsviewfieldname": "CustomerID",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CARRIER_ID",' && |\r\n|  &&
+'            "dataelement": "/dmo/carrier_id",' && |\r\n|  &&
+'            "cdsviewfieldname": "CarrierID",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CONNECTION_ID",' && |\r\n|  &&
+'            "dataelement": "/dmo/connection_id",' && |\r\n|  &&
+'            "cdsviewfieldname": "ConnectionID",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "FLIGHT_DATE",' && |\r\n|  &&
+'            "dataelement": "/dmo/flight_date",' && |\r\n|  &&
+'            "cdsviewfieldname": "FlightDate",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "BOOKING_STATUS",' && |\r\n|  &&
+'            "dataelement": "/dmo/booking_status",' && |\r\n|  &&
+'            "cdsviewfieldname": "BookingStatus",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "FLIGHT_PRICE",' && |\r\n|  &&
+'            "dataelement": "/dmo/flight_price",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "cdsviewfieldname": "FlightPrice",' && |\r\n|  &&
+'            "currencycode": "CURRENCY_CODE"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CURRENCY_CODE",' && |\r\n|  &&
+'            "dataelement": "/dmo/currency_code",' && |\r\n|  &&
+'            "cdsviewfieldname": "CurrencyCode",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "LOCAL_LAST_CHANGED_AT",' && |\r\n|  &&
+'            "dataelement": "abp_locinst_lastchange_tstmpl",' && |\r\n|  &&
+'            "cdsviewfieldname": "LocalLastChangedAt",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        }' && |\r\n|  &&
+'    ]' &&
+
+*********
+
+|    \}\r\n| &
+|    ]\r\n| &
+|    \}\r\n| &
+|    \}|
+.
+
+  ENDMETHOD.
+
+
+  METHOD get_root_table_fields.
+    root_table_fields = VALUE tt_fields(
+                  ( field         = 'client'
+                    data_element  = 'mandt'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'travel_id'
+                    data_element  = '/dmo/travel_id'
+                    is_key        = 'X'
+                    not_null      = 'X' )
+                  ( field         = 'agency_id'
+                    data_element  = '/dmo/agency_id' )
+                  ( field         = 'customer_id'
+                    data_element  = '/dmo/customer_id' )
+                  ( field         = 'begin_date'
+                    data_element  = '/dmo/begin_date' )
+                  ( field         = 'end_date'
+                    data_element  = '/dmo/end_date' )
+                  ( field         = 'booking_fee'
+                    data_element  = '/dmo/booking_fee'
+                    currencycode  = 'currency_code' )
+                  ( field         = 'total_price'
+                    data_element  = '/dmo/total_price'
+                    currencycode  = 'currency_code' )
+                  ( field         = 'currency_code'
+                    data_element  = '/dmo/currency_code' )
+                  ( field         = 'description'
+                    data_element  = '/dmo/description' )
+                  ( field         = 'overall_status'
+                    data_element  = '/dmo/overall_status' )
+                  ( field         = 'attachment'
+                    data_element  = '/dmo/attachment' )
+                  ( field         = 'mime_type'
+                    data_element  = '/dmo/mime_type' )
+                  ( field         = 'file_name'
+                    data_element  = '/dmo/filename' )
+                  ( field         = 'created_by'
+                    data_element  = 'abp_creation_user' )
+                  ( field         = 'local_created_at'
+                    data_element  = 'abp_creation_tstmpl' )
+                  ( field         = 'local_last_changed_by'
+                    data_element  = 'abp_locinst_lastchange_user' )
+                  ( field         = 'local_last_changed_at'
+                    data_element  = 'abp_locinst_lastchange_tstmpl' )
+                  ( field         = 'last_changed_at'
+                    data_element  = 'abp_lastchange_tstmpl' )
+                    ).
+  ENDMETHOD.
+
+
+  METHOD get_unique_suffix.
+
+    DATA: ls_package_name  TYPE sxco_package,
+          is_valid_package TYPE abap_bool,
+          step_number      TYPE i.
+
+    DATA: ascii_hex TYPE x LENGTH 3.
+    DATA ascii_hex_string TYPE string.
+    s_unique_suffix = ''.
+    is_valid_package = abap_false.
+    ascii_hex = 1.
+    ascii_hex_string = ascii_hex.
+    ascii_hex_string = substring( val = ascii_hex_string off = strlen( ascii_hex_string ) - 3 len = 3 ).
+
+    WHILE is_valid_package = abap_false.
+
+      "check package name
+      ls_package_name = s_prefix && ascii_hex_string.
+      DATA(lo_package) = xco_lib->get_package( ls_package_name ). "  xco_cp_abap_repository=>object->devc->for( ls_package_name ).
+      IF NOT lo_package->exists( ).
+        is_valid_package = abap_true.
+        s_unique_suffix = ascii_hex_string.
+      ELSE.
+        ascii_hex += 1.
+        ascii_hex_string = ascii_hex.
+        ascii_hex_string = substring( val = ascii_hex_string off = strlen( ascii_hex_string ) - 3 len = 3 ).
+
+        step_number += 1.
+      ENDIF.
+
+      IF step_number > 10000.
+        ASSERT 1 = 2.
+      ENDIF.
+
+    ENDWHILE.
+
+  ENDMETHOD.
+
+
+  METHOD if_oo_adt_classrun~main.
+
+    debug_modus = abap_true.
+
+*    transport = 'D23K900976'. " <-- maintain your transport request here
+    package_name           = 'ZRAP110_' && unique_suffix.
+
+
+    DATA(lo_transport_target) = xco_lib->get_package( co_zrap110_ex_package
+              )->read( )-property-transport_layer->get_transport_target( ).
+
+    DATA(new_transport_object) = xco_cp_cts=>transports->workbench( lo_transport_target->value  )->create_request( |Package name: { package_name } | ).
+    transport = new_transport_object->value.
+
+    out->write( | RAP110 exercise generator | ).
+    out->write( | ------------------------------------- | ).
+    .
+
+    "database tables
+    table_name_root               = to_upper( |zrap110_atrav{ unique_suffix }| ).
+    table_name_child              = to_upper( |zrap110_abook{ unique_suffix }| ).
+    draft_table_name_root         = to_upper( |zrap110_dtrav{ unique_suffix }| ).
+    draft_table_name_child        = to_upper( |zrap110_dbook{ unique_suffix }| ).
+    data_generator_class_name     = |zrap110_data_generator_{ unique_suffix }|.
+    "CDS views
+    r_view_name_travel            = to_upper( |zrap110_R_TravelTP_{ unique_suffix }| ).
+    r_view_name_booking           = to_upper( |zrap110_R_BookingTP_{ unique_suffix }| ).
+    c_view_name_travel            = to_upper( |zrap110_C_TravelTP_{ unique_suffix }| ).
+    c_view_name_booking           = to_upper( |zrap110_C_BookingTP_{ unique_suffix }| ) .
+    i_view_name_travel            = |zrap110_I_TravelTP_{ unique_suffix }|.
+    i_view_name_booking           = |zrap110_I_BookingTP_{ unique_suffix }|.
+    calc_travel_elem_class_name   = |zrap110_calc_trav_elem_{ unique_suffix }|.
+    calc_booking_elem_class_name  = |zrap110_calc_book_elem_{ unique_suffix }|.
+    eml_playground_class_name     = |zrap110_eml_playground_{ unique_suffix }|.
+    create_mde_files              = abap_true.
+    "behavior pools
+    beh_impl_name_travel          = |zrap110_BP_TravelTP_{ unique_suffix }|.
+    beh_impl_name_booking         = |zrap110_BP_BookingTP_{ unique_suffix }|.
+    "business service
+    srv_definition_name           = |zrap110_UI_Travel_{ unique_suffix }|.
+    srv_binding_o4_name           = |zrap110_UI_Travel_O4_{ unique_suffix }|.
+
+
+    " to upper
+    package_name  = to_upper( package_name ).
+    unique_suffix = to_upper( unique_suffix ).
+
+    out->write( | Use transport { transport }| ).
+
+    DATA(my_package) = xco_lib->get_package( package_name ).
+    IF my_package->exists( ) = abap_false.
+      out->write( | Info: Suffix "{ unique_suffix }" will be used. | ).
+    ELSE.
+      out->write( | Note: Package "{ package_name }" already exists. | ).
+    ENDIF.
+
+    TRY.
+        "create package
+        create_package( transport ).
+      CATCH cx_root INTO DATA(package_exception).
+        IF debug_modus = abap_true.
+          out->write( | Error during create_package( ). | ).
+        ENDIF.
+    ENDTRY.
+
+*    create_tables( out ).
+
+    mo_environment                 = get_environment( transport ).
+    mo_put_operation               = get_put_operation( mo_environment )."->create_put_operation( ).
+
+    "create abstract entities
+    create_abs_ent_a_create_travel( out ).
+    create_abs_ent_a_daystoflight( out ).
+    create_abs_ent_a_travel( out ).
+
+    DATA(lo_table_root)  = xco_cp_abap_repository=>object->tabl->for( CONV #( table_name_root ) ).
+    DATA(lo_table_child) = xco_cp_abap_repository=>object->tabl->for( CONV #( table_name_child ) ).
+
+
+*    IF lo_table_root->exists(  )  = abap_true AND
+*       lo_table_child->exists(  ) = abap_true.
+
+    create_rap_bo(
+      EXPORTING
+        out          = out
+      IMPORTING
+        eo_root_node = DATA(root_node)
+    )..
+
+    delete_iview_and_mde( out = out ).
+
+*    ENDIF.
+
+    DATA(lo_travel_bdef) = xco_cp_abap_repository=>object->bdef->for( CONV #( r_view_name_travel  ) ).
+*      DATA(lo_travel_bdef) = xco_cp_abap_repository=>object->bdef->for( r_view_name_travel  ).
+
+    IF lo_travel_bdef->exists(  ).
+      generate_cds_mde(
+        io_out       = out
+        io_root_node = root_node
+      ).
+      generate_cds_mde(
+        io_out       = out
+        io_root_node = root_node->all_childnodes[ 1 ]
+      ).
+      create_additional_objects( out = out ).
+    ENDIF.
+
+    create_number_range(  out = out ).
+
+    out->write( | The following package got created for you and includes everything you need: { package_name } | ).
+    out->write( | In the "Project Explorer" right click on "Favorite Packages" and click on "Add Package...". | ).
+    out->write( | Enter "{ package_name }" and click OK. | ).
+
+
+
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_gen_rap110_single.clas.xml b/src/zdmo_gen_rap110_single.clas.xml
new file mode 100644
index 0000000..06302b3
--- /dev/null
+++ b/src/zdmo_gen_rap110_single.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_GEN_RAP110_SINGLE</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>zdmo_gen_rap110_single</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_gen_rap630_single.clas.abap b/src/zdmo_gen_rap630_single.clas.abap
new file mode 100644
index 0000000..4b32076
--- /dev/null
+++ b/src/zdmo_gen_rap630_single.clas.abap
@@ -0,0 +1,680 @@
+CLASS zDMO_gen_rap630_single DEFINITION
+
+INHERITING FROM zdmo_cl_rap_generator_base
+**************************************************************************
+**
+** Welcome to the RAP110 travel exercise generator!
+**
+** STAND: 2023-05-08 --> OKAY
+** Adjust superpackage and TR
+** ...
+**************************************************************************
+
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+
+  PUBLIC SECTION.
+    INTERFACES if_oo_adt_classrun.
+    METHODS constructor
+      IMPORTING i_unique_suffix TYPE string OPTIONAL.
+
+  PROTECTED SECTION.
+
+  PRIVATE SECTION.
+
+
+    CONSTANTS:
+      co_prefix                     TYPE string           VALUE 'ZRAP630_',
+      co_entity_name                TYPE string           VALUE 'Shop',
+      co_session_name               TYPE string           VALUE 'RAP630',
+      co_software_component_base_bo TYPE sxco_package     VALUE 'ZLOCAL',
+      co_software_component_ext_bo  TYPE sxco_package     VALUE 'ZLOCAL',
+      co_super_package_base_bo      TYPE sxco_package     VALUE 'ZLOCAL',
+      co_super_package_ext_bo       TYPE sxco_package     VALUE 'ZLOCAL'
+*      co_super_package_base_bo      TYPE sxco_package     VALUE 'ZRAP630',
+*      co_super_package_ext_bo       TYPE sxco_package     VALUE 'ZRAP630_EXT'
+      .
+
+
+
+
+
+
+
+
+
+
+
+    DATA xco_on_prem_library TYPE REF TO zdmo_cl_rap_xco_on_prem_lib.
+    DATA xco_lib             TYPE REF TO zdmo_cl_rap_xco_lib.
+    DATA package_name           TYPE sxco_package .
+    DATA extension_package_name           TYPE sxco_package .
+    DATA unique_suffix          TYPE string.
+*    DATA mo_environment         TYPE REF TO if_xco_cp_gen_env_dev_system.
+    DATA transport              TYPE sxco_transport .
+    DATA transport_extensions   TYPE sxco_transport .
+    "database tables
+    DATA table_name_root        TYPE sxco_dbt_object_name.
+    DATA table_name_child       TYPE sxco_dbt_object_name.
+    DATA draft_table_name_root  TYPE sxco_dbt_object_name.
+    DATA draft_table_name_child TYPE sxco_dbt_object_name.
+    DATA data_generator_class_name TYPE sxco_ad_object_name.
+    DATA calc_travel_elem_class_name TYPE sxco_ad_object_name.
+    DATA calc_booking_elem_class_name TYPE sxco_ad_object_name.
+    DATA eml_playground_class_name TYPE sxco_ad_object_name.
+    "CDS views
+    DATA r_view_name_travel   TYPE sxco_cds_object_name.
+    DATA r_view_name_booking  TYPE sxco_cds_object_name.
+    DATA c_view_name_travel   TYPE sxco_cds_object_name.
+    DATA c_view_name_booking  TYPE sxco_cds_object_name.
+    DATA i_view_name_travel   TYPE sxco_cds_object_name.
+    DATA i_view_basic_name_travel   TYPE sxco_cds_object_name.
+    DATA i_view_name_booking  TYPE sxco_cds_object_name.
+    DATA create_mde_files     TYPE abap_bool.
+    "Behavior pools
+    DATA beh_impl_name_travel   TYPE sxco_ao_object_name.
+    DATA beh_impl_name_booking  TYPE sxco_ao_object_name.
+    "business service
+    DATA srv_definition_name    TYPE sxco_srvd_object_name.
+    DATA srv_binding_o4_name    TYPE sxco_srvb_service_name.
+    DATA debug_modus            TYPE abap_bool VALUE abap_true.
+
+
+    TYPES: BEGIN OF t_table_fields,
+             field                  TYPE sxco_ad_field_name,
+             is_key                 TYPE abap_bool,
+             not_null               TYPE abap_bool,
+             currencyCode           TYPE sxco_cds_field_name,
+             unitOfMeasure          TYPE sxco_cds_field_name,
+             data_element           TYPE sxco_ad_object_name,
+             built_in_type          TYPE cl_xco_ad_built_in_type=>tv_type,
+             built_in_type_length   TYPE cl_xco_ad_built_in_type=>tv_length,
+             built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals,
+           END OF t_table_fields.
+
+    TYPES: tt_fields TYPE STANDARD TABLE OF t_table_fields WITH KEY field.
+
+    METHODS create_rap_bo IMPORTING out          TYPE REF TO if_oo_adt_classrun_out
+                          EXPORTING eo_root_node TYPE REF TO zdmo_cl_rap_node .
+
+    METHODS get_unique_suffix     IMPORTING VALUE(s_prefix)     TYPE string RETURNING VALUE(s_unique_suffix) TYPE string.
+    METHODS create_transport      RETURNING VALUE(lo_transport) TYPE sxco_transport.
+    METHODS create_package        IMPORTING VALUE(lo_transport) TYPE sxco_transport.
+    METHODS create_extension_package IMPORTING VALUE(lo_transport) TYPE sxco_transport.
+
+    METHODS get_json_string           RETURNING VALUE(json_string) TYPE string.
+
+    METHODS generate_vh_custom_entity IMPORTING VALUE(lo_transport) TYPE sxco_transport .
+
+
+ENDCLASS.
+
+
+
+CLASS ZDMO_GEN_RAP630_SINGLE IMPLEMENTATION.
+
+
+  METHOD constructor.
+    super->constructor( ).
+
+    xco_on_prem_library = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+
+    "check whether being on cloud or on prem
+    IF xco_on_prem_library->on_premise_branch_is_used(  ) = abap_true.
+      xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib(  ).
+    ELSE.
+      xco_lib = NEW zdmo_cl_rap_xco_cloud_lib(  ).
+    ENDIF.
+
+    IF i_unique_suffix IS INITIAL.
+      unique_suffix          = get_unique_suffix( co_prefix ).
+    ELSE.
+      unique_suffix = i_unique_suffix.
+    ENDIF.
+
+  ENDMETHOD.
+
+
+  METHOD create_extension_package.
+    DATA(package_environment) = get_environment( lo_transport ).
+    DATA(lo_put_operation) = get_put_operation_for_devc( package_environment ).
+    DATA(lo_specification) = lo_put_operation->add_object( extension_package_name )->create_form_specification( ).
+    lo_specification->set_short_description( |#Generated { co_session_name }  extension tutorial package| ).
+    lo_specification->properties->set_super_package( co_software_component_ext_bo )->set_software_component( co_software_component_ext_bo ).
+    DATA(lo_result) = lo_put_operation->execute( ).
+  ENDMETHOD.
+
+
+  METHOD create_package.
+    DATA(package_environment) = get_environment( lo_transport ).
+    DATA(lo_put_operation) = get_put_operation_for_devc( package_environment ).
+    DATA(lo_specification) = lo_put_operation->add_object( package_name )->create_form_specification( ).
+    lo_specification->set_short_description( |#Generated { co_session_name }  tutorial package| ).
+    lo_specification->properties->set_super_package( co_software_component_base_bo )->set_software_component( co_software_component_base_bo ).
+*    lo_specification->properties->set_super_package( 'ZRAP630' )->set_software_component( co_software_component_base_bo ).
+    DATA(lo_result) = lo_put_operation->execute( ).
+  ENDMETHOD.
+
+
+  METHOD create_rap_bo.
+
+    DATA(json_string)              = get_json_string(  ).            " get json document
+
+    DATA(abap_language_version_number) = xco_lib->get_abap_language_version( package_name ).
+
+    DATA background_process TYPE REF TO if_bgmc_process_single_op.
+    DATA bgpf_operation TYPE REF TO zdmo_cl_rap_generator_asyn .
+    bgpf_operation = NEW zdmo_cl_rap_generator_asyn(
+      i_json_string              = json_string
+      i_package_language_version = abap_language_version_number
+*      i_rap_bo_uuid              =
+    ).
+    TRY.
+        background_process = cl_bgmc_process_factory=>get_default(  )->create(  ).
+        background_process->set_operation_tx_uncontrolled( bgpf_operation ).
+        background_process->set_name( CONV #( |Generate { r_view_name_travel } | ) ).
+        background_process->save_for_execution(  ).
+      CATCH cx_bgmc INTO DATA(bgmc_exception).
+        "handle exception
+        out->write( |BGPF error { bgmc_exception->get_text(  ) }| ).
+    ENDTRY.
+    COMMIT WORK.
+
+  ENDMETHOD.
+
+
+  METHOD create_transport.
+    DATA(ls_package) = xco_lib->get_package( co_software_component_base_bo ).
+    IF ls_package->read( )-property-record_object_changes = abap_true.
+*    DATA(ls_package) = xco_cp_abap_repository=>package->for( co_zlocal_package )->read( ).
+      DATA(lv_transport_layer) = ls_package->read( )-property-transport_layer->value.
+      DATA(lv_transport_target) = ls_package->read( )-property-transport_layer->get_transport_target( )->value.
+      DATA(lo_transport_request) = xco_cp_cts=>transports->workbench( lv_transport_target )->create_request( '#Generated RAP110 tutorial transport request' ).
+      lo_transport = lo_transport_request->value.
+    ENDIF.
+  ENDMETHOD.
+
+
+  METHOD generate_vh_custom_entity.
+    DATA(vh_environment) = get_environment( lo_transport ).
+    DATA(lo_put_operation) = get_put_operation( vh_environment ).             ""ZRAP630I_VH_Product_{ unique_suffix }"
+    DATA(lo_interface_specification) = lo_put_operation->for-ddls->add_object( |ZRAP630I_VH_Product_{ unique_suffix }|
+        )->set_package( package_name
+        )->create_form_specification( ).
+    "add entity description
+    DATA(lo_custom_entity) = lo_interface_specification->set_short_description( 'Value help for products'
+    )->add_custom_entity( ).
+
+
+
+    " Annotations can be added to custom entities.
+    lo_custom_entity->add_annotation( 'ObjectModel.query.implementedBy' )->value->build( )->add_string( |ABAP:{ to_upper( data_generator_class_name ) }| ).
+
+
+    "add view annotation
+    lo_custom_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Value help for products' ).
+    " Add fields.
+
+
+
+    DATA(lo_identifier) = lo_custom_entity->add_field( xco_cp_ddl=>field( 'Product' )
+    )->set_type( xco_cp_abap_dictionary=>built_in_type->char( 40 ) ).
+    lo_identifier->set_key( ).
+    lo_identifier = lo_custom_entity->add_field( xco_cp_ddl=>field( 'ProductText' )
+    )->set_type( xco_cp_abap_dictionary=>built_in_type->char( 40 )  ).
+
+    lo_identifier = lo_custom_entity->add_field( xco_cp_ddl=>field( 'ProductGroup' )
+    )->set_type( xco_cp_abap_dictionary=>built_in_type->char( 40 )  ).
+    lo_identifier = lo_custom_entity->add_field( xco_cp_ddl=>field( 'Price' )
+    )->set_type( xco_cp_abap_dictionary=>built_in_type->curr(
+                   iv_length   = 15
+                   iv_decimals = 2
+                 )  ).
+    lo_identifier->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'Currency' ).
+    lo_identifier = lo_custom_entity->add_field( xco_cp_ddl=>field( 'Currency' )
+    )->set_type( xco_cp_abap_dictionary=>built_in_type->cuky ).
+    lo_identifier = lo_custom_entity->add_field( xco_cp_ddl=>field( 'BaseUnit' )
+       )->set_type( xco_cp_abap_dictionary=>built_in_type->unit( 3 ) ).
+
+
+*    DATA(package_environment) = get_environment( lo_transport ).
+*    DATA(lo_put_operation) = get_put_operation( package_environment ).
+
+
+
+    DATA(lo_specification) = lo_put_operation->for-clas->add_object(  data_generator_class_name
+                                          )->set_package( package_name
+                                          )->create_form_specification( ).
+    lo_specification->set_short_description( |This class provide value help data| ).
+
+
+    DATA(lo_public_section) = lo_specification->definition->section-public.
+    lo_public_section->add_type( 't_products'
+      )->for_table_type(
+        io_row_type = xco_cp_abap_dictionary=>table_type( |ZRAP630I_VH_Product_{ unique_suffix }| )
+        io_primary_key = xco_cp_table_type=>primary_key->not_specified( xco_cp_table_type=>key_category->not_specified ) ).
+
+    lo_public_section->add_method( 'get_products'
+      )->add_returning_parameter( 'products'
+      )->set_type( lo_specification->own->type( 't_products' ) ).
+
+    lo_public_section->add_data( 'producty'
+      )->set_type( lo_specification->own->type( 't_products' )
+      )->set_read_only( ).
+
+    lo_specification->implementation->add_method( |get_products|
+          )->set_source( VALUE #(
+         (  |"| )
+         ( |  products = VALUE #( | )
+  ( |  ( Product = 'ZPRINTER01' ProductText = 'Printer Professional ABC' Price = '500.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST'  ) | )
+  ( |  ( Product = 'ZPRINTER02' ProductText = 'Printer Platinum' Price = '800.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST'  ) | )
+  ( |  ( Product = 'D001' ProductText = 'Mobile Phone' Price = '850.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST'  )  | )
+  ( |  ( Product = 'D002' ProductText = 'Table PC' Price = '900.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST'  ) | )
+  ( |  ( Product = 'D003' ProductText = 'Office Table' Price = '599.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST'  )  | )
+  ( |  ( Product = 'D004' ProductText = 'Office Chair' Price = '449.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST'  )  | )
+  ( |  ( Product = 'D005' ProductText = 'Developer Notebook' Price = '3150.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST'  ) | )
+  ( |  ( Product = 'D006' ProductText = 'Mouse' Price = '79.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST'  )  | )
+  ( |  ( Product = 'D007' ProductText = 'Headset' Price = '159.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST'  )  | )
+  ( |  ( Product = 'D008' ProductText = 'Keyboard' Price = '39.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST'  ) | )
+  ( |   ). | )
+
+
+
+          )
+           ) .
+
+    lo_specification->set_short_description( 'Value help for products' ).
+    lo_specification->definition->add_interface( 'if_rap_query_provider' ).
+    lo_specification->implementation->add_method( |if_rap_query_provider~select|
+      )->set_source( VALUE #(
+
+        " business logic to fill both tables with demo data
+        ( |  DATA business_data TYPE TABLE OF ZRAP630I_VH_Product_{ unique_suffix }.| )
+        ( |  DATA business_data_line TYPE ZRAP630I_VH_Product_{ unique_suffix } .       | )
+        ( |  DATA(skip)    = io_request->get_paging( )->get_offset( ). | )
+        ( |  DATA(requested_fields)  = io_request->get_requested_elements( ). | )
+        ( |  DATA(sort_order)    = io_request->get_sort_elements( ). | )
+        ( |  TRY. | )
+        ( |    DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ). | )
+        ( |    business_data = get_products(  ).| )
+        ( |    SELECT * FROM @business_data AS implementation_types| )
+        ( |       WHERE (filter_condition) INTO TABLE @business_data.| )
+        ( |    io_response->set_total_number_of_records( lines( business_data ) ).| )
+        ( |    io_response->set_data( business_data ).| )
+        ( |    CATCH cx_root INTO DATA(exception).| )
+        ( |    DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).| )
+        ( |    DATA(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.| )
+        ( |    RAISE EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity| )
+        ( |        EXPORTING | )
+        ( |          textid   = VALUE scx_t100key( msgid = exception_t100_key-msgid | )
+        ( |          msgno = exception_t100_key-msgno| )
+        ( |          attr1 = exception_t100_key-attr1| )
+        ( |          attr2 = exception_t100_key-attr2| )
+        ( |          attr3 = exception_t100_key-attr3| )
+        ( |          attr4 = exception_t100_key-attr4 )| )
+        ( |    previous = exception.| )
+        ( |  ENDTRY. | )
+        ( |    | )
+      ) ).
+
+
+
+
+
+
+    DATA(lo_result) = lo_put_operation->execute( ).
+
+
+
+
+
+  ENDMETHOD.
+
+
+  METHOD get_json_string.
+
+    " build the json document
+    json_string =
+
+|\{\r\n| &
+|    "namespace":"Z",\r\n| &
+|    "package":"{ package_name }", \r\n| &
+|    "bindingType":"odata_v4_ui",    \r\n| &
+|    "implementationType":"managed_uuid",\r\n| &
+|    "prefix":"{ co_session_name }",\r\n| &
+|    "suffix":"_{ unique_suffix }",\r\n| &
+|    "datasourcetype": "table",\r\n| &
+|    "draftEnabled":true,\r\n| &
+**********
+|    "createtable":true,\r\n| &
+**********
+|    "publishservice":true,\r\n| &
+|    "isextensible":true,\r\n| &
+*|    "extensibilityElementSuffix":"ZAA",\r\n| &
+
+"|     "addbasiciviews":false,\r\n| &
+|     "addbasiciviews":true,\r\n| &
+|    "multiInlineEdit":false,\r\n| &
+|    "isCustomizingTable":false,\r\n| &
+|    "addBusinessConfigurationRegistration":false,\r\n| &
+|    "transportRequest":"{ transport }",\r\n| &
+|\r\n| &
+|    "hierarchy":\r\n| &&
+|    \{\r\n| &&
+|    "entityname":"{ co_entity_name }",\r\n| &&
+|    "dataSource":"{ table_name_root }",\r\n| &&
+|    "objectid":"ORDER_ID",\r\n| &&
+|    "uuid":"ORDER_UUID",\r\n| &&
+|    "parentUUID":"",\r\n| &&
+|    "rootUUID":"",\r\n| &&
+|    "etagMaster":"LOCAL_LAST_CHANGED_AT",\r\n| &&
+|    "totalEtag":"LAST_CHANGED_AT",\r\n| &&
+|    "lastChangedAt":"LAST_CHANGED_AT",\r\n| &&
+|    "lastChangedBy":"LAST_CHANGED_BY",\r\n| &&
+|    "localInstanceLastChangedBy":"LOCAL_LAST_CHANGED_BY",\r\n| &&
+|    "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",\r\n| &&
+|    "createdAt":"CREATED_AT",\r\n| &&
+|    "createdBy":"CREATED_BY",\r\n| &&
+|    "extensibilityElementSuffix":"ZAA",\r\n| &
+
+|    "valueHelps": [ \r\n| &
+|       \{\r\n| &
+|           "alias": "Product",\r\n| &
+|           "name": "ZRAP630I_VH_Product_{ unique_suffix }",\r\n| &
+|           "localElement": "OrderedItem",\r\n| &
+|           "element": "Product"\r\n| &
+|       \}\r\n| &
+
+|    ], | &&
+**********************************************************************
+
+'"fields": [' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CLIENT",' && |\r\n|  &&
+'            "dataelement": "MANDT",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "iskey": true,' && |\r\n|  &&
+'            "notnull": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "ORDER_UUID",' && |\r\n|  &&
+'            "dataelement": "sysuuid_x16",' && |\r\n|  &&
+'            "isdataelement": true,' && |\r\n|  &&
+'            "iskey": true,' && |\r\n|  &&
+'            "notnull": true,' && |\r\n|  &&
+'            "cdsviewfieldname": "OrderUUID"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+
+'        {' && |\r\n|  &&
+'            "abapfieldname": "ORDER_ID",' && |\r\n|  &&
+'            "isbuiltintype": true,' && |\r\n|  &&
+'            "builtintype": "CHAR",' && |\r\n|  &&
+'            "builtintypelength": 10,' && |\r\n|  &&
+'            "cdsviewfieldname": "OrderID"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+
+'         {' && |\r\n|  &&
+'            "abapfieldname": "ORDERED_ITEM",' && |\r\n|  &&
+'            "isbuiltintype": true,' && |\r\n|  &&
+'            "builtintype": "CHAR",' && |\r\n|  &&
+'            "builtintypelength": 40,' && |\r\n|  &&
+'            "cdsviewfieldname": "OrderedItem"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CURRENCY_CODE",' && |\r\n|  &&
+'            "isbuiltintype": true,' && |\r\n|  &&
+'            "builtintype": "CUKY",' && |\r\n|  &&
+'            "builtintypelength": 5,' && |\r\n|  &&
+'            "cdsviewfieldname": "CurrencyCode"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+
+'        {' && |\r\n|  &&
+'            "abapfieldname": "ORDER_ITEM_PRICE",' && |\r\n|  &&
+'            "currencycode": "CURRENCY_CODE",' && |\r\n| &&
+'            "isbuiltintype": true,' && |\r\n|  &&
+'            "builtintype": "CURR",' && |\r\n|  &&
+'            "builtintypelength": 11,' && |\r\n|  &&
+'            "builtintypedecimals": 2,' && |\r\n|  &&
+'            "cdsviewfieldname": "OrderItemPrice"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+
+
+
+'        {' && |\r\n|  &&
+'            "abapfieldname": "DELIVERY_DATE",' && |\r\n|  &&
+'            "isbuiltintype": true,' && |\r\n|  &&
+'            "builtintype": "DATS",' && |\r\n|  &&
+'            "cdsviewfieldname": "DeliveryDate"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+
+'        {' && |\r\n|  &&
+'            "abapfieldname": "OVERALL_STATUS",' && |\r\n|  &&
+'            "isbuiltintype": true,' && |\r\n|  &&
+'            "builtintype": "CHAR",' && |\r\n|  &&
+'            "builtintypelength": 30,' && |\r\n|  &&
+'            "cdsviewfieldname": "OverallStatus"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+
+'        {' && |\r\n|  &&
+'            "abapfieldname": "NOTES",' && |\r\n|  &&
+'            "isbuiltintype": true,' && |\r\n|  &&
+'            "builtintype": "CHAR",' && |\r\n|  &&
+'            "builtintypelength": 256,' && |\r\n|  &&
+'            "cdsviewfieldname": "Notes"' && |\r\n|  &&
+'        },' && |\r\n|  &&
+
+'        {' && |\r\n|  &&
+'            "abapfieldname": "LAST_CHANGED_AT",' && |\r\n|  &&
+'            "dataelement": "ABP_LASTCHANGE_TSTMPL",' && |\r\n|  &&
+'            "cdsviewfieldname": "LastChangedAt",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CREATED_BY",' && |\r\n|  &&
+'            "dataelement": "abp_creation_user",' && |\r\n|  &&
+'            "cdsviewfieldname": "CreatedBy",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "CREATED_AT",' && |\r\n|  &&
+'            "dataelement": "abp_creation_tstmpl",' && |\r\n|  &&
+'            "cdsviewfieldname": "CreatedAt",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "LOCAL_LAST_CHANGED_BY",' && |\r\n|  &&
+'            "dataelement": "abp_locinst_lastchange_user",' && |\r\n|  &&
+'            "cdsviewfieldname": "LocalLastChangedBy",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "LAST_CHANGED_BY",' && |\r\n|  &&
+'            "dataelement": "ABP_LASTCHANGE_USER",' && |\r\n|  &&
+'            "cdsviewfieldname": "LastChangedBy",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        },' && |\r\n|  &&
+'        {' && |\r\n|  &&
+'            "abapfieldname": "LOCAL_LAST_CHANGED_AT",' && |\r\n|  &&
+'            "dataelement": "abp_locinst_lastchange_tstmpl",' && |\r\n|  &&
+'            "cdsviewfieldname": "LocalLastChangedAt",' && |\r\n|  &&
+'            "isdataelement": true' && |\r\n|  &&
+'        }' && |\r\n|  &&
+'    ]' &&
+
+
+**********
+
+
+*********
+
+|    \}\r\n| &
+|    \}|
+.
+
+  ENDMETHOD.
+
+
+  METHOD get_unique_suffix.
+
+    DATA: ls_package_name  TYPE sxco_package,
+
+          is_valid_package TYPE abap_bool,
+          step_number      TYPE i.
+
+    DATA: ascii_hex TYPE x LENGTH 3.
+    DATA ascii_hex_string TYPE string.
+    s_unique_suffix = ''.
+    is_valid_package = abap_false.
+    ascii_hex = 90.
+    ascii_hex_string = ascii_hex.
+    ascii_hex_string = substring( val = ascii_hex_string off = strlen( ascii_hex_string ) - 3 len = 3 ).
+
+    WHILE is_valid_package = abap_false.
+
+      "check package name(s)
+      ls_package_name = s_prefix && ascii_hex_string.
+
+      DATA(lo_package) = xco_lib->get_package( ls_package_name ). "  xco_cp_abap_repository=>object->devc->for( ls_package_name ).
+      DATA(extension_package) = xco_lib->get_package( extension_package_name ). "  xco_cp_abap_repository=>object->devc->for( ls_package_name ).
+
+      IF NOT lo_package->exists( ) AND
+         NOT extension_package->exists( ).
+        is_valid_package = abap_true.
+        s_unique_suffix = ascii_hex_string.
+      ELSE.
+        ascii_hex += 1.
+        ascii_hex_string = ascii_hex.
+        ascii_hex_string = substring( val = ascii_hex_string off = strlen( ascii_hex_string ) - 3 len = 3 ).
+
+        step_number += 1.
+      ENDIF.
+
+      IF step_number > 10000.
+        ASSERT 1 = 2.
+      ENDIF.
+
+    ENDWHILE.
+
+  ENDMETHOD.
+
+
+  METHOD if_oo_adt_classrun~main.
+
+    debug_modus = abap_true.
+
+*    transport = 'D23K900976'. " <-- maintain your transport request here
+    package_name           = co_prefix && unique_suffix.
+    extension_package_name = package_name && '_EXT' .
+
+    DATA(lo_transport_target) = xco_lib->get_package( co_software_component_base_bo
+              )->read( )-property-transport_layer->get_transport_target( ).
+
+    DATA(new_transport_object) = xco_cp_cts=>transports->workbench( lo_transport_target->value  )->create_request( |Package name: { package_name } | ).
+    transport = new_transport_object->value.
+
+
+    DATA(lo_transport_target_ext) = xco_lib->get_package( co_software_component_ext_bo
+              )->read( )-property-transport_layer->get_transport_target( ).
+
+    DATA(new_transport_object_ext) = xco_cp_cts=>transports->workbench( lo_transport_target_ext->value  )->create_request( |Package name: { extension_package_name } | ).
+    transport_extensions = new_transport_object_ext->value.
+
+    out->write( | { co_session_name } exercise generator | ).
+    out->write( | ------------------------------------- | ).
+    .
+
+    "database tables
+    table_name_root               = to_upper( |{ co_prefix }ashop{ unique_suffix }| ).
+    draft_table_name_root         = to_upper( |{ co_prefix }dshop{ unique_suffix }| ).
+    "CDS views
+    r_view_name_travel            = to_upper( |{ co_prefix }R_{ co_entity_name }TP_{ unique_suffix }| ).
+    c_view_name_travel            = to_upper( |{ co_prefix }C_{ co_entity_name }TP_{ unique_suffix }| ).
+    i_view_name_travel            = |{ co_prefix }I_{ co_entity_name }TP_{ unique_suffix }|.
+    i_view_basic_name_travel      = |{ co_prefix }I_{ co_entity_name }_{ unique_suffix }|.
+    "behavior pools
+    beh_impl_name_travel          = |{ co_prefix }BP_{ co_entity_name }TP_{ unique_suffix }|.
+    "business service
+    srv_definition_name           = |{ co_prefix }UI_{ co_entity_name }_{ unique_suffix }|.
+    srv_binding_o4_name           = |{ co_prefix }UI_{ co_entity_name }_O4_{ unique_suffix }|.
+
+
+    " to upper
+    package_name  = to_upper( package_name ).
+    unique_suffix = to_upper( unique_suffix ).
+
+    out->write( | Use transport { transport }| ).
+
+    DATA(my_package) = xco_lib->get_package( package_name ).
+    IF my_package->exists( ) = abap_false.
+      out->write( | Info: Suffix "{ unique_suffix }" will be used. | ).
+    ELSE.
+      out->write( | Note: Package "{ package_name }" already exists. | ).
+    ENDIF.
+
+    TRY.
+        "create package
+        create_package( transport ).
+        create_extension_package( transport_extensions ).
+      CATCH cx_xco_gen_put_exception INTO DATA(put_exception).
+        out->write( 'error creating packages' ).
+        DATA(lt_findings) = put_exception->findings->get( ).
+        LOOP AT lt_findings INTO DATA(finding).
+          out->write( finding->message->get_text(  ) ).
+        ENDLOOP.
+        EXIT.
+      CATCH cx_root INTO DATA(package_exception).
+        IF debug_modus = abap_true.
+          out->write( | Error during create_package( ). | ).
+        ENDIF.
+        EXIT.
+    ENDTRY.
+
+    data_generator_class_name     = |zrap630_cl_vh_product_{ unique_suffix }|.
+
+
+    TRY.
+
+        generate_vh_custom_entity( transport ).
+*        generate_behavior_impl_class( transport ).
+      CATCH cx_xco_gen_put_exception INTO DATA(put_vh_exception).
+        out->write( 'error creating custom entity' ).
+        lt_findings = put_vh_exception->findings->get( ).
+        LOOP AT lt_findings INTO finding.
+          out->write( finding->message->get_text(  ) ).
+        ENDLOOP.
+        EXIT.
+    ENDTRY.
+
+
+
+
+
+    mo_environment                 = get_environment( transport ).
+    mo_put_operation               = get_put_operation( mo_environment )."->create_put_operation( ).
+
+    TRY.
+        create_rap_bo(
+          EXPORTING
+            out          = out
+          IMPORTING
+            eo_root_node = DATA(root_node)
+        ).
+      CATCH cx_xco_gen_put_exception INTO put_exception.
+        out->write( 'error creating rap bo' ).
+        lt_findings = put_exception->findings->get( ).
+        LOOP AT lt_findings INTO finding.
+          out->write( | { finding->message->get_type( )->value }: { finding->message->get_text(  ) } | ).
+        ENDLOOP.
+        EXIT.
+    ENDTRY.
+    out->write( | The following packages got created for you and will include everything you need: | ).
+    out->write( | - "{ package_name }"     and | ).
+    out->write( | - "{ extension_package_name }" | ).
+    out->write( | In the "Project Explorer" right click on "Favorite Packages" and click on "Add Package...". | ).
+    out->write( | Select both (!) packages "{ package_name }" and { extension_package_name } and click OK. | ).
+    out->write( | The generation process has been started asynchronously in the backend | ).
+    out->write( | and it will take some minutes to complete. | ).
+  ENDMETHOD.
+ENDCLASS.
diff --git a/src/zdmo_gen_rap630_single.clas.xml b/src/zdmo_gen_rap630_single.clas.xml
new file mode 100644
index 0000000..1179385
--- /dev/null
+++ b/src/zdmo_gen_rap630_single.clas.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <VSEOCLASS>
+    <CLSNAME>ZDMO_GEN_RAP630_SINGLE</CLSNAME>
+    <LANGU>E</LANGU>
+    <DESCRIPT>zdmo_gen_rap110_single</DESCRIPT>
+    <STATE>1</STATE>
+    <CLSCCINCL>X</CLSCCINCL>
+    <FIXPT>X</FIXPT>
+    <UNICODE>X</UNICODE>
+   </VSEOCLASS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_holiday_id_swc.dtel.xml b/src/zdmo_holiday_id_swc.dtel.xml
new file mode 100644
index 0000000..6adc397
--- /dev/null
+++ b/src/zdmo_holiday_id_swc.dtel.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD04V>
+    <ROLLNAME>ZDMO_HOLIDAY_ID_SWC</ROLLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DOMNAME>ZDMO_FCAL_HOLIDAY_ID</DOMNAME>
+    <HEADLEN>55</HEADLEN>
+    <SCRLEN1>10</SCRLEN1>
+    <SCRLEN2>20</SCRLEN2>
+    <SCRLEN3>40</SCRLEN3>
+    <DDTEXT>Holiday ID</DDTEXT>
+    <REPTEXT>Holiday ID</REPTEXT>
+    <SCRTEXT_S>id</SCRTEXT_S>
+    <SCRTEXT_M>Holiday ID</SCRTEXT_M>
+    <SCRTEXT_L>Holiday ID</SCRTEXT_L>
+    <DTELMASTER>E</DTELMASTER>
+    <REFKIND>D</REFKIND>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+   </DD04V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.asddls b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.asddls
new file mode 100644
index 0000000..e7a264f
--- /dev/null
+++ b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.asddls
@@ -0,0 +1,15 @@
+@EndUserText.label: 'RAP Generator - Data Sources'
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_DATA_SRC_2'
+@Search.searchable: true
+define custom entity ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT
+{
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      @EndUserText.label: 'Data Source Name'
+        
+  key name               : abap.char( 50 );
+  
+  @EndUserText.label: 'Parent Data Source Name'
+  parent_data_source     :  sxco_cds_object_name; 
+
+}
diff --git a/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.baseinfo b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.xml b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.xml
new file mode 100644
index 0000000..77e1a40
--- /dev/null
+++ b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - Data Sources Value Help</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_get_cds_views.ddls.asddls b/src/zdmo_i_rap_gen_get_cds_views.ddls.asddls
new file mode 100644
index 0000000..776fb97
--- /dev/null
+++ b/src/zdmo_i_rap_gen_get_cds_views.ddls.asddls
@@ -0,0 +1,15 @@
+@EndUserText.label: 'RAP Generator - Data Sources'
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_DATA_SRC_2'
+@Search.searchable: true
+define custom entity ZDMO_I_RAP_GEN_GET_CDS_VIEWS
+{
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      @EndUserText.label: 'Data Source Name'
+      
+  key name               : abap.char( 50 );
+  @UI.hidden: true
+  @EndUserText.label: 'Parent Data Source Name'
+  parent_data_source     :  sxco_cds_object_name;
+
+}
diff --git a/src/zdmo_i_rap_gen_get_cds_views.ddls.baseinfo b/src/zdmo_i_rap_gen_get_cds_views.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_get_cds_views.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_get_cds_views.ddls.xml b/src/zdmo_i_rap_gen_get_cds_views.ddls.xml
new file mode 100644
index 0000000..bb4f0b9
--- /dev/null
+++ b/src/zdmo_i_rap_gen_get_cds_views.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_GET_CDS_VIEWS</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - Data Sources Value Help</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_get_tables.ddls.asddls b/src/zdmo_i_rap_gen_get_tables.ddls.asddls
new file mode 100644
index 0000000..ff30ee2
--- /dev/null
+++ b/src/zdmo_i_rap_gen_get_tables.ddls.asddls
@@ -0,0 +1,12 @@
+@EndUserText.label: 'RAP Generator - Data Sources'
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_DATA_SRC_2'
+@Search.searchable: true
+define custom entity ZDMO_I_RAP_GEN_GET_TABLES
+{
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      @EndUserText.label: 'Data Source Name'
+   
+  key name               : abap.char( 50 );
+
+}
diff --git a/src/zdmo_i_rap_gen_get_tables.ddls.baseinfo b/src/zdmo_i_rap_gen_get_tables.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_get_tables.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_get_tables.ddls.xml b/src/zdmo_i_rap_gen_get_tables.ddls.xml
new file mode 100644
index 0000000..832e554
--- /dev/null
+++ b/src/zdmo_i_rap_gen_get_tables.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_GET_TABLES</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - Data Sources Value Help</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_param_add_child.ddls.asddls b/src/zdmo_i_rap_gen_param_add_child.ddls.asddls
new file mode 100644
index 0000000..7d69960
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_child.ddls.asddls
@@ -0,0 +1,6 @@
+@EndUserText.label: 'contains parameter(s) to create new nodes'
+define abstract entity ZDMO_I_RAP_GEN_PARAM_ADD_CHILD
+{
+  @EndUserText.label: 'Child Entity Name'
+  entity_name : zdmo_rap_gen_entityname;
+}
diff --git a/src/zdmo_i_rap_gen_param_add_child.ddls.baseinfo b/src/zdmo_i_rap_gen_param_add_child.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_child.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_param_add_child.ddls.xml b/src/zdmo_i_rap_gen_param_add_child.ddls.xml
new file mode 100644
index 0000000..d768637
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_child.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_PARAM_ADD_CHILD</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Action Parameter(s) to create new RAP BOs with a root node</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_param_add_node.ddls.asddls b/src/zdmo_i_rap_gen_param_add_node.ddls.asddls
new file mode 100644
index 0000000..3d2fc30
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_node.ddls.asddls
@@ -0,0 +1,42 @@
+@EndUserText.label: 'Parameter(s) to create new nodes'
+define abstract entity ZDMO_I_RAP_GEN_PARAM_ADD_NODE
+{
+  @EndUserText.label: 'Entity Name'
+  entity_name    : zdmo_rap_gen_entityname;
+
+// 
+//       @Consumption.valueHelpDefinition:
+//        [{
+//          qualifier: 'MyValueHelpA',
+//          entity: { name:'ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT', element:'name' },
+//          enabled: #(' ELEMENT_OF_REFERENCED_ENTITY: isabstractentity')
+//          },
+//          {
+//          qualifier: 'MyValueHelpB',
+//          entity: { name:'C_RAP_MDBU_VALUEHELP_B', element:'CountryAvailability' },
+//          enabled: #('ELEMENT_OF_REFERENCED_ENTITY: xxx')
+//        }]
+////
+//  @Consumption.valueHelpDefinition: [{ entity:  { name:    'ZDMO_I_RAP_GENERATOR_DATA_SRC2',
+//                                                  element: 'name' }
+//                                                  ,
+//                                       additionalBinding: [{element:      'type',
+//                                                            localElement: #( ' ELEMENT_OF_REFERENCED_ENTITY: DataSourceType'),
+//                                                            usage:        #FILTER
+//                                                          }]
+//                                                            }]
+
+ DataSourceName : abap.char(30);
+//  @EndUserText.label     : 'Datasource Type'
+//  @UI.defaultValue: #('ELEMENT_OF_REFERENCED_ENTITY:DataSourceType')
+  DataSourceType : abap.char(30);
+//  @EndUserText.label: 'Data Source Name'
+//  @Consumption.valueHelpDefinition: [{ entity:
+//  { name         : 'ZDMO_I_RAP_GENERATOR_DATA_SRC2' ,  element: 'name' }
+//                                       ,
+//                                      additionalBinding: [{ element: 'type',
+//                                                            localElement: 'DataSourceType' }]
+//                                                            }]
+//
+//  DataSourceName : abap.char(30);
+}
diff --git a/src/zdmo_i_rap_gen_param_add_node.ddls.baseinfo b/src/zdmo_i_rap_gen_param_add_node.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_node.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_param_add_node.ddls.xml b/src/zdmo_i_rap_gen_param_add_node.ddls.xml
new file mode 100644
index 0000000..a4a824e
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_node.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_PARAM_ADD_NODE</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Action Parameter(s) to create new RAP BOs with a root node</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_param_add_nodea.ddls.asddls b/src/zdmo_i_rap_gen_param_add_nodea.ddls.asddls
new file mode 100644
index 0000000..188421f
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_nodea.ddls.asddls
@@ -0,0 +1,21 @@
+@EndUserText.label: 'Parameter(s) to create new nodes'
+define abstract entity ZDMO_I_RAP_GEN_PARAM_ADD_NODEA
+{
+  @EndUserText.label : 'Entity Name'
+  entity_name        : zdmo_rap_gen_entityname;
+
+  @Consumption.valueHelpDefinition: [{ entity:  { name:    'ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT',
+                                                  element: 'name' }
+                                                  ,
+                               additionalBinding: [{ element: 'parent_data_source',
+                                                  localElement: 'parent_data_source' }]
+                                                            }]
+  @EndUserText.label : 'Data Source Name'
+  DataSourceName     : abap.char(30);
+
+//  @UI.defaultValue   : #('ELEMENT_OF_REFERENCED_ENTITY:DataSource')
+  @UI.hidden         : true
+  @EndUserText.label: 'Parent Data Source Name'
+  parent_data_source : zdmo_rap_gen_entityname;
+
+}
diff --git a/src/zdmo_i_rap_gen_param_add_nodea.ddls.baseinfo b/src/zdmo_i_rap_gen_param_add_nodea.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_nodea.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_param_add_nodea.ddls.xml b/src/zdmo_i_rap_gen_param_add_nodea.ddls.xml
new file mode 100644
index 0000000..506602c
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_nodea.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_PARAM_ADD_NODEA</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Action Parameter(s) to create new RAP BOs with a root node</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_param_add_nodec.ddls.asddls b/src/zdmo_i_rap_gen_param_add_nodec.ddls.asddls
new file mode 100644
index 0000000..b013146
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_nodec.ddls.asddls
@@ -0,0 +1,19 @@
+@EndUserText.label: 'Parameter(s) to create new nodes'
+define abstract entity ZDMO_I_RAP_GEN_PARAM_ADD_NODEC
+{
+  @EndUserText.label : 'Entity Name'
+  entity_name        : zdmo_rap_gen_entityname;
+
+  @Consumption.valueHelpDefinition: [{ entity:  { name:    'ZDMO_I_RAP_GEN_GET_CDS_VIEWS',
+                                                  element: 'name' }
+                                                  ,
+                               additionalBinding: [{ element: 'parent_data_source',
+                                                  localElement: 'parent_data_source' }]
+                                                            }]
+  @EndUserText.label: 'Data Source Name'
+  DataSourceName     : abap.char(30);
+//  @UI.defaultValue   : #('ELEMENT_OF_REFERENCED_ENTITY:DataSource')
+  @UI.hidden: true
+  @EndUserText.label: 'Parent Data Source Name'
+  parent_data_source : zdmo_rap_gen_entityname;
+}
diff --git a/src/zdmo_i_rap_gen_param_add_nodec.ddls.baseinfo b/src/zdmo_i_rap_gen_param_add_nodec.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_nodec.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_param_add_nodec.ddls.xml b/src/zdmo_i_rap_gen_param_add_nodec.ddls.xml
new file mode 100644
index 0000000..b2beaf4
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_nodec.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_PARAM_ADD_NODEC</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Action Parameter(s) to create new RAP BOs with a root node</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_param_add_nodet.ddls.asddls b/src/zdmo_i_rap_gen_param_add_nodet.ddls.asddls
new file mode 100644
index 0000000..9b6a806
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_nodet.ddls.asddls
@@ -0,0 +1,16 @@
+@EndUserText.label: 'Parameter(s) to create new nodes'
+define abstract entity ZDMO_I_RAP_GEN_PARAM_Add_nodeT
+{
+  @EndUserText.label: 'Entity Name'
+  entity_name    : zdmo_rap_gen_entityname;
+
+  @Consumption.valueHelpDefinition: [{ entity:  { name:    'ZDMO_I_RAP_gen_get_tables',
+                                                  element: 'name' }
+                                                            }]
+  @EndUserText.label: 'Data Source Name'
+  DataSourceName : abap.char(30);
+
+//  @UI.defaultValue: #('ELEMENT_OF_REFERENCED_ENTITY:DataSource')
+//  parent_entity_name          : zdmo_rap_gen_entityname;
+
+}
diff --git a/src/zdmo_i_rap_gen_param_add_nodet.ddls.baseinfo b/src/zdmo_i_rap_gen_param_add_nodet.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_nodet.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_param_add_nodet.ddls.xml b/src/zdmo_i_rap_gen_param_add_nodet.ddls.xml
new file mode 100644
index 0000000..1463484
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_add_nodet.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_PARAM_ADD_NODET</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Action Parameter(s) to create new RAP BOs with a root node</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_param_copy_proj.ddls.asddls b/src/zdmo_i_rap_gen_param_copy_proj.ddls.asddls
new file mode 100644
index 0000000..27baee7
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_copy_proj.ddls.asddls
@@ -0,0 +1,8 @@
+@EndUserText.label: 'contains parameter(s) to copy projects'
+define abstract entity ZDMO_I_RAP_GEN_PARAM_COPY_PROJ
+{
+// Use the same name as in the root view ZDMO_R_RapGeneratorBO
+  @EndUserText.label: 'Package'
+  @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_PACKAGE', element: 'name' }}]
+  PackageName     : sxco_package;
+}
diff --git a/src/zdmo_i_rap_gen_param_copy_proj.ddls.baseinfo b/src/zdmo_i_rap_gen_param_copy_proj.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_copy_proj.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_param_copy_proj.ddls.xml b/src/zdmo_i_rap_gen_param_copy_proj.ddls.xml
new file mode 100644
index 0000000..26729f0
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_copy_proj.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_PARAM_COPY_PROJ</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Action Parameter(s) to create new child nodes</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_param_new_proj.ddls.asddls b/src/zdmo_i_rap_gen_param_new_proj.ddls.asddls
new file mode 100644
index 0000000..5b9702a
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_new_proj.ddls.asddls
@@ -0,0 +1,44 @@
+@EndUserText.label: 'Parameter(s) to create new projects'
+define abstract entity ZDMO_I_RAP_GEN_PARAM_NEW_PROJ
+{
+
+  //  @UI.defaultValue       : 'table'
+  @EndUserText.label     : 'Datasource Type'
+  @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_DSRC_TYPE', element: 'type' }}]
+  DataSourceType         : abap.char(30);
+  //  @UI.defaultValue       : 'managed'
+  @EndUserText.label     : 'Implementation type'
+  @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_IMPL_TYP2', element: 'name' }}]
+
+  BdefImplementationType : abap.char(50);
+  //  @UI.defaultValue       : 'odata_v4_ui'
+  @EndUserText.label     : 'Binding type'
+  @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_BIND_TYPE', element: 'name' }}]
+  BindingType            : abap.char(30);
+  //  @UI.defaultValue       : 'X'
+  @EndUserText.label     : 'Draft enabled'
+  @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_BOOL_VH', element: 'bool_value' }}]
+  DraftEnabled           : abap_boolean;
+
+  @EndUserText.label     : 'is extensible'
+  @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_BOOL_VH', element: 'bool_value' }}]
+  isExtensible           : abap_boolean;
+
+  @EndUserText.label     : 'Root Entity Name'
+  EntityName             : zdmo_rap_gen_entityname;
+
+  @Consumption.valueHelpDefinition: [{ entity:
+  { name                 : 'ZDMO_I_RAP_GENERATOR_DATA_SRC2' ,  element: 'name' }
+                                       ,
+                            additionalBinding: [{ element: 'type',
+                                                  localElement: 'DataSourceType' }]
+                                                  }]
+  @EndUserText.label     : 'Data Source Name'
+  data_source_name       : abap.char(30);
+
+  @EndUserText.label     : 'Package'
+  @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_PACKAGE', element: 'name' }}]
+  package_name           : abap.char(30);
+  
+
+}
diff --git a/src/zdmo_i_rap_gen_param_new_proj.ddls.baseinfo b/src/zdmo_i_rap_gen_param_new_proj.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_new_proj.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_param_new_proj.ddls.xml b/src/zdmo_i_rap_gen_param_new_proj.ddls.xml
new file mode 100644
index 0000000..4120bba
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_new_proj.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_PARAM_NEW_PROJ</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Action Parameter(s) to create new child nodes</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_gen_param_rapbonode.ddls.asddls b/src/zdmo_i_rap_gen_param_rapbonode.ddls.asddls
new file mode 100644
index 0000000..331f3e9
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_rapbonode.ddls.asddls
@@ -0,0 +1,14 @@
+@EndUserText.label: 'contains parameter(s) to create new nodes'
+define abstract entity ZDMO_I_RAP_GEN_PARAM_RAPBONODE
+{
+  @EndUserText.label: 'Root Entity Name'
+  entity_name      : zdmo_rap_gen_entityname;
+  @EndUserText.label: 'Package'
+  @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_PACKAGE', element: 'name' }}]
+  package_name     : sxco_package;
+//  @EndUserText.label: 'ABAP Language Version'
+//  @Consumption.defaultValue : 'abap_for_cloud_development'
+//  @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_ABAP_VERS', element: 'language_version' }}]
+//  language_version : abap.char( 30 );
+
+}
diff --git a/src/zdmo_i_rap_gen_param_rapbonode.ddls.baseinfo b/src/zdmo_i_rap_gen_param_rapbonode.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_rapbonode.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_gen_param_rapbonode.ddls.xml b/src/zdmo_i_rap_gen_param_rapbonode.ddls.xml
new file mode 100644
index 0000000..ac9c711
--- /dev/null
+++ b/src/zdmo_i_rap_gen_param_rapbonode.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GEN_PARAM_RAPBONODE</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Action Parameter(s) to create new child nodes</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_abap_vers.ddls.asddls b/src/zdmo_i_rap_generator_abap_vers.ddls.asddls
new file mode 100644
index 0000000..a9768aa
--- /dev/null
+++ b/src/zdmo_i_rap_generator_abap_vers.ddls.asddls
@@ -0,0 +1,7 @@
+@EndUserText.label: 'RAP Generator - ABAP Language Version'
+@ObjectModel.resultSet.sizeCategory: #XS
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_ABAP_VERS'
+define custom entity ZDMO_I_RAP_GENERATOR_ABAP_VERS 
+{
+  key language_version : abap.char( 30 );  
+}
diff --git a/src/zdmo_i_rap_generator_abap_vers.ddls.baseinfo b/src/zdmo_i_rap_generator_abap_vers.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_abap_vers.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_abap_vers.ddls.xml b/src/zdmo_i_rap_generator_abap_vers.ddls.xml
new file mode 100644
index 0000000..7fa110c
--- /dev/null
+++ b/src/zdmo_i_rap_generator_abap_vers.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_ABAP_VERS</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - ABAP Language Version Value Help</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_appl_log.ddls.asddls b/src/zdmo_i_rap_generator_appl_log.ddls.asddls
new file mode 100644
index 0000000..7ac962f
--- /dev/null
+++ b/src/zdmo_i_rap_generator_appl_log.ddls.asddls
@@ -0,0 +1,73 @@
+@EndUserText.label: 'RAP Generator - Application Log'
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_SHOW_APPL_LOG'
+//@Search.searchable: true
+
+@UI: {
+    headerInfo: {
+    title: {
+      type: #STANDARD,
+      label: 'Item Number',
+      value: 'Log_item_number'
+    },
+    typeName: 'AppLogEntry',
+    typeNamePlural: 'AppLogEntries'},
+    presentationVariant: [{
+    maxItems: 20,
+    visualizations: [{type: #AS_LINEITEM}]
+    }]
+    }
+
+
+define custom entity ZDMO_I_RAP_GENERATOR_appl_log
+{
+      @UI.facet       : [
+        {
+          id          : 'idIdentification',
+          type        : #IDENTIFICATION_REFERENCE,
+          label       : 'General Information',
+          position    : 10
+        }
+        ]
+  key Log_handle      : balloghndl;
+      @UI.lineItem    : [ {
+      position        : 10 ,
+      importance      : #HIGH,
+      label           : 'Log item number'  } ]
+      @UI.identification: [ {
+      position        : 10 ,
+      importance      : #HIGH,
+      label           : 'Log item number'  } ]
+      @EndUserText.label: 'Logitemnumber'
+      @UI.selectionField: [ { position: 20 } ]
+  key Log_item_number : balmnr;
+
+      @UI.lineItem    : [ {
+          position    : 10 ,
+          importance  : #HIGH,
+          criticality : 'criticality',
+          label       : 'Severity'  } ]
+
+      severity        : symsgty;
+      category        : abap.char(1);
+      criticality     : abap.int1;
+      @UI.lineItem    : [ {
+      position        : 90 ,
+      importance      : #HIGH,
+      label           : 'Detail level'  } ]
+      @UI.identification: [ {
+      position        : 90 ,
+      importance      : #HIGH,
+      label           : 'Detail level'  } ]
+      detail_level    : ballevel;
+      timestamp       : abap.utclong;
+      @UI.lineItem    : [ {
+      position        : 100 ,
+      importance      : #HIGH,
+      label           : 'Message text'  } ]
+      @UI.identification: [ {
+      position        : 100 ,
+      importance      : #HIGH,
+      label           : 'Message text'  } ]
+      message_text    : abap.sstring( 512 );
+
+}
diff --git a/src/zdmo_i_rap_generator_appl_log.ddls.baseinfo b/src/zdmo_i_rap_generator_appl_log.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_appl_log.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_appl_log.ddls.xml b/src/zdmo_i_rap_generator_appl_log.ddls.xml
new file mode 100644
index 0000000..2059ecd
--- /dev/null
+++ b/src/zdmo_i_rap_generator_appl_log.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_APPL_LOG</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Show application log entries</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_bind_type.ddls.asddls b/src/zdmo_i_rap_generator_bind_type.ddls.asddls
new file mode 100644
index 0000000..42bebb4
--- /dev/null
+++ b/src/zdmo_i_rap_generator_bind_type.ddls.asddls
@@ -0,0 +1,7 @@
+@EndUserText.label: 'RAP Generator - Binding Type'
+@ObjectModel.resultSet.sizeCategory: #XS
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_BIND_TYPE'
+define custom entity ZDMO_I_RAP_GENERATOR_BIND_TYPE 
+{
+  key name : abap.char( 50 );  
+}
diff --git a/src/zdmo_i_rap_generator_bind_type.ddls.baseinfo b/src/zdmo_i_rap_generator_bind_type.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_bind_type.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_bind_type.ddls.xml b/src/zdmo_i_rap_generator_bind_type.ddls.xml
new file mode 100644
index 0000000..16c2c94
--- /dev/null
+++ b/src/zdmo_i_rap_generator_bind_type.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_BIND_TYPE</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - Binding Types Value Help</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_bool_vh.ddls.asddls b/src/zdmo_i_rap_generator_bool_vh.ddls.asddls
new file mode 100644
index 0000000..88e58e5
--- /dev/null
+++ b/src/zdmo_i_rap_generator_bool_vh.ddls.asddls
@@ -0,0 +1,9 @@
+@EndUserText.label: 'value help for boolean values'
+@ObjectModel.resultSet.sizeCategory: #XS
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_BOOLEANS'
+define custom entity zdmo_I_rap_generator_bool_VH
+{      
+      @ObjectModel.text.element: ['name']
+  key bool_value : abap_boolean;
+      name : abap.char(10);
+}
diff --git a/src/zdmo_i_rap_generator_bool_vh.ddls.baseinfo b/src/zdmo_i_rap_generator_bool_vh.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_bool_vh.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_bool_vh.ddls.xml b/src/zdmo_i_rap_generator_bool_vh.ddls.xml
new file mode 100644
index 0000000..9dbb72a
--- /dev/null
+++ b/src/zdmo_i_rap_generator_bool_vh.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_BOOL_VH</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>value help for boolean values</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_data_src2.ddls.asddls b/src/zdmo_i_rap_generator_data_src2.ddls.asddls
new file mode 100644
index 0000000..44c434e
--- /dev/null
+++ b/src/zdmo_i_rap_generator_data_src2.ddls.asddls
@@ -0,0 +1,15 @@
+@EndUserText.label: 'RAP Generator - Data Sources'
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_DATA_SRC_2'
+@Search.searchable: true
+define custom entity ZDMO_I_RAP_GENERATOR_DATA_SRC2
+{
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      @EndUserText.label : 'Data Source Name'
+  key name               : abap.char( 50 );
+      @UI.hidden         : true
+  key type               : abap.char( 20 );
+      @UI.hidden: true
+      parent_data_source : sxco_cds_object_name;
+
+}
diff --git a/src/zdmo_i_rap_generator_data_src2.ddls.baseinfo b/src/zdmo_i_rap_generator_data_src2.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_data_src2.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_data_src2.ddls.xml b/src/zdmo_i_rap_generator_data_src2.ddls.xml
new file mode 100644
index 0000000..846fc41
--- /dev/null
+++ b/src/zdmo_i_rap_generator_data_src2.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_DATA_SRC2</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - Data Sources Value Help</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_dsrc_type.ddls.asddls b/src/zdmo_i_rap_generator_dsrc_type.ddls.asddls
new file mode 100644
index 0000000..61783d3
--- /dev/null
+++ b/src/zdmo_i_rap_generator_dsrc_type.ddls.asddls
@@ -0,0 +1,8 @@
+@EndUserText.label: 'RAP Generator - Datasource Type'
+@ObjectModel.resultSet.sizeCategory: #XS
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_DSRC_TYPE'
+define custom entity ZDMO_I_RAP_GENERATOR_DSRC_TYPE 
+{
+  @EndUserText.label: 'Data Source Type'
+  key type : abap.char( 50 );  
+}
diff --git a/src/zdmo_i_rap_generator_dsrc_type.ddls.baseinfo b/src/zdmo_i_rap_generator_dsrc_type.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_dsrc_type.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_dsrc_type.ddls.xml b/src/zdmo_i_rap_generator_dsrc_type.ddls.xml
new file mode 100644
index 0000000..1467d4f
--- /dev/null
+++ b/src/zdmo_i_rap_generator_dsrc_type.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_DSRC_TYPE</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - Data Source Types Value Help</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_fields.ddls.asddls b/src/zdmo_i_rap_generator_fields.ddls.asddls
new file mode 100644
index 0000000..0671857
--- /dev/null
+++ b/src/zdmo_i_rap_generator_fields.ddls.asddls
@@ -0,0 +1,24 @@
+@EndUserText.label: 'RAP Generator - Datsource Fields'
+@ObjectModel.resultSet.sizeCategory: #XS
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_FIELDS'
+define custom entity ZDMO_I_RAP_GENERATOR_FIELDS
+{
+      @EndUserText.label     : 'Field Name'
+  key field                  : abap.char( 30 );
+      @UI.hidden             : true
+  key name                   : abap.char( 50 );
+      @UI.hidden             : true
+  key type                   : abap.char( 20 );
+      @UI.hidden             : true
+  key language_version       : abap.char(30);
+      @EndUserText.label     : 'Data element'
+      data_element           : sxco_ad_object_name;
+      @EndUserText.label     : 'Built in type'
+      built_in_type          : abap.char( 4 );
+      @EndUserText.label     : 'Length'
+      built_in_type_length   : abap.numc( 6 );
+      @EndUserText.label     : 'Decimals'
+      built_in_type_decimals : abap.numc( 6 );
+
+
+}
diff --git a/src/zdmo_i_rap_generator_fields.ddls.baseinfo b/src/zdmo_i_rap_generator_fields.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_fields.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_fields.ddls.xml b/src/zdmo_i_rap_generator_fields.ddls.xml
new file mode 100644
index 0000000..ddd8578
--- /dev/null
+++ b/src/zdmo_i_rap_generator_fields.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_FIELDS</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - Data Source Fields - Value Help</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_impl_typ2.ddls.asddls b/src/zdmo_i_rap_generator_impl_typ2.ddls.asddls
new file mode 100644
index 0000000..9b9c89a
--- /dev/null
+++ b/src/zdmo_i_rap_generator_impl_typ2.ddls.asddls
@@ -0,0 +1,8 @@
+@EndUserText.label: 'RAP Generator - Implementation Types'
+@ObjectModel.resultSet.sizeCategory: #XS
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_IMPL_TYPE2'
+define custom entity ZDMO_I_RAP_GENERATOR_IMPL_TYP2
+{
+      @EndUserText.label: 'Implementation Type'
+  key name : abap.char( 50 );
+}
diff --git a/src/zdmo_i_rap_generator_impl_typ2.ddls.baseinfo b/src/zdmo_i_rap_generator_impl_typ2.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_impl_typ2.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_impl_typ2.ddls.xml b/src/zdmo_i_rap_generator_impl_typ2.ddls.xml
new file mode 100644
index 0000000..136eca9
--- /dev/null
+++ b/src/zdmo_i_rap_generator_impl_typ2.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_IMPL_TYP2</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - Implementation Types - Value Help</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_impl_type.ddls.asddls b/src/zdmo_i_rap_generator_impl_type.ddls.asddls
new file mode 100644
index 0000000..f0abed2
--- /dev/null
+++ b/src/zdmo_i_rap_generator_impl_type.ddls.asddls
@@ -0,0 +1,7 @@
+@EndUserText.label: 'RAP Generator - Implementation Types'
+@ObjectModel.resultSet.sizeCategory: #XS
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_IMPL_TYPE'
+define custom entity ZDMO_I_RAP_GENERATOR_IMPL_TYPE
+{
+  key name : abap.char( 50 );
+}
diff --git a/src/zdmo_i_rap_generator_impl_type.ddls.baseinfo b/src/zdmo_i_rap_generator_impl_type.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_impl_type.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_impl_type.ddls.xml b/src/zdmo_i_rap_generator_impl_type.ddls.xml
new file mode 100644
index 0000000..96ccb3e
--- /dev/null
+++ b/src/zdmo_i_rap_generator_impl_type.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_IMPL_TYPE</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - Implementation Types - Value Help</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_job_stat.ddls.asddls b/src/zdmo_i_rap_generator_job_stat.ddls.asddls
new file mode 100644
index 0000000..6bdedea
--- /dev/null
+++ b/src/zdmo_i_rap_generator_job_stat.ddls.asddls
@@ -0,0 +1,11 @@
+@EndUserText.label: 'Job status of jobs scheduled by the RAP Generator UI'
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS'
+define custom entity ZDMO_I_RAP_GENERATOR_JOB_STAT
+{
+
+  key job_name    : abap.char(32);
+  key job_count   : abap.char(8);
+      job_status  : abap.char(1);
+      status_text : abap.char(60);
+
+}
diff --git a/src/zdmo_i_rap_generator_job_stat.ddls.baseinfo b/src/zdmo_i_rap_generator_job_stat.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_job_stat.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_job_stat.ddls.xml b/src/zdmo_i_rap_generator_job_stat.ddls.xml
new file mode 100644
index 0000000..863edf1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_job_stat.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_JOB_STAT</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Job status of jobs scheduled by the RAP Generator UI</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_i_rap_generator_package.ddls.asddls b/src/zdmo_i_rap_generator_package.ddls.asddls
new file mode 100644
index 0000000..2a74002
--- /dev/null
+++ b/src/zdmo_i_rap_generator_package.ddls.asddls
@@ -0,0 +1,14 @@
+@EndUserText.label: 'RAP Generator - Packages'
+@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_PACKAGE'
+@Search.searchable: true
+define custom entity ZDMO_I_RAP_GENERATOR_PACKAGE
+{
+
+
+      @Search.defaultSearchElement: true
+      @Search.fuzzinessThreshold: 0.90
+      @EndUserText.label: 'Package Name'
+  key name             : abap.char( 50 );
+      @UI.hidden       : true
+  key language_version : abap.char(30);
+}
diff --git a/src/zdmo_i_rap_generator_package.ddls.baseinfo b/src/zdmo_i_rap_generator_package.ddls.baseinfo
new file mode 100644
index 0000000..8a07ae1
--- /dev/null
+++ b/src/zdmo_i_rap_generator_package.ddls.baseinfo
@@ -0,0 +1,17 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_i_rap_generator_package.ddls.xml b/src/zdmo_i_rap_generator_package.ddls.xml
new file mode 100644
index 0000000..9e3a916
--- /dev/null
+++ b/src/zdmo_i_rap_generator_package.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_I_RAP_GENERATOR_PACKAGE</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>RAP Generator - Packages</DDTEXT>
+    <SOURCE_TYPE>Q</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_r_rapg_fieldtp.ddls.asddls b/src/zdmo_r_rapg_fieldtp.ddls.asddls
new file mode 100644
index 0000000..a518a40
--- /dev/null
+++ b/src/zdmo_r_rapg_fieldtp.ddls.asddls
@@ -0,0 +1,20 @@
+@AccessControl.authorizationCheck: #NOT_REQUIRED
+@Metadata.allowExtensions: true
+@EndUserText.label: 'CDS View forField'
+define view entity ZDMO_R_RAPG_FieldTP
+  as select from zdmo_rapgen_flds
+  association     to parent ZDMO_R_RAPG_NodeTP as _Node    on $projection.NodeUUID = _Node.NodeUUID
+  association [1] to ZDMO_R_RAPG_ProjectTP     as _Project on $projection.RapboUUID = _Project.RapBoUUID
+{
+  key field_uuid            as FieldUUID,
+      node_uuid             as NodeUUID,
+      rapbo_uuid            as RapboUUID,
+      is_key                as IsKey,
+      dbtable_field         as DbtableField,
+      cds_view_field        as CdsViewField,
+      @Semantics.systemDateTime.localInstanceLastChangedAt: true
+      local_last_changed_at as LocalLastChangedAt,
+      _Node,
+      _Project
+
+}
diff --git a/src/zdmo_r_rapg_fieldtp.ddls.baseinfo b/src/zdmo_r_rapg_fieldtp.ddls.baseinfo
new file mode 100644
index 0000000..b9cd7cc
--- /dev/null
+++ b/src/zdmo_r_rapg_fieldtp.ddls.baseinfo
@@ -0,0 +1,22 @@
+{
+"BASEINFO":
+{
+"FROM":
+[
+"ZDMO_RAPGEN_FLDS"
+],
+"ASSOCIATED":
+[
+"ZDMO_R_RAPG_NODETP",
+"ZDMO_R_RAPG_PROJECTTP"
+],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_r_rapg_fieldtp.ddls.xml b/src/zdmo_r_rapg_fieldtp.ddls.xml
new file mode 100644
index 0000000..4fe840b
--- /dev/null
+++ b/src/zdmo_r_rapg_fieldtp.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_R_RAPG_FIELDTP</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>CDS View for Field</DDTEXT>
+    <SOURCE_TYPE>W</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_r_rapg_logtp.ddls.asddls b/src/zdmo_r_rapg_logtp.ddls.asddls
new file mode 100644
index 0000000..23a00d7
--- /dev/null
+++ b/src/zdmo_r_rapg_logtp.ddls.asddls
@@ -0,0 +1,27 @@
+@AccessControl.authorizationCheck: #NOT_REQUIRED
+@Metadata.allowExtensions: true
+@EndUserText.label: 'CDS View forLog'
+define view entity ZDMO_R_RAPG_LogTP
+  as select from zdmo_rapgen_log
+  association to parent ZDMO_R_RAPG_ProjectTP as _Project on $projection.RapBoUUID = _Project.RapBoUUID
+{
+  key log_uuid              as LogUUID,
+      rapbo_uuid            as RapBoUUID,
+      log_item_number       as LogItemNumber,
+      detail_level          as DetailLevel,
+      severity              as Severity,
+      case
+        when severity = 'S' then 3  //successul / green
+        when severity = 'I' then 0  //information / grey
+        when severity = 'W' then 2  //warning / orange
+        when severity = 'E' then 1  //error / red
+        when severity = 'A' then 1  //error / red
+        else 0  //not specified / grey
+      end                   as Criticality,
+      text                  as Text,
+      time_stamp            as TimeStamp,
+      @Semantics.systemDateTime.localInstanceLastChangedAt: true
+      local_last_changed_at as LocalLastChangedAt,
+      _Project
+
+}
diff --git a/src/zdmo_r_rapg_logtp.ddls.baseinfo b/src/zdmo_r_rapg_logtp.ddls.baseinfo
new file mode 100644
index 0000000..11421e9
--- /dev/null
+++ b/src/zdmo_r_rapg_logtp.ddls.baseinfo
@@ -0,0 +1,21 @@
+{
+"BASEINFO":
+{
+"FROM":
+[
+"ZDMO_RAPGEN_LOG"
+],
+"ASSOCIATED":
+[
+"ZDMO_R_RAPG_PROJECTTP"
+],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_r_rapg_logtp.ddls.xml b/src/zdmo_r_rapg_logtp.ddls.xml
new file mode 100644
index 0000000..b2def0c
--- /dev/null
+++ b/src/zdmo_r_rapg_logtp.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_R_RAPG_LOGTP</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>CDS View for Log</DDTEXT>
+    <SOURCE_TYPE>W</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_r_rapg_nodetp.ddls.asddls b/src/zdmo_r_rapg_nodetp.ddls.asddls
new file mode 100644
index 0000000..439ab12
--- /dev/null
+++ b/src/zdmo_r_rapg_nodetp.ddls.asddls
@@ -0,0 +1,80 @@
+@AccessControl.authorizationCheck: #NOT_REQUIRED
+@Metadata.allowExtensions: true
+@EndUserText.label: 'CDS View forNode'
+
+define view entity ZDMO_R_RAPG_NodeTP
+  as select from zdmo_rapgen_node
+  association to parent ZDMO_R_RAPG_ProjectTP as _Project on $projection.RapBoUUID = _Project.RapBoUUID
+  composition [0..*] of ZDMO_R_RAPG_FieldTP   as _Field
+  //  association [0..*] to ZDMO_R_RAPG_NodeTP    as _Entity          on $projection.RapBoUUID = _Entity.RapBoUUID
+{
+
+  key node_uuid                        as NodeUUID,
+      header_uuid                      as RapBoUUID,
+      parent_uuid                      as ParentUUID,
+      root_uuid                        as RootUUID,
+      node_number                      as NodeNumber,
+      is_root_node                     as IsRootNode,
+      entity_name                      as EntityName,
+      parent_entity_name               as ParentEntityName,
+      data_source                      as DataSource,
+      parent_data_source               as ParentDataSource,
+      view_type_value                  as ViewTypeValue,
+      field_name_object_id             as FieldNameObjectID,
+      field_name_etag_master           as FieldNameEtagMaster,
+      field_name_total_etag            as FieldNameTotalEtag,
+      field_name_uuid                  as FieldNameUUID,
+      field_name_parent_uuid           as FieldNameParentUUID,
+      field_name_root_uuid             as FieldNameRootUUID,
+      field_name_created_by            as FieldNameCreatedBy,
+      field_name_created_at            as FieldNameCreatedAt,
+      field_name_last_changed_by       as FieldNameLastChangedBy,
+      field_name_last_changed_at       as FieldNameLastChangedAt,
+      field_name_loc_last_changed_at   as FieldNameLocLastChangedAt,
+      cds_i_view                       as CdsIView,
+      cds_i_view_basic                 as CdsIViewBasic,
+      cds_r_view                       as CdsRView,
+      cds_p_view                       as CdsPView,
+      mde_view                         as MdeView,
+      behavior_implementation_class    as BehaviorImplementationClass,
+      service_definition               as ServiceDefinition,
+      service_binding                  as ServiceBinding,
+      control_structure                as ControlStructure,
+      query_implementation_class       as QueryImplementationClass,
+      draft_table_name                 as DraftTableName,
+      extension_include                as ExtensionInclude,
+      extension_include_view           as ExtensionIncludeView,
+      draft_query_view                 as DraftQueryView,
+      hierarchy_distance_from_root     as HierarchyDistanceFromRoot,
+      hierarchy_descendant_count       as HierarchyDescendantCount,
+      hierarchy_drill_state            as HierarchyDrillState,
+      hierarchy_preorder_rank          as HierarchyPreorderRank,
+      @Semantics.systemDateTime.localInstanceLastChangedAt: true
+      local_last_changed_at            as LocalLastChangedAt,
+      extensibility_element_suffix     as ExtensibilityElementSuffix,
+      sap_object_node_type             as SAPObjectNodeType,
+      sap_object_type                  as SAPObjectType,
+      cast( case
+       when is_root_node = 'X' then ' '
+       else 'X'
+      end         as abap_boolean    ) as isChildNode,
+
+      cast( case
+       when _Project.DataSourceType = 'table' then 'X'
+       else ' '
+      end         as abap_boolean    ) as isTable,
+      cast( case
+      when _Project.DataSourceType = 'cds_view' then 'X'
+      else ' '
+      end         as abap_boolean    ) as isCDSview,
+      cast( case
+      when _Project.DataSourceType = 'abstract_entity' then 'X'
+      else ' '
+      end         as abap_boolean    ) as isAbstractEntity,
+
+      _Field,
+      _Project
+      //      ,
+      //      _Entity
+
+}
diff --git a/src/zdmo_r_rapg_nodetp.ddls.baseinfo b/src/zdmo_r_rapg_nodetp.ddls.baseinfo
new file mode 100644
index 0000000..f35d8da
--- /dev/null
+++ b/src/zdmo_r_rapg_nodetp.ddls.baseinfo
@@ -0,0 +1,23 @@
+{
+"BASEINFO":
+{
+"FROM":
+[
+"ZDMO_R_RAPG_PROJECTTP",
+"ZDMO_RAPGEN_NODE"
+],
+"ASSOCIATED":
+[
+"ZDMO_R_RAPG_FIELDTP",
+"ZDMO_R_RAPG_PROJECTTP"
+],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_r_rapg_nodetp.ddls.xml b/src/zdmo_r_rapg_nodetp.ddls.xml
new file mode 100644
index 0000000..83ab823
--- /dev/null
+++ b/src/zdmo_r_rapg_nodetp.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_R_RAPG_NODETP</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>CDS View for Node</DDTEXT>
+    <SOURCE_TYPE>W</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_r_rapg_nodetpdraft.ddls.asddls b/src/zdmo_r_rapg_nodetpdraft.ddls.asddls
new file mode 100644
index 0000000..fafc69c
--- /dev/null
+++ b/src/zdmo_r_rapg_nodetpdraft.ddls.asddls
@@ -0,0 +1,66 @@
+@AbapCatalog.viewEnhancementCategory: [#NONE]
+@AccessControl.authorizationCheck: #NOT_REQUIRED
+@EndUserText.label: 'CDS view for draft entries'
+@Metadata.ignorePropagatedAnnotations: true
+@ObjectModel.usageType:{
+    serviceQuality: #X,
+    sizeCategory: #S,
+    dataClass: #MIXED
+}
+define view entity ZDMO_R_RAPG_NodeTPDraft
+  as select from zdmo_rapgnode00d
+{
+  key nodeuuid                      as Nodeuuid,
+      rapbouuid                     as Rapbouuid,
+      parentuuid                    as Parentuuid,
+      rootuuid                      as Rootuuid,
+      nodenumber                    as Nodenumber,
+      isrootnode                    as Isrootnode,
+      entityname                    as Entityname,
+      parententityname              as Parententityname,
+      datasource                    as Datasource,
+      parentdatasource              as Parentdatasource,
+      viewtypevalue                 as Viewtypevalue,
+      fieldnameobjectid             as Fieldnameobjectid,
+      fieldnameetagmaster           as Fieldnameetagmaster,
+      fieldnametotaletag            as Fieldnametotaletag,
+      fieldnameuuid                 as Fieldnameuuid,
+      fieldnameparentuuid           as Fieldnameparentuuid,
+      fieldnamerootuuid             as Fieldnamerootuuid,
+      fieldnamecreatedby            as Fieldnamecreatedby,
+      fieldnamecreatedat            as Fieldnamecreatedat,
+      fieldnamelastchangedby        as Fieldnamelastchangedby,
+      fieldnamelastchangedat        as Fieldnamelastchangedat,
+      fieldnameloclastchangedat     as Fieldnameloclastchangedat,
+      cdsiview                      as Cdsiview,
+      cdsiviewbasic                 as Cdsiviewbasic,
+      cdsrview                      as Cdsrview,
+      cdspview                      as Cdspview,
+      mdeview                       as Mdeview,
+      behaviorimplementationclass   as Behaviorimplementationclass,
+      servicedefinition             as Servicedefinition,
+      servicebinding                as Servicebinding,
+      controlstructure              as Controlstructure,
+      queryimplementationclass      as Queryimplementationclass,
+      drafttablename                as Drafttablename,
+      hierarchydistancefromroot     as Hierarchydistancefromroot,
+      hierarchydescendantcount      as Hierarchydescendantcount,
+      hierarchydrillstate           as Hierarchydrillstate,
+      hierarchypreorderrank         as Hierarchypreorderrank,
+      locallastchangedat            as Locallastchangedat,
+      ischildnode                   as Ischildnode,
+      istable                       as Istable,
+      iscdsview                     as Iscdsview,
+      isabstractentity              as Isabstractentity,
+      draftentitycreationdatetime   as Draftentitycreationdatetime,
+      draftentitylastchangedatetime as Draftentitylastchangedatetime,
+      draftadministrativedatauuid   as Draftadministrativedatauuid,
+      draftentityoperationcode      as Draftentityoperationcode,
+      hasactiveentity               as Hasactiveentity,
+      draftfieldchanges             as Draftfieldchanges,
+      sapobjectnodetype             as Sapojbectnodetype,
+      sapobjecttype                 as sapobjecttype
+}
+where
+      draftentityoperationcode <> 'D' // IF_DRAFT_CONSTANTS=>co_operation_code-deleted
+  and draftentityoperationcode <> 'L' // IF_DRAFT_CONSTANTS=>co_operation_code-redeleted
diff --git a/src/zdmo_r_rapg_nodetpdraft.ddls.baseinfo b/src/zdmo_r_rapg_nodetpdraft.ddls.baseinfo
new file mode 100644
index 0000000..621c5a6
--- /dev/null
+++ b/src/zdmo_r_rapg_nodetpdraft.ddls.baseinfo
@@ -0,0 +1,19 @@
+{
+"BASEINFO":
+{
+"FROM":
+[
+"ZDMO_RAPGNODE00D"
+],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_r_rapg_nodetpdraft.ddls.xml b/src/zdmo_r_rapg_nodetpdraft.ddls.xml
new file mode 100644
index 0000000..f22f379
--- /dev/null
+++ b/src/zdmo_r_rapg_nodetpdraft.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_R_RAPG_NODETPDRAFT</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>CDS view for draft entries</DDTEXT>
+    <SOURCE_TYPE>W</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_r_rapg_projecttp.bdef.asbdef b/src/zdmo_r_rapg_projecttp.bdef.asbdef
new file mode 100644
index 0000000..4f7cc26
--- /dev/null
+++ b/src/zdmo_r_rapg_projecttp.bdef.asbdef
@@ -0,0 +1,387 @@
+managed implementation in class zdmo_bp_rapg_all unique;
+
+
+strict;
+with draft;
+
+define behavior for ZDMO_R_RAPG_ProjectTP alias Project
+//implementation in class ZDMO_BP_R_RAPG_Project unique
+persistent table zdmo_rapgen_bo
+with additional save
+draft table zdmo_rapgproj00d
+etag master LocalLastChangedAt
+lock master
+total etag LastChangedAt
+authorization master ( global )
+
+{
+  field ( readonly )
+  RapBoUUID,
+  BoName,
+  // set when being created
+  ImplementationType,
+  DataSourceType,
+  BindingType,
+  DraftEnabled,
+  PackageName,
+  Namespace,
+  isExtensible,
+  // RAP Generator Parameters
+  JsonString,
+  //ADT
+  ADTLink,
+  // administrative fields
+  CreatedAt,
+  CreatedBy,
+  LastChangedBy,
+  LastChangedAt,
+  LocalLastChangedAt;
+
+  //  field ( mandatory )
+  //  PackageName;
+
+  //  field ( features : instance ) ADTLink;
+  field ( features : instance ) MultiInlineEdit, CustomizingTable, AddToManageBusinessConfig;
+
+  field ( features : instance ) PublishService;
+
+  field ( numbering : managed ) RapBoUUID;
+
+  internal create;
+  update;
+  delete;
+
+  draft action ( features : instance ) Edit;
+  draft action Activate;
+  draft action Discard;
+  draft action Resume;
+  draft determine action Prepare
+  {
+    determination ( always ) createJSONString;
+    validation ( always ) mandatory_fields_check;
+    validation ( always ) Node~mandatory_fields_check;
+    validation ( always ) is_customizing_table;
+    validation ( always ) check_for_allowed_combinations;
+  }
+
+
+  determine action check_allowed_combinations_det
+  {
+    validation ( always ) check_for_allowed_combinations;
+  }
+
+  static action createProjectAndRootNode parameter ZDMO_I_RAP_GEN_PARAM_NEW_PROJ result [1] $self;
+  action ( features : instance ) copyProject parameter ZDMO_I_RAP_GEN_PARAM_COPY_PROJ result [1] $self;
+  action ( features : instance ) generateProject result [1] $self;
+  action ( features : instance ) deleteProject result [1] $self;
+
+  determination createJsonString on save { create; }
+
+  determination CalculateBoName on save { create; }
+  determination SetRepositoryObjectNames on modify { field Suffix, Prefix, AddIViewBasic, PublishService, AddSAPObjectType; }
+
+  side effects
+  {
+    field Suffix affects field * , entity _Node ;
+    field Prefix affects field * , entity _Node;
+    field AddIViewBasic affects field * , entity _Node;
+    field PublishService affects field * , entity _Node;
+    field AddSAPObjectType affects field * , entity _Node;
+  }
+
+  validation generated_objects_are_deleted on save { delete; }
+  validation mandatory_fields_check on save { create; }
+  validation is_customizing_table on save { create; }
+  validation check_for_allowed_combinations on save { create; }
+
+  association _Log { create; with draft; }
+  association _Node { create; with draft; }
+  mapping for zdmo_rapgen_bo
+    {
+      RapBoUUID                  = RAP_NODE_UUID;
+      BoName                     = BO_NAME;
+      RootEntityName             = ROOT_ENTITY_NAME;
+      Namespace                  = NAMESPACE;
+      PackageName                = PACKAGE_NAME;
+      TransportRequest           = TRANSPORT_REQUEST;
+      SkipActivation             = SKIP_ACTIVATION;
+      AddIViewBasic              = add_i_view_basic;
+      ImplementationType         = IMPLEMENTATION_TYPE;
+      AbapLanguageVersion        = ABAP_LANGUAGE_VERSION;
+      PackageLanguageVersion     = PACKAGE_LANGUAGE_VERSION;
+      DataSourceType             = DATA_SOURCE_TYPE;
+      BindingType                = BINDING_TYPE;
+      DraftEnabled               = DRAFT_ENABLED;
+      Suffix                     = SUFFIX;
+      Prefix                     = PREFIX;
+      MultiInlineEdit            = MULTI_INLINE_EDIT;
+      CustomizingTable           = CUSTOMIZING_TABLE;
+      PublishService             = PUBLISH_SERVICE;
+      AddToManageBusinessConfig  = ADD_TO_MANAGE_BUSINESS_CONFIG;
+      BusinessConfName           = BUSINESS_CONF_NAME;
+      BusinessConfIdentifier     = BUSINESS_CONF_IDENTIFIER;
+      BusinessConfDescription    = BUSINESS_CONF_DESCRIPTION;
+      CreatedAt                  = CREATED_AT;
+      CreatedBy                  = CREATED_BY;
+      LastChangedBy              = LAST_CHANGED_BY;
+      LastChangedAt              = LAST_CHANGED_AT;
+      LocalLastChangedAt         = LOCAL_LAST_CHANGED_AT;
+      JsonString                 = JSON_STRING;
+      JsonIsValid                = JSON_IS_VALID;
+      BoIsGenerated              = BO_IS_GENERATED;
+      BoIsDeleted                = BO_IS_DELETED;
+      ApplJobLogHandle           = APPL_JOB_LOG_HANDLE;
+      JobCount                   = JOB_COUNT;
+      JobName                    = JOB_NAME;
+      ADTLink                    = ADT_LINK;
+      hasSematicKey              = has_semantic_key;
+      isExtensible               = is_extensible;
+      extensibilityElementSuffix = extensibility_element_suffix;
+      JobStatus                  = job_status;
+      JobStatusCriticality       = job_status_criticality;
+      JobStatusText              = job_status_text;
+      SAPObjectType              = sap_object_type;
+    }
+
+
+
+
+}
+
+define behavior for ZDMO_R_RAPG_LogTP alias Log
+//implementation in class ZDMO_BP_R_RAPG_Log unique
+persistent table zdmo_rapgen_log
+draft table zdmo_rapglog00d
+etag master LocalLastChangedAt
+lock dependent by _Project
+authorization dependent by _Project
+
+{
+  field ( readonly )
+  LogUUID,
+  RapBoUUID,
+  //  LogItemNumber,
+  LocalLastChangedAt;
+
+  field ( numbering : managed )
+  LogUUID;
+
+
+  update;
+  delete;
+
+  association _Project { with draft; }
+
+  determination CalculateLogItemNumber on save { create; }
+  mapping for zdmo_rapgen_log
+    {
+      LogUUID            = LOG_UUID;
+      RapBoUUID          = RAPBO_UUID;
+      LogItemNumber      = LOG_ITEM_NUMBER;
+      DetailLevel        = DETAIL_LEVEL;
+      Severity           = SEVERITY;
+      Text               = TEXT;
+      TimeStamp          = TIME_STAMP;
+      LocalLastChangedAt = LOCAL_LAST_CHANGED_AT;
+    }
+
+
+}
+
+define behavior for ZDMO_R_RAPG_NodeTP alias Node
+//implementation in class ZDMO_BP_R_RAPG_Node unique
+persistent table zdmo_rapgen_node
+draft table zdmo_rapgnode00d
+etag master LocalLastChangedAt
+lock dependent by _Project
+authorization dependent by _Project
+
+{
+  field ( readonly )
+  NodeUUID,
+  RapBoUUID,
+  EntityName,
+  ParentEntityName,
+  IsRootNode,
+  DataSource,
+  ParentDataSource,
+  //  FieldNameUUID,
+  MdeView,
+  //Hierarchy information (to be adapted)
+  HierarchyDescendantCount,
+  HierarchyDistanceFromRoot,
+  HierarchyDrillState,
+  HierarchyPreorderRank,
+  //administrative field
+  LocalLastChangedAt;
+
+
+  field ( features : instance )
+  FieldNameRootUUID,
+  FieldNameUUID,
+  FieldNameParentUUID,
+  ControlStructure,
+  DraftTableName,
+  CdsIViewBasic,
+  FieldNameTotalEtag,
+  FieldNameEtagMaster,
+  QueryImplementationClass,
+  ServiceBinding,
+  ServiceDefinition,
+  FieldNameLastChangedAt,
+  FieldNameLastChangedBy,
+  FieldNameCreatedAt,
+  FieldNameCreatedBy,
+  //fields for extensible RAP BO's
+  ExtensibilityElementSuffix,
+  DraftQueryView,
+  ExtensionInclude,
+  ExtensionIncludeView,
+  SAPObjectType,
+  SAPObjectNodeType
+  ;
+
+  //  ExtensionInclude;
+
+
+
+  //  field ( mandatory : create ) EntityName, DataSource ;
+
+  //  field ( readonly )  ParentEntityName;
+
+  field ( mandatory ) FieldNameObjectID;
+
+  field ( numbering : managed ) NodeUUID;
+
+
+
+  update;
+  delete;
+
+  //  static action ( features : global ) createRootNode parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODE result [1] $self;
+  //  action ( features : instance ) addChildNode parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODE result [1] $self;
+  action ( features : instance ) SetRepositoryObjectNames;
+
+
+  //  static action  createRootNode parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODE result [1] $self;
+  internal action addChildNode parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODE result [1] $self;
+  action ( features : instance ) addChildDataSourceTable parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODEt; // "result [1] $self;
+  action ( features : instance ) addChildDataSourceCDSview parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODEc; // result [1] $self;
+  action ( features : instance ) addChildDataSourceAbsEntity parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODEa; // result [1] $self;
+
+  side effects
+  {
+    action addChildDataSourceTable affects entity _Project._Node;
+    action addChildDataSourceCDSview affects entity _Project._Node;
+    action addChildDataSourceAbsEntity affects entity _Project._Node;
+  }
+
+  determination CalculateEntityName on save { create; }
+  determination SetRepositoryObjectNames_det on modify
+  { create;
+    field EntityName;
+  }
+  determination SetFieldNames on modify
+  { create;
+    field DataSource;
+  }
+  validation mandatory_fields_check on save { create; }
+  association _Project { with draft; }
+  association _Field { create; with draft; }
+  mapping for zdmo_rapgen_node
+    {
+      NodeUUID                    = NODE_UUID;
+      RapBoUUID                   = HEADER_UUID;
+      ParentUUID                  = PARENT_UUID;
+      RootUUID                    = ROOT_UUID;
+      NodeNumber                  = NODE_NUMBER;
+      IsRootNode                  = IS_ROOT_NODE;
+      EntityName                  = ENTITY_NAME;
+      ParentEntityName            = PARENT_ENTITY_NAME;
+      DataSource                  = DATA_SOURCE;
+      ParentDataSource            = PARENT_DATA_SOURCE;
+      ViewTypeValue               = VIEW_TYPE_VALUE;
+      FieldNameObjectID           = FIELD_NAME_OBJECT_ID;
+      FieldNameEtagMaster         = FIELD_NAME_ETAG_MASTER;
+      FieldNameTotalEtag          = FIELD_NAME_TOTAL_ETAG;
+      FieldNameUUID               = FIELD_NAME_UUID;
+      FieldNameParentUUID         = FIELD_NAME_PARENT_UUID;
+      FieldNameRootUUID           = FIELD_NAME_ROOT_UUID;
+      FieldNameCreatedBy          = FIELD_NAME_CREATED_BY;
+      FieldNameCreatedAt          = FIELD_NAME_CREATED_AT;
+      FieldNameLastChangedBy      = FIELD_NAME_LAST_CHANGED_BY;
+      FieldNameLastChangedAt      = FIELD_NAME_LAST_CHANGED_AT;
+      FieldNameLocLastChangedAt   = FIELD_NAME_LOC_LAST_CHANGED_AT;
+      CdsIView                    = CDS_I_VIEW;
+      CdsIViewBasic               = cds_i_view_basic;
+      CdsRView                    = CDS_R_VIEW;
+      CdsPView                    = CDS_P_VIEW;
+      MdeView                     = MDE_VIEW;
+      BehaviorImplementationClass = BEHAVIOR_IMPLEMENTATION_CLASS;
+      ServiceDefinition           = SERVICE_DEFINITION;
+      ServiceBinding              = SERVICE_BINDING;
+      SAPObjectType               = sap_object_type;
+      SAPObjectNodeType           = sap_object_node_type;
+      ControlStructure            = CONTROL_STRUCTURE;
+      QueryImplementationClass    = QUERY_IMPLEMENTATION_CLASS;
+      DraftTableName              = DRAFT_TABLE_NAME;
+      ExtensionInclude            = extension_include;
+      ExtensionIncludeView        = extension_include_view;
+      DraftQueryView              = draft_query_view;
+      extensibilityElementSuffix  = extensibility_element_suffix;
+      HierarchyDistanceFromRoot   = HIERARCHY_DISTANCE_FROM_ROOT;
+      HierarchyDescendantCount    = HIERARCHY_DESCENDANT_COUNT;
+      HierarchyDrillState         = HIERARCHY_DRILL_STATE;
+      HierarchyPreorderRank       = HIERARCHY_PREORDER_RANK;
+      LocalLastChangedAt          = LOCAL_LAST_CHANGED_AT;
+    }
+
+
+
+
+
+}
+
+define behavior for ZDMO_R_RAPG_FieldTP alias Field
+//implementation in class ZDMO_BP_R_RAPG_Field unique
+persistent table zdmo_rapgen_flds
+draft table zdmo_rapgfiel00d
+etag master LocalLastChangedAt
+lock dependent by _Project
+authorization dependent by _Project
+
+{
+  field ( readonly )
+  FieldUUID,
+  NodeUUID,
+  RapboUUID,
+  DbtableField,
+  LocalLastChangedAt;
+
+  field ( features : instance )
+  IsKey;
+
+  field ( numbering : managed )
+  FieldUUID;
+
+
+  update;
+  delete;
+
+  association _Node { with draft; }
+  association _Project { with draft; }
+
+  determination CalculateDbtableField on save { create; }
+  mapping for zdmo_rapgen_flds
+    {
+      FieldUUID          = FIELD_UUID;
+      NodeUUID           = NODE_UUID;
+      RapboUUID          = RAPBO_UUID;
+      IsKey              = is_key;
+      DbtableField       = DBTABLE_FIELD;
+      CdsViewField       = CDS_VIEW_FIELD;
+      LocalLastChangedAt = LOCAL_LAST_CHANGED_AT;
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/zdmo_r_rapg_projecttp.bdef.xml b/src/zdmo_r_rapg_projecttp.bdef.xml
new file mode 100644
index 0000000..7a9e094
--- /dev/null
+++ b/src/zdmo_r_rapg_projecttp.bdef.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_BDEF" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <BDEF>
+    <NAME>ZDMO_R_RAPG_PROJECTTP</NAME>
+    <TYPE>BDEF/BDO</TYPE>
+    <DESCRIPTION>Behavior for ZDMO_R_RAPG_ProjectTP</DESCRIPTION>
+    <DESCRIPTION_TEXT_LIMIT>60</DESCRIPTION_TEXT_LIMIT>
+    <LANGUAGE>EN</LANGUAGE>
+    <LINKS>
+     <item>
+      <HREF>./zdmo_r_rapg_projecttp/source/main/versions</HREF>
+      <REL>http://www.sap.com/adt/relations/versions</REL>
+      <TITLE>Historic versions</TITLE>
+     </item>
+     <item>
+      <HREF>./zdmo_r_rapg_projecttp/source/main</HREF>
+      <REL>http://www.sap.com/adt/relations/source</REL>
+      <TYPE>text/plain</TYPE>
+      <TITLE>Source Content</TITLE>
+     </item>
+     <item>
+      <HREF>./zdmo_r_rapg_projecttp/source/main</HREF>
+      <REL>http://www.sap.com/adt/relations/source</REL>
+      <TYPE>text/html</TYPE>
+      <TITLE>Source Content (HTML)</TITLE>
+     </item>
+    </LINKS>
+    <MASTER_LANGUAGE>EN</MASTER_LANGUAGE>
+    <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION>
+    <SOURCE_URI>./zdmo_r_rapg_projecttp/source/main</SOURCE_URI>
+    <SOURCE_TYPE>ABAP_SOURCE</SOURCE_TYPE>
+    <SOURCE_FIXED_POINT_ARITHMETIC>true</SOURCE_FIXED_POINT_ARITHMETIC>
+    <SOURCE_UNICODE_CHECKS_ACTIVE>true</SOURCE_UNICODE_CHECKS_ACTIVE>
+   </BDEF>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_r_rapg_projecttp.ddls.asddls b/src/zdmo_r_rapg_projecttp.ddls.asddls
new file mode 100644
index 0000000..7829ca4
--- /dev/null
+++ b/src/zdmo_r_rapg_projecttp.ddls.asddls
@@ -0,0 +1,65 @@
+@AccessControl.authorizationCheck: #NOT_REQUIRED
+@Metadata.allowExtensions: true
+@EndUserText.label: 'CDS View forProject'
+define root view entity ZDMO_R_RAPG_ProjectTP
+  as select from zdmo_rapgen_bo
+  composition [0..*] of ZDMO_R_RAPG_LogTP  as _Log
+  composition [0..*] of ZDMO_R_RAPG_NodeTP as _Node
+{
+  key rap_node_uuid                 as RapBoUUID,
+      bo_name                       as BoName,
+      root_entity_name              as RootEntityName,
+      namespace                     as Namespace,
+      package_name                  as PackageName,
+      transport_request             as TransportRequest,
+      skip_activation               as SkipActivation,
+      add_i_view_basic              as AddIViewBasic,
+      publish_service               as PublishService,
+      implementation_type           as ImplementationType,
+      abap_language_version         as AbapLanguageVersion,
+      package_language_version      as PackageLanguageVersion,
+      data_source_type              as DataSourceType,
+      binding_type                  as BindingType,
+      draft_enabled                 as DraftEnabled,
+      suffix                        as Suffix,
+      prefix                        as Prefix,
+      multi_inline_edit             as MultiInlineEdit,
+      customizing_table             as CustomizingTable,
+      add_to_manage_business_config as AddToManageBusinessConfig,
+      business_conf_name            as BusinessConfName,
+      business_conf_identifier      as BusinessConfIdentifier,
+      business_conf_description     as BusinessConfDescription,
+      @Semantics.systemDateTime.createdAt: true
+      created_at                    as CreatedAt,
+      @Semantics.user.createdBy: true
+      created_by                    as CreatedBy,
+      @Semantics.user.lastChangedBy: true
+      last_changed_by               as LastChangedBy,
+      @Semantics.systemDateTime.lastChangedAt: true
+      last_changed_at               as LastChangedAt,
+      @Semantics.systemDateTime.localInstanceLastChangedAt: true
+      local_last_changed_at         as LocalLastChangedAt,
+      json_string                   as JsonString,
+      json_is_valid                 as JsonIsValid,
+      bo_is_generated               as BoIsGenerated,
+      bo_is_deleted                 as BoIsDeleted,
+      appl_job_log_handle           as ApplJobLogHandle,
+      job_count                     as JobCount,
+      job_name                      as JobName,
+      adt_link                      as ADTLink,
+      is_managed                    as isManaged,
+      is_extensible                 as isExtensible,
+      extensibility_element_suffix  as extensibilityElementSuffix,
+      does_not_use_unmanaged_query  as doesNotUseUnmanagedQuery,
+      has_semantic_key              as hasSematicKey,
+
+      job_status                    as JobStatus,
+      job_status_criticality        as JobStatusCriticality,
+      job_status_text               as JobStatusText,
+      
+      sap_object_type               as SAPObjectType,
+      add_sap_object_type           as AddSAPObjectType,
+      _Log,
+      _Node
+
+}
diff --git a/src/zdmo_r_rapg_projecttp.ddls.baseinfo b/src/zdmo_r_rapg_projecttp.ddls.baseinfo
new file mode 100644
index 0000000..417769d
--- /dev/null
+++ b/src/zdmo_r_rapg_projecttp.ddls.baseinfo
@@ -0,0 +1,22 @@
+{
+"BASEINFO":
+{
+"FROM":
+[
+"ZDMO_RAPGEN_BO"
+],
+"ASSOCIATED":
+[
+"ZDMO_R_RAPG_LOGTP",
+"ZDMO_R_RAPG_NODETP"
+],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_r_rapg_projecttp.ddls.xml b/src/zdmo_r_rapg_projecttp.ddls.xml
new file mode 100644
index 0000000..f33a6a0
--- /dev/null
+++ b/src/zdmo_r_rapg_projecttp.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_R_RAPG_PROJECTTP</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>CDS View for Project</DDTEXT>
+    <SOURCE_TYPE>W</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_r_rapg_projecttpdraft.ddls.asddls b/src/zdmo_r_rapg_projecttpdraft.ddls.asddls
new file mode 100644
index 0000000..5a476a7
--- /dev/null
+++ b/src/zdmo_r_rapg_projecttpdraft.ddls.asddls
@@ -0,0 +1,59 @@
+@AbapCatalog.viewEnhancementCategory: [#NONE]
+@AccessControl.authorizationCheck: #NOT_REQUIRED
+@EndUserText.label: 'CDS view for draft entries'
+@Metadata.ignorePropagatedAnnotations: true
+@ObjectModel.usageType:{
+    serviceQuality: #X,
+    sizeCategory: #S,
+    dataClass: #MIXED
+}
+define view entity ZDMO_R_RAPG_ProjectTPDraft
+  as select from zdmo_rapgproj00d
+{
+  key rapbouuid                     as Rapbouuid,
+      boname                        as Boname,
+      rootentityname                as Rootentityname,
+      namespace                     as Namespace,
+      packagename                   as Packagename,
+      transportrequest              as Transportrequest,
+      skipactivation                as Skipactivation,
+      implementationtype            as Implementationtype,
+      abaplanguageversion           as Abaplanguageversion,
+      packagelanguageversion        as Packagelanguageversion,
+      datasourcetype                as Datasourcetype,
+      bindingtype                   as Bindingtype,
+      draftenabled                  as Draftenabled,
+      suffix                        as Suffix,
+      prefix                        as Prefix,
+      multiinlineedit               as Multiinlineedit,
+      customizingtable              as Customizingtable,
+      addtomanagebusinessconfig     as Addtomanagebusinessconfig,
+      businessconfname              as Businessconfname,
+      businessconfidentifier        as Businessconfidentifier,
+      businessconfdescription       as Businessconfdescription,
+      createdat                     as Createdat,
+      createdby                     as Createdby,
+      lastchangedby                 as Lastchangedby,
+      lastchangedat                 as Lastchangedat,
+      locallastchangedat            as Locallastchangedat,
+      jsonstring                    as Jsonstring,
+      jsonisvalid                   as Jsonisvalid,
+      boisgenerated                 as Boisgenerated,
+      boisdeleted                   as Boisdeleted,
+      appljobloghandle              as Appljobloghandle,
+      jobcount                      as Jobcount,
+      jobname                       as Jobname,
+      adtlink                       as Adtlink,
+      ismanaged                     as Ismanaged,
+      doesnotuseunmanagedquery      as Doesnotuseunmanagedquery,
+      hassematickey                 as Hassematickey,
+      draftentitycreationdatetime   as Draftentitycreationdatetime,
+      draftentitylastchangedatetime as Draftentitylastchangedatetime,
+      draftadministrativedatauuid   as Draftadministrativedatauuid,
+      draftentityoperationcode      as Draftentityoperationcode,
+      hasactiveentity               as Hasactiveentity,
+      draftfieldchanges             as Draftfieldchanges
+}
+where
+      draftentityoperationcode <> 'D' // IF_DRAFT_CONSTANTS=>co_operation_code-deleted
+  and draftentityoperationcode <> 'L' // IF_DRAFT_CONSTANTS=>co_operation_code-redeleted
diff --git a/src/zdmo_r_rapg_projecttpdraft.ddls.baseinfo b/src/zdmo_r_rapg_projecttpdraft.ddls.baseinfo
new file mode 100644
index 0000000..6ee3cc2
--- /dev/null
+++ b/src/zdmo_r_rapg_projecttpdraft.ddls.baseinfo
@@ -0,0 +1,19 @@
+{
+"BASEINFO":
+{
+"FROM":
+[
+"ZDMO_RAPGPROJ00D"
+],
+"ASSOCIATED":
+[],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_r_rapg_projecttpdraft.ddls.xml b/src/zdmo_r_rapg_projecttpdraft.ddls.xml
new file mode 100644
index 0000000..7ae089a
--- /dev/null
+++ b/src/zdmo_r_rapg_projecttpdraft.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_R_RAPG_PROJECTTPDRAFT</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>CDS view for draft entries</DDTEXT>
+    <SOURCE_TYPE>W</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_abaplangversion.doma.xml b/src/zdmo_rap_gen_abaplangversion.doma.xml
new file mode 100644
index 0000000..8b07529
--- /dev/null
+++ b/src/zdmo_rap_gen_abaplangversion.doma.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD01V>
+    <DOMNAME>ZDMO_RAP_GEN_ABAPLANGVERSION</DOMNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DATATYPE>CHAR</DATATYPE>
+    <LENG>000030</LENG>
+    <OUTPUTLEN>000030</OUTPUTLEN>
+    <LOWERCASE>X</LOWERCASE>
+    <DDTEXT>ABAP Language Version</DDTEXT>
+    <DOMMASTER>E</DOMMASTER>
+   </DD01V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_abaplangversion.dtel.xml b/src/zdmo_rap_gen_abaplangversion.dtel.xml
new file mode 100644
index 0000000..6b2251b
--- /dev/null
+++ b/src/zdmo_rap_gen_abaplangversion.dtel.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD04V>
+    <ROLLNAME>ZDMO_RAP_GEN_ABAPLANGVERSION</ROLLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DOMNAME>ZDMO_RAP_GEN_ABAPLANGVERSION</DOMNAME>
+    <HEADLEN>55</HEADLEN>
+    <SCRLEN1>10</SCRLEN1>
+    <SCRLEN2>20</SCRLEN2>
+    <SCRLEN3>40</SCRLEN3>
+    <DDTEXT>ABAP Language Version</DDTEXT>
+    <REPTEXT>ABAP Language Version</REPTEXT>
+    <SCRTEXT_S>ABAP Vers.</SCRTEXT_S>
+    <SCRTEXT_M>ABAP Language Vers.</SCRTEXT_M>
+    <SCRTEXT_L>ABAP Language Version</SCRTEXT_L>
+    <DTELMASTER>E</DTELMASTER>
+    <REFKIND>D</REFKIND>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+   </DD04V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_cds_view_field.doma.xml b/src/zdmo_rap_gen_cds_view_field.doma.xml
new file mode 100644
index 0000000..cd2aacc
--- /dev/null
+++ b/src/zdmo_rap_gen_cds_view_field.doma.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD01V>
+    <DOMNAME>ZDMO_RAP_GEN_CDS_VIEW_FIELD</DOMNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DATATYPE>CHAR</DATATYPE>
+    <LENG>000030</LENG>
+    <OUTPUTLEN>000030</OUTPUTLEN>
+    <LOWERCASE>X</LOWERCASE>
+    <DDTEXT>Entity Name</DDTEXT>
+    <DOMMASTER>E</DOMMASTER>
+   </DD01V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_cds_view_field.dtel.xml b/src/zdmo_rap_gen_cds_view_field.dtel.xml
new file mode 100644
index 0000000..2d7310a
--- /dev/null
+++ b/src/zdmo_rap_gen_cds_view_field.dtel.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD04V>
+    <ROLLNAME>ZDMO_RAP_GEN_CDS_VIEW_FIELD</ROLLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DOMNAME>ZDMO_RAP_GEN_CDS_VIEW_FIELD</DOMNAME>
+    <HEADLEN>55</HEADLEN>
+    <SCRLEN1>10</SCRLEN1>
+    <SCRLEN2>20</SCRLEN2>
+    <SCRLEN3>40</SCRLEN3>
+    <DDTEXT>CDS view field name</DDTEXT>
+    <REPTEXT>CDS view field name</REPTEXT>
+    <SCRTEXT_S>CDS field</SCRTEXT_S>
+    <SCRTEXT_M>CDS view field</SCRTEXT_M>
+    <SCRTEXT_L>CDS view field name</SCRTEXT_L>
+    <DTELMASTER>E</DTELMASTER>
+    <REFKIND>D</REFKIND>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+   </DD04V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_draft_enabled.dtel.xml b/src/zdmo_rap_gen_draft_enabled.dtel.xml
new file mode 100644
index 0000000..c1bba05
--- /dev/null
+++ b/src/zdmo_rap_gen_draft_enabled.dtel.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD04V>
+    <ROLLNAME>ZDMO_RAP_GEN_DRAFT_ENABLED</ROLLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DOMNAME>ABAP_BOOLEAN</DOMNAME>
+    <HEADLEN>55</HEADLEN>
+    <SCRLEN1>10</SCRLEN1>
+    <SCRLEN2>20</SCRLEN2>
+    <SCRLEN3>40</SCRLEN3>
+    <DDTEXT>Draft enabled</DDTEXT>
+    <REPTEXT>Draft enabled</REPTEXT>
+    <SCRTEXT_S>Draft</SCRTEXT_S>
+    <SCRTEXT_M>Draft enabled</SCRTEXT_M>
+    <SCRTEXT_L>Draft enabled</SCRTEXT_L>
+    <DTELMASTER>E</DTELMASTER>
+    <REFKIND>D</REFKIND>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+   </DD04V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_entityname.doma.xml b/src/zdmo_rap_gen_entityname.doma.xml
new file mode 100644
index 0000000..e34755c
--- /dev/null
+++ b/src/zdmo_rap_gen_entityname.doma.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD01V>
+    <DOMNAME>ZDMO_RAP_GEN_ENTITYNAME</DOMNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DATATYPE>CHAR</DATATYPE>
+    <LENG>000040</LENG>
+    <OUTPUTLEN>000040</OUTPUTLEN>
+    <LOWERCASE>X</LOWERCASE>
+    <DDTEXT>Entity Name</DDTEXT>
+    <DOMMASTER>E</DOMMASTER>
+   </DD01V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_entityname.dtel.xml b/src/zdmo_rap_gen_entityname.dtel.xml
new file mode 100644
index 0000000..541f669
--- /dev/null
+++ b/src/zdmo_rap_gen_entityname.dtel.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD04V>
+    <ROLLNAME>ZDMO_RAP_GEN_ENTITYNAME</ROLLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DOMNAME>ZDMO_RAP_GEN_ENTITYNAME</DOMNAME>
+    <HEADLEN>55</HEADLEN>
+    <SCRLEN1>10</SCRLEN1>
+    <SCRLEN2>20</SCRLEN2>
+    <SCRLEN3>40</SCRLEN3>
+    <DDTEXT>Entity Name</DDTEXT>
+    <REPTEXT>Entity Name</REPTEXT>
+    <SCRTEXT_S>EntityName</SCRTEXT_S>
+    <SCRTEXT_M>Entity Name</SCRTEXT_M>
+    <SCRTEXT_L>Entity Name</SCRTEXT_L>
+    <DTELMASTER>E</DTELMASTER>
+    <REFKIND>D</REFKIND>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+   </DD04V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_namespace.doma.xml b/src/zdmo_rap_gen_namespace.doma.xml
new file mode 100644
index 0000000..5818de4
--- /dev/null
+++ b/src/zdmo_rap_gen_namespace.doma.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD01V>
+    <DOMNAME>ZDMO_RAP_GEN_NAMESPACE</DOMNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DATATYPE>CHAR</DATATYPE>
+    <LENG>000010</LENG>
+    <OUTPUTLEN>000010</OUTPUTLEN>
+    <DDTEXT>Namespace</DDTEXT>
+    <DOMMASTER>E</DOMMASTER>
+   </DD01V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_namespace.dtel.xml b/src/zdmo_rap_gen_namespace.dtel.xml
new file mode 100644
index 0000000..872633a
--- /dev/null
+++ b/src/zdmo_rap_gen_namespace.dtel.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD04V>
+    <ROLLNAME>ZDMO_RAP_GEN_NAMESPACE</ROLLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DOMNAME>ZDMO_RAP_GEN_NAMESPACE</DOMNAME>
+    <HEADLEN>55</HEADLEN>
+    <SCRLEN1>10</SCRLEN1>
+    <SCRLEN2>20</SCRLEN2>
+    <SCRLEN3>40</SCRLEN3>
+    <DDTEXT>Namespace</DDTEXT>
+    <REPTEXT>Namespace</REPTEXT>
+    <SCRTEXT_S>Namespace</SCRTEXT_S>
+    <SCRTEXT_M>Namespace</SCRTEXT_M>
+    <SCRTEXT_L>Namespace</SCRTEXT_L>
+    <DTELMASTER>E</DTELMASTER>
+    <REFKIND>D</REFKIND>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+   </DD04V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_parent_entityname.dtel.xml b/src/zdmo_rap_gen_parent_entityname.dtel.xml
new file mode 100644
index 0000000..edb8674
--- /dev/null
+++ b/src/zdmo_rap_gen_parent_entityname.dtel.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD04V>
+    <ROLLNAME>ZDMO_RAP_GEN_PARENT_ENTITYNAME</ROLLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DOMNAME>ZDMO_RAP_GEN_ENTITYNAME</DOMNAME>
+    <HEADLEN>55</HEADLEN>
+    <SCRLEN1>10</SCRLEN1>
+    <SCRLEN2>20</SCRLEN2>
+    <SCRLEN3>40</SCRLEN3>
+    <DDTEXT>Entity Name</DDTEXT>
+    <REPTEXT>Parent Entity Name</REPTEXT>
+    <SCRTEXT_S>Parent Ent</SCRTEXT_S>
+    <SCRTEXT_M>Parent Entity Name</SCRTEXT_M>
+    <SCRTEXT_L>Parent Entity Name</SCRTEXT_L>
+    <DTELMASTER>E</DTELMASTER>
+    <REFKIND>D</REFKIND>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+   </DD04V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rap_gen_root_entityname.dtel.xml b/src/zdmo_rap_gen_root_entityname.dtel.xml
new file mode 100644
index 0000000..7914fc6
--- /dev/null
+++ b/src/zdmo_rap_gen_root_entityname.dtel.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD04V>
+    <ROLLNAME>ZDMO_RAP_GEN_ROOT_ENTITYNAME</ROLLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DOMNAME>ZDMO_RAP_GEN_ENTITYNAME</DOMNAME>
+    <HEADLEN>55</HEADLEN>
+    <SCRLEN1>10</SCRLEN1>
+    <SCRLEN2>20</SCRLEN2>
+    <SCRLEN3>40</SCRLEN3>
+    <DDTEXT>Entity Name</DDTEXT>
+    <REPTEXT>Root  Entity Name</REPTEXT>
+    <SCRTEXT_S>Root Ent.</SCRTEXT_S>
+    <SCRTEXT_M>Root Entity Name</SCRTEXT_M>
+    <SCRTEXT_L>Root Entity Name</SCRTEXT_L>
+    <DTELMASTER>E</DTELMASTER>
+    <REFKIND>D</REFKIND>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+   </DD04V>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rapg_project01.srvd.srvdsrv b/src/zdmo_rapg_project01.srvd.srvdsrv
new file mode 100644
index 0000000..4a37838
--- /dev/null
+++ b/src/zdmo_rapg_project01.srvd.srvdsrv
@@ -0,0 +1,18 @@
+@ObjectModel.leadingEntity.name: 'ZDMO_C_RAPG_ProjectTP'
+define service ZDMO_RAPG_Project01 {
+  expose ZDMO_C_RAPG_ProjectTP          as Project;
+  expose ZDMO_C_RAPG_LogTP              as Log;
+  expose ZDMO_C_RAPG_NodeTP             as Node;
+  expose ZDMO_C_RAPG_FieldTP            as Field;
+  expose ZDMO_I_RAP_GENERATOR_DSRC_TYPE as DataSourceTypes;
+  expose ZDMO_I_RAP_GENERATOR_BIND_TYPE as BindingTypes;
+  expose ZDMO_I_RAP_GENERATOR_ABAP_VERS as ABAPLanguageVersions;
+  expose ZDMO_I_RAP_GENERATOR_PACKAGE   as Packages;
+  expose ZDMO_I_RAP_GENERATOR_FIELDS    as DataSourceFields;
+  expose zdmo_I_rap_generator_bool_VH   as DraftEnabled;
+  expose ZDMO_I_RAP_GENERATOR_DATA_SRC2 as DataSources2;
+  expose ZDMO_I_RAP_GENERATOR_IMPL_TYP2 as ImplementationTypes2;
+  expose ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT as AbstractEntities;
+  expose ZDMO_I_RAP_GEN_GET_CDS_VIEWS   as CDSViews;
+  expose ZDMO_I_RAP_GEN_GET_TABLES      as Tables;
+}
\ No newline at end of file
diff --git a/src/zdmo_rapg_project01.srvd.xml b/src/zdmo_rapg_project01.srvd.xml
new file mode 100644
index 0000000..4722088
--- /dev/null
+++ b/src/zdmo_rapg_project01.srvd.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_SRVD" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <SRVD>
+    <NAME>ZDMO_RAPG_PROJECT01</NAME>
+    <TYPE>SRVD/SRV</TYPE>
+    <DESCRIPTION>Service definition for Project</DESCRIPTION>
+    <LANGUAGE>EN</LANGUAGE>
+    <MASTER_LANGUAGE>EN</MASTER_LANGUAGE>
+    <SOURCE_URI>./zdmo_rapg_project01/source/main</SOURCE_URI>
+    <SOURCE_TYPE>ABAP_SOURCE</SOURCE_TYPE>
+    <SOURCE_ORIGIN_DESCRIPTION>ABAP Development Tools</SOURCE_ORIGIN_DESCRIPTION>
+    <SRVD_SOURCE_TYPE>S</SRVD_SOURCE_TYPE>
+    <SRVD_SOURCE_TYPE_DESC>Definition</SRVD_SOURCE_TYPE_DESC>
+   </SRVD>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rapgen_bo.tabl.xml b/src/zdmo_rapgen_bo.tabl.xml
new file mode 100644
index 0000000..ec800b9
--- /dev/null
+++ b/src/zdmo_rapgen_bo.tabl.xml
@@ -0,0 +1,398 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_RAPGEN_BO</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <DDTEXT>RAP Generator Business Object Header</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>1</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_RAPGEN_BO</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <NOTNULL>X</NOTNULL>
+     <DATATYPE>CLNT</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CLNT</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>RAP_NODE_UUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BO_NAME</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_ENTITYNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ROOT_ENTITY_NAME</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_ROOT_ENTITYNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>NAMESPACE</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_NAMESPACE</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PACKAGE_NAME</FIELDNAME>
+     <ROLLNAME>SXCO_PACKAGE</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>TRANSPORT_REQUEST</FIELDNAME>
+     <ROLLNAME>SXCO_TRANSPORT</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SKIP_ACTIVATION</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PUBLISH_SERVICE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ADD_I_VIEW_BASIC</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>IMPLEMENTATION_TYPE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000060</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000030</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ABAP_LANGUAGE_VERSION</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_ABAPLANGVERSION</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PACKAGE_LANGUAGE_VERSION</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000002</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000001</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DATA_SOURCE_TYPE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000060</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000030</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BINDING_TYPE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000060</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000030</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DRAFT_ENABLED</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SUFFIX</FIELDNAME>
+     <ROLLNAME>SXCO_AR_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PREFIX</FIELDNAME>
+     <ROLLNAME>SXCO_AR_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>MULTI_INLINE_EDIT</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CUSTOMIZING_TABLE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>IS_EXTENSIBLE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>EXTENSIBILITY_ELEMENT_SUFFIX</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ADD_TO_MANAGE_BUSINESS_CONFIG</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BUSINESS_CONF_NAME</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000100</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000050</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BUSINESS_CONF_IDENTIFIER</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000040</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000020</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BUSINESS_CONF_DESCRIPTION</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000100</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000050</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CREATED_AT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CREATED_BY</FIELDNAME>
+     <ROLLNAME>SYUNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LAST_CHANGED_BY</FIELDNAME>
+     <ROLLNAME>SYUNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JSON_STRING</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>g</INTTYPE>
+     <INTLEN>000008</INTLEN>
+     <DATATYPE>STRG</DATATYPE>
+     <MASK>  STRG</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JSON_IS_VALID</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BO_IS_GENERATED</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BO_IS_DELETED</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>APPL_JOB_LOG_HANDLE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000064</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000032</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JOB_COUNT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000016</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000008</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JOB_NAME</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000064</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000032</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ADT_LINK</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000510</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000255</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HAS_SEMANTIC_KEY</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>IS_MANAGED</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DOES_NOT_USE_UNMANAGED_QUERY</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JOB_STATUS</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000002</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000001</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JOB_STATUS_TEXT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000040</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000020</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JOB_STATUS_CRITICALITY</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000001</INTLEN>
+     <DATATYPE>INT1</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  INT1</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SAP_OBJECT_TYPE</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ADD_SAP_OBJECT_TYPE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_RAPGEN_BO</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rapgen_flds.tabl.xml b/src/zdmo_rapgen_flds.tabl.xml
new file mode 100644
index 0000000..efa36d5
--- /dev/null
+++ b/src/zdmo_rapgen_flds.tabl.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_RAPGEN_FLDS</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <DDTEXT>Fields of a rap bo node</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>1</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_RAPGEN_FLDS</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <NOTNULL>X</NOTNULL>
+     <DATATYPE>CLNT</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CLNT</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_UUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>NODE_UUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>RAPBO_UUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>IS_KEY</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DBTABLE_FIELD</FIELDNAME>
+     <ROLLNAME>SXCO_AD_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CDS_VIEW_FIELD</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_CDS_VIEW_FIELD</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_RAPGEN_FLDS</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rapgen_log.tabl.xml b/src/zdmo_rapgen_log.tabl.xml
new file mode 100644
index 0000000..c064fc8
--- /dev/null
+++ b/src/zdmo_rapgen_log.tabl.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_RAPGEN_LOG</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <DDTEXT>RAP Generator Business Object Nodes</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>1</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_RAPGEN_LOG</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <NOTNULL>X</NOTNULL>
+     <DATATYPE>CLNT</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CLNT</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOG_UUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>RAPBO_UUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOG_ITEM_NUMBER</FIELDNAME>
+     <ROLLNAME>BALMNR</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DETAIL_LEVEL</FIELDNAME>
+     <ROLLNAME>BALLEVEL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SEVERITY</FIELDNAME>
+     <ROLLNAME>SYMSGTY</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>TEXT</FIELDNAME>
+     <ROLLNAME>BAPI_MSG</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>TIME_STAMP</FIELDNAME>
+     <ROLLNAME>TIMESTAMP</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_RAPGEN_LOG</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rapgen_node.tabl.xml b/src/zdmo_rapgen_node.tabl.xml
new file mode 100644
index 0000000..cfbed43
--- /dev/null
+++ b/src/zdmo_rapgen_node.tabl.xml
@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_RAPGEN_NODE</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <DDTEXT>RAP Generator Business Object Nodes</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>1</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_RAPGEN_NODE</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <NOTNULL>X</NOTNULL>
+     <DATATYPE>CLNT</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CLNT</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>NODE_UUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HEADER_UUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PARENT_UUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ROOT_UUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>NODE_NUMBER</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000001</INTLEN>
+     <DATATYPE>INT1</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  INT1</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>IS_ROOT_NODE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ENTITY_NAME</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_ENTITYNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PARENT_ENTITY_NAME</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_PARENT_ENTITYNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DATA_SOURCE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000060</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000030</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PARENT_DATA_SOURCE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000060</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000030</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>VIEW_TYPE_VALUE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000002</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000001</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_OBJECT_ID</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_ETAG_MASTER</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_TOTAL_ETAG</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_UUID</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_PARENT_UUID</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_ROOT_UUID</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_CREATED_BY</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_CREATED_AT</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_LAST_CHANGED_BY</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELD_NAME_LOC_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CDS_I_VIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CDS_I_VIEW_BASIC</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CDS_R_VIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CDS_P_VIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>MDE_VIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BEHAVIOR_IMPLEMENTATION_CLASS</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SERVICE_DEFINITION</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SERVICE_BINDING</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CONTROL_STRUCTURE</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>QUERY_IMPLEMENTATION_CLASS</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DRAFT_TABLE_NAME</FIELDNAME>
+     <ROLLNAME>SXCO_DBT_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>EXTENSION_INCLUDE</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>EXTENSION_INCLUDE_VIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DRAFT_QUERY_VIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HIERARCHY_DISTANCE_FROM_ROOT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000004</INTLEN>
+     <DATATYPE>INT4</DATATYPE>
+     <LENG>000010</LENG>
+     <MASK>  INT4</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HIERARCHY_DESCENDANT_COUNT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000004</INTLEN>
+     <DATATYPE>INT4</DATATYPE>
+     <LENG>000010</LENG>
+     <MASK>  INT4</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HIERARCHY_DRILL_STATE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>g</INTTYPE>
+     <INTLEN>000008</INTLEN>
+     <DATATYPE>SSTR</DATATYPE>
+     <LENG>000020</LENG>
+     <MASK>  SSTR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HIERARCHY_PREORDER_RANK</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000004</INTLEN>
+     <DATATYPE>INT4</DATATYPE>
+     <LENG>000010</LENG>
+     <MASK>  INT4</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>EXTENSIBILITY_ELEMENT_SUFFIX</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SAP_OBJECT_NODE_TYPE</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SAP_OBJECT_TYPE</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_RAPGEN_NODE</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rapgfiel00d.tabl.xml b/src/zdmo_rapgfiel00d.tabl.xml
new file mode 100644
index 0000000..e07039f
--- /dev/null
+++ b/src/zdmo_rapgfiel00d.tabl.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_RAPGFIEL00D</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <LANGDEP>X</LANGDEP>
+    <DDTEXT> Draft table for entity ZDMO_R_RAPG_FieldTP</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>4</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_RAPGFIEL00D</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>MANDT</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDUUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>NODEUUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>RAPBOUUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ISKEY</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DBTABLEFIELD</FIELDNAME>
+     <ROLLNAME>SXCO_AD_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CDSVIEWFIELD</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_CDS_VIEW_FIELD</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCALLASTCHANGEDAT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>.INCLUDE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <PRECFIELD>SYCH_BDL_DRAFT_ADMIN_INC</PRECFIELD>
+     <MASK>      S</MASK>
+     <DDTEXT>Standard Include for Draft Administration (BDL Syntax Check)</DDTEXT>
+     <COMPTYPE>S</COMPTYPE>
+     <GROUPNAME>%ADMIN</GROUPNAME>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_RAPGFIEL00D</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rapglog00d.tabl.xml b/src/zdmo_rapglog00d.tabl.xml
new file mode 100644
index 0000000..600a6bf
--- /dev/null
+++ b/src/zdmo_rapglog00d.tabl.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_RAPGLOG00D</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <LANGDEP>X</LANGDEP>
+    <DDTEXT>Draft table for entity ZDMO_R_RAPG_LOGTP</DDTEXT>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>4</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_RAPGLOG00D</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>4</TABKAT>
+    <TABART>APPL1</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>MANDT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>MANDT</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOGUUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>RAPBOUUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOGITEMNUMBER</FIELDNAME>
+     <ROLLNAME>BALMNR</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DETAILLEVEL</FIELDNAME>
+     <ROLLNAME>BALLEVEL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SEVERITY</FIELDNAME>
+     <ROLLNAME>SYMSGTY</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CRITICALITY</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000001</INTLEN>
+     <DATATYPE>INT1</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  INT1</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>TEXT</FIELDNAME>
+     <ROLLNAME>BAPI_MSG</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>TIMESTAMP</FIELDNAME>
+     <ROLLNAME>TIMESTAMP</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCALLASTCHANGEDAT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>.INCLUDE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <PRECFIELD>SYCH_BDL_DRAFT_ADMIN_INC</PRECFIELD>
+     <MASK>      S</MASK>
+     <DDTEXT>Standard Include for Draft Administration (BDL Syntax Check)</DDTEXT>
+     <COMPTYPE>S</COMPTYPE>
+     <GROUPNAME>%ADMIN</GROUPNAME>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_RAPGLOG00D</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rapgnode00d.tabl.xml b/src/zdmo_rapgnode00d.tabl.xml
new file mode 100644
index 0000000..323fad0
--- /dev/null
+++ b/src/zdmo_rapgnode00d.tabl.xml
@@ -0,0 +1,377 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_RAPGNODE00D</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <LANGDEP>X</LANGDEP>
+    <DDTEXT>Draft table for entity ZDMO_R_RAPG_NODETP</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>4</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_RAPGNODE00D</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>4</TABKAT>
+    <TABART>APPL1</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>MANDT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>MANDT</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>NODEUUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>RAPBOUUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PARENTUUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ROOTUUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>NODENUMBER</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000001</INTLEN>
+     <DATATYPE>INT1</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  INT1</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ISROOTNODE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ENTITYNAME</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_ENTITYNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PARENTENTITYNAME</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_PARENT_ENTITYNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DATASOURCE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000060</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000030</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PARENTDATASOURCE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000060</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000030</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>VIEWTYPEVALUE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000002</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000001</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMEOBJECTID</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMEETAGMASTER</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMETOTALETAG</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMEUUID</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMEPARENTUUID</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMEROOTUUID</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMECREATEDBY</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMECREATEDAT</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMELASTCHANGEDBY</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMELASTCHANGEDAT</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>FIELDNAMELOCLASTCHANGEDAT</FIELDNAME>
+     <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CDSIVIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CDSIVIEWBASIC</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CDSRVIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CDSPVIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>MDEVIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BEHAVIORIMPLEMENTATIONCLASS</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SERVICEDEFINITION</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SERVICEBINDING</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CONTROLSTRUCTURE</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>QUERYIMPLEMENTATIONCLASS</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DRAFTTABLENAME</FIELDNAME>
+     <ROLLNAME>SXCO_DBT_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>EXTENSIONINCLUDE</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>EXTENSIONINCLUDEVIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DRAFTQUERYVIEW</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HIERARCHYDISTANCEFROMROOT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000004</INTLEN>
+     <DATATYPE>INT4</DATATYPE>
+     <LENG>000010</LENG>
+     <MASK>  INT4</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HIERARCHYDESCENDANTCOUNT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000004</INTLEN>
+     <DATATYPE>INT4</DATATYPE>
+     <LENG>000010</LENG>
+     <MASK>  INT4</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HIERARCHYDRILLSTATE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>g</INTTYPE>
+     <INTLEN>000008</INTLEN>
+     <DATATYPE>SSTR</DATATYPE>
+     <LENG>000020</LENG>
+     <MASK>  SSTR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HIERARCHYPREORDERRANK</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000004</INTLEN>
+     <DATATYPE>INT4</DATATYPE>
+     <LENG>000010</LENG>
+     <MASK>  INT4</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCALLASTCHANGEDAT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>EXTENSIBILITYELEMENTSUFFIX</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SAPOBJECTNODETYPE</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SAPOBJECTTYPE</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ISCHILDNODE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ISTABLE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ISCDSVIEW</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ISABSTRACTENTITY</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>.INCLUDE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <PRECFIELD>SYCH_BDL_DRAFT_ADMIN_INC</PRECFIELD>
+     <MASK>      S</MASK>
+     <DDTEXT>Standard Include for Draft Administration (BDL Syntax Check)</DDTEXT>
+     <COMPTYPE>S</COMPTYPE>
+     <GROUPNAME>%ADMIN</GROUPNAME>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_RAPGNODE00D</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_rapgproj00d.tabl.xml b/src/zdmo_rapgproj00d.tabl.xml
new file mode 100644
index 0000000..4e3eb5d
--- /dev/null
+++ b/src/zdmo_rapgproj00d.tabl.xml
@@ -0,0 +1,405 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_RAPGPROJ00D</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <LANGDEP>X</LANGDEP>
+    <DDTEXT>Draft table for entity ZDMO_R_RAPG_PROJECTTP</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>4</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_RAPGPROJ00D</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>4</TABKAT>
+    <TABART>APPL1</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>MANDT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>MANDT</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>RAPBOUUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BONAME</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_ENTITYNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ROOTENTITYNAME</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_ROOT_ENTITYNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>NAMESPACE</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_NAMESPACE</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PACKAGENAME</FIELDNAME>
+     <ROLLNAME>SXCO_PACKAGE</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>TRANSPORTREQUEST</FIELDNAME>
+     <ROLLNAME>SXCO_TRANSPORT</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SKIPACTIVATION</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ADDIVIEWBASIC</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PUBLISHSERVICE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>IMPLEMENTATIONTYPE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000060</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000030</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ABAPLANGUAGEVERSION</FIELDNAME>
+     <ROLLNAME>ZDMO_RAP_GEN_ABAPLANGVERSION</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PACKAGELANGUAGEVERSION</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000002</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000001</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DATASOURCETYPE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000060</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000030</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BINDINGTYPE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000060</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000030</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DRAFTENABLED</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SUFFIX</FIELDNAME>
+     <ROLLNAME>SXCO_AR_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PREFIX</FIELDNAME>
+     <ROLLNAME>SXCO_AR_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>MULTIINLINEEDIT</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CUSTOMIZINGTABLE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ADDTOMANAGEBUSINESSCONFIG</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BUSINESSCONFNAME</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000100</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000050</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BUSINESSCONFIDENTIFIER</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000040</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000020</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BUSINESSCONFDESCRIPTION</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000100</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000050</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CREATEDAT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CREATEDBY</FIELDNAME>
+     <ROLLNAME>SYUNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LASTCHANGEDBY</FIELDNAME>
+     <ROLLNAME>SYUNAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LASTCHANGEDAT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCALLASTCHANGEDAT</FIELDNAME>
+     <ROLLNAME>TIMESTAMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JSONSTRING</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>g</INTTYPE>
+     <INTLEN>000008</INTLEN>
+     <DATATYPE>STRG</DATATYPE>
+     <MASK>  STRG</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JSONISVALID</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BOISGENERATED</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>BOISDELETED</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>APPLJOBLOGHANDLE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000064</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000032</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JOBCOUNT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000016</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000008</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JOBNAME</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000064</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000032</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ADTLINK</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000510</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000255</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ISMANAGED</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ISEXTENSIBLE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>EXTENSIBILITYELEMENTSUFFIX</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DOESNOTUSEUNMANAGEDQUERY</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HASSEMATICKEY</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JOBSTATUS</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000002</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000001</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JOBSTATUSCRITICALITY</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>X</INTTYPE>
+     <INTLEN>000001</INTLEN>
+     <DATATYPE>INT1</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  INT1</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>JOBSTATUSTEXT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000040</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000020</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SAPOBJECTTYPE</FIELDNAME>
+     <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ADDSAPOBJECTTYPE</FIELDNAME>
+     <ROLLNAME>ABAP_BOOLEAN</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <VALEXI>X</VALEXI>
+     <SHLPORIGIN>F</SHLPORIGIN>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>.INCLUDE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <PRECFIELD>SYCH_BDL_DRAFT_ADMIN_INC</PRECFIELD>
+     <MASK>      S</MASK>
+     <DDTEXT>Standard Include for Draft Administration (BDL Syntax Check)</DDTEXT>
+     <COMPTYPE>S</COMPTYPE>
+     <GROUPNAME>%ADMIN</GROUPNAME>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_RAPGPROJ00D</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_test.tabl.xml b/src/zdmo_test.tabl.xml
new file mode 100644
index 0000000..fc05a53
--- /dev/null
+++ b/src/zdmo_test.tabl.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_TEST</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <DDTEXT>test</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>1</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_TEST</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <NOTNULL>X</NOTNULL>
+     <DATATYPE>CLNT</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CLNT</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>TEST</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000050</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000025</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_TEST</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_test_abstract_childentity.ddls.asddls b/src/zdmo_test_abstract_childentity.ddls.asddls
new file mode 100644
index 0000000..c211fff
--- /dev/null
+++ b/src/zdmo_test_abstract_childentity.ddls.asddls
@@ -0,0 +1,44 @@
+@EndUserText.label: 'Test entity - abstract - child'
+@OData.entitySet.name: 'SalesOrderLineItemSet'
+@OData.entityType.name: 'SalesOrderLineItem'
+define abstract entity ZDMO_TEST_ABSTRACT_CHILDENTITY
+{
+  key SalesOrderID    : abap.char( 10 );
+  key ItemPosition    : abap.char( 10 );
+      ProductID       : abap.char( 10 );
+      @OData.property.valueControl: 'Note_vc'
+      Note            : abap.char( 255 );
+      Note_vc         : rap_cp_odata_value_control;
+      @OData.property.valueControl: 'NoteLanguage_vc'
+      NoteLanguage    : abap.char( 2 );
+      NoteLanguage_vc : rap_cp_odata_value_control;
+      @OData.property.valueControl: 'CurrencyCode_vc'
+      @Semantics.currencyCode: true
+      CurrencyCode    : abap.cuky( 5 );
+      CurrencyCode_vc : rap_cp_odata_value_control;
+      @OData.property.valueControl: 'GrossAmount_vc'
+      @Semantics.amount.currencyCode: 'CurrencyCode'
+      GrossAmount     : abap.curr( 16, 2 );
+      GrossAmount_vc  : rap_cp_odata_value_control;
+      @OData.property.valueControl: 'NetAmount_vc'
+      @Semantics.amount.currencyCode: 'CurrencyCode'
+      NetAmount       : abap.curr( 16, 2 );
+      NetAmount_vc    : rap_cp_odata_value_control;
+      @OData.property.valueControl: 'TaxAmount_vc'
+      @Semantics.amount.currencyCode: 'CurrencyCode'
+      TaxAmount       : abap.curr( 16, 2 );
+      TaxAmount_vc    : rap_cp_odata_value_control;
+      DeliveryDate    : rap_cp_odata_v2_edm_datetime;
+      @Semantics.quantity.unitOfMeasure: 'QuantityUnit'
+      Quantity        : abap.dec( 13, 2 );
+      @OData.property.valueControl: 'QuantityUnit_vc'
+      @Semantics.unitOfMeasure: true
+      QuantityUnit    : abap.unit( 3 );
+      QuantityUnit_vc : rap_cp_odata_value_control;
+
+      @OData.property.name: 'ToHeader'
+      //A dummy on-condition is required for associations in abstract entities
+      //On-condition is not relevant for runtime
+      _ToHeader       : association [1] to ZDMO_TEST_ABSTRACT_ROOT_ENTITY on 1 = 1;
+
+}
diff --git a/src/zdmo_test_abstract_childentity.ddls.baseinfo b/src/zdmo_test_abstract_childentity.ddls.baseinfo
new file mode 100644
index 0000000..9b23289
--- /dev/null
+++ b/src/zdmo_test_abstract_childentity.ddls.baseinfo
@@ -0,0 +1,19 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[
+"ZDMO_TEST_ABSTRACT_ROOT_ENTITY"
+],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_test_abstract_childentity.ddls.xml b/src/zdmo_test_abstract_childentity.ddls.xml
new file mode 100644
index 0000000..cd7ba49
--- /dev/null
+++ b/src/zdmo_test_abstract_childentity.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_TEST_ABSTRACT_CHILDENTITY</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Test entity - abstract - child</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_test_abstract_grandchilde.ddls.asddls b/src/zdmo_test_abstract_grandchilde.ddls.asddls
new file mode 100644
index 0000000..e6913a3
--- /dev/null
+++ b/src/zdmo_test_abstract_grandchilde.ddls.asddls
@@ -0,0 +1,22 @@
+@EndUserText.label: 'Test entity - abstract - child'
+@OData.entitySet.name: 'ScheduleLineItemSet'
+@OData.entityType.name: 'ScheduleLineItem'
+define abstract entity ZDMO_TEST_ABSTRACT_GRANDCHILDE
+{
+  key SalesOrderID    : abap.char( 10 );
+  key ItemPosition    : abap.char( 10 );
+  key ScheduleLine    : abap.numc( 4 );
+
+      DeliveryDate    : rap_cp_odata_v2_edm_datetime;
+      @Semantics.quantity.unitOfMeasure: 'QuantityUnit'
+      Quantity        : abap.dec( 13, 2 );
+      @Semantics.unitOfMeasure: true
+      QuantityUnit    : abap.unit( 3 );
+ 
+
+      @OData.property.name: 'ToHeader'
+      //A dummy on-condition is required for associations in abstract entities
+      //On-condition is not relevant for runtime
+      _ToItem       : association [1] to ZDMO_TEST_ABSTRACT_CHILDENTITY on 1 = 1;
+
+}
diff --git a/src/zdmo_test_abstract_grandchilde.ddls.baseinfo b/src/zdmo_test_abstract_grandchilde.ddls.baseinfo
new file mode 100644
index 0000000..a4c5e5e
--- /dev/null
+++ b/src/zdmo_test_abstract_grandchilde.ddls.baseinfo
@@ -0,0 +1,19 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[
+"ZDMO_TEST_ABSTRACT_CHILDENTITY"
+],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_test_abstract_grandchilde.ddls.xml b/src/zdmo_test_abstract_grandchilde.ddls.xml
new file mode 100644
index 0000000..30c4989
--- /dev/null
+++ b/src/zdmo_test_abstract_grandchilde.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_TEST_ABSTRACT_GRANDCHILDE</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Test entity - abstract - root</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_test_abstract_root_entity.ddls.asddls b/src/zdmo_test_abstract_root_entity.ddls.asddls
new file mode 100644
index 0000000..f19faa2
--- /dev/null
+++ b/src/zdmo_test_abstract_root_entity.ddls.asddls
@@ -0,0 +1,63 @@
+@EndUserText.label: 'Test entity - abstract - root'
+ @OData.entitySet.name: 'SalesOrderSet' 
+ @OData.entityType.name: 'SalesOrder'
+define abstract entity ZDMO_TEST_ABSTRACT_ROOT_ENTITY 
+{
+ key SalesOrderID : abap.char( 10 ) ; 
+ @OData.property.valueControl: 'Note_vc' 
+ Note : abap.char( 255 ) ; 
+ Note_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'NoteLanguage_vc' 
+ NoteLanguage : abap.char( 2 ) ; 
+ NoteLanguage_vc : rap_cp_odata_value_control ; 
+ CustomerID : abap.char( 10 ) ; 
+ @OData.property.valueControl: 'CustomerName_vc' 
+ CustomerName : abap.char( 80 ) ; 
+ CustomerName_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'CurrencyCode_vc' 
+ @Semantics.currencyCode: true 
+ CurrencyCode : abap.cuky( 5 ) ; 
+ CurrencyCode_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'GrossAmount_vc' 
+ @Semantics.amount.currencyCode: 'CurrencyCode' 
+ GrossAmount : abap.curr( 16, 2 ) ; 
+ GrossAmount_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'NetAmount_vc' 
+ @Semantics.amount.currencyCode: 'CurrencyCode' 
+ NetAmount : abap.curr( 16, 2 ) ; 
+ NetAmount_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'TaxAmount_vc' 
+ @Semantics.amount.currencyCode: 'CurrencyCode' 
+ TaxAmount : abap.curr( 16, 2 ) ; 
+ TaxAmount_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'LifecycleStatus_vc' 
+ LifecycleStatus : abap.char( 1 ) ; 
+ LifecycleStatus_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'LifecycleStatusDescription_vc' 
+ LifecycleStatusDescription : abap.char( 60 ) ; 
+ LifecycleStatusDescription_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'BillingStatus_vc' 
+ BillingStatus : abap.char( 1 ) ; 
+ BillingStatus_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'BillingStatusDescription_vc' 
+ BillingStatusDescription : abap.char( 60 ) ; 
+ BillingStatusDescription_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'DeliveryStatus_vc' 
+ DeliveryStatus : abap.char( 1 ) ; 
+ DeliveryStatus_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'DeliveryStatusDescription_vc' 
+ DeliveryStatusDescription : abap.char( 60 ) ; 
+ DeliveryStatusDescription_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'CreatedAt_vc' 
+ CreatedAt : rap_cp_odata_v2_edm_datetime ; 
+ CreatedAt_vc : rap_cp_odata_value_control ; 
+ @OData.property.valueControl: 'ChangedAt_vc' 
+ ChangedAt : rap_cp_odata_v2_edm_datetime ; 
+ ChangedAt_vc : rap_cp_odata_value_control ; 
+ 
+ @OData.property.name: 'ToLineItems' 
+//A dummy on-condition is required for associations in abstract entities 
+//On-condition is not relevant for runtime 
+ _ToLineItems : association [0..*] to ZDMO_TEST_ABSTRACT_CHILDENTITY on 1 = 1; 
+    
+}
diff --git a/src/zdmo_test_abstract_root_entity.ddls.baseinfo b/src/zdmo_test_abstract_root_entity.ddls.baseinfo
new file mode 100644
index 0000000..a4c5e5e
--- /dev/null
+++ b/src/zdmo_test_abstract_root_entity.ddls.baseinfo
@@ -0,0 +1,19 @@
+{
+"BASEINFO":
+{
+"FROM":
+[],
+"ASSOCIATED":
+[
+"ZDMO_TEST_ABSTRACT_CHILDENTITY"
+],
+"BASE":
+[],
+"ANNO_REF":
+[],
+"SCALAR_FUNCTION":
+[],
+"VERSION":0,
+"ANNOREF_EVALUATION_ERROR":""
+}
+}
\ No newline at end of file
diff --git a/src/zdmo_test_abstract_root_entity.ddls.xml b/src/zdmo_test_abstract_root_entity.ddls.xml
new file mode 100644
index 0000000..d4b3800
--- /dev/null
+++ b/src/zdmo_test_abstract_root_entity.ddls.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DDLS>
+    <DDLNAME>ZDMO_TEST_ABSTRACT_ROOT_ENTITY</DDLNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <DDTEXT>Test entity - abstract - root</DDTEXT>
+    <SOURCE_TYPE>A</SOURCE_TYPE>
+   </DDLS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_ui_rapg_project_o2.srvb.xml b/src/zdmo_ui_rapg_project_o2.srvb.xml
new file mode 100644
index 0000000..343e998
--- /dev/null
+++ b/src/zdmo_ui_rapg_project_o2.srvb.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_SRVB" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <SRVB>
+    <METADATA>
+     <NAME>ZDMO_UI_RAPG_PROJECT_O2</NAME>
+     <TYPE>SRVB/SVB</TYPE>
+     <DESCRIPTION>Service binding for RAP Generator</DESCRIPTION>
+     <LANGUAGE>EN</LANGUAGE>
+     <LINKS>
+      <item>
+       <HREF>versions</HREF>
+       <REL>http://www.sap.com/adt/relations/versions</REL>
+       <TITLE>Historic versions</TITLE>
+      </item>
+      <item>
+       <HREF>/sap/bc/adt/businessservices/odatav2/ZDMO_UI_RAPG_PROJECT_O2</HREF>
+       <REL>http://www.sap.com/categories/odatav2</REL>
+       <TYPE>application/vnd.sap.adt.businessservices.odatav2.v2+xml</TYPE>
+       <TITLE>ODATAV2</TITLE>
+      </item>
+      <item>
+       <HREF>/sap/bc/adt/businessservices/testclass</HREF>
+       <REL>http://www.sap.com/categories/testclass</REL>
+       <TYPE>application/vnd.sap.adt.businessservices.testclass.v1+xml</TYPE>
+       <TITLE>TESTCLASS</TITLE>
+      </item>
+      <item>
+       <HREF>/sap/bc/adt/businessservices/testclass</HREF>
+       <REL>http://www.sap.com/categories/testclass</REL>
+       <TYPE>application/vnd.sap.adt.businessservices.testclassv4.v1+xml</TYPE>
+       <TITLE>TESTCLASSV4</TITLE>
+      </item>
+      <item>
+       <HREF>/sap/bc/adt/businessservices/semanticversion</HREF>
+       <REL>http://www.sap.com/categories/semanticversion</REL>
+       <TYPE>application/vnd.sap.adt.businessservices.semanticversion.v1+xml</TYPE>
+       <TITLE>SemanticVersion</TITLE>
+      </item>
+      <item>
+       <HREF>./zdmo_ui_rapg_project_o2</HREF>
+       <REL>http://www.sap.com/adt/relations/source</REL>
+       <TYPE>text/html</TYPE>
+       <TITLE>Landing Page (HTML)</TITLE>
+      </item>
+     </LINKS>
+     <MASTER_LANGUAGE>EN</MASTER_LANGUAGE>
+     <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION>
+    </METADATA>
+    <CONTENT>
+     <BIND_TYPE_IMPL>
+      <NAME>ZDMO_UI_RAPG_PROJECT_O2</NAME>
+     </BIND_TYPE_IMPL>
+     <BIND_TYPE>ODATA</BIND_TYPE>
+     <BIND_TYPE_VERSION>V2</BIND_TYPE_VERSION>
+     <SERVICES>
+      <item>
+       <SERVICE_NAME>ZDMO_UI_RAPG_PROJECT_O2</SERVICE_NAME>
+       <SERVICE_CONTENT>
+        <item>
+         <SERVICE_VERSION>0001</SERVICE_VERSION>
+         <RELEASE_STATE>NOT_RELEASED</RELEASE_STATE>
+         <SRVD_REF>
+          <URI>/sap/bc/adt/ddic/srvd/sources/zdmo_rapg_project01</URI>
+          <TYPE>SRVD/SRV</TYPE>
+          <NAME>ZDMO_RAPG_PROJECT01</NAME>
+         </SRVD_REF>
+         <BIND_TYPE_DATA>
+          <CONTENT>
+           <ENCODING>base64</ENCODING>
+          </CONTENT>
+         </BIND_TYPE_DATA>
+        </item>
+       </SERVICE_CONTENT>
+      </item>
+     </SERVICES>
+    </CONTENT>
+    <CONTRACT>C1</CONTRACT>
+    <RELEASE_SUPPORTED>true</RELEASE_SUPPORTED>
+    <PUBLISHED>true</PUBLISHED>
+    <BINDING_CREATED>true</BINDING_CREATED>
+   </SRVB>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_ui_rapg_project_o4.srvb.xml b/src/zdmo_ui_rapg_project_o4.srvb.xml
new file mode 100644
index 0000000..0a91dfb
--- /dev/null
+++ b/src/zdmo_ui_rapg_project_o4.srvb.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_SRVB" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <SRVB>
+    <METADATA>
+     <NAME>ZDMO_UI_RAPG_PROJECT_O4</NAME>
+     <TYPE>SRVB/SVB</TYPE>
+     <DESCRIPTION>RAP Generator</DESCRIPTION>
+     <LANGUAGE>EN</LANGUAGE>
+     <MASTER_LANGUAGE>EN</MASTER_LANGUAGE>
+     <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION>
+    </METADATA>
+    <CONTENT>
+     <BIND_TYPE_IMPL>
+      <NAME>ZDMO_UI_RAPG_PROJECT_O4</NAME>
+     </BIND_TYPE_IMPL>
+     <BIND_TYPE>ODATA</BIND_TYPE>
+     <BIND_TYPE_VERSION>V4</BIND_TYPE_VERSION>
+     <SERVICES>
+      <item>
+       <SERVICE_NAME>ZDMO_RAPG_PROJECT01</SERVICE_NAME>
+       <SERVICE_CONTENT>
+        <item>
+         <SERVICE_VERSION>0001</SERVICE_VERSION>
+         <RELEASE_STATE>NOT_RELEASED</RELEASE_STATE>
+         <SRVD_REF>
+          <URI>/sap/bc/adt/ddic/srvd/sources/zdmo_rapg_project01</URI>
+          <TYPE>SRVD/SRV</TYPE>
+          <NAME>ZDMO_RAPG_PROJECT01</NAME>
+         </SRVD_REF>
+         <BIND_TYPE_DATA>
+          <CONTENT>
+           <ENCODING>base64</ENCODING>
+          </CONTENT>
+         </BIND_TYPE_DATA>
+        </item>
+       </SERVICE_CONTENT>
+      </item>
+     </SERVICES>
+    </CONTENT>
+    <CONTRACT>C1</CONTRACT>
+    <RELEASE_SUPPORTED>true</RELEASE_SUPPORTED>
+    <PUBLISHED>true</PUBLISHED>
+    <BINDING_CREATED>true</BINDING_CREATED>
+    <ALLOWED_ACTION>UNPUBLISH</ALLOWED_ACTION>
+   </SRVB>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_ui_rapg_project_o4_0001_g4ba.sco2.xml b/src/zdmo_ui_rapg_project_o4_0001_g4ba.sco2.xml
new file mode 100644
index 0000000..f80e6e8
--- /dev/null
+++ b/src/zdmo_ui_rapg_project_o4_0001_g4ba.sco2.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_SCO2" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <SCO2>
+    <IBS_ID>ZDMO_UI_RAPG_PROJECT_O4_0001_G4BA</IBS_ID>
+    <IBS_TYPE>G4BA</IBS_TYPE>
+    <ODATA_V4_GROUP_ID>ZDMO_UI_RAPG_PROJECT_O4</ODATA_V4_GROUP_ID>
+    <REL_FOR_CUST_CSCN>X</REL_FOR_CUST_CSCN>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+    <NAME>ZDMO_UI_RAPG_PROJECT_O4_0001_G4BA</NAME>
+    <DESCRIPTION>ZDMO_UI_RAPG_PROJECT_O4</DESCRIPTION>
+    <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION>
+   </SCO2>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_ui_rapg_project_o4_0_00001_ibs.sia6.xml b/src/zdmo_ui_rapg_project_o4_0_00001_ibs.sia6.xml
new file mode 100644
index 0000000..fda34f5
--- /dev/null
+++ b/src/zdmo_ui_rapg_project_o4_0_00001_ibs.sia6.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_SIA6" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <SIA6>
+    <MAIN_OBJECT>
+     <NAME>ZDMO_UI_RAPG_PROJECT_O4_0_00001_IBS</NAME>
+     <TYPE>SIA6</TYPE>
+     <DESCRIPTION>ZDMO_UI_RAPG_PROJECT_O4</DESCRIPTION>
+     <RESPONSIBLE>CB9980000000</RESPONSIBLE>
+     <MASTER_LANGUAGE>EN</MASTER_LANGUAGE>
+     <MASTER_SYSTEM>PMD</MASTER_SYSTEM>
+     <PACKAGE_REF>
+      <PACKAGE_NAME>ZDMO_RAP_GENERATOR</PACKAGE_NAME>
+     </PACKAGE_REF>
+     <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION>
+    </MAIN_OBJECT>
+    <APP_ID>ZDMO_UI_RAPG_PROJECT_O4_0_00001_IBS</APP_ID>
+    <APP_TYPE>IBS</APP_TYPE>
+    <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION>
+    <SECONDARY_ID>ZDMO_UI_RAPG_PROJECT_O4_0001_G4BA</SECONDARY_ID>
+    <PUBLISH_STATUS>p</PUBLISH_STATUS>
+   </SIA6>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_uuid_header.tabl.xml b/src/zdmo_uuid_header.tabl.xml
new file mode 100644
index 0000000..96ce497
--- /dev/null
+++ b/src/zdmo_uuid_header.tabl.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_UUID_HEADER</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <DDTEXT>Demo for tables with UUID based keys - Header</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>1</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_UUID_HEADER</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <NOTNULL>X</NOTNULL>
+     <DATATYPE>CLNT</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CLNT</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>HEADER_UUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SALESORDER_ID</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000020</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000010</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CUSTOMER</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000020</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000010</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>TOTAL_AMOUNT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>P</INTTYPE>
+     <INTLEN>000008</INTLEN>
+     <REFTABLE>ZDMO_UUID_HEADER</REFTABLE>
+     <REFFIELD>CURRENCY_CODE</REFFIELD>
+     <DATATYPE>CURR</DATATYPE>
+     <LENG>000015</LENG>
+     <DECIMALS>000002</DECIMALS>
+     <MASK>  CURR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CURRENCY_CODE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000010</INTLEN>
+     <DATATYPE>CUKY</DATATYPE>
+     <LENG>000005</LENG>
+     <MASK>  CUKY</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DESCRIPTION</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000510</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000255</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>OVERALL_STATUS</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000002</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000001</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CREATED_AT</FIELDNAME>
+     <ROLLNAME>ABP_CREATION_TSTMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CREATED_BY</FIELDNAME>
+     <ROLLNAME>ABP_CREATION_USER</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LAST_CHANGED_BY</FIELDNAME>
+     <ROLLNAME>ABP_LASTCHANGE_USER</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>ABP_LASTCHANGE_TSTMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>ABP_LOCINST_LASTCHANGE_TSTMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_UUID_HEADER</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_uuid_item.tabl.xml b/src/zdmo_uuid_item.tabl.xml
new file mode 100644
index 0000000..f74b749
--- /dev/null
+++ b/src/zdmo_uuid_item.tabl.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_UUID_ITEM</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <DDTEXT>Demo for tables with UUID based keys - Header</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>4</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_UUID_ITEM</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <NOTNULL>X</NOTNULL>
+     <DATATYPE>CLNT</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CLNT</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ITEM_UUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PARENT_UUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ITEM_ID</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000012</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000006</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>QUANTITY</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>P</INTTYPE>
+     <INTLEN>000007</INTLEN>
+     <REFTABLE>ZDMO_UUID_ITEM</REFTABLE>
+     <REFFIELD>QUANTITY_UNIT</REFFIELD>
+     <DATATYPE>QUAN</DATATYPE>
+     <LENG>000013</LENG>
+     <DECIMALS>000003</DECIMALS>
+     <MASK>  QUAN</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>QUANTITY_UNIT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <DATATYPE>UNIT</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  UNIT</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>AMOUNT</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>P</INTTYPE>
+     <INTLEN>000008</INTLEN>
+     <REFTABLE>ZDMO_UUID_ITEM</REFTABLE>
+     <REFFIELD>CURRENCY_CODE</REFFIELD>
+     <DATATYPE>CURR</DATATYPE>
+     <LENG>000015</LENG>
+     <DECIMALS>000002</DECIMALS>
+     <MASK>  CURR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>CURRENCY_CODE</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000010</INTLEN>
+     <DATATYPE>CUKY</DATATYPE>
+     <LENG>000005</LENG>
+     <MASK>  CUKY</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DESCRIPTION</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000510</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000255</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>OVERALL_STATUS</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000002</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000001</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>ABP_LOCINST_LASTCHANGE_TSTMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_UUID_ITEM</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>
diff --git a/src/zdmo_uuid_s_item.tabl.xml b/src/zdmo_uuid_s_item.tabl.xml
new file mode 100644
index 0000000..ac3ee38
--- /dev/null
+++ b/src/zdmo_uuid_s_item.tabl.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
+  <asx:values>
+   <DD02V>
+    <TABNAME>ZDMO_UUID_S_ITEM</TABNAME>
+    <DDLANGUAGE>E</DDLANGUAGE>
+    <TABCLASS>TRANSP</TABCLASS>
+    <CLIDEP>X</CLIDEP>
+    <DDTEXT>Demo for tables with UUID based keys - Header</DDTEXT>
+    <MASTERLANG>E</MASTERLANG>
+    <CONTFLAG>A</CONTFLAG>
+    <EXCLASS>4</EXCLASS>
+   </DD02V>
+   <DD09L>
+    <TABNAME>ZDMO_UUID_S_ITEM</TABNAME>
+    <AS4LOCAL>A</AS4LOCAL>
+    <TABKAT>0</TABKAT>
+    <TABART>APPL0</TABART>
+    <BUFALLOW>N</BUFALLOW>
+   </DD09L>
+   <DD03P_TABLE>
+    <DD03P>
+     <FIELDNAME>CLIENT</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000006</INTLEN>
+     <NOTNULL>X</NOTNULL>
+     <DATATYPE>CLNT</DATATYPE>
+     <LENG>000003</LENG>
+     <MASK>  CLNT</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SCHED_LINE_UUID</FIELDNAME>
+     <KEYFLAG>X</KEYFLAG>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <NOTNULL>X</NOTNULL>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>PARENT_UUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>ROOT_UUID</FIELDNAME>
+     <ROLLNAME>SYSUUID_X16</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>SCHEDULE_LINE_ID</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000012</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000006</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>DESCRIPTION</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000510</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000255</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>OVERALL_STATUS</FIELDNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <INTTYPE>C</INTTYPE>
+     <INTLEN>000002</INTLEN>
+     <DATATYPE>CHAR</DATATYPE>
+     <LENG>000001</LENG>
+     <MASK>  CHAR</MASK>
+    </DD03P>
+    <DD03P>
+     <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME>
+     <ROLLNAME>ABP_LOCINST_LASTCHANGE_TSTMPL</ROLLNAME>
+     <ADMINFIELD>0</ADMINFIELD>
+     <COMPTYPE>E</COMPTYPE>
+    </DD03P>
+   </DD03P_TABLE>
+   <TABL_EXTRAS>
+    <TDDAT>
+     <TABNAME>ZDMO_UUID_S_ITEM</TABNAME>
+     <CCLASS>CUS_DEV_SUP_DA</CCLASS>
+    </TDDAT>
+   </TABL_EXTRAS>
+  </asx:values>
+ </asx:abap>
+</abapGit>