diff --git a/src/data/package.devc.xml b/src/data/package.devc.xml
new file mode 100644
index 000000000..535a7d346
--- /dev/null
+++ b/src/data/package.devc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ abapGit - Data
+
+
+
+
diff --git a/src/data/zcl_abapgit_data_config.clas.abap b/src/data/zcl_abapgit_data_config.clas.abap
new file mode 100644
index 000000000..fab721525
--- /dev/null
+++ b/src/data/zcl_abapgit_data_config.clas.abap
@@ -0,0 +1,94 @@
+CLASS zcl_abapgit_data_config DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ INTERFACES zif_abapgit_data_config .
+
+ METHODS constructor .
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+
+ DATA mv_path TYPE string .
+ DATA mt_config TYPE zif_abapgit_data_config=>ty_config_tt .
+ENDCLASS.
+
+
+
+CLASS ZCL_ABAPGIT_DATA_CONFIG IMPLEMENTATION.
+
+
+ METHOD constructor.
+
+ mv_path = zif_abapgit_data_config=>c_default_path.
+
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_data_config~add_config.
+
+ ASSERT NOT is_config-type IS INITIAL.
+ ASSERT NOT is_config-name IS INITIAL.
+
+ INSERT is_config INTO TABLE mt_config.
+ IF sy-subrc <> 0.
+ zcx_abapgit_exception=>raise( 'Already in table' ).
+ ENDIF.
+
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_data_config~from_json.
+* todo
+ ASSERT 0 = 1.
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_data_config~get_configs.
+ rt_configs = mt_config.
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_data_config~get_path.
+
+ rv_path = mv_path.
+
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_data_config~remove_config.
+
+* todo, give exception if it does not exist
+
+ DELETE mt_config WHERE name = is_config-name AND type = is_config-type.
+ IF sy-subrc <> 0.
+ zcx_abapgit_exception=>raise( 'Not found' ).
+ ENDIF.
+
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_data_config~set_path.
+
+* todo, validate format
+
+ mv_path = iv_path.
+
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_data_config~to_json.
+* todo
+ ASSERT 0 = 1.
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_data_config~update_config.
+
+ zif_abapgit_data_config~remove_config( is_config ).
+ zif_abapgit_data_config~add_config( is_config ).
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/data/zcl_abapgit_data_config.clas.xml b/src/data/zcl_abapgit_data_config.clas.xml
new file mode 100644
index 000000000..845ce09c4
--- /dev/null
+++ b/src/data/zcl_abapgit_data_config.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ ZCL_ABAPGIT_DATA_CONFIG
+ E
+ abapGit - Data Config
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/data/zcl_abapgit_data_deserializer.clas.abap b/src/data/zcl_abapgit_data_deserializer.clas.abap
new file mode 100644
index 000000000..54096542b
--- /dev/null
+++ b/src/data/zcl_abapgit_data_deserializer.clas.abap
@@ -0,0 +1,22 @@
+CLASS zcl_abapgit_data_deserializer DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ INTERFACES zif_abapgit_data_deserializer .
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZCL_ABAPGIT_DATA_DESERIALIZER IMPLEMENTATION.
+
+
+ METHOD zif_abapgit_data_deserializer~deserialize.
+* todo
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/data/zcl_abapgit_data_deserializer.clas.xml b/src/data/zcl_abapgit_data_deserializer.clas.xml
new file mode 100644
index 000000000..457196f85
--- /dev/null
+++ b/src/data/zcl_abapgit_data_deserializer.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ ZCL_ABAPGIT_DATA_DESERIALIZER
+ E
+ abapGit - Data deserializer
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/data/zcl_abapgit_data_factory.clas.abap b/src/data/zcl_abapgit_data_factory.clas.abap
new file mode 100644
index 000000000..4fb70ccf3
--- /dev/null
+++ b/src/data/zcl_abapgit_data_factory.clas.abap
@@ -0,0 +1,46 @@
+CLASS zcl_abapgit_data_factory DEFINITION
+ PUBLIC
+ CREATE PUBLIC
+ GLOBAL FRIENDS zcl_abapgit_data_injector .
+
+ PUBLIC SECTION.
+
+ METHODS get_serializer
+ RETURNING
+ VALUE(ri_serializer) TYPE REF TO zif_abapgit_data_serializer .
+ METHODS get_deserializer
+ RETURNING
+ VALUE(ri_deserializer) TYPE REF TO zif_abapgit_data_deserializer .
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+
+ CLASS-DATA gi_serializer TYPE REF TO zif_abapgit_data_serializer .
+ CLASS-DATA gi_deserializer TYPE REF TO zif_abapgit_data_deserializer .
+ENDCLASS.
+
+
+
+CLASS ZCL_ABAPGIT_DATA_FACTORY IMPLEMENTATION.
+
+
+ METHOD get_deserializer.
+
+ IF gi_deserializer IS INITIAL.
+ CREATE OBJECT gi_deserializer TYPE zcl_abapgit_data_deserializer.
+ ENDIF.
+
+ ri_deserializer = gi_deserializer.
+
+ ENDMETHOD.
+
+
+ METHOD get_serializer.
+
+ IF gi_serializer IS INITIAL.
+ CREATE OBJECT gi_serializer TYPE zcl_abapgit_data_serializer.
+ ENDIF.
+
+ ri_serializer = gi_serializer.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/data/zcl_abapgit_data_factory.clas.xml b/src/data/zcl_abapgit_data_factory.clas.xml
new file mode 100644
index 000000000..44ef2ade2
--- /dev/null
+++ b/src/data/zcl_abapgit_data_factory.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ ZCL_ABAPGIT_DATA_FACTORY
+ E
+ abapGit - Data factory
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/data/zcl_abapgit_data_injector.clas.abap b/src/data/zcl_abapgit_data_injector.clas.abap
new file mode 100644
index 000000000..b8ea13980
--- /dev/null
+++ b/src/data/zcl_abapgit_data_injector.clas.abap
@@ -0,0 +1,30 @@
+CLASS zcl_abapgit_data_injector DEFINITION
+ PUBLIC
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ METHODS set_serializer
+ IMPORTING
+ !ii_serializer TYPE REF TO zif_abapgit_data_serializer .
+ METHODS set_deserializer
+ IMPORTING
+ !ii_deserializer TYPE REF TO zif_abapgit_data_deserializer .
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZCL_ABAPGIT_DATA_INJECTOR IMPLEMENTATION.
+
+
+ METHOD set_deserializer.
+ zcl_abapgit_data_factory=>gi_deserializer = ii_deserializer.
+ ENDMETHOD.
+
+
+ METHOD set_serializer.
+ zcl_abapgit_data_factory=>gi_serializer = ii_serializer.
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/data/zcl_abapgit_data_injector.clas.xml b/src/data/zcl_abapgit_data_injector.clas.xml
new file mode 100644
index 000000000..fb600490f
--- /dev/null
+++ b/src/data/zcl_abapgit_data_injector.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ ZCL_ABAPGIT_DATA_INJECTOR
+ E
+ abapGit - Data injector
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/data/zcl_abapgit_data_serializer.clas.abap b/src/data/zcl_abapgit_data_serializer.clas.abap
new file mode 100644
index 000000000..0d68b1b82
--- /dev/null
+++ b/src/data/zcl_abapgit_data_serializer.clas.abap
@@ -0,0 +1,119 @@
+CLASS zcl_abapgit_data_serializer DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ INTERFACES zif_abapgit_data_serializer .
+ PROTECTED SECTION.
+
+ METHODS dump_itab
+ IMPORTING
+ !ir_data TYPE REF TO data
+ RETURNING
+ VALUE(rv_data) TYPE xstring .
+ METHODS build_table_itab
+ IMPORTING
+ !iv_name TYPE tadir-obj_name
+ RETURNING
+ VALUE(rr_data) TYPE REF TO data .
+ METHODS read_database_table
+ IMPORTING
+ !iv_name TYPE tadir-obj_name
+ !it_where TYPE string_table
+ RETURNING
+ VALUE(rr_data) TYPE REF TO data .
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZCL_ABAPGIT_DATA_SERIALIZER IMPLEMENTATION.
+
+
+ METHOD build_table_itab.
+
+ DATA lo_structure TYPE REF TO cl_abap_structdescr.
+ DATA lo_table TYPE REF TO cl_abap_tabledescr.
+
+ lo_structure ?= cl_abap_structdescr=>describe_by_name( iv_name ).
+* todo, also add unique key corresponding to the db table, so duplicates cannot be returned
+ lo_table = cl_abap_tabledescr=>create( lo_structure ).
+ CREATE DATA rr_data TYPE HANDLE lo_table.
+
+ ENDMETHOD.
+
+
+ METHOD dump_itab.
+
+* quick and dirty, will be json instead
+
+ DATA lt_data TYPE string_table.
+ DATA lv_str TYPE string.
+ FIELD-SYMBOLS TYPE ANY TABLE.
+ FIELD-SYMBOLS TYPE any.
+
+
+ ASSIGN ir_data->* TO .
+ LOOP AT ASSIGNING .
+ cl_abap_container_utilities=>fill_container_c(
+ EXPORTING
+ im_value =
+ IMPORTING
+ ex_container = lv_str ).
+ APPEND lv_str TO lt_data.
+ ENDLOOP.
+
+ rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( concat_lines_of( table = lt_data
+ sep = |\n| ) ).
+
+ ENDMETHOD.
+
+
+ METHOD read_database_table.
+
+ DATA lv_where LIKE LINE OF it_where.
+ FIELD-SYMBOLS: TYPE ANY TABLE.
+
+ rr_data = build_table_itab( iv_name ).
+ ASSIGN rr_data->* TO .
+
+ LOOP AT it_where INTO lv_where.
+ SELECT * FROM (iv_name) INTO TABLE WHERE (lv_where).
+ ENDLOOP.
+ IF lines( it_where ) = 0.
+ SELECT * FROM (iv_name) INTO TABLE .
+ ENDIF.
+
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_data_serializer~serialize.
+
+ DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
+ DATA ls_config LIKE LINE OF lt_configs.
+ DATA ls_file LIKE LINE OF rt_files.
+ DATA lr_data TYPE REF TO data.
+
+
+ ls_file-path = ii_config->get_path( ).
+ lt_configs = ii_config->get_configs( ).
+
+ LOOP AT lt_configs INTO ls_config.
+ ASSERT ls_config-type = zif_abapgit_data_config=>c_data_type-tabu. " todo
+ ASSERT NOT ls_config-name IS INITIAL.
+
+ lr_data = read_database_table(
+ iv_name = ls_config-name
+ it_where = ls_config-where ).
+
+ ls_file-filename = to_lower( |{ ls_config-name }.{ ls_config-type }.todo| ).
+ ls_file-data = dump_itab( lr_data ).
+ ls_file-sha1 = zcl_abapgit_hash=>sha1_blob( ls_file-data ).
+ APPEND ls_file TO rt_files.
+
+ ENDLOOP.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/data/zcl_abapgit_data_serializer.clas.testclasses.abap b/src/data/zcl_abapgit_data_serializer.clas.testclasses.abap
new file mode 100644
index 000000000..cd161d465
--- /dev/null
+++ b/src/data/zcl_abapgit_data_serializer.clas.testclasses.abap
@@ -0,0 +1,40 @@
+
+CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+
+ PRIVATE SECTION.
+ DATA mi_cut TYPE REF TO zif_abapgit_data_serializer.
+ DATA mi_config TYPE REF TO zif_abapgit_data_config.
+
+ METHODS:
+ setup,
+ serialize FOR TESTING RAISING zcx_abapgit_exception.
+ENDCLASS.
+
+
+CLASS ltcl_test IMPLEMENTATION.
+
+ METHOD setup.
+ CREATE OBJECT mi_cut TYPE zcl_abapgit_data_serializer.
+ CREATE OBJECT mi_config TYPE zcl_abapgit_data_config.
+ ENDMETHOD.
+
+ METHOD serialize.
+
+ DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+ DATA lt_files TYPE zif_abapgit_definitions=>ty_files_tt.
+
+ ls_config-type = 'TABU'.
+ ls_config-name = 'T000'.
+ APPEND |MANDT = '{ sy-mandt }'| TO ls_config-where.
+
+ mi_config->add_config( ls_config ).
+
+ lt_files = mi_cut->serialize( mi_config ).
+
+ cl_abap_unit_assert=>assert_equals(
+ act = lines( lt_files )
+ exp = 1 ).
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/data/zcl_abapgit_data_serializer.clas.xml b/src/data/zcl_abapgit_data_serializer.clas.xml
new file mode 100644
index 000000000..bb3294a15
--- /dev/null
+++ b/src/data/zcl_abapgit_data_serializer.clas.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ ZCL_ABAPGIT_DATA_SERIALIZER
+ E
+ abapGit - Data Serializer
+ 1
+ X
+ X
+ X
+ X
+
+
+
+
diff --git a/src/data/zif_abapgit_data_config.intf.abap b/src/data/zif_abapgit_data_config.intf.abap
new file mode 100644
index 000000000..fbc6d9f4c
--- /dev/null
+++ b/src/data/zif_abapgit_data_config.intf.abap
@@ -0,0 +1,59 @@
+INTERFACE zif_abapgit_data_config
+ PUBLIC .
+
+
+ TYPES:
+ ty_data_type TYPE c LENGTH 4 .
+ TYPES:
+ BEGIN OF ty_config,
+ type TYPE ty_data_type,
+ name TYPE tadir-obj_name,
+ where TYPE string_table,
+ END OF ty_config .
+ TYPES:
+ ty_config_tt TYPE SORTED TABLE OF ty_config WITH UNIQUE KEY type name.
+
+ CONSTANTS c_default_path TYPE string VALUE '/data/' ##NO_TEXT.
+ CONSTANTS:
+ BEGIN OF c_data_type,
+ tabu TYPE ty_data_type VALUE 'TABU',
+ vdat TYPE ty_data_type VALUE 'VDAT',
+ cdat TYPE ty_data_type VALUE 'CDAT',
+ tdat TYPE ty_data_type VALUE 'TDAT',
+ END OF c_data_type .
+
+ METHODS get_path
+ RETURNING
+ VALUE(rv_path) TYPE string .
+ METHODS set_path
+ IMPORTING
+ !iv_path TYPE string
+ RAISING
+ zcx_abapgit_exception .
+ METHODS from_json
+ IMPORTING
+ !it_files TYPE zif_abapgit_definitions=>ty_files_tt
+ RAISING
+ zcx_abapgit_exception .
+ METHODS to_json
+ RETURNING
+ VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt .
+ METHODS add_config
+ IMPORTING
+ !is_config TYPE ty_config
+ RAISING
+ zcx_abapgit_exception .
+ METHODS update_config
+ IMPORTING
+ !is_config TYPE ty_config
+ RAISING
+ zcx_abapgit_exception .
+ METHODS remove_config
+ IMPORTING
+ !is_config TYPE ty_config
+ RAISING
+ zcx_abapgit_exception .
+ METHODS get_configs
+ RETURNING
+ VALUE(rt_configs) TYPE ty_config_tt .
+ENDINTERFACE.
diff --git a/src/data/zif_abapgit_data_config.intf.xml b/src/data/zif_abapgit_data_config.intf.xml
new file mode 100644
index 000000000..12fc45be9
--- /dev/null
+++ b/src/data/zif_abapgit_data_config.intf.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ ZIF_ABAPGIT_DATA_CONFIG
+ E
+ abapGit - Data config
+ 2
+ 1
+ X
+
+
+
+
diff --git a/src/data/zif_abapgit_data_deserializer.intf.abap b/src/data/zif_abapgit_data_deserializer.intf.abap
new file mode 100644
index 000000000..8ca8a949c
--- /dev/null
+++ b/src/data/zif_abapgit_data_deserializer.intf.abap
@@ -0,0 +1,9 @@
+INTERFACE zif_abapgit_data_deserializer
+ PUBLIC .
+
+ METHODS deserialize
+ IMPORTING
+ ii_config TYPE REF TO zif_abapgit_data_config
+ it_files TYPE zif_abapgit_definitions=>ty_files_tt.
+
+ENDINTERFACE.
diff --git a/src/data/zif_abapgit_data_deserializer.intf.xml b/src/data/zif_abapgit_data_deserializer.intf.xml
new file mode 100644
index 000000000..e91e71f1f
--- /dev/null
+++ b/src/data/zif_abapgit_data_deserializer.intf.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ ZIF_ABAPGIT_DATA_DESERIALIZER
+ E
+ abapGit - Data deserializer
+ 2
+ 1
+ X
+
+
+
+
diff --git a/src/data/zif_abapgit_data_serializer.intf.abap b/src/data/zif_abapgit_data_serializer.intf.abap
new file mode 100644
index 000000000..467da2bee
--- /dev/null
+++ b/src/data/zif_abapgit_data_serializer.intf.abap
@@ -0,0 +1,12 @@
+INTERFACE zif_abapgit_data_serializer
+ PUBLIC .
+
+
+ METHODS serialize
+ IMPORTING
+ !ii_config TYPE REF TO zif_abapgit_data_config
+ RETURNING
+ VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt
+ RAISING
+ zcx_abapgit_exception .
+ENDINTERFACE.
diff --git a/src/data/zif_abapgit_data_serializer.intf.xml b/src/data/zif_abapgit_data_serializer.intf.xml
new file mode 100644
index 000000000..e29e518f6
--- /dev/null
+++ b/src/data/zif_abapgit_data_serializer.intf.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ ZIF_ABAPGIT_DATA_SERIALIZER
+ E
+ abapGit - Data serializer
+ 2
+ 1
+ X
+
+
+
+