diff --git a/src/zabapgit_object_cus0.prog.abap b/src/zabapgit_object_cus0.prog.abap
new file mode 100644
index 000000000..1d2db6065
--- /dev/null
+++ b/src/zabapgit_object_cus0.prog.abap
@@ -0,0 +1,153 @@
+*&---------------------------------------------------------------------*
+*& Include zabapgit_object_cus0
+*&---------------------------------------------------------------------*
+
+*----------------------------------------------------------------------*
+* CLASS lcl_object_cus0 DEFINITION
+*----------------------------------------------------------------------*
+CLASS lcl_object_cus0 DEFINITION INHERITING FROM lcl_objects_super FINAL.
+
+ PUBLIC SECTION.
+ INTERFACES lif_object.
+ ALIASES mo_files FOR lif_object~mo_files.
+
+ METHODS constructor
+ IMPORTING
+ is_item TYPE zif_abapgit_definitions=>ty_item
+ iv_language TYPE spras.
+
+ PRIVATE SECTION.
+ TYPES: tty_img_activity_texts TYPE STANDARD TABLE OF cus_imgact
+ WITH NON-UNIQUE DEFAULT KEY,
+ BEGIN OF ty_img_activity,
+ header TYPE cus_imgach,
+ texts TYPE tty_img_activity_texts,
+ END OF ty_img_activity.
+ DATA: mv_img_activity TYPE cus_img_ac.
+
+ENDCLASS. "lcl_object_cus0 DEFINITION
+
+*----------------------------------------------------------------------*
+* CLASS lcl_object_cus0 IMPLEMENTATION
+*----------------------------------------------------------------------*
+CLASS lcl_object_cus0 IMPLEMENTATION.
+
+ METHOD constructor.
+
+ super->constructor( is_item = is_item
+ iv_language = iv_language ).
+
+ mv_img_activity = ms_item-obj_name.
+
+ ENDMETHOD. "constructor
+
+ METHOD lif_object~has_changed_since.
+ rv_changed = abap_true.
+ ENDMETHOD. "lif_object~has_changed_since
+
+ METHOD lif_object~changed_by.
+ rv_user = c_user_unknown.
+ ENDMETHOD.
+
+ METHOD lif_object~get_metadata.
+ rs_metadata = get_metadata( ).
+ ENDMETHOD. "lif_object~get_metadata
+
+ METHOD lif_object~jump.
+
+ zcx_abapgit_exception=>raise( |TODO: Jump| ).
+
+* doesn't work...
+* CALL FUNCTION 'S_CUS_IMG_ACTIVITY_MAINTAIN'
+* EXPORTING
+* i_display = 'X'
+* i_no_replacement = 'X'
+* CHANGING
+* img_activity = mv_img_activity.
+
+ ENDMETHOD. "jump
+
+ METHOD lif_object~exists.
+
+ DATA: ls_message TYPE hier_mess.
+
+ CALL FUNCTION 'S_CUS_IMG_ACTIVITY_EXISTS'
+ EXPORTING
+ img_activity = mv_img_activity
+ IMPORTING
+ message = ls_message.
+
+ rv_bool = boolc( ls_message IS INITIAL ).
+
+ ENDMETHOD. "lif_object~exists
+
+ METHOD lif_object~delete.
+
+ DATA: ls_message TYPE hier_mess.
+
+ CALL FUNCTION 'S_CUS_IMG_ACTIVITY_DELETE'
+ EXPORTING
+ img_activity = mv_img_activity
+ IMPORTING
+ message = ls_message.
+
+ IF ls_message-msgty <> 'S'.
+ zcx_abapgit_exception=>raise( |error from delete CUS0 { mv_img_activity } S_CUS_IMG_ACTIVITY_DELETE| ).
+ ENDIF.
+
+ ENDMETHOD. "delete
+
+ METHOD lif_object~serialize.
+
+ DATA: ls_img_activity TYPE ty_img_activity.
+
+ CALL FUNCTION 'S_CUS_IMG_ACTIVITY_READ'
+ EXPORTING
+ img_activity = mv_img_activity
+ IMPORTING
+ img_activity_header = ls_img_activity-header
+ TABLES
+ img_activity_texts = ls_img_activity-texts.
+
+ CLEAR: ls_img_activity-header-fuser,
+ ls_img_activity-header-fdate,
+ ls_img_activity-header-ftime,
+ ls_img_activity-header-luser,
+ ls_img_activity-header-ldate,
+ ls_img_activity-header-ltime.
+
+ io_xml->add( iv_name = 'CUS0'
+ ig_data = ls_img_activity ).
+
+ ENDMETHOD. "serialize
+
+ METHOD lif_object~deserialize.
+
+ DATA: ls_img_activity TYPE ty_img_activity,
+ ls_text LIKE LINE OF ls_img_activity-texts.
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'CUS0'
+ CHANGING
+ cg_data = ls_img_activity ).
+
+ READ TABLE ls_img_activity-texts INTO ls_text
+ WITH KEY spras = sy-langu.
+
+ CALL FUNCTION 'S_CUS_IMG_ACTIVITY_SAVE'
+ EXPORTING
+ img_activity = ls_img_activity-header-activity
+ i_docu = ls_img_activity-header-docu_id
+ i_attributes = ls_img_activity-header-attributes
+ i_activity = ls_img_activity-header-c_activity
+ i_description = ls_text
+ i_tcode = ls_img_activity-header-tcode.
+
+ ENDMETHOD. "deserialize
+
+ METHOD lif_object~compare_to_remote_version.
+ CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
+ ENDMETHOD.
+
+ENDCLASS. "lcl_object_cus0 IMPLEMENTATION
diff --git a/src/zabapgit_object_cus0.prog.xml b/src/zabapgit_object_cus0.prog.xml
new file mode 100644
index 000000000..04b552487
--- /dev/null
+++ b/src/zabapgit_object_cus0.prog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_CUS0
+ A
+ X
+ S
+ D$
+ I
+ X
+ D$S
+ X
+
+
+ -
+ R
+ ZABAPGIT_OBJECT_CUS0
+ 20
+
+
+
+
+
diff --git a/src/zabapgit_object_cus1.prog.abap b/src/zabapgit_object_cus1.prog.abap
new file mode 100644
index 000000000..c3dbcdf1d
--- /dev/null
+++ b/src/zabapgit_object_cus1.prog.abap
@@ -0,0 +1,165 @@
+*&---------------------------------------------------------------------*
+*& Include zabapgit_object_cus1
+*&---------------------------------------------------------------------*
+
+*----------------------------------------------------------------------*
+* CLASS lcl_object_cus1 DEFINITION
+*----------------------------------------------------------------------*
+CLASS lcl_object_cus1 DEFINITION INHERITING FROM lcl_objects_super FINAL.
+
+ PUBLIC SECTION.
+ INTERFACES lif_object.
+ ALIASES mo_files FOR lif_object~mo_files.
+
+ METHODS constructor
+ IMPORTING
+ is_item TYPE zif_abapgit_definitions=>ty_item
+ iv_language TYPE spras.
+
+ PRIVATE SECTION.
+ TYPES: tty_activity_titles TYPE STANDARD TABLE OF cus_actt
+ WITH NON-UNIQUE DEFAULT KEY,
+
+ tty_objects TYPE STANDARD TABLE OF cus_actobj
+ WITH NON-UNIQUE DEFAULT KEY,
+
+ tty_objects_title TYPE STANDARD TABLE OF cus_actobt
+ WITH NON-UNIQUE DEFAULT KEY,
+
+ BEGIN OF ty_customzing_activity,
+ activity_header TYPE cus_acth,
+ activity_customer_exit TYPE cus_actext,
+ activity_title TYPE tty_activity_titles,
+ objects TYPE tty_objects,
+ objects_title TYPE tty_objects_title,
+ END OF ty_customzing_activity.
+
+ DATA: mv_customizing_activity TYPE cus_img_ac.
+
+ENDCLASS. "lcl_object_cus1 DEFINITION
+
+*----------------------------------------------------------------------*
+* CLASS lcl_object_cus1 IMPLEMENTATION
+*----------------------------------------------------------------------*
+CLASS lcl_object_cus1 IMPLEMENTATION.
+
+ METHOD constructor.
+
+ super->constructor( is_item = is_item
+ iv_language = iv_language ).
+
+ mv_customizing_activity = ms_item-obj_name.
+
+ ENDMETHOD. "constructor
+
+ METHOD lif_object~has_changed_since.
+ rv_changed = abap_true.
+ ENDMETHOD. "lif_object~has_changed_since
+
+ METHOD lif_object~changed_by.
+ rv_user = c_user_unknown.
+ ENDMETHOD.
+
+ METHOD lif_object~get_metadata.
+ rs_metadata = get_metadata( ).
+ ENDMETHOD. "lif_object~get_metadata
+
+ METHOD lif_object~jump.
+
+ zcx_abapgit_exception=>raise( |TODO: Jump| ).
+
+ ENDMETHOD. "jump
+
+ METHOD lif_object~exists.
+
+ CALL FUNCTION 'S_CUS_ACTIVITY_EXIST'
+ EXPORTING
+ activity = mv_customizing_activity
+ EXCEPTIONS
+ activity_exists_not = 1
+ OTHERS = 2.
+
+ rv_bool = boolc( sy-subrc = 0 ).
+
+ ENDMETHOD. "lif_object~exists
+
+ METHOD lif_object~delete.
+
+ DATA: ls_message TYPE hier_mess.
+
+ CALL FUNCTION 'S_CUS_ACTIVITY_DELETE'
+ EXPORTING
+ activity = mv_customizing_activity
+ IMPORTING
+ message = ls_message.
+
+ IF ls_message-msgty <> 'S'.
+ zcx_abapgit_exception=>raise( |error from delete CUS1 { mv_customizing_activity } S_CUS_ACTIVITY_DELETE| ).
+ ENDIF.
+
+ ENDMETHOD. "delete
+
+ METHOD lif_object~serialize.
+
+
+
+ DATA: ls_customzing_activity TYPE ty_customzing_activity.
+
+ CALL FUNCTION 'S_CUS_ACTIVITY_READ'
+ EXPORTING
+ activity = mv_customizing_activity
+ IMPORTING
+ activity_header = ls_customzing_activity-activity_header
+ activity_customer_exit = ls_customzing_activity-activity_customer_exit
+ TABLES
+ activity_title = ls_customzing_activity-activity_title
+ objects = ls_customzing_activity-objects
+ objects_title = ls_customzing_activity-objects_title.
+
+ CLEAR: ls_customzing_activity-activity_header-fdatetime,
+ ls_customzing_activity-activity_header-fuser,
+ ls_customzing_activity-activity_header-ldatetime,
+ ls_customzing_activity-activity_header-luser.
+
+ io_xml->add( iv_name = 'CUS1'
+ ig_data = ls_customzing_activity ).
+
+ ENDMETHOD. "serialize
+
+ METHOD lif_object~deserialize.
+
+ DATA: ls_customzing_activity TYPE ty_customzing_activity,
+ ls_message TYPE hier_mess.
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'CUS1'
+ CHANGING
+ cg_data = ls_customzing_activity ).
+
+ CALL FUNCTION 'S_CUS_ACTIVITY_SAVE'
+ EXPORTING
+ activity = ls_customzing_activity-activity_header-act_id
+ activity_type = ls_customzing_activity-activity_header-act_type
+ tcode = ls_customzing_activity-activity_header-tcode
+ customer_exit = ls_customzing_activity-activity_customer_exit-exit_name
+ customer_exit_enhancement = ls_customzing_activity-activity_customer_exit-enhancement
+ customer_exit_implementation = ls_customzing_activity-activity_customer_exit-impl_name
+ IMPORTING
+ message = ls_message
+ TABLES
+ activity_title = ls_customzing_activity-activity_title
+ objects = ls_customzing_activity-objects
+ objects_texts = ls_customzing_activity-objects_title.
+
+ IF ls_message-msgty <> 'S'.
+ zcx_abapgit_exception=>raise( |error from deserialize CUS1 { mv_customizing_activity } S_CUS_ACTIVITY_SAVE| ).
+ ENDIF.
+
+ ENDMETHOD. "deserialize
+
+ METHOD lif_object~compare_to_remote_version.
+ CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
+ ENDMETHOD.
+
+ENDCLASS. "lcl_object_cus1 IMPLEMENTATION
diff --git a/src/zabapgit_object_cus1.prog.xml b/src/zabapgit_object_cus1.prog.xml
new file mode 100644
index 000000000..98c9d25ae
--- /dev/null
+++ b/src/zabapgit_object_cus1.prog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_CUS1
+ A
+ X
+ S
+ D$
+ I
+ X
+ D$S
+ X
+
+
+ -
+ R
+ ZABAPGIT_OBJECT_CUS1
+ 20
+
+
+
+
+
diff --git a/src/zabapgit_object_cus2.prog.abap b/src/zabapgit_object_cus2.prog.abap
new file mode 100644
index 000000000..d246fced1
--- /dev/null
+++ b/src/zabapgit_object_cus2.prog.abap
@@ -0,0 +1,160 @@
+*&---------------------------------------------------------------------*
+*& Include zabapgit_object_cus2
+*&---------------------------------------------------------------------*
+
+*----------------------------------------------------------------------*
+* CLASS lcl_object_cus2 DEFINITION
+*----------------------------------------------------------------------*
+CLASS lcl_object_cus2 DEFINITION INHERITING FROM lcl_objects_super FINAL.
+
+ PUBLIC SECTION.
+ INTERFACES lif_object.
+ ALIASES mo_files FOR lif_object~mo_files.
+
+ METHODS constructor
+ IMPORTING
+ is_item TYPE zif_abapgit_definitions=>ty_item
+ iv_language TYPE spras.
+
+ PRIVATE SECTION.
+ TYPES: tty_attribute_titles TYPE STANDARD TABLE OF cus_atrt
+ WITH NON-UNIQUE DEFAULT KEY,
+ tty_attribute_countries TYPE STANDARD TABLE OF cus_atrcou
+ WITH NON-UNIQUE DEFAULT KEY,
+ tty_attribute_components TYPE STANDARD TABLE OF tfm18
+ WITH NON-UNIQUE DEFAULT KEY,
+ tty_attribute_comp_variants TYPE STANDARD TABLE OF cus_atrvco
+ WITH NON-UNIQUE DEFAULT KEY.
+
+ TYPES: BEGIN OF ty_customizing_attribute,
+ header TYPE cus_atrh,
+ titles TYPE tty_attribute_titles,
+ countries TYPE tty_attribute_countries,
+ components TYPE tty_attribute_components,
+ components_variants TYPE tty_attribute_comp_variants,
+ END OF ty_customizing_attribute.
+
+ DATA: mv_img_attribute TYPE cus_atr.
+
+ENDCLASS. "lcl_object_cus2 DEFINITION
+
+*----------------------------------------------------------------------*
+* CLASS lcl_object_cus2 IMPLEMENTATION
+*----------------------------------------------------------------------*
+CLASS lcl_object_cus2 IMPLEMENTATION.
+
+ METHOD constructor.
+
+ super->constructor( is_item = is_item
+ iv_language = iv_language ).
+
+ mv_img_attribute = ms_item-obj_name.
+
+ ENDMETHOD. "constructor
+
+ METHOD lif_object~has_changed_since.
+ rv_changed = abap_true.
+ ENDMETHOD. "lif_object~has_changed_since
+
+ METHOD lif_object~changed_by.
+ rv_user = c_user_unknown.
+ ENDMETHOD.
+
+ METHOD lif_object~get_metadata.
+ rs_metadata = get_metadata( ).
+ ENDMETHOD. "lif_object~get_metadata
+
+ METHOD lif_object~jump.
+
+ zcx_abapgit_exception=>raise( |TODO: Jump| ).
+
+ ENDMETHOD. "jump
+
+ METHOD lif_object~exists.
+
+ DATA: ls_message TYPE hier_mess.
+
+ CALL FUNCTION 'S_CUS_ATTRIBUTES_EXIST'
+ EXPORTING
+ img_attribute = mv_img_attribute
+ EXCEPTIONS
+ attributes_exists_not = 1
+ OTHERS = 2.
+
+ rv_bool = boolc( sy-subrc = 0 ).
+
+ ENDMETHOD. "lif_object~exists
+
+ METHOD lif_object~delete.
+
+ DATA: ls_message TYPE hier_mess.
+
+ CALL FUNCTION 'S_CUS_ATTRIBUTES_DELETE'
+ EXPORTING
+ img_attribute = mv_img_attribute
+ IMPORTING
+ message = ls_message.
+
+ IF ls_message-msgty <> 'S'.
+ zcx_abapgit_exception=>raise( |error from delete CUS2 { mv_img_attribute } S_CUS_ATTRIBUTES_DELETE| ).
+ ENDIF.
+
+ ENDMETHOD. "delete
+
+ METHOD lif_object~serialize.
+
+ DATA: ls_customizing_attribute TYPE ty_customizing_attribute.
+
+ CALL FUNCTION 'S_CUS_ATTRIBUTES_READ'
+ EXPORTING
+ img_attribute = mv_img_attribute
+ IMPORTING
+ attribute_header = ls_customizing_attribute-header
+ TABLES
+ attribute_title = ls_customizing_attribute-titles
+ attribute_countries = ls_customizing_attribute-countries
+ attribute_components = ls_customizing_attribute-components
+ attribute_components_variants = ls_customizing_attribute-components_variants.
+
+ CLEAR: ls_customizing_attribute-header-fdatetime,
+ ls_customizing_attribute-header-fuser,
+ ls_customizing_attribute-header-ldatetime,
+ ls_customizing_attribute-header-luser.
+
+ io_xml->add( iv_name = 'CUS2'
+ ig_data = ls_customizing_attribute ).
+
+ ENDMETHOD. "serialize
+
+ METHOD lif_object~deserialize.
+
+ DATA: ls_customizing_attribute TYPE ty_customizing_attribute,
+ ls_message TYPE hier_mess.
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'CUS2'
+ CHANGING
+ cg_data = ls_customizing_attribute ).
+
+ CALL FUNCTION 'S_CUS_ATTRIBUTES_SAVE'
+ EXPORTING
+ img_attribute = ls_customizing_attribute-header
+ IMPORTING
+ message = ls_message
+ TABLES
+ attributes_title = ls_customizing_attribute-titles
+ attributes_countries = ls_customizing_attribute-countries
+ attributes_components = ls_customizing_attribute-components.
+
+ IF ls_message-msgty <> 'S'.
+ zcx_abapgit_exception=>raise( |error from deserialize CUS2 { mv_img_attribute } S_CUS_ATTRIBUTES_SAVE| ).
+ ENDIF.
+
+ ENDMETHOD. "deserialize
+
+ METHOD lif_object~compare_to_remote_version.
+ CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
+ ENDMETHOD.
+
+ENDCLASS. "lcl_object_cus2 IMPLEMENTATION
diff --git a/src/zabapgit_object_cus2.prog.xml b/src/zabapgit_object_cus2.prog.xml
new file mode 100644
index 000000000..271e69250
--- /dev/null
+++ b/src/zabapgit_object_cus2.prog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_CUS2
+ A
+ X
+ S
+ D$
+ I
+ X
+ D$S
+ X
+
+
+ -
+ R
+ ZABAPGIT_OBJECT_CUS2
+ 20
+
+
+
+
+
diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap
index 30eaedab9..8ee22ce67 100644
--- a/src/zabapgit_object_serializing.prog.abap
+++ b/src/zabapgit_object_serializing.prog.abap
@@ -10,6 +10,9 @@ INCLUDE zabapgit_object_oo_functions.
INCLUDE zabapgit_object_clas.
INCLUDE zabapgit_object_clas_new.
INCLUDE zabapgit_object_cmpt.
+INCLUDE zabapgit_object_cus0.
+INCLUDE zabapgit_object_cus1.
+INCLUDE zabapgit_object_cus2.
INCLUDE zabapgit_object_dcls.
INCLUDE zabapgit_object_ddls.
INCLUDE zabapgit_object_ddlx.
diff --git a/src/zabapgit_object_shi3.prog.abap b/src/zabapgit_object_shi3.prog.abap
index 85c1951ee..7565a2ef8 100644
--- a/src/zabapgit_object_shi3.prog.abap
+++ b/src/zabapgit_object_shi3.prog.abap
@@ -23,6 +23,8 @@ CLASS lcl_object_shi3 DEFINITION INHERITING FROM lcl_objects_super FINAL.
METHODS jump_se43
RAISING zcx_abapgit_exception.
+
+
METHODS clear_fields
CHANGING cs_head TYPE ttree
ct_nodes TYPE hier_iface_t.
@@ -100,7 +102,22 @@ CLASS lcl_object_shi3 IMPLEMENTATION.
ENDMETHOD. "jump_se43
METHOD lif_object~jump.
- jump_se43( ).
+
+ DATA: ls_head TYPE ttree.
+
+ CALL FUNCTION 'STREE_STRUCTURE_READ'
+ EXPORTING
+ structure_id = mv_tree_id
+ IMPORTING
+ structure_header = ls_head.
+
+ CASE ls_head-type.
+ WHEN 'BMENU'.
+ jump_se43( ).
+ WHEN OTHERS.
+ zcx_abapgit_exception=>raise( |Jump for type { ls_head-type } not implemented| ).
+ ENDCASE.
+
ENDMETHOD. "jump
METHOD lif_object~exists.
@@ -229,7 +246,7 @@ CLASS lcl_object_shi3 IMPLEMENTATION.
CALL FUNCTION 'STREE_HIERARCHY_SAVE'
EXPORTING
structure_id = mv_tree_id
- structure_type = 'BMENU'
+ structure_type = ls_head-type
structure_description = space
structure_masterlanguage = mv_language
structure_responsible = sy-uname