diff --git a/.clusterfuzzlite/build.sh b/.clusterfuzzlite/build.sh
index 43f11d8cc178b896353db3c43bc3daa6f67c9d2d..68528bc46ae7d76f1b6804b97ec2db2dd2f5dd80 100755
--- a/.clusterfuzzlite/build.sh
+++ b/.clusterfuzzlite/build.sh
@@ -13,10 +13,10 @@ meson setup "$BUILD" \
   -Dfuzzer_ldflags="$LIB_FUZZING_ENGINE" \
   -Ddebug_level=0 \
   -Ddefault_library=static \
-  -Db_lundef=false 
+  -Db_lundef=false
 
 # build fuzzers
-ninja -v -C "$BUILD" test/fuzz/fuzz_{round_trip,compression}
+ninja -v -C "$BUILD" test/fuzz/{fuzz_round_trip,fuzz_compression,fuzz_decompression}
 find "$BUILD/test/fuzz" -maxdepth 1 -executable -type f -exec cp "{}" "$OUT" \;
 
 #TODO prepare corps
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ef160fac29bbfc927115ab3212c54d2aaac39698
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,145 @@
+name: Test Runner
+
+on: [push]
+
+permissions:
+  contents: read
+
+jobs:
+  unix-build-test:
+    strategy:
+      fail-fast: false  # 'false' means Don't stop matrix workflows even if some matrix failed.
+      matrix:
+        include:
+          - { os: ubuntu-latest, extra_opt: "" }
+          - { os: macos-latest,  extra_opt: "" }
+    runs-on: ${{ matrix.os }}
+    steps:
+    - uses: actions/checkout@v4
+    - uses: actions/setup-python@v5
+      with:
+        python-version: '3.x'
+    - name: Install packages
+      run: pip install meson ninja pytest
+    - name: ${{ matrix.os }} meson setup
+      run: |
+        meson setup \
+          --buildtype=debugoptimized \
+          -Db_sanitize=address,undefined \
+          -Db_lundef=false \
+          ${{ matrix.extra_opt }} \
+          -Dwerror=true \
+          builddir
+    - name: build cmp_tool
+      run: meson compile -C builddir/ cmp_tool
+    - name: run tests
+      run: meson test -C builddir/ --print-errorlogs --timeout-multiplier 3
+    - uses: actions/upload-artifact@v4
+      if: failure()
+      with:
+        name: ${{ matrix.os }} Testlog
+        path: builddir/meson-logs/testlog.txt
+
+
+  ubuntu-32-build-test:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v4
+    - uses: actions/setup-python@v5
+      with:
+        python-version: '3.x'
+    - name: Install packages
+      run: |
+        pip install meson ninja pytest
+        sudo apt-get update
+        sudo apt-get install gcc-multilib g++-multilib
+    - name: 32 bit compilation
+      run: |
+        meson setup \
+          --buildtype=debugoptimized \
+          -Db_sanitize=address,undefined \
+          -Db_lundef=false \
+          -Dc_args="-m32" \
+          -Dc_link_args="-m32" \
+          -Dwerror=true \
+          builddir
+        meson compile -C builddir cmp_tool
+    - name: run tests
+      run: meson test -C builddir --print-errorlogs --timeout-multiplier 3
+    - uses: actions/upload-artifact@v4
+      if: failure()
+      with:
+        name: 32 bit Testlog
+        path: builddir/meson-logs/testlog.txt
+
+
+  mingw-cross-compilation:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v4
+    - uses: actions/setup-python@v5
+      with:
+        python-version: '3.x'
+    - name: Install packages
+      run: |
+        pip install meson ninja pytest
+        sudo apt-get update
+        sudo apt-get install gcc-mingw-w64 wine64
+    - name: mingw cross-compilation and testing
+      run: |
+        meson setup \
+          --cross-file=mingw-w64-64.txt \
+          --buildtype=debugoptimized \
+          -Dwerror=true \
+          builddir_cross_win
+        meson compile -C builddir_cross_win cmp_tool
+    - name: run tests
+      run: meson test -C builddir_cross_win --print-errorlogs --timeout-multiplier 3
+    - uses: actions/upload-artifact@v4
+      if: failure()
+      with:
+        name: MinGW cross compile Testlog
+        path: builddir_cross_win/meson-logs/testlog.txt
+
+
+  mingw-build-test:
+    runs-on: windows-latest
+    defaults:
+      run:
+        shell: msys2 {0}
+    strategy:
+      fail-fast: false  # 'false' means Don't stop matrix workflows even if some matrix failed.
+      matrix:
+        include:
+          - { sys: mingw64, env: x86_64 }
+          - { sys: mingw32, env: i686 }
+          - { sys: ucrt64,  env: ucrt-x86_64 }
+    steps:
+    - uses: actions/checkout@v4
+    - uses: msys2/setup-msys2@v2
+      with:
+        msystem: ${{matrix.sys}}
+        # update: true
+        install: >-
+          mingw-w64-${{matrix.env}}-meson
+          mingw-w64-${{matrix.env}}-gcc
+          mingw-w64-${{matrix.env}}-ca-certificates
+          mingw-w64-${{matrix.env}}-python-pytest
+          ruby
+          patch
+
+    - name: build
+      run: |
+        CC=gcc \
+          meson setup \
+            --buildtype=debugoptimized \
+            -Dwerror=true \
+            builddir
+        meson compile -C builddir cmp_tool
+    - name: run tests
+      run: meson test -C builddir --print-errorlogs --timeout-multiplier 3
+    - uses: actions/upload-artifact@v4
+      if: failure()
+      with:
+        name: ${{matrix.sys}} Windows Testlog
+        path: builddir/meson-logs/testlog.txt
diff --git a/.gitignore b/.gitignore
index d4e5f782b9e51c3f8b30915bbb333d9a04a437a1..47480e00ebdafbdd9498ae8fe55cd4a2587cf466 100644
--- a/.gitignore
+++ b/.gitignore
@@ -60,6 +60,7 @@ cmp_tool
 
 # C/C++/ObjC language server
 .ccls-cache
+.cache
 
 
 ### Gcov ###
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 30fb967ffb6b16294c4e57833fe7b8db6497a98b..de799aa6163b9ed0710e9c956bcb768042e9e791 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,13 +1,69 @@
 # Changelog
 All notable changes to this project will be documented in this file.
 
-## [Unreleased]
+## [0.13] - 08-11-2024
 ### Added
-- add -vv flag for extra verbose output
-###Changed
-- -last_info option: skip model transfer if last updated model buffer and the current model buffer overlap exactly
+- added chunk-specific compression parameter guessing functionality
+ - added chunk compression parameter file I/O functionality
+- added fuzz target for decompression
+- added Github action to compile with Werror and run tests
+- added unit tests to improve code coverage
+### Changed
+- improved spillover threshold calculation logic for chunk compression
+- downgraded reserved field check from error to warning in decompression
+- added const qualifiers for (de)compression parameters
+- renamed CMP_ERROR_SMALL_BUF_ to CMP_ERROR_SMALL_BUFFER
+- replaced dynamic max_used_bits struct with constant definition
+- separated RDCU configuration into its own struct
+- consolidated l_fx_variance and l_cob_variance into single l_fx_cob_variance field
+- changed return type of compress_like_rdcu from int32_t to uint32_t
+- updated Doxygen configuration and comments
+ - updated doxygen-awesome-css submodule to latest version
+ - fixed spelling errors and grammar in documentation and messages
+### Fixed
+- corrected size calculation when `dst` is NULL in `compress_chunk()`
+- fix be24_to_cpu function for big-endian systems
+- fix collection size validation in decompression header
+### Removed
+- remove deprecated ICU compression interface
+- remove (de)compression from fast cadence data products
+
+## [0.12] - 2024-05-02
+### Added
+- added chunk (de)compression
+- added test case for chunk (de)compression
+- added -vv flag for extra verbose output
+- fuzzing
+ - added fuzzing targets configuration in meson build system
+ - added GitHub Actions workflow for ClusterFuzzLite integration
+- added compression speed test bench
+ - added wrapper to execute programmes on a LEON setup
+- added examples for software and hardware compression
+- updated unit tests
+- added compression and decompression for DATA_TYPE_F_CAM_OFFSET and DATA_TYPE_F_CAM_BACKGROUND
+- documentation was improved with additional comments and doxygen strings
+### Changed
+- enhanced error handling in chunk compression functions
+ - compression function now returns error code upon failure
+ - Added error code checking with cmp_get_error_code()
+ - added descriptive strings for each error code
+- updated debug_print() for better environment adaptability
+- adapted to C standard GNU89 with GCC extensions
+- restructured file layout:
+ - split lib folder into common, decompress, icu_compress rdcu_compress
+ - moved cmp_tool files into programs directory
+### Fixed
+- Fixed cross-compilation to Windows on Ubuntu/Debian
+- Fixed cmp_tool chunk compression entity header
+- Fixed model update for NULL dst and worst case model mode
+- Fixed unaligned access when compressing imagettes
+- Fixed sparc compiler warnings and compatibility issues
+- Fixed compiler warning for datetime deprecation
+### Removed
+- removed unused CMP_MODE_STUFF compression mode
+- removed unused files and code
 
-## [0.11] - 26-04-2023
+## [0.11] - 2023-04-26
 ### Added
 - add -b or --binary option for read and write files in binary format
 - add cross compile file for sparc
@@ -27,7 +83,7 @@ All notable changes to this project will be documented in this file.
 - fixed several bug when using the last_info option
 - fix a bug in the calculation of the adaptive compression sizes
 
-## [0.09] - 30-09-2022
+## [0.09] - 2022-09-30
 ### Added
 - decompression/compression for non-imagette data
 - functions to create and configure a compression configuration
@@ -39,7 +95,7 @@ All notable changes to this project will be documented in this file.
 ### Fixed
 - now the adaptive compression size (ap1_cmp_size, ap2_cmp_size) is calculate when the --rdcu_par option is used
 
-## [0.08] - 19-01-2021
+## [0.08] - 2021-01-19
 ### Added
 - Relax the requirements on the input format
 A whitespace (space (0x20), form feed (0x0c), line feed (0x0a), carriage return
@@ -58,12 +114,12 @@ E.g. "# comment\n ABCD 1    2\n34B 12\n" are interpreted as {0xAB, 0xCD,
 ### Changed
 - Rename cmp_tool_lib.c to cmp_io.c
 
-## [0.07] - 13-12-2021
+## [0.07] - 2021-12-13
 - **NOTE:**  The behaviour of the cmp_tool has changed. From now on, the compressed data will be preceded by a header by default. The old behaviour can be achieved with the `--no_header` option.
 - Implement the compression entity header as defined in PLATO-UVIE-PL-UM-0001 for compression and decompression
 - small bug fixes
 
-## [0.06] - 12-11-2021
+## [0.06] - 2021-11-12
 - if samples = 0 the cmp_tool counts the samples in the data file and uses them
 - if buffer_length = 0 the 2*samples parameter is used as buffer_length
 - added feature to guess the compression configuration
@@ -71,30 +127,30 @@ E.g. "# comment\n ABCD 1    2\n34B 12\n" are interpreted as {0xAB, 0xCD,
 - added more detailed error messages
 - small bug fixes
 
-## [0.05] - 23-04-2021
+## [0.05] - 2021-04-23
 ### Removed
 - discard old file format. Now the only input format is like: 12 AB 23 CD .. ..
 ### Changed
 - change to new compression and decompression library
 
-## [0.05 Beta 2] - 04-12-2020
+## [0.05 Beta 2] - 2020-12-04
 ### Fixed
 - packet file number now 4 digits long
 - now the mtu size in .rdcu_pkt_mode_cfg file for the data packets
 
-## [0.05 Beta] - 17-11-2020
+## [0.05 Beta] - 2020-11-17
 ### Fixed
 - fixes small errors when reading the data
 ### Added
-- add frame script to mange multiple compression in a raw
+- add frame script to manage multiple compression in a raw
 - add last_info option to generate RMAP packets to read the last compression results in parallel
 
-## [0.04] - 12-08-2020
+## [0.04] - 2020-08-12
 ### Fixed
 - fixes an error when reading compressed data for decompression when compiled for a 32-bit system where a long integer has 4 bytes
 - fixes a bug that generates wrong packets for reading data from the RDCU with the --rdcu_pkt option
 
-## [0.03] - 07-07-2020
+## [0.03] - 2020-07-07
 ### Added
 - README: add a note for the --rdcu_pkt option
 ### Fixed
@@ -103,7 +159,7 @@ E.g. "# comment\n ABCD 1    2\n34B 12\n" are interpreted as {0xAB, 0xCD,
 - if the --rdcu_pkt option is set the program now also sets the RDCU Interrupt Enable bit.
 - fix typo in Help and README
 
-## [0.02] - 02-06-2020
+## [0.02] - 2020-06-02
 ### Added
 - add --rdcu_pkt option to generate the packets to set a RDCU compression
 - add --model_cfg, --diff_cfg option to print default model/1d-diff configuration
@@ -116,8 +172,6 @@ E.g. "# comment\n ABCD 1    2\n34B 12\n" are interpreted as {0xAB, 0xCD,
 ### Removed
 - removes comma symbol as indicator for a comment
 
-## [0.01] - 06-05-2020
+## [0.01] - 2020-05-06
 ### Added
 - initialte realse
-
-
diff --git a/INSTALL.md b/INSTALL.md
index 98ba3ce9f426a210bbaf28108ce05d5b58f6a2f2..7812d582ee80a5108f7eac610b797ab65a46260c 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,6 +1,5 @@
 # Installation Instructions
 ## Getting started
-
 ### Install git and python 3.7+
 
 If you're on Linux, you probably already have these. On macOS and Windows, you can use the
@@ -8,7 +7,7 @@ If you're on Linux, you probably already have these. On macOS and Windows, you c
 
 ### Install meson and ninja
 
-Meson 0.63 or newer is required.  
+Meson 0.63 or newer is required.
 You can get meson through your package manager or using:
 
 ```
@@ -26,9 +25,10 @@ binary in your PATH.
 We use the version control system [git](https://git-scm.com/downloads) to get a copy of the source code.
 
 ```
-git clone https://gitlab.phaidra.org/loidoltd15/cmp_tool.git  
+git clone https://gitlab.phaidra.org/loidoltd15/cmp_tool.git
 cd cmp_tool
 ```
+
 ## Build the cmp\_tool
 ### Build the cmp\_tool for Debugging
 
@@ -71,7 +71,7 @@ meson compile cmp_tool
 ```
 
 ### Cross-compile for Windows
-Cross-compile for Windows is also possible with the [Mingw-w64 toolchain](https://www.mingw-w64.org/downloads/). To cross-compile for Windows use the following commands: 
+Cross-compile for Windows is also possible with the [Mingw-w64 toolchain](https://www.mingw-w64.org/downloads/). To cross-compile for Windows use the following commands:
 
 ```
 meson setup builddir_cross_win --cross-file=mingw-w64-64.txt
@@ -82,12 +82,13 @@ meson compile cmp_tool
 ## Tests
 ### External dependencies
 
-To run the unit tests you need the [ruby interpreter](https://www.ruby-lang.org/en/documentation/installation/).  
+To run the unit tests you need the [ruby interpreter](https://www.ruby-lang.org/en/documentation/installation/).
 To run the cmp\_tool interface test you need the [pytest](https://docs.pytest.org/en/7.0.x/index.html) framework. The easiest way to install pytest is with `pip3`:
 
 ```
 pip3 install pytest
 ```
+
 ### Run tests
 First, cd in the build directory:
 
@@ -115,14 +116,14 @@ meson test --gdb <testname>
 
 ### Producing a coverage report
 
-First, configure the build with this command.
+First, ensure that either `gcovr` or `lcov` is installed as a dependency for generating coverage reports.
 
 ```
 cd <name of the build directory>
 meson configure -Db_coverage=true
 ```
 
-Then issue the following commands.
+Then issue the following commands:
 
 ```
 meson test
@@ -130,6 +131,13 @@ ninja coverage-html
 ```
 
 The coverage report can be found in the `meson-logs/coveragereport` subdirectory.
+
+To reset the coverage data, use the following command:
+
+```
+ninja clean-gcda
+```
+
 ### Benchmarking
 
 To run the compression speed test bench, follow these steps:
@@ -139,9 +147,8 @@ cd <name of the build directory>
 meson test --benchmark
 ```
 
-
 ### Fuzzing
-If you’re unfamiliar with fuzzing and libFuzzer, you can find a tutorial [here](https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md). 
+If you’re unfamiliar with fuzzing and libFuzzer, you can find a tutorial [here](https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md).
 To perform fuzzing with libFuzzer, AddressSanitizer, and UndefinedBehaviorSanitizer, follow these steps:
 
 Set up your build directory with the necessary configurations. Note that you’ll need a clang version that has libFuzzer support. Use the following command:
@@ -152,7 +159,7 @@ meson setup builddir_fuzzing \
   --buildtype=plain \
   -Dfuzzer=enabled \
   -Dfuzzer_ldflags=-fsanitize=fuzzer \
-  -Dc_args="-O1 -gline-tables-only -fsanitize-address-use-after-scope -fsanitize=fuzzer-no-link" \
+  -Dc_args="-O1 -gline-tables-only -fsanitize=fuzzer-no-link" \
   -Db_sanitize=address,undefined \
   -Ddebug_level=0 \
   -Ddefault_library=static \
@@ -172,10 +179,24 @@ meson test fuzz_round_trip\ 10\ min --verbose
 
 Happy fuzzing! 🚀
 
-## Documentation 
+#### Fuzzing on macOS
+When fuzzing on macOS, the default clang installation does not support libFuzzer. To properly set up fuzzing on macOS, you'll need to install the LLVM toolchain using Homebrew (`brew install llvm`) and specify the correct library paths.
+When running the meson setup commands, you'll need to set the `LDFLAGS` environment variable to use the Homebrew-installed version of the C++ library:
+
+```
+LDFLAGS="-L$HOMEBREW_PREFIX/opt/llvm/lib/c++" \
+CC=$HOMEBREW_PREFIX/opt/llvm/bin/clang \
+CXX=$HOMEBREW_PREFIX/opt/llvm/bin/clang++ \
+meson setup builddir_fuzzing \
+	# other fuzzing options from above
+```
+
+This ensures the fuzzer is built using the Homebrew-installed Clang and Clang++ compilers, which support libFuzzer, and links against Clang's corresponding C++ library.
+
+## Documentation
 ### External dependencies
 To generate the documentation you need the [Doxygen](https://www.doxygen.nl/index.html) program.
-Optional you can install the "dot" tool from [graphviz](http://www.graphviz.org/) to generate more advanced diagrams and graphs.  
+Optional you can install the "dot" tool from [graphviz](http://www.graphviz.org/) to generate more advanced diagrams and graphs.
 
 ### Generate Documentation
 
diff --git a/README.md b/README.md
index 0051d3b67be236ed7f288b649396c2c790d40be4..5dad24c3f801bc83171c268ff9a0640fe33a4dbd 100644
--- a/README.md
+++ b/README.md
@@ -51,30 +51,37 @@ The generated packets can be found in the `TC_FILES` directory.
 | `-i <file>` | File containing the decompression information (required if --no_header was used)|
 
 ### Guessing Options
+| Options                 | Description                                                            |
+|:------------------------|:-----------------------------------------------------------------------|
+| `--guess <rdcu|chunk>`  | Search for a good configuration for compression RDCU or chunk data set |
+| `-d <file>`             | File containing the data to be compressed                              |
+| `-m <file>`             | File containing the model of the data to be compressed                 |
+| `--guess_level <level>` | Set guess level to \<level\> (optional)<sup>[4](#fnote4)</sup>         |
 
-| Options                 | Description                                                                     |
-|:------------------------|:--------------------------------------------------------------------------------|
-| `--guess <mode>`        | Search for a good configuration for compression \<mode\><sup>[4](#fnote4)</sup> |
-| `-d <file>`             | File containing the data to be compressed                                       |
-| `-m <file>`             | File containing the model of the data to be compressed                          |
-| `--guess_level <level>` | Set guess level to \<level\> (optional)<sup>[5](#fnote5)</sup>                  |
-
-<a name="fnote4">4</a>) **NOTE:** \<mode\> can be either the compression mode
-number or the keyword: `RDCU`. The RDCU mode automatically selects the correct
-RDCU-compatible compression mode depending on if the Model (-m) option is set.  
-<a name="fnote5">5</a>) **Supported levels:** 
+<a name="fnote4">4</a>) **Supported levels:** 
 
 | guess level | Description                     |
 |:------------|:--------------------------------|
-| `1`         | fast mode (not implemented yet) |
+| `1`         | fast mode                       |
 | `2`         | default mode                    |
-| `3`         | brute force                     |
+| `3`         | slow mode (better results)      |
+
+Lower values increase step size (coarser search), while higher values decrease step size (finer search).
+
+#### Examples of Compression Parameter guessing:
+
+```bash
+# RDCU data compression guessing
+./cmp_tool --guess rdcu -d test_data/test_data1.dat -o rdcu_guess
 
-**Example of Compression Parameter guessing:**
+# Chunk mode guessing
+./cmp_tool --guess chunk -d chunk_data.dat -o chunk_guess
 
-``./cmp_tool --guess RDCU -d test_data/test_data1.dat -o myguess``
+# Custom guess level with model
+./cmp_tool --guess chunk -d chunk_data.dat -m chunk_model.dat --guess_level 3 -o chunk_guess_3
+```
 
-This command creates the file `myguess.cfg` with the guessed compression parameters.
+These commands create `.cfg` files for RDCU compression parameters. For chunk mode, a `.par` file is created containing all parameters for chunk compression.
 
 ### Data Format
 The input data is formatted as hexadecimal numbers.
diff --git a/doc/doxygen/Doxyfile.in b/doc/doxygen/Doxyfile.in
index 54ee23933e6766ad83d887bc7fa91c33451cdfdd..8af201ef9f0699aed46f5239cbae4268525d5bd2 100644
--- a/doc/doxygen/Doxyfile.in
+++ b/doc/doxygen/Doxyfile.in
@@ -86,7 +86,7 @@ CREATE_SUBDIRS         = NO
 # level increment doubles the number of directories, resulting in 4096
 # directories at level 8 which is the default and also the maximum value. The
 # sub-directories are organized in 2 levels, the first level always has a fixed
-# numer of 16 directories.
+# number of 16 directories.
 # Minimum value: 0, maximum value: 8, default value: 8.
 # This tag requires that the tag CREATE_SUBDIRS is set to YES.
 
@@ -485,7 +485,7 @@ LOOKUP_CACHE_SIZE      = 0
 # DOT_NUM_THREADS setting.
 # Minimum value: 0, maximum value: 32, default value: 1.
 
-NUM_PROC_THREADS       = 0
+NUM_PROC_THREADS       = 1
 
 #---------------------------------------------------------------------------
 # Build related configuration options
@@ -912,9 +912,9 @@ INPUT                  = @SRCDIR@/lib \
                          @SRCDIR@/README.md \
                          @SRCDIR@/INSTALL.md \
                          @SRCDIR@/how_to_no_header.md \
-                         @SRCDIR@/include \
                          @SRCDIR@/test \
-                         @SRCDIR@/cmp_tool.c
+                         @SRCDIR@/programs \
+                         @SRCDIR@/examples
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@@ -1385,14 +1385,6 @@ HTML_COLORSTYLE_SAT    = 255
 
 HTML_COLORSTYLE_GAMMA  = 113
 
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to YES can help to show when doxygen was last run and thus if the
-# documentation is up to date.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_TIMESTAMP         = NO
 
 # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
 # documentation will contain a main index with vertical navigation menus that
@@ -2054,14 +2046,6 @@ LATEX_HIDE_INDICES     = NO
 
 LATEX_BIB_STYLE        = plain
 
-# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_TIMESTAMP        = NO
-
 # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
 # path from which the emoji images will be read. If a relative path is entered,
 # it will be relative to the LATEX_OUTPUT directory. If left blank the
@@ -2289,7 +2273,7 @@ ENABLE_PREPROCESSING   = YES
 # The default value is: NO.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-MACRO_EXPANSION        = NO
+MACRO_EXPANSION        = YES
 
 # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
 # the macro expansion is limited to the macros specified with the PREDEFINED and
@@ -2297,7 +2281,7 @@ MACRO_EXPANSION        = NO
 # The default value is: NO.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-EXPAND_ONLY_PREDEF     = NO
+EXPAND_ONLY_PREDEF     = YES
 
 # If the SEARCH_INCLUDES tag is set to YES, the include files in the
 # INCLUDE_PATH will be searched if a #include is found.
@@ -2330,7 +2314,9 @@ INCLUDE_FILE_PATTERNS  =
 # recursively expanded use the := operator instead of the = operator.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-PREDEFINED             =
+PREDEFINED             = __attribute__((packed))= \
+                         UNUSED= \
+                         MAYBE_UNUSED=
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
 # tag can be used to specify a list of macro names that should be expanded. The
diff --git a/doc/doxygen/doxygen-awesome-css b/doc/doxygen/doxygen-awesome-css
index e829184be56fd0d6212f495b29782ffdd53ae04a..af1d9030b3ffa7b483fa9997a7272fb12af6af4c 160000
--- a/doc/doxygen/doxygen-awesome-css
+++ b/doc/doxygen/doxygen-awesome-css
@@ -1 +1 @@
-Subproject commit e829184be56fd0d6212f495b29782ffdd53ae04a
+Subproject commit af1d9030b3ffa7b483fa9997a7272fb12af6af4c
diff --git a/examples/example_cmp_icu.c b/examples/example_cmp_icu.c
deleted file mode 100644
index f0d783e8523fc7e2177bcf81a57b1147a44a5600..0000000000000000000000000000000000000000
--- a/examples/example_cmp_icu.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/**
- * @file   example_cmp_icu.c
- * @author Dominik Loidolt (dominik.loidolt@univie.ac.at)
- * @date   Oct 2023
- *
- * @copyright GPLv2
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * @brief demonstration of the use of the software compressor and the
- *	compression entity library
- */
-
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <leon_inttypes.h>
-
-#include <cmp_entity.h>
-#include <cmp_icu.h>
-
-
-#define DATA_SAMPLES 6 /* number of 16 bit samples to compress */
-#define CMP_BUF_LEN_SAMPLES DATA_SAMPLES /* compressed buffer has the same sample size as the data buffer */
-#define CMP_ASW_VERSION_ID 1
-/* The start_time, end_time, model_id and counter have to be managed by the ASW
- * here we use arbitrary values for demonstration */
-#define START_TIME 0
-#define END_TIME 0x23
-#define MODEL_ID 42
-#define MODEL_COUNTER 1
-
-
-static int demo_icu_compression(void)
-{
-	struct cmp_cfg example_cfg;
-	struct cmp_entity *cmp_entity = NULL;
-	uint32_t i, cmp_buf_size, entity_buf_size, entity_size;
-	int cmp_size_bits;
-	void *ent_cmp_data;
-
-	/* declare data buffers with some example data */
-	enum cmp_data_type example_data_type = DATA_TYPE_IMAGETTE;
-	uint16_t example_data[DATA_SAMPLES] = {42, 23, 1, 13, 20, 1000};
-	uint16_t example_model[DATA_SAMPLES] = {0, 22, 3, 42, 23, 16};
-	uint16_t updated_model[DATA_SAMPLES] = {0};
-
-	/* create a compression configuration with default values */
-	example_cfg = cmp_cfg_icu_create(example_data_type, CMP_DEF_IMA_MODEL_CMP_MODE,
-					 CMP_DEF_IMA_MODEL_MODEL_VALUE, CMP_LOSSLESS);
-	if (example_cfg.data_type == DATA_TYPE_UNKNOWN) {
-		printf("Error occurred during cmp_cfg_icu_create()\n");
-		goto fail;
-	}
-
-	/* configure imagette specific compression parameters with default values */
-	if (cmp_cfg_icu_imagette(&example_cfg, CMP_DEF_IMA_MODEL_GOLOMB_PAR,
-				 CMP_DEF_IMA_MODEL_SPILL_PAR)) {
-		printf("Error occurred during cmp_cfg_icu_imagette()\n");
-		goto fail;
-	}
-
-	/* get the size of the buffer for the compressed data in bytes */
-	cmp_buf_size = cmp_cfg_icu_buffers(&example_cfg, example_data,
-					   DATA_SAMPLES, example_model,
-					   updated_model, NULL,
-					   CMP_BUF_LEN_SAMPLES);
-	if (!cmp_buf_size) {
-		printf("Error occurred during cmp_cfg_icu_buffers()\n");
-		goto fail;
-	}
-
-	/* create a compression entity */
-	#define NO_CMP_MODE_RAW_USED 0
-	entity_buf_size = cmp_ent_create(NULL, example_data_type, NO_CMP_MODE_RAW_USED,
-					 cmp_buf_size);
-	if (!entity_buf_size) {
-		printf("Error occurred during cmp_ent_create()\n");
-		goto fail;
-	}
-	cmp_entity = malloc(entity_buf_size); /* allocated memory for the compression entity */
-	if (!cmp_entity) {
-		printf("malloc failed!\n");
-		goto fail;
-	}
-	entity_buf_size = cmp_ent_create(cmp_entity, example_data_type,
-					 NO_CMP_MODE_RAW_USED, cmp_buf_size);
-	if (!entity_buf_size) {
-		printf("Error occurred during cmp_ent_create()\n");
-		goto fail;
-	}
-
-	/*
-	 * Configure the buffer related settings. We put the compressed data directly
-	 * into the compression entity. In this way we do not need to copy the
-	 * compressed data into the compression entity
-	 */
-	ent_cmp_data = cmp_ent_get_data_buf(cmp_entity);
-	if (!ent_cmp_data) {
-		printf("Error occurred during cmp_ent_get_data_buf()\n");
-		goto fail;
-	}
-	cmp_buf_size = cmp_cfg_icu_buffers(&example_cfg, example_data,
-					   DATA_SAMPLES, example_model,
-					   updated_model, ent_cmp_data,
-					   CMP_BUF_LEN_SAMPLES);
-	if (!cmp_buf_size) {
-		printf("Error occurred during cmp_cfg_icu_buffers()\n");
-		goto fail;
-	}
-
-	/* now we compress the data on the ICU */
-	cmp_size_bits = icu_compress_data(&example_cfg);
-	if (cmp_size_bits < 0) {
-		printf("Error occurred during icu_compress_data()\n");
-		if (cmp_size_bits == CMP_ERROR_SMALL_BUF)
-			printf("The compressed data buffer is too small to hold all compressed data!\n");
-		if (cmp_size_bits == CMP_ERROR_HIGH_VALUE)
-			printf("A data or model value is bigger than the max_used_bits parameter "
-			       "allows (set with the cmp_cfg_icu_max_used_bits() function)!\n");
-		goto fail;
-	}
-
-	/* now we set all the parameters in the compression entity header */
-	/*
-	 * NOTE: the size of the compress entity is smaller than the buffer size
-	 * we have allocated for it (entity_buf_size), because the compressed
-	 * data (fortunately) does not use the entire buffer we have provided
-	 * for it
-	 */
-	entity_size = cmp_ent_build(cmp_entity, CMP_ASW_VERSION_ID, START_TIME, END_TIME,
-				    MODEL_ID, MODEL_COUNTER, &example_cfg, cmp_size_bits);
-	if (!entity_size) {
-		printf("Error occurred during cmp_ent_build()\n");
-		goto fail;
-	}
-
-	printf("Here's the compressed entity (size %"PRIu32"):\n"
-	       "=========================================\n", entity_size);
-	for (i = 0; i < entity_size; i++) {
-		uint8_t *p = (uint8_t *)cmp_entity; /* the compression entity is big-endian */
-		printf("%02X ", p[i]);
-		if (i && !((i + 1) % 32))
-			printf("\n");
-	}
-	printf("\n\nHere's the updated model (samples=%u):\n"
-	       "=========================================\n", DATA_SAMPLES);
-	for (i = 0; i < DATA_SAMPLES; i++) {
-		printf("%04X ", updated_model[i]);
-		if (i && !((i + 1) % 20))
-			printf("\n");
-	}
-	printf("\n");
-
-	free(cmp_entity);
-	return 0;
-
-fail:
-	free(cmp_entity);
-	return -1;
-}
-
-
-int main(void)
-{
-	return demo_icu_compression();
-}
diff --git a/examples/example_cmp_rdcu.c b/examples/example_cmp_rdcu.c
index 93c76dfa469604502d9cf8ff41b1f72d86b62f6c..69b385f50afd6fb023c6f0b395cf5a69dba28a0c 100644
--- a/examples/example_cmp_rdcu.c
+++ b/examples/example_cmp_rdcu.c
@@ -52,12 +52,11 @@ int demo_rdcu_compression(void)
 	int cnt = 0;
 
 	/* declare configuration, status and information structure */
-	struct cmp_cfg example_cfg;
+	struct rdcu_cfg example_rcfg;
 	struct cmp_status example_status;
 	struct cmp_info example_info;
 
 	/* declare data buffers with some example data */
-	enum cmp_data_type example_data_type = DATA_TYPE_IMAGETTE_ADAPTIVE;
 	uint16_t data[DATA_SAMPLES] = {42, 23, 1, 13, 20, 1000};
 	uint16_t model[DATA_SAMPLES] = {0, 22, 3, 42, 23, 16};
 
@@ -66,20 +65,19 @@ int demo_rdcu_compression(void)
 	rdcu_rmap_init(MAX_PAYLOAD_SIZE, rmap_tx, rmap_rx);
 
 	/* set up compressor configuration */
-	example_cfg = rdcu_cfg_create(example_data_type, CMP_DEF_IMA_MODEL_CMP_MODE,
-				      CMP_DEF_IMA_MODEL_MODEL_VALUE, CMP_DEF_IMA_MODEL_LOSSY_PAR);
-	if (example_cfg.data_type == DATA_TYPE_UNKNOWN) {
+	if(rdcu_cfg_create(&example_rcfg, CMP_DEF_IMA_MODEL_CMP_MODE,
+			   CMP_DEF_IMA_MODEL_MODEL_VALUE, CMP_DEF_IMA_MODEL_LOSSY_PAR)) {
 		printf("Error occurred during rdcu_cfg_create()\n");
 		return -1;
 	}
 
-	if (rdcu_cfg_buffers(&example_cfg, data, DATA_SAMPLES, model, CMP_DEF_IMA_MODEL_RDCU_DATA_ADR,
+	if (rdcu_cfg_buffers(&example_rcfg, data, DATA_SAMPLES, model, CMP_DEF_IMA_MODEL_RDCU_DATA_ADR,
 			     CMP_DEF_IMA_MODEL_RDCU_MODEL_ADR, CMP_DEF_IMA_MODEL_RDCU_UP_MODEL_ADR,
 			     CMP_DEF_IMA_MODEL_RDCU_BUFFER_ADR, CMP_BUF_LEN_SAMPLES)) {
 		printf("Error occurred during rdcu_cfg_buffers()\n");
 		return -1;
 	}
-	if (rdcu_cfg_imagette(&example_cfg,
+	if (rdcu_cfg_imagette(&example_rcfg,
 			      CMP_DEF_IMA_MODEL_GOLOMB_PAR, CMP_DEF_IMA_MODEL_SPILL_PAR,
 			      CMP_DEF_IMA_MODEL_AP1_GOLOMB_PAR, CMP_DEF_IMA_MODEL_AP1_SPILL_PAR,
 			      CMP_DEF_IMA_MODEL_AP2_GOLOMB_PAR, CMP_DEF_IMA_MODEL_AP2_SPILL_PAR)) {
@@ -88,7 +86,7 @@ int demo_rdcu_compression(void)
 	}
 
 	/* start HW compression */
-	if (rdcu_compress_data(&example_cfg)) {
+	if (rdcu_compress_data(&example_rcfg)) {
 		printf("Error occurred during rdcu_compress_data()\n");
 		return -1;
 	}
@@ -140,16 +138,16 @@ int demo_rdcu_compression(void)
 	}
 
 	/* build a compression entity and put compressed data from the RDCU into it and print */
-	if (1) {
+	{
 		struct cmp_entity *cmp_ent;
 		void *cmp_ent_data;
 		size_t cmp_ent_size;
 		uint32_t i, s;
 
 		/* get the size of the compression entity */
-		cmp_ent_size = cmp_ent_build(NULL, CMP_ASW_VERSION_ID,
-					     START_TIME, END_TIME, MODEL_ID, MODEL_COUNTER,
-					     &example_cfg, (int)example_info.cmp_size);
+		cmp_ent_size = cmp_ent_create(NULL, DATA_TYPE_IMAGETTE_ADAPTIVE,
+					      example_info.cmp_mode_used == CMP_MODE_RAW,
+					      cmp_bit_to_byte(example_info.cmp_size));
 		if (!cmp_ent_size) {
 			printf("Error occurred during cmp_ent_build()\n");
 			return -1;
@@ -163,14 +161,39 @@ int demo_rdcu_compression(void)
 		}
 
 		/* now let us build the compression entity */
-		cmp_ent_size = cmp_ent_build(cmp_ent, CMP_ASW_VERSION_ID,
-					     START_TIME, END_TIME, MODEL_ID, MODEL_COUNTER,
-					     &example_cfg, (int)example_info.cmp_size);
+		cmp_ent_size = cmp_ent_create(cmp_ent, DATA_TYPE_IMAGETTE_ADAPTIVE,
+					      example_info.cmp_mode_used == CMP_MODE_RAW,
+					      cmp_bit_to_byte(example_info.cmp_size));
 		if (!cmp_ent_size) {
 			printf("Error occurred during cmp_ent_build()\n");
 			return -1;
 		}
 
+		if (cmp_ent_set_version_id(cmp_ent, CMP_ASW_VERSION_ID)) {
+			printf("Error occurred during cmp_ent_set_version_id()\n");
+			return -1;
+		}
+		if (cmp_ent_set_start_timestamp(cmp_ent, START_TIME)) {
+			printf("Error occurred during cmp_ent_set_start_timestamp()\n");
+			return -1;
+		}
+		if (cmp_ent_set_end_timestamp(cmp_ent, END_TIME)) {
+			printf("Error occurred during cmp_ent_set_end_timestamp()\n");
+			return -1;
+		}
+		if (cmp_ent_set_model_id(cmp_ent, MODEL_ID)) {
+			printf("Error occurred during cmp_ent_set_model_id()\n");
+			return -1;
+		}
+		if (cmp_ent_set_model_counter(cmp_ent, MODEL_COUNTER)) {
+			printf("Error occurred during cmp_ent_set_model_counter()\n");
+			return -1;
+		}
+		if (cmp_ent_write_rdcu_cmp_pars(cmp_ent, &example_info, &example_rcfg)) {
+			printf("Error occurred during cmp_ent_write_rdcu_cmp_pars()\n");
+			return -1;
+		}
+
 		/* get the address to store the compressed data in the
 		 * compression entity */
 		cmp_ent_data = cmp_ent_get_data_buf(cmp_ent);
diff --git a/examples/example_compress_chunk.c b/examples/example_compress_chunk.c
index 900eb0177373f7dc4b87b17b89b3b0f54b8c1b25..4ca542e00b4d5234c6d0b21c4ff4264a6aff4eaa 100644
--- a/examples/example_compress_chunk.c
+++ b/examples/example_compress_chunk.c
@@ -149,7 +149,7 @@ static int demo_comperss_chunk_1d(void)
 	{	/* have a look at the compressed data */
 		uint32_t i;
 
-		printf("Here's the compressed data including the compression entity header (size %d):\n", cmp_size_bytes);
+		printf("Here's the compressed data including the compression entity header (size %u):\n", cmp_size_bytes);
 		for (i = 0; i < cmp_size_bytes; i++) {
 			const uint8_t *p = (uint8_t *)compressed_data; /* the compression entity is big-endian */
 			printf("%02X ", p[i]);
@@ -270,7 +270,7 @@ static int demo_comperss_chunk_model(void)
 	{	/* have a look at the compressed data */
 		uint32_t i;
 
-		printf("Here's the compressed data including the compression entity header (size %d):\n", cmp_size_bytes);
+		printf("Here's the compressed data including the compression entity header (size %u):\n", cmp_size_bytes);
 		for (i = 0; i < cmp_size_bytes; i++) {
 			const uint8_t *p = (uint8_t *)compressed_data; /* the compression entity is big-endian */
 			printf("%02X ", p[i]);
diff --git a/examples/meson.build b/examples/meson.build
index d83ac4014ab4ab398fa868f68db5cd3d55a3f9ab..909339eedb86d64b6926989f205913cc193e05f9 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -1,19 +1,8 @@
-example_cmp_icu_src = files([
-  'example_cmp_icu.c'
-])
-
-example_cmp_icu_exe = executable('example_cmp_icu',
-  sources : example_cmp_icu_src,
-  include_directories : incdir,
-  link_with : cmp_lib,
-)
-
-
 example_cmp_rdcu_src = files([
   'example_cmp_rdcu.c'
 ])
 
-example_cmp_rdcu_lib = executable('example_cmp_rdcu',
+example_cmp_rdcu_lib = static_library('example_cmp_rdcu',
   sources : example_cmp_rdcu_src,
   include_directories : incdir,
   link_with : cmp_lib,
diff --git a/lib/cmp_chunk.h b/lib/cmp_chunk.h
index 114c95202440cc1c920ffd498148cea459bc8802..60835076c051f11796b5f18e83a7c143617f8ab8 100644
--- a/lib/cmp_chunk.h
+++ b/lib/cmp_chunk.h
@@ -20,10 +20,18 @@
 #ifndef CMP_CHUNK_H
 #define CMP_CHUNK_H
 
+#include <stddef.h>
+#include <stdint.h>
+
 #include "common/cmp_support.h"
 #include "common/cmp_entity.h"
 #include "common/cmp_error_list.h"
 
+/* valid specific compression parameter ranges for chunk compression
+ * (every parameter except cmp_mode, model_value, lossy_par)
+ */
+#define MIN_CHUNK_CMP_PAR	1U
+#define MAX_CHUNK_CMP_PAR	UINT16_MAX /* the compression entity does not allow larger values */
 
 #define ROUND_UP_TO_4(x) ((((x)+3)/4)*4)
 
@@ -61,44 +69,49 @@
 )
 
 
+/**
+ * @struct cmp_par
+ * @brief structure containing all the compression parameters needed for chunk compression
+ */
+
 struct cmp_par {
 	enum cmp_mode cmp_mode;		/**< compression mode parameter */
 	uint32_t model_value;		/**< model weighting parameter */
 	uint32_t lossy_par;		/**< lossy compression parameter */
 
-	uint32_t nc_imagette;		/**< compression parameter for imagette data compression */
-
-	uint32_t s_exp_flags;		/**< compression parameter for exposure flags compression */
-	uint32_t s_fx;			/**< compression parameter for normal flux compression */
-	uint32_t s_ncob;		/**< compression parameter for normal center of brightness compression */
-	uint32_t s_efx;			/**< compression parameter for extended flux compression */
-	uint32_t s_ecob;		/**< compression parameter for executed center of brightness compression */
-
-	uint32_t l_exp_flags;		/**< compression parameter for exposure flags compression */
-	uint32_t l_fx;			/**< compression parameter for normal flux compression */
-	uint32_t l_ncob;		/**< compression parameter for normal center of brightness compression */
-	uint32_t l_efx;			/**< compression parameter for extended flux compression */
-	uint32_t l_ecob;		/**< compression parameter for executed center of brightness compression */
-	uint32_t l_fx_cob_variance;	/**< compression parameter for flux/COB variance compression */
-
-	uint32_t saturated_imagette;	/**< compression parameter for saturated  imagette data compression */
-
-	uint32_t nc_offset_mean;
-	uint32_t nc_offset_variance;
-	uint32_t nc_background_mean;
-	uint32_t nc_background_variance;
-	uint32_t nc_background_outlier_pixels;
-
-	uint32_t smearing_mean;
-	uint32_t smearing_variance_mean;
-	uint32_t smearing_outlier_pixels;
-
-	uint32_t fc_imagette;
-	uint32_t fc_offset_mean;
-	uint32_t fc_offset_variance;
-	uint32_t fc_background_mean;
-	uint32_t fc_background_variance;
-	uint32_t fc_background_outlier_pixels;
+	uint32_t nc_imagette;		/**< compression parameter for imagette compression */
+
+	uint32_t s_exp_flags;		/**< compression parameter for short cadence exposure flags data */
+	uint32_t s_fx;			/**< compression parameter for short cadence normal flux data */
+	uint32_t s_ncob;		/**< compression parameter for short cadence normal center of brightness data */
+	uint32_t s_efx;			/**< compression parameter for short cadence extended flux data  */
+	uint32_t s_ecob;		/**< compression parameter for short cadence extended center of brightness data */
+
+	uint32_t l_exp_flags;		/**< compression parameter for long cadence exposure flags data */
+	uint32_t l_fx;			/**< compression parameter for long cadence normal flux data */
+	uint32_t l_ncob;		/**< compression parameter for long cadence normal center of brightness data */
+	uint32_t l_efx;			/**< compression parameter for long cadence extended flux data using extended mask */
+	uint32_t l_ecob;		/**< compression parameter for long cadence extended center of brightness data */
+	uint32_t l_fx_cob_variance;	/**< compression parameter for long cadence flux/COB variance data */
+
+	uint32_t saturated_imagette;	/**< compression parameter for saturated imagette data */
+
+	uint32_t nc_offset_mean;		/**< compression parameter for normal camera offset mean data */
+	uint32_t nc_offset_variance;		/**< compression parameter for normal camera offset variance data */
+	uint32_t nc_background_mean;		/**< compression parameter for normal camera background mean data */
+	uint32_t nc_background_variance;	/**< compression parameter for normal camera background variance data */
+	uint32_t nc_background_outlier_pixels;	/**< compression parameter for normal camera background outlier pixels data */
+
+	uint32_t smearing_mean;			/**< compression parameter for smearing mean data */
+	uint32_t smearing_variance_mean;	/**< compression parameter for smearing variance mean data */
+	uint32_t smearing_outlier_pixels;	/**< compression parameter for smearing outlier pixels data */
+
+	uint32_t fc_imagette;			/**< compression parameter for fast camera imagette data */
+	uint32_t fc_offset_mean;		/**< compression parameter for fast camera offset mean data */
+	uint32_t fc_offset_variance;		/**< compression parameter for fast camera offset variance data */
+	uint32_t fc_background_mean;		/**< compression parameter for fast camera background mean data */
+	uint32_t fc_background_variance;	/**< compression parameter for fast camera background variance data */
+	uint32_t fc_background_outlier_pixels;	/**< compression parameter for fast camera background outlier pixels data */
 };
 
 
@@ -134,7 +147,7 @@ uint32_t compress_chunk_cmp_size_bound(const void *chunk, size_t chunk_size);
  * @param version_id		application software version identifier
  */
 
-void compress_chunk_init(uint64_t(return_timestamp)(void), uint32_t version_id);
+void compress_chunk_init(uint64_t (*return_timestamp)(void), uint32_t version_id);
 
 
 /**
@@ -153,19 +166,20 @@ void compress_chunk_init(uint64_t(return_timestamp)(void), uint32_t version_id);
  * @param dst			destination pointer to the compressed data
  *				buffer; has to be 4-byte aligned; can be NULL to
  *				only get the compressed data size
- * @param dst_capacity		capacity of the dst buffer;  it's recommended to
+ * @param dst_capacity		capacity of the dst buffer; it's recommended to
  *				provide a dst_capacity >=
  *				compress_chunk_cmp_size_bound(chunk, chunk_size)
  *				as it eliminates one potential failure scenario:
  *				not enough space in the dst buffer to write the
  *				compressed data; size is internally rounded down
  *				to a multiple of 4
+ * @param cmp_par		pointer to a compression parameters struct
  * @returns the byte size of the compressed data or an error code if it
  *	fails (which can be tested with cmp_is_error())
  */
 
-uint32_t compress_chunk(void *chunk, uint32_t chunk_size,
-			void *chunk_model, void *updated_chunk_model,
+uint32_t compress_chunk(const void *chunk, uint32_t chunk_size,
+			const void *chunk_model, void *updated_chunk_model,
 			uint32_t *dst, uint32_t dst_capacity,
 			const struct cmp_par *cmp_par);
 
@@ -208,7 +222,7 @@ unsigned int cmp_is_error(uint32_t code);
  * @returns a pointer to a string literal that describes the error code.
  */
 
-const char* cmp_get_error_name(uint32_t code);
+const char *cmp_get_error_name(uint32_t code);
 
 
 /**
@@ -230,7 +244,7 @@ enum cmp_error cmp_get_error_code(uint32_t code);
  * @returns a pointer to a string literal that describes the error code.
  */
 
-const char* cmp_get_error_string(enum cmp_error code);
+const char *cmp_get_error_string(enum cmp_error code);
 
 
 #endif /* CMP_CHUNK_H */
diff --git a/lib/cmp_icu.h b/lib/cmp_icu.h
index 1dedf3ebda3cb13d2b7082fc7a7b7d34457dabac..34dad7bfb9ae0e790028245fde2821ba57b003cb 100644
--- a/lib/cmp_icu.h
+++ b/lib/cmp_icu.h
@@ -20,43 +20,10 @@
 #ifndef CMP_ICU_H
 #define CMP_ICU_H
 
-#include "common/cmp_support.h"
-
-#define CMP_PAR_UNUSED 0
-
-/* create and setup a compression configuration */
-struct cmp_cfg cmp_cfg_icu_create(enum cmp_data_type data_type, enum cmp_mode cmp_mode,
-				  uint32_t model_value, uint32_t lossy_par);
-
-/* set up the different data buffers for an ICU compression */
-uint32_t cmp_cfg_icu_buffers(struct cmp_cfg *cfg, void *data_to_compress,
-			     uint32_t data_samples, void *model_of_data,
-			     void *updated_model, uint32_t *compressed_data,
-			     uint32_t compressed_data_len_samples);
+#include <stdint.h>
 
- /* set up the configuration parameters for an ICU imagette compression */
-int cmp_cfg_icu_imagette(struct cmp_cfg *cfg, uint32_t cmp_par,
-			 uint32_t spillover_par);
-
-/* set up the configuration parameters for a flux/COB compression */
-int cmp_cfg_fx_cob(struct cmp_cfg *cfg,
-		   uint32_t cmp_par_exp_flags, uint32_t spillover_exp_flags,
-		   uint32_t cmp_par_fx, uint32_t spillover_fx,
-		   uint32_t cmp_par_ncob, uint32_t spillover_ncob,
-		   uint32_t cmp_par_efx, uint32_t spillover_efx,
-		   uint32_t cmp_par_ecob, uint32_t spillover_ecob,
-		   uint32_t cmp_par_fx_cob_variance, uint32_t spillover_fx_cob_variance);
-
-/* set up the configuration parameters for an auxiliary science data compression */
-int cmp_cfg_aux(struct cmp_cfg *cfg,
-		uint32_t cmp_par_mean, uint32_t spillover_mean,
-		uint32_t cmp_par_variance, uint32_t spillover_variance,
-		uint32_t cmp_par_pixels_error, uint32_t spillover_pixels_error);
-
-/* set up the max_used_bits used for the compression */
-int cmp_cfg_icu_max_used_bits(struct cmp_cfg *cfg, const struct cmp_max_used_bits *max_used_bits);
+#include "common/cmp_support.h"
 
-/* start the compression */
-int icu_compress_data(const struct cmp_cfg *cfg);
+uint32_t compress_like_rdcu(const struct rdcu_cfg *rcfg, struct cmp_info *info);
 
 #endif /* CMP_ICU_H */
diff --git a/lib/cmp_rdcu.h b/lib/cmp_rdcu.h
index 0f4fe20549fb0afb089ad36e810d2d8a37e546e8..dc94d29fc48597ea8c7ec053a69c057015b0c572 100644
--- a/lib/cmp_rdcu.h
+++ b/lib/cmp_rdcu.h
@@ -39,7 +39,7 @@
 #define INVALID_ADDRESS_ERR_BIT	9 /* The bus master has received the “invalid address” status */
 
 
-int rdcu_compress_data(const struct cmp_cfg *cfg);
+int rdcu_compress_data(const struct rdcu_cfg *rcfg);
 
 int rdcu_read_cmp_status(struct cmp_status *status);
 
diff --git a/lib/common/cmp_cal_up_model.h b/lib/common/cmp_cal_up_model.h
index b1124778fda5e18259fdddc19312b809090c3d09..1651153ebb18f7a3db515837f3479714a5c64bf8 100644
--- a/lib/common/cmp_cal_up_model.h
+++ b/lib/common/cmp_cal_up_model.h
@@ -13,7 +13,7 @@
  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  * more details.
  *
- * @brief functions to calculate the update (new) model
+ * @brief functions to calculate the updated (new) model
  */
 
 #ifndef CMP_CAL_UP_MODEL_H
@@ -53,7 +53,7 @@
 
 
 /**
- * @brief implantation of the model update equation
+ * @brief implementation of the model update equation
  * @note check before that model_value is not greater than MAX_MODEL_VALUE
  *
  * @warning: Do not use this macro with types larger than uint32_t
@@ -69,17 +69,17 @@
 #define cmp_up_model(data, model, model_value, round)							\
 	__extension__											\
 	({												\
-		__typeof__(data) __ret;									\
+		uint32_t __ret;										\
 		switch (sizeof(data)) {									\
 		case sizeof(uint8_t):									\
 		case sizeof(uint16_t):									\
-			__ret = (__typeof__(__ret))cmp_up_model16(data, model, model_value, round);	\
+			__ret = cmp_up_model16(data, model, model_value, round);			\
 			break;										\
 		case sizeof(uint32_t):									\
-			__ret = (__typeof__(__ret))cmp_up_model32(data, model, model_value, round);	\
+			__ret = cmp_up_model32(data, model, model_value, round);			\
 			break;										\
 		}											\
-		__ret;											\
+		(__typeof__(data))__ret;								\
 	})
 
 
diff --git a/lib/common/cmp_data_types.c b/lib/common/cmp_data_types.c
index 11ebe418ddaea18a3643e4f2039ec22360eed06b..7a4f78f6ea659eff224a3305b54937bf4f8ab537 100644
--- a/lib/common/cmp_data_types.c
+++ b/lib/common/cmp_data_types.c
@@ -17,9 +17,11 @@
  */
 
 
+#include <stddef.h>
 #include <stdint.h>
 #include <limits.h>
 
+#include "compiler.h"
 #include "byteorder.h"
 #include "cmp_debug.h"
 #include "cmp_support.h"
@@ -504,6 +506,7 @@ uint8_t convert_cmp_data_type_to_subservice(enum cmp_data_type data_type)
 		break;
 	default:
 	case DATA_TYPE_UNKNOWN:
+	case DATA_TYPE_CHUNK:
 		debug_print("Error: Unknown compression data type!");
 		sst = (uint8_t)-1;
 	};
@@ -581,6 +584,7 @@ size_t size_of_a_sample(enum cmp_data_type data_type)
 	case DATA_TYPE_F_FX_EFX_NCOB_ECOB:
 		sample_size = sizeof(struct f_fx_efx_ncob_ecob);
 		break;
+	case DATA_TYPE_CHUNK:
 	case DATA_TYPE_UNKNOWN:
 	default:
 		debug_print("Error: Compression data type is not supported.");
@@ -590,70 +594,13 @@ size_t size_of_a_sample(enum cmp_data_type data_type)
 }
 
 
-/**
- * @brief calculate the need bytes for the data
- *
- * @param samples	number of data samples
- * @param data_type	compression data_type
- *
- * @note for non-imagette data program types the collection header size is added
- *
- * @returns the size in bytes to store the data sample; zero on failure
- */
-
-uint32_t cmp_cal_size_of_data(uint32_t samples, enum cmp_data_type data_type)
-{
-	size_t s = size_of_a_sample(data_type);
-	uint64_t x; /* use 64 bit to catch overflow */
-
-	if (!s)
-		return 0;
-
-	x = (uint64_t)s*samples;
-
-	if (!rdcu_supported_data_type_is_used(data_type))
-		x += COLLECTION_HDR_SIZE;
-
-	if (x > UINT_MAX) /* catch overflow */
-		return 0;
-
-	return (unsigned int)x;
-}
-
-
-/**
- * @brief calculates the number of samples for a given data size for the
- *	different compression modes
- *
- * @param size		size of the data in bytes
- * @param data_type	compression data type
- *
- * @returns the number samples for the given compression mode; negative on error
- */
-
-int32_t cmp_input_size_to_samples(uint32_t size, enum cmp_data_type data_type)
-{
-	uint32_t samples_size = (uint32_t)size_of_a_sample(data_type);
-
-	if (!samples_size)
-		return -1;
-
-	if (!rdcu_supported_data_type_is_used(data_type)) {
-		if (size < COLLECTION_HDR_SIZE)
-			return -1;
-		size -= COLLECTION_HDR_SIZE;
-	}
-
-	if (size % samples_size)
-		return -1;
-
-	return (int)(size/samples_size);
-}
-
-
 static uint32_t be24_to_cpu(uint32_t a)
 {
+#ifdef __LITTLE_ENDIAN
 	return be32_to_cpu(a) >> 8;
+#else
+	return a;
+#endif /* __LITTLE_ENDIAN */
 }
 
 
@@ -661,7 +608,7 @@ static void be_to_cpus_16(uint16_t *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		uint16_t tmp;
 
 		tmp = be16_to_cpu(get_unaligned(&a[i]));
@@ -674,7 +621,7 @@ static void be_to_cpus_offset(struct offset *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].mean = be32_to_cpu(a[i].mean);
 		a[i].variance = be32_to_cpu(a[i].variance);
 	}
@@ -685,7 +632,7 @@ static void be_to_cpus_background(struct background *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].mean = be32_to_cpu(a[i].mean);
 		a[i].variance = be32_to_cpu(a[i].variance);
 		a[i].outlier_pixels = be16_to_cpu(a[i].outlier_pixels);
@@ -697,7 +644,7 @@ static void be_to_cpus_smearing(struct smearing *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].mean = be32_to_cpu(a[i].mean);
 		a[i].variance_mean = be16_to_cpu(a[i].variance_mean);
 		a[i].outlier_pixels = be16_to_cpu(a[i].outlier_pixels);
@@ -709,7 +656,7 @@ static void be_to_cpus_s_fx(struct s_fx *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i)
+	for (i = 0; i < samples; i++)
 		a[i].fx = be32_to_cpu(a[i].fx);
 }
 
@@ -718,7 +665,7 @@ static void be_to_cpus_s_fx_efx(struct s_fx_efx *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].fx = be32_to_cpu(a[i].fx);
 		a[i].efx = be32_to_cpu(a[i].efx);
 	}
@@ -729,7 +676,7 @@ static void be_to_cpus_s_fx_ncob(struct s_fx_ncob *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].fx = be32_to_cpu(a[i].fx);
 		a[i].ncob_x = be32_to_cpu(a[i].ncob_x);
 		a[i].ncob_y = be32_to_cpu(a[i].ncob_y);
@@ -741,7 +688,7 @@ static void be_to_cpus_s_fx_efx_ncob_ecob(struct s_fx_efx_ncob_ecob *a, uint32_t
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].fx = be32_to_cpu(a[i].fx);
 		a[i].ncob_x = be32_to_cpu(a[i].ncob_x);
 		a[i].ncob_y = be32_to_cpu(a[i].ncob_y);
@@ -756,7 +703,7 @@ static void be_to_cpus_l_fx(struct l_fx *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].exp_flags = be24_to_cpu(a[i].exp_flags);
 		a[i].fx = be32_to_cpu(a[i].fx);
 		a[i].fx_variance = be32_to_cpu(a[i].fx_variance);
@@ -768,7 +715,7 @@ static void be_to_cpus_l_fx_efx(struct l_fx_efx *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].exp_flags = be24_to_cpu(a[i].exp_flags);
 		a[i].fx = be32_to_cpu(a[i].fx);
 		a[i].efx = be32_to_cpu(a[i].efx);
@@ -781,7 +728,7 @@ static void be_to_cpus_l_fx_ncob(struct l_fx_ncob *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].exp_flags = be24_to_cpu(a[i].exp_flags);
 		a[i].fx = be32_to_cpu(a[i].fx);
 		a[i].ncob_x = be32_to_cpu(a[i].ncob_x);
@@ -797,7 +744,7 @@ static void be_to_cpus_l_fx_efx_ncob_ecob(struct l_fx_efx_ncob_ecob *a, uint32_t
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].exp_flags = be24_to_cpu(a[i].exp_flags);
 		a[i].fx = be32_to_cpu(a[i].fx);
 		a[i].ncob_x = be32_to_cpu(a[i].ncob_x);
@@ -816,7 +763,7 @@ static void be_to_cpus_f_fx(struct f_fx *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i)
+	for (i = 0; i < samples; i++)
 		a[i].fx = be32_to_cpu(a[i].fx);
 }
 
@@ -825,7 +772,7 @@ static void be_to_cpus_f_fx_efx(struct f_fx_efx *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].fx = be32_to_cpu(a[i].fx);
 		a[i].efx = be32_to_cpu(a[i].efx);
 	}
@@ -836,7 +783,7 @@ static void be_to_cpus_f_fx_ncob(struct f_fx_ncob *a, uint32_t samples)
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].fx = be32_to_cpu(a[i].fx);
 		a[i].ncob_x = be32_to_cpu(a[i].ncob_x);
 		a[i].ncob_y = be32_to_cpu(a[i].ncob_y);
@@ -848,7 +795,7 @@ static void be_to_cpus_f_fx_efx_ncob_ecob(struct f_fx_efx_ncob_ecob *a, uint32_t
 {
 	uint32_t i;
 
-	for (i = 0; i < samples; ++i) {
+	for (i = 0; i < samples; i++) {
 		a[i].fx = be32_to_cpu(a[i].fx);
 		a[i].ncob_x = be32_to_cpu(a[i].ncob_x);
 		a[i].ncob_y = be32_to_cpu(a[i].ncob_y);
@@ -951,7 +898,6 @@ int be_to_cpu_data_type(void *data, uint32_t data_size_byte, enum cmp_data_type
 		be_to_cpus_f_fx_efx_ncob_ecob(data, samples);
 		break;
 	/* LCOV_EXCL_START */
-	case DATA_TYPE_UNKNOWN:
 	default:
 		debug_print("Error: Can not swap endianness for this compression data type.");
 		return -1;
diff --git a/lib/common/cmp_data_types.h b/lib/common/cmp_data_types.h
index a64661e8e85c3ecba44b4911f2bc3f78d91009eb..18a202363cc72261492e6506d6a9c586ead2e3ae 100644
--- a/lib/common/cmp_data_types.h
+++ b/lib/common/cmp_data_types.h
@@ -34,6 +34,7 @@
 #ifndef CMP_DATA_TYPE_H
 #define CMP_DATA_TYPE_H
 
+#include <stddef.h>
 #include <stdint.h>
 
 #include "compiler.h"
@@ -41,7 +42,7 @@
 
 
 /* subservice types for service 212 */
-#define SST_NCxx_S_SCIENCE_IMAGETTE		3 /* N-Camera image data */
+#define SST_NCxx_S_SCIENCE_IMAGETTE		3 /* N-Camera imagette data */
 #define SST_NCxx_S_SCIENCE_SAT_IMAGETTE		4 /* Extended imagettes for saturated star extra pixels */
 #define SST_NCxx_S_SCIENCE_OFFSET		5 /* Offset values Mean of the pixels of offset windows */
 #define SST_NCxx_S_SCIENCE_BACKGROUND		6 /* Background values Mean of the pixels of background windows */
@@ -108,7 +109,7 @@ struct collection_hdr {
 } __attribute__((packed));
 compile_time_assert(sizeof(struct collection_hdr) == COLLECTION_HDR_SIZE, N_DPU_ICU_COLLECTION_HDR_SIZE_IS_NOT_CORRECT);
 compile_time_assert(sizeof(struct collection_hdr) % sizeof(uint32_t) == 0, N_DPU_ICU_COLLECTION_HDR_NOT_4_BYTE_ALLIED);
-/* TODO: compile_time_assert(sizeof(struct collection_hdr.collection_id) == sizeof(union collection_id), N_DPU_ICU_COLLECTION_COLLECTION_ID_DO_NOT_MATCH); */
+compile_time_assert(sizeof(((struct collection_hdr *)0)->collection_id) == sizeof(union collection_id), N_DPU_ICU_COLLECTION_COLLECTION_ID_DO_NOT_MATCH);
 
 
 /**
@@ -327,8 +328,6 @@ enum cmp_data_type convert_subservice_to_cmp_data_type(uint8_t subservice);
 uint8_t convert_cmp_data_type_to_subservice(enum cmp_data_type data_type);
 
 size_t size_of_a_sample(enum cmp_data_type data_type);
-uint32_t cmp_cal_size_of_data(uint32_t samples, enum cmp_data_type data_type);
-int32_t cmp_input_size_to_samples(uint32_t size, enum cmp_data_type data_type);
 
 
 /* endianness functions */
diff --git a/lib/common/cmp_debug.c b/lib/common/cmp_debug.c
index 08486ab0af9a2dbf0a9cc3ecd668221202cdff82..db6749c85de86fa95ebb4aa086536ddb6dc474ca 100644
--- a/lib/common/cmp_debug.c
+++ b/lib/common/cmp_debug.c
@@ -21,6 +21,7 @@
 #ifndef ICU_ASW
 #  include <stdio.h>
 #endif
+#include <stddef.h>
 #include <string.h>
 #include <stdarg.h>
 
@@ -44,8 +45,8 @@ static void cmp_debug_puts(const char *str)
 	/* asw_puts(str); */
 	(void)str;
 #else
-	fputs(str, stderr);
-	fputs("\n", stderr);
+	(void)fputs(str, stderr);
+	(void)fputs("\n", stderr);
 #endif
 }
 
diff --git a/lib/common/cmp_debug.h b/lib/common/cmp_debug.h
index 1261289366ad362aef4052852d75f8a3560d618a..281ff531f1005282fdf83f9a4c0af15fa4e743b3 100644
--- a/lib/common/cmp_debug.h
+++ b/lib/common/cmp_debug.h
@@ -33,21 +33,21 @@
 
 #define PRINT_BUFFER_SIZE 256
 
-__extension__
 #if (DEBUGLEVEL > 0)
+__extension__
 #  define debug_print(...) cmp_debug_print_impl(__VA_ARGS__)
 void cmp_debug_print_impl(const char *fmt, ...);
 #else
+__extension__
 #  define debug_print(...) do {} while (0)
 #endif
 
 __extension__
 #define debug_print_level(level, ...)			\
 	do {						\
-		if (level <= DEBUGLEVEL)		\
+		if ((level) <= DEBUGLEVEL)		\
 			debug_print(__VA_ARGS__);	\
 	} while (0)
 
 
-
 #endif /* CMP_DEBUG_H */
diff --git a/lib/common/cmp_entity.c b/lib/common/cmp_entity.c
index afece91b260287c95dcd85b8a47eb06329a04e78..3813d1c752860373579f663a5b95c0f8163dcd24 100644
--- a/lib/common/cmp_entity.c
+++ b/lib/common/cmp_entity.c
@@ -32,10 +32,10 @@
 #  endif
 #endif
 
+#include "compiler.h"
 #include "byteorder.h"
 #include "cmp_debug.h"
 #include "cmp_support.h"
-#include "cmp_data_types.h"
 #include "cmp_entity.h"
 #include "leon_inttypes.h"
 
@@ -446,21 +446,20 @@ int cmp_ent_set_model_counter(struct cmp_entity *ent, uint32_t model_counter)
 
 
 /**
- * @brief set version identifier for the maximum used bits registry in the
- *	compression entity header
+ * @brief set reserved field in the compression entity header
  *
- * @param ent			pointer to a compression entity
- * @param max_used_bits_version	the identifier for the maximum used bits registry
+ * @param ent		pointer to a compression entity
+ * @param reserved	intentionally reserved
  *
  * @returns 0 on success, otherwise error
  */
 
-int cmp_ent_set_max_used_bits_version(struct cmp_entity *ent, uint8_t max_used_bits_version)
+int cmp_ent_set_reserved(struct cmp_entity *ent, uint8_t reserved)
 {
 	if (!ent)
 		return -1;
 
-	ent->max_used_bits_version = max_used_bits_version;
+	ent->reserved = reserved;
 
 	return 0;
 }
@@ -539,7 +538,7 @@ int cmp_ent_set_ima_golomb_par(struct cmp_entity *ent, uint32_t golomb_par_used)
 }
 
 
-/*
+/**
  * @brief set the used adaptive 1 spillover threshold parameter in the adaptive
  *	imagette specific compression entity header
  *
@@ -589,7 +588,7 @@ int cmp_ent_set_ima_ap1_golomb_par(struct cmp_entity *ent, uint32_t ap1_golomb_p
 }
 
 
-/*
+/**
  * @brief set the used adaptive 2 spillover threshold parameter in the adaptive
  *	imagette specific compression entity header
  *
@@ -639,7 +638,7 @@ int cmp_ent_set_ima_ap2_golomb_par(struct cmp_entity *ent, uint32_t ap2_golomb_p
 }
 
 
-/*
+/**
  * @brief set the used spillover threshold 1 parameter in the non-imagette
  *	specific compression entity header
  *
@@ -692,7 +691,7 @@ int cmp_ent_set_non_ima_cmp_par1(struct cmp_entity *ent, uint32_t cmp_par_1_used
 }
 
 
-/*
+/**
  * @brief set the used spillover threshold 2 parameter in the non-imagette
  *	specific compression entity header
  *
@@ -745,7 +744,7 @@ int cmp_ent_set_non_ima_cmp_par2(struct cmp_entity *ent, uint32_t cmp_par_2_used
 }
 
 
-/*
+/**
  * @brief set the used spillover threshold 3 parameter in the non-imagette
  *	specific compression entity header
  *
@@ -798,7 +797,7 @@ int cmp_ent_set_non_ima_cmp_par3(struct cmp_entity *ent, uint32_t cmp_par_3_used
 }
 
 
-/*
+/**
  * @brief set the used spillover threshold 4 parameter in the non-imagette
  *	specific compression entity header
  *
@@ -851,7 +850,7 @@ int cmp_ent_set_non_ima_cmp_par4(struct cmp_entity *ent, uint32_t cmp_par_4_used
 }
 
 
-/*
+/**
  * @brief set the used spillover threshold 5 parameter in the non-imagette
  *	specific compression entity header
  *
@@ -904,7 +903,7 @@ int cmp_ent_set_non_ima_cmp_par5(struct cmp_entity *ent, uint32_t cmp_par_5_used
 }
 
 
-/*
+/**
  * @brief set the used spillover threshold 6 parameter in the non-imagette
  *	specific compression entity header
  *
@@ -1239,21 +1238,19 @@ uint8_t cmp_ent_get_model_counter(const struct cmp_entity *ent)
 
 
 /**
- * @brief get the version identifier for the maximum used bits registry from the
- *	compression entity header
+ * @brief get the reserved field from the compression entity header
  *
  * @param ent	pointer to a compression entity
  *
- * @returns the version identifier for the maximum used bits registry on success,
- *	0 on error
+ * @returns the reserved filed on success, 0 on error
  */
 
-uint8_t cmp_ent_get_max_used_bits_version(const struct cmp_entity *ent)
+uint8_t cmp_ent_get_reserved(const struct cmp_entity *ent)
 {
 	if (!ent)
 		return 0;
 
-	return ent->max_used_bits_version;
+	return ent->reserved;
 }
 
 
@@ -1622,73 +1619,6 @@ uint16_t cmp_ent_get_non_ima_cmp_par6(const struct cmp_entity *ent)
 }
 
 
-/**
- * @brief get the start address of the compressed data in the compression
- *	entity
- *
- * @param ent	pointer to a compression entity
- *
- * @note this only works if the data_type in the compression entity is set
- *
- * @returns a pointer to buffer where the compressed data are located in entity
- *	on success, NULL on error
- */
-
-void *cmp_ent_get_data_buf(struct cmp_entity *ent)
-{
-	enum cmp_data_type data_type;
-	void *data_ptr;
-
-	if (!ent)
-		return NULL;
-
-	data_type = cmp_ent_get_data_type(ent);
-
-	switch (data_type) {
-	case DATA_TYPE_IMAGETTE:
-	case DATA_TYPE_SAT_IMAGETTE:
-	case DATA_TYPE_F_CAM_IMAGETTE:
-		data_ptr = ent->ima.ima_cmp_dat;
-		break;
-	case DATA_TYPE_IMAGETTE_ADAPTIVE:
-	case DATA_TYPE_SAT_IMAGETTE_ADAPTIVE:
-	case DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE:
-		data_ptr = ent->ima.ap_ima_cmp_data;
-		break;
-	case DATA_TYPE_OFFSET:
-	case DATA_TYPE_BACKGROUND:
-	case DATA_TYPE_SMEARING:
-	case DATA_TYPE_S_FX:
-	case DATA_TYPE_S_FX_EFX:
-	case DATA_TYPE_S_FX_NCOB:
-	case DATA_TYPE_S_FX_EFX_NCOB_ECOB:
-	case DATA_TYPE_L_FX:
-	case DATA_TYPE_L_FX_EFX:
-	case DATA_TYPE_L_FX_NCOB:
-	case DATA_TYPE_L_FX_EFX_NCOB_ECOB:
-	case DATA_TYPE_F_FX:
-	case DATA_TYPE_F_FX_EFX:
-	case DATA_TYPE_F_FX_NCOB:
-	case DATA_TYPE_F_FX_EFX_NCOB_ECOB:
-	case DATA_TYPE_F_CAM_OFFSET:
-	case DATA_TYPE_F_CAM_BACKGROUND:
-	case DATA_TYPE_CHUNK:
-		data_ptr = ent->non_ima.cmp_data;
-		break;
-	case DATA_TYPE_UNKNOWN:
-	default:
-		debug_print("Error: Compression data type not supported.");
-		return NULL;
-	}
-
-	/* the uncompressed data do not have a specific entity header */
-	if (cmp_ent_get_data_type_raw_bit(ent))
-		return (uint8_t *)ent + GENERIC_HEADER_SIZE;
-
-	return data_ptr;
-}
-
-
 /**
  * @brief copy the data from a compression entity to a buffer
  *
@@ -1760,165 +1690,66 @@ static uint32_t cmp_ent_get_hdr_size(const struct cmp_entity *ent)
 
 
 /**
- * @brief get the size of the compressed data based on the set data product
- *	type and compressed entity size in the compression entity
+ * @brief get the start address of the compressed data in the compression
+ *	entity
  *
  * @param ent	pointer to a compression entity
  *
- * @returns the size of the compressed data in bytes on success, 0 on error
+ * @note this only works if the data_type in the compression entity is set
+ *
+ * @returns a pointer to the location where the compressed data are located in entity
+ *	on success, NULL on error
  */
 
-uint32_t cmp_ent_get_cmp_data_size(const struct cmp_entity *ent)
+void *cmp_ent_get_data_buf(struct cmp_entity *ent)
 {
-	uint32_t cmp_ent_size, header_size;
-
-	header_size = cmp_ent_get_hdr_size(ent);
-	cmp_ent_size = cmp_ent_get_size(ent);
-
-	if (header_size > cmp_ent_size)
-		return 0;
-
-	return cmp_ent_size - header_size;
+	uint32_t hdr_size = cmp_ent_get_hdr_size(ent);
+	if (!hdr_size)
+		return NULL;
+	return (uint8_t *)ent + hdr_size;
 }
 
 
 /**
- * @brief write the compression parameters from a compression configuration
- *	into the compression entity header
- * @note NO compressed data are put into the entity and NO change of the entity
- *	size
+ * @brief same as cmp_ent_get_data_buf but with const pointers
  *
- * @param ent		pointer to a compression entity
- * @param cfg		pointer to a compression configuration
- * @param cmp_size_bits	size of the compressed data in bits
+ * @param ent	const pointer to a compression entity
  *
- * @returns 0 on success, negative on error
+ * @note this only works if the data_type in the compression entity is set
+ *
+ * @returns a const pointer to the location where the compressed data are located
+ *	in entity on success, NULL on error
  */
 
-int cmp_ent_write_cmp_pars(struct cmp_entity *ent, const struct cmp_cfg *cfg,
-			   int cmp_size_bits)
+const void *cmp_ent_get_data_buf_const(const struct cmp_entity *ent)
 {
-	uint32_t ent_cmp_data_size;
-
-	if (!cfg)
-		return -1;
-
-	if (cmp_size_bits < 0)
-		return -1;
-
-	if (cfg->data_type != cmp_ent_get_data_type(ent)) {
-		debug_print("Error: The entity data product type dos not match the configuration data product type.");
-		return -1;
-	}
+	uint32_t hdr_size = cmp_ent_get_hdr_size(ent);
+	if (!hdr_size)
+		return NULL;
+	return (const uint8_t *)ent + hdr_size;
+}
 
-	if (cmp_ent_get_data_type_raw_bit(ent) != (cfg->cmp_mode == CMP_MODE_RAW)) {
-		debug_print("Error: The entity's raw data bit does not match up with the compression mode.");
-		return -1;
-	}
 
-	ent_cmp_data_size = cmp_ent_get_cmp_data_size(ent);
+/**
+ * @brief get the size of the compressed data based on the set data product
+ *	type and compressed entity size in the compression entity
+ *
+ * @param ent	pointer to a compression entity
+ *
+ * @returns the size of the compressed data in bytes on success, 0 on error
+ */
 
-	/* check if the entity can hold the compressed data */
-	if (ent_cmp_data_size < cmp_bit_to_byte((unsigned int)cmp_size_bits)) {
-		debug_print("Error: The entity size is to small to hold the compressed data.");
-		return -2;
-	}
+uint32_t cmp_ent_get_cmp_data_size(const struct cmp_entity *ent)
+{
+	uint32_t cmp_ent_size, header_size;
 
-	/* set compression parameter fields in the generic entity header */
-	if (cmp_ent_set_original_size(ent, cmp_cal_size_of_data(cfg->samples,
-								cfg->data_type)))
-		return -1;
-	if (cmp_ent_set_cmp_mode(ent, cfg->cmp_mode))
-		return -1;
-	if (cmp_ent_set_model_value(ent, cfg->model_value))
-		return -1;
-	if (cfg->max_used_bits)
-		cmp_ent_set_max_used_bits_version(ent, cfg->max_used_bits->version);
-	else
-		cmp_ent_set_max_used_bits_version(ent, 0);
-	if (cmp_ent_set_lossy_cmp_par(ent, cfg->round))
-		return -1;
+	header_size = cmp_ent_get_hdr_size(ent);
+	cmp_ent_size = cmp_ent_get_size(ent);
 
-	if (cfg->cmp_mode == CMP_MODE_RAW) /* no specific header is used for raw data we are done */
+	if (header_size > cmp_ent_size)
 		return 0;
 
-	switch (cmp_ent_get_data_type(ent)) {
-	case DATA_TYPE_IMAGETTE_ADAPTIVE:
-	case DATA_TYPE_SAT_IMAGETTE_ADAPTIVE:
-	case DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE:
-		if (cmp_ent_set_ima_ap1_spill(ent, cfg->ap1_spill))
-			return -1;
-		if (cmp_ent_set_ima_ap1_golomb_par(ent, cfg->ap1_golomb_par))
-			return -1;
-		if (cmp_ent_set_ima_ap2_spill(ent, cfg->ap2_spill))
-			return -1;
-		if (cmp_ent_set_ima_ap2_golomb_par(ent, cfg->ap2_golomb_par))
-			return -1;
-		/* fall through */
-	case DATA_TYPE_IMAGETTE:
-	case DATA_TYPE_SAT_IMAGETTE:
-	case DATA_TYPE_F_CAM_IMAGETTE:
-		if (cmp_ent_set_ima_spill(ent, cfg->spill))
-			return -1;
-		if (cmp_ent_set_ima_golomb_par(ent, cfg->golomb_par))
-			return -1;
-		break;
-	case DATA_TYPE_CHUNK:
-		if (cmp_ent_set_non_ima_cmp_par1(ent, cfg->cmp_par_1))
-			return -1;
-		if (cmp_ent_set_non_ima_spill1(ent, cfg->spill_par_1))
-			return -1;
-
-		if (cmp_ent_set_non_ima_cmp_par2(ent, cfg->cmp_par_2))
-			return -1;
-		if (cmp_ent_set_non_ima_spill2(ent, cfg->spill_par_2))
-			return -1;
-
-		if (cmp_ent_set_non_ima_cmp_par3(ent, cfg->cmp_par_3))
-			return -1;
-		if (cmp_ent_set_non_ima_spill3(ent, cfg->spill_par_3))
-			return -1;
-
-		if (cmp_ent_set_non_ima_cmp_par4(ent, cfg->cmp_par_4))
-			return -1;
-		if (cmp_ent_set_non_ima_spill4(ent, cfg->spill_par_4))
-			return -1;
-
-		if (cmp_ent_set_non_ima_cmp_par5(ent, cfg->cmp_par_5))
-			return -1;
-		if (cmp_ent_set_non_ima_spill5(ent, cfg->spill_par_5))
-			return -1;
-
-		if (cmp_ent_set_non_ima_cmp_par6(ent, cfg->cmp_par_6))
-			return -1;
-		if (cmp_ent_set_non_ima_spill6(ent, cfg->spill_par_6))
-			return -1;
-
-		break;
-	/* the compression entity data type field only supports imagette or chunk data types*/
-	case DATA_TYPE_OFFSET:
-	case DATA_TYPE_F_CAM_OFFSET:
-	case DATA_TYPE_BACKGROUND:
-	case DATA_TYPE_F_CAM_BACKGROUND:
-	case DATA_TYPE_SMEARING:
-	case DATA_TYPE_S_FX:
-	case DATA_TYPE_S_FX_EFX:
-	case DATA_TYPE_S_FX_NCOB:
-	case DATA_TYPE_S_FX_EFX_NCOB_ECOB:
-	case DATA_TYPE_L_FX:
-	case DATA_TYPE_L_FX_EFX:
-	case DATA_TYPE_L_FX_NCOB:
-	case DATA_TYPE_L_FX_EFX_NCOB_ECOB:
-	case DATA_TYPE_F_FX:
-	case DATA_TYPE_F_FX_EFX:
-	case DATA_TYPE_F_FX_NCOB:
-	case DATA_TYPE_F_FX_EFX_NCOB_ECOB:
-	case DATA_TYPE_UNKNOWN:
-	default:
-		return -1;
-	}
-
-	return 0;
+	return cmp_ent_size - header_size;
 }
 
 
@@ -1930,14 +1761,15 @@ int cmp_ent_write_cmp_pars(struct cmp_entity *ent, const struct cmp_cfg *cfg,
  *
  * @param ent	pointer to a compression entity
  * @param info	pointer to a decompression information structure
- * @param cfg	pointer to a compression configuration structure for adaptive
- *	compression parameters (can be NULL if non adaptive data_type is used)
+ * @param rcfg	pointer to a RDCU compression configuration structure for
+ *	adaptive compression parameters (can be NULL if non adaptive data_type
+ *	is used)
  *
  * @returns 0 on success, negative on error
  */
 
 int cmp_ent_write_rdcu_cmp_pars(struct cmp_entity *ent, const struct cmp_info *info,
-				const struct cmp_cfg *cfg)
+				const struct rdcu_cfg *rcfg)
 {
 	uint32_t ent_cmp_data_size;
 	enum cmp_data_type data_type;
@@ -1972,14 +1804,13 @@ int cmp_ent_write_rdcu_cmp_pars(struct cmp_entity *ent, const struct cmp_info *i
 	}
 
 	/* set compression parameter fields in the generic entity header */
-	if (cmp_ent_set_original_size(ent, cmp_cal_size_of_data(info->samples_used, DATA_TYPE_IMAGETTE)))
+	if (cmp_ent_set_original_size(ent, info->samples_used * sizeof(uint16_t)))
 		return -1;
 	if (cmp_ent_set_cmp_mode(ent, info->cmp_mode_used))
 		return -1;
 	cmp_ent_set_model_value(ent, info->model_value_used);
-	/* The RDCU data compressor does not have the maximum used bit feature,
-	 * so the field is set to 0. */
-	cmp_ent_set_max_used_bits_version(ent, 0);
+
+	cmp_ent_set_reserved(ent, 0);
 
 	cmp_ent_set_lossy_cmp_par(ent, info->round_used);
 
@@ -1996,17 +1827,17 @@ int cmp_ent_write_rdcu_cmp_pars(struct cmp_entity *ent, const struct cmp_info *i
 	 * if an adaptive imagette compression data type is ent in the entity
 	 */
 	if (cmp_ap_imagette_data_type_is_used(data_type)) {
-		if (!cfg) {
+		if (!rcfg) {
 			debug_print("Error: Need the compression configuration to get the adaptive parameters.");
 			return -1;
 		}
-		if (cmp_ent_set_ima_ap1_spill(ent, cfg->ap1_spill))
+		if (cmp_ent_set_ima_ap1_spill(ent, rcfg->ap1_spill))
 			return -1;
-		if (cmp_ent_set_ima_ap1_golomb_par(ent, cfg->ap1_golomb_par))
+		if (cmp_ent_set_ima_ap1_golomb_par(ent, rcfg->ap1_golomb_par))
 			return -1;
-		if (cmp_ent_set_ima_ap2_spill(ent, cfg->ap2_spill))
+		if (cmp_ent_set_ima_ap2_spill(ent, rcfg->ap2_spill))
 			return -1;
-		if (cmp_ent_set_ima_ap2_golomb_par(ent, cfg->ap2_golomb_par))
+		if (cmp_ent_set_ima_ap2_golomb_par(ent, rcfg->ap2_golomb_par))
 			return -1;
 	}
 
@@ -2063,62 +1894,8 @@ uint32_t cmp_ent_create(struct cmp_entity *ent, enum cmp_data_type data_type,
 }
 
 
-/**
- * @brief create a compression entity and set the header fields
- *
- * @note this function simplifies the entity set up by creating an entity and
- *	setting the header fields in one function call
- * @note no compressed data are put into the entity
- *
- * @param ent			pointer to a compression entity; if NULL, the
- *	function returns the needed size
- * @param version_id		applications software version identifier
- * @param start_time		compression start timestamp (coarse and fine)
- * @param end_time		compression end timestamp (coarse and fine)
- * @param model_id		model identifier
- * @param model_counter		model counter
- * @param cfg			pointer to compression configuration (can be NULL)
- * @param cmp_size_bits		length of the compressed data in bits
- *
- * @returns the size of the compression entity or 0 on error
- */
-
-uint32_t cmp_ent_build(struct cmp_entity *ent, uint32_t version_id,
-		       uint64_t start_time, uint64_t end_time, uint16_t model_id,
-		       uint8_t model_counter, const struct cmp_cfg *cfg, int cmp_size_bits)
-{
-	uint32_t cmp_size_bytes = cmp_bit_to_byte((unsigned int)cmp_size_bits);
-	uint32_t hdr_size;
-
-	if (!cfg)
-		return 0;
-
-	if (cmp_size_bits < 0)
-		return 0;
-
-	if (!cmp_ent_create(ent, cfg->data_type, cfg->cmp_mode == CMP_MODE_RAW, cmp_size_bytes))
-		return 0;
-
-	if (ent) {
-		cmp_ent_set_version_id(ent, version_id);
-		if (cmp_ent_set_start_timestamp(ent, start_time))
-			return 0;
-		if (cmp_ent_set_end_timestamp(ent, end_time))
-			return 0;
-		cmp_ent_set_model_id(ent, model_id);
-		cmp_ent_set_model_counter(ent, model_counter);
-		if (cmp_ent_write_cmp_pars(ent, cfg, cmp_size_bits))
-			return 0;
-	}
-
-	hdr_size = cmp_ent_cal_hdr_size(cfg->data_type, cfg->cmp_mode == CMP_MODE_RAW);
-
-	return hdr_size + cmp_size_bytes;
-}
-
-
 #ifdef HAS_TIME_H
-/*
+/**
  * @brief Convert a calendar time expressed as a struct tm object to time since
  *	 epoch as a time_t object. The function interprets the input structure
  *	 as representing Universal Coordinated Time (UTC).
@@ -2162,7 +1939,7 @@ static time_t my_timegm(struct tm *tm)
 
 
 #ifdef HAS_TIME_H
-/*
+/**
  * @brief Generate a timestamp for the compression header
  *
  * @param ts	pointer to an object of type struct timespec of the
@@ -2194,7 +1971,7 @@ uint64_t cmp_ent_create_timestamp(const struct timespec *ts)
 		}
 		now = *ts;
 	} else {
-		clock_gettime(CLOCK_REALTIME, &now);
+		(void)clock_gettime(CLOCK_REALTIME, &now);
 	}
 
 	seconds = ((double)now.tv_sec + 1.0e-9 * (double)now.tv_nsec) -
@@ -2269,7 +2046,7 @@ void cmp_ent_print(struct cmp_entity *ent)
 static void cmp_ent_parse_generic_header(const struct cmp_entity *ent)
 {
 	MAYBE_UNUSED uint32_t version_id, cmp_ent_size, original_size, cmp_mode_used,
-		 model_value_used, model_id, model_counter, max_used_bits_version,
+		 model_value_used, model_id, model_counter, reserved,
 		 lossy_cmp_par_used, start_coarse_time, end_coarse_time;
 	MAYBE_UNUSED uint16_t start_fine_time, end_fine_time;
 	MAYBE_UNUSED enum cmp_data_type data_type;
@@ -2331,8 +2108,8 @@ static void cmp_ent_parse_generic_header(const struct cmp_entity *ent)
 	model_counter = cmp_ent_get_model_counter(ent);
 	debug_print("Model Counter: %" PRIu32, model_counter);
 
-	max_used_bits_version = cmp_ent_get_max_used_bits_version(ent);
-	debug_print("Maximum Used Bits Registry Version: %" PRIu32, max_used_bits_version);
+	reserved = cmp_ent_get_reserved(ent);
+	debug_print("Reserved Field: %" PRIu32, reserved);
 
 	lossy_cmp_par_used = cmp_ent_get_lossy_cmp_par(ent);
 	debug_print("Used Lossy Compression Parameters: %" PRIu32, lossy_cmp_par_used);
@@ -2478,6 +2255,7 @@ static void cmp_ent_parese_specific_header(const struct cmp_entity *ent)
 	case DATA_TYPE_CHUNK:
 		cmp_ent_parese_non_imagette_header(ent);
 		break;
+	case DATA_TYPE_UNKNOWN:
 	default:
 		debug_print("For this data product type no parse functions is implemented!");
 		break;
diff --git a/lib/common/cmp_entity.h b/lib/common/cmp_entity.h
index 33c0edbfd8b3673c23f864231620fa3c944759c7..049f0db2996bcc4c9c93d587df03f638eed06a01 100644
--- a/lib/common/cmp_entity.h
+++ b/lib/common/cmp_entity.h
@@ -75,7 +75,6 @@ struct imagette_header {
 	union{
 		struct {
 			uint8_t spare1;
-			uint8_t ima_cmp_dat[];		/**< compressed data for imagette specific header */
 		} __attribute__((packed));
 		struct {
 			uint16_t ap1_spill_used;	/**< Adaptive Spillover threshold used 1 */
@@ -84,7 +83,6 @@ struct imagette_header {
 			uint8_t  ap2_golomb_par_used;	/**< Adaptive Golomb parameter used 2 */
 			uint8_t  spare2;
 			uint16_t spare3;
-			uint8_t  ap_ima_cmp_data[];	/**< compressed data for adaptive imagette specific header */
 		} __attribute__((packed));
 	};
 } __attribute__((packed));
@@ -110,7 +108,6 @@ struct non_imagette_header {
 	uint32_t spill_6_used:24;	/**< spillover threshold 6 used */
 	uint16_t cmp_par_6_used;	/**< compression parameter 6 used */
 	uint16_t spare;
-	uint8_t  cmp_data[];
 } __attribute__((packed));
 compile_time_assert(sizeof(struct non_imagette_header) == SPECIFIC_NON_IMAGETTE_HEADER_SIZE, NON_IMAGETTE_HEADER_T_SIZE_IS_NOT_CORRECT);
 
@@ -137,7 +134,7 @@ struct cmp_entity {
 	uint8_t  model_value_used;		/**< used Model Updating Weighing Value */
 	uint16_t model_id;			/**< Model ID */
 	uint8_t  model_counter;			/**< Model Counter */
-	uint8_t  max_used_bits_version;
+	uint8_t  reserved;
 	uint16_t lossy_cmp_par_used;		/**< used Lossy Compression Parameters */
 	union {	/* specific Compression Entity Header for the different Data Product Types */
 		struct imagette_header ima;
@@ -155,24 +152,12 @@ compile_time_assert(sizeof(struct cmp_entity) == NON_IMAGETTE_HEADER_SIZE, CMP_E
 uint32_t cmp_ent_create(struct cmp_entity *ent, enum cmp_data_type data_type,
 			int raw_mode_flag, uint32_t cmp_size_byte);
 
-/* create a compression entity and set the header fields */
-uint32_t cmp_ent_build(struct cmp_entity *ent, uint32_t version_id,
-		       uint64_t start_time, uint64_t end_time, uint16_t model_id,
-		       uint8_t model_counter, const struct cmp_cfg *cfg, int cmp_size_bits);
-
-/*
- * write the compression parameters from a compression configuration into the
- * compression entity header
- */
-int cmp_ent_write_cmp_pars(struct cmp_entity *ent, const struct cmp_cfg *cfg,
-			   int cmp_size_bits);
-
 /*
  * write the parameters from the RDCU decompression information structure in the
  * compression entity header
  */
 int cmp_ent_write_rdcu_cmp_pars(struct cmp_entity *ent, const struct cmp_info *info,
-				const struct cmp_cfg *cfg);
+				const struct rdcu_cfg *rcfg);
 
 
 /* set functions for generic compression entity header */
@@ -195,7 +180,7 @@ int cmp_ent_set_cmp_mode(struct cmp_entity *ent, enum cmp_mode cmp_mode_used);
 int cmp_ent_set_model_value(struct cmp_entity *ent, uint32_t model_value_used);
 int cmp_ent_set_model_id(struct cmp_entity *ent, uint32_t model_id);
 int cmp_ent_set_model_counter(struct cmp_entity *ent, uint32_t model_counter);
-int cmp_ent_set_max_used_bits_version(struct cmp_entity *ent, uint8_t max_used_bits_version);
+int cmp_ent_set_reserved(struct cmp_entity *ent, uint8_t reserved);
 int cmp_ent_set_lossy_cmp_par(struct cmp_entity *ent, uint32_t lossy_cmp_par_used);
 
 
@@ -259,7 +244,7 @@ uint8_t cmp_ent_get_model_value(const struct cmp_entity *ent);
 
 uint16_t cmp_ent_get_model_id(const struct cmp_entity *ent);
 uint8_t cmp_ent_get_model_counter(const struct cmp_entity *ent);
-uint8_t cmp_ent_get_max_used_bits_version(const struct cmp_entity *ent);
+uint8_t cmp_ent_get_reserved(const struct cmp_entity *ent);
 uint16_t cmp_ent_get_lossy_cmp_par(const struct cmp_entity *ent);
 
 
@@ -304,6 +289,7 @@ uint16_t cmp_ent_get_non_ima_cmp_par6(const struct cmp_entity *ent);
 
 /* get function for the compressed data buffer in the entity */
 void *cmp_ent_get_data_buf(struct cmp_entity *ent);
+const void *cmp_ent_get_data_buf_const(const struct cmp_entity *ent);
 uint32_t cmp_ent_get_cmp_data_size(const struct cmp_entity *ent);
 int32_t cmp_ent_get_cmp_data(struct cmp_entity *ent, uint32_t *data_buf,
 			     uint32_t data_buf_size);
diff --git a/lib/common/cmp_error.c b/lib/common/cmp_error.c
index 30da8f5abc665e1dca60a9f63d4767e3e6cf48e0..b29fb0ab4c5e0dd56405e74f0c1554625ba02358 100644
--- a/lib/common/cmp_error.c
+++ b/lib/common/cmp_error.c
@@ -74,7 +74,7 @@ const char* cmp_get_error_string(enum cmp_error code)
 		return "No error detected";
 	case CMP_ERROR_GENERIC:
 		return "Error (generic)";
-	case CMP_ERROR_SMALL_BUF_:
+	case CMP_ERROR_SMALL_BUFFER:
 		return "Destination buffer is too small to hold the whole compressed data";
 	case CMP_ERROR_DATA_VALUE_TOO_LARGE:
 		return "Data value is larger than expected";
@@ -86,10 +86,10 @@ const char* cmp_get_error_string(enum cmp_error code)
 		return "Specific compression parameters or combination is unsupported";
 	case CMP_ERROR_PAR_BUFFERS:
 		return "Buffer related parameter is not valid";
-	case CMP_ERROR_PAR_MAX_USED_BITS:
-		return "Maximum used bits parameters are not valid";
 	case CMP_ERROR_PAR_NULL:
-		return "Pointer to the compression parameters structure is NULL.";
+		return "Pointer to the compression parameters structure is NULL";
+	case CMP_ERROR_PAR_NO_MODEL:
+		return "Model need for model mode compression";
 
 	case CMP_ERROR_CHUNK_NULL:
 		return "Pointer to the chunk is NULL. No data, no compression";
diff --git a/lib/common/cmp_error.h b/lib/common/cmp_error.h
index 333bbc9565e4c8a574540f957c6ba932f3cc6400..64cb59e509159b42ec144752ca421532f1186bae 100644
--- a/lib/common/cmp_error.h
+++ b/lib/common/cmp_error.h
@@ -24,7 +24,6 @@
 
 
 #include <stdint.h>
-#include "cmp_error_list.h"
 
 
 /**
diff --git a/lib/common/cmp_error_list.h b/lib/common/cmp_error_list.h
index 93448571de835d50cd4e2eff94e135e3278102f4..9a7a41f456fc0c2c564553c658f215fecffa66eb 100644
--- a/lib/common/cmp_error_list.h
+++ b/lib/common/cmp_error_list.h
@@ -28,14 +28,14 @@
 enum cmp_error {
 	CMP_ERROR_NO_ERROR = 0,
 	CMP_ERROR_GENERIC = 1,
-	CMP_ERROR_SMALL_BUF_ = 2,
+	CMP_ERROR_SMALL_BUFFER = 2,
 	CMP_ERROR_DATA_VALUE_TOO_LARGE = 3,
 	/* compression parameter errors */
 	CMP_ERROR_PAR_GENERIC = 20,
 	CMP_ERROR_PAR_SPECIFIC = 21,
 	CMP_ERROR_PAR_BUFFERS = 22,
-	CMP_ERROR_PAR_MAX_USED_BITS = 23,
 	CMP_ERROR_PAR_NULL = 24,
+	CMP_ERROR_PAR_NO_MODEL = 25,
 	/* chunk errors */
 	CMP_ERROR_CHUNK_NULL = 40,
 	CMP_ERROR_CHUNK_TOO_LARGE = 41,
diff --git a/lib/common/cmp_max_used_bits.c b/lib/common/cmp_max_used_bits.c
deleted file mode 100644
index eaedea3d83e203a960ef056e4bd7fd9c99bbeffa..0000000000000000000000000000000000000000
--- a/lib/common/cmp_max_used_bits.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * @file   cmp_max_used_bits.c
- * @author Dominik Loidolt (dominik.loidolt@univie.ac.at)
- * @date   2023
- *
- * @copyright GPLv2
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * @brief definition and consents of the cmp_max_used_bits structure
- */
-
-
-#include <stdint.h>
-
-#include "cmp_data_types.h"
-
-
-#define MAX_USED_NC_IMAGETTE_BITS		16
-#define MAX_USED_SATURATED_IMAGETTE_BITS	16 /* TBC */
-#define MAX_USED_FC_IMAGETTE_BITS		16 /* TBC */
-
-#define MAX_USED_F_FX_BITS	21 /* max exp. int value: (1.078*10^5)/0.1 = 1,078,000 -> 21 bits */
-#define MAX_USED_F_EFX_BITS	MAX_USED_F_FX_BITS /* we use the same as f_fx */
-#define MAX_USED_F_NCOB_BITS	20 /* max exp. int value: 6/10^−5 = 6*10^5 -> 20 bits */
-#define MAX_USED_F_ECOB_BITS	32 /* TBC */
-
-#define MAX_USED_S_FX_EXPOSURE_FLAGS_BITS	2 /* 2 flags + 6 spare bits */
-#define MAX_USED_S_FX_BITS			24 /* max exp. int value: (1.078*10^5-34.71)/0.01 = 10,780,000-> 24 bits */
-#define MAX_USED_S_EFX_BITS			MAX_USED_S_FX_BITS /* we use the same as s_fx */
-#define MAX_USED_S_NCOB_BITS			MAX_USED_F_NCOB_BITS
-#define MAX_USED_S_ECOB_BITS			32 /* TBC */
-
-#define MAX_USED_L_FX_EXPOSURE_FLAGS_BITS	24 /* 24 flags */
-#define MAX_USED_L_FX_BITS			MAX_USED_S_FX_BITS
-#define MAX_USED_L_FX_VARIANCE_BITS		32 /* no maximum value is given in PLATO-LESIA-PDC-TN-0054 */
-#define MAX_USED_L_EFX_BITS			MAX_USED_L_FX_BITS /* we use the same as l_fx */
-#define MAX_USED_L_NCOB_BITS			MAX_USED_F_NCOB_BITS
-#define MAX_USED_L_ECOB_BITS			32 /* TBC */
-#define MAX_USED_L_COB_VARIANCE_BITS		25 /* max exp int value: 0.1739/10^−8 = 17390000 -> 25 bits */
-
-#define MAX_USED_NC_OFFSET_MEAN_BITS		2 /* no maximum value is given in PLATO-LESIA-PDC-TN-0054 */
-#define MAX_USED_NC_OFFSET_VARIANCE_BITS	10 /* max exp. int value: 9.31/0.01 = 931 -> 10 bits */
-
-#define MAX_USED_NC_BACKGROUND_MEAN_BITS		16 /* max exp. int value: (391.8-(-50))/0.01 = 44,180 -> 16 bits */
-#define MAX_USED_NC_BACKGROUND_VARIANCE_BITS		16 /* max exp. int value: 6471/0.1 = 64710 -> 16 bit */
-#define MAX_USED_NC_BACKGROUND_OUTLIER_PIXELS_BITS	5 /* maximum = 16 -> 5 bits */
-
-#define MAX_USED_SMEARING_MEAN_BITS		15 /* max exp. int value: (219.9 - -50)/0.01 = 26.990 */
-#define MAX_USED_SMEARING_VARIANCE_MEAN_BITS	16 /* no maximum value is given in PLATO-LESIA-PDC-TN-0054 */
-#define MAX_USED_SMEARING_OUTLIER_PIXELS_BITS	11 /* maximum = 1200 -> 11 bits */
-
-#define MAX_USED_FC_OFFSET_MEAN_BITS		32 /* no maximum value is given in PLATO-LESIA-PDC-TN-0054 */
-#define MAX_USED_FC_OFFSET_VARIANCE_BITS	9  /* max exp. int value: 342/1 = 342 -> 9 bits */
-#define MAX_USED_FC_OFFSET_PIXEL_IN_ERROR_BITS	16 /* TBC */
-
-#define MAX_USED_FC_BACKGROUND_MEAN_BITS		10 /* max exp. int value: (35.76-(-50))/0.1 = 858 -> 10 bits*/
-#define MAX_USED_FC_BACKGROUND_VARIANCE_BITS		6 /* max exp. int value: 53.9/1 = 54 -> 6 bits */
-#define MAX_USED_FC_BACKGROUND_OUTLIER_PIXELS_BITS	16 /* TBC */
-
-
-#define member_bit_size(type, member) (sizeof(((type *)0)->member)*8)
-
-
-/* a safe the different data products types in bits */
-const struct cmp_max_used_bits MAX_USED_BITS_SAFE = {
-	0, /* default version */
-	member_bit_size(struct s_fx_efx_ncob_ecob, exp_flags), /* s_fx_exp_flags */
-	member_bit_size(struct s_fx_efx_ncob_ecob, fx), /* s_fx */
-	member_bit_size(struct s_fx_efx_ncob_ecob, efx), /* s_efx */
-	member_bit_size(struct s_fx_efx_ncob_ecob, ncob_x), /* s_ncob_x and s_ncob_y */
-	member_bit_size(struct s_fx_efx_ncob_ecob, ecob_x), /* s_ecob_x and s_ncob_y */
-	member_bit_size(struct f_fx_efx_ncob_ecob, fx), /* f_fx */
-	member_bit_size(struct f_fx_efx_ncob_ecob, efx), /* f_efx */
-	member_bit_size(struct f_fx_efx_ncob_ecob, ncob_x), /* f_ncob_x and f_ncob_y */
-	member_bit_size(struct f_fx_efx_ncob_ecob, ecob_x), /* f_ecob_x and f_ncob_y */
-	24, /* member_bit_size(struct l_fx_efx_ncob_ecob, exp_flags), /1* l_fx_exp_flags *1/ */
-	member_bit_size(struct l_fx_efx_ncob_ecob, fx), /* l_fx */
-	member_bit_size(struct l_fx_efx_ncob_ecob, fx_variance), /* l_fx_variance */
-	member_bit_size(struct l_fx_efx_ncob_ecob, efx), /* l_efx */
-	member_bit_size(struct l_fx_efx_ncob_ecob, ncob_x), /* l_ncob_x and l_ncob_y */
-	member_bit_size(struct l_fx_efx_ncob_ecob, ecob_x), /* l_ecob_x and l_ncob_y */
-	member_bit_size(struct l_fx_efx_ncob_ecob, cob_x_variance), /* l_cob_x_variance and l_cob_y_variance */
-	sizeof(uint16_t)*8, /* nc_imagette */
-	sizeof(uint16_t)*8, /* saturated_imagette */
-	member_bit_size(struct offset, mean), /* nc_offset_mean */
-	member_bit_size(struct offset, variance), /* nc_offset_variance */
-	member_bit_size(struct background, mean), /* nc_background_mean */
-	member_bit_size(struct background, variance), /* nc_background_variance */
-	member_bit_size(struct background, outlier_pixels), /* nc_background_outlier_pixels */
-	member_bit_size(struct smearing, mean), /* smearing_mean */
-	member_bit_size(struct smearing, variance_mean), /* smearing_variance_mean */
-	member_bit_size(struct smearing, outlier_pixels), /* smearing_outlier_pixels */
-	sizeof(uint16_t)*8, /* fc_imagette */
-	member_bit_size(struct offset, mean), /* fc_offset_mean */
-	member_bit_size(struct offset, variance), /* fc_offset_variance */
-	member_bit_size(struct background, mean), /* fc_background_mean */
-	member_bit_size(struct background, variance), /* fc_background_variance */
-	member_bit_size(struct background, outlier_pixels), /* fc_background_outlier_pixels */
-};
-
-
-/* the maximum length of the different data products types in bits */
-const struct cmp_max_used_bits MAX_USED_BITS_V1 = {
-	1, /* default version */
-	MAX_USED_S_FX_EXPOSURE_FLAGS_BITS, /* s_fx_exp_flags */
-	MAX_USED_S_FX_BITS, /* s_fx */
-	MAX_USED_S_EFX_BITS, /* s_efx */
-	MAX_USED_S_NCOB_BITS, /* s_ncob_x and s_ncob_y */
-	MAX_USED_S_ECOB_BITS, /* s_ecob_x and s_ncob_y */
-	MAX_USED_F_FX_BITS, /* f_fx */
-	MAX_USED_F_EFX_BITS, /* f_efx */
-	MAX_USED_F_NCOB_BITS, /* f_ncob_x and f_ncob_y */
-	MAX_USED_F_ECOB_BITS, /* f_ecob_x and f_ncob_y */
-	MAX_USED_L_FX_EXPOSURE_FLAGS_BITS, /* l_fx_exp_flags */
-	MAX_USED_L_FX_BITS, /* l_fx */
-	MAX_USED_L_FX_VARIANCE_BITS, /* l_fx_variance */
-	MAX_USED_L_EFX_BITS, /* l_efx */
-	MAX_USED_L_NCOB_BITS, /* l_ncob_x and l_ncob_y */
-	MAX_USED_L_ECOB_BITS, /* l_ecob_x and l_ncob_y */
-	MAX_USED_L_COB_VARIANCE_BITS, /* l_cob_x_variance and l_cob_y_variance */
-	MAX_USED_NC_IMAGETTE_BITS, /* nc_imagette */
-	MAX_USED_SATURATED_IMAGETTE_BITS, /* saturated_imagette */
-	MAX_USED_NC_OFFSET_MEAN_BITS, /* nc_offset_mean */
-	MAX_USED_NC_OFFSET_VARIANCE_BITS, /* nc_offset_variance */
-	MAX_USED_NC_BACKGROUND_MEAN_BITS, /* nc_background_mean */
-	MAX_USED_NC_BACKGROUND_VARIANCE_BITS, /* nc_background_variance */
-	MAX_USED_NC_BACKGROUND_OUTLIER_PIXELS_BITS, /* nc_background_outlier_pixels */
-	MAX_USED_SMEARING_MEAN_BITS, /* smearing_mean */
-	MAX_USED_SMEARING_VARIANCE_MEAN_BITS, /* smearing_variance_mean */
-	MAX_USED_SMEARING_OUTLIER_PIXELS_BITS, /* smearing_outlier_pixels */
-	MAX_USED_FC_IMAGETTE_BITS, /* fc_imagette */
-	MAX_USED_FC_OFFSET_MEAN_BITS, /* fc_offset_mean */
-	MAX_USED_FC_OFFSET_VARIANCE_BITS, /* fc_offset_variance */
-	MAX_USED_FC_BACKGROUND_MEAN_BITS, /* fc_background_mean */
-	MAX_USED_FC_BACKGROUND_VARIANCE_BITS, /* fc_background_variance */
-	MAX_USED_FC_BACKGROUND_OUTLIER_PIXELS_BITS /* fc_background_outlier_pixels */
-};
-
diff --git a/lib/common/cmp_max_used_bits.h b/lib/common/cmp_max_used_bits.h
index 21e7dd452403923061fe7b813c4f65632a5ea5dd..44f241ffd1bab0ecd3e2da5ec39b6c96fd4f0391 100644
--- a/lib/common/cmp_max_used_bits.h
+++ b/lib/common/cmp_max_used_bits.h
@@ -21,22 +21,27 @@
 
 #include <stdint.h>
 
+#include "cmp_data_types.h"
 
-/* Up to this number (not included), the maximum used bits registry versions cannot be used by the user. */
-#define CMP_MAX_USED_BITS_RESERVED_VERSIONS 32
 
+/**
+ * @brief macro to calculate the bit size of a member in a structure.
+ *
+ * @param type		type of the structure
+ * @param member	member of the structure
+ *
+ * @returns the size of the member in bits
+ */
 
-/* predefined maximum used bits registry constants */
-extern const struct cmp_max_used_bits MAX_USED_BITS_SAFE;
-extern const struct cmp_max_used_bits MAX_USED_BITS_V1;
+#define member_bit_size(type, member) (sizeof(((type *)0)->member)*8)
 
 
 /**
- * @brief Structure holding the maximum length of the different data product types in bits
+ * @brief Structure holding the maximum length of the different data product
+ *	types in bits
  */
 
 struct cmp_max_used_bits {
-	uint8_t version;
 	unsigned int s_exp_flags;
 	unsigned int s_fx;
 	unsigned int s_efx;
@@ -48,11 +53,10 @@ struct cmp_max_used_bits {
 	unsigned int f_ecob; /* f_ecob_x and f_ncob_y */
 	unsigned int l_exp_flags;
 	unsigned int l_fx;
-	unsigned int l_fx_variance;
+	unsigned int l_fx_cob_variance; /* l_fx_variance, l_cob_x_variance and l_cob_y_variance */
 	unsigned int l_efx;
 	unsigned int l_ncob; /* l_ncob_x and l_ncob_y */
 	unsigned int l_ecob; /* l_ecob_x and l_ncob_y */
-	unsigned int l_cob_variance; /* l_cob_x_variance and l_cob_y_variance */
 	unsigned int nc_imagette;
 	unsigned int saturated_imagette;
 	unsigned int nc_offset_mean;
@@ -71,4 +75,45 @@ struct cmp_max_used_bits {
 	unsigned int fc_background_outlier_pixels;
 };
 
+
+/**
+ * @brief This structure is used to define the maximum number of bits required
+ *	to read different data product type fields
+ */
+
+static const struct cmp_max_used_bits MAX_USED_BITS = {
+	member_bit_size(struct s_fx_efx_ncob_ecob, exp_flags), /* s_fx_exp_flags */
+	member_bit_size(struct s_fx_efx_ncob_ecob, fx), /* s_fx */
+	member_bit_size(struct s_fx_efx_ncob_ecob, efx), /* s_efx */
+	member_bit_size(struct s_fx_efx_ncob_ecob, ncob_x), /* s_ncob_x and s_ncob_y */
+	member_bit_size(struct s_fx_efx_ncob_ecob, ecob_x), /* s_ecob_x and s_ncob_y */
+	member_bit_size(struct f_fx_efx_ncob_ecob, fx), /* f_fx */
+	member_bit_size(struct f_fx_efx_ncob_ecob, efx), /* f_efx */
+	member_bit_size(struct f_fx_efx_ncob_ecob, ncob_x), /* f_ncob_x and f_ncob_y */
+	member_bit_size(struct f_fx_efx_ncob_ecob, ecob_x), /* f_ecob_x and f_ncob_y */
+	24, /* member_bit_size(struct l_fx_efx_ncob_ecob, exp_flags), /1* l_fx_exp_flags *1/ */
+	member_bit_size(struct l_fx_efx_ncob_ecob, fx), /* l_fx */
+	member_bit_size(struct l_fx_efx_ncob_ecob, fx_variance), /* l_fx_cob_variance */
+	member_bit_size(struct l_fx_efx_ncob_ecob, efx), /* l_efx */
+	member_bit_size(struct l_fx_efx_ncob_ecob, ncob_x), /* l_ncob_x and l_ncob_y */
+	member_bit_size(struct l_fx_efx_ncob_ecob, ecob_x), /* l_ecob_x and l_ncob_y */
+	sizeof(uint16_t)*8, /* nc_imagette */
+	sizeof(uint16_t)*8, /* saturated_imagette */
+	member_bit_size(struct offset, mean), /* nc_offset_mean */
+	member_bit_size(struct offset, variance), /* nc_offset_variance */
+	member_bit_size(struct background, mean), /* nc_background_mean */
+	member_bit_size(struct background, variance), /* nc_background_variance */
+	member_bit_size(struct background, outlier_pixels), /* nc_background_outlier_pixels */
+	member_bit_size(struct smearing, mean), /* smearing_mean */
+	member_bit_size(struct smearing, variance_mean), /* smearing_variance_mean */
+	member_bit_size(struct smearing, outlier_pixels), /* smearing_outlier_pixels */
+	sizeof(uint16_t)*8, /* fc_imagette */
+	member_bit_size(struct offset, mean), /* fc_offset_mean */
+	member_bit_size(struct offset, variance), /* fc_offset_variance */
+	member_bit_size(struct background, mean), /* fc_background_mean */
+	member_bit_size(struct background, variance), /* fc_background_variance */
+	member_bit_size(struct background, outlier_pixels), /* fc_background_outlier_pixels */
+};
+
+
 #endif /* CMP_MAX_USED_BITS_H */
diff --git a/lib/common/cmp_support.c b/lib/common/cmp_support.c
index b3abb675264d042696fd043d028e5c898f91fbef..d03a03e567d14e64392bd6269726f059016de6e2 100644
--- a/lib/common/cmp_support.c
+++ b/lib/common/cmp_support.c
@@ -17,11 +17,14 @@
  * @see Data Compression User Manual PLATO-UVIE-PL-UM-0001
  */
 
+#include <stdint.h>
+
 #include "compiler.h"
 
 #include "cmp_support.h"
 #include "cmp_debug.h"
 #include "leon_inttypes.h"
+#include "cmp_cal_up_model.h"
 
 
 /**
@@ -111,29 +114,6 @@ int raw_mode_is_used(enum cmp_mode cmp_mode)
 }
 
 
-/**
- * @brief check if the compression mode is supported by the RDCU compressor
- *
- * @param cmp_mode	compression mode
- *
- * @returns 1 when the compression mode is supported by the RDCU, otherwise 0
- */
-
-int rdcu_supported_cmp_mode_is_used(enum cmp_mode cmp_mode)
-{
-	switch (cmp_mode) {
-	case CMP_MODE_RAW:
-	case CMP_MODE_MODEL_ZERO:
-	case CMP_MODE_DIFF_ZERO:
-	case CMP_MODE_MODEL_MULTI:
-	case CMP_MODE_DIFF_MULTI:
-		return 1;
-	default:
-		return 0;
-	}
-}
-
-
 /**
  * @brief check if the data product data type is supported by the RDCU compressor
  *
@@ -168,7 +148,16 @@ int rdcu_supported_data_type_is_used(enum cmp_data_type data_type)
 
 int cmp_mode_is_supported(enum cmp_mode cmp_mode)
 {
-	return rdcu_supported_cmp_mode_is_used(cmp_mode);
+	switch (cmp_mode) {
+	case CMP_MODE_RAW:
+	case CMP_MODE_MODEL_ZERO:
+	case CMP_MODE_DIFF_ZERO:
+	case CMP_MODE_MODEL_MULTI:
+	case CMP_MODE_DIFF_MULTI:
+		return 1;
+	default:
+		return 0;
+	}
 }
 
 
@@ -339,12 +328,12 @@ uint32_t cmp_icu_max_spill(unsigned int cmp_par)
 	/* the ICU compressor can generate code words with a length of maximal 32 bits. */
 	unsigned int const max_cw_bits = 32;
 	unsigned int const cutoff = (0x2U << (ilog_2(cmp_par) & 0x1FU)) - cmp_par;
-	unsigned int const max_n_sym_offset = max_cw_bits/2 - 1;
+	unsigned int const max_n_sym_offset = (max_cw_bits/2) - 1;
 
 	if (!cmp_par || cmp_par > MAX_NON_IMA_GOLOMB_PAR)
 		return 0;
 
-	return (max_cw_bits-1-ilog_2(cmp_par))*cmp_par + cutoff
+	return ((max_cw_bits-1-ilog_2(cmp_par))*cmp_par) + cutoff
 		- max_n_sym_offset - 1;
 }
 
@@ -363,79 +352,36 @@ unsigned int cmp_bit_to_byte(unsigned int cmp_size_bit)
 }
 
 
-/**
- * @brief calculate the need bytes to hold a bitstream
- * @note we round up the result to multiples of 4 bytes
- *
- * @param cmp_size_bit	compressed data size, measured in bits
- *
- * @returns the size in bytes to store the hole bitstream
- */
-
-unsigned int cmp_bit_to_4byte(unsigned int cmp_size_bit)
-{
-	return (cmp_bit_to_byte(cmp_size_bit) + 3) & ~0x3UL;
-}
-
-
 /**
  * @brief check if the compression data type, compression mode, model value and
  *	the lossy rounding parameters are invalid for a RDCU or ICU compression
  *
  * @param cfg	pointer to a compression configuration containing the compression
  *	data product type, compression mode, model value and the rounding parameters
- * @param opt		check options:
- *			RDCU_CHECK for RDCU compression check
- *			ICU_CHECK for ICU compression check
  *
  * @returns 0 if the compression data type, compression mode, model value and
  *	the lossy rounding parameters are valid for an RDCU or ICU compression,
  *	non-zero if parameters are invalid
  */
 
-int cmp_cfg_gen_par_is_invalid(const struct cmp_cfg *cfg, enum check_opt opt)
+int cmp_cfg_gen_par_is_invalid(const struct cmp_cfg *cfg)
 {
 	int cfg_invalid = 0;
-	int invalid_data_type;
-	int unsupported_cmp_mode;
-	int check_model_value;
-	uint32_t max_round_value = 0;
-	MAYBE_UNUSED const char *str = "";
 
 	if (!cfg)
 		return 1;
 
-	switch (opt) {
-	case RDCU_CHECK:
-		/* the RDCU can only compress imagette data */
-		invalid_data_type = !cmp_imagette_data_type_is_used(cfg->data_type);
-		unsupported_cmp_mode = !rdcu_supported_cmp_mode_is_used(cfg->cmp_mode);
-		max_round_value = MAX_RDCU_ROUND;
-		/* for the RDCU the model vale has to be always in the allowed range */
-		check_model_value = 1;
-		str = " for a RDCU compression";
-		break;
-	case ICU_CHECK:
-		invalid_data_type = cmp_data_type_is_invalid(cfg->data_type);
-		unsupported_cmp_mode = !cmp_mode_is_supported(cfg->cmp_mode);
-		max_round_value = MAX_ICU_ROUND;
-		check_model_value = model_mode_is_used(cfg->cmp_mode);
-		break;
-	default:
-		return 1;
-	}
-
-	if (invalid_data_type) {
-		debug_print("Error: selected compression data type is not supported%s.", str);
+	if (cmp_data_type_is_invalid(cfg->data_type)) {
+		debug_print("Error: selected compression data type is not supported.");
 		cfg_invalid++;
 	}
 
-	if (unsupported_cmp_mode) {
-		debug_print("Error: selected cmp_mode: %i is not supported%s.", cfg->cmp_mode, str);
+	if (!cmp_mode_is_supported(cfg->cmp_mode)) {
+		debug_print("Error: selected cmp_mode: %i is not supported.", cfg->cmp_mode);
 		cfg_invalid++;
 	}
 
-	if (check_model_value) {
+	if (model_mode_is_used(cfg->cmp_mode)) {
 		if (cfg->model_value > MAX_MODEL_VALUE) {
 			debug_print("Error: selected model_value: %" PRIu32 " is invalid. The largest supported value is: %u.",
 				    cfg->model_value, MAX_MODEL_VALUE);
@@ -443,9 +389,9 @@ int cmp_cfg_gen_par_is_invalid(const struct cmp_cfg *cfg, enum check_opt opt)
 		}
 	}
 
-	if (cfg->round > max_round_value) {
-		debug_print("Error: selected lossy parameter: %" PRIu32 " is not supported%s. The largest supported value is: %" PRIu32 ".",
-			    cfg->round, str, max_round_value);
+	if (cfg->round > MAX_ICU_ROUND) {
+		debug_print("Error: selected lossy parameter: %" PRIu32 " is not supported. The largest supported value is: %" PRIu32 ".",
+			    cfg->round, MAX_ICU_ROUND);
 		cfg_invalid++;
 	}
 
@@ -456,151 +402,12 @@ int cmp_cfg_gen_par_is_invalid(const struct cmp_cfg *cfg, enum check_opt opt)
 }
 
 
-/**
- * @brief check if the ICU buffer parameters are invalid
- *
- * @param cfg	pointer to the compressor configuration
- *
- * @returns 0 if the buffer parameters are valid, otherwise invalid
- */
-
-int cmp_cfg_icu_buffers_is_invalid(const struct cmp_cfg *cfg)
-{
-	int cfg_invalid = 0;
-
-	if (!cfg)
-		return 1;
-
-	if (cfg->input_buf == NULL) {
-		debug_print("Error: The data_to_compress buffer for the data to be compressed is NULL.");
-		cfg_invalid++;
-	}
-
-	if (cfg->samples == 0)
-		debug_print("Warning: The samples parameter is 0. No data are compressed. This behavior may not be intended.");
-
-	if (cfg->icu_output_buf) {
-		if (cfg->buffer_length == 0 && cfg->samples != 0) {
-			debug_print("Error: The buffer_length is set to 0. There is no space to store the compressed data.");
-			cfg_invalid++;
-		}
-
-		if (raw_mode_is_used(cfg->cmp_mode) && cfg->buffer_length < cfg->samples) {
-			debug_print("Error: The compressed_data_len_samples is to small to hold the data form the data_to_compress.");
-			cfg_invalid++;
-		}
-
-		if (cfg->icu_output_buf == cfg->input_buf) {
-			debug_print("Error: The compressed_data buffer is the same as the data_to_compress buffer.");
-			cfg_invalid++;
-		}
-	}
-
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		if (cfg->model_buf == NULL) {
-			debug_print("Error: The model_of_data buffer for the model data is NULL.");
-			cfg_invalid++;
-		}
-
-		if (cfg->model_buf == cfg->input_buf) {
-			debug_print("Error: The model_of_data buffer is the same as the data_to_compress buffer.");
-			cfg_invalid++;
-		}
-
-		if (cfg->model_buf == cfg->icu_output_buf) {
-			debug_print("Error: The model_of_data buffer is the same as the compressed_data buffer.");
-			cfg_invalid++;
-		}
-
-		if (cfg->icu_new_model_buf) {
-			if (cfg->icu_new_model_buf == cfg->input_buf) {
-				debug_print("Error: The updated_model buffer is the same as the data_to_compress buffer.");
-				cfg_invalid++;
-			}
-
-			if (cfg->icu_new_model_buf == cfg->icu_output_buf) {
-				debug_print("Error: The compressed_data buffer is the same as the compressed_data buffer.");
-				cfg_invalid++;
-			}
-		}
-	}
-
-	return cfg_invalid;
-}
-
-
-/**
- * @brief check if all entries in the max_used_bits structure are in the allowed range
- *
- * @param max_used_bits	pointer to max_used_bits structure to check
- *
- * @returns 0 if all entries are valid, otherwise one or more entries are invalid
- */
-
-
-int cmp_cfg_icu_max_used_bits_out_of_limit(const struct cmp_max_used_bits *max_used_bits)
-{
-#define CHECK_MAX_USED_BITS_LIMIT(entry) \
-	do { \
-		if (max_used_bits->entry > MAX_USED_BITS_SAFE.entry) { \
-			debug_print("Error: The " #entry " entry in the max_used_bits structure is too large (actual: %x, max: %x).",  max_used_bits->entry, MAX_USED_BITS_SAFE.entry); \
-			error++; \
-		} \
-	} while (0)
-
-	int error = 0;
-
-	if (!max_used_bits) {
-		debug_print("Error: The pointer to the max_used_bits structure is NULL.");
-		return 1;
-	}
-
-	CHECK_MAX_USED_BITS_LIMIT(s_exp_flags);
-	CHECK_MAX_USED_BITS_LIMIT(s_fx);
-	CHECK_MAX_USED_BITS_LIMIT(s_efx);
-	CHECK_MAX_USED_BITS_LIMIT(s_ncob);
-	CHECK_MAX_USED_BITS_LIMIT(s_ecob);
-	CHECK_MAX_USED_BITS_LIMIT(f_fx);
-	CHECK_MAX_USED_BITS_LIMIT(f_efx);
-	CHECK_MAX_USED_BITS_LIMIT(f_ncob);
-	CHECK_MAX_USED_BITS_LIMIT(f_ecob);
-	CHECK_MAX_USED_BITS_LIMIT(l_exp_flags);
-	CHECK_MAX_USED_BITS_LIMIT(l_fx);
-	CHECK_MAX_USED_BITS_LIMIT(l_fx_variance);
-	CHECK_MAX_USED_BITS_LIMIT(l_efx);
-	CHECK_MAX_USED_BITS_LIMIT(l_ncob);
-	CHECK_MAX_USED_BITS_LIMIT(l_ecob);
-	CHECK_MAX_USED_BITS_LIMIT(l_cob_variance);
-	CHECK_MAX_USED_BITS_LIMIT(nc_imagette);
-	CHECK_MAX_USED_BITS_LIMIT(saturated_imagette);
-	CHECK_MAX_USED_BITS_LIMIT(nc_offset_mean);
-	CHECK_MAX_USED_BITS_LIMIT(nc_offset_variance);
-	CHECK_MAX_USED_BITS_LIMIT(nc_background_mean);
-	CHECK_MAX_USED_BITS_LIMIT(nc_background_variance);
-	CHECK_MAX_USED_BITS_LIMIT(nc_background_outlier_pixels);
-	CHECK_MAX_USED_BITS_LIMIT(smearing_mean);
-	CHECK_MAX_USED_BITS_LIMIT(smearing_variance_mean);
-	CHECK_MAX_USED_BITS_LIMIT(smearing_outlier_pixels);
-	CHECK_MAX_USED_BITS_LIMIT(fc_imagette);
-	CHECK_MAX_USED_BITS_LIMIT(fc_offset_mean);
-	CHECK_MAX_USED_BITS_LIMIT(fc_offset_variance);
-	CHECK_MAX_USED_BITS_LIMIT(fc_background_mean);
-	CHECK_MAX_USED_BITS_LIMIT(fc_background_variance);
-	CHECK_MAX_USED_BITS_LIMIT(fc_background_outlier_pixels);
-
-	return error;
-
-#undef CHECK_MAX_USED_BITS_LIMIT
-}
-
-
 /**
  * @brief check if the combination of the different compression parameters is invalid
  *
  * @param cmp_par	compression parameter
  * @param spill		spillover threshold parameter
  * @param cmp_mode	compression mode
- * @param data_type	compression data type
  * @param par_name	string describing the use of the compression par. for
  *			debug messages (can be NULL)
  *
@@ -608,28 +415,9 @@ int cmp_cfg_icu_max_used_bits_out_of_limit(const struct cmp_max_used_bits *max_u
  */
 
 static int cmp_pars_are_invalid(uint32_t cmp_par, uint32_t spill, enum cmp_mode cmp_mode,
-				enum cmp_data_type data_type, const char *par_name MAYBE_UNUSED)
+				const char *par_name MAYBE_UNUSED)
 {
 	int cfg_invalid = 0;
-	uint32_t min_golomb_par;
-	uint32_t max_golomb_par;
-	uint32_t min_spill;
-	uint32_t max_spill;
-
-	/* The maximum compression parameter for imagette data are smaller to
-	 * fit into the imagette compression entity header */
-	if (cmp_imagette_data_type_is_used(data_type)) {
-		min_golomb_par = MIN_IMA_GOLOMB_PAR;
-		max_golomb_par = MAX_IMA_GOLOMB_PAR;
-		min_spill = MIN_IMA_SPILL;
-		max_spill = cmp_ima_max_spill(cmp_par);
-	} else {
-		min_golomb_par = MIN_NON_IMA_GOLOMB_PAR;
-		max_golomb_par = MAX_NON_IMA_GOLOMB_PAR;
-		min_spill = MIN_NON_IMA_SPILL;
-		max_spill = cmp_icu_max_spill(cmp_par);
-	}
-
 
 	switch (cmp_mode) {
 	case CMP_MODE_RAW:
@@ -639,25 +427,25 @@ static int cmp_pars_are_invalid(uint32_t cmp_par, uint32_t spill, enum cmp_mode
 	case CMP_MODE_DIFF_MULTI:
 	case CMP_MODE_MODEL_ZERO:
 	case CMP_MODE_MODEL_MULTI:
-		if (cmp_par < min_golomb_par || cmp_par > max_golomb_par) {
+		if (cmp_par < MIN_NON_IMA_GOLOMB_PAR || cmp_par > MAX_NON_IMA_GOLOMB_PAR) {
 			debug_print("Error: The selected %s compression parameter: %" PRIu32 " is not supported in the selected compression mode. The compression parameter has to be between [%" PRIu32 ", %" PRIu32 "] in this mode.",
-				    par_name, cmp_par, min_golomb_par, max_golomb_par);
+				    par_name, cmp_par, MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
 			cfg_invalid++;
 		}
-		if (spill < min_spill) {
+		if (spill < MIN_NON_IMA_SPILL) {
 			debug_print("Error: The selected %s spillover threshold value: %" PRIu32 " is too small. The smallest possible spillover value is: %" PRIu32 ".",
-				    par_name, spill, min_spill);
+				    par_name, spill, MIN_NON_IMA_SPILL);
 			cfg_invalid++;
 		}
-		if (spill > max_spill) {
+		if (spill > cmp_icu_max_spill(cmp_par)) {
 			debug_print("Error: The selected %s spillover threshold value: %" PRIu32 " is too large for the selected %s compression parameter: %" PRIu32 ". The largest possible spillover value in the selected compression mode is: %" PRIu32 ".",
-				    par_name, spill, par_name, cmp_par, max_spill);
+				    par_name, spill, par_name, cmp_par, cmp_icu_max_spill(cmp_par));
 			cfg_invalid++;
 		}
 
 		break;
 	default:
-		debug_print("Error: The compression mode is not supported.");
+		debug_print("Error: selected cmp_mode: %i is not supported.", cmp_mode);
 		cfg_invalid++;
 		break;
 	}
@@ -673,18 +461,13 @@ static int cmp_pars_are_invalid(uint32_t cmp_par, uint32_t spill, enum cmp_mode
  * @brief check if the imagette specific compression parameters are invalid
  *
  * @param cfg		pointer to a compressor configuration
- * @param opt		check options:
- *			RDCU_CHECK for a imagette RDCU compression check
- *			ICU_CHECK for a imagette ICU compression check
  *
  * @returns 0 if the imagette specific parameters are valid, otherwise invalid
  */
 
-int cmp_cfg_imagette_is_invalid(const struct cmp_cfg *cfg, enum check_opt opt)
+int cmp_cfg_imagette_is_invalid(const struct cmp_cfg *cfg)
 {
 	int cfg_invalid = 0;
-	enum cmp_mode cmp_mode;
-	enum cmp_data_type data_type;
 
 	if (!cfg)
 		return 1;
@@ -694,29 +477,8 @@ int cmp_cfg_imagette_is_invalid(const struct cmp_cfg *cfg, enum check_opt opt)
 		cfg_invalid++;
 	}
 
-	/* The RDCU needs valid compression parameters also in RAW_MODE */
-	if (opt == RDCU_CHECK && cfg->cmp_mode == CMP_MODE_RAW)
-		cmp_mode = CMP_MODE_MODEL_ZERO;
-	else
-		cmp_mode = cfg->cmp_mode;
-
-	if (opt == ICU_CHECK)
-		data_type = DATA_TYPE_CHUNK;
-	else
-		data_type = cfg->data_type;
-
-
-	cfg_invalid += cmp_pars_are_invalid(cfg->golomb_par, cfg->spill, cmp_mode,
-					    data_type, "imagette");
-
-	/* for the RDCU the adaptive parameters have to be always valid */
-	if (opt == RDCU_CHECK || cmp_ap_imagette_data_type_is_used(cfg->data_type)) {
-		cfg_invalid += cmp_pars_are_invalid(cfg->ap1_golomb_par, cfg->ap1_spill,
-				cmp_mode, cfg->data_type, "adaptive 1 imagette");
-		cfg_invalid += cmp_pars_are_invalid(cfg->ap2_golomb_par, cfg->ap2_spill,
-				cmp_mode, cfg->data_type, "adaptive 2 imagette");
-	}
-
+	cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_imagette, cfg->spill_imagette,
+					    cfg->cmp_mode, "imagette");
 	return cfg_invalid;
 }
 
@@ -833,22 +595,22 @@ int cmp_cfg_fx_cob_is_invalid(const struct cmp_cfg *cfg)
 
 	if (needed_pars.fx) /* this is always true because every flux/center of brightness data type contains a flux parameter */
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_fx, cfg->spill_fx,
-						    cfg->cmp_mode, cfg->data_type, "flux");
+						    cfg->cmp_mode, "flux");
 	if (needed_pars.exp_flags)
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-			cfg->cmp_mode, cfg->data_type, "exposure flags");
+			cfg->cmp_mode, "exposure flags");
 	if (needed_pars.ncob)
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_ncob, cfg->spill_ncob,
-			cfg->cmp_mode, cfg->data_type, "center of brightness");
+			cfg->cmp_mode, "center of brightness");
 	if (needed_pars.efx)
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_efx, cfg->spill_efx,
-			cfg->cmp_mode, cfg->data_type, "extended flux");
+			cfg->cmp_mode, "extended flux");
 	if (needed_pars.ecob)
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_ecob, cfg->spill_ecob,
-			cfg->cmp_mode, cfg->data_type, "extended center of brightness");
+			cfg->cmp_mode, "extended center of brightness");
 	if (needed_pars.fx_cob_variance)
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_fx_cob_variance,
-			cfg->spill_fx_cob_variance, cfg->cmp_mode, cfg->data_type, "flux/COB variance");
+			cfg->spill_fx_cob_variance, cfg->cmp_mode, "flux/COB variance");
 
 	return cfg_invalid;
 }
@@ -874,26 +636,26 @@ int cmp_cfg_aux_is_invalid(const struct cmp_cfg *cfg)
 	case DATA_TYPE_OFFSET:
 	case DATA_TYPE_F_CAM_OFFSET:
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_offset_mean, cfg->spill_offset_mean,
-				cfg->cmp_mode, cfg->data_type, "offset mean");
+				cfg->cmp_mode, "offset mean");
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_offset_variance, cfg->spill_offset_variance,
-				cfg->cmp_mode, cfg->data_type, "offset variance");
+				cfg->cmp_mode, "offset variance");
 		break;
 	case DATA_TYPE_BACKGROUND:
 	case DATA_TYPE_F_CAM_BACKGROUND:
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_background_mean, cfg->spill_background_mean,
-				cfg->cmp_mode, cfg->data_type, "background mean");
+				cfg->cmp_mode, "background mean");
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_background_variance, cfg->spill_background_variance,
-				cfg->cmp_mode, cfg->data_type, "background variance");
+				cfg->cmp_mode, "background variance");
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_background_pixels_error, cfg->spill_background_pixels_error,
-				cfg->cmp_mode, cfg->data_type, "background outlier pixls num");
+				cfg->cmp_mode, "background outlier pixls num");
 		break;
 	case DATA_TYPE_SMEARING:
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_smearing_mean, cfg->spill_smearing_mean,
-				cfg->cmp_mode, cfg->data_type, "smearing mean");
+				cfg->cmp_mode, "smearing mean");
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_smearing_variance, cfg->spill_smearing_variance,
-				cfg->cmp_mode, cfg->data_type, "smearing variance");
+				cfg->cmp_mode, "smearing variance");
 		cfg_invalid += cmp_pars_are_invalid(cfg->cmp_par_smearing_pixels_error, cfg->spill_smearing_pixels_error,
-				cfg->cmp_mode, cfg->data_type, "smearing outlier pixls num");
+				cfg->cmp_mode, "smearing outlier pixls num");
 		break;
 	default:
 		debug_print("Error: The compression data type is not an auxiliary science compression data type.");
@@ -903,41 +665,6 @@ int cmp_cfg_aux_is_invalid(const struct cmp_cfg *cfg)
 }
 
 
-/**
- * @brief check if a compression configuration is invalid for a ICU compression
- *
- * @param cfg	pointer to a compressor configuration
- *
- * @returns 0 if the compression configuration is valid, otherwise invalid
- */
-
-int cmp_cfg_icu_is_invalid(const struct cmp_cfg *cfg)
-{
-	int cfg_invalid = 0;
-
-	if (!cfg)
-		return 1;
-
-	cfg_invalid += cmp_cfg_gen_par_is_invalid(cfg, ICU_CHECK);
-
-	cfg_invalid += cmp_cfg_icu_buffers_is_invalid(cfg);
-
-	if (cfg->cmp_mode != CMP_MODE_RAW)
-		cfg_invalid += cmp_cfg_icu_max_used_bits_out_of_limit(cfg->max_used_bits);
-
-	if (cmp_imagette_data_type_is_used(cfg->data_type))
-		cfg_invalid += cmp_cfg_imagette_is_invalid(cfg, ICU_CHECK);
-	else if (cmp_fx_cob_data_type_is_used(cfg->data_type))
-		cfg_invalid += cmp_cfg_fx_cob_is_invalid(cfg);
-	else if (cmp_aux_data_type_is_used(cfg->data_type))
-		cfg_invalid += cmp_cfg_aux_is_invalid(cfg);
-	else
-		cfg_invalid++;
-
-	return cfg_invalid;
-}
-
-
 /**
  * @brief print the cmp_info structure
  *
diff --git a/lib/common/cmp_support.h b/lib/common/cmp_support.h
index 3c4d37f7b203d4acb4fa5fe8006218586df30c7f..ad1d86bd38ffac2196f66dee5d1906d5d6c3c382 100644
--- a/lib/common/cmp_support.h
+++ b/lib/common/cmp_support.h
@@ -22,20 +22,10 @@
 #include <stdint.h>
 #include <stddef.h>
 
-#include "cmp_max_used_bits.h"
-#include "cmp_cal_up_model.h"
 
 #define CMP_COLLECTION_FILD_SIZE 2
 
 
-/* return code if the bitstream buffer is too small to store the whole bitstream */
-#define CMP_ERROR_SMALL_BUF -2
-
-/* return code if the value or the model is bigger than the max_used_bits
- * parameter allows
- */
-#define CMP_ERROR_HIGH_VALUE -3
-
 #define CMP_LOSSLESS	0
 #define CMP_PAR_UNUNSED	0
 
@@ -49,7 +39,7 @@
 
 /* valid compression parameter ranges for ICU non-imagette compression */
 #define MIN_NON_IMA_GOLOMB_PAR	1U
-#define MAX_NON_IMA_GOLOMB_PAR	UINT16_MAX /* the compression entity dos not allow larger values */
+#define MAX_NON_IMA_GOLOMB_PAR	UINT16_MAX /* the compression entity does not allow larger values */
 #define MIN_NON_IMA_SPILL	2U
 /* for maximum spill value look at cmp_icu_max_spill function */
 #define MAX_ICU_ROUND		3U
@@ -95,12 +85,6 @@
 /* imagette sample to byte conversion factor; one imagette samples has 16 bits (2 bytes) */
 #define IMA_SAM2BYT  2
 
-/**
- * @brief options for configuration check functions
- */
-
-enum check_opt {ICU_CHECK, RDCU_CHECK};
-
 
 /**
  * @brief defined compression data product types
@@ -136,83 +120,70 @@ enum cmp_data_type {
 
 
 /**
- * @brief defined compression mode
+ * @brief compression modes
+ * This enum defines the various compression modes available
  */
 
 enum cmp_mode {
-	CMP_MODE_RAW,
-	CMP_MODE_MODEL_ZERO,
-	CMP_MODE_DIFF_ZERO,
-	CMP_MODE_MODEL_MULTI,
-	CMP_MODE_DIFF_MULTI
+	CMP_MODE_RAW,         /**< raw compression mode */
+	CMP_MODE_MODEL_ZERO,  /**< model compression mode with zero escape symbol mechanism */
+	CMP_MODE_DIFF_ZERO,   /**< 1-D differential compression mode with zero escape symbol mechanism */
+	CMP_MODE_MODEL_MULTI, /**< model compression mode with multi escape symbol mechanism */
+	CMP_MODE_DIFF_MULTI   /**< 1-D differential multi compression mode with multi escape symbol mechanism*/
 };
 
 
 /**
- * @brief The cmp_cfg structure can contain the complete configuration of the HW as
- *	well as the SW compressor.
- * @note the icu_output_buf will not be used for HW compression
- * @note the rdcu_***_adr parameters are ignored for SW compression
+ * @brief The cmp_cfg structure can contain the complete configuration for a SW
+ *	(de)compression
  */
 
 __extension__
 struct cmp_cfg {
-	void *input_buf;            /**< Pointer to the data to compress buffer */
-	void *model_buf;            /**< Pointer to the model buffer */
-	void *icu_new_model_buf;    /**< Pointer to the updated model buffer (not used for RDCU compression )*/
-	uint32_t *icu_output_buf;   /**< Pointer to the compressed data buffer (not used for RDCU compression) */
-	uint32_t samples;           /**< Number of samples to compress, length of the data and model buffer
-				     * (including the multi entity header by non-imagette data)
-				     */
-	uint32_t buffer_length;     /**< Length of the compressed data buffer in number of samples */
-	uint32_t rdcu_data_adr;     /**< RDCU data to compress start address, the first data address in the RDCU SRAM; HW only */
-	uint32_t rdcu_model_adr;    /**< RDCU model start address, the first model address in the RDCU SRAM */
-	uint32_t rdcu_new_model_adr;/**< RDCU updated model start address, the address in the RDCU SRAM where the updated model is stored */
-	uint32_t rdcu_buffer_adr;   /**< RDCU compressed data start address, the first output data address in the RDCU SRAM */
-	enum cmp_data_type data_type; /**< Compression Data Product Types */
-	enum cmp_mode cmp_mode;     /**< 0: raw mode
-				     * 1: model mode with zero escape symbol mechanism
-				     * 2: 1d differencing mode without input model with zero escape symbol mechanism
-				     * 3: model mode with multi escape symbol mechanism
-				     * 4: 1d differencing mode without input model multi escape symbol mechanism
-				     */
-	uint32_t model_value;       /**< Model weighting parameter */
-	uint32_t round;             /**< lossy compression parameter */
+	const void *src;              /**< Pointer to the source data buffer (data to be compressed for compression; compressed data for decompression) */
+	void *dst;                    /**< Pointer to the destination buffer (compressed data for compression; decompressed data for decompression) */
+	const void *model_buf;        /**< Pointer to the model buffer */
+	void *updated_model_buf;      /**< Pointer to the updated model buffer */
+	uint32_t samples;             /**< Number of samples in a collection, length of the data and model buffers */
+	uint32_t stream_size;         /**< Length of the compressed data buffer in number of samples */
+	enum cmp_data_type data_type; /**< Compression Data Product Type */
+	enum cmp_mode cmp_mode;       /**< 0: raw mode
+				       * 1: model mode with zero escape symbol mechanism
+				       * 2: 1d differencing mode without input model with zero escape symbol mechanism
+				       * 3: model mode with multi escape symbol mechanism
+				       * 4: 1d differencing mode without input model multi escape symbol mechanism
+				       */
+	uint32_t model_value;         /**< Model weighting parameter */
+	uint32_t round;               /**< lossy compression parameter */
 	union {
 		uint32_t cmp_par_1;
-		uint32_t golomb_par;        /* TODO: remove this */      /**< Golomb parameter for imagette data compression */
 		uint32_t cmp_par_imagette;  /**< Golomb parameter for imagette data compression */
 		uint32_t cmp_par_exp_flags; /**< Compression parameter for exposure flags compression */
 	};
 	union {
 		uint32_t spill_par_1;
-		uint32_t spill;             /* TODO: remove this */           /**< Spillover threshold parameter for imagette data compression */
 		uint32_t spill_imagette;    /**< Spillover threshold parameter for imagette data compression */
 		uint32_t spill_exp_flags;   /**< Spillover threshold parameter for exposure flags compression */
 	};
 
 	union {
 		uint32_t cmp_par_2;
-		uint32_t ap1_golomb_par;      /**< Adaptive 2 spillover threshold for imagette data; HW only */
 		uint32_t cmp_par_fx;          /**< Compression parameter for normal flux compression */
 		uint32_t cmp_par_offset_mean; /**< Compression parameter for auxiliary science mean compression */
 	};
 	union {
 		uint32_t spill_par_2;
-		uint32_t ap1_spill;         /**< Adaptive 2 Golomb parameter; HW only */
 		uint32_t spill_fx;          /**< Spillover threshold parameter for normal flux compression */
 		uint32_t spill_offset_mean; /**< Spillover threshold parameter for auxiliary science mean compression */
 	};
 
 	union {
 		uint32_t cmp_par_3;
-		uint32_t ap2_golomb_par;           /**< Adaptive 2 spillover threshold for imagette data; HW only */
 		uint32_t cmp_par_ncob;             /**< Compression parameter for normal center of brightness compression */
 		uint32_t cmp_par_offset_variance;  /**< Compression parameter for auxiliary science variance compression */
 	};
 	union {
 		uint32_t spill_par_3;
-		uint32_t ap2_spill;                 /**< Adaptive 2 Golomb parameter; HW only */
 		uint32_t spill_ncob;                /**< Spillover threshold parameter for normal center of brightness compression */
 		uint32_t spill_offset_variance;     /**< Spillover threshold parameter for auxiliary science variance compression */
 	};
@@ -232,13 +203,13 @@ struct cmp_cfg {
 
 	union {
 		uint32_t cmp_par_5;
-		uint32_t cmp_par_ecob;                /**< Compression parameter for executed center of brightness compression */
+		uint32_t cmp_par_ecob;                /**< Compression parameter for extended center of brightness compression */
 		uint32_t cmp_par_background_variance; /**< Compression parameter for auxiliary science variance compression */
 		uint32_t cmp_par_smearing_variance;   /**< Compression parameter for auxiliary science variance compression */
 	};
 	union {
 		uint32_t spill_par_5;
-		uint32_t spill_ecob;                 /**< Spillover threshold parameter for executed center of brightness compression */
+		uint32_t spill_ecob;                 /**< Spillover threshold parameter for extended center of brightness compression */
 		uint32_t spill_background_variance;  /**< Spillover threshold parameter for auxiliary science variance compression */
 		uint32_t spill_smearing_variance;    /**< Spillover threshold parameter for auxiliary science variance compression */
 	};
@@ -255,7 +226,34 @@ struct cmp_cfg {
 		uint32_t spill_background_pixels_error; /**< Spillover threshold parameter for auxiliary science outlier pixels number compression */
 		uint32_t spill_smearing_pixels_error;   /**< Spillover threshold parameter for auxiliary science outlier pixels number compression */
 	};
-	const struct cmp_max_used_bits *max_used_bits;  /**< the maximum length of the different data products types in bits */
+};
+
+
+/**
+ * @brief RDCU configuration structure, can contain the information of the
+ *	RDCU configuration registers
+ */
+
+struct rdcu_cfg {
+	uint16_t *input_buf;         /**< Pointer to the data to compress buffer */
+	uint16_t *model_buf;         /**< Pointer to the model buffer */
+	uint16_t *icu_new_model_buf; /**< Pointer to the updated model buffer */
+	uint32_t *icu_output_buf;    /**< Pointer to the compressed data buffer */
+	uint32_t samples;            /**< Number of 16-bit samples to compress, length of the data and model buffer */
+	uint32_t buffer_length;      /**< Length of the compressed data buffer in number of samples */
+	uint32_t rdcu_data_adr;      /**< RDCU data to compress start address, the first data address in the RDCU SRAM; HW only */
+	uint32_t rdcu_model_adr;     /**< RDCU model start address, the first model address in the RDCU SRAM; HW only */
+	uint32_t rdcu_new_model_adr; /**< RDCU updated model start address, the address in the RDCU SRAM where the updated model is stored; HW only */
+	uint32_t rdcu_buffer_adr;    /**< RDCU compressed data start address, the first output data address in the RDCU SRAM; HW only */
+	enum cmp_mode cmp_mode;      /**< compression mode */
+	uint32_t model_value;        /**< Model weighting parameter */
+	uint32_t round;              /**< lossy compression parameter */
+	uint32_t golomb_par;         /**< Golomb parameter for imagette data compression */
+	uint32_t spill;              /**< Spillover threshold parameter for imagette data compression */
+	uint32_t ap1_golomb_par;     /**< Adaptive 2 spillover threshold for imagette data; HW only */
+	uint32_t ap1_spill;          /**< Adaptive 2 Golomb parameter; HW only */
+	uint32_t ap2_golomb_par;     /**< Adaptive 2 spillover threshold for imagette data; HW only */
+	uint32_t ap2_spill;          /**< Adaptive 2 Golomb parameter; HW only */
 };
 
 
@@ -275,7 +273,7 @@ struct cmp_status {
 
 
 /**
- * @brief The cmp_info structure contain the information and metadata of an
+ * @brief The cmp_info structure contains the information and metadata of an
  *	executed RDCU compression.
  */
 
@@ -283,7 +281,7 @@ struct cmp_info {
 	uint32_t cmp_mode_used;       /**< Compression mode used */
 	uint32_t spill_used;          /**< Spillover threshold used */
 	uint32_t golomb_par_used;     /**< Golomb parameter used */
-	uint32_t samples_used;        /**< Number of samples (16 bit value) to be stored */
+	uint32_t samples_used;        /**< Number of samples (16-bit value) to be stored */
 	uint32_t cmp_size;            /**< Compressed data size; measured in bits */
 	uint32_t ap1_cmp_size;        /**< Adaptive compressed data size 1; measured in bits */
 	uint32_t ap2_cmp_size;        /**< Adaptive compressed data size 2; measured in bits */
@@ -323,15 +321,10 @@ struct fx_cob_par {
 
 int is_a_pow_of_2(unsigned int v);
 unsigned int ilog_2(uint32_t x);
-
 unsigned int cmp_bit_to_byte(unsigned int cmp_size_bit);
-unsigned int cmp_bit_to_4byte(unsigned int cmp_size_bit);
 
-int cmp_cfg_icu_is_invalid(const struct cmp_cfg *cfg);
-int cmp_cfg_gen_par_is_invalid(const struct cmp_cfg *cfg, enum check_opt opt);
-int cmp_cfg_icu_buffers_is_invalid(const struct cmp_cfg *cfg);
-int cmp_cfg_icu_max_used_bits_out_of_limit(const struct cmp_max_used_bits *max_used_bits);
-int cmp_cfg_imagette_is_invalid(const struct cmp_cfg *cfg, enum check_opt opt);
+int cmp_cfg_gen_par_is_invalid(const struct cmp_cfg *cfg);
+int cmp_cfg_imagette_is_invalid(const struct cmp_cfg *cfg);
 int cmp_cfg_fx_cob_is_invalid(const struct cmp_cfg *cfg);
 int cmp_cfg_aux_is_invalid(const struct cmp_cfg *cfg);
 uint32_t cmp_ima_max_spill(unsigned int golomb_par);
@@ -348,7 +341,6 @@ int cmp_aux_data_type_is_used(enum cmp_data_type data_type);
 int cmp_mode_is_supported(enum cmp_mode cmp_mode);
 int model_mode_is_used(enum cmp_mode cmp_mode);
 int raw_mode_is_used(enum cmp_mode cmp_mode);
-int rdcu_supported_cmp_mode_is_used(enum cmp_mode cmp_mode);
 int zero_escape_mech_is_used(enum cmp_mode cmp_mode);
 int multi_escape_mech_is_used(enum cmp_mode cmp_mode);
 
diff --git a/lib/common/compiler.h b/lib/common/compiler.h
index 5128c0ccf3fc39790f87f43c7a842701ebe9a04d..298a325eca9a64902c5dcfa8d53a16fc660ac028 100644
--- a/lib/common/compiler.h
+++ b/lib/common/compiler.h
@@ -54,7 +54,7 @@
  * will cause a build error
  */
 
-#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
+#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
 
 #define bitsizeof(x)  (CHAR_BIT * sizeof(x))
 
diff --git a/lib/common/list.h b/lib/common/list.h
deleted file mode 100644
index a05803139a75738f7ddfba05048ae9c85ea91d78..0000000000000000000000000000000000000000
--- a/lib/common/list.h
+++ /dev/null
@@ -1,438 +0,0 @@
-/**
- * @file list.h
- * @ingroup linked_list
- *
- * @note This list implementation was shamelessly stolen and modified from the
- *       linux kernel's include/linux/list.h
- *       Its API (if you will) is used in this (currently non-GPL) project as
- *       under the assumption that the inclusion of header files does not
- *       automatically imply derivative work, see
- *       http://lkml.iu.edu//hypermail/linux/kernel/0301.1/0362.html
- *
- *       No explicit copyright or author statement is given in the original
- *       file, so we assume per the Linux COPYING file:
- *
- * @author Linus Torvalds (and others who actually wrote the linux kernel
- *         version)
- * @author Armin Luntzer (armin.luntzer@univie.ac.at) (local modifications or
- *         extensions)
- *
- * @copyright
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * @defgroup linked_list Linked Lists
- * @brief a modified doubly-linked list implementation from the linux kernel
- *
- *
- * This is a (slightly modified) doubly-linked list implementation from the
- * Linux kernel. An easy to understand explanation of
- * how it works and is used can be found here
- * http://kernelnewbies.org/FAQ/LinkedLists
- *
- * Be smart
- * -----
- * It is a valid to criticise linked lists as generally performing badly
- * if you traverse their entries at high frequency rather than just
- * manipulating them. This can be especially true (and has been demonstrated
- * numerous times) for implementations like std:list.
- *
- * Please consider the following though: linked lists are not inherently
- * slow because of how they work algorithmically (*the opposite is true*),
- * but rather because how their cache hit (or miss) rate is in
- * configurations where entries are randomly scattered in memory rather
- * than laid out in one big chunk.
- *
- * Be smart. Don't do that. Allocate a pool in a __single chunk__ and enjoy the
- * cache performance. Do not use larger chunks than the page size of your
- * platform if you have MMU support. If you need more than that, you probably
- * need to redesign your program anyways.
- *
- * This does of course not apply as long as you do access your lists only
- * at slow rates (i.e. in the order of several tens of ms) or if performance
- * is not at all critial.
- *
- */
-
-
-#ifndef LIST_H
-#define LIST_H
-
-#ifdef LIST_HEAD
-#undef LIST_HEAD
-#endif
-
-struct list_head {
-	struct list_head *next, *prev;
-};
-
-#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
-#define LIST_HEAD(name) \
-	struct list_head name = LIST_HEAD_INIT(name)
-
-static __inline void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next)
-{
-	next->prev = new;
-	new->next  = next;
-	new->prev  = prev;
-	prev->next = new;
-}
-
-/**
- * @brief add a new entry
- * @param new new entry to be added
- * @param head list head to add it after
- *
- * Insert a new entry after the specified head.
- * This is good for implementing stacks.
- */
-
-static __inline void list_add(struct list_head *new, struct list_head *head)
-{
-	__list_add(new, head, head->next);
-}
-
-static __inline void INIT_LIST_HEAD(struct list_head *list)
-{
-	list->next = list;
-	list->prev = list;
-}
-
-
-/**
- * @brief get the struct for this entry
- * @param ptr	the &struct list_head pointer.
- * @param type	the type of the struct this is embedded in.
- * @param member	the name of the list_struct within the struct.
- * @note add (void *) cast to suppress wcast-align warning
- */
-#define list_entry(ptr, type, member) \
-	((type *)((void *)((char *)(ptr)-__builtin_offsetof(type, member))))
-
-/**
- * list_first_entry - get the first element from a list
- * @param ptr		the list head to take the element from.
- * @param type		the type of the struct this is embedded in.
- * @param member	the name of the list_head within the struct.
- *
- * Note, that list is expected to be not empty.
- */
-#define list_first_entry(ptr, type, member) \
-	list_entry((ptr)->next, type, member)
-
-/**
- * list_last_entry - get the last element from a list
- * @param ptr		the list head to take the element from.
- * @param type		the type of the struct this is embedded in.
- * @param member	the name of the list_head within the struct.
- *
- * Note, that list is expected to be not empty.
- */
-#define list_last_entry(ptr, type, member) \
-	list_entry((ptr)->prev, type, member)
-
-/**
- * list_first_entry_or_null - get the first element from a list
- * @param ptr		the list head to take the element from.
- * @param type		the type of the struct this is embedded in.
- * @param member	the name of the list_head within the struct.
- *
- * Note that if the list is empty, it returns NULL.
- */
-#define list_first_entry_or_null(ptr, type, member) ({ \
-	struct list_head *head__ = (ptr); \
-	struct list_head *pos__ = READ_ONCE(head__->next); \
-	pos__ != head__ ? list_entry(pos__, type, member) : NULL; \
-})
-
-/**
- * list_next_entry - get the next element in list
- * @param pos		the type * to cursor
- * @param member	the name of the list_head within the struct.
- * @note modified to use __typeof__()
- */
-#define list_next_entry(pos, member) \
-	list_entry((pos)->member.next, __typeof__(*(pos)), member)
-
-/**
- * list_prev_entry - get the prev element in list
- * @param pos		the type * to cursor
- * @param member	the name of the list_head within the struct.
- */
-#define list_prev_entry(pos, member) \
-	list_entry((pos)->member.prev, __typeof__(*(pos)), member)
-
-/**
- * list_for_each	-	iterate over a list
- * @pos		the &struct list_head to use as a loop cursor.
- * @head	the head for your list.
- */
-#define list_for_each(pos, head) \
-	for (pos = (head)->next; pos != (head); pos = pos->next)
-
-/**
- * @brief iterate over list of given type
- * @param pos	the type * to use as a loop counter.
- * @param head	the head for your list.
- * @param member	the name of the list_struct within the struct.
- * @note modified to use __typeof__()
- */
-
-#define list_for_each_entry(pos, head, member)				\
-	for (pos = list_first_entry(head, __typeof__(*pos), member);	\
-	     &pos->member != (head); 					\
-	     pos = list_next_entry(pos, member))
-
-/**
- * @brief iterate over list of given type safe against removal of list entry
- * @param pos	the type * to use as a loop counter.
- * @param n		another type * to use as temporary storage
- * @param head	the head for your list.
- * @param member	the name of the list_struct within the struct.
- */
-
-#define list_for_each_entry_safe(pos, n, head, member)			\
-	for (pos = list_entry((head)->next, __typeof__(*pos), member),	\
-	     n = list_entry(pos->member.next, __typeof__(*pos), member);\
-	     &pos->member != (head); 					\
-	     pos = n, n = list_entry(n->member.next, __typeof__(*pos), member))
-
-
-/**
- * @brief iterator wrapper start
- * @param pos	the type * to use as a loop counter.
- * @param head	the head for your list.
- * @param member	the name of the list_struct within the struct.
- * @param type	the type of struct
- * @warning	requires list_entry_while() to close statement
- * @note this construction is necessary for a truly circular list that is "headless"
- *	and can be iterated from any starting element without additional overhead
- *	compared to the LIST_HEAD/list_for_each_entry approach
- * TODO: check if this is functional for all targets (confirmed: gcc 4.8.2)
- */
-
-#define list_entry_do(pos, head, member, type)		\
-	{						\
-	pos = list_entry((head), type, member);		\
-	do						\
-	{						\
-
-/**
- * @brief list iterator wrapper stop
- * @param pos	the type * to use as a loop counter.
- * @param head	the head for your list.
- * @param member	the name of the list_struct within the struct.
- * @param type	the type of struct
- * @warning	requires list_entry_do() to open statement
- * @note see list_entry_while()
- */
-
-#define list_entry_while(pos, head, member, type)		\
-	}							\
-	while (pos = list_entry(pos->member.next, type, member),\
-	       &pos->member != head); 				\
-	}
-
-/**
- * @brief the list entry do-while equivalent for a code block
- * @param pos	the type * to use as a loop counter.
- * @param head	the head for your list.
- * @param member	the name of the list_struct within the struct.
- * @param type	the type of struct
- * @param _CODE_	a code segment
- * @note see list_entry_while(), list_entry_do()
- */
-
-#define list_entry_do_while(pos, head, member, type, _CODE_) \
-	list_entry_do(pos, head, member, type)		     \
-	{						     \
-		_CODE_;					     \
-	} list_entry_while(pos, head, member, type)
-
-/**
- * @brief reverse iterate over list of given type
- * @param pos	the type * to use as a loop counter.
- * @param head	the head for your list.
- * @param member	the name of the list_struct within the struct.
- * @note slightly modified in case there is no typeof() functionality in target compiler
- */
-
-#define list_for_each_entry_rev(pos, head, member)			\
-	for (pos = list_entry((head)->prev, __typeof__(*pos), member);	\
-	     &pos->member != (head); 					\
-	     pos = list_entry(pos->member.prev, __typeof__(*pos), member))
-
-
-/*
- * @brief delete a list entry by making the prev/next entries
- *        point to each other.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static __inline void __list_del(struct list_head *prev, struct list_head *next)
-{
-	next->prev = prev;
-	prev->next = next;
-}
-
-
-/**
- * @brief deletes entry from list.
- * @param entry the element to delete from the list.
- * @note list_empty on entry does not return true after this,
- *       the entry is in an undefined state.
- */
-
-static __inline void list_del(struct list_head *entry)
-{
-	__list_del(entry->prev, entry->next);
-	entry->next = (void *) 0;
-	entry->prev = (void *) 0;
-}
-
-
-/**
- * @brief deletes entry from list.
- * @param entry the element to delete from the list.
- * @note list_empty() on entry does not return true after this, the entry is
- *        in an undefined state.
- */
-
-static __inline void __list_del_entry(struct list_head *entry)
-{
-	__list_del(entry->prev, entry->next);
-}
-
-/**
- * @brief deletes entry from list and reinitialize it.
- * @param entry the element to delete from the list.
- */
-static __inline void list_del_init(struct list_head *entry)
-{
-	__list_del_entry(entry);
-	INIT_LIST_HEAD(entry);
-}
-
-/**
- * @brief delete from one list and add as another's head
- * @param list the entry to move
- * @param head the head that will precede our entry
- */
-static __inline void list_move(struct list_head *list, struct list_head *head)
-{
-	__list_del_entry(list);
-	list_add(list, head);
-}
-
-
-/**
- * @brief add a new entry
- * @param new new entry to be added
- * @param head list head to add it before
- *
- * Insert a new entry before the specified head.
- * This is useful for implementing queues.
- */
-
-static __inline void list_add_tail(struct list_head *new, struct list_head *head)
-{
-	__list_add(new, head->prev, head);
-}
-
-
-/**
- * @brief replace old entry by new one
- * @param old	the element to be replaced
- * @param new	the new element to insert
- *
- * If the old parameter was empty, it will be overwritten.
- */
-
-static __inline void list_replace(struct list_head *old,
-				struct list_head *new)
-{
-	new->next = old->next;
-	new->next->prev = new;
-	new->prev = old->prev;
-	new->prev->next = new;
-}
-
-
-/**
- * @brief replace entry1 with entry2 and re-add entry1 at entry2's position
- * @param entry1 the location to place entry2
- * @param entry2 the location to place entry1
- */
-static __inline void list_swap(struct list_head *entry1,
-			     struct list_head *entry2)
-{
-	struct list_head *pos = entry2->prev;
-
-	list_del(entry2);
-	list_replace(entry1, entry2);
-	if (pos == entry1)
-		pos = entry2;
-	list_add(entry1, pos);
-}
-
-/**
- * @brief tests whether a list is empty
- * @param head the list to test.
- */
-
-static __inline int list_empty(struct list_head *head)
-{
-	return head->next == head;
-}
-
-/**
- * @brief tests whether there is at least one element in the list
- * @param head the list to test.
- */
-
-static __inline int list_filled(struct list_head *head)
-{
-	return head->next != head;
-}
-
-
-/**
- * @brief delete from one list and add as another's tail
- * @param list the entry to move
- * @param head the head that will follow our entry
- */
-
-static __inline void list_move_tail(struct list_head *list,
-				  struct list_head *head)
-{
-	__list_del(list->prev, list->next);
-	list_add_tail(list, head);
-}
-
-
-/**
- * @brief rotate the list to the left
- * @param head the head of the list
- */
-
-static __inline void list_rotate_left(struct list_head *head)
-{
-	struct list_head *first;
-
-	if (!list_empty(head)) {
-		first = head->next;
-		list_move_tail(first, head);
-	}
-}
-
-
-#endif
diff --git a/lib/common/meson.build b/lib/common/meson.build
index 1214439e01f215e2fd00920b6032b281209258a5..a4e99c2ff1d0f7191d2ef5cb0c72cf69d3f8abbd 100644
--- a/lib/common/meson.build
+++ b/lib/common/meson.build
@@ -3,7 +3,6 @@ common_sources = files([
   'cmp_debug.c',
   'cmp_entity.c',
   'cmp_error.c',
-  'cmp_max_used_bits.c',
   'cmp_support.c',
   'vsnprintf.c'
 ])
diff --git a/lib/common/vsnprintf.c b/lib/common/vsnprintf.c
index 87a75e1f7fd8fd1526ae7144a9c040c4a5620c95..538c69684f2c03df2bd5910c2d0bc6a6ee1a5c68 100644
--- a/lib/common/vsnprintf.c
+++ b/lib/common/vsnprintf.c
@@ -1,4 +1,4 @@
-/*
+/**
  * @author (c) Marco Paland (info@paland.com)
  *             2014-2019, PALANDesign Hannover, Germany
  *
diff --git a/lib/common/vsnprintf.h b/lib/common/vsnprintf.h
index 8afed651ce694c23b995daef1c3f354b80bb999b..ce7dcabfae8ea65ede6457005f2e32e7515c73e5 100644
--- a/lib/common/vsnprintf.h
+++ b/lib/common/vsnprintf.h
@@ -21,6 +21,9 @@
 #define VSNPRINTF_H
 
 #if (DEBUGLEVEL > 0)
+#include <stdarg.h>
+#include <stddef.h>
+
 int my_vsnprintf(char* buffer, size_t count, const char* format, va_list va);
 #endif
 
diff --git a/lib/decmp.h b/lib/decmp.h
index f39cb37d4e46d6eb32a1f5e8e6d6966a0b9df4aa..469490637ec82fb7cc1b5689f043481e6af1643b 100644
--- a/lib/decmp.h
+++ b/lib/decmp.h
@@ -19,14 +19,16 @@
 #ifndef DECMP_H
 #define DECMP_H
 
+#include <stdint.h>
+
 #include "common/cmp_entity.h"
 #include "common/cmp_support.h"
 
-int decompress_cmp_entiy(struct cmp_entity *ent, void *model_of_data,
+int decompress_cmp_entiy(const struct cmp_entity *ent, const void *model_of_data,
 			 void *up_model_buf, void *decompressed_data);
 
-int decompress_rdcu_data(uint32_t *compressed_data, const struct cmp_info *info,
-			 uint16_t *model_of_data, uint16_t *up_model_buf,
+int decompress_rdcu_data(const uint32_t *compressed_data, const struct cmp_info *info,
+			 const uint16_t *model_of_data, uint16_t *up_model_buf,
 			 uint16_t *decompressed_data);
 
 #endif /* DECMP_H */
diff --git a/lib/decompress/cmp_max_used_bits_list.c b/lib/decompress/cmp_max_used_bits_list.c
deleted file mode 100644
index 31c14b2b92cbc76304b1ab4d52f23b968eadc4b3..0000000000000000000000000000000000000000
--- a/lib/decompress/cmp_max_used_bits_list.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * @file   cmp_max_used_bits_list.c
- * @author Dominik Loidolt (dominik.loidolt@univie.ac.at)
- * @date   2023
- *
- * @copyright GPLv2
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * @brief Implement a list that can hold an arbitrary number of different
- *	cmp_max_used_bits structs
- *
- * @warning not intended for use with the flight software
- */
-
-
-#include <stdlib.h>
-
-#include "../common/list.h"
-#include "../common/cmp_max_used_bits.h"
-#include "cmp_max_used_bits_list.h"
-
-
-struct list_item {
-	struct list_head list;
-	struct cmp_max_used_bits data;
-};
-
-static LIST_HEAD(max_used_bits_list);
-
-
-/**
- * @brief get an item from the max_used_bits list
- *
- * @param version  version identifier of the max_used_bits list item
- *
- * @returns a pointer to the max_used_bits structure with the corresponding version
- *	on success; NULL if no list item has the version number
- */
-
-const struct cmp_max_used_bits *cmp_max_used_bits_list_get(uint8_t version)
-{
-	struct list_item *list_ptr = NULL;
-
-	switch (version) {
-	case 0:
-		return &MAX_USED_BITS_SAFE;
-	case 1:
-		return &MAX_USED_BITS_V1;
-
-	}
-
-	list_for_each_entry(list_ptr, &max_used_bits_list, list) {
-		if (list_ptr->data.version == version)
-			return &list_ptr->data;
-	}
-	return NULL;
-}
-
-
-/**
- * @brief add a max_used_bits item to the list
- *
- * @param item  pointer to the cmp_max_used_bits struct to add to the list
- *
- * @note if there is an item in the list with the same version number, it will
- *	be overwritten
- * @returns 0 on success; 1 if an existing entry is overwritten; -1 on error
- */
-
-int cmp_max_used_bits_list_add(struct cmp_max_used_bits const *item)
-{
-	struct list_item *item_ptr = NULL;
-
-	if (!item)
-		return -1;
-	if (item->version < CMP_MAX_USED_BITS_RESERVED_VERSIONS)
-		return -1;
-
-	/* check for an existing entry */
-	list_for_each_entry(item_ptr, &max_used_bits_list, list) {
-		if (item_ptr->data.version == item->version) {
-			item_ptr->data = *item; /* replace existing list entry */
-			return 1;
-		}
-	}
-
-	item_ptr = (struct list_item *)malloc(sizeof(struct list_item));
-	if (!item_ptr)
-		return -1;
-
-	item_ptr->data = *item;
-	list_add(&item_ptr->list, &max_used_bits_list);
-
-	return 0;
-}
-
-
-/**
- * @brief delete a max_used_bits item from the list
- *
- * @param version  version identifier of the max_used_bits list entry to be deleted
- *
- * @note if no max_used_bits list item has the version identifier, nothing happens
- */
-
-void cmp_max_used_bits_list_delet(uint8_t version)
-{
-	struct list_item *list_ptr = NULL;
-	struct list_item *tmp = NULL;
-
-	list_for_each_entry_safe(list_ptr, tmp, &max_used_bits_list, list) {
-		if (list_ptr->data.version == version) {
-			list_del(&list_ptr->list);
-			free(list_ptr);
-			list_ptr = NULL;
-		}
-	}
-}
-
-
-/**
- * @brief delete all max_used_bits item from the list
- */
-
-void cmp_max_used_bits_list_empty(void)
-{
-	struct list_item *list_ptr = NULL;
-	struct list_item *tmp = NULL;
-
-	list_for_each_entry_safe(list_ptr, tmp, &max_used_bits_list, list) {
-		list_del(&list_ptr->list);
-		free(list_ptr);
-		list_ptr = NULL;
-	}
-}
diff --git a/lib/decompress/cmp_max_used_bits_list.h b/lib/decompress/cmp_max_used_bits_list.h
deleted file mode 100644
index 317c7163fab7894654fb3d06e9911c9d64d63da2..0000000000000000000000000000000000000000
--- a/lib/decompress/cmp_max_used_bits_list.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * @file   cmp_max_used_bits_list.h
- * @author Dominik Loidolt (dominik.loidolt@univie.ac.at)
- * @date   2023
- *
- * @copyright GPLv2
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * @brief Implement a list that can hold an arbitrary number of different
- *	cmp_max_used_bits structs
- *
- * @warning not intended for use with the flight software
- */
-
-
-#ifndef CMP_MAX_USED_LIST_H
-#define CMP_MAX_USED_LIST_H
-
-#include <stdint.h>
-
-#include "../common/cmp_data_types.h"
-
-
-const struct cmp_max_used_bits *cmp_max_used_bits_list_get(uint8_t version);
-
-int cmp_max_used_bits_list_add(struct cmp_max_used_bits const *item);
-
-void cmp_max_used_bits_list_delet(uint8_t version);
-
-void cmp_max_used_bits_list_empty(void);
-
-#endif /* CMP_MAX_USED_LIST_H */
diff --git a/lib/decompress/decmp.c b/lib/decompress/decmp.c
index 82150371abf1d48a293e707da98cf5dc8c316479..02a826ddc2050bf308bd29766a88f0bcdc0b4069 100644
--- a/lib/decompress/decmp.c
+++ b/lib/decompress/decmp.c
@@ -32,15 +32,16 @@
 #include "../common/compiler.h"
 
 #include "read_bitstream.h"
-#include "cmp_max_used_bits_list.h"
+#include "../common/cmp_data_types.h"
 #include "../decmp.h"
 #include "../common/cmp_debug.h"
 #include "../common/cmp_support.h"
 #include "../common/cmp_entity.h"
+#include "../common/cmp_cal_up_model.h"
 #include "../common/cmp_max_used_bits.h"
 
 
-#define CORRUPTION_DETECTED -1
+#define CORRUPTION_DETECTED (-1)
 
 
 MAYBE_UNUSED static const char *please_check_str =
@@ -287,7 +288,7 @@ static __inline uint32_t re_map_to_pos(uint32_t value_to_unmap)
 {
 	if (value_to_unmap & 0x1) { /* if uneven */
 		/* uint64_t to prevent overflow if value_to_unmap == 0xFFFFFFFF */
-		uint64_t tmp64 = value_to_unmap;
+		uint64_t const tmp64 = value_to_unmap;
 
 		return (uint32_t)(-((tmp64 + 1) / 2));
 	} else {
@@ -297,7 +298,7 @@ static __inline uint32_t re_map_to_pos(uint32_t value_to_unmap)
 
 
 /**
- * @brief decompress the next code word in the bitstream and decorate it with
+ * @brief decompress the next code word in the bitstream and decorrelate it with
  *	the model
  *
  * @param setup		pointer to the decoder setup
@@ -311,12 +312,12 @@ static int decode_value(const struct decoder_setup *setup, uint32_t *decoded_val
 			uint32_t model)
 {
 	/* decode the next value from the bitstream */
-	int err = setup->decode_method_f(setup, decoded_value);
+	int const err = setup->decode_method_f(setup, decoded_value);
 
 	/* map the unsigned decode value back to a signed value */
 	*decoded_value = re_map_to_pos(*decoded_value);
 
-	/* decorate data the data with the model */
+	/* decorrelate data the data with the model */
 	*decoded_value += round_fwd(model, setup->lossy_par);
 
 	/* we mask only the used bits in case there is an overflow when adding the model */
@@ -330,7 +331,7 @@ static int decode_value(const struct decoder_setup *setup, uint32_t *decoded_val
 
 
 /**
- * @brief configure a decoder setup structure to have a setup to decode a vale
+ * @brief configure a decoder setup structure to have a setup to decode a value
  *
  * @param setup		pointer to the decoder setup
  * @param dec		pointer to a bit_decoder context
@@ -385,6 +386,22 @@ static void *get_collection_data(void *col)
 }
 
 
+/**
+ * @brief return a pointer of the data of a collection
+ *
+ * @param col	pointer to a collection header (can be NULL)
+ *
+ * @returns pointer to the collection data; NULL if col is NULL
+ */
+
+static const void *get_collection_data_const(const void *col)
+{
+	if (col)
+		col = (const uint8_t *)col + COLLECTION_HDR_SIZE;
+	return col;
+}
+
+
 /**
  * @brief decompress imagette data
  *
@@ -402,26 +419,26 @@ static int decompress_imagette(const struct cmp_cfg *cfg, struct bit_decoder *de
 	uint32_t max_data_bits;
 	struct decoder_setup setup;
 	uint16_t *data_buf;
-	uint16_t *model_buf;
+	const uint16_t *model_buf;
 	uint16_t *up_model_buf;
-	uint16_t *next_model_p;
+	const uint16_t *next_model_p;
 	uint16_t model;
 
 	switch (decmp_type) {
 	case RDCU_DECOMPRESSION: /* RDCU compresses the header like data */
-		data_buf = cfg->input_buf;
+		data_buf = cfg->dst;
 		model_buf = cfg->model_buf;
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 		break;
 	case ICU_DECOMRESSION:
-		data_buf = get_collection_data(cfg->input_buf);
-		model_buf = get_collection_data(cfg->model_buf);
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		data_buf = get_collection_data(cfg->dst);
+		model_buf = get_collection_data_const(cfg->model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		break;
 	}
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		model = model_buf[0];
+		model =  get_unaligned(&model_buf[0]);
 		next_model_p = &model_buf[1];
 	} else {
 		up_model_buf = NULL;
@@ -432,86 +449,44 @@ static int decompress_imagette(const struct cmp_cfg *cfg, struct bit_decoder *de
 	switch (cfg->data_type) {
 	case DATA_TYPE_IMAGETTE:
 	case DATA_TYPE_IMAGETTE_ADAPTIVE:
-		max_data_bits = cfg->max_used_bits->nc_imagette;
+		max_data_bits = MAX_USED_BITS.nc_imagette;
 		break;
 	case DATA_TYPE_SAT_IMAGETTE:
 	case DATA_TYPE_SAT_IMAGETTE_ADAPTIVE:
-		max_data_bits = cfg->max_used_bits->saturated_imagette;
+		max_data_bits = MAX_USED_BITS.saturated_imagette;
 		break;
 	default:
 	case DATA_TYPE_F_CAM_IMAGETTE:
 	case DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE:
-		max_data_bits = cfg->max_used_bits->fc_imagette;
+		max_data_bits = MAX_USED_BITS.fc_imagette;
 		break;
 	}
 
-	configure_decoder_setup(&setup, dec, cfg->cmp_mode, cfg->golomb_par,
-				cfg->spill, cfg->round, max_data_bits);
+	configure_decoder_setup(&setup, dec, cfg->cmp_mode, cfg->cmp_par_imagette,
+				cfg->spill_imagette, cfg->round, max_data_bits);
 
 	for (i = 0; ; i++) {
 		err = decode_value(&setup, &decoded_value, model);
 		if (err)
 			break;
-		data_buf[i] = (__typeof__(data_buf[i]))decoded_value;
 
-		if (up_model_buf)
-			up_model_buf[i] = cmp_up_model(data_buf[i], model, cfg->model_value,
+		put_unaligned((uint16_t)decoded_value, &data_buf[i]);
+
+		if (up_model_buf) {
+			uint16_t up_model = cmp_up_model((uint16_t)decoded_value, model, cfg->model_value,
 						       setup.lossy_par);
+			put_unaligned(up_model, &up_model_buf[i]);
+		}
 
 		if (i >= cfg->samples-1)
 			break;
 
-		model = next_model_p[i];
+		model = get_unaligned(&next_model_p[i]);
 	}
 	return err;
 }
 
 
-#if 0
-/**
- * @brief decompress the multi-entry packet header structure and sets the data,
- *	model and up_model pointers to the data after the header
- *
- * @param data		pointer to a pointer pointing to the data to be compressed
- * @param model		pointer to a pointer pointing to the model of the data
- * @param up_model	pointer to a pointer pointing to the updated model buffer
- * @param cfg		pointer to the compression configuration structure
- *
- * @returns the bit length of the bitstream on success
- *
- * @note the (void **) cast relies on all pointer types having the same internal
- *	representation which is common, but not universal; http://www.c-faq.com/ptrs/genericpp.html
- */
-
-static int decompress_multi_entry_hdr(void **data, void **model, void **up_model,
-				      const struct cmp_cfg *cfg)
-{
-	if (cfg->buffer_length < COLLECTION_HDR_SIZE)
-		return -1;
-
-	if (*data) {
-		if (cfg->icu_output_buf)
-			memcpy(*data, cfg->icu_output_buf, COLLECTION_HDR_SIZE);
-		*data = (uint8_t *)*data + COLLECTION_HDR_SIZE;
-	}
-
-	if (*model) {
-		if (cfg->icu_output_buf)
-			memcpy(*model, cfg->icu_output_buf, COLLECTION_HDR_SIZE);
-		*model = (uint8_t *)*model + COLLECTION_HDR_SIZE;
-	}
-
-	if (*up_model) {
-		if (cfg->icu_output_buf)
-			memcpy(*up_model, cfg->icu_output_buf, COLLECTION_HDR_SIZE);
-		*up_model = (uint8_t *)*up_model + COLLECTION_HDR_SIZE;
-	}
-
-	return COLLECTION_HDR_SIZE * CHAR_BIT;
-}
-#endif
-
-
 /**
  * @brief decompress short normal light flux (S_FX) data
  *
@@ -527,16 +502,16 @@ static int decompress_s_fx(const struct cmp_cfg *cfg, struct bit_decoder *dec)
 	int err;
 	uint32_t decoded_value;
 	struct decoder_setup setup_exp_flags, setup_fx;
-	struct s_fx *data_buf = get_collection_data(cfg->input_buf);
-	struct s_fx *model_buf = get_collection_data(cfg->model_buf);
+	struct s_fx *data_buf = get_collection_data(cfg->dst);
+	const struct s_fx *model_buf = get_collection_data_const(cfg->model_buf);
 	struct s_fx *up_model_buf;
-	struct s_fx *next_model_p;
+	const struct s_fx *next_model_p;
 	struct s_fx model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
@@ -544,9 +519,9 @@ static int decompress_s_fx(const struct cmp_cfg *cfg, struct bit_decoder *dec)
 	}
 
 	configure_decoder_setup(&setup_exp_flags, dec, cfg->cmp_mode, cfg->cmp_par_exp_flags,
-				cfg->spill_exp_flags, cfg->round, cfg->max_used_bits->s_exp_flags);
+				cfg->spill_exp_flags, cfg->round, MAX_USED_BITS.s_exp_flags);
 	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx,
-				cfg->spill_fx, cfg->round, cfg->max_used_bits->s_fx);
+				cfg->spill_fx, cfg->round, MAX_USED_BITS.s_fx);
 
 	for (i = 0; ; i++) {
 		err = decode_value(&setup_exp_flags, &decoded_value, model.exp_flags);
@@ -590,14 +565,14 @@ static int decompress_s_fx_efx(const struct cmp_cfg *cfg, struct bit_decoder *de
 	int err;
 	uint32_t decoded_value;
 	struct decoder_setup setup_exp_flags, setup_fx, setup_efx;
-	struct s_fx_efx *data_buf = get_collection_data(cfg->input_buf);
-	struct s_fx_efx *model_buf = get_collection_data(cfg->model_buf);
+	struct s_fx_efx *data_buf = get_collection_data(cfg->dst);
+	const struct s_fx_efx *model_buf = get_collection_data_const(cfg->model_buf);
 	struct s_fx_efx *up_model_buf;
-	struct s_fx_efx *next_model_p;
+	const struct s_fx_efx *next_model_p;
 	struct s_fx_efx model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
 	} else {
@@ -607,11 +582,11 @@ static int decompress_s_fx_efx(const struct cmp_cfg *cfg, struct bit_decoder *de
 	}
 
 	configure_decoder_setup(&setup_exp_flags, dec, cfg->cmp_mode, cfg->cmp_par_exp_flags,
-				cfg->spill_exp_flags, cfg->round, cfg->max_used_bits->s_exp_flags);
+				cfg->spill_exp_flags, cfg->round, MAX_USED_BITS.s_exp_flags);
 	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx,
-				cfg->spill_fx, cfg->round, cfg->max_used_bits->s_fx);
+				cfg->spill_fx, cfg->round, MAX_USED_BITS.s_fx);
 	configure_decoder_setup(&setup_efx, dec, cfg->cmp_mode, cfg->cmp_par_efx,
-				cfg->spill_efx, cfg->round, cfg->max_used_bits->s_efx);
+				cfg->spill_efx, cfg->round, MAX_USED_BITS.s_efx);
 
 	for (i = 0; ; i++) {
 		err = decode_value(&setup_exp_flags, &decoded_value, model.exp_flags);
@@ -662,14 +637,14 @@ static int decompress_s_fx_ncob(const struct cmp_cfg *cfg, struct bit_decoder *d
 	int err;
 	uint32_t decoded_value;
 	struct decoder_setup setup_exp_flags, setup_fx, setup_ncob;
-	struct s_fx_ncob *data_buf = get_collection_data(cfg->input_buf);
-	struct s_fx_ncob *model_buf = get_collection_data(cfg->model_buf);
+	struct s_fx_ncob *data_buf = get_collection_data(cfg->dst);
+	const struct s_fx_ncob *model_buf = get_collection_data_const(cfg->model_buf);
 	struct s_fx_ncob *up_model_buf;
-	struct s_fx_ncob *next_model_p;
+	const struct s_fx_ncob *next_model_p;
 	struct s_fx_ncob model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
 	} else {
@@ -679,11 +654,11 @@ static int decompress_s_fx_ncob(const struct cmp_cfg *cfg, struct bit_decoder *d
 	}
 
 	configure_decoder_setup(&setup_exp_flags, dec, cfg->cmp_mode, cfg->cmp_par_exp_flags,
-				cfg->spill_exp_flags, cfg->round, cfg->max_used_bits->s_exp_flags);
+				cfg->spill_exp_flags, cfg->round, MAX_USED_BITS.s_exp_flags);
 	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx,
-				cfg->spill_fx, cfg->round, cfg->max_used_bits->s_fx);
+				cfg->spill_fx, cfg->round, MAX_USED_BITS.s_fx);
 	configure_decoder_setup(&setup_ncob, dec, cfg->cmp_mode, cfg->cmp_par_ncob,
-				cfg->spill_ncob, cfg->round, cfg->max_used_bits->s_ncob);
+				cfg->spill_ncob, cfg->round, MAX_USED_BITS.s_ncob);
 
 	for (i = 0; ; i++) {
 		err = decode_value(&setup_exp_flags, &decoded_value, model.exp_flags);
@@ -741,14 +716,14 @@ static int decompress_s_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, struct bit_d
 	int err;
 	uint32_t decoded_value;
 	struct decoder_setup setup_exp_flags, setup_fx, setup_ncob, setup_efx, setup_ecob;
-	struct s_fx_efx_ncob_ecob *data_buf = get_collection_data(cfg->input_buf);
-	struct s_fx_efx_ncob_ecob *model_buf = get_collection_data(cfg->model_buf);
+	struct s_fx_efx_ncob_ecob *data_buf = get_collection_data(cfg->dst);
+	const struct s_fx_efx_ncob_ecob *model_buf = get_collection_data_const(cfg->model_buf);
 	struct s_fx_efx_ncob_ecob *up_model_buf;
-	struct s_fx_efx_ncob_ecob *next_model_p;
+	const struct s_fx_efx_ncob_ecob *next_model_p;
 	struct s_fx_efx_ncob_ecob model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
 	} else {
@@ -758,15 +733,15 @@ static int decompress_s_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, struct bit_d
 	}
 
 	configure_decoder_setup(&setup_exp_flags, dec, cfg->cmp_mode, cfg->cmp_par_exp_flags,
-				cfg->spill_exp_flags, cfg->round, cfg->max_used_bits->s_exp_flags);
+				cfg->spill_exp_flags, cfg->round, MAX_USED_BITS.s_exp_flags);
 	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->s_fx);
+				cfg->round, MAX_USED_BITS.s_fx);
 	configure_decoder_setup(&setup_ncob, dec, cfg->cmp_mode, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->s_ncob);
+				cfg->round, MAX_USED_BITS.s_ncob);
 	configure_decoder_setup(&setup_efx, dec, cfg->cmp_mode, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->s_efx);
+				cfg->round, MAX_USED_BITS.s_efx);
 	configure_decoder_setup(&setup_ecob, dec, cfg->cmp_mode, cfg->cmp_par_ecob, cfg->spill_ecob,
-				cfg->round, cfg->max_used_bits->s_ecob);
+				cfg->round, MAX_USED_BITS.s_ecob);
 
 	for (i = 0; ; i++) {
 		err = decode_value(&setup_exp_flags, &decoded_value, model.exp_flags);
@@ -830,287 +805,6 @@ static int decompress_s_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, struct bit_d
 }
 
 
-/**
- * @brief decompress fast normal light flux (F_FX) data
- *
- * @param cfg	pointer to the compression configuration structure
- * @param dec	a pointer to a bit_decoder context
- *
- * @returns 0 on success; otherwise error
- */
-
-static int decompress_f_fx(const struct cmp_cfg *cfg, struct bit_decoder *dec)
-{
-	size_t i;
-	int err;
-	uint32_t decoded_value;
-	struct decoder_setup setup_fx;
-	struct f_fx *data_buf = get_collection_data(cfg->input_buf);
-	struct f_fx *model_buf = get_collection_data(cfg->model_buf);
-	struct f_fx *up_model_buf;
-	struct f_fx *next_model_p;
-	struct f_fx model;
-
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
-		model = model_buf[0];
-		next_model_p = &model_buf[1];
-	} else {
-		up_model_buf = NULL;
-		memset(&model, 0, sizeof(model));
-		next_model_p = data_buf;
-	}
-
-	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->f_fx);
-
-	for (i = 0; ; i++) {
-		err = decode_value(&setup_fx, &decoded_value, model.fx);
-		if (err)
-			break;
-		data_buf[i].fx = decoded_value;
-
-		if (up_model_buf)
-			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
-							  cfg->model_value, setup_fx.lossy_par);
-
-		if (i >= cfg->samples-1)
-			break;
-
-		model = next_model_p[i];
-	}
-	return err;
-}
-
-
-/**
- * @brief decompress F_FX_EFX data
- *
- * @param cfg	pointer to the compression configuration structure
- * @param dec	a pointer to a bit_decoder context
- *
- * @returns 0 on success; otherwise error
- */
-
-static int decompress_f_fx_efx(const struct cmp_cfg *cfg, struct bit_decoder *dec)
-{
-	size_t i;
-	int err;
-	uint32_t decoded_value;
-	struct decoder_setup setup_fx, setup_efx;
-	struct f_fx_efx *data_buf = get_collection_data(cfg->input_buf);
-	struct f_fx_efx *model_buf = get_collection_data(cfg->model_buf);
-	struct f_fx_efx *up_model_buf;
-	struct f_fx_efx *next_model_p;
-	struct f_fx_efx model;
-
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
-		model = model_buf[0];
-		next_model_p = &model_buf[1];
-	} else {
-		up_model_buf = NULL;
-		memset(&model, 0, sizeof(model));
-		next_model_p = data_buf;
-	}
-
-	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->f_fx);
-	configure_decoder_setup(&setup_efx, dec, cfg->cmp_mode, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->f_efx);
-
-	for (i = 0; ; i++) {
-		err = decode_value(&setup_fx, &decoded_value, model.fx);
-		if (err)
-			break;
-		data_buf[i].fx = decoded_value;
-
-		err = decode_value(&setup_efx, &decoded_value, model.efx);
-		if (err)
-			break;
-		data_buf[i].efx = decoded_value;
-
-		if (up_model_buf) {
-			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
-							  cfg->model_value, setup_fx.lossy_par);
-			up_model_buf[i].efx = cmp_up_model(data_buf[i].efx, model.efx,
-							   cfg->model_value, setup_efx.lossy_par);
-		}
-
-		if (i >= cfg->samples-1)
-			break;
-
-		model = next_model_p[i];
-	}
-	return err;
-}
-
-
-/**
- * @brief decompress short F_FX_NCOB data
- *
- * @param cfg	pointer to the compression configuration structure
- * @param dec	a pointer to a bit_decoder context
- *
- * @returns 0 on success; otherwise error
- */
-
-static int decompress_f_fx_ncob(const struct cmp_cfg *cfg, struct bit_decoder *dec)
-{
-	size_t i;
-	int err;
-	uint32_t decoded_value;
-	struct decoder_setup setup_fx, setup_ncob;
-	struct f_fx_ncob *data_buf = get_collection_data(cfg->input_buf);
-	struct f_fx_ncob *model_buf = get_collection_data(cfg->model_buf);
-	struct f_fx_ncob *up_model_buf;
-	struct f_fx_ncob *next_model_p;
-	struct f_fx_ncob model;
-
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
-		model = model_buf[0];
-		next_model_p = &model_buf[1];
-	} else {
-		up_model_buf = NULL;
-		memset(&model, 0, sizeof(model));
-		next_model_p = data_buf;
-	}
-
-	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->f_fx);
-	configure_decoder_setup(&setup_ncob, dec, cfg->cmp_mode, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->f_ncob);
-
-	for (i = 0; ; i++) {
-		err = decode_value(&setup_fx, &decoded_value, model.fx);
-		if (err)
-			break;
-		data_buf[i].fx = decoded_value;
-
-		err = decode_value(&setup_ncob, &decoded_value, model.ncob_x);
-		if (err)
-			break;
-		data_buf[i].ncob_x = decoded_value;
-
-		err = decode_value(&setup_ncob, &decoded_value, model.ncob_y);
-		if (err)
-			break;
-		data_buf[i].ncob_y = decoded_value;
-
-		if (up_model_buf) {
-			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
-							  cfg->model_value, setup_fx.lossy_par);
-			up_model_buf[i].ncob_x = cmp_up_model(data_buf[i].ncob_x, model.ncob_x,
-							      cfg->model_value, setup_ncob.lossy_par);
-			up_model_buf[i].ncob_y = cmp_up_model(data_buf[i].ncob_y, model.ncob_y,
-							      cfg->model_value, setup_ncob.lossy_par);
-		}
-
-		if (i >= cfg->samples-1)
-			break;
-
-		model = next_model_p[i];
-	}
-	return err;
-}
-
-
-/**
- * @brief decompress short F_FX_NCOB_ECOB data
- *
- * @param cfg	pointer to the compression configuration structure
- * @param dec	a pointer to a bit_decoder context
- *
- * @returns 0 on success; otherwise error
- */
-
-static int decompress_f_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, struct bit_decoder *dec)
-{
-	size_t i;
-	int err;
-	uint32_t decoded_value;
-	struct decoder_setup setup_fx, setup_ncob, setup_efx, setup_ecob;
-	struct f_fx_efx_ncob_ecob *data_buf = get_collection_data(cfg->input_buf);
-	struct f_fx_efx_ncob_ecob *model_buf = get_collection_data(cfg->model_buf);
-	struct f_fx_efx_ncob_ecob *up_model_buf;
-	struct f_fx_efx_ncob_ecob *next_model_p;
-	struct f_fx_efx_ncob_ecob model;
-
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
-		model = model_buf[0];
-		next_model_p = &model_buf[1];
-	} else {
-		up_model_buf = NULL;
-		memset(&model, 0, sizeof(model));
-		next_model_p = data_buf;
-	}
-
-	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->f_fx);
-	configure_decoder_setup(&setup_ncob, dec, cfg->cmp_mode, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->f_ncob);
-	configure_decoder_setup(&setup_efx, dec, cfg->cmp_mode, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->f_efx);
-	configure_decoder_setup(&setup_ecob, dec, cfg->cmp_mode, cfg->cmp_par_ecob, cfg->spill_ecob,
-				cfg->round, cfg->max_used_bits->f_ecob);
-
-	for (i = 0; ; i++) {
-		err = decode_value(&setup_fx, &decoded_value, model.fx);
-		if (err)
-			break;
-		data_buf[i].fx = decoded_value;
-
-		err = decode_value(&setup_ncob, &decoded_value, model.ncob_x);
-		if (err)
-			break;
-		data_buf[i].ncob_x = decoded_value;
-
-		err = decode_value(&setup_ncob, &decoded_value, model.ncob_y);
-		if (err)
-			break;
-		data_buf[i].ncob_y = decoded_value;
-
-		err = decode_value(&setup_efx, &decoded_value, model.efx);
-		if (err)
-			break;
-		data_buf[i].efx = decoded_value;
-
-		err = decode_value(&setup_ecob, &decoded_value, model.ecob_x);
-		if (err)
-			break;
-		data_buf[i].ecob_x = decoded_value;
-
-		err = decode_value(&setup_ecob, &decoded_value, model.ecob_y);
-		if (err)
-			break;
-		data_buf[i].ecob_y = decoded_value;
-
-		if (up_model_buf) {
-			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
-				cfg->model_value, setup_fx.lossy_par);
-			up_model_buf[i].ncob_x = cmp_up_model(data_buf[i].ncob_x, model.ncob_x,
-				cfg->model_value, setup_ncob.lossy_par);
-			up_model_buf[i].ncob_y = cmp_up_model(data_buf[i].ncob_y, model.ncob_y,
-				cfg->model_value, setup_ncob.lossy_par);
-			up_model_buf[i].efx = cmp_up_model(data_buf[i].efx, model.efx,
-				cfg->model_value, setup_efx.lossy_par);
-			up_model_buf[i].ecob_x = cmp_up_model(data_buf[i].ecob_x, model.ecob_x,
-				cfg->model_value, setup_ecob.lossy_par);
-			up_model_buf[i].ecob_y = cmp_up_model(data_buf[i].ecob_y, model.ecob_y,
-				cfg->model_value, setup_ecob.lossy_par);
-		}
-
-		if (i >= cfg->samples-1)
-			break;
-
-		model = next_model_p[i];
-	}
-	return err;
-}
-
-
 /**
  * @brief decompress long normal light flux (L_FX) data
  *
@@ -1126,14 +820,14 @@ static int decompress_l_fx(const struct cmp_cfg *cfg, struct bit_decoder *dec)
 	int err;
 	uint32_t decoded_value;
 	struct decoder_setup setup_exp_flags, setup_fx, setup_fx_var;
-	struct l_fx *data_buf = get_collection_data(cfg->input_buf);
-	struct l_fx *model_buf = get_collection_data(cfg->model_buf);
+	struct l_fx *data_buf = get_collection_data(cfg->dst);
+	const struct l_fx *model_buf = get_collection_data_const(cfg->model_buf);
 	struct l_fx *up_model_buf;
-	struct l_fx *next_model_p;
+	const struct l_fx *next_model_p;
 	struct l_fx model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
 	} else {
@@ -1143,11 +837,11 @@ static int decompress_l_fx(const struct cmp_cfg *cfg, struct bit_decoder *dec)
 	}
 
 	configure_decoder_setup(&setup_exp_flags, dec, cfg->cmp_mode, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->l_exp_flags);
+				cfg->round, MAX_USED_BITS.l_exp_flags);
 	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->l_fx);
+				cfg->round, MAX_USED_BITS.l_fx);
 	configure_decoder_setup(&setup_fx_var, dec, cfg->cmp_mode, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_fx_variance);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance);
 
 	for (i = 0; ; i++) {
 		err = decode_value(&setup_exp_flags, &decoded_value, model.exp_flags);
@@ -1198,14 +892,14 @@ static int decompress_l_fx_efx(const struct cmp_cfg *cfg, struct bit_decoder *de
 	int err;
 	uint32_t decoded_value;
 	struct decoder_setup setup_exp_flags, setup_fx, setup_efx, setup_fx_var;
-	struct l_fx_efx *data_buf = get_collection_data(cfg->input_buf);
-	struct l_fx_efx *model_buf = get_collection_data(cfg->model_buf);
+	struct l_fx_efx *data_buf = get_collection_data(cfg->dst);
+	const struct l_fx_efx *model_buf = get_collection_data_const(cfg->model_buf);
 	struct l_fx_efx *up_model_buf;
-	struct l_fx_efx *next_model_p;
+	const struct l_fx_efx *next_model_p;
 	struct l_fx_efx model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
 	} else {
@@ -1215,13 +909,13 @@ static int decompress_l_fx_efx(const struct cmp_cfg *cfg, struct bit_decoder *de
 	}
 
 	configure_decoder_setup(&setup_exp_flags, dec, cfg->cmp_mode, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->l_exp_flags);
+				cfg->round, MAX_USED_BITS.l_exp_flags);
 	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->l_fx);
+				cfg->round, MAX_USED_BITS.l_fx);
 	configure_decoder_setup(&setup_efx, dec, cfg->cmp_mode, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->l_efx);
+				cfg->round, MAX_USED_BITS.l_efx);
 	configure_decoder_setup(&setup_fx_var, dec, cfg->cmp_mode, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_fx_variance);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance);
 
 	for (i = 0; ; i++) {
 		err = decode_value(&setup_exp_flags, &decoded_value, model.exp_flags);
@@ -1280,14 +974,14 @@ static int decompress_l_fx_ncob(const struct cmp_cfg *cfg, struct bit_decoder *d
 	uint32_t decoded_value;
 	struct decoder_setup setup_exp_flags, setup_fx, setup_ncob,
 			     setup_fx_var, setup_cob_var;
-	struct l_fx_ncob *data_buf = get_collection_data(cfg->input_buf);
-	struct l_fx_ncob *model_buf = get_collection_data(cfg->model_buf);
+	struct l_fx_ncob *data_buf = get_collection_data(cfg->dst);
+	const struct l_fx_ncob *model_buf = get_collection_data_const(cfg->model_buf);
 	struct l_fx_ncob *up_model_buf;
-	struct l_fx_ncob *next_model_p;
+	const struct l_fx_ncob *next_model_p;
 	struct l_fx_ncob model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
 	} else {
@@ -1297,15 +991,15 @@ static int decompress_l_fx_ncob(const struct cmp_cfg *cfg, struct bit_decoder *d
 	}
 
 	configure_decoder_setup(&setup_exp_flags, dec, cfg->cmp_mode, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->l_exp_flags);
+				cfg->round, MAX_USED_BITS.l_exp_flags);
 	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->l_fx);
+				cfg->round, MAX_USED_BITS.l_fx);
 	configure_decoder_setup(&setup_ncob, dec, cfg->cmp_mode, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->l_ncob);
+				cfg->round, MAX_USED_BITS.l_ncob);
 	configure_decoder_setup(&setup_fx_var, dec, cfg->cmp_mode, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_fx_variance);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance);
 	configure_decoder_setup(&setup_cob_var, dec, cfg->cmp_mode, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_cob_variance);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance);
 
 	for (i = 0; ; i++) {
 		err = decode_value(&setup_exp_flags, &decoded_value, model.exp_flags);
@@ -1385,14 +1079,14 @@ static int decompress_l_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, struct bit_d
 	uint32_t decoded_value;
 	struct decoder_setup setup_exp_flags, setup_fx, setup_ncob, setup_efx,
 			     setup_ecob, setup_fx_var, setup_cob_var;
-	struct l_fx_efx_ncob_ecob *data_buf = get_collection_data(cfg->input_buf);
-	struct l_fx_efx_ncob_ecob *model_buf = get_collection_data(cfg->model_buf);
+	struct l_fx_efx_ncob_ecob *data_buf = get_collection_data(cfg->dst);
+	const struct l_fx_efx_ncob_ecob *model_buf = get_collection_data_const(cfg->model_buf);
 	struct l_fx_efx_ncob_ecob *up_model_buf;
-	struct l_fx_efx_ncob_ecob *next_model_p;
+	const struct l_fx_efx_ncob_ecob *next_model_p;
 	struct l_fx_efx_ncob_ecob model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
 	} else {
@@ -1402,19 +1096,19 @@ static int decompress_l_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, struct bit_d
 	}
 
 	configure_decoder_setup(&setup_exp_flags, dec, cfg->cmp_mode, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->l_exp_flags);
+				cfg->round, MAX_USED_BITS.l_exp_flags);
 	configure_decoder_setup(&setup_fx, dec, cfg->cmp_mode, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->l_fx);
+				cfg->round, MAX_USED_BITS.l_fx);
 	configure_decoder_setup(&setup_ncob, dec, cfg->cmp_mode, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->l_ncob);
+				cfg->round, MAX_USED_BITS.l_ncob);
 	configure_decoder_setup(&setup_efx, dec, cfg->cmp_mode, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->l_efx);
+				cfg->round, MAX_USED_BITS.l_efx);
 	configure_decoder_setup(&setup_ecob, dec, cfg->cmp_mode, cfg->cmp_par_ecob, cfg->spill_ecob,
-				cfg->round, cfg->max_used_bits->l_ecob);
+				cfg->round, MAX_USED_BITS.l_ecob);
 	configure_decoder_setup(&setup_fx_var, dec, cfg->cmp_mode, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_fx_variance);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance);
 	configure_decoder_setup(&setup_cob_var, dec, cfg->cmp_mode, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_cob_variance);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance);
 
 	for (i = 0; ; i++) {
 		err = decode_value(&setup_exp_flags, &decoded_value, model.exp_flags);
@@ -1514,14 +1208,14 @@ static int decompress_offset(const struct cmp_cfg *cfg, struct bit_decoder *dec)
 	int err;
 	uint32_t decoded_value;
 	struct decoder_setup setup_mean, setup_var;
-	struct offset *data_buf = get_collection_data(cfg->input_buf);
-	struct offset *model_buf = get_collection_data(cfg->model_buf);
+	struct offset *data_buf = get_collection_data(cfg->dst);
+	const struct offset *model_buf = get_collection_data_const(cfg->model_buf);
 	struct offset *up_model_buf;
-	struct offset *next_model_p;
+	const struct offset *next_model_p;
 	struct offset model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
 	} else {
@@ -1535,13 +1229,13 @@ static int decompress_offset(const struct cmp_cfg *cfg, struct bit_decoder *dec)
 
 		switch (cfg->data_type) {
 		case DATA_TYPE_F_CAM_OFFSET:
-			mean_bits_used = cfg->max_used_bits->fc_offset_mean;
-			variance_bits_used = cfg->max_used_bits->fc_offset_variance;
+			mean_bits_used = MAX_USED_BITS.fc_offset_mean;
+			variance_bits_used = MAX_USED_BITS.fc_offset_variance;
 			break;
 		case DATA_TYPE_OFFSET:
 		default:
-			mean_bits_used = cfg->max_used_bits->nc_offset_mean;
-			variance_bits_used = cfg->max_used_bits->nc_offset_variance;
+			mean_bits_used = MAX_USED_BITS.nc_offset_mean;
+			variance_bits_used = MAX_USED_BITS.nc_offset_variance;
 			break;
 		}
 		configure_decoder_setup(&setup_mean, dec, cfg->cmp_mode, cfg->cmp_par_offset_mean, cfg->spill_offset_mean,
@@ -1594,14 +1288,14 @@ static int decompress_background(const struct cmp_cfg *cfg, struct bit_decoder *
 	int err;
 	uint32_t decoded_value;
 	struct decoder_setup setup_mean, setup_var, setup_pix;
-	struct background *data_buf = get_collection_data(cfg->input_buf);
-	struct background *model_buf = get_collection_data(cfg->model_buf);
+	struct background *data_buf = get_collection_data(cfg->dst);
+	const struct background *model_buf = get_collection_data_const(cfg->model_buf);
 	struct background *up_model_buf;
-	struct background *next_model_p;
+	const struct background *next_model_p;
 	struct background model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
 	} else {
@@ -1614,15 +1308,15 @@ static int decompress_background(const struct cmp_cfg *cfg, struct bit_decoder *
 
 		switch (cfg->data_type) {
 		case DATA_TYPE_F_CAM_BACKGROUND:
-			mean_used_bits = cfg->max_used_bits->fc_background_mean;
-			variance_used_bits = cfg->max_used_bits->fc_background_variance;
-			outlier_pixels_used_bits = cfg->max_used_bits->fc_background_outlier_pixels;
+			mean_used_bits = MAX_USED_BITS.fc_background_mean;
+			variance_used_bits = MAX_USED_BITS.fc_background_variance;
+			outlier_pixels_used_bits = MAX_USED_BITS.fc_background_outlier_pixels;
 			break;
 		case DATA_TYPE_BACKGROUND:
 		default:
-			mean_used_bits = cfg->max_used_bits->nc_background_mean;
-			variance_used_bits = cfg->max_used_bits->nc_background_variance;
-			outlier_pixels_used_bits = cfg->max_used_bits->nc_background_outlier_pixels;
+			mean_used_bits = MAX_USED_BITS.nc_background_mean;
+			variance_used_bits = MAX_USED_BITS.nc_background_variance;
+			outlier_pixels_used_bits = MAX_USED_BITS.nc_background_outlier_pixels;
 			break;
 		}
 
@@ -1686,14 +1380,14 @@ static int decompress_smearing(const struct cmp_cfg *cfg, struct bit_decoder *de
 	int err;
 	uint32_t decoded_value;
 	struct decoder_setup setup_mean, setup_var, setup_pix;
-	struct smearing *data_buf = get_collection_data(cfg->input_buf);
-	struct smearing *model_buf = get_collection_data(cfg->model_buf);
+	struct smearing *data_buf = get_collection_data(cfg->dst);
+	const struct smearing *model_buf = get_collection_data_const(cfg->model_buf);
 	struct smearing *up_model_buf;
-	struct smearing *next_model_p;
+	const struct smearing *next_model_p;
 	struct smearing model;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
-		up_model_buf = get_collection_data(cfg->icu_new_model_buf);
+		up_model_buf = get_collection_data(cfg->updated_model_buf);
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
 	} else {
@@ -1703,11 +1397,11 @@ static int decompress_smearing(const struct cmp_cfg *cfg, struct bit_decoder *de
 	}
 
 	configure_decoder_setup(&setup_mean, dec, cfg->cmp_mode, cfg->cmp_par_smearing_mean, cfg->spill_smearing_mean,
-				cfg->round, cfg->max_used_bits->smearing_mean);
+				cfg->round, MAX_USED_BITS.smearing_mean);
 	configure_decoder_setup(&setup_var, dec, cfg->cmp_mode, cfg->cmp_par_smearing_variance, cfg->spill_smearing_variance,
-				cfg->round, cfg->max_used_bits->smearing_variance_mean);
+				cfg->round, MAX_USED_BITS.smearing_variance_mean);
 	configure_decoder_setup(&setup_pix, dec, cfg->cmp_mode, cfg->cmp_par_smearing_pixels_error, cfg->spill_smearing_pixels_error,
-				cfg->round, cfg->max_used_bits->smearing_outlier_pixels);
+				cfg->round, MAX_USED_BITS.smearing_outlier_pixels);
 
 	for (i = 0; ; i++) {
 		err = decode_value(&setup_mean, &decoded_value, model.mean);
@@ -1757,15 +1451,15 @@ static int decompress_smearing(const struct cmp_cfg *cfg, struct bit_decoder *de
 
 static int decompress_collection_hdr(const struct cmp_cfg *cfg)
 {
-	if (cfg->buffer_length < COLLECTION_HDR_SIZE)
+	if (cfg->stream_size < COLLECTION_HDR_SIZE)
 		return -1;
 
-	if (cfg->icu_output_buf) {
-		if (cfg->input_buf)
-			memcpy(cfg->input_buf, cfg->icu_output_buf, COLLECTION_HDR_SIZE);
+	if (cfg->src) {
+		if (cfg->dst)
+			memcpy(cfg->dst, cfg->src, COLLECTION_HDR_SIZE);
 
-		if (model_mode_is_used(cfg->cmp_mode) && cfg->icu_new_model_buf)
-			memcpy(cfg->icu_new_model_buf, cfg->icu_output_buf, COLLECTION_HDR_SIZE);
+		if (model_mode_is_used(cfg->cmp_mode) && cfg->updated_model_buf)
+			memcpy(cfg->updated_model_buf, cfg->src, COLLECTION_HDR_SIZE);
 	}
 	return COLLECTION_HDR_SIZE;
 }
@@ -1792,14 +1486,14 @@ static int decompressed_data_internal(const struct cmp_cfg *cfg, enum decmp_type
 	if (!cfg)
 		return -1;
 
-	if (!cfg->icu_output_buf)
+	if (!cfg->src)
 		return -1;
 
-	if (!cfg->max_used_bits)
+	if (cmp_cfg_gen_par_is_invalid(cfg))
 		return -1;
 
 	if (cmp_imagette_data_type_is_used(cfg->data_type)) {
-		if (cmp_cfg_imagette_is_invalid(cfg, ICU_CHECK))
+		if (cmp_cfg_imagette_is_invalid(cfg))
 			return -1;
 	} else if (cmp_fx_cob_data_type_is_used(cfg->data_type)) {
 		if (cmp_cfg_fx_cob_is_invalid(cfg))
@@ -1818,25 +1512,17 @@ static int decompressed_data_internal(const struct cmp_cfg *cfg, enum decmp_type
 	data_size = cfg->samples * (uint32_t)size_of_a_sample(cfg->data_type);
 	if (decmp_type == ICU_DECOMRESSION)
 		data_size += COLLECTION_HDR_SIZE;
-	/* data_size = cmp_cal_size_of_data(cfg->samples, cfg->data_type); */
-	/* if (!cfg->input_buf || !data_size) */
-	/* 	return (int)data_size; */
 
 	if (cfg->cmp_mode == CMP_MODE_RAW) {
-		/* if (data_size < cfg->buffer_length/CHAR_BIT) */
-		/* 	return -1; */
-
-		if (cfg->input_buf) {
-			/* uint32_t s = cmp_col_get_size(cfg->icu_output_buf); */
-			/* assert(s==data_size); */
-			memcpy(cfg->input_buf, cfg->icu_output_buf, data_size);
+		if (cfg->dst) {
+			memcpy(cfg->dst, cfg->src, data_size);
 			switch (decmp_type) {
 			case ICU_DECOMRESSION:
-				if (be_to_cpu_chunk(cfg->input_buf, data_size))
+				if (be_to_cpu_chunk(cfg->dst, data_size))
 					return -1;
 				break;
 			case RDCU_DECOMPRESSION:
-				if (be_to_cpu_data_type(cfg->input_buf, data_size,
+				if (be_to_cpu_data_type(cfg->dst, data_size,
 							cfg->data_type))
 					return -1;
 				break;
@@ -1848,7 +1534,7 @@ static int decompressed_data_internal(const struct cmp_cfg *cfg, enum decmp_type
 		struct bit_decoder dec;
 		int hdr_size = 0;
 
-		if (!cfg->input_buf)
+		if (!cfg->dst)
 			return (int)data_size;
 
 		if (decmp_type == ICU_DECOMRESSION) {
@@ -1857,8 +1543,8 @@ static int decompressed_data_internal(const struct cmp_cfg *cfg, enum decmp_type
 				return -1;
 		}
 
-		bit_init_decoder(&dec, (uint8_t *)cfg->icu_output_buf+hdr_size,
-				 cfg->buffer_length-(uint32_t)hdr_size);
+		bit_init_decoder(&dec, (const uint8_t *)cfg->src+hdr_size,
+				 cfg->stream_size-(uint32_t)hdr_size);
 
 		switch (cfg->data_type) {
 		case DATA_TYPE_IMAGETTE:
@@ -1882,19 +1568,6 @@ static int decompressed_data_internal(const struct cmp_cfg *cfg, enum decmp_type
 			err = decompress_s_fx_efx_ncob_ecob(cfg, &dec);
 			break;
 
-		case DATA_TYPE_F_FX:
-			err = decompress_f_fx(cfg, &dec);
-			break;
-		case DATA_TYPE_F_FX_EFX:
-			err = decompress_f_fx_efx(cfg, &dec);
-			break;
-		case DATA_TYPE_F_FX_NCOB:
-			err = decompress_f_fx_ncob(cfg, &dec);
-			break;
-		case DATA_TYPE_F_FX_EFX_NCOB_ECOB:
-			err = decompress_f_fx_efx_ncob_ecob(cfg, &dec);
-			break;
-
 		case DATA_TYPE_L_FX:
 			err = decompress_l_fx(cfg, &dec);
 			break;
@@ -1920,6 +1593,11 @@ static int decompressed_data_internal(const struct cmp_cfg *cfg, enum decmp_type
 			err = decompress_smearing(cfg, &dec);
 			break;
 
+		case DATA_TYPE_F_FX:
+		case DATA_TYPE_F_FX_EFX:
+		case DATA_TYPE_F_FX_NCOB:
+		case DATA_TYPE_F_FX_EFX_NCOB_ECOB:
+		case DATA_TYPE_CHUNK:
 		case DATA_TYPE_UNKNOWN:
 		default:
 			err = -1;
@@ -1936,9 +1614,14 @@ static int decompressed_data_internal(const struct cmp_cfg *cfg, enum decmp_type
 			break;
 		case BIT_END_OF_BUFFER:
 			/* check if non consumed bits are zero */
-			if (bit_read_bits(&dec, sizeof(dec.bit_container)*8 - dec.bits_consumed) == 0)
-				break;
-			/* fall through */
+			{	unsigned int bits_not_read = sizeof(dec.bit_container)*8 - dec.bits_consumed;
+
+				if (bits_not_read > 57) /* can not read more than 57 bits */
+					bits_not_read = 57;
+
+				if (bit_read_bits(&dec, bits_not_read ) == 0)
+					break;
+			} /* fall through */
 		case BIT_UNFINISHED:
 			debug_print("Warning: Not all compressed data are processed.");
 			break;
@@ -1961,8 +1644,10 @@ static int decompressed_data_internal(const struct cmp_cfg *cfg, enum decmp_type
  * @returns 0 on success; otherwise error
  */
 
-static int cmp_ent_read_header(struct cmp_entity *ent, struct cmp_cfg *cfg)
+static int cmp_ent_read_header(const struct cmp_entity *ent, struct cmp_cfg *cfg)
 {
+	uint32_t org_size;
+
 	if (!cfg)
 		return -1;
 
@@ -1980,33 +1665,36 @@ static int cmp_ent_read_header(struct cmp_entity *ent, struct cmp_cfg *cfg)
 	}
 	cfg->model_value = cmp_ent_get_model_value(ent);
 	cfg->round = cmp_ent_get_lossy_cmp_par(ent);
-	cfg->buffer_length = cmp_ent_get_cmp_data_size(ent);
+	cfg->stream_size = cmp_ent_get_cmp_data_size(ent);
+
+	if (cmp_cfg_gen_par_is_invalid(cfg))
+		return -1;
 
+	org_size = cmp_ent_get_original_size(ent);
 	if (cfg->data_type == DATA_TYPE_CHUNK) {
 		cfg->samples = 0;
-		if ((cfg->buffer_length < (COLLECTION_HDR_SIZE + CMP_COLLECTION_FILD_SIZE) && (cfg->cmp_mode != CMP_MODE_RAW)) ||
-		    (cfg->buffer_length < COLLECTION_HDR_SIZE && (cfg->cmp_mode == CMP_MODE_RAW))) {
+		if ((cfg->stream_size < (COLLECTION_HDR_SIZE + CMP_COLLECTION_FILD_SIZE) && (cfg->cmp_mode != CMP_MODE_RAW)) ||
+		    (cfg->stream_size < COLLECTION_HDR_SIZE && (cfg->cmp_mode == CMP_MODE_RAW))) {
 			debug_print("Error: The compressed data size in the compression header is smaller than a collection header.");
 			return -1;
 		}
+		if (org_size < COLLECTION_HDR_SIZE) {
+			debug_print("Error: The original decompressed data size in the compression header is smaller than the minimum size.");
+			return -1;
+		}
 	} else {
-		int32_t samples = cmp_input_size_to_samples(cmp_ent_get_original_size(ent), cfg->data_type);
-
-		if (samples < 0) {
-			debug_print("Error: original_size and data product type in the compression header are not compatible.");
+		if (org_size % sizeof(uint16_t)) {
+			debug_print("Error: The original size of an imagette product type in the compression header must be a multiple of 2.");
 			cfg->samples = 0;
 			return -1;
 		}
-		cfg->samples = (uint32_t)samples;
+		cfg->samples = org_size/sizeof(uint16_t);
 	}
 
-	cfg->icu_output_buf = cmp_ent_get_data_buf(ent);
+	cfg->src = cmp_ent_get_data_buf_const(ent);
 
-	cfg->max_used_bits = cmp_max_used_bits_list_get(cmp_ent_get_max_used_bits_version(ent));
-	if (!cfg->max_used_bits) {
-		debug_print("Error: The Max. Used Bits Registry Version in the compression header is unknown.");
-		return -1;
-	}
+	if (cmp_ent_get_reserved(ent))
+		debug_print("Warning: The reserved field in the compressed header should be zero.");
 
 	if (cfg->cmp_mode == CMP_MODE_RAW) {
 		if (cmp_ent_get_original_size(ent) != cmp_ent_get_cmp_data_size(ent)) {
@@ -2017,20 +1705,22 @@ static int cmp_ent_read_header(struct cmp_entity *ent, struct cmp_cfg *cfg)
 		return 0;
 	}
 
+	if (cmp_ent_cal_hdr_size(cfg->data_type, cfg->cmp_mode == CMP_MODE_RAW)
+	    > cmp_ent_get_size(ent)) {
+		debug_print("Error: The compression entity size is smaller than the minimum allowed size.");
+		return -1;
+	}
+
 	switch (cfg->data_type) {
 	case DATA_TYPE_IMAGETTE_ADAPTIVE:
 	case DATA_TYPE_SAT_IMAGETTE_ADAPTIVE:
 	case DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE:
-		cfg->ap1_golomb_par = cmp_ent_get_ima_ap1_golomb_par(ent);
-		cfg->ap1_spill = cmp_ent_get_ima_ap1_spill(ent);
-		cfg->ap2_golomb_par = cmp_ent_get_ima_ap2_golomb_par(ent);
-		cfg->ap2_spill = cmp_ent_get_ima_ap2_spill(ent);
-		/* fall through */
+		/* we do not read in adaptive parameters */
 	case DATA_TYPE_IMAGETTE:
 	case DATA_TYPE_SAT_IMAGETTE:
 	case DATA_TYPE_F_CAM_IMAGETTE:
-		cfg->spill = cmp_ent_get_ima_spill(ent);
-		cfg->golomb_par = cmp_ent_get_ima_golomb_par(ent);
+		cfg->cmp_par_imagette = cmp_ent_get_ima_golomb_par(ent);
+		cfg->spill_imagette = cmp_ent_get_ima_spill(ent);
 		break;
 	case DATA_TYPE_OFFSET:
 	case DATA_TYPE_F_CAM_OFFSET:
@@ -2082,7 +1772,7 @@ static int cmp_ent_read_header(struct cmp_entity *ent, struct cmp_cfg *cfg)
  * @return The size of the compressed collection data in bytes
  */
 
-static uint16_t get_cmp_collection_data_length(uint8_t *cmp_col)
+static uint16_t get_cmp_collection_data_length(const uint8_t *cmp_col)
 {
 	uint16_t cmp_data_size;
 	/* If a non-raw mode is used to compress all collections, a
@@ -2123,7 +1813,7 @@ static uint16_t get_cmp_collection_data_length(uint8_t *cmp_col)
  * @return The total size of the compressed collection in bytes
  */
 
-static uint32_t get_cmp_collection_size(uint8_t *cmp_col)
+static uint32_t get_cmp_collection_size(const uint8_t *cmp_col)
 {
 	return CMP_COLLECTION_FILD_SIZE + COLLECTION_HDR_SIZE
 		+ get_cmp_collection_data_length(cmp_col);
@@ -2142,12 +1832,12 @@ static uint32_t get_cmp_collection_size(uint8_t *cmp_col)
  *	on error
  */
 
-static int get_num_of_chunks(struct cmp_entity *ent)
+static int get_num_of_chunks(const struct cmp_entity *ent)
 {
-	uint8_t *cmp_data_p = cmp_ent_get_data_buf(ent);
-	long cmp_data_size = cmp_ent_get_cmp_data_size(ent);
+	const uint8_t *cmp_data_p = cmp_ent_get_data_buf_const(ent);
+	long const cmp_data_size = cmp_ent_get_cmp_data_size(ent);
 	int n = 0;
-	uint8_t *p = cmp_data_p;
+	const uint8_t *p = cmp_data_p;
 	/* highest plausible address of compressed collection */
 	const uint8_t *limit_ptr = cmp_data_p + cmp_data_size - COLLECTION_HDR_SIZE;
 
@@ -2174,17 +1864,20 @@ static int get_num_of_chunks(struct cmp_entity *ent)
  * @param cfg			pointer to the configuration structure
  * @param coll_uncompressed	pointer to store whether the collection is
  *				uncompressed or not
+ * @param decmp_size		size of the original decompressed data
  *
  * @return the byte offset where to put the uncompressed result in the
  *	decompressed data, or -1 on error.
  */
 
-static long parse_cmp_collection(uint8_t *cmp_col, int n, struct cmp_cfg *cfg, int *coll_uncompressed)
+static long parse_cmp_collection(const uint8_t *cmp_col, int n, struct cmp_cfg *cfg,
+				 int *coll_uncompressed, int decmp_size)
 {
 	int i;
 	long decmp_pos = 0; /* position where to put the uncompressed result */
 	/* pointer to the collection header */
-	struct collection_hdr *col_hdr = (struct collection_hdr *)(cmp_col + CMP_COLLECTION_FILD_SIZE);
+	const struct collection_hdr *col_hdr =
+		(const struct collection_hdr *)(cmp_col + CMP_COLLECTION_FILD_SIZE);
 	uint32_t cmp_data_size; /* size of the compressed data in the collection (not including the header) */
 	uint16_t original_col_size; /* size of the decompressed collection data (not including the header) */
 	size_t sample_size;
@@ -2193,7 +1886,7 @@ static long parse_cmp_collection(uint8_t *cmp_col, int n, struct cmp_cfg *cfg, i
 	for (i = 0; i < n; i++) {
 		decmp_pos += cmp_col_get_size(col_hdr);
 		cmp_col += get_cmp_collection_size(cmp_col);
-		col_hdr = (struct collection_hdr *)(cmp_col + CMP_COLLECTION_FILD_SIZE);
+		col_hdr = (const struct collection_hdr *)(cmp_col + CMP_COLLECTION_FILD_SIZE);
 	}
 
 	cmp_data_size = get_cmp_collection_data_length(cmp_col);
@@ -2211,8 +1904,8 @@ static long parse_cmp_collection(uint8_t *cmp_col, int n, struct cmp_cfg *cfg, i
 	else
 		*coll_uncompressed = 0;
 
-	cfg->icu_output_buf = (void *)(col_hdr); /* unaligned cast -> reading compressed data as uint8_t * */
-	cfg->buffer_length = cmp_data_size + COLLECTION_HDR_SIZE;
+	cfg->src = col_hdr;
+	cfg->stream_size = cmp_data_size + COLLECTION_HDR_SIZE;
 
 	cfg->data_type = convert_subservice_to_cmp_data_type(cmp_col_get_subservice(col_hdr));
 	sample_size = size_of_a_sample(cfg->data_type);
@@ -2225,6 +1918,11 @@ static long parse_cmp_collection(uint8_t *cmp_col, int n, struct cmp_cfg *cfg, i
 	}
 	cfg->samples = original_col_size / sample_size;
 
+	if (decmp_pos + original_col_size + COLLECTION_HDR_SIZE > decmp_size) {
+		debug_print("Error: The compressed data and the original size do not match.");
+		return -1;
+	}
+
 	return decmp_pos;
 }
 
@@ -2244,7 +1942,7 @@ static long parse_cmp_collection(uint8_t *cmp_col, int n, struct cmp_cfg *cfg, i
  * @returns the size of the decompressed data on success; returns negative on failure
  */
 
-int decompress_cmp_entiy(struct cmp_entity *ent, void *model_of_data,
+int decompress_cmp_entiy(const struct cmp_entity *ent, const void *model_of_data,
 			 void *up_model_buf, void *decompressed_data)
 {
 	struct cmp_cfg cfg;
@@ -2267,10 +1965,10 @@ int decompress_cmp_entiy(struct cmp_entity *ent, void *model_of_data,
 
 	if (cfg.data_type != DATA_TYPE_CHUNK) { /* perform a non-chunk decompression */
 		if (cfg.cmp_mode == CMP_MODE_RAW) {
-			uint32_t data_size = cmp_cal_size_of_data(cfg.samples, cfg.data_type);
+			uint32_t data_size = cfg.samples * sizeof(uint16_t);
 
 			if (decompressed_data) {
-				memcpy(decompressed_data, cmp_ent_get_data_buf(ent), data_size);
+				memcpy(decompressed_data, cmp_ent_get_data_buf_const(ent), data_size);
 				if (cmp_input_big_to_cpu_endianness(decompressed_data, data_size, cfg.data_type))
 					return -1;
 			}
@@ -2278,8 +1976,8 @@ int decompress_cmp_entiy(struct cmp_entity *ent, void *model_of_data,
 		}
 
 		cfg.model_buf = model_of_data;
-		cfg.icu_new_model_buf = up_model_buf;
-		cfg.input_buf = decompressed_data;
+		cfg.updated_model_buf = up_model_buf;
+		cfg.dst = decompressed_data;
 
 		return decompressed_data_internal(&cfg, RDCU_DECOMPRESSION);
 	}
@@ -2288,14 +1986,10 @@ int decompress_cmp_entiy(struct cmp_entity *ent, void *model_of_data,
 
 	if (cfg.cmp_mode == CMP_MODE_RAW) {
 		if (decompressed_data) {
-			memcpy(decompressed_data, cfg.icu_output_buf, cfg.buffer_length);
-			cpu_to_be_chunk(decompressed_data, cfg.buffer_length);
+			memcpy(decompressed_data, cfg.src, cfg.stream_size);
+			cpu_to_be_chunk(decompressed_data, cfg.stream_size);
 		}
-		/* if (up_model_buf) { /1* TODO: if diff non model mode? *1/ */
-		/* 	memcpy(up_model_buf, cfg.icu_output_buf, cfg.buffer_length); */
-		/* 	cpu_to_be_chunk(up_model_buf, cfg.buffer_length); */
-		/* } */
-		return (int)cfg.buffer_length;
+		return (int)cfg.stream_size;
 	}
 
 	n_chunks = get_num_of_chunks(ent);
@@ -2306,23 +2000,23 @@ int decompress_cmp_entiy(struct cmp_entity *ent, void *model_of_data,
 		int decmp_chunk_size;
 		int col_uncompressed;
 		struct cmp_cfg cmp_cpy = cfg;
-		long offset = parse_cmp_collection(cmp_ent_get_data_buf(ent), i,
-						   &cmp_cpy, &col_uncompressed);
+		long offset = parse_cmp_collection(cmp_ent_get_data_buf_const(ent), i,
+						   &cmp_cpy, &col_uncompressed, decmp_size);
 		if (offset < 0)
 			return -1;
 
 		if (decompressed_data)
-			cmp_cpy.input_buf = (uint8_t *)decompressed_data + offset;
+			cmp_cpy.dst = (uint8_t *)decompressed_data + offset;
 		if (model_of_data)
-			cmp_cpy.model_buf = (uint8_t *)model_of_data + offset;
+			cmp_cpy.model_buf = (const uint8_t *)model_of_data + offset;
 		if (up_model_buf)
-			cmp_cpy.icu_new_model_buf = (uint8_t *)up_model_buf + offset;
+			cmp_cpy.updated_model_buf = (uint8_t *)up_model_buf + offset;
 
 		if (col_uncompressed) {
-			if (cmp_cpy.icu_new_model_buf && model_mode_is_used(cmp_cpy.cmp_mode)) {
-				uint32_t s = cmp_cpy.buffer_length;
-				memcpy(cmp_cpy.icu_new_model_buf, cmp_cpy.icu_output_buf, s);
-				if (be_to_cpu_chunk(cmp_cpy.icu_new_model_buf, s))
+			if (cmp_cpy.updated_model_buf && model_mode_is_used(cmp_cpy.cmp_mode)) {
+				uint32_t s = cmp_cpy.stream_size;
+				memcpy(cmp_cpy.updated_model_buf, cmp_cpy.src, s);
+				if (be_to_cpu_chunk(cmp_cpy.updated_model_buf, s))
 					return -1;
 			}
 			cmp_cpy.cmp_mode = CMP_MODE_RAW;
@@ -2354,8 +2048,8 @@ int decompress_cmp_entiy(struct cmp_entity *ent, void *model_of_data,
  * @returns the size of the decompressed data on success; returns negative on failure
  */
 
-int decompress_rdcu_data(uint32_t *compressed_data, const struct cmp_info *info,
-			 uint16_t *model_of_data, uint16_t *up_model_buf,
+int decompress_rdcu_data(const uint32_t *compressed_data, const struct cmp_info *info,
+			 const uint16_t *model_of_data, uint16_t *up_model_buf,
 			 uint16_t *decompressed_data)
 
 {
@@ -2374,18 +2068,17 @@ int decompress_rdcu_data(uint32_t *compressed_data, const struct cmp_info *info,
 
 	cfg.data_type = DATA_TYPE_IMAGETTE;
 	cfg.model_buf = model_of_data;
-	cfg.icu_new_model_buf = up_model_buf;
-	cfg.input_buf = decompressed_data;
+	cfg.updated_model_buf = up_model_buf;
+	cfg.dst = decompressed_data;
 
 	cfg.cmp_mode = info->cmp_mode_used;
 	cfg.model_value = info->model_value_used;
 	cfg.round = info->round_used;
-	cfg.spill = info->spill_used;
-	cfg.golomb_par = info->golomb_par_used;
+	cfg.spill_imagette = info->spill_used;
+	cfg.cmp_par_imagette = info->golomb_par_used;
 	cfg.samples = info->samples_used;
-	cfg.icu_output_buf = compressed_data;
-	cfg.buffer_length = (info->cmp_size+7)/8;
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
+	cfg.src = compressed_data;
+	cfg.stream_size = (info->cmp_size+7)/8;
 
 	return decompressed_data_internal(&cfg, RDCU_DECOMPRESSION);
 }
diff --git a/lib/decompress/meson.build b/lib/decompress/meson.build
index 08da610cfc6ae1e4af843f77c64ed70254d884c0..62ab3972090c12fdefde16946cda6ca4f92e36e0 100644
--- a/lib/decompress/meson.build
+++ b/lib/decompress/meson.build
@@ -1,4 +1,3 @@
 decompress_sources = files([
-  'cmp_max_used_bits_list.c',
   'decmp.c'
 ])
diff --git a/lib/decompress/read_bitstream.h b/lib/decompress/read_bitstream.h
index f46804c1841315a5e7e912aea4da13fccbc84cf6..f6bcc3a80118e4b20c7c6ae3de499088fba881d5 100644
--- a/lib/decompress/read_bitstream.h
+++ b/lib/decompress/read_bitstream.h
@@ -260,7 +260,7 @@ static __inline uint64_t bit_read_bits(struct bit_decoder *dec, unsigned int nb_
 
 
 /**
- * @brief same as bit_read_bits32() but only returns 32 bit
+ * @brief same as bit_read_bits32() but only returns maximum 32 bit
  * @warning do not read more bits than the local register has unconsumed bits.
  *	If you do this, the bit_refill function will return the BIT_OVERFLOW
  *	status the next time the register is refilled.
@@ -268,7 +268,7 @@ static __inline uint64_t bit_read_bits(struct bit_decoder *dec, unsigned int nb_
  * @param dec		pointer to a bit_decoder context
  * @param nb_bits	number of bits to read; only works if 1 <= nb_bits <= 32
  *
- * @returns extracted 32 bit value
+ * @returns extracted maximum 32 bit value
  */
 
 static __inline uint32_t bit_read_bits32(struct bit_decoder *dec, unsigned int nb_bits)
diff --git a/lib/icu_compress/cmp_chunk_type.c b/lib/icu_compress/cmp_chunk_type.c
new file mode 100644
index 0000000000000000000000000000000000000000..c6b9c45a6b32b6d9997bc7ecb5a6212a4659b2be
--- /dev/null
+++ b/lib/icu_compress/cmp_chunk_type.c
@@ -0,0 +1,82 @@
+/**
+ * @file   cmp_chunk_type.h
+ * @author Dominik Loidolt (dominik.loidolt@univie.ac.at)
+ * @date   2024
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * @brief functions and definitions for determining the chunk type of PLATO data
+ */
+
+#include "cmp_chunk_type.h"
+#include "../common/cmp_debug.h"
+#include "../common/cmp_data_types.h"
+
+
+/**
+ * @brief get the chunk_type of a collection
+ * @details map a sub-service to a chunk service according to
+ *	DetailedBudgetWorking_2023-10-11
+ *
+ * @param col	pointer to a collection header
+ *
+ * @returns chunk type of the collection, CHUNK_TYPE_UNKNOWN on
+ *	failure
+ */
+
+enum chunk_type cmp_col_get_chunk_type(const struct collection_hdr *col)
+{
+	enum chunk_type chunk_type;
+
+	switch (cmp_col_get_subservice(col)) {
+	case SST_NCxx_S_SCIENCE_IMAGETTE:
+		chunk_type = CHUNK_TYPE_NCAM_IMAGETTE;
+		break;
+	case SST_NCxx_S_SCIENCE_SAT_IMAGETTE:
+		chunk_type = CHUNK_TYPE_SAT_IMAGETTE;
+		break;
+	case SST_NCxx_S_SCIENCE_OFFSET:
+	case SST_NCxx_S_SCIENCE_BACKGROUND:
+		chunk_type = CHUNK_TYPE_OFFSET_BACKGROUND;
+		break;
+	case SST_NCxx_S_SCIENCE_SMEARING:
+		chunk_type = CHUNK_TYPE_SMEARING;
+		break;
+	case SST_NCxx_S_SCIENCE_S_FX:
+	case SST_NCxx_S_SCIENCE_S_FX_EFX:
+	case SST_NCxx_S_SCIENCE_S_FX_NCOB:
+	case SST_NCxx_S_SCIENCE_S_FX_EFX_NCOB_ECOB:
+		chunk_type = CHUNK_TYPE_SHORT_CADENCE;
+		break;
+	case SST_NCxx_S_SCIENCE_L_FX:
+	case SST_NCxx_S_SCIENCE_L_FX_EFX:
+	case SST_NCxx_S_SCIENCE_L_FX_NCOB:
+	case SST_NCxx_S_SCIENCE_L_FX_EFX_NCOB_ECOB:
+		chunk_type = CHUNK_TYPE_LONG_CADENCE;
+		break;
+	case SST_FCx_S_SCIENCE_IMAGETTE:
+	case SST_FCx_S_SCIENCE_OFFSET_VALUES:
+	case SST_FCx_S_BACKGROUND_VALUES:
+		chunk_type = CHUNK_TYPE_F_CHAIN;
+		break;
+	case SST_NCxx_S_SCIENCE_F_FX:
+	case SST_NCxx_S_SCIENCE_F_FX_EFX:
+	case SST_NCxx_S_SCIENCE_F_FX_NCOB:
+	case SST_NCxx_S_SCIENCE_F_FX_EFX_NCOB_ECOB:
+		debug_print("Error: No chunk is defined for fast cadence subservices");
+		/* fall through */
+	default:
+		chunk_type = CHUNK_TYPE_UNKNOWN;
+		break;
+	}
+
+	return chunk_type;
+}
diff --git a/lib/icu_compress/cmp_chunk_type.h b/lib/icu_compress/cmp_chunk_type.h
new file mode 100644
index 0000000000000000000000000000000000000000..b72669216e2578da8d7038edd65cf100e19e596f
--- /dev/null
+++ b/lib/icu_compress/cmp_chunk_type.h
@@ -0,0 +1,44 @@
+/**
+ * @file   cmp_chunk_type.h
+ * @author Dominik Loidolt (dominik.loidolt@univie.ac.at)
+ * @date   2024
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * @brief functions and definitions for determining the chunk type of PLATO data
+ */
+
+#ifndef CMP_CHUNK_TYPE_H
+#define CMP_CHUNK_TYPE_H
+
+#include "../common/cmp_data_types.h"
+
+
+/**
+ * @brief types of chunks containing different types of collections
+ *	according to DetailedBudgetWorking_2023-10-11
+ */
+
+enum chunk_type {
+	CHUNK_TYPE_UNKNOWN,
+	CHUNK_TYPE_NCAM_IMAGETTE,
+	CHUNK_TYPE_SHORT_CADENCE,
+	CHUNK_TYPE_LONG_CADENCE,
+	CHUNK_TYPE_SAT_IMAGETTE,
+	CHUNK_TYPE_OFFSET_BACKGROUND, /* N-CAM */
+	CHUNK_TYPE_SMEARING,
+	CHUNK_TYPE_F_CHAIN
+};
+
+
+enum chunk_type cmp_col_get_chunk_type(const struct collection_hdr *col);
+
+#endif /* CMP_CHUNK_TYPE_H */
diff --git a/lib/icu_compress/cmp_icu.c b/lib/icu_compress/cmp_icu.c
index faa9d53d9f374aebd2647bee34519bef2cb40dbe..f35021393875af99470c1b840abccce5653f95c8 100644
--- a/lib/icu_compress/cmp_icu.c
+++ b/lib/icu_compress/cmp_icu.c
@@ -23,12 +23,17 @@
 #include <limits.h>
 
 #include "../common/byteorder.h"
+#include "../common/compiler.h"
 #include "../common/cmp_debug.h"
 #include "../common/cmp_data_types.h"
 #include "../common/cmp_support.h"
+#include "../common/cmp_cal_up_model.h"
+#include "../common/cmp_max_used_bits.h"
 #include "../common/cmp_entity.h"
 #include "../common/cmp_error.h"
+#include "../common/cmp_error_list.h"
 #include "../common/leon_inttypes.h"
+#include "cmp_chunk_type.h"
 
 #include "../cmp_icu.h"
 #include "../cmp_chunk.h"
@@ -62,24 +67,17 @@ static uint64_t (*get_timestamp)(void) = default_get_timestamp;
 static uint32_t version_identifier;
 
 
-/**
- * @brief pointer to a code word generation function
- */
-
-typedef uint32_t (*generate_cw_f_pt)(uint32_t value, uint32_t encoder_par1,
-				     uint32_t encoder_par2, uint32_t *cw);
-
-
 /**
  * @brief structure to hold a setup to encode a value
  */
 
 struct encoder_setup {
-	generate_cw_f_pt generate_cw_f; /**< function pointer to a code word encoder */
+	uint32_t (*generate_cw_f)(uint32_t value, uint32_t encoder_par1,
+				  uint32_t encoder_par2, uint32_t *cw); /**< function pointer to a code word encoder */
 	uint32_t (*encode_method_f)(uint32_t data, uint32_t model, uint32_t stream_len,
-			       const struct encoder_setup *setup); /**< pointer to the encoding function */
+				    const struct encoder_setup *setup); /**< pointer to the encoding function */
 	uint32_t *bitstream_adr; /**< start address of the compressed data bitstream */
-	uint32_t max_stream_len; /**< maximum length of the bitstream/icu_output_buf in bits */
+	uint32_t max_stream_len; /**< maximum length of the bitstream in bits */
 	uint32_t encoder_par1;   /**< encoding parameter 1 */
 	uint32_t encoder_par2;   /**< encoding parameter 2 */
 	uint32_t spillover_par;  /**< outlier parameter */
@@ -88,282 +86,6 @@ struct encoder_setup {
 };
 
 
-/**
- * @brief create an ICU compression configuration
- *
- * @param data_type	compression data product type
- * @param cmp_mode	compression mode
- * @param model_value	model weighting parameter (only needed for model compression mode)
- * @param lossy_par	lossy rounding parameter (use CMP_LOSSLESS for lossless compression)
- *
- * @returns a compression configuration containing the chosen parameters;
- *	on error the data_type record is set to DATA_TYPE_UNKNOWN
- */
-
-struct cmp_cfg cmp_cfg_icu_create(enum cmp_data_type data_type, enum cmp_mode cmp_mode,
-				  uint32_t model_value, uint32_t lossy_par)
-{
-	struct cmp_cfg cfg;
-
-	memset(&cfg, 0, sizeof(cfg));
-
-	cfg.data_type = data_type;
-	cfg.cmp_mode = cmp_mode;
-	cfg.model_value = model_value;
-	cfg.round = lossy_par;
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
-
-	if (cmp_cfg_gen_par_is_invalid(&cfg, ICU_CHECK) || data_type == DATA_TYPE_CHUNK)
-		cfg.data_type = DATA_TYPE_UNKNOWN;
-
-	return cfg;
-}
-
-
-/**
- * @brief set up the different data buffers for an ICU compression
- *
- * @param cfg			pointer to a compression configuration (created
- *				with the cmp_cfg_icu_create() function)
- * @param data_to_compress	pointer to the data to be compressed
- * @param data_samples		length of the data to be compressed measured in
- *				data samples/entities (collection header not
- *				included by imagette data)
- * @param model_of_data		pointer to model data buffer (can be NULL if no
- *				model compression mode is used)
- * @param updated_model		pointer to store the updated model for the next
- *				model mode compression (can be the same as the model_of_data
- *				buffer for in-place update or NULL if updated model is not needed)
- * @param compressed_data	pointer to the compressed data buffer (can be NULL)
- * @param compressed_data_len_samples	length of the compressed_data buffer in
- *					measured in the same units as the data_samples
- *
- * @returns the size of the compressed_data buffer on success; 0 if the
- *	parameters are invalid
- *
- * @note There is a difference in the data_samples parameter when compressing
- * imagette data compared to compressing non-imagette data!
- * When compressing non-imagette data, the compressor expects that the
- * collection header will always prefix the non-imagette data. Therefore, the
- * data_samples parameter is simply the number of entries in the collection. It
- * is not intended to join multiple non-imagette collections and compress them
- * together.
- * When compressing imagette data, the length of the entire data to be
- * compressed, including the collection header, is measured in 16-bit samples.
- * The compressor makes in this case no distinction between header and imagette
- * data. Therefore, the data_samples parameter is the number of 16-bit imagette
- * pixels plus the length of the collection header, measured in 16-bit units.
- * The compression of multiple joined collections is possible.
- */
-
-uint32_t cmp_cfg_icu_buffers(struct cmp_cfg *cfg, void *data_to_compress,
-			     uint32_t data_samples, void *model_of_data,
-			     void *updated_model, uint32_t *compressed_data,
-			     uint32_t compressed_data_len_samples)
-{
-	uint32_t cmp_data_size, hdr_size;
-
-	if (!cfg) {
-		debug_print("Error: pointer to the compression configuration structure is NULL.");
-		return 0;
-	}
-
-	cfg->input_buf = data_to_compress;
-	cfg->model_buf = model_of_data;
-	cfg->samples = data_samples;
-	cfg->icu_new_model_buf = updated_model;
-	cfg->icu_output_buf = compressed_data;
-	/* cfg->buffer_length = cmp_data_size; */
-	cfg->buffer_length = compressed_data_len_samples;
-
-	if (cmp_cfg_icu_buffers_is_invalid(cfg))
-		return 0;
-
-	cmp_data_size = cmp_cal_size_of_data(compressed_data_len_samples, cfg->data_type);
-	hdr_size = cmp_ent_cal_hdr_size(cfg->data_type, cfg->cmp_mode == CMP_MODE_RAW);
-
-	if ((cmp_data_size + hdr_size) > CMP_ENTITY_MAX_SIZE || cmp_data_size > CMP_ENTITY_MAX_SIZE) {
-		debug_print("Error: The buffer for the compressed data is too large to fit in a compression entity.");
-		return 0;
-	}
-
-	return cmp_data_size;
-}
-
-
-/**
- * @brief set up the maximum length of the different data product types for
- *	an ICU compression
- *
- * @param cfg		pointer to a compression configuration (created with the
- *			cmp_cfg_icu_create() function)
- * @param max_used_bits	pointer to a max_used_bits struct containing the maximum
- *			length of the different data product types
- *
- * @returns 0 if all max_used_bits parameters are valid, non-zero if parameters are invalid
- *
- * @note the cmp_cfg_icu_create() function set the max_used_bits configuration to
- *	MAX_USED_BITS_SAFE
- */
-
-int cmp_cfg_icu_max_used_bits(struct cmp_cfg *cfg, const struct cmp_max_used_bits *max_used_bits)
-{
-	if (!cfg)
-		return -1;
-
-	cfg->max_used_bits = max_used_bits;
-
-	if (cmp_cfg_icu_max_used_bits_out_of_limit(max_used_bits))
-		return -1;
-
-	return 0;
-}
-
-
-/**
- * @brief set up the configuration parameters for an ICU imagette compression
- *
- * @param cfg			pointer to a compression configuration (created
- *				by the cmp_cfg_icu_create() function)
- * @param cmp_par		imagette compression parameter (Golomb parameter)
- * @param spillover_par		imagette spillover threshold parameter
- *
- * @returns 0 if parameters are valid, non-zero if parameters are invalid
- */
-
-int cmp_cfg_icu_imagette(struct cmp_cfg *cfg, uint32_t cmp_par,
-			 uint32_t spillover_par)
-{
-	if (!cfg)
-		return -1;
-
-	cfg->golomb_par = cmp_par;
-	cfg->spill = spillover_par;
-
-	if (cmp_cfg_imagette_is_invalid(cfg, ICU_CHECK))
-		return -1;
-
-	return 0;
-}
-
-
-/**
- * @brief set up the configuration parameters for a flux/COB compression
- * @note not all parameters are needed for every flux/COB compression data type
- *
- * @param cfg			pointer to a compression configuration (created
- *				by the cmp_cfg_icu_create() function)
- * @param cmp_par_exp_flags	exposure flags compression parameter
- * @param spillover_exp_flags	exposure flags spillover threshold parameter
- * @param cmp_par_fx		normal flux compression parameter
- * @param spillover_fx		normal flux spillover threshold parameter
- * @param cmp_par_ncob		normal center of brightness compression parameter
- * @param spillover_ncob	normal center of brightness spillover threshold parameter
- * @param cmp_par_efx		extended flux compression parameter
- * @param spillover_efx		extended flux spillover threshold parameter
- * @param cmp_par_ecob		extended center of brightness compression parameter
- * @param spillover_ecob	extended center of brightness spillover threshold parameter
- * @param cmp_par_fx_cob_variance	flux/COB variance compression parameter
- * @param spillover_fx_cob_variance	flux/COB variance spillover threshold parameter
- *
- * @returns 0 if parameters are valid, non-zero if parameters are invalid
- */
-
-int cmp_cfg_fx_cob(struct cmp_cfg *cfg,
-		   uint32_t cmp_par_exp_flags, uint32_t spillover_exp_flags,
-		   uint32_t cmp_par_fx, uint32_t spillover_fx,
-		   uint32_t cmp_par_ncob, uint32_t spillover_ncob,
-		   uint32_t cmp_par_efx, uint32_t spillover_efx,
-		   uint32_t cmp_par_ecob, uint32_t spillover_ecob,
-		   uint32_t cmp_par_fx_cob_variance, uint32_t spillover_fx_cob_variance)
-{
-	if (!cfg)
-		return -1;
-
-	cfg->cmp_par_exp_flags = cmp_par_exp_flags;
-	cfg->cmp_par_fx = cmp_par_fx;
-	cfg->cmp_par_ncob = cmp_par_ncob;
-	cfg->cmp_par_efx = cmp_par_efx;
-	cfg->cmp_par_ecob = cmp_par_ecob;
-	cfg->cmp_par_fx_cob_variance = cmp_par_fx_cob_variance;
-
-	cfg->spill_exp_flags = spillover_exp_flags;
-	cfg->spill_fx = spillover_fx;
-	cfg->spill_ncob = spillover_ncob;
-	cfg->spill_efx = spillover_efx;
-	cfg->spill_ecob = spillover_ecob;
-	cfg->spill_fx_cob_variance = spillover_fx_cob_variance;
-
-	if (cmp_cfg_fx_cob_is_invalid(cfg))
-		return -1;
-
-	return 0;
-}
-
-
-/**
- * @brief set up the configuration parameters for an auxiliary science data compression
- * @note auxiliary compression data types are: DATA_TYPE_OFFSET, DATA_TYPE_BACKGROUND,
-	DATA_TYPE_SMEARING, DATA_TYPE_F_CAM_OFFSET, DATA_TYPE_F_CAM_BACKGROUND
- * @note not all parameters are needed for every auxiliary compression data type
- *
- * @param cfg				pointer to a compression configuration (created
- *					with the cmp_cfg_icu_create() function)
- * @param cmp_par_mean			mean compression parameter
- * @param spillover_mean		mean spillover threshold parameter
- * @param cmp_par_variance		variance compression parameter
- * @param spillover_variance		variance spillover threshold parameter
- * @param cmp_par_pixels_error		outlier pixels number compression parameter
- * @param spillover_pixels_error	outlier pixels number spillover threshold parameter
- *
- * @returns 0 if parameters are valid, non-zero if parameters are invalid
- */
-
-int cmp_cfg_aux(struct cmp_cfg *cfg,
-		uint32_t cmp_par_mean, uint32_t spillover_mean,
-		uint32_t cmp_par_variance, uint32_t spillover_variance,
-		uint32_t cmp_par_pixels_error, uint32_t spillover_pixels_error)
-{
-	if (!cfg)
-		return -1;
-
-	switch (cfg->data_type) {
-	case DATA_TYPE_OFFSET:
-	case DATA_TYPE_F_CAM_OFFSET:
-		cfg->cmp_par_offset_mean = cmp_par_mean;
-		cfg->spill_offset_mean = spillover_mean;
-		cfg->cmp_par_offset_variance = cmp_par_variance;
-		cfg->spill_offset_variance = spillover_variance;
-		break;
-	case DATA_TYPE_BACKGROUND:
-	case DATA_TYPE_F_CAM_BACKGROUND:
-		cfg->cmp_par_background_mean = cmp_par_mean;
-		cfg->spill_background_mean = spillover_mean;
-		cfg->cmp_par_background_variance = cmp_par_variance;
-		cfg->spill_background_variance = spillover_variance;
-		cfg->cmp_par_background_pixels_error = cmp_par_pixels_error;
-		cfg->spill_background_pixels_error = spillover_pixels_error;
-		break;
-	case DATA_TYPE_SMEARING:
-		cfg->cmp_par_smearing_mean = cmp_par_mean;
-		cfg->spill_smearing_mean = spillover_mean;
-		cfg->cmp_par_smearing_variance = cmp_par_variance;
-		cfg->spill_smearing_variance = spillover_variance;
-		cfg->cmp_par_smearing_pixels_error = cmp_par_pixels_error;
-		cfg->spill_smearing_pixels_error = spillover_pixels_error;
-		break;
-	default:
-		debug_print("Error: The compression data type is not an auxiliary science compression data type.");
-		return -1;
-	}
-
-	if (cmp_cfg_aux_is_invalid(cfg))
-		return -1;
-
-	return 0;
-}
-
-
 /**
  * @brief map a signed value into a positive value range
  *
@@ -376,8 +98,8 @@ int cmp_cfg_aux(struct cmp_cfg *cfg,
 
 static uint32_t map_to_pos(uint32_t value_to_map, unsigned int max_data_bits)
 {
+	uint32_t const mask = (~0U >> (32 - max_data_bits)); /* mask the used bits */
 	uint32_t result;
-	uint32_t mask = (~0U >> (32 - max_data_bits)); /* mask the used bits */
 
 	value_to_map &= mask;
 	if (value_to_map >> (max_data_bits - 1)) { /* check the leading signed bit */
@@ -412,7 +134,7 @@ static uint32_t map_to_pos(uint32_t value_to_map, unsigned int max_data_bits)
  */
 
 static uint32_t put_n_bits32(uint32_t value, unsigned int n_bits, uint32_t bit_offset,
-			uint32_t *bitstream_adr, unsigned int max_stream_len)
+			     uint32_t *bitstream_adr, unsigned int max_stream_len)
 {
 	/*
 	 *                               UNSEGMENTED
@@ -424,10 +146,10 @@ static uint32_t put_n_bits32(uint32_t value, unsigned int n_bits, uint32_t bit_o
 	 * |-----------------------------|XXX|XXX|-----------------------------|
 	 * |----------bits_left----------|n_bits-|---------bits_right----------|
 	 */
-	uint32_t bits_left = bit_offset & 0x1F;
-	uint32_t bits_right = 64 - bits_left - n_bits;
-	uint32_t shift_left = 32 - n_bits;
-	uint32_t stream_len = n_bits + bit_offset; /* no check for overflow */
+	uint32_t const bits_left = bit_offset & 0x1F;
+	uint32_t const bits_right = 64 - bits_left - n_bits;
+	uint32_t const shift_left = 32 - n_bits;
+	uint32_t const stream_len = n_bits + bit_offset; /* no check for overflow */
 	uint32_t *local_adr;
 	uint32_t mask, tmp;
 
@@ -442,7 +164,7 @@ static uint32_t put_n_bits32(uint32_t value, unsigned int n_bits, uint32_t bit_o
 
 	/* Check if the bitstream buffer is large enough */
 	if (stream_len > max_stream_len)
-		return CMP_ERROR(SMALL_BUF_);
+		return CMP_ERROR(SMALL_BUFFER);
 
 	local_adr = bitstream_adr + (bit_offset >> 5);
 
@@ -480,7 +202,7 @@ static uint32_t put_n_bits32(uint32_t value, unsigned int n_bits, uint32_t bit_o
  *			for better performance
  * @param cw		address where the code word is stored
  *
- * @warning no check of the validity of the input parameters!
+ * @warning there is no check of the validity of the input parameters!
  * @returns the length of the formed code word in bits; the code word is invalid
  *	if the return value is greater than 32
  */
@@ -488,11 +210,11 @@ static uint32_t put_n_bits32(uint32_t value, unsigned int n_bits, uint32_t bit_o
 static uint32_t rice_encoder(uint32_t value, uint32_t m, uint32_t log2_m,
 			     uint32_t *cw)
 {
-	uint32_t q = value >> log2_m;   /* quotient of value/m */
-	uint32_t qc = (1U << q) - 1;    /* quotient code without ending zero */
+	uint32_t const q = value >> log2_m;  /* quotient of value/m */
+	uint32_t const qc = (1U << q) - 1;   /* quotient code without ending zero */
 
-	uint32_t r = value & (m-1);     /* remainder of value/m */
-	uint32_t rl = log2_m + 1;       /* length of the remainder (+1 for the 0 in the quotient code) */
+	uint32_t const r = value & (m-1);    /* remainder of value/m */
+	uint32_t const rl = log2_m + 1;      /* length of the remainder (+1 for the 0 in the quotient code) */
 
 	*cw = (qc << (rl & 0x1FU)) | r; /* put the quotient and remainder code together */
 	/*
@@ -514,7 +236,7 @@ static uint32_t rice_encoder(uint32_t value, uint32_t m, uint32_t log2_m,
  * @param log2_m	is ilog_2(m) calculate outside function for better performance
  * @param cw		address where the code word is stored
  *
- * @warning no check of the validity of the input parameters!
+ * @warning there is no check of the validity of the input parameters!
  * @returns the length of the formed code word in bits; the code word is invalid
  *	if the return value is greater than 32
  */
@@ -522,17 +244,17 @@ static uint32_t rice_encoder(uint32_t value, uint32_t m, uint32_t log2_m,
 static uint32_t golomb_encoder(uint32_t value, uint32_t m, uint32_t log2_m,
 			       uint32_t *cw)
 {
-	uint32_t len = log2_m + 1;               /* codeword length in group 0 */
-	uint32_t cutoff = (0x2U << log2_m) - m;  /* members in group 0 */
+	uint32_t len = log2_m + 1;  /* codeword length in group 0 */
+	uint32_t const cutoff = (0x2U << log2_m) - m;  /* members in group 0 */
 
-	if (value < cutoff) { /* group 0 */
+	if (value < cutoff) {  /* group 0 */
 		*cw = value;
-	} else { /* other groups */
+	} else {  /* other groups */
 		uint32_t const reg_mask = 0x1FU;  /* mask for the right shift operand to prevent undefined behavior */
-		uint32_t g = (value-cutoff) / m;  /* group number of same cw length */
-		uint32_t r = (value-cutoff) - g * m; /* member in the group */
-		uint32_t gc = (1U << (g & reg_mask)) - 1; /* prepare the left side in unary */
-		uint32_t b = cutoff << 1;         /* form the base codeword */
+		uint32_t const g = (value-cutoff) / m;  /* group number of same cw length */
+		uint32_t const r = (value-cutoff) - g * m; /* member in the group */
+		uint32_t const gc = (1U << (g & reg_mask)) - 1; /* prepare the left side in unary */
+		uint32_t const b = cutoff << 1;         /* form the base codeword */
 
 		*cw = gc << ((len+1) & reg_mask);  /* composed codeword part 1 */
 		*cw += b + r;                      /* composed codeword part 2 */
@@ -550,13 +272,12 @@ static uint32_t golomb_encoder(uint32_t value, uint32_t m, uint32_t log2_m,
  * @param stream_len	length of the bitstream in bits
  * @param setup		pointer to the encoder setup
  *
- * @returns the bit length of the bitstream with the added encoded value on
- *	success; negative on error, CMP_ERROR_SMALL_BUF if the bitstream buffer
- *	is too small to put the value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t encode_normal(uint32_t value, uint32_t stream_len,
-			 const struct encoder_setup *setup)
+			      const struct encoder_setup *setup)
 {
 	uint32_t code_word, cw_len;
 
@@ -569,7 +290,7 @@ static uint32_t encode_normal(uint32_t value, uint32_t stream_len,
 
 
 /**
- * @brief subtract the model from the data, encode the result and puts it into
+ * @brief subtracts the model from the data, encodes the result and puts it into
  *	bitstream, for encoding outlier use the zero escape symbol mechanism
  *
  * @param data		data to encode
@@ -577,9 +298,8 @@ static uint32_t encode_normal(uint32_t value, uint32_t stream_len,
  * @param stream_len	length of the bitstream in bits
  * @param setup		pointer to the encoder setup
  *
- * @returns the bit length of the bitstream with the added encoded value on
- *	success; negative on error, CMP_ERROR_SMALL_BUF if the bitstream buffer
- *	is too small to put the value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  *
  * @note no check if the data or model are in the allowed range
  * @note no check if the setup->spillover_par is in the allowed range
@@ -599,11 +319,11 @@ static uint32_t encode_value_zero(uint32_t data, uint32_t model, uint32_t stream
 	 *	return ...
 	 */
 	if (data < (setup->spillover_par - 1)) { /* detect non-outlier */
-		data++; /* add 1 to every value so we can use 0 as escape symbol */
+		data++; /* add 1 to every value so we can use 0 as the escape symbol */
 		return encode_normal(data, stream_len, setup);
 	}
 
-	data++; /* add 1 to every value so we can use 0 as escape symbol */
+	data++; /* add 1 to every value so we can use 0 as the escape symbol */
 
 	/* use zero as escape symbol */
 	stream_len = encode_normal(0, stream_len, setup);
@@ -618,7 +338,7 @@ static uint32_t encode_value_zero(uint32_t data, uint32_t model, uint32_t stream
 
 
 /**
- * @brief subtract the model from the data, encode the result and put it into
+ * @brief subtract the model from the data, encode the result and puts it into
  *	bitstream, for encoding outlier use the multi escape symbol mechanism
  *
  * @param data		data to encode
@@ -626,9 +346,8 @@ static uint32_t encode_value_zero(uint32_t data, uint32_t model, uint32_t stream
  * @param stream_len	length of the bitstream in bits
  * @param setup		pointer to the encoder setup
  *
- * @returns the bit length of the bitstream with the added encoded value on
- *	success; negative on error, CMP_ERROR_SMALL_BUF if the bitstream buffer
- *	is too small to put the value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  *
  * @note no check if the data or model are in the allowed range
  * @note no check if the setup->spillover_par is in the allowed range
@@ -690,16 +409,14 @@ static uint32_t encode_value_multi(uint32_t data, uint32_t model, uint32_t strea
  * @param stream_len	length of the bitstream in bits
  * @param setup		pointer to the encoder setup
  *
- * @returns the bit length of the bitstream with the added encoded value on
- *	success; negative on error, CMP_ERROR_SMALL_BUF if the bitstream buffer
- *	is too small to put the value in the bitstream, CMP_ERROR_HIGH_VALUE if
- *	the value or the model is bigger than the max_used_bits parameter allows
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t encode_value(uint32_t data, uint32_t model, uint32_t stream_len,
-			const struct encoder_setup *setup)
+			     const struct encoder_setup *setup)
 {
-	uint32_t mask = ~(0xFFFFFFFFU >> (32-setup->max_data_bits));
+	uint32_t const mask = ~(0xFFFFFFFFU >> (32-setup->max_data_bits));
 
 	/* lossy rounding of the data if lossy_par > 0 */
 	data = round_fwd(data, setup->lossy_par);
@@ -712,23 +429,23 @@ static uint32_t encode_value(uint32_t data, uint32_t model, uint32_t stream_len,
 
 
 /**
- * @brief calculate the maximum length of the bitstream/icu_output_buf in bits
+ * @brief calculate the maximum length of the bitstream in bits
  * @note we round down to the next 4-byte allied address because we access the
  *	cmp_buffer in uint32_t words
  *
- * @param buffer_length	length of the icu_output_buf in bytes
+ * @param stream_size	size of the bitstream in bytes
  *
  * @returns buffer size in bits
  */
 
-static uint32_t cmp_buffer_length_to_bits(uint32_t buffer_length)
+static uint32_t cmp_stream_size_to_bits(uint32_t stream_size)
 {
-	return (buffer_length & ~0x3U) * 8;
+	return (stream_size & ~0x3U) * 8;
 }
 
 
 /**
- * @brief configure an encoder setup structure to have a setup to encode a vale
+ * @brief configure an encoder setup structure to have a setup to encode a value
  *
  * @param setup		pointer to the encoder setup
  * @param cmp_par	compression parameter
@@ -750,44 +467,34 @@ static void configure_encoder_setup(struct encoder_setup *setup,
 	setup->encoder_par1 = cmp_par;
 	setup->max_data_bits = max_data_bits;
 	setup->lossy_par = lossy_par;
-	setup->bitstream_adr = cfg->icu_output_buf;
-	setup->max_stream_len = cmp_buffer_length_to_bits(cfg->buffer_length);
+	setup->bitstream_adr = cfg->dst;
+	setup->max_stream_len = cmp_stream_size_to_bits(cfg->stream_size);
 	setup->encoder_par2 = ilog_2(cmp_par);
 	setup->spillover_par = spillover;
 
-	/* for encoder_par1 which are a power of two we can use the faster rice_encoder */
+	/* for encoder_par1 which is a power of two we can use the faster rice_encoder */
 	if (is_a_pow_of_2(setup->encoder_par1))
 		setup->generate_cw_f = &rice_encoder;
 	else
 		setup->generate_cw_f = &golomb_encoder;
 
-	switch (cfg->cmp_mode) {
-	case CMP_MODE_MODEL_ZERO:
-	case CMP_MODE_DIFF_ZERO:
+	/* CMP_MODE_RAW is already handled before */
+	if (cfg->cmp_mode == CMP_MODE_MODEL_ZERO ||
+	    cfg->cmp_mode == CMP_MODE_DIFF_ZERO)
 		setup->encode_method_f = &encode_value_zero;
-		break;
-	case CMP_MODE_MODEL_MULTI:
-	case CMP_MODE_DIFF_MULTI:
+	else
 		setup->encode_method_f = &encode_value_multi;
-		break;
-	/* LCOV_EXCL_START */
-	case CMP_MODE_RAW:
-		/* CMP_MODE_RAW is already handled before; nothing to do here */
-		break;
-	/* LCOV_EXCL_STOP */
-	}
 }
 
 
 /**
  * @brief compress imagette data
  *
- * @param cfg	pointer to the compression configuration structure
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream, CMP_ERROR_HIGH_VALUE if the value or the model is
- *	bigger than the max_used_bits parameter allows
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t compress_imagette(const struct cmp_cfg *cfg, uint32_t stream_len)
@@ -796,36 +503,30 @@ static uint32_t compress_imagette(const struct cmp_cfg *cfg, uint32_t stream_len
 	struct encoder_setup setup;
 	uint32_t max_data_bits;
 
-	uint16_t *data_buf = cfg->input_buf;
-	uint16_t *model_buf = cfg->model_buf;
+	const uint16_t *data_buf = cfg->src;
+	const uint16_t *model_buf = cfg->model_buf;
 	uint16_t model = 0;
-	uint16_t *next_model_p = data_buf;
+	const uint16_t *next_model_p = data_buf;
 	uint16_t *up_model_buf = NULL;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = get_unaligned(&model_buf[0]);
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	}
 
-	switch (cfg->data_type) {
-	case DATA_TYPE_IMAGETTE:
-	case DATA_TYPE_IMAGETTE_ADAPTIVE:
-		max_data_bits = cfg->max_used_bits->nc_imagette;
-		break;
-	case DATA_TYPE_SAT_IMAGETTE:
-	case DATA_TYPE_SAT_IMAGETTE_ADAPTIVE:
-		max_data_bits = cfg->max_used_bits->saturated_imagette;
-		break;
-	default:
-	case DATA_TYPE_F_CAM_IMAGETTE:
-	case DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE:
-		max_data_bits = cfg->max_used_bits->fc_imagette;
-		break;
+	if (cfg->data_type == DATA_TYPE_F_CAM_IMAGETTE ||
+	    cfg->data_type == DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE) {
+		max_data_bits = MAX_USED_BITS.fc_imagette;
+	} else if (cfg->data_type == DATA_TYPE_SAT_IMAGETTE ||
+		   cfg->data_type == DATA_TYPE_SAT_IMAGETTE_ADAPTIVE) {
+		max_data_bits = MAX_USED_BITS.saturated_imagette;
+	} else { /* DATA_TYPE_IMAGETTE, DATA_TYPE_IMAGETTE_ADAPTIVE */
+		max_data_bits = MAX_USED_BITS.nc_imagette;
 	}
 
-	configure_encoder_setup(&setup, cfg->golomb_par, cfg->spill, cfg->round,
-				max_data_bits, cfg);
+	configure_encoder_setup(&setup, cfg->cmp_par_imagette,
+				cfg->spill_imagette, cfg->round, max_data_bits, cfg);
 
 	for (i = 0;; i++) {
 		stream_len = encode_value(get_unaligned(&data_buf[i]),
@@ -850,348 +551,53 @@ static uint32_t compress_imagette(const struct cmp_cfg *cfg, uint32_t stream_len
 /**
  * @brief compress short normal light flux (S_FX) data
  *
- * @param cfg	pointer to the compression configuration structure
- *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
- */
-
-static uint32_t compress_s_fx(const struct cmp_cfg *cfg, uint32_t stream_len)
-{
-	size_t i;
-
-	struct s_fx *data_buf = cfg->input_buf;
-	struct s_fx *model_buf = cfg->model_buf;
-	struct s_fx *up_model_buf = NULL;
-	struct s_fx *next_model_p;
-	struct s_fx model;
-	struct encoder_setup setup_exp_flag, setup_fx;
-
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		model = model_buf[0];
-		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
-	} else {
-		memset(&model, 0, sizeof(model));
-		next_model_p = data_buf;
-	}
-
-	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->s_exp_flags, cfg);
-	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->s_fx, cfg);
-
-	for (i = 0;; i++) {
-		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
-					  stream_len, &setup_exp_flag);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].fx, model.fx, stream_len,
-					  &setup_fx);
-		if (cmp_is_error(stream_len))
-			break;
-
-		if (up_model_buf) {
-			up_model_buf[i].exp_flags = cmp_up_model(data_buf[i].exp_flags, model.exp_flags,
-								 cfg->model_value, setup_exp_flag.lossy_par);
-			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
-							  cfg->model_value, setup_fx.lossy_par);
-		}
-
-		if (i >= cfg->samples-1)
-			break;
-
-		model = next_model_p[i];
-	}
-	return stream_len;
-}
-
-
-/**
- * @brief compress S_FX_EFX data
- *
- * @param cfg	pointer to the compression configuration structure
- *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
- */
-
-static uint32_t compress_s_fx_efx(const struct cmp_cfg *cfg, uint32_t stream_len)
-{
-	size_t i;
-
-	struct s_fx_efx *data_buf = cfg->input_buf;
-	struct s_fx_efx *model_buf = cfg->model_buf;
-	struct s_fx_efx *up_model_buf = NULL;
-	struct s_fx_efx *next_model_p;
-	struct s_fx_efx model;
-	struct encoder_setup setup_exp_flag, setup_fx, setup_efx;
-
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		model = model_buf[0];
-		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
-	} else {
-		memset(&model, 0, sizeof(model));
-		next_model_p = data_buf;
-	}
-
-	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->s_exp_flags, cfg);
-	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->s_fx, cfg);
-	configure_encoder_setup(&setup_efx, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->s_efx, cfg);
-
-	for (i = 0;; i++) {
-		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
-					  stream_len, &setup_exp_flag);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].fx, model.fx, stream_len,
-					  &setup_fx);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].efx, model.efx,
-					  stream_len, &setup_efx);
-		if (cmp_is_error(stream_len))
-			return stream_len;
-
-		if (up_model_buf) {
-			up_model_buf[i].exp_flags = cmp_up_model(data_buf[i].exp_flags, model.exp_flags,
-				cfg->model_value, setup_exp_flag.lossy_par);
-			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
-				cfg->model_value, setup_fx.lossy_par);
-			up_model_buf[i].efx = cmp_up_model(data_buf[i].efx, model.efx,
-				cfg->model_value, setup_efx.lossy_par);
-		}
-
-		if (i >= cfg->samples-1)
-			break;
-
-		model = next_model_p[i];
-	}
-	return stream_len;
-}
-
-
-/**
- * @brief compress S_FX_NCOB data
- *
- * @param cfg	pointer to the compression configuration structure
- *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
- */
-
-static uint32_t compress_s_fx_ncob(const struct cmp_cfg *cfg, uint32_t stream_len)
-{
-	size_t i;
-
-	struct s_fx_ncob *data_buf = cfg->input_buf;
-	struct s_fx_ncob *model_buf = cfg->model_buf;
-	struct s_fx_ncob *up_model_buf = NULL;
-	struct s_fx_ncob *next_model_p;
-	struct s_fx_ncob model;
-	struct encoder_setup setup_exp_flag, setup_fx, setup_ncob;
-
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		model = model_buf[0];
-		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
-	} else {
-		memset(&model, 0, sizeof(model));
-		next_model_p = data_buf;
-	}
-
-	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->s_exp_flags, cfg);
-	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->s_fx, cfg);
-	configure_encoder_setup(&setup_ncob, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->s_ncob, cfg);
-
-	for (i = 0;; i++) {
-		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
-					  stream_len, &setup_exp_flag);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].fx, model.fx, stream_len,
-					  &setup_fx);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].ncob_x, model.ncob_x,
-					  stream_len, &setup_ncob);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].ncob_y, model.ncob_y,
-					  stream_len, &setup_ncob);
-		if (cmp_is_error(stream_len))
-			break;
-
-		if (up_model_buf) {
-			up_model_buf[i].exp_flags = cmp_up_model(data_buf[i].exp_flags, model.exp_flags,
-				cfg->model_value, setup_exp_flag.lossy_par);
-			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
-				cfg->model_value, setup_fx.lossy_par);
-			up_model_buf[i].ncob_x = cmp_up_model(data_buf[i].ncob_x, model.ncob_x,
-				cfg->model_value, setup_ncob.lossy_par);
-			up_model_buf[i].ncob_y = cmp_up_model(data_buf[i].ncob_y, model.ncob_y,
-				cfg->model_value, setup_ncob.lossy_par);
-		}
-
-		if (i >= cfg->samples-1)
-			break;
-
-		model = next_model_p[i];
-	}
-	return stream_len;
-}
-
-
-/**
- * @brief compress S_FX_EFX_NCOB_ECOB data
- *
- * @param cfg	pointer to the compression configuration structure
- *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
- */
-
-static uint32_t compress_s_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, uint32_t stream_len)
-{
-	size_t i;
-
-	struct s_fx_efx_ncob_ecob *data_buf = cfg->input_buf;
-	struct s_fx_efx_ncob_ecob *model_buf = cfg->model_buf;
-	struct s_fx_efx_ncob_ecob *up_model_buf = NULL;
-	struct s_fx_efx_ncob_ecob *next_model_p;
-	struct s_fx_efx_ncob_ecob model;
-	struct encoder_setup setup_exp_flag, setup_fx, setup_ncob, setup_efx,
-			      setup_ecob;
-
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		model = model_buf[0];
-		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
-	} else {
-		memset(&model, 0, sizeof(model));
-		next_model_p = data_buf;
-	}
-
-	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->s_exp_flags, cfg);
-	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->s_fx, cfg);
-	configure_encoder_setup(&setup_ncob, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->s_ncob, cfg);
-	configure_encoder_setup(&setup_efx, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->s_efx, cfg);
-	configure_encoder_setup(&setup_ecob, cfg->cmp_par_ecob, cfg->spill_ecob,
-				cfg->round, cfg->max_used_bits->s_ecob, cfg);
-
-	for (i = 0;; i++) {
-		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
-					  stream_len, &setup_exp_flag);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].fx, model.fx, stream_len,
-					  &setup_fx);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].ncob_x, model.ncob_x,
-					  stream_len, &setup_ncob);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].ncob_y, model.ncob_y,
-					  stream_len, &setup_ncob);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].efx, model.efx,
-					  stream_len, &setup_efx);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].ecob_x, model.ecob_x,
-					  stream_len, &setup_ecob);
-		if (cmp_is_error(stream_len))
-			break;
-		stream_len = encode_value(data_buf[i].ecob_y, model.ecob_y,
-					  stream_len, &setup_ecob);
-		if (cmp_is_error(stream_len))
-			break;
-
-		if (up_model_buf) {
-			up_model_buf[i].exp_flags = cmp_up_model(data_buf[i].exp_flags, model.exp_flags,
-				cfg->model_value, setup_exp_flag.lossy_par);
-			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
-				cfg->model_value, setup_fx.lossy_par);
-			up_model_buf[i].ncob_x = cmp_up_model(data_buf[i].ncob_x, model.ncob_x,
-				cfg->model_value, setup_ncob.lossy_par);
-			up_model_buf[i].ncob_y = cmp_up_model(data_buf[i].ncob_y, model.ncob_y,
-				cfg->model_value, setup_ncob.lossy_par);
-			up_model_buf[i].efx = cmp_up_model(data_buf[i].efx, model.efx,
-				cfg->model_value, setup_efx.lossy_par);
-			up_model_buf[i].ecob_x = cmp_up_model(data_buf[i].ecob_x, model.ecob_x,
-				cfg->model_value, setup_ecob.lossy_par);
-			up_model_buf[i].ecob_y = cmp_up_model(data_buf[i].ecob_y, model.ecob_y,
-				cfg->model_value, setup_ecob.lossy_par);
-		}
-
-		if (i >= cfg->samples-1)
-			break;
-
-		model = next_model_p[i];
-	}
-	return stream_len;
-}
-
-
-/**
- * @brief compress F_FX data
- *
- * @param cfg	pointer to the compression configuration structure
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
-static uint32_t compress_f_fx(const struct cmp_cfg *cfg, uint32_t stream_len)
+static uint32_t compress_s_fx(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct f_fx *data_buf = cfg->input_buf;
-	struct f_fx *model_buf = cfg->model_buf;
-	struct f_fx *up_model_buf = NULL;
-	struct f_fx *next_model_p;
-	struct f_fx model;
-	struct encoder_setup setup_fx;
+	const struct s_fx *data_buf = cfg->src;
+	const struct s_fx *model_buf = cfg->model_buf;
+	struct s_fx *up_model_buf = NULL;
+	const struct s_fx *next_model_p;
+	struct s_fx model;
+	struct encoder_setup setup_exp_flag, setup_fx;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
 	}
 
+	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
+				cfg->round, MAX_USED_BITS.s_exp_flags, cfg);
 	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->f_fx, cfg);
+				cfg->round, MAX_USED_BITS.s_fx, cfg);
 
 	for (i = 0;; i++) {
+		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
+					  stream_len, &setup_exp_flag);
+		if (cmp_is_error(stream_len))
+			break;
 		stream_len = encode_value(data_buf[i].fx, model.fx, stream_len,
 					  &setup_fx);
 		if (cmp_is_error(stream_len))
 			break;
 
 		if (up_model_buf) {
+			up_model_buf[i].exp_flags = cmp_up_model(data_buf[i].exp_flags, model.exp_flags,
+								 cfg->model_value, setup_exp_flag.lossy_par);
 			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
-				cfg->model_value, setup_fx.lossy_par);
+							  cfg->model_value, setup_fx.lossy_par);
 		}
 
 		if (i >= cfg->samples-1)
@@ -1204,41 +610,47 @@ static uint32_t compress_f_fx(const struct cmp_cfg *cfg, uint32_t stream_len)
 
 
 /**
- * @brief compress F_FX_EFX data
+ * @brief compress S_FX_EFX data
  *
- * @param cfg	pointer to the compression configuration structure
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
-static uint32_t compress_f_fx_efx(const struct cmp_cfg *cfg, uint32_t stream_len)
+static uint32_t compress_s_fx_efx(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct f_fx_efx *data_buf = cfg->input_buf;
-	struct f_fx_efx *model_buf = cfg->model_buf;
-	struct f_fx_efx *up_model_buf = NULL;
-	struct f_fx_efx *next_model_p;
-	struct f_fx_efx model;
-	struct encoder_setup setup_fx, setup_efx;
+	const struct s_fx_efx *data_buf = cfg->src;
+	const struct s_fx_efx *model_buf = cfg->model_buf;
+	struct s_fx_efx *up_model_buf = NULL;
+	const struct s_fx_efx *next_model_p;
+	struct s_fx_efx model;
+	struct encoder_setup setup_exp_flag, setup_fx, setup_efx;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
 	}
 
+	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
+				cfg->round, MAX_USED_BITS.s_exp_flags, cfg);
 	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->f_fx, cfg);
+				cfg->round, MAX_USED_BITS.s_fx, cfg);
 	configure_encoder_setup(&setup_efx, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->f_efx, cfg);
+				cfg->round, MAX_USED_BITS.s_efx, cfg);
 
 	for (i = 0;; i++) {
+		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
+					  stream_len, &setup_exp_flag);
+		if (cmp_is_error(stream_len))
+			break;
 		stream_len = encode_value(data_buf[i].fx, model.fx, stream_len,
 					  &setup_fx);
 		if (cmp_is_error(stream_len))
@@ -1246,9 +658,11 @@ static uint32_t compress_f_fx_efx(const struct cmp_cfg *cfg, uint32_t stream_len
 		stream_len = encode_value(data_buf[i].efx, model.efx,
 					  stream_len, &setup_efx);
 		if (cmp_is_error(stream_len))
-			break;
+			return stream_len;
 
 		if (up_model_buf) {
+			up_model_buf[i].exp_flags = cmp_up_model(data_buf[i].exp_flags, model.exp_flags,
+				cfg->model_value, setup_exp_flag.lossy_par);
 			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
 				cfg->model_value, setup_fx.lossy_par);
 			up_model_buf[i].efx = cmp_up_model(data_buf[i].efx, model.efx,
@@ -1265,41 +679,47 @@ static uint32_t compress_f_fx_efx(const struct cmp_cfg *cfg, uint32_t stream_len
 
 
 /**
- * @brief compress F_FX_NCOB data
+ * @brief compress S_FX_NCOB data
  *
- * @param cfg	pointer to the compression configuration structure
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
-static uint32_t compress_f_fx_ncob(const struct cmp_cfg *cfg, uint32_t stream_len)
+static uint32_t compress_s_fx_ncob(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct f_fx_ncob *data_buf = cfg->input_buf;
-	struct f_fx_ncob *model_buf = cfg->model_buf;
-	struct f_fx_ncob *up_model_buf = NULL;
-	struct f_fx_ncob *next_model_p;
-	struct f_fx_ncob model;
-	struct encoder_setup setup_fx, setup_ncob;
+	const struct s_fx_ncob *data_buf = cfg->src;
+	const struct s_fx_ncob *model_buf = cfg->model_buf;
+	struct s_fx_ncob *up_model_buf = NULL;
+	const struct s_fx_ncob *next_model_p;
+	struct s_fx_ncob model;
+	struct encoder_setup setup_exp_flag, setup_fx, setup_ncob;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
 	}
 
+	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
+				cfg->round, MAX_USED_BITS.s_exp_flags, cfg);
 	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->f_fx, cfg);
+				cfg->round, MAX_USED_BITS.s_fx, cfg);
 	configure_encoder_setup(&setup_ncob, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->f_ncob, cfg);
+				cfg->round, MAX_USED_BITS.s_ncob, cfg);
 
 	for (i = 0;; i++) {
+		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
+					  stream_len, &setup_exp_flag);
+		if (cmp_is_error(stream_len))
+			break;
 		stream_len = encode_value(data_buf[i].fx, model.fx, stream_len,
 					  &setup_fx);
 		if (cmp_is_error(stream_len))
@@ -1314,6 +734,8 @@ static uint32_t compress_f_fx_ncob(const struct cmp_cfg *cfg, uint32_t stream_le
 			break;
 
 		if (up_model_buf) {
+			up_model_buf[i].exp_flags = cmp_up_model(data_buf[i].exp_flags, model.exp_flags,
+				cfg->model_value, setup_exp_flag.lossy_par);
 			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
 				cfg->model_value, setup_fx.lossy_par);
 			up_model_buf[i].ncob_x = cmp_up_model(data_buf[i].ncob_x, model.ncob_x,
@@ -1332,45 +754,52 @@ static uint32_t compress_f_fx_ncob(const struct cmp_cfg *cfg, uint32_t stream_le
 
 
 /**
- * @brief compress F_FX_EFX_NCOB_ECOB data
+ * @brief compress S_FX_EFX_NCOB_ECOB data
  *
- * @param cfg	pointer to the compression configuration structure
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
-static uint32_t compress_f_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, uint32_t stream_len)
+static uint32_t compress_s_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct f_fx_efx_ncob_ecob *data_buf = cfg->input_buf;
-	struct f_fx_efx_ncob_ecob *model_buf = cfg->model_buf;
-	struct f_fx_efx_ncob_ecob *up_model_buf = NULL;
-	struct f_fx_efx_ncob_ecob *next_model_p;
-	struct f_fx_efx_ncob_ecob model;
-	struct encoder_setup setup_fx, setup_ncob, setup_efx, setup_ecob;
+	const struct s_fx_efx_ncob_ecob *data_buf = cfg->src;
+	const struct s_fx_efx_ncob_ecob *model_buf = cfg->model_buf;
+	struct s_fx_efx_ncob_ecob *up_model_buf = NULL;
+	const struct s_fx_efx_ncob_ecob *next_model_p;
+	struct s_fx_efx_ncob_ecob model;
+	struct encoder_setup setup_exp_flag, setup_fx, setup_ncob, setup_efx,
+			      setup_ecob;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
 	}
 
+	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
+				cfg->round, MAX_USED_BITS.s_exp_flags, cfg);
 	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->f_fx, cfg);
+				cfg->round, MAX_USED_BITS.s_fx, cfg);
 	configure_encoder_setup(&setup_ncob, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->f_ncob, cfg);
+				cfg->round, MAX_USED_BITS.s_ncob, cfg);
 	configure_encoder_setup(&setup_efx, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->f_efx, cfg);
+				cfg->round, MAX_USED_BITS.s_efx, cfg);
 	configure_encoder_setup(&setup_ecob, cfg->cmp_par_ecob, cfg->spill_ecob,
-				cfg->round, cfg->max_used_bits->f_ecob, cfg);
+				cfg->round, MAX_USED_BITS.s_ecob, cfg);
 
 	for (i = 0;; i++) {
+		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
+					  stream_len, &setup_exp_flag);
+		if (cmp_is_error(stream_len))
+			break;
 		stream_len = encode_value(data_buf[i].fx, model.fx, stream_len,
 					  &setup_fx);
 		if (cmp_is_error(stream_len))
@@ -1397,6 +826,8 @@ static uint32_t compress_f_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, uint32_t
 			break;
 
 		if (up_model_buf) {
+			up_model_buf[i].exp_flags = cmp_up_model(data_buf[i].exp_flags, model.exp_flags,
+				cfg->model_value, setup_exp_flag.lossy_par);
 			up_model_buf[i].fx = cmp_up_model(data_buf[i].fx, model.fx,
 				cfg->model_value, setup_fx.lossy_par);
 			up_model_buf[i].ncob_x = cmp_up_model(data_buf[i].ncob_x, model.ncob_x,
@@ -1423,39 +854,39 @@ static uint32_t compress_f_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, uint32_t
 /**
  * @brief compress L_FX data
  *
- * @param cfg	pointer to the compression configuration structure
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t compress_l_fx(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct l_fx *data_buf = cfg->input_buf;
-	struct l_fx *model_buf = cfg->model_buf;
+	const struct l_fx *data_buf = cfg->src;
+	const struct l_fx *model_buf = cfg->model_buf;
 	struct l_fx *up_model_buf = NULL;
-	struct l_fx *next_model_p;
+	const struct l_fx *next_model_p;
 	struct l_fx model;
 	struct encoder_setup setup_exp_flag, setup_fx, setup_fx_var;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
 	}
 
 	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->l_exp_flags, cfg);
+				cfg->round, MAX_USED_BITS.l_exp_flags, cfg);
 	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->l_fx, cfg);
+				cfg->round, MAX_USED_BITS.l_fx, cfg);
 	configure_encoder_setup(&setup_fx_var, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_fx_variance, cfg);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance, cfg);
 
 	for (i = 0;; i++) {
 		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
@@ -1492,41 +923,41 @@ static uint32_t compress_l_fx(const struct cmp_cfg *cfg, uint32_t stream_len)
 /**
  * @brief compress L_FX_EFX data
  *
- * @param cfg	pointer to the compression configuration structure
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t compress_l_fx_efx(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct l_fx_efx *data_buf = cfg->input_buf;
-	struct l_fx_efx *model_buf = cfg->model_buf;
+	const struct l_fx_efx *data_buf = cfg->src;
+	const struct l_fx_efx *model_buf = cfg->model_buf;
 	struct l_fx_efx *up_model_buf = NULL;
-	struct l_fx_efx *next_model_p;
+	const struct l_fx_efx *next_model_p;
 	struct l_fx_efx model;
 	struct encoder_setup setup_exp_flag, setup_fx, setup_efx, setup_fx_var;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
 	}
 
 	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->l_exp_flags, cfg);
+				cfg->round, MAX_USED_BITS.l_exp_flags, cfg);
 	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->l_fx, cfg);
+				cfg->round, MAX_USED_BITS.l_fx, cfg);
 	configure_encoder_setup(&setup_efx, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->l_efx, cfg);
+				cfg->round, MAX_USED_BITS.l_efx, cfg);
 	configure_encoder_setup(&setup_fx_var, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_fx_variance, cfg);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance, cfg);
 
 	for (i = 0;; i++) {
 		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
@@ -1569,21 +1000,21 @@ static uint32_t compress_l_fx_efx(const struct cmp_cfg *cfg, uint32_t stream_len
 /**
  * @brief compress L_FX_NCOB data
  *
- * @param cfg	pointer to the compression configuration structure
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t compress_l_fx_ncob(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct l_fx_ncob *data_buf = cfg->input_buf;
-	struct l_fx_ncob *model_buf = cfg->model_buf;
+	const struct l_fx_ncob *data_buf = cfg->src;
+	const struct l_fx_ncob *model_buf = cfg->model_buf;
 	struct l_fx_ncob *up_model_buf = NULL;
-	struct l_fx_ncob *next_model_p;
+	const struct l_fx_ncob *next_model_p;
 	struct l_fx_ncob model;
 	struct encoder_setup setup_exp_flag, setup_fx, setup_ncob,
 			      setup_fx_var, setup_cob_var;
@@ -1591,23 +1022,23 @@ static uint32_t compress_l_fx_ncob(const struct cmp_cfg *cfg, uint32_t stream_le
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
 	}
 
 	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->l_exp_flags, cfg);
+				cfg->round, MAX_USED_BITS.l_exp_flags, cfg);
 	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->l_fx, cfg);
+				cfg->round, MAX_USED_BITS.l_fx, cfg);
 	configure_encoder_setup(&setup_ncob, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->l_ncob, cfg);
+				cfg->round, MAX_USED_BITS.l_ncob, cfg);
 	/* we use the cmp_par_fx_cob_variance parameter for fx and cob variance data */
 	configure_encoder_setup(&setup_fx_var, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_fx_variance, cfg);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance, cfg);
 	configure_encoder_setup(&setup_cob_var, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_cob_variance, cfg);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance, cfg);
 
 	for (i = 0;; i++) {
 		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
@@ -1668,21 +1099,21 @@ static uint32_t compress_l_fx_ncob(const struct cmp_cfg *cfg, uint32_t stream_le
 /**
  * @brief compress L_FX_EFX_NCOB_ECOB data
  *
- * @param cfg	pointer to the compression configuration structure
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t compress_l_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct l_fx_efx_ncob_ecob *data_buf = cfg->input_buf;
-	struct l_fx_efx_ncob_ecob *model_buf = cfg->model_buf;
+	const struct l_fx_efx_ncob_ecob *data_buf = cfg->src;
+	const struct l_fx_efx_ncob_ecob *model_buf = cfg->model_buf;
 	struct l_fx_efx_ncob_ecob *up_model_buf = NULL;
-	struct l_fx_efx_ncob_ecob *next_model_p;
+	const struct l_fx_efx_ncob_ecob *next_model_p;
 	struct l_fx_efx_ncob_ecob model;
 	struct encoder_setup setup_exp_flag, setup_fx, setup_ncob, setup_efx,
 			      setup_ecob, setup_fx_var, setup_cob_var;
@@ -1690,27 +1121,27 @@ static uint32_t compress_l_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, uint32_t
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
 	}
 
 	configure_encoder_setup(&setup_exp_flag, cfg->cmp_par_exp_flags, cfg->spill_exp_flags,
-				cfg->round, cfg->max_used_bits->l_exp_flags, cfg);
+				cfg->round, MAX_USED_BITS.l_exp_flags, cfg);
 	configure_encoder_setup(&setup_fx, cfg->cmp_par_fx, cfg->spill_fx,
-				cfg->round, cfg->max_used_bits->l_fx, cfg);
+				cfg->round, MAX_USED_BITS.l_fx, cfg);
 	configure_encoder_setup(&setup_ncob, cfg->cmp_par_ncob, cfg->spill_ncob,
-				cfg->round, cfg->max_used_bits->l_ncob, cfg);
+				cfg->round, MAX_USED_BITS.l_ncob, cfg);
 	configure_encoder_setup(&setup_efx, cfg->cmp_par_efx, cfg->spill_efx,
-				cfg->round, cfg->max_used_bits->l_efx, cfg);
+				cfg->round, MAX_USED_BITS.l_efx, cfg);
 	configure_encoder_setup(&setup_ecob, cfg->cmp_par_ecob, cfg->spill_ecob,
-				cfg->round, cfg->max_used_bits->l_ecob, cfg);
-	/* we use compression parameter for both variance data fields */
+				cfg->round, MAX_USED_BITS.l_ecob, cfg);
+	/* we use compression parameters for both variance data fields */
 	configure_encoder_setup(&setup_fx_var, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_fx_variance, cfg);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance, cfg);
 	configure_encoder_setup(&setup_cob_var, cfg->cmp_par_fx_cob_variance, cfg->spill_fx_cob_variance,
-				cfg->round, cfg->max_used_bits->l_cob_variance, cfg);
+				cfg->round, MAX_USED_BITS.l_fx_cob_variance, cfg);
 
 	for (i = 0;; i++) {
 		stream_len = encode_value(data_buf[i].exp_flags, model.exp_flags,
@@ -1789,27 +1220,28 @@ static uint32_t compress_l_fx_efx_ncob_ecob(const struct cmp_cfg *cfg, uint32_t
 /**
  * @brief compress offset data from the normal and fast cameras
  *
- * @param cfg	pointer to the compression configuration structure
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
+ *
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t compress_offset(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct offset *data_buf = cfg->input_buf;
-	struct offset *model_buf = cfg->model_buf;
+	const struct offset *data_buf = cfg->src;
+	const struct offset *model_buf = cfg->model_buf;
 	struct offset *up_model_buf = NULL;
-	struct offset *next_model_p;
+	const struct offset *next_model_p;
 	struct offset model;
 	struct encoder_setup setup_mean, setup_var;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
@@ -1818,17 +1250,14 @@ static uint32_t compress_offset(const struct cmp_cfg *cfg, uint32_t stream_len)
 	{
 		unsigned int mean_bits_used, variance_bits_used;
 
-		switch (cfg->data_type) {
-		case DATA_TYPE_F_CAM_OFFSET:
-			mean_bits_used = cfg->max_used_bits->fc_offset_mean;
-			variance_bits_used = cfg->max_used_bits->fc_offset_variance;
-			break;
-		case DATA_TYPE_OFFSET:
-		default:
-			mean_bits_used = cfg->max_used_bits->nc_offset_mean;
-			variance_bits_used = cfg->max_used_bits->nc_offset_variance;
-			break;
+		if (cfg->data_type == DATA_TYPE_F_CAM_OFFSET) {
+			mean_bits_used = MAX_USED_BITS.fc_offset_mean;
+			variance_bits_used = MAX_USED_BITS.fc_offset_variance;
+		} else { /* DATA_TYPE_OFFSET */
+			mean_bits_used = MAX_USED_BITS.nc_offset_mean;
+			variance_bits_used = MAX_USED_BITS.nc_offset_variance;
 		}
+
 		configure_encoder_setup(&setup_mean, cfg->cmp_par_offset_mean, cfg->spill_offset_mean,
 					cfg->round, mean_bits_used, cfg);
 		configure_encoder_setup(&setup_var, cfg->cmp_par_offset_variance, cfg->spill_offset_variance,
@@ -1864,27 +1293,28 @@ static uint32_t compress_offset(const struct cmp_cfg *cfg, uint32_t stream_len)
 /**
  * @brief compress background data from the normal and fast cameras
  *
- * @param cfg	pointer to the compression configuration structure
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
+ *
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t compress_background(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct background *data_buf = cfg->input_buf;
-	struct background *model_buf = cfg->model_buf;
+	const struct background *data_buf = cfg->src;
+	const struct background *model_buf = cfg->model_buf;
 	struct background *up_model_buf = NULL;
-	struct background *next_model_p;
+	const struct background *next_model_p;
 	struct background model;
 	struct encoder_setup setup_mean, setup_var, setup_pix;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
@@ -1893,18 +1323,14 @@ static uint32_t compress_background(const struct cmp_cfg *cfg, uint32_t stream_l
 	{
 		unsigned int mean_used_bits, varinace_used_bits, pixels_error_used_bits;
 
-		switch (cfg->data_type) {
-		case DATA_TYPE_F_CAM_BACKGROUND:
-			mean_used_bits = cfg->max_used_bits->fc_background_mean;
-			varinace_used_bits = cfg->max_used_bits->fc_background_variance;
-			pixels_error_used_bits = cfg->max_used_bits->fc_background_outlier_pixels;
-			break;
-		case DATA_TYPE_BACKGROUND:
-		default:
-			mean_used_bits = cfg->max_used_bits->nc_background_mean;
-			varinace_used_bits = cfg->max_used_bits->nc_background_variance;
-			pixels_error_used_bits = cfg->max_used_bits->nc_background_outlier_pixels;
-			break;
+		if (cfg->data_type == DATA_TYPE_F_CAM_BACKGROUND) {
+			mean_used_bits = MAX_USED_BITS.fc_background_mean;
+			varinace_used_bits = MAX_USED_BITS.fc_background_variance;
+			pixels_error_used_bits = MAX_USED_BITS.fc_background_outlier_pixels;
+		} else { /* DATA_TYPE_BACKGROUND */
+			mean_used_bits = MAX_USED_BITS.nc_background_mean;
+			varinace_used_bits = MAX_USED_BITS.nc_background_variance;
+			pixels_error_used_bits = MAX_USED_BITS.nc_background_outlier_pixels;
 		}
 		configure_encoder_setup(&setup_mean, cfg->cmp_par_background_mean, cfg->spill_background_mean,
 					cfg->round, mean_used_bits, cfg);
@@ -1949,39 +1375,39 @@ static uint32_t compress_background(const struct cmp_cfg *cfg, uint32_t stream_l
 /**
  * @brief compress smearing data from the normal cameras
  *
- * @param cfg	pointer to the compression configuration structure
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t compress_smearing(const struct cmp_cfg *cfg, uint32_t stream_len)
 {
 	size_t i;
 
-	struct smearing *data_buf = cfg->input_buf;
-	struct smearing *model_buf = cfg->model_buf;
+	const struct smearing *data_buf = cfg->src;
+	const struct smearing *model_buf = cfg->model_buf;
 	struct smearing *up_model_buf = NULL;
-	struct smearing *next_model_p;
+	const struct smearing *next_model_p;
 	struct smearing model;
 	struct encoder_setup setup_mean, setup_var_mean, setup_pix;
 
 	if (model_mode_is_used(cfg->cmp_mode)) {
 		model = model_buf[0];
 		next_model_p = &model_buf[1];
-		up_model_buf = cfg->icu_new_model_buf;
+		up_model_buf = cfg->updated_model_buf;
 	} else {
 		memset(&model, 0, sizeof(model));
 		next_model_p = data_buf;
 	}
 
 	configure_encoder_setup(&setup_mean, cfg->cmp_par_smearing_mean, cfg->spill_smearing_mean,
-				cfg->round, cfg->max_used_bits->smearing_mean, cfg);
+				cfg->round, MAX_USED_BITS.smearing_mean, cfg);
 	configure_encoder_setup(&setup_var_mean, cfg->cmp_par_smearing_variance, cfg->spill_smearing_variance,
-				cfg->round, cfg->max_used_bits->smearing_variance_mean, cfg);
+				cfg->round, MAX_USED_BITS.smearing_variance_mean, cfg);
 	configure_encoder_setup(&setup_pix, cfg->cmp_par_smearing_pixels_error, cfg->spill_smearing_pixels_error,
-				cfg->round, cfg->max_used_bits->smearing_outlier_pixels, cfg);
+				cfg->round, MAX_USED_BITS.smearing_outlier_pixels, cfg);
 
 	for (i = 0;; i++) {
 		stream_len = encode_value(data_buf[i].mean, model.mean,
@@ -2016,34 +1442,32 @@ static uint32_t compress_smearing(const struct cmp_cfg *cfg, uint32_t stream_len
 
 
 /**
- * @brief checks if the ICU compression configuration is valid
+ * @brief check if two buffers are overlapping
+ * @see https://stackoverflow.com/a/325964
  *
- * @param cfg	pointer to the cmp_cfg structure to be validated
+ * @param buf_a		start address of the 1st buffer (can be NULL)
+ * @param size_a	byte size of the 1st buffer
+ * @param buf_b		start address of the 2nd buffer (can be NULL)
+ * @param size_b	byte size of the 2nd buffer
  *
- * @returns an error code if any of the configuration parameters are invalid,
- *	otherwise returns CMP_ERROR_NO_ERROR on valid configuration
+ * @returns 0 if buffers are not overlapping, otherwise buffers are
+ *	overlapping
  */
 
-static uint32_t cmp_cfg_icu_is_invalid_error_code(const struct cmp_cfg *cfg)
+static int buffer_overlaps(const void *buf_a, size_t size_a,
+			   const void *buf_b, size_t size_b)
 {
+	if (!buf_a)
+		return 0;
 
-	RETURN_ERROR_IF(cmp_cfg_gen_par_is_invalid(cfg, ICU_CHECK) , PAR_GENERIC, "");
-	RETURN_ERROR_IF(cmp_cfg_icu_buffers_is_invalid(cfg), PAR_BUFFERS, "");
-
-	if (cfg->cmp_mode != CMP_MODE_RAW)
-		RETURN_ERROR_IF(cmp_cfg_icu_max_used_bits_out_of_limit(cfg->max_used_bits), PAR_MAX_USED_BITS, "");
+	if (!buf_b)
+		return 0;
 
-	if (cmp_imagette_data_type_is_used(cfg->data_type)) {
-		RETURN_ERROR_IF(cmp_cfg_imagette_is_invalid(cfg, ICU_CHECK), PAR_SPECIFIC, "");
-	} else if (cmp_fx_cob_data_type_is_used(cfg->data_type)) {
-		RETURN_ERROR_IF(cmp_cfg_fx_cob_is_invalid(cfg), PAR_SPECIFIC, "");
-	} else if (cmp_aux_data_type_is_used(cfg->data_type)) {
-		RETURN_ERROR_IF(cmp_cfg_aux_is_invalid(cfg), PAR_SPECIFIC, "");
-	} else {
-		RETURN_ERROR(INT_DATA_TYPE_UNSUPPORTED, "");
-	}
+	if ((const char *)buf_a < (const char *)buf_b + size_b &&
+	    (const char *)buf_b < (const char *)buf_a + size_a)
+		return 1;
 
-	return CMP_ERROR(NO_ERROR);
+	return 0;
 }
 
 
@@ -2053,29 +1477,28 @@ static uint32_t cmp_cfg_icu_is_invalid_error_code(const struct cmp_cfg *cfg)
  * @param cfg		pointer to the compression configuration structure
  * @param cmp_size	length of the bitstream in bits
  *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF if the bitstream buffer is too small to put the
- *	value in the bitstream
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
  */
 
 static uint32_t pad_bitstream(const struct cmp_cfg *cfg, uint32_t cmp_size)
 {
 	unsigned int output_buf_len_bits, n_pad_bits;
 
-	if (!cfg->icu_output_buf)
+	if (!cfg->dst)
 		return cmp_size;
 
 	/* no padding in RAW mode; ALWAYS BIG-ENDIAN */
 	if (cfg->cmp_mode == CMP_MODE_RAW)
 		return cmp_size;
 
-	/* maximum length of the bitstream/icu_output_buf in bits */
-	output_buf_len_bits = cmp_buffer_length_to_bits(cfg->buffer_length);
+	/* maximum length of the bitstream in bits */
+	output_buf_len_bits = cmp_stream_size_to_bits(cfg->stream_size);
 
 	n_pad_bits = 32 - (cmp_size & 0x1FU);
 	if (n_pad_bits < 32) {
 		FORWARD_IF_ERROR(put_n_bits32(0, n_pad_bits, cmp_size,
-				 cfg->icu_output_buf, output_buf_len_bits), "");
+				 cfg->dst, output_buf_len_bits), "");
 	}
 
 	return cmp_size;
@@ -2087,10 +1510,10 @@ static uint32_t pad_bitstream(const struct cmp_cfg *cfg, uint32_t cmp_size)
  * This function can compress all types of collection data (one at a time).
  * This function does not take the header of a collection into account.
  *
- * @param cfg	pointer to a compression configuration
+ * @param cfg		pointer to the compression configuration structure
+ * @param stream_len	already used length of the bitstream in bits
  *
- * @note the validity of the cfg structure is checked before the compression is
- *	 started
+ * @note the validity of the cfg structure is not checked
  *
  * @returns the bit length of the bitstream on success or an error code if it
  *	fails (which can be tested with cmp_is_error())
@@ -2104,29 +1527,23 @@ static uint32_t compress_data_internal(const struct cmp_cfg *cfg, uint32_t strea
 	RETURN_ERROR_IF(cfg == NULL, GENERIC, "");
 	RETURN_ERROR_IF(stream_len & 0x7, GENERIC, "The stream_len parameter must be a multiple of 8.");
 
-	if (raw_mode_is_used(cfg->cmp_mode) && cfg->icu_output_buf) {
-		uint32_t raw_stream_size = (stream_len >> 3)
-			+ cfg->samples * (uint32_t)size_of_a_sample(cfg->data_type);
-
-		/* TODO: move this check to the memcpy */
-		RETURN_ERROR_IF(raw_stream_size > cfg->buffer_length, SMALL_BUF_, "");
-	}
 	if (cfg->samples == 0) /* nothing to compress we are done */
 		return stream_len;
 
-	FORWARD_IF_ERROR(cmp_cfg_icu_is_invalid_error_code(cfg), "");
-
-
 	if (raw_mode_is_used(cfg->cmp_mode)) {
 		uint32_t raw_size = cfg->samples * (uint32_t)size_of_a_sample(cfg->data_type);
 
-		if (cfg->icu_output_buf) {
-			uint8_t *p = (uint8_t *)cfg->icu_output_buf + (stream_len >> 3);
+		if (cfg->dst) {
+			uint32_t offset_bytes = stream_len >> 3;
+			uint8_t *p = (uint8_t *)cfg->dst + offset_bytes;
+			uint32_t new_stream_size = offset_bytes + raw_size;
 
-			memcpy(p, cfg->input_buf, raw_size);
-			RETURN_ERROR_IF(cpu_to_be_data_type(p, raw_size, cfg->data_type), GENERIC, "");
+			RETURN_ERROR_IF(new_stream_size > cfg->stream_size, SMALL_BUFFER, "");
+			memcpy(p, cfg->src, raw_size);
+			RETURN_ERROR_IF(cpu_to_be_data_type(p, raw_size, cfg->data_type),
+					INT_DATA_TYPE_UNSUPPORTED, "");
 		}
-		bitsize += stream_len + raw_size*8; /* convert to bits */
+		bitsize += stream_len + raw_size * 8; /* convert to bits */
 	} else {
 		switch (cfg->data_type) {
 		case DATA_TYPE_IMAGETTE:
@@ -2151,18 +1568,6 @@ static uint32_t compress_data_internal(const struct cmp_cfg *cfg, uint32_t strea
 			bitsize = compress_s_fx_efx_ncob_ecob(cfg, stream_len);
 			break;
 
-		case DATA_TYPE_F_FX:
-			bitsize = compress_f_fx(cfg, stream_len);
-			break;
-		case DATA_TYPE_F_FX_EFX:
-			bitsize = compress_f_fx_efx(cfg, stream_len);
-			break;
-		case DATA_TYPE_F_FX_NCOB:
-			bitsize = compress_f_fx_ncob(cfg, stream_len);
-			break;
-		case DATA_TYPE_F_FX_EFX_NCOB_ECOB:
-			bitsize = compress_f_fx_efx_ncob_ecob(cfg, stream_len);
-			break;
 
 		case DATA_TYPE_L_FX:
 			bitsize = compress_l_fx(cfg, stream_len);
@@ -2189,12 +1594,15 @@ static uint32_t compress_data_internal(const struct cmp_cfg *cfg, uint32_t strea
 			bitsize = compress_smearing(cfg, stream_len);
 			break;
 
-		/* LCOV_EXCL_START */
+		case DATA_TYPE_F_FX:
+		case DATA_TYPE_F_FX_EFX:
+		case DATA_TYPE_F_FX_NCOB:
+		case DATA_TYPE_F_FX_EFX_NCOB_ECOB:
+		case DATA_TYPE_CHUNK:
 		case DATA_TYPE_UNKNOWN:
 		default:
 			RETURN_ERROR(INT_DATA_TYPE_UNSUPPORTED, "");
 		}
-		/* LCOV_EXCL_STOP */
 	}
 
 	if (cmp_is_error(bitsize))
@@ -2207,67 +1615,127 @@ static uint32_t compress_data_internal(const struct cmp_cfg *cfg, uint32_t strea
 
 
 /**
- * @brief compress data on the ICU in software
+ * @brief check if the ICU buffer parameters are invalid
  *
- * @param cfg	pointer to a compression configuration (created with the
- *		cmp_cfg_icu_create() function, setup with the cmp_cfg_xxx() functions)
+ * @param cfg	pointer to the compressor configuration to check
  *
- * @note the validity of the cfg structure is checked before the compression is
- *	 started
- *
- * @returns the bit length of the bitstream on success; negative on error,
- *	CMP_ERROR_SMALL_BUF (-2) if the compressed data buffer is too small to
- *	hold the whole compressed data, CMP_ERROR_HIGH_VALUE (-3) if a data or
- *	model value is bigger than the max_used_bits parameter allows (set with
- *	the cmp_set_max_used_bits() function)
+ * @returns 0 if the buffer parameters are valid, otherwise invalid
  */
 
-int icu_compress_data(const struct cmp_cfg *cfg)
+static uint32_t check_compression_buffers(const struct cmp_cfg *cfg)
 {
-	struct cmp_cfg cfg_cpy;
-	uint32_t dst_capacity_used = 0;
-
-	if (cfg) {
-		if (cfg->samples == 0)
-			return 0;
-		cfg_cpy = *cfg;
-		cfg_cpy.buffer_length = cmp_cal_size_of_data(cfg->buffer_length, cfg->data_type);
-		if (cfg_cpy.icu_output_buf && !cfg_cpy.buffer_length)
-			return -1;
-
-		if (!rdcu_supported_data_type_is_used(cfg->data_type) && !cmp_data_type_is_invalid(cfg->data_type)) {
-			if (cfg->icu_new_model_buf) {
-				if (cfg->input_buf)
-					memcpy(cfg->icu_new_model_buf, cfg->input_buf, COLLECTION_HDR_SIZE);
-				cfg_cpy.icu_new_model_buf = (uint8_t *)cfg_cpy.icu_new_model_buf + COLLECTION_HDR_SIZE;
-			}
-			if (cfg->icu_output_buf && cfg->input_buf && cfg->buffer_length)
-				memcpy(cfg->icu_output_buf, cfg->input_buf, COLLECTION_HDR_SIZE);
-			if (cfg->input_buf)
-				cfg_cpy.input_buf =  (uint8_t *)cfg->input_buf + COLLECTION_HDR_SIZE;
-			if (cfg->model_buf)
-				cfg_cpy.model_buf = (uint8_t *)cfg->model_buf + COLLECTION_HDR_SIZE;
-			dst_capacity_used = COLLECTION_HDR_SIZE*8;
-		}
-		return (int)compress_data_internal(&cfg_cpy, dst_capacity_used);
+	size_t data_size;
+
+	RETURN_ERROR_IF(cfg == NULL, GENERIC, "");
+
+	RETURN_ERROR_IF(cfg->src == NULL, CHUNK_NULL, "");
+
+	data_size = size_of_a_sample(cfg->data_type) * cfg->samples;
+
+	if (cfg->samples == 0)
+		debug_print("Warning: The samples parameter is 0. No data are compressed. This behavior may not be intended.");
+
+	RETURN_ERROR_IF(buffer_overlaps(cfg->dst, cfg->stream_size,
+					cfg->src, data_size), PAR_BUFFERS,
+		"The compressed data buffer and the data to compress buffer are overlapping.");
+
+	if (model_mode_is_used(cfg->cmp_mode)) {
+		RETURN_ERROR_IF(cfg->model_buf == NULL, PAR_NO_MODEL, "");
+
+		RETURN_ERROR_IF(buffer_overlaps(cfg->model_buf, data_size,
+						cfg->src, data_size), PAR_BUFFERS,
+				"The model buffer and the data to compress buffer are overlapping.");
+		RETURN_ERROR_IF(buffer_overlaps(cfg->model_buf, data_size,
+						cfg->dst, cfg->stream_size), PAR_BUFFERS,
+				"The model buffer and the compressed data buffer are overlapping.");
+
+		RETURN_ERROR_IF(buffer_overlaps(cfg->updated_model_buf, data_size,
+						cfg->src, data_size), PAR_BUFFERS,
+				"The updated model buffer and the data to compress buffer are overlapping.");
+		RETURN_ERROR_IF(buffer_overlaps(cfg->updated_model_buf, data_size,
+						cfg->dst, cfg->stream_size), PAR_BUFFERS,
+				"The updated model buffer and the compressed data buffer are overlapping.");
 	}
-	return (int)compress_data_internal(NULL, dst_capacity_used);
+
+	return CMP_ERROR(NO_ERROR);
 }
 
 
 /**
- * @brief estimate a "good" spillover threshold parameter
+ * @brief checks if the ICU compression configuration is valid
+ *
+ * @param cfg	pointer to the cmp_cfg structure to be validated
+ *
+ * @returns an error code if any of the configuration parameters are invalid,
+ *	otherwise returns CMP_ERROR_NO_ERROR on valid configuration
+ */
+
+static uint32_t cmp_cfg_icu_is_invalid_error_code(const struct cmp_cfg *cfg)
+{
+
+	RETURN_ERROR_IF(cmp_cfg_gen_par_is_invalid(cfg), PAR_GENERIC, "");
+
+	if (cmp_imagette_data_type_is_used(cfg->data_type))
+		RETURN_ERROR_IF(cmp_cfg_imagette_is_invalid(cfg), PAR_SPECIFIC, "");
+	else if (cmp_fx_cob_data_type_is_used(cfg->data_type))
+		RETURN_ERROR_IF(cmp_cfg_fx_cob_is_invalid(cfg), PAR_SPECIFIC, "");
+	else
+		RETURN_ERROR_IF(cmp_cfg_aux_is_invalid(cfg), PAR_SPECIFIC, "");
+
+	FORWARD_IF_ERROR(check_compression_buffers(cfg), "");
+
+	return CMP_ERROR(NO_ERROR);
+}
+
+
+/**
+ * @brief calculate the optimal spill threshold value for zero escape mechanism
  *
  * @param golomb_par	Golomb parameter
+ * @param max_data_bits	maximum number of used data bits
  *
- * @returns a spill over threshold parameter
- * TODO: tune this calculation for multi escape symbol mechanism
+ * @returns the highest optimal spill threshold value for a given Golomb
+ *	parameter, when the zero escape mechanism is used or 0 if the
+ *	Golomb parameter is not valid
  */
 
-static uint32_t cmp_guess_good_spill(uint32_t golomb_par)
+static uint32_t cmp_best_zero_spill(uint32_t golomb_par, uint32_t max_data_bits)
 {
-	if (!golomb_par)
+	uint32_t const max_spill = cmp_icu_max_spill(golomb_par);
+	uint32_t cutoff;
+	uint32_t spill;
+
+	if (golomb_par < MIN_NON_IMA_GOLOMB_PAR)
 		return 0;
+	if (golomb_par > MAX_NON_IMA_GOLOMB_PAR)
+		return 0;
+
+	cutoff = (0x2U << ilog_2(golomb_par)) - golomb_par;
+	spill = max_data_bits * golomb_par + cutoff;
+	if (spill > max_spill)
+		spill = max_spill;
+
+	return spill;
+}
+
+
+/**
+ * @brief estimate a "good" spillover threshold parameter
+ *
+ * @param golomb_par	Golomb parameter
+ * @param cmp_mode	compression mode
+ * @param max_data_bits	maximum number of used data bits
+ *
+ * @returns a spillover threshold parameter or 0 if the Golomb parameter is not
+ *	valid
+ */
+
+static uint32_t cmp_get_spill(uint32_t golomb_par, enum cmp_mode cmp_mode,
+			      uint32_t max_data_bits)
+{
+	if (zero_escape_mech_is_used(cmp_mode))
+		return cmp_best_zero_spill(golomb_par, max_data_bits);
+
 	return cmp_icu_max_spill(golomb_par);
 }
 
@@ -2315,26 +1783,33 @@ static uint32_t set_cmp_col_size(uint8_t *cmp_col_size_field, uint32_t cmp_col_s
  *	success or an error code if it fails (which can be tested with
  *	cmp_is_error())
  */
-
-static uint32_t cmp_collection(uint8_t *col, uint8_t *model, uint8_t *updated_model,
+static uint32_t cmp_collection(const uint8_t *col,
+			       const uint8_t *model, uint8_t *updated_model,
 			       uint32_t *dst, uint32_t dst_capacity,
 			       struct cmp_cfg *cfg, uint32_t dst_size)
 {
-	uint32_t dst_size_begin = dst_size;
+	uint32_t const dst_size_begin = dst_size;
 	uint32_t dst_size_bits;
-	struct collection_hdr *col_hdr = (struct collection_hdr *)col;
-	uint16_t col_data_length = cmp_col_get_data_length(col_hdr);
+	const struct collection_hdr *col_hdr = (const struct collection_hdr *)col;
+	uint16_t const col_data_length = cmp_col_get_data_length(col_hdr);
 	uint16_t sample_size;
 
 	/* sanity check of the collection header */
 	cfg->data_type = convert_subservice_to_cmp_data_type(cmp_col_get_subservice(col_hdr));
 	sample_size = (uint16_t)size_of_a_sample(cfg->data_type);
-	RETURN_ERROR_IF(sample_size == 0, COL_SUBSERVICE_UNSUPPORTED,
-			"unsupported subservice: %u", cmp_col_get_subservice(col_hdr));
 	RETURN_ERROR_IF(col_data_length % sample_size, COL_SIZE_INCONSISTENT,
 			"col_data_length: %u %% sample_size: %u != 0", col_data_length, sample_size);
 	cfg->samples = col_data_length/sample_size;
 
+	/* prepare the different buffers */
+	cfg->src = col + COLLECTION_HDR_SIZE;
+	if (model)
+		cfg->model_buf = model + COLLECTION_HDR_SIZE;
+	if (updated_model)
+		cfg->updated_model_buf = updated_model + COLLECTION_HDR_SIZE;
+	cfg->dst = dst;
+	cfg->stream_size = dst_capacity;
+	FORWARD_IF_ERROR(cmp_cfg_icu_is_invalid_error_code(cfg), "");
 
 	if (cfg->cmp_mode != CMP_MODE_RAW) {
 		/* hear we reserve space for the compressed data size field */
@@ -2346,47 +1821,39 @@ static uint32_t cmp_collection(uint8_t *col, uint8_t *model, uint8_t *updated_mo
 	 */
 	if (dst) {
 		RETURN_ERROR_IF(dst_size + COLLECTION_HDR_SIZE > dst_capacity,
-				SMALL_BUF_, "");
+				SMALL_BUFFER, "");
 		memcpy((uint8_t *)dst + dst_size, col, COLLECTION_HDR_SIZE);
 	}
 	dst_size += COLLECTION_HDR_SIZE;
 	if (model_mode_is_used(cfg->cmp_mode) && updated_model)
 		memcpy(updated_model, col, COLLECTION_HDR_SIZE);
 
-	/* prepare the different buffers */
-	cfg->icu_output_buf = dst;
-	cfg->input_buf = col + COLLECTION_HDR_SIZE;
-	if (model)
-		cfg->model_buf = model + COLLECTION_HDR_SIZE;
-	if (updated_model)
-		cfg->icu_new_model_buf = updated_model + COLLECTION_HDR_SIZE;
-
 	/* is enough capacity in the dst buffer to store the data uncompressed */
-	if ((!dst || dst_capacity >= dst_size + col_data_length) &&
+	if ((dst == NULL || dst_capacity >= dst_size + col_data_length) &&
 	    cfg->cmp_mode != CMP_MODE_RAW) {
 		/* we set the compressed buffer size to the data size -1 to provoke
-		 * a CMP_ERROR_SMALL_BUF_ error if the data are not compressible
+		 * a CMP_ERROR_SMALL_BUFFER error if the data are not compressible
 		 */
-		cfg->buffer_length = dst_size + col_data_length - 1;
-		dst_size_bits = compress_data_internal(cfg, dst_size<<3);
+		cfg->stream_size = dst_size + col_data_length - 1;
+		dst_size_bits = compress_data_internal(cfg, dst_size << 3);
 
-		if (cmp_get_error_code(dst_size_bits) == CMP_ERROR_SMALL_BUF_ ||
-		    (!dst && cmp_bit_to_byte(dst_size_bits)-dst_size > col_data_length)) { /* if dst == NULL compress_data_internal will not return a CMP_ERROR_SMALL_BUF */
+		if (cmp_get_error_code(dst_size_bits) == CMP_ERROR_SMALL_BUFFER ||
+		    (!dst && dst_size_bits > cmp_stream_size_to_bits(cfg->stream_size))) { /* if dst == NULL compress_data_internal will not return a CMP_ERROR_SMALL_BUFFER */
 			/* can not compress the data with the given parameters;
 			 * put them uncompressed (raw) into the dst buffer */
 			enum cmp_mode cmp_mode_cpy = cfg->cmp_mode;
 
-			cfg->buffer_length = dst_size + col_data_length;
+			cfg->stream_size = dst_size + col_data_length;
 			cfg->cmp_mode = CMP_MODE_RAW;
-			dst_size_bits = compress_data_internal(cfg, dst_size<<3);
+			dst_size_bits = compress_data_internal(cfg, dst_size << 3);
 			cfg->cmp_mode = cmp_mode_cpy;
 			/* updated model is in this case a copy of the data to compress */
-			if (model_mode_is_used(cfg->cmp_mode) && cfg->icu_new_model_buf)
-				memcpy(cfg->icu_new_model_buf, cfg->input_buf, col_data_length);
+			if (model_mode_is_used(cfg->cmp_mode) && cfg->updated_model_buf)
+				memcpy(cfg->updated_model_buf, cfg->src, col_data_length);
 		}
 	} else {
-		cfg->buffer_length = dst_capacity;
-		dst_size_bits = compress_data_internal(cfg, dst_size<<3);
+		cfg->stream_size = dst_capacity;
+		dst_size_bits = compress_data_internal(cfg, dst_size << 3);
 	}
 	FORWARD_IF_ERROR(dst_size_bits, "compression failed");
 
@@ -2437,10 +1904,7 @@ static uint32_t cmp_ent_build_chunk_header(uint32_t *entity, uint32_t chunk_size
 		/* model id/counter are set by the user with the compress_chunk_set_model_id_and_counter() */
 		err |= cmp_ent_set_model_id(ent, 0);
 		err |= cmp_ent_set_model_counter(ent, 0);
-		if (cfg->max_used_bits)
-			err |= cmp_ent_set_max_used_bits_version(ent, cfg->max_used_bits->version);
-		else
-			err |= cmp_ent_set_max_used_bits_version(ent, 0);
+		err |= cmp_ent_set_reserved(ent, 0);
 		err |= cmp_ent_set_lossy_cmp_par(ent, cfg->round);
 		if (cfg->cmp_mode != CMP_MODE_RAW) {
 			err |= cmp_ent_set_non_ima_spill1(ent, cfg->spill_par_1);
@@ -2471,160 +1935,141 @@ static uint32_t cmp_ent_build_chunk_header(uint32_t *entity, uint32_t chunk_size
 
 
 /**
- * @brief types of chunks containing different types of collections
- *	according to DetailedBudgetWorking_2023-10-11
- */
-
-enum chunk_type {
-	CHUNK_TYPE_UNKNOWN,
-	CHUNK_TYPE_NCAM_IMAGETTE,
-	CHUNK_TYPE_SHORT_CADENCE,
-	CHUNK_TYPE_LONG_CADENCE,
-	CHUNK_TYPE_SAT_IMAGETTE,
-	CHUNK_TYPE_OFFSET_BACKGROUND, /* N-CAM */
-	CHUNK_TYPE_SMEARING,
-	CHUNK_TYPE_F_CHAIN
-};
-
-
-/**
- * @brief get the chunk_type of a collection
- * @details map a sub-service to a chunk service according to
- *	DetailedBudgetWorking_2023-10-11
+ * @brief Set the compression configuration from the compression parameters
+ *	based on the chunk type of the collection
  *
- * @param col	pointer to a collection header
+ * @param[in] col	pointer to a collection header
+ * @param[in] par	pointer to a compression parameters struct
+ * @param[out] cfg	pointer to a compression configuration
  *
- * @returns chunk type of the collection, CHUNK_TYPE_UNKNOWN on
- *	failure
+ * @returns the chunk type of the collection
  */
 
-static enum chunk_type cmp_col_get_chunk_type(const struct collection_hdr *col)
+static enum chunk_type init_cmp_cfg_from_cmp_par(const struct collection_hdr *col,
+						 const struct cmp_par *par,
+						 struct cmp_cfg *cfg)
 {
-	enum chunk_type chunk_type;
-
-	switch (cmp_col_get_subservice(col)) {
-	case SST_NCxx_S_SCIENCE_IMAGETTE:
-		chunk_type = CHUNK_TYPE_NCAM_IMAGETTE;
-		break;
-	case SST_NCxx_S_SCIENCE_SAT_IMAGETTE:
-		chunk_type = CHUNK_TYPE_SAT_IMAGETTE;
-		break;
-	case SST_NCxx_S_SCIENCE_OFFSET:
-	case SST_NCxx_S_SCIENCE_BACKGROUND:
-		chunk_type = CHUNK_TYPE_OFFSET_BACKGROUND;
-		break;
-	case SST_NCxx_S_SCIENCE_SMEARING:
-		chunk_type = CHUNK_TYPE_SMEARING;
-		break;
-	case SST_NCxx_S_SCIENCE_S_FX:
-	case SST_NCxx_S_SCIENCE_S_FX_EFX:
-	case SST_NCxx_S_SCIENCE_S_FX_NCOB:
-	case SST_NCxx_S_SCIENCE_S_FX_EFX_NCOB_ECOB:
-		chunk_type = CHUNK_TYPE_SHORT_CADENCE;
-		break;
-	case SST_NCxx_S_SCIENCE_L_FX:
-	case SST_NCxx_S_SCIENCE_L_FX_EFX:
-	case SST_NCxx_S_SCIENCE_L_FX_NCOB:
-	case SST_NCxx_S_SCIENCE_L_FX_EFX_NCOB_ECOB:
-		chunk_type = CHUNK_TYPE_LONG_CADENCE;
-		break;
-	case SST_FCx_S_SCIENCE_IMAGETTE:
-	case SST_FCx_S_SCIENCE_OFFSET_VALUES:
-	case SST_FCx_S_BACKGROUND_VALUES:
-		chunk_type = CHUNK_TYPE_F_CHAIN;
-		break;
-	case SST_NCxx_S_SCIENCE_F_FX:
-	case SST_NCxx_S_SCIENCE_F_FX_EFX:
-	case SST_NCxx_S_SCIENCE_F_FX_NCOB:
-	case SST_NCxx_S_SCIENCE_F_FX_EFX_NCOB_ECOB:
-		debug_print("Error: No chunk is defined for fast cadence subservices");
-		/* fall through */
-	default:
-		chunk_type = CHUNK_TYPE_UNKNOWN;
-		break;
-	}
-
-	return chunk_type;
-}
-
-
-/**
- * @brief Set the compression configuration from the compression parameters
- *	based on the chunk type
- *
- * @param[in] par		pointer to a compression parameters struct
- * @param[in] chunk_type	the type of the chunk to be compressed
- * @param[out] cfg		pointer to a compression configuration
- */
+	enum chunk_type chunk_type = cmp_col_get_chunk_type(col);
 
-static void init_cmp_cfg_from_cmp_par(const struct cmp_par *par, enum chunk_type chunk_type,
-				     struct cmp_cfg *cfg)
-{
 	memset(cfg, 0, sizeof(struct cmp_cfg));
 
-	/* the ranges of the parameters are checked in cmp_cfg_icu_is_invalid() */
+	/* the ranges of the parameters are checked in cmp_cfg_icu_is_invalid_error_code() */
 	cfg->cmp_mode = par->cmp_mode;
 	cfg->model_value = par->model_value;
-	cfg->round = par->lossy_par;
-	cfg->max_used_bits = &MAX_USED_BITS_SAFE;
+	if (par->lossy_par)
+		debug_print("Warning: lossy compression is not supported for chunk compression, lossy_par will be ignored.");
+	cfg->round = 0;
 
 	switch (chunk_type) {
 	case CHUNK_TYPE_NCAM_IMAGETTE:
 		cfg->cmp_par_imagette = par->nc_imagette;
+		cfg->spill_imagette = cmp_get_spill(cfg->cmp_par_imagette, cfg->cmp_mode,
+						    MAX_USED_BITS.nc_imagette);
 		break;
 	case CHUNK_TYPE_SAT_IMAGETTE:
 		cfg->cmp_par_imagette = par->saturated_imagette;
+		cfg->spill_imagette = cmp_get_spill(cfg->cmp_par_imagette, cfg->cmp_mode,
+						    MAX_USED_BITS.saturated_imagette);
 		break;
 	case CHUNK_TYPE_SHORT_CADENCE:
 		cfg->cmp_par_exp_flags = par->s_exp_flags;
+		cfg->spill_exp_flags = cmp_get_spill(cfg->cmp_par_exp_flags, cfg->cmp_mode,
+						     MAX_USED_BITS.s_exp_flags);
 		cfg->cmp_par_fx = par->s_fx;
+		cfg->spill_fx = cmp_get_spill(cfg->cmp_par_fx, cfg->cmp_mode,
+					      MAX_USED_BITS.s_fx);
 		cfg->cmp_par_ncob = par->s_ncob;
+		cfg->spill_ncob = cmp_get_spill(cfg->cmp_par_ncob, cfg->cmp_mode,
+						MAX_USED_BITS.s_ncob);
 		cfg->cmp_par_efx = par->s_efx;
+		cfg->spill_efx = cmp_get_spill(cfg->cmp_par_efx, cfg->cmp_mode,
+					       MAX_USED_BITS.s_efx);
 		cfg->cmp_par_ecob = par->s_ecob;
+		cfg->spill_ecob = cmp_get_spill(cfg->cmp_par_ecob, cfg->cmp_mode,
+						MAX_USED_BITS.s_ecob);
 		break;
 	case CHUNK_TYPE_LONG_CADENCE:
 		cfg->cmp_par_exp_flags = par->l_exp_flags;
+		cfg->spill_exp_flags = cmp_get_spill(cfg->cmp_par_exp_flags, cfg->cmp_mode,
+						     MAX_USED_BITS.l_exp_flags);
 		cfg->cmp_par_fx = par->l_fx;
+		cfg->spill_fx = cmp_get_spill(cfg->cmp_par_fx, cfg->cmp_mode,
+					      MAX_USED_BITS.l_fx);
 		cfg->cmp_par_ncob = par->l_ncob;
+		cfg->spill_ncob = cmp_get_spill(cfg->cmp_par_ncob, cfg->cmp_mode,
+						MAX_USED_BITS.l_ncob);
 		cfg->cmp_par_efx = par->l_efx;
+		cfg->spill_efx = cmp_get_spill(cfg->cmp_par_efx, cfg->cmp_mode,
+					       MAX_USED_BITS.l_efx);
 		cfg->cmp_par_ecob = par->l_ecob;
+		cfg->spill_ecob = cmp_get_spill(cfg->cmp_par_ecob, cfg->cmp_mode,
+						MAX_USED_BITS.l_ecob);
 		cfg->cmp_par_fx_cob_variance = par->l_fx_cob_variance;
+		cfg->spill_fx_cob_variance = cmp_get_spill(cfg->cmp_par_fx_cob_variance,
+							   cfg->cmp_mode, MAX_USED_BITS.l_fx_cob_variance);
 		break;
 	case CHUNK_TYPE_OFFSET_BACKGROUND:
 		cfg->cmp_par_offset_mean = par->nc_offset_mean;
+		cfg->spill_offset_mean = cmp_get_spill(cfg->cmp_par_offset_mean,
+						cfg->cmp_mode, MAX_USED_BITS.nc_offset_mean);
 		cfg->cmp_par_offset_variance = par->nc_offset_variance;
-
+		cfg->spill_offset_variance = cmp_get_spill(cfg->cmp_par_offset_variance,
+						cfg->cmp_mode, MAX_USED_BITS.nc_offset_variance);
 		cfg->cmp_par_background_mean = par->nc_background_mean;
+		cfg->spill_background_mean = cmp_get_spill(cfg->cmp_par_background_mean,
+						cfg->cmp_mode, MAX_USED_BITS.nc_background_mean);
 		cfg->cmp_par_background_variance = par->nc_background_variance;
+		cfg->spill_background_variance = cmp_get_spill(cfg->cmp_par_background_variance,
+						cfg->cmp_mode, MAX_USED_BITS.nc_background_variance);
 		cfg->cmp_par_background_pixels_error = par->nc_background_outlier_pixels;
+		cfg->spill_background_pixels_error = cmp_get_spill(cfg->cmp_par_background_pixels_error,
+						cfg->cmp_mode, MAX_USED_BITS.nc_background_outlier_pixels);
 		break;
 
 	case CHUNK_TYPE_SMEARING:
 		cfg->cmp_par_smearing_mean = par->smearing_mean;
+		cfg->spill_smearing_mean = cmp_get_spill(cfg->cmp_par_smearing_mean,
+						cfg->cmp_mode, MAX_USED_BITS.smearing_mean);
 		cfg->cmp_par_smearing_variance = par->smearing_variance_mean;
+		cfg->spill_smearing_variance = cmp_get_spill(cfg->cmp_par_smearing_variance,
+						cfg->cmp_mode, MAX_USED_BITS.smearing_variance_mean);
 		cfg->cmp_par_smearing_pixels_error = par->smearing_outlier_pixels;
+		cfg->spill_smearing_pixels_error = cmp_get_spill(cfg->cmp_par_smearing_pixels_error,
+						cfg->cmp_mode, MAX_USED_BITS.smearing_outlier_pixels);
 		break;
 
 	case CHUNK_TYPE_F_CHAIN:
 		cfg->cmp_par_imagette = par->fc_imagette;
+		cfg->spill_imagette = cmp_get_spill(cfg->cmp_par_imagette,
+						cfg->cmp_mode, MAX_USED_BITS.fc_imagette);
 
 		cfg->cmp_par_offset_mean = par->fc_offset_mean;
+		cfg->spill_offset_mean = cmp_get_spill(cfg->cmp_par_offset_mean,
+						cfg->cmp_mode, MAX_USED_BITS.fc_offset_mean);
 		cfg->cmp_par_offset_variance = par->fc_offset_variance;
+		cfg->spill_offset_variance = cmp_get_spill(cfg->cmp_par_offset_variance,
+						cfg->cmp_mode, MAX_USED_BITS.fc_offset_variance);
 
 		cfg->cmp_par_background_mean = par->fc_background_mean;
+		cfg->spill_background_mean = cmp_get_spill(cfg->cmp_par_background_mean,
+						cfg->cmp_mode, MAX_USED_BITS.fc_background_mean);
 		cfg->cmp_par_background_variance = par->fc_background_variance;
+		cfg->spill_background_variance = cmp_get_spill(cfg->cmp_par_background_variance,
+						cfg->cmp_mode, MAX_USED_BITS.fc_background_variance);
 		cfg->cmp_par_background_pixels_error = par->fc_background_outlier_pixels;
+		cfg->spill_background_pixels_error = cmp_get_spill(cfg->cmp_par_background_pixels_error,
+						cfg->cmp_mode, MAX_USED_BITS.fc_background_outlier_pixels);
 		break;
 	case CHUNK_TYPE_UNKNOWN:
+	default: /*
+		  * default case never reached because cmp_col_get_chunk_type
+		  * returns CHUNK_TYPE_UNKNOWN if the type is unknown
+		  */
+		chunk_type = CHUNK_TYPE_UNKNOWN;
 		break;
 	}
 
-	cfg->spill_par_1 = cmp_guess_good_spill(cfg->cmp_par_1);
-	cfg->spill_par_2 = cmp_guess_good_spill(cfg->cmp_par_2);
-	cfg->spill_par_3 = cmp_guess_good_spill(cfg->cmp_par_3);
-	cfg->spill_par_4 = cmp_guess_good_spill(cfg->cmp_par_4);
-	cfg->spill_par_5 = cmp_guess_good_spill(cfg->cmp_par_5);
-	cfg->spill_par_6 = cmp_guess_good_spill(cfg->cmp_par_6);
+	return chunk_type;
 }
 
 
@@ -2639,7 +2084,7 @@ static void init_cmp_cfg_from_cmp_par(const struct cmp_par *par, enum chunk_type
  * @param version_id		application software version identifier
  */
 
-void compress_chunk_init(uint64_t(return_timestamp)(void), uint32_t version_id)
+void compress_chunk_init(uint64_t (*return_timestamp)(void), uint32_t version_id)
 {
 	if (return_timestamp)
 		get_timestamp = return_timestamp;
@@ -2664,24 +2109,25 @@ void compress_chunk_init(uint64_t(return_timestamp)(void), uint32_t version_id)
  * @param dst			destination pointer to the compressed data
  *				buffer; has to be 4-byte aligned; can be NULL to
  *				only get the compressed data size
- * @param dst_capacity		capacity of the dst buffer;  it's recommended to
+ * @param dst_capacity		capacity of the dst buffer; it's recommended to
  *				provide a dst_capacity >=
  *				compress_chunk_cmp_size_bound(chunk, chunk_size)
  *				as it eliminates one potential failure scenario:
  *				not enough space in the dst buffer to write the
  *				compressed data; size is internally rounded down
  *				to a multiple of 4
+ * @param cmp_par		pointer to a compression parameters struct
  * @returns the byte size of the compressed data or an error code if it
  *	fails (which can be tested with cmp_is_error())
  */
 
-uint32_t compress_chunk(void *chunk, uint32_t chunk_size,
-			void *chunk_model, void *updated_chunk_model,
+uint32_t compress_chunk(const void *chunk, uint32_t chunk_size,
+			const void *chunk_model, void *updated_chunk_model,
 			uint32_t *dst, uint32_t dst_capacity,
 			const struct cmp_par *cmp_par)
 {
-	uint64_t start_timestamp = get_timestamp();
-	struct collection_hdr *col = (struct collection_hdr *)chunk;
+	uint64_t const start_timestamp = get_timestamp();
+	const struct collection_hdr *col = (const struct collection_hdr *)chunk;
 	enum chunk_type chunk_type;
 	struct cmp_cfg cfg;
 	uint32_t cmp_size_byte; /* size of the compressed data in bytes */
@@ -2694,36 +2140,31 @@ uint32_t compress_chunk(void *chunk, uint32_t chunk_size,
 	RETURN_ERROR_IF(chunk_size > CMP_ENTITY_MAX_ORIGINAL_SIZE, CHUNK_TOO_LARGE,
 			"chunk_size: %"PRIu32"", chunk_size);
 
-	chunk_type = cmp_col_get_chunk_type(col);
+	chunk_type = init_cmp_cfg_from_cmp_par(col, cmp_par, &cfg);
 	RETURN_ERROR_IF(chunk_type == CHUNK_TYPE_UNKNOWN, COL_SUBSERVICE_UNSUPPORTED,
 			"unsupported subservice: %u", cmp_col_get_subservice(col));
 
-	init_cmp_cfg_from_cmp_par(cmp_par, chunk_type, &cfg);
-
 	/* reserve space for the compression entity header, we will build the
 	 * header after the compression of the chunk
 	 */
 	cmp_size_byte = cmp_ent_build_chunk_header(NULL, chunk_size, &cfg, start_timestamp, 0);
-	if (dst) {
-		RETURN_ERROR_IF(dst_capacity < cmp_size_byte, SMALL_BUF_,
-				"dst_capacity must be at least as large as the minimum size of the compression unit.");
-		memset(dst, 0, cmp_size_byte);
-	}
+	RETURN_ERROR_IF(dst && dst_capacity < cmp_size_byte, SMALL_BUFFER,
+			"dst_capacity must be at least as large as the minimum size of the compression unit.");
+
 
 	/* compress one collection after another */
 	for (read_bytes = 0;
 	     read_bytes <= chunk_size - COLLECTION_HDR_SIZE;
-	     read_bytes += cmp_col_get_size(col))
-	{
-		uint8_t *col_model = NULL;
+	     read_bytes += cmp_col_get_size(col)) {
+		const uint8_t *col_model = NULL;
 		uint8_t *col_up_model = NULL;
 
 		/* setup pointers for the next collection we want to compress */
-		col = (struct collection_hdr *)((uint8_t *)chunk + read_bytes);
+		col = (const struct collection_hdr *)((const uint8_t *)chunk + read_bytes);
 		if (chunk_model)
-			col_model = ((uint8_t *)chunk_model + read_bytes);
+			col_model = (const uint8_t *)chunk_model + read_bytes;
 		if (updated_chunk_model)
-			col_up_model = ((uint8_t *)updated_chunk_model + read_bytes);
+			col_up_model = (uint8_t *)updated_chunk_model + read_bytes;
 
 		RETURN_ERROR_IF(cmp_col_get_chunk_type(col) != chunk_type, CHUNK_SUBSERVICE_INCONSISTENT, "");
 
@@ -2731,7 +2172,7 @@ uint32_t compress_chunk(void *chunk, uint32_t chunk_size,
 		if (read_bytes + cmp_col_get_size(col) > chunk_size)
 			break;
 
-		cmp_size_byte = cmp_collection((uint8_t *)col, col_model, col_up_model,
+		cmp_size_byte = cmp_collection((const uint8_t *)col, col_model, col_up_model,
 					       dst, dst_capacity, &cfg, cmp_size_byte);
 		FORWARD_IF_ERROR(cmp_size_byte, "error occurred when compressing the collection with offset %u", read_bytes);
 	}
@@ -2746,7 +2187,7 @@ uint32_t compress_chunk(void *chunk, uint32_t chunk_size,
 
 
 /**
- * @brief returns the maximum compressed size in a worst case scenario
+ * @brief returns the maximum compressed size in a worst-case scenario
  * In case the input data is not compressible
  * This function is primarily useful for memory allocation purposes
  * (destination buffer size).
@@ -2779,7 +2220,8 @@ uint32_t compress_chunk_cmp_size_bound(const void *chunk, size_t chunk_size)
 	/* count the number of collections in the chunk */
 	for (read_bytes = 0;
 	     read_bytes <= (int32_t)(chunk_size-COLLECTION_HDR_SIZE);
-	     read_bytes += cmp_col_get_size((const struct collection_hdr *)((const uint8_t *)chunk + read_bytes)))
+	     read_bytes += cmp_col_get_size((const struct collection_hdr *)
+					    ((const uint8_t *)chunk + read_bytes)))
 		num_col++;
 
 	RETURN_ERROR_IF((uint32_t)read_bytes != chunk_size, CHUNK_SIZE_INCONSISTENT, "");
@@ -2819,3 +2261,94 @@ uint32_t compress_chunk_set_model_id_and_counter(void *dst, uint32_t dst_size,
 
 	return dst_size;
 }
+
+
+/**
+ * @brief compress data the same way as the RDCU HW compressor
+ *
+ * @param rcfg	pointer to a RDCU compression configuration (created with the
+ *		rdcu_cfg_create() function, set up with the rdcu_cfg_buffers()
+ *		and rdcu_cfg_imagette() functions)
+ * @param info	pointer to a compression information structure contains the
+ *		metadata of a compression (can be NULL)
+ *
+ * @returns the bit length of the bitstream on success or an error code if it
+ *	fails (which can be tested with cmp_is_error())
+ *
+ * @warning only the small buffer error in the info.cmp_err field is implemented
+ */
+
+uint32_t compress_like_rdcu(const struct rdcu_cfg *rcfg, struct cmp_info *info)
+{
+	struct cmp_cfg cfg;
+	uint32_t cmp_size_bit;
+
+	memset(&cfg, 0, sizeof(cfg));
+
+	if (info)
+		memset(info, 0, sizeof(*info));
+
+	if (!rcfg)
+		return compress_data_internal(NULL, 0);
+
+	cfg.data_type = DATA_TYPE_IMAGETTE;
+
+	cfg.src = rcfg->input_buf;
+	cfg.model_buf = rcfg->model_buf;
+	cfg.samples = rcfg->samples;
+	cfg.stream_size = (rcfg->buffer_length * sizeof(uint16_t));
+	cfg.cmp_mode = rcfg->cmp_mode;
+	cfg.model_value = rcfg->model_value;
+	cfg.round = rcfg->round;
+
+	if (info) {
+		info->cmp_err = 0;
+		info->cmp_mode_used = (uint8_t)rcfg->cmp_mode;
+		info->model_value_used = (uint8_t)rcfg->model_value;
+		info->round_used = (uint8_t)rcfg->round;
+		info->spill_used = rcfg->spill;
+		info->golomb_par_used = rcfg->golomb_par;
+		info->samples_used = rcfg->samples;
+		info->rdcu_new_model_adr_used = rcfg->rdcu_new_model_adr;
+		info->rdcu_cmp_adr_used = rcfg->rdcu_buffer_adr;
+		info->cmp_size = 0;
+		info->ap1_cmp_size = 0;
+		info->ap2_cmp_size = 0;
+
+		cfg.cmp_par_imagette = rcfg->ap1_golomb_par;
+		cfg.spill_imagette = rcfg->ap1_spill;
+		if (cfg.cmp_par_imagette &&
+		    cmp_cfg_icu_is_invalid_error_code(&cfg) == CMP_ERROR_NO_ERROR)
+			info->ap1_cmp_size = compress_data_internal(&cfg, 0);
+
+
+		cfg.cmp_par_imagette = rcfg->ap2_golomb_par;
+		cfg.spill_imagette = rcfg->ap2_spill;
+		if (cfg.cmp_par_imagette &&
+		    cmp_cfg_icu_is_invalid_error_code(&cfg) == CMP_ERROR_NO_ERROR)
+			info->ap2_cmp_size = compress_data_internal(&cfg, 0);
+	}
+
+	cfg.cmp_par_imagette = rcfg->golomb_par;
+	cfg.spill_imagette = rcfg->spill;
+	cfg.updated_model_buf = rcfg->icu_new_model_buf;
+	cfg.dst = rcfg->icu_output_buf;
+
+	FORWARD_IF_ERROR(cmp_cfg_icu_is_invalid_error_code(&cfg), "");
+
+	cmp_size_bit = compress_data_internal(&cfg, 0);
+
+	if (info) {
+		if (cmp_get_error_code(cmp_size_bit) == CMP_ERROR_SMALL_BUFFER)
+			info->cmp_err |= 1UL << 0;/* SMALL_BUFFER_ERR_BIT;*/ /* set small buffer error */
+		if (cmp_is_error(cmp_size_bit)) {
+			info->cmp_size = 0;
+			info->ap1_cmp_size = 0;
+			info->ap2_cmp_size = 0;
+		} else {
+			info->cmp_size = cmp_size_bit;
+		}
+	}
+
+	return cmp_size_bit;
+}
diff --git a/lib/icu_compress/meson.build b/lib/icu_compress/meson.build
index 01f4d370992dd60de5a047e2a0ce7bd850b6825f..bbddb279b62b8ca099d46e7fc624fb93efd62184 100644
--- a/lib/icu_compress/meson.build
+++ b/lib/icu_compress/meson.build
@@ -1,3 +1,4 @@
 icu_compress_sources = files([
+  'cmp_chunk_type.c',
   'cmp_icu.c'
 ])
diff --git a/lib/rdcu_compress/cmp_rdcu.c b/lib/rdcu_compress/cmp_rdcu.c
index 457d975249341f81c2c8b50436ad2620ae11b881..8a7264be9caf98d523d0000226599c9e627c557d 100644
--- a/lib/rdcu_compress/cmp_rdcu.c
+++ b/lib/rdcu_compress/cmp_rdcu.c
@@ -27,6 +27,7 @@
  */
 
 
+#include <stddef.h>
 #include <stdint.h>
 
 #include "../common/cmp_debug.h"
@@ -50,7 +51,7 @@ static int interrupt_signal_enabled = RDCU_INTR_SIG_DEFAULT;
 /**
  * @brief save repeating 3 lines of code...
  *
- * @note This function depends on the SpW implantation and must be adjusted to it.
+ * @note This function depends on the SpW implementation and must be adjusted to it.
  *
  * @note prints abort message if pending status is non-zero after 10 retries
  */
@@ -92,7 +93,7 @@ int rdcu_interrupt_compression(void)
 	rdcu_syncing();
 
 	/* clear local bit immediately, this is a write-only register.
-	 * we would not want to restart compression by accidentially calling
+	 * we would not want to restart compression by accidentally calling
 	 * rdcu_sync_compr_ctrl() again
 	 */
 	rdcu_clear_data_compr_interrupt();
@@ -104,15 +105,15 @@ int rdcu_interrupt_compression(void)
 /**
  * @brief set up RDCU compression register
  *
- * @param cfg  pointer to a compression configuration contains all parameters
- *	required for compression
+ * @param rcfg  pointer to a compression configuration contains all parameters
+ *	required for a RDCU compression
  *
  * @returns 0 on success, error otherwise
  */
 
-static int rdcu_set_compression_register(const struct cmp_cfg *cfg)
+static int rdcu_set_compression_register(const struct rdcu_cfg *rcfg)
 {
-	if (rdcu_cmp_cfg_is_invalid(cfg))
+	if (rdcu_cmp_cfg_is_invalid(rcfg))
 		return -1;
 #if 1
 	/*
@@ -130,39 +131,39 @@ static int rdcu_set_compression_register(const struct cmp_cfg *cfg)
 
 
 	/* first, set compression parameters in local mirror registers */
-	if (rdcu_set_compression_mode(cfg->cmp_mode))
+	if (rdcu_set_compression_mode(rcfg->cmp_mode))
 		return -1;
-	if (rdcu_set_golomb_param(cfg->golomb_par))
+	if (rdcu_set_golomb_param(rcfg->golomb_par))
 		return -1;
-	if (rdcu_set_spillover_threshold(cfg->spill))
+	if (rdcu_set_spillover_threshold(rcfg->spill))
 		return -1;
-	if (rdcu_set_weighting_param(cfg->model_value))
+	if (rdcu_set_weighting_param(rcfg->model_value))
 		return -1;
-	if (rdcu_set_noise_bits_rounded(cfg->round))
+	if (rdcu_set_noise_bits_rounded(rcfg->round))
 		return -1;
 
-	if (rdcu_set_adaptive_1_golomb_param(cfg->ap1_golomb_par))
+	if (rdcu_set_adaptive_1_golomb_param(rcfg->ap1_golomb_par))
 		return -1;
-	if (rdcu_set_adaptive_1_spillover_threshold(cfg->ap1_spill))
+	if (rdcu_set_adaptive_1_spillover_threshold(rcfg->ap1_spill))
 		return -1;
 
-	if (rdcu_set_adaptive_2_golomb_param(cfg->ap2_golomb_par))
+	if (rdcu_set_adaptive_2_golomb_param(rcfg->ap2_golomb_par))
 		return -1;
-	if (rdcu_set_adaptive_2_spillover_threshold(cfg->ap2_spill))
+	if (rdcu_set_adaptive_2_spillover_threshold(rcfg->ap2_spill))
 		return -1;
 
-	if (rdcu_set_data_start_addr(cfg->rdcu_data_adr))
+	if (rdcu_set_data_start_addr(rcfg->rdcu_data_adr))
 		return -1;
-	if (rdcu_set_model_start_addr(cfg->rdcu_model_adr))
+	if (rdcu_set_model_start_addr(rcfg->rdcu_model_adr))
 		return -1;
-	if (rdcu_set_num_samples(cfg->samples))
+	if (rdcu_set_num_samples(rcfg->samples))
 		return -1;
-	if (rdcu_set_new_model_start_addr(cfg->rdcu_new_model_adr))
+	if (rdcu_set_new_model_start_addr(rcfg->rdcu_new_model_adr))
 		return -1;
 
-	if (rdcu_set_compr_data_buf_start_addr(cfg->rdcu_buffer_adr))
+	if (rdcu_set_compr_data_buf_start_addr(rcfg->rdcu_buffer_adr))
 		return -1;
-	if (rdcu_set_compr_data_buf_len(cfg->buffer_length))
+	if (rdcu_set_compr_data_buf_len(rcfg->buffer_length))
 		return -1;
 
 	/* now sync the configuration registers to the RDCU... */
@@ -229,38 +230,38 @@ int rdcu_start_compression(void)
 /**
  * @brief set up RDCU SRAM for compression
  *
- * @param cfg  pointer to a compression configuration
+ * @param rcfg  pointer to a RDCU compression configuration
  *
  * @returns 0 on success, error otherwise
  */
 
-static int rdcu_transfer_sram(const struct cmp_cfg *cfg)
+static int rdcu_transfer_sram(const struct rdcu_cfg *rcfg)
 {
-	if (cfg->input_buf != NULL) {
+	if (rcfg->input_buf != NULL) {
 		/* round up needed size must be a multiple of 4 bytes */
-		uint32_t size = (cfg->samples * 2 + 3) & ~3U;
+		uint32_t size = (rcfg->samples * 2 + 3) & ~3U;
 		/* now set the data in the local mirror... */
-		if (rdcu_write_sram_16(cfg->input_buf, cfg->rdcu_data_adr, cfg->samples * 2) < 0) {
+		if (rdcu_write_sram_16(rcfg->input_buf, rcfg->rdcu_data_adr, rcfg->samples * 2) < 0) {
 			debug_print("Error: The data to be compressed cannot be transferred to the SRAM of the RDCU.");
 			return -1;
 		}
-		if (rdcu_sync_mirror_to_sram(cfg->rdcu_data_adr, size, rdcu_get_data_mtu())) {
+		if (rdcu_sync_mirror_to_sram(rcfg->rdcu_data_adr, size, rdcu_get_data_mtu())) {
 			debug_print("Error: The data to be compressed cannot be transferred to the SRAM of the RDCU.");
 			return -1;
 		}
 	}
 	/*...and the model when needed */
-	if (cfg->model_buf != NULL) {
+	if (rcfg->model_buf != NULL) {
 		/* set model only when model mode is used */
-		if (model_mode_is_used(cfg->cmp_mode)) {
+		if (model_mode_is_used(rcfg->cmp_mode)) {
 			/* round up needed size must be a multiple of 4 bytes */
-			uint32_t size = (cfg->samples * 2 + 3) & ~3U;
+			uint32_t size = (rcfg->samples * 2 + 3) & ~3U;
 			/* set the model in the local mirror... */
-			if (rdcu_write_sram_16(cfg->model_buf, cfg->rdcu_model_adr, cfg->samples * 2) < 0) {
+			if (rdcu_write_sram_16(rcfg->model_buf, rcfg->rdcu_model_adr, rcfg->samples * 2) < 0) {
 				debug_print("Error: The model buffer cannot be transferred to the SRAM of the RDCU.");
 				return -1;
 			}
-			if (rdcu_sync_mirror_to_sram(cfg->rdcu_model_adr, size, rdcu_get_data_mtu())) {
+			if (rdcu_sync_mirror_to_sram(rcfg->rdcu_model_adr, size, rdcu_get_data_mtu())) {
 				debug_print("Error: The model buffer cannot be transferred to the SRAM of the RDCU.");
 				return -1;
 			}
@@ -277,23 +278,23 @@ static int rdcu_transfer_sram(const struct cmp_cfg *cfg)
 /**
  * @brief compressing data with the help of the RDCU hardware compressor
  *
- * @param cfg  configuration contains all parameters required for compression
+ * @param rcfg  RDCU configuration contains all parameters required for compression
  *
  * @note Before the rdcu_compress function can be used, an initialisation of
  *	the RMAP library is required. This is achieved with the functions
  *	rdcu_ctrl_init() and rdcu_rmap_init().
- * @note The validity of the cfg structure is checked before the compression is
+ * @note The validity of the rcfg structure is checked before the compression is
  *	 started.
  *
  * @returns 0 on success, error otherwise
  */
 
-int rdcu_compress_data(const struct cmp_cfg *cfg)
+int rdcu_compress_data(const struct rdcu_cfg *rcfg)
 {
-	if (rdcu_set_compression_register(cfg))
+	if (rdcu_set_compression_register(rcfg))
 		return -1;
 
-	if (rdcu_transfer_sram(cfg))
+	if (rdcu_transfer_sram(rcfg))
 		return -1;
 
 	if (rdcu_start_compression())
@@ -406,6 +407,21 @@ int rdcu_read_cmp_info(struct cmp_info *info)
 }
 
 
+/**
+ * @brief calculate the need bytes to hold a bitstream
+ * @note we round up the result to multiples of 4 bytes
+ *
+ * @param cmp_size_bit	compressed data size, measured in bits
+ *
+ * @returns the size in bytes to store the hole bitstream
+ */
+
+static unsigned int cmp_bit_to_4byte(unsigned int cmp_size_bit)
+{
+	return (cmp_bit_to_byte(cmp_size_bit) + 3) & ~0x3UL;
+}
+
+
 /**
  * @brief read the compressed bitstream from the RDCU SRAM
  *
@@ -498,19 +514,19 @@ void rdcu_disable_interrput_signal(void)
 /**
  * @brief inject a SRAM edac multi bit error into the RDCU SRAM
  *
- * @param cfg	configuration to inject error
+ * @param rcfg	configuration to inject error
  * @param addr	SRAM address to inject edac error
  */
 
-int rdcu_inject_edac_error(const struct cmp_cfg *cfg, uint32_t addr)
+int rdcu_inject_edac_error(const struct rdcu_cfg *rcfg, uint32_t addr)
 {
 	uint32_t sub_chip_die_addr;
 	uint8_t buf[4] = {0};
 
-	if (rdcu_set_compression_register(cfg))
+	if (rdcu_set_compression_register(rcfg))
 		return -1;
 
-	if (rdcu_transfer_sram(cfg))
+	if (rdcu_transfer_sram(rcfg))
 		return -1;
 
 	/* disable edac */
@@ -597,7 +613,7 @@ int rdcu_inject_edac_error(const struct cmp_cfg *cfg, uint32_t addr)
 			debug_print("Error: sub_chip_die_addr unexpected!");
 			return -1;
 		}
-		if (1 == rdcu_edac_get_bypass_status()) {
+		if (rdcu_edac_get_bypass_status() == 1) {
 			debug_print("Error: bypass status unexpected!");
 			return -1;
 		}
@@ -610,58 +626,57 @@ int rdcu_inject_edac_error(const struct cmp_cfg *cfg, uint32_t addr)
  * @brief compressing data with the help of the RDCU hardware compressor; read
  *	data from the last compression before starting compression
  *
- * @param cfg	     configuration contains all parameters required for compression
+ * @param rcfg	     configuration contains all parameters required for compression
  * @param last_info  compression information of last compression run
  *
  * @note when using the 1d-differencing mode or the raw mode (cmp_mode = 0,2,4),
  *      the model parameters (model_value, model_buf, rdcu_model_adr) are ignored
  * @note the overlapping of the different rdcu buffers is not checked
- * @note the validity of the cfg structure is checked before the compression is
+ * @note the validity of the rcfg structure is checked before the compression is
  *	 started
  *
  * @returns 0 on success, error otherwise
  */
 
-int rdcu_compress_data_parallel(const struct cmp_cfg *cfg,
+int rdcu_compress_data_parallel(const struct rdcu_cfg *rcfg,
 				const struct cmp_info *last_info)
 {
 	uint32_t samples_4byte;
 
-	if (!cfg)
+	if (!rcfg)
 		return -1;
 
 	if (!last_info)
-		return rdcu_compress_data(cfg);
+		return rdcu_compress_data(rcfg);
 
 	if (last_info->cmp_err)
 		return -1;
 
-	rdcu_set_compression_register(cfg);
+	rdcu_set_compression_register(rcfg);
 
 	/* round up needed size must be a multiple of 4 bytes */
-	samples_4byte = (cfg->samples * IMA_SAM2BYT + 3) & ~3U;
+	samples_4byte = (rcfg->samples * IMA_SAM2BYT + 3) & ~3U;
 
-	if (cfg->input_buf != NULL) {
+	if (rcfg->input_buf != NULL) {
 		uint32_t cmp_size_4byte;
 
 		/* now set the data in the local mirror... */
-		if (rdcu_write_sram_16(cfg->input_buf, cfg->rdcu_data_adr,
-				       cfg->samples * IMA_SAM2BYT) < 0)
+		if (rdcu_write_sram_16(rcfg->input_buf, rcfg->rdcu_data_adr,
+				       rcfg->samples * IMA_SAM2BYT) < 0)
 			return -1;
 
 		/* calculate the need bytes for the bitstream */
 		cmp_size_4byte = cmp_bit_to_4byte(last_info->cmp_size);
 
-		/* parallel read compressed data and write input data from sram
-		 * to mirror */
+		/* parallel read compressed data and write input data from sram to mirror */
 		if (rdcu_sync_sram_mirror_parallel(last_info->rdcu_cmp_adr_used,
-				cmp_size_4byte, cfg->rdcu_data_adr, samples_4byte,
+				cmp_size_4byte, rcfg->rdcu_data_adr, samples_4byte,
 				rdcu_get_data_mtu()))
 			return -1;
 		/* wait for it */
 		rdcu_syncing();
-		if (cfg->icu_output_buf) {
-			if (rdcu_read_sram(cfg->icu_output_buf,
+		if (rcfg->icu_output_buf) {
+			if (rdcu_read_sram(rcfg->icu_output_buf,
 					   last_info->rdcu_cmp_adr_used,
 					   cmp_size_4byte))
 				return -1;
@@ -671,46 +686,46 @@ int rdcu_compress_data_parallel(const struct cmp_cfg *cfg,
 	}
 
 	/* read model and write model in parallel */
-	if (cfg->model_buf && model_mode_is_used(cfg->cmp_mode) && model_mode_is_used(last_info->cmp_mode_used)) {
-		if (cfg->rdcu_model_adr == last_info->rdcu_new_model_adr_used &&
-		    cfg->samples == last_info->samples_used) {
+	if (rcfg->model_buf && model_mode_is_used(rcfg->cmp_mode) && model_mode_is_used(last_info->cmp_mode_used)) {
+		if (rcfg->rdcu_model_adr == last_info->rdcu_new_model_adr_used &&
+		    rcfg->samples == last_info->samples_used) {
 			debug_print("The last updated model buffer and the current model buffer overlap exactly in the SRAM of the RDCU. Skip model transfer.");
 		} else {
 			uint32_t new_model_size_4byte;
 
 			/* set the model in the local mirror... */
-			if (rdcu_write_sram_16(cfg->model_buf, cfg->rdcu_model_adr,
-					       cfg->samples * IMA_SAM2BYT) < 0)
+			if (rdcu_write_sram_16(rcfg->model_buf, rcfg->rdcu_model_adr,
+					       rcfg->samples * IMA_SAM2BYT) < 0)
 				return -1;
 
 			new_model_size_4byte = last_info->samples_used * IMA_SAM2BYT;
 			if (rdcu_sync_sram_mirror_parallel(last_info->rdcu_new_model_adr_used,
 							   (new_model_size_4byte+3) & ~0x3U,
-							   cfg->rdcu_model_adr,
+							   rcfg->rdcu_model_adr,
 							   samples_4byte, rdcu_get_data_mtu()))
 				return -1;
 			/* wait for it */
 			rdcu_syncing();
-			if (cfg->icu_new_model_buf) {
-				if (rdcu_read_sram(cfg->icu_new_model_buf,
+			if (rcfg->icu_new_model_buf) {
+				if (rdcu_read_sram(rcfg->icu_new_model_buf,
 						   last_info->rdcu_new_model_adr_used,
 						   new_model_size_4byte) < 0)
 					return -1;
 			}
 		}
 	/* write model */
-	} else if (cfg->model_buf && model_mode_is_used(cfg->cmp_mode)) {
+	} else if (rcfg->model_buf && model_mode_is_used(rcfg->cmp_mode)) {
 		/* set the model in the local mirror... */
-		if (rdcu_write_sram_16(cfg->model_buf, cfg->rdcu_model_adr,
-				       cfg->samples * IMA_SAM2BYT) < 0)
+		if (rdcu_write_sram_16(rcfg->model_buf, rcfg->rdcu_model_adr,
+				       rcfg->samples * IMA_SAM2BYT) < 0)
 			return -1;
 
-		if (rdcu_sync_mirror_to_sram(cfg->rdcu_model_adr, samples_4byte,
+		if (rdcu_sync_mirror_to_sram(rcfg->rdcu_model_adr, samples_4byte,
 					     rdcu_get_data_mtu()))
 			return -1;
 	/* read model */
 	} else if (model_mode_is_used(last_info->cmp_mode_used)) {
-		if (rdcu_read_model(last_info, cfg->icu_new_model_buf) < 0)
+		if (rdcu_read_model(last_info, rcfg->icu_new_model_buf) < 0)
 			return -1;
 	}
 
diff --git a/lib/rdcu_compress/cmp_rdcu_cfg.c b/lib/rdcu_compress/cmp_rdcu_cfg.c
index 8f1b3f6d79ce9c0955fe5c9219f1d71894e95ad4..2968004684048839b1486aee0a4c9a2502855510 100644
--- a/lib/rdcu_compress/cmp_rdcu_cfg.c
+++ b/lib/rdcu_compress/cmp_rdcu_cfg.c
@@ -23,49 +23,87 @@
 
 #include "../common/cmp_debug.h"
 #include "../common/cmp_support.h"
+#include "../common/leon_inttypes.h"
+#include "../common/compiler.h"
+#include "../common/cmp_cal_up_model.h"
 #include "rdcu_cmd.h"
 #include "cmp_rdcu_cfg.h"
 
 
+/**
+ * @brief check if the compression mode, model value and the lossy rounding
+ *	parameters are invalid for an RDCU compression
+ *
+ * @param rcfg	pointer to a RDCU compression configuration containing the
+ *	compression mode, model value and the rounding parameters
+ *
+ * @returns 0 if the compression mode, model value and the lossy rounding
+ *	parameters are valid for an RDCU compression, non-zero if parameters are
+ *	invalid
+ */
+
+static int rdcu_cfg_gen_pars_are_invalid(const struct rdcu_cfg *rcfg)
+{
+	int rcfg_invalid = 0;
+
+	if (!cmp_mode_is_supported(rcfg->cmp_mode)) {
+		debug_print("Error: selected cmp_mode: %i is not supported for a RDCU compression.", rcfg->cmp_mode);
+		rcfg_invalid++;
+	}
+
+	if (rcfg->model_value > MAX_MODEL_VALUE) {
+		debug_print("Error: selected model_value: %" PRIu32 " is invalid. The largest supported value is: %u.",
+			    rcfg->model_value, MAX_MODEL_VALUE);
+		rcfg_invalid++;
+	}
+
+	if (rcfg->round > MAX_RDCU_ROUND) {
+		debug_print("Error: selected lossy parameter: %" PRIu32 " is not supported for a RDCU compression. The largest supported value is: %" PRIu32 ".",
+			    rcfg->round, MAX_RDCU_ROUND);
+		rcfg_invalid++;
+	}
+
+#ifdef SKIP_CMP_PAR_CHECK
+	return 0;
+#endif
+	return rcfg_invalid;
+}
+
+
 /**
  * @brief create an RDCU compression configuration
  *
- * @param data_type	compression data product type
+ * @param rcfg		pointer to an RDCU compression configuration to be created
  * @param cmp_mode	compression mode
  * @param model_value	model weighting parameter (only needed for model compression mode)
- * @param lossy_par	lossy rounding parameter (use CMP_LOSSLESS for lossless compression)
+ * @param round		lossy rounding parameter (use CMP_LOSSLESS for lossless compression)
  *
- * @returns a compression configuration containing the chosen parameters;
- *	on error the data_type record is set to DATA_TYPE_UNKNOWN
+ * @returns 0 if parameters are valid, non-zero if parameters are invalid
  */
 
-struct cmp_cfg rdcu_cfg_create(enum cmp_data_type data_type, enum cmp_mode cmp_mode,
-			       uint32_t model_value, uint32_t lossy_par)
+int rdcu_cfg_create(struct rdcu_cfg *rcfg, enum cmp_mode cmp_mode,
+		    uint32_t model_value, uint32_t round)
 {
-	struct cmp_cfg cfg;
-
-	memset(&cfg, 0, sizeof(cfg));
+	if (!rcfg)
+		return 1;
 
-	cfg.data_type = data_type;
-	cfg.cmp_mode = cmp_mode;
-	cfg.model_value = model_value;
-	cfg.round = lossy_par;
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
+	memset(rcfg, 0, sizeof(*rcfg));
 
-	if (cmp_cfg_gen_par_is_invalid(&cfg, RDCU_CHECK))
-		cfg.data_type = DATA_TYPE_UNKNOWN;
+	rcfg->cmp_mode = cmp_mode;
+	rcfg->model_value = model_value;
+	rcfg->round = round;
 
-	return cfg;
+	return rdcu_cfg_gen_pars_are_invalid(rcfg);
 }
 
 
 /**
- * @brief check if a buffer is in outside the RDCU SRAM
+ * @brief check if a buffer is outside the RDCU SRAM
  *
  * @param addr	start address of the buffer
  * @param size	length of the buffer in bytes
  *
- * @returns 0 if buffer in inside the RDCU SRAM, 1 when the buffer is outside
+ * @returns 0 if the buffer is inside the RDCU SRAM, 1 when the buffer is outside
  */
 
 static int outside_sram_range(uint32_t addr, uint32_t size)
@@ -92,7 +130,7 @@ static int outside_sram_range(uint32_t addr, uint32_t size)
  * @param start_b	start address of the 2nd buffer
  * @param end_b		end address of the 2nd buffer
  *
- * @returns 0 if buffers are not overlapping, otherwise buffer are
+ * @returns 0 if buffers are not overlapping, otherwise buffers are
  *	overlapping
  */
 
@@ -109,125 +147,125 @@ static int buffers_overlap(uint32_t start_a, uint32_t end_a, uint32_t start_b,
 /**
  * @brief check if RDCU buffer settings are invalid
  *
- * @param cfg	a pointer to a compression configuration
+ * @param rcfg	a pointer to a RDCU compression configuration
  *
- * @returns 0 if buffers configuration is valid, otherwise the configuration is
- *	invalid
+ * @returns 0 if the buffer configuration is valid, otherwise the configuration
+ *	is invalid
  */
 
-static int rdcu_cfg_buffers_is_invalid(const struct cmp_cfg *cfg)
+static int rdcu_cfg_buffers_is_invalid(const struct rdcu_cfg *rcfg)
 {
-	int cfg_invalid = 0;
+	int rcfg_invalid = 0;
 
-	if (cfg->cmp_mode == CMP_MODE_RAW) {
-		if (cfg->buffer_length < cfg->samples) {
-			debug_print("rdcu_buffer_length is smaller than the samples parameter. There is not enough space to copy the data in RAW mode.");
-			cfg_invalid++;
+	if (rcfg->cmp_mode == CMP_MODE_RAW) {
+		if (rcfg->buffer_length < rcfg->samples) {
+			debug_print("Error: rdcu_buffer_length is smaller than the samples parameter. There is not enough space to copy the data in RAW mode.");
+			rcfg_invalid++;
 		}
 	}
 
-	if (cfg->rdcu_data_adr & 0x3) {
+	if (rcfg->rdcu_data_adr & 0x3) {
 		debug_print("Error: The RDCU data to compress start address is not 4-Byte aligned.");
-		cfg_invalid++;
+		rcfg_invalid++;
 	}
 
-	if (cfg->rdcu_buffer_adr & 0x3) {
+	if (rcfg->rdcu_buffer_adr & 0x3) {
 		debug_print("Error: The RDCU compressed data start address is not 4-Byte aligned.");
-		cfg_invalid++;
+		rcfg_invalid++;
 	}
 
-	if (outside_sram_range(cfg->rdcu_data_adr, cfg->samples * IMA_SAM2BYT)) {
+	if (outside_sram_range(rcfg->rdcu_data_adr, rcfg->samples * IMA_SAM2BYT)) {
 		debug_print("Error: The RDCU data to compress buffer is outside the RDCU SRAM address space.");
-		cfg_invalid++;
+		rcfg_invalid++;
 	}
 
-	if (outside_sram_range(cfg->rdcu_buffer_adr, cfg->buffer_length * IMA_SAM2BYT)) {
+	if (outside_sram_range(rcfg->rdcu_buffer_adr, rcfg->buffer_length * IMA_SAM2BYT)) {
 		debug_print("Error: The RDCU compressed data buffer is outside the RDCU SRAM address space.");
-		cfg_invalid++;
+		rcfg_invalid++;
 	}
 
-	if (buffers_overlap(cfg->rdcu_data_adr,
-			    cfg->rdcu_data_adr + cfg->samples * IMA_SAM2BYT,
-			    cfg->rdcu_buffer_adr,
-			    cfg->rdcu_buffer_adr + cfg->buffer_length * IMA_SAM2BYT)) {
+	if (buffers_overlap(rcfg->rdcu_data_adr,
+			    rcfg->rdcu_data_adr + rcfg->samples * IMA_SAM2BYT,
+			    rcfg->rdcu_buffer_adr,
+			    rcfg->rdcu_buffer_adr + rcfg->buffer_length * IMA_SAM2BYT)) {
 		debug_print("Error: The RDCU data to compress buffer and the RDCU compressed data buffer are overlapping.");
-		cfg_invalid++;
+		rcfg_invalid++;
 	}
 
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		if (cfg->model_buf && cfg->model_buf == cfg->input_buf) {
+	if (model_mode_is_used(rcfg->cmp_mode)) {
+		if (rcfg->model_buf && rcfg->model_buf == rcfg->input_buf) {
 			debug_print("Error: The model buffer (model_buf) and the data to be compressed (input_buf) are equal.");
-			cfg_invalid++;
+			rcfg_invalid++;
 		}
 
-		if (cfg->rdcu_model_adr & 0x3) {
+		if (rcfg->rdcu_model_adr & 0x3) {
 			debug_print("Error: The RDCU model start address is not 4-Byte aligned.");
-			cfg_invalid++;
+			rcfg_invalid++;
 		}
 
-		if (outside_sram_range(cfg->rdcu_model_adr, cfg->samples * IMA_SAM2BYT)) {
+		if (outside_sram_range(rcfg->rdcu_model_adr, rcfg->samples * IMA_SAM2BYT)) {
 			debug_print("Error: The RDCU model buffer is outside the RDCU SRAM address space.");
-			cfg_invalid++;
+			rcfg_invalid++;
 		}
 
 		if (buffers_overlap(
-			    cfg->rdcu_model_adr,
-			    cfg->rdcu_model_adr + cfg->samples * IMA_SAM2BYT,
-			    cfg->rdcu_data_adr,
-			    cfg->rdcu_data_adr + cfg->samples * IMA_SAM2BYT)) {
+			    rcfg->rdcu_model_adr,
+			    rcfg->rdcu_model_adr + rcfg->samples * IMA_SAM2BYT,
+			    rcfg->rdcu_data_adr,
+			    rcfg->rdcu_data_adr + rcfg->samples * IMA_SAM2BYT)) {
 			debug_print("Error: The model buffer and the data to compress buffer are overlapping.");
-			cfg_invalid++;
+			rcfg_invalid++;
 		}
 
 		if (buffers_overlap(
-			cfg->rdcu_model_adr,
-			cfg->rdcu_model_adr + cfg->samples * IMA_SAM2BYT,
-			cfg->rdcu_buffer_adr,
-			cfg->rdcu_buffer_adr + cfg->buffer_length * IMA_SAM2BYT)
+			rcfg->rdcu_model_adr,
+			rcfg->rdcu_model_adr + rcfg->samples * IMA_SAM2BYT,
+			rcfg->rdcu_buffer_adr,
+			rcfg->rdcu_buffer_adr + rcfg->buffer_length * IMA_SAM2BYT)
 		    ) {
 			debug_print("Error: The model buffer and the compressed data buffer are overlapping.");
-			cfg_invalid++;
+			rcfg_invalid++;
 		}
 
-		if (cfg->rdcu_model_adr != cfg->rdcu_new_model_adr) {
-			if (cfg->rdcu_new_model_adr & 0x3) {
+		if (rcfg->rdcu_model_adr != rcfg->rdcu_new_model_adr) {
+			if (rcfg->rdcu_new_model_adr & 0x3) {
 				debug_print("Error: The RDCU updated model start address (rdcu_new_model_adr) is not 4-Byte aligned.");
-				cfg_invalid++;
+				rcfg_invalid++;
 			}
 
-			if (outside_sram_range(cfg->rdcu_new_model_adr,
-					   cfg->samples * IMA_SAM2BYT)) {
+			if (outside_sram_range(rcfg->rdcu_new_model_adr,
+					   rcfg->samples * IMA_SAM2BYT)) {
 				debug_print("Error: The RDCU updated model buffer is outside the RDCU SRAM address space.");
-				cfg_invalid++;
+				rcfg_invalid++;
 			}
 
 			if (buffers_overlap(
-				cfg->rdcu_new_model_adr,
-				cfg->rdcu_new_model_adr + cfg->samples * IMA_SAM2BYT,
-				cfg->rdcu_data_adr,
-				cfg->rdcu_data_adr + cfg->samples * IMA_SAM2BYT)
+				rcfg->rdcu_new_model_adr,
+				rcfg->rdcu_new_model_adr + rcfg->samples * IMA_SAM2BYT,
+				rcfg->rdcu_data_adr,
+				rcfg->rdcu_data_adr + rcfg->samples * IMA_SAM2BYT)
 			    ) {
 				debug_print("Error: The updated model buffer and the data to compress buffer are overlapping.");
-				cfg_invalid++;
+				rcfg_invalid++;
 			}
 
 			if (buffers_overlap(
-				cfg->rdcu_new_model_adr,
-				cfg->rdcu_new_model_adr + cfg->samples * IMA_SAM2BYT,
-				cfg->rdcu_buffer_adr,
-				cfg->rdcu_buffer_adr + cfg->buffer_length * IMA_SAM2BYT)
+				rcfg->rdcu_new_model_adr,
+				rcfg->rdcu_new_model_adr + rcfg->samples * IMA_SAM2BYT,
+				rcfg->rdcu_buffer_adr,
+				rcfg->rdcu_buffer_adr + rcfg->buffer_length * IMA_SAM2BYT)
 			    ) {
 				debug_print("Error: The updated model buffer and the compressed data buffer are overlapping.");
-				cfg_invalid++;
+				rcfg_invalid++;
 			}
 			if (buffers_overlap(
-				cfg->rdcu_new_model_adr,
-				cfg->rdcu_new_model_adr + cfg->samples * IMA_SAM2BYT,
-				cfg->rdcu_model_adr,
-				cfg->rdcu_model_adr + cfg->samples * IMA_SAM2BYT)
+				rcfg->rdcu_new_model_adr,
+				rcfg->rdcu_new_model_adr + rcfg->samples * IMA_SAM2BYT,
+				rcfg->rdcu_model_adr,
+				rcfg->rdcu_model_adr + rcfg->samples * IMA_SAM2BYT)
 			    ) {
 				debug_print("Error: The updated model buffer and the model buffer are overlapping.");
-				cfg_invalid++;
+				rcfg_invalid++;
 			}
 		}
 	}
@@ -235,15 +273,15 @@ static int rdcu_cfg_buffers_is_invalid(const struct cmp_cfg *cfg)
 #ifdef SKIP_CMP_PAR_CHECK
 	return 0;
 #endif
-	return cfg_invalid;
+	return rcfg_invalid;
 }
 
 
 /**
  * @brief setup of the different data buffers for an RDCU compression
  *
- * @param cfg			pointer to a compression configuration (created
- *				with the rdcu_cfg_create() function)
+ * @param rcfg			pointer to a RDCU compression configuration
+ *				(created with the rdcu_cfg_create() function)
  * @param data_to_compress	pointer to the data to be compressed (if NULL no
  *				data transfer to the RDCU)
  * @param data_samples		length of the data to be compressed (plus the
@@ -263,35 +301,98 @@ static int rdcu_cfg_buffers_is_invalid(const struct cmp_cfg *cfg)
  * @returns 0 if parameters are valid, non-zero if parameters are invalid
  */
 
-int rdcu_cfg_buffers(struct cmp_cfg *cfg, uint16_t *data_to_compress,
+int rdcu_cfg_buffers(struct rdcu_cfg *rcfg, uint16_t *data_to_compress,
 		     uint32_t data_samples, uint16_t *model_of_data,
 		     uint32_t rdcu_data_adr, uint32_t rdcu_model_adr,
 		     uint32_t rdcu_new_model_adr, uint32_t rdcu_buffer_adr,
 		     uint32_t rdcu_buffer_lenght)
 {
-	if (!cfg) {
+	if (!rcfg) {
 		debug_print("Error: pointer to the compression configuration structure is NULL.");
 		return -1;
 	}
 
-	cfg->input_buf = data_to_compress;
-	cfg->samples = data_samples;
-	cfg->model_buf = model_of_data;
-	cfg->rdcu_data_adr = rdcu_data_adr;
-	cfg->rdcu_model_adr = rdcu_model_adr;
-	cfg->rdcu_new_model_adr = rdcu_new_model_adr;
-	cfg->rdcu_buffer_adr = rdcu_buffer_adr;
-	cfg->buffer_length = rdcu_buffer_lenght;
+	rcfg->input_buf = data_to_compress;
+	rcfg->samples = data_samples;
+	rcfg->model_buf = model_of_data;
+	rcfg->rdcu_data_adr = rdcu_data_adr;
+	rcfg->rdcu_model_adr = rdcu_model_adr;
+	rcfg->rdcu_new_model_adr = rdcu_new_model_adr;
+	rcfg->rdcu_buffer_adr = rdcu_buffer_adr;
+	rcfg->buffer_length = rdcu_buffer_lenght;
+
+	return rdcu_cfg_buffers_is_invalid(rcfg);
+}
+
+
+/**
+ * @brief check if the combination of the Golomb and spill parameters is invalid
+ *
+ * @param golomb_par	Golomb parameter
+ * @param spill		spillover threshold parameter
+ * @param par_name	string describing the use of the compression par. for
+ *			debug messages (can be NULL)
+ *
+ * @returns 0 if the parameter combination is valid, otherwise the combination is invalid
+ */
+
+static int rdcu_cfg_golomb_spill_are_invalid(uint32_t golomb_par, uint32_t spill,
+					 const char *par_name MAYBE_UNUSED)
+{
+	int rcfg_invalid = 0;
+
+	if (golomb_par < MIN_IMA_GOLOMB_PAR || golomb_par > MAX_IMA_GOLOMB_PAR) {
+		debug_print("Error: The selected %s compression parameter: %" PRIu32 " is not supported in the selected compression mode. The compression parameter has to be between [%" PRIu32 ", %" PRIu32 "] in this mode.",
+			    par_name, golomb_par, MIN_IMA_GOLOMB_PAR, MAX_IMA_GOLOMB_PAR);
+		rcfg_invalid++;
+	}
+	if (spill < MIN_IMA_SPILL) {
+		debug_print("Error: The selected %s spillover threshold value: %" PRIu32 " is too small. The smallest possible spillover value is: %" PRIu32 ".",
+			    par_name, spill, MIN_IMA_SPILL);
+		rcfg_invalid++;
+	}
+	if (spill > cmp_ima_max_spill(golomb_par)) {
+		debug_print("Error: The selected %s spillover threshold value: %" PRIu32 " is too large for the selected %s compression parameter: %" PRIu32 ". The largest possible spillover value in the selected compression mode is: %" PRIu32 ".",
+			    par_name, spill, par_name, golomb_par, cmp_ima_max_spill(golomb_par));
+		rcfg_invalid++;
+	}
+
 
-	return rdcu_cfg_buffers_is_invalid(cfg);
+#ifdef SKIP_CMP_PAR_CHECK
+	return 0;
+#endif
+	return rcfg_invalid;
+}
+
+
+/**
+ * @brief check if the all Golomb and spill parameters pairs are invalid
+ *
+ * @param rcfg	pointer to a RDCU compressor configuration
+ *
+ * @returns 0 if the parameters are valid, otherwise invalid
+ */
+
+static int rdcu_cfg_imagette_is_invalid(const struct rdcu_cfg *rcfg)
+{
+	int rcfg_invalid = 0;
+
+	rcfg_invalid += rdcu_cfg_golomb_spill_are_invalid(rcfg->golomb_par, rcfg->spill,
+							 "imagette");
+	rcfg_invalid += rdcu_cfg_golomb_spill_are_invalid(rcfg->ap1_golomb_par, rcfg->ap1_spill,
+							 "adaptive 1 imagette");
+	rcfg_invalid += rdcu_cfg_golomb_spill_are_invalid(rcfg->ap2_golomb_par, rcfg->ap2_spill,
+							 "adaptive 2 imagette");
+
+	return rcfg_invalid;
 }
 
 
 /**
  * @brief set up the configuration parameters for an RDCU imagette compression
  *
- * @param cfg			pointer to a compression configuration (created
- *				with the rdcu_cfg_create() function)
+ * @param rcfg			pointer to a RDCU compression configuration
+ *				(created with the rdcu_cfg_create() function)
  * @param golomb_par		imagette compression parameter
  * @param spillover_par		imagette spillover threshold parameter
  * @param ap1_golomb_par	adaptive 1 imagette compression parameter
@@ -302,24 +403,24 @@ int rdcu_cfg_buffers(struct cmp_cfg *cfg, uint16_t *data_to_compress,
  * @returns 0 if parameters are valid, non-zero if parameters are invalid
  */
 
-int rdcu_cfg_imagette(struct cmp_cfg *cfg,
+int rdcu_cfg_imagette(struct rdcu_cfg *rcfg,
 		      uint32_t golomb_par, uint32_t spillover_par,
 		      uint32_t ap1_golomb_par, uint32_t ap1_spillover_par,
 		      uint32_t ap2_golomb_par, uint32_t ap2_spillover_par)
 {
-	if (!cfg) {
+	if (!rcfg) {
 		debug_print("Error: pointer to the compression configuration structure is NULL.");
 		return -1;
 	}
 
-	cfg->golomb_par = golomb_par;
-	cfg->spill = spillover_par;
-	cfg->ap1_golomb_par = ap1_golomb_par;
-	cfg->ap1_spill = ap1_spillover_par;
-	cfg->ap2_golomb_par = ap2_golomb_par;
-	cfg->ap2_spill = ap2_spillover_par;
+	rcfg->golomb_par = golomb_par;
+	rcfg->spill = spillover_par;
+	rcfg->ap1_golomb_par = ap1_golomb_par;
+	rcfg->ap1_spill = ap1_spillover_par;
+	rcfg->ap2_golomb_par = ap2_golomb_par;
+	rcfg->ap2_spill = ap2_spillover_par;
 
-	return cmp_cfg_imagette_is_invalid(cfg, RDCU_CHECK);
+	return rdcu_cfg_imagette_is_invalid(rcfg);
 }
 
 
@@ -327,26 +428,29 @@ int rdcu_cfg_imagette(struct cmp_cfg *cfg,
  * @brief set up the default configuration parameters for an RDCU imagette
  *	compression based on the set compression mode
  *
+ * @param rcfg	pointer to a RDCU compression configuration (created with the
+ *		rdcu_cfg_create() function)
+ *
  * @returns 0 if parameters are valid, non-zero if parameters are invalid
  */
 
-int rdcu_cfg_imagette_default(struct cmp_cfg *cfg)
+int rdcu_cfg_imagette_default(struct rdcu_cfg *rcfg)
 {
 
-	if (!cfg) {
+	if (!rcfg) {
 		debug_print("Error: pointer to the compression configuration structure is NULL.");
 		return -1;
 	}
 
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		return rdcu_cfg_imagette(cfg, CMP_DEF_IMA_MODEL_GOLOMB_PAR,
+	if (model_mode_is_used(rcfg->cmp_mode)) {
+		return rdcu_cfg_imagette(rcfg, CMP_DEF_IMA_MODEL_GOLOMB_PAR,
 					 CMP_DEF_IMA_MODEL_SPILL_PAR,
 					 CMP_DEF_IMA_MODEL_AP1_GOLOMB_PAR,
 					 CMP_DEF_IMA_MODEL_AP1_SPILL_PAR,
 					 CMP_DEF_IMA_MODEL_AP2_GOLOMB_PAR,
 					 CMP_DEF_IMA_MODEL_AP2_SPILL_PAR);
 	} else {
-		return rdcu_cfg_imagette(cfg, CMP_DEF_IMA_DIFF_GOLOMB_PAR,
+		return rdcu_cfg_imagette(rcfg, CMP_DEF_IMA_DIFF_GOLOMB_PAR,
 					 CMP_DEF_IMA_DIFF_SPILL_PAR,
 					 CMP_DEF_IMA_DIFF_AP1_GOLOMB_PAR,
 					 CMP_DEF_IMA_DIFF_AP1_SPILL_PAR,
@@ -360,46 +464,46 @@ int rdcu_cfg_imagette_default(struct cmp_cfg *cfg)
  * @brief check if the compressor configuration is invalid for an RDCU compression,
  *	see the user manual for more information (PLATO-UVIE-PL-UM-0001).
  *
- * @param cfg	pointer to a compression configuration contains all parameters
- *	required for compression
+ * @param rcfg	pointer to a RDCU compression configuration contains all
+ *		parameters required for compression
  *
  * @returns 0 if parameters are valid, non-zero if parameters are invalid
  */
 
-int rdcu_cmp_cfg_is_invalid(const struct cmp_cfg *cfg)
+int rdcu_cmp_cfg_is_invalid(const struct rdcu_cfg *rcfg)
 {
-	int cfg_invalid = 0;
+	int rcfg_invalid = 0;
 
-	if (!cfg) {
+	if (!rcfg) {
 		debug_print("Error: pointer to the compression configuration structure is NULL.");
 		return -1;
 	}
 
-	if (!cfg->input_buf)
+	if (!rcfg->input_buf)
 		debug_print("Warning: The data to compress buffer is set to NULL. No data will be transferred to the rdcu_data_adr in the RDCU SRAM.");
 
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		if (!cfg->model_buf)
+	if (model_mode_is_used(rcfg->cmp_mode)) {
+		if (!rcfg->model_buf)
 			debug_print("Warning: The model buffer is set to NULL. No model data will be transferred to the rdcu_model_adr in the RDCU SRAM.");
 	}
 
-	if (cfg->samples == 0)
+	if (rcfg->samples == 0)
 		debug_print("Warning: The samples parameter is set to 0. No data will be compressed.");
 
-	if (cfg->icu_new_model_buf)
+	if (rcfg->icu_new_model_buf)
 		debug_print("Warning: ICU updated model buffer is set. This buffer is not used for an RDCU compression.");
 
-	if (cfg->icu_output_buf)
+	if (rcfg->icu_output_buf)
 		debug_print("Warning: ICU compressed data buffer is set. This buffer is not used for an RDCU compression.");
 
-	if (cfg->buffer_length == 0) {
+	if (rcfg->buffer_length == 0) {
 		debug_print("Error: The buffer_length is set to 0. There is no place to store the compressed data.");
-		cfg_invalid++;
+		rcfg_invalid++;
 	}
 
-	cfg_invalid += cmp_cfg_gen_par_is_invalid(cfg, RDCU_CHECK);
-	cfg_invalid += rdcu_cfg_buffers_is_invalid(cfg);
-	cfg_invalid += cmp_cfg_imagette_is_invalid(cfg, RDCU_CHECK);
+	rcfg_invalid += rdcu_cfg_gen_pars_are_invalid(rcfg);
+	rcfg_invalid += rdcu_cfg_buffers_is_invalid(rcfg);
+	rcfg_invalid += rdcu_cfg_imagette_is_invalid(rcfg);
 
-	return cfg_invalid;
+	return rcfg_invalid;
 }
diff --git a/lib/rdcu_compress/cmp_rdcu_cfg.h b/lib/rdcu_compress/cmp_rdcu_cfg.h
index 46a597662cb89729e7ea3252d9f8f839b4b1c433..06a9c0a717cbe5980fb01dc5cd5563f032e6ea84 100644
--- a/lib/rdcu_compress/cmp_rdcu_cfg.h
+++ b/lib/rdcu_compress/cmp_rdcu_cfg.h
@@ -19,24 +19,26 @@
 #ifndef CMP_RDCU_CFG_H
 #define CMP_RDCU_CFG_H
 
+#include <stdint.h>
+
 #include "../common/cmp_support.h"
 
 
-struct cmp_cfg rdcu_cfg_create(enum cmp_data_type data_type, enum cmp_mode cmp_mode,
-			       uint32_t model_value, uint32_t lossy_par);
+int rdcu_cfg_create(struct rdcu_cfg *rcfg, enum cmp_mode cmp_mode,
+		    uint32_t model_value, uint32_t round);
 
-int rdcu_cfg_buffers(struct cmp_cfg *cfg, uint16_t *data_to_compress,
+int rdcu_cfg_buffers(struct rdcu_cfg *rcfg, uint16_t *data_to_compress,
 		     uint32_t data_samples, uint16_t *model_of_data,
 		     uint32_t rdcu_data_adr, uint32_t rdcu_model_adr,
 		     uint32_t rdcu_new_model_adr, uint32_t rdcu_buffer_adr,
 		     uint32_t rdcu_buffer_lenght);
 
-int rdcu_cfg_imagette(struct cmp_cfg *cfg,
+int rdcu_cfg_imagette(struct rdcu_cfg *rcfg,
 		      uint32_t golomb_par, uint32_t spillover_par,
 		      uint32_t ap1_golomb_par, uint32_t ap1_spillover_par,
 		      uint32_t ap2_golomb_par, uint32_t ap2_spillover_par);
-int rdcu_cfg_imagette_default(struct cmp_cfg *cfg);
+int rdcu_cfg_imagette_default(struct rdcu_cfg *rcfg);
 
-int rdcu_cmp_cfg_is_invalid(const struct cmp_cfg *cfg);
+int rdcu_cmp_cfg_is_invalid(const struct rdcu_cfg *rcfg);
 
 #endif /* CMP_RDCU_CFG_H */
diff --git a/lib/rdcu_compress/cmp_rdcu_testing.h b/lib/rdcu_compress/cmp_rdcu_testing.h
index 56f24094dc11da394f4911d65574f62e33463e27..91975fa4ed71acadb44f271735da0d8a4dc2abc7 100644
--- a/lib/rdcu_compress/cmp_rdcu_testing.h
+++ b/lib/rdcu_compress/cmp_rdcu_testing.h
@@ -20,11 +20,13 @@
 #ifndef CMP_RDCU_TESTING_H
 #define CMP_RDCU_TESTING_H
 
+#include <stdint.h>
+
 #include "../common/cmp_support.h"
 
 int rdcu_start_compression(void);
-int rdcu_inject_edac_error(const struct cmp_cfg *cfg, uint32_t addr);
-int rdcu_compress_data_parallel(const struct cmp_cfg *cfg,
+int rdcu_inject_edac_error(const struct rdcu_cfg *rcfg, uint32_t addr);
+int rdcu_compress_data_parallel(const struct rdcu_cfg *rcfg,
 				const struct cmp_info *last_info);
 
 #endif /* CMP_RDCU_TESTING_H */
diff --git a/lib/rdcu_compress/rdcu_cmd.c b/lib/rdcu_compress/rdcu_cmd.c
index 79ac6148f034bd44c775c0a341f11717b1f63d2e..6fbc4f7f3c1ab82bf8d88a064406495e3fbf490f 100644
--- a/lib/rdcu_compress/rdcu_cmd.c
+++ b/lib/rdcu_compress/rdcu_cmd.c
@@ -17,6 +17,7 @@
  * @see FPGA Requirement Specification PLATO-IWF-PL-RS-005 Issue 0.7
  */
 
+#include <stdint.h>
 
 #include "rmap.h"
 #include "rdcu_cmd.h"
diff --git a/lib/rdcu_compress/rdcu_ctrl.c b/lib/rdcu_compress/rdcu_ctrl.c
index c5d748e34ceefc27c7c0368df3299f45ec7fd5aa..385b9c8b38ef490a132b930e2546df3b071038d3 100644
--- a/lib/rdcu_compress/rdcu_ctrl.c
+++ b/lib/rdcu_compress/rdcu_ctrl.c
@@ -2517,7 +2517,6 @@ int rdcu_sync_sram_mirror_parallel(uint32_t rx_addr, uint32_t rx_size,
 }
 
 
-
 /**
  * @brief initialise the rdcu control library
  *
diff --git a/lib/rdcu_compress/rdcu_rmap.c b/lib/rdcu_compress/rdcu_rmap.c
index dc7c71a5dfd259ce0b43a9d03a79a1bf87bdab90..93a307a1bcfedc29138c5a365d522be20f2fa6b3 100644
--- a/lib/rdcu_compress/rdcu_rmap.c
+++ b/lib/rdcu_compress/rdcu_rmap.c
@@ -24,7 +24,7 @@
  * and set() RMAP calls, they operate on the local copy and the user issues
  * sync() calls.
  *
- * To monitor the syncronisation status, we maintaining a transaction log
+ * To monitor the synchronisation status, we maintaining a transaction log
  * tracking the submitted command set. Response packets could be processed
  * by interrupt (or thread), but in this variant, we process the return packets
  * when the user calls rdcu_ctrl_sync_status()
@@ -62,6 +62,7 @@
  */
 
 
+#include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
 
diff --git a/lib/rdcu_compress/rmap.c b/lib/rdcu_compress/rmap.c
index 1ef7811c43fab9a34ea8d6f9748d202548aa6de4..33871bc71faef7724a6dd6bc3b8da96ef01ed978 100644
--- a/lib/rdcu_compress/rmap.c
+++ b/lib/rdcu_compress/rmap.c
@@ -19,7 +19,7 @@
  */
 
 
-
+#include <stdint.h>
 #include <string.h>
 #include <stdlib.h>
 
@@ -477,7 +477,7 @@ int rmap_build_hdr(struct rmap_pkt *pkt, uint8_t *hdr)
  * @brief create an rmap packet from a buffer
  *
  * @param buf the buffer, with the target path stripped away, i.e.
- *	  starting with <logical address>, <protocol id>, ...
+ *	  starting with [logical address], [protocol id], ...
  * @param len the data length of the buffer (in bytes)
  *
  * @returns an rmap packet, containing the decoded buffer including any data,
@@ -732,7 +732,7 @@ static void rmap_parse_reply_pkt(uint8_t *pkt)
 /**
  * parse an RMAP packet:
  *
- * expected format: <logical address> <protocol id> ...
+ * expected format: [logical address] [protocol id] ...
  */
 
 void rmap_parse_pkt(uint8_t *pkt)
diff --git a/lib/rdcu_compress/rmap.h b/lib/rdcu_compress/rmap.h
index 9c217804b37300e8fa9414af3b6368870436236a..3bb948aca4720eb76adb485b9fb5121a445619c5 100644
--- a/lib/rdcu_compress/rmap.h
+++ b/lib/rdcu_compress/rmap.h
@@ -148,7 +148,7 @@ struct rmap_instruction {
 	uint8_t	cmd_resp:1;
 	uint8_t cmd:4;
 	uint8_t	reply_addr_len:2;
-#elif defined (__LITTLE_ENDIAN)
+#elif defined(__LITTLE_ENDIAN)
 	uint8_t	reply_addr_len:2;
 	uint8_t cmd:4;
 	uint8_t	cmd_resp:1;
diff --git a/meson.build b/meson.build
index 58c5545974f0d5eef62342dfa6ff1b2243647024..d31ceca42a5e71c6cf88a879a3300e8d1fd94eb7 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
 project('cmp_tool', 'c',
-  version : '0.12',
+  version : '0.13',
   meson_version : '>= 0.63',
   license : 'GPL-2.0',
   default_options : [
@@ -23,7 +23,7 @@ add_global_arguments('-Wno-long-long', language : 'c')
 cc_flags = ['-DDEBUGLEVEL=@0@'.format(debug_level)]
 if use_debug
   debug_flags = [
-    '-Wstrict-aliasing=1',
+    '-Wstrict-aliasing',
     '-Wcast-align',
     '-Wredundant-decls',
     '-Wundef',
@@ -53,6 +53,9 @@ if ['windows', 'cygwin'].contains(host_machine.system()) and cc.get_id() == 'gcc
   add_global_link_arguments('-static', language: 'c')
 endif
 
+if get_option('fuzzer').enabled()
+  add_global_arguments('-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION', language: ['c', 'cpp'])
+endif
 
 # Subdirs
 subdir('lib')
diff --git a/programs/cmp_guess.c b/programs/cmp_guess.c
index bda3c3e9d3743a544db5303c4aa4d690ff7c6c11..c76d1da39660bc2686d307b793deef727e931194 100644
--- a/programs/cmp_guess.c
+++ b/programs/cmp_guess.c
@@ -13,19 +13,25 @@
  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  * more details.
  *
- * @brief helps the user to find a good compression parameters for a given
- *	dataset
+ * @brief helps the user find good compression parameters for a given dataset
  * @warning this part of the software is not intended to run on-board on the ICU.
  */
 
 #include <limits.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
+#include <cmp_error.h>
+#include <cmp_debug.h>
+#include <leon_inttypes.h>
 #include <cmp_data_types.h>
+#include <cmp_support.h>
 #include <cmp_icu.h>
+#include <cmp_chunk.h>
+#include <cmp_chunk_type.h>
 #include <cmp_guess.h>
-#include <leon_inttypes.h>
 
 #define CMP_GUESS_MAX_CAL_STEPS 20274
 
@@ -35,12 +41,11 @@ static int num_model_updates = CMP_GUESS_N_MODEL_UPDATE_DEF;
 
 
 /**
- * @brief sets how often the model is updated before model reset for the
- * cmp_guess function
+ * @brief sets how often the model is updated before the model reset;
  * @note the default value is CMP_GUESS_N_MODEL_UPDATE_DEF
  * @note this is needed to guess a good model_value
  *
- * @param n_model_updates number of model updates
+ * @param n_model_updates	number of model updates
  */
 
 void cmp_guess_set_model_updates(int n_model_updates)
@@ -52,7 +57,7 @@ void cmp_guess_set_model_updates(int n_model_updates)
 /**
  * @brief guess a good model value
  *
- * @param n_model_updates number of model updates
+ * @param n_model_updates	number of model updates
  *
  * @returns guessed model_value
  */
@@ -80,7 +85,6 @@ uint16_t cmp_guess_model_value(int n_model_updates)
  * @param cmp_mode	compression mode
  *
  * @returns a good spill parameter (optimal for zero escape mechanism)
- * @warning icu compression not support yet!
  */
 
 uint32_t cmp_rdcu_get_good_spill(unsigned int golomb_par, enum cmp_mode cmp_mode)
@@ -112,26 +116,26 @@ uint32_t cmp_rdcu_get_good_spill(unsigned int golomb_par, enum cmp_mode cmp_mode
 /**
  * @brief guess a good configuration with pre_cal_method
  *
- * @param cfg compression configuration structure
+ * @param rcfg	RDCU compression configuration structure
  *
  * @returns the size in bits of the compressed data of the guessed
  * configuration; 0 on error
  */
 
-static uint32_t pre_cal_method(struct cmp_cfg *cfg)
+static uint32_t pre_cal_method(struct rdcu_cfg *rcfg)
 {
 	uint32_t g;
-	int cmp_size, cmp_size_best = INT_MAX;
+	uint32_t cmp_size, cmp_size_best = INT_MAX;
 	uint32_t golomb_par_best = 0;
 	uint32_t spill_best = 0;
 
 	for (g = MIN_IMA_GOLOMB_PAR; g < MAX_IMA_GOLOMB_PAR; g++) {
-		uint32_t s = cmp_rdcu_get_good_spill(g, cfg->cmp_mode);
+		uint32_t s = cmp_rdcu_get_good_spill(g, rcfg->cmp_mode);
 
-		cfg->golomb_par = g;
-		cfg->spill = s;
-		cmp_size = icu_compress_data(cfg);
-		if (cmp_size <= 0) {
+		rcfg->golomb_par = g;
+		rcfg->spill = s;
+		cmp_size = compress_like_rdcu(rcfg, NULL);
+		if (cmp_is_error(cmp_size)) {
 			return 0;
 		} else if (cmp_size < cmp_size_best) {
 			cmp_size_best = cmp_size;
@@ -139,46 +143,46 @@ static uint32_t pre_cal_method(struct cmp_cfg *cfg)
 			spill_best = s;
 		}
 	}
-	cfg->golomb_par = golomb_par_best;
-	cfg->spill = spill_best;
+	rcfg->golomb_par = golomb_par_best;
+	rcfg->spill = spill_best;
 
-	return (uint32_t)cmp_size_best;
+	return cmp_size_best;
 }
 
 
 /**
  * @brief guess a good configuration with brute force method
  *
- * @param cfg compression configuration structure
+ * @param rcfg	RDCU compression configuration structure
  *
  * @returns the size in bits of the compressed data of the guessed
  * configuration; 0 on error
  */
 
-static uint32_t brute_force(struct cmp_cfg *cfg)
+static uint32_t brute_force(struct rdcu_cfg *rcfg)
 {
 	uint32_t g, s;
 	uint32_t n_cal_steps = 0, last = 0;
 	const uint32_t max_cal_steps = CMP_GUESS_MAX_CAL_STEPS;
-	int cmp_size, cmp_size_best = INT_MAX;
+	uint32_t cmp_size, cmp_size_best = INT_MAX;
 	uint32_t golomb_par_best = 0;
 	uint32_t spill_best = 0;
 	uint32_t percent;
 
-	/* short cut for zero escape mechanism */
-	if (zero_escape_mech_is_used(cfg->cmp_mode))
-		return pre_cal_method(cfg);
+	/* shortcut for zero escape mechanism */
+	if (zero_escape_mech_is_used(rcfg->cmp_mode))
+		return pre_cal_method(rcfg);
 
 	printf("0%%... ");
 	fflush(stdout);
 
 	for (g = MIN_IMA_GOLOMB_PAR; g < MAX_IMA_GOLOMB_PAR; g++) {
 		for (s = MIN_IMA_SPILL; s < cmp_ima_max_spill(g); s++) {
-			cfg->golomb_par = g;
-			cfg->spill = s;
+			rcfg->golomb_par = g;
+			rcfg->spill = s;
 
-			cmp_size = icu_compress_data(cfg);
-			if (cmp_size <= 0) {
+			cmp_size = compress_like_rdcu(rcfg, NULL);
+			if (cmp_is_error(cmp_size)) {
 				return 0;
 			} else if (cmp_size < cmp_size_best) {
 				cmp_size_best = cmp_size;
@@ -196,100 +200,94 @@ static uint32_t brute_force(struct cmp_cfg *cfg)
 		}
 	}
 	printf("100%% ");
-	cfg->golomb_par = golomb_par_best;
-	cfg->spill = spill_best;
+	rcfg->golomb_par = golomb_par_best;
+	rcfg->spill = spill_best;
 
-	return (uint32_t)cmp_size_best;
+	return cmp_size_best;
 }
 
 
 /**
  * @brief guessed rdcu specific adaptive parameters
  *
- * @param cfg compression configuration structure
+ * @param rcfg	RDCU compression configuration structure
  * @note internal use only
  */
 
-static void add_rdcu_pars_internal(struct cmp_cfg *cfg)
+static void add_rdcu_pars_internal(struct rdcu_cfg *rcfg)
 {
-	if (cfg->golomb_par == MIN_IMA_GOLOMB_PAR) {
-		cfg->ap1_golomb_par = cfg->golomb_par + 1;
-		cfg->ap2_golomb_par = cfg->golomb_par + 2;
+	if (rcfg->golomb_par == MIN_IMA_GOLOMB_PAR) {
+		rcfg->ap1_golomb_par = rcfg->golomb_par + 1;
+		rcfg->ap2_golomb_par = rcfg->golomb_par + 2;
 
-	} else if (cfg->golomb_par == MAX_IMA_GOLOMB_PAR) {
-		cfg->ap1_golomb_par = cfg->golomb_par - 2;
-		cfg->ap2_golomb_par = cfg->golomb_par - 1;
+	} else if (rcfg->golomb_par == MAX_IMA_GOLOMB_PAR) {
+		rcfg->ap1_golomb_par = rcfg->golomb_par - 2;
+		rcfg->ap2_golomb_par = rcfg->golomb_par - 1;
 	} else {
-		cfg->ap1_golomb_par = cfg->golomb_par - 1;
-		cfg->ap2_golomb_par = cfg->golomb_par + 1;
+		rcfg->ap1_golomb_par = rcfg->golomb_par - 1;
+		rcfg->ap2_golomb_par = rcfg->golomb_par + 1;
 	}
 
-	cfg->ap1_spill = cmp_rdcu_get_good_spill(cfg->ap1_golomb_par, cfg->cmp_mode);
-	cfg->ap2_spill = cmp_rdcu_get_good_spill(cfg->ap2_golomb_par, cfg->cmp_mode);
+	rcfg->ap1_spill = cmp_rdcu_get_good_spill(rcfg->ap1_golomb_par, rcfg->cmp_mode);
+	rcfg->ap2_spill = cmp_rdcu_get_good_spill(rcfg->ap2_golomb_par, rcfg->cmp_mode);
 
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		cfg->rdcu_data_adr = CMP_DEF_IMA_MODEL_RDCU_DATA_ADR;
-		cfg->rdcu_model_adr = CMP_DEF_IMA_MODEL_RDCU_MODEL_ADR;
-		cfg->rdcu_new_model_adr = CMP_DEF_IMA_MODEL_RDCU_UP_MODEL_ADR;
-		cfg->rdcu_buffer_adr = CMP_DEF_IMA_MODEL_RDCU_BUFFER_ADR;
+	if (model_mode_is_used(rcfg->cmp_mode)) {
+		rcfg->rdcu_data_adr = CMP_DEF_IMA_MODEL_RDCU_DATA_ADR;
+		rcfg->rdcu_model_adr = CMP_DEF_IMA_MODEL_RDCU_MODEL_ADR;
+		rcfg->rdcu_new_model_adr = CMP_DEF_IMA_MODEL_RDCU_UP_MODEL_ADR;
+		rcfg->rdcu_buffer_adr = CMP_DEF_IMA_MODEL_RDCU_BUFFER_ADR;
 	} else {
-		cfg->rdcu_data_adr = CMP_DEF_IMA_DIFF_RDCU_DATA_ADR;
-		cfg->rdcu_model_adr = CMP_DEF_IMA_DIFF_RDCU_MODEL_ADR;
-		cfg->rdcu_new_model_adr = CMP_DEF_IMA_DIFF_RDCU_UP_MODEL_ADR;
-		cfg->rdcu_buffer_adr = CMP_DEF_IMA_DIFF_RDCU_BUFFER_ADR;
+		rcfg->rdcu_data_adr = CMP_DEF_IMA_DIFF_RDCU_DATA_ADR;
+		rcfg->rdcu_model_adr = CMP_DEF_IMA_DIFF_RDCU_MODEL_ADR;
+		rcfg->rdcu_new_model_adr = CMP_DEF_IMA_DIFF_RDCU_UP_MODEL_ADR;
+		rcfg->rdcu_buffer_adr = CMP_DEF_IMA_DIFF_RDCU_BUFFER_ADR;
 	}
 }
 
 
 /**
  * @brief guess a good compression configuration
- * @details use the referenced in the cfg struct (samples, input_buf, model_buf
- * (optional)) and the cmp_mode to find a good set of compression parameters
- * @note compression parameters in the cfg struct (golomb_par, spill, model_value,
- * ap1_.., ap2_.., buffer_length, ...) are overwritten by this function
+ * @details use the samples, input_buf, model_buf and the cmp_mode in rcfg to
+ *	find a good set of compression parameters
+ * @note compression parameters in the rcfg struct (golomb_par, spill, model_value,
+ *	ap1_.., ap2_.., buffer_length, ...) are overwritten by this function
  *
- * @param cfg compression configuration structure
- * @param level guess_level 1 -> fast; 2 -> default; 3 -> slow(brute force)
+ * @param rcfg	RDCU compression configuration structure
+ * @param level	guess_level 1 -> fast; 2 -> default; 3 -> slow(brute force)
  *
  * @returns the size in bits of the compressed data of the guessed
  * configuration; 0 on error
  */
 
-uint32_t cmp_guess(struct cmp_cfg *cfg, int level)
+uint32_t cmp_guess(struct rdcu_cfg *rcfg, int level)
 {
-	size_t size;
-	struct cmp_cfg work_cfg;
+	struct rdcu_cfg work_rcfg;
 	uint32_t cmp_size = 0;
 
-	if (!cfg)
+	if (!rcfg)
 		return 0;
 
-	if (!cfg->input_buf)
+	if (!rcfg->input_buf)
 		return 0;
-	if (model_mode_is_used(cfg->cmp_mode))
-		if (!cfg->model_buf)
+	if (model_mode_is_used(rcfg->cmp_mode))
+		if (!rcfg->model_buf)
 			return 0;
 
-	if (!rdcu_supported_cmp_mode_is_used(cfg->cmp_mode)) {
+	if (!cmp_mode_is_supported(rcfg->cmp_mode)) {
 		printf("This compression mode is not implied yet.\n");
 		return 0;
 	}
 	/* make a working copy of the input data (and model) because the
-	 * following function works inplace
+	 * following function works in-place
 	 */
-	work_cfg = *cfg;
-	work_cfg.icu_new_model_buf = NULL;
-	work_cfg.icu_output_buf = NULL;
-	work_cfg.buffer_length = 0;
-	work_cfg.data_type = DATA_TYPE_IMAGETTE; /* TODO: adapt to others data types */
-
-	size = cmp_cal_size_of_data(cfg->samples, cfg->data_type);
-	if (size == 0)
-		goto error;
-
-	if (model_mode_is_used(cfg->cmp_mode)) {
-		work_cfg.icu_new_model_buf = malloc(size);
-		if (!work_cfg.icu_new_model_buf) {
+	work_rcfg = *rcfg;
+	work_rcfg.icu_new_model_buf = NULL;
+	work_rcfg.icu_output_buf = NULL;
+	work_rcfg.buffer_length = 0;
+
+	if (model_mode_is_used(rcfg->cmp_mode)) {
+		work_rcfg.icu_new_model_buf = malloc(rcfg->samples * sizeof(uint16_t));
+		if (!work_rcfg.icu_new_model_buf) {
 			printf("malloc() failed!\n");
 			goto error;
 		}
@@ -298,39 +296,225 @@ uint32_t cmp_guess(struct cmp_cfg *cfg, int level)
 	/* find the best parameters */
 	switch (level) {
 	case 3:
-		cmp_size = brute_force(&work_cfg);
+		cmp_size = brute_force(&work_rcfg);
 		break;
 	case 1:
-		printf("guess level 1 not implied yet use guess level 2\n");
+		printf("guess level 1 not implied for RDCU data, I use guess level 2\n");
 		/* fall through */
 	case 2:
-		cmp_size = pre_cal_method(&work_cfg);
+		cmp_size = pre_cal_method(&work_rcfg);
 		break;
 	default:
-		fprintf(stderr, "cmp_tool: guess level not supported!\n");
+		fprintf(stderr, "cmp_tool: guess level not supported for RDCU guess mode!\n");
 		goto error;
-		break;
 	}
 	if (!cmp_size)
 		goto error;
 
-	free(work_cfg.icu_new_model_buf);
+	free(work_rcfg.icu_new_model_buf);
 
-	cfg->golomb_par = work_cfg.golomb_par;
-	cfg->spill = work_cfg.spill;
+	rcfg->golomb_par = work_rcfg.golomb_par;
+	rcfg->spill = work_rcfg.spill;
 
-	cfg->model_value = cmp_guess_model_value(num_model_updates);
+	rcfg->model_value = cmp_guess_model_value(num_model_updates);
 
-	if (rdcu_supported_data_type_is_used(cfg->data_type))
-		add_rdcu_pars_internal(cfg);
+	add_rdcu_pars_internal(rcfg);
 
-	/* TODO: check that for non-imagette data */
-	cfg->buffer_length = ((cmp_size + 32)&~0x1FU)/(size_of_a_sample(cfg->data_type)*8);
+	rcfg->buffer_length = ((cmp_size + 32)&~0x1FU)/(size_of_a_sample(DATA_TYPE_IMAGETTE)*8);
 
 	return cmp_size;
 
 error:
-	free(work_cfg.icu_new_model_buf);
+	free(work_rcfg.icu_new_model_buf);
 	return 0;
 }
 
+
+/**
+ * @brief get the next Golomb parameter value to try based on the guess level
+ *
+ * @param cur_g		current Golomb parameter value
+ * @param guess_level	determines the granularity of the parameter search
+ *			higher values decrease step size (finer search)
+ *			lower/negative values increase step size (coarser search)
+ *			range: [-31, 31], default: 2
+ *
+ * @returns next Golomb parameter value to try
+ */
+
+static uint32_t get_next_g_par(uint32_t cur_g, int guess_level)
+{
+	uint32_t result = cur_g;
+
+	guess_level--; /* use a better guess level */
+
+	if (guess_level > 31)
+		guess_level = 31;
+
+	if (guess_level < -31)
+		guess_level = -31;
+
+
+	if (guess_level >= 0)
+		result += (1U << ilog_2(cur_g)) >> guess_level;
+	else
+		result = cur_g << -guess_level;
+
+	if (result == cur_g)
+		result++;
+
+	return result;
+}
+
+
+/**
+ * @brief estimate the optimal specific compression parameter set for a given chunk type
+ *
+ * @param chunk		pointer to the chunk data to analyse
+ * @param chunk_size	size of the chunk in bytes
+ * @param chunk_model	pointer to the model data (can be NULL)
+ * @param cmp_par	pointer to where to store the optimized compression parameters
+ * @param guess_level	controls the granularity of the parameter search; 2 is the default
+ *
+ * @returns the size of the compressed data with the estimated parameters; error
+ *	code on failure
+ */
+
+static uint32_t cmp_guess_chunk_par(const void *chunk, uint32_t chunk_size,
+				    const void *chunk_model, struct cmp_par *cmp_par,
+				    int guess_level)
+{
+	uint32_t *param_ptrs[7] = {0};
+	uint32_t cmp_size_best = ~0U;
+	int i;
+
+	if (cmp_par->lossy_par)
+		debug_print("Warning: lossy compression is not supported for chunk compression, lossy_par will be ignored.");
+	cmp_par->lossy_par = 0;
+	cmp_par->model_value = cmp_guess_model_value(num_model_updates);
+
+	switch (cmp_col_get_chunk_type(chunk)) {
+	case CHUNK_TYPE_NCAM_IMAGETTE:
+		param_ptrs[0] = &cmp_par->nc_imagette;
+		break;
+	case CHUNK_TYPE_SAT_IMAGETTE:
+		param_ptrs[0] = &cmp_par->saturated_imagette;
+		break;
+	case CHUNK_TYPE_SHORT_CADENCE:
+		param_ptrs[0] = &cmp_par->s_exp_flags;
+		param_ptrs[1] = &cmp_par->s_fx;
+		param_ptrs[2] = &cmp_par->s_ncob;
+		param_ptrs[3] = &cmp_par->s_efx;
+		param_ptrs[4] = &cmp_par->s_ecob;
+		break;
+	case CHUNK_TYPE_LONG_CADENCE:
+		param_ptrs[0] = &cmp_par->l_exp_flags;
+		param_ptrs[1] = &cmp_par->l_fx;
+		param_ptrs[2] = &cmp_par->l_ncob;
+		param_ptrs[3] = &cmp_par->l_efx;
+		param_ptrs[4] = &cmp_par->l_ecob;
+		param_ptrs[5] = &cmp_par->l_fx_cob_variance;
+		break;
+	case CHUNK_TYPE_OFFSET_BACKGROUND:
+		param_ptrs[0] = &cmp_par->nc_offset_mean;
+		param_ptrs[1] = &cmp_par->nc_offset_variance;
+		param_ptrs[2] = &cmp_par->nc_background_mean;
+		param_ptrs[3] = &cmp_par->nc_background_variance;
+		param_ptrs[4] = &cmp_par->nc_background_outlier_pixels;
+		break;
+	case CHUNK_TYPE_SMEARING:
+		param_ptrs[0] = &cmp_par->smearing_mean;
+		param_ptrs[1] = &cmp_par->smearing_variance_mean;
+		param_ptrs[2] = &cmp_par->smearing_outlier_pixels;
+		break;
+	case CHUNK_TYPE_F_CHAIN:
+		param_ptrs[0] = &cmp_par->fc_imagette;
+		param_ptrs[1] = &cmp_par->fc_offset_mean;
+		param_ptrs[2] = &cmp_par->fc_offset_variance;
+		param_ptrs[3] = &cmp_par->fc_background_mean;
+		param_ptrs[4] = &cmp_par->fc_background_variance;
+		param_ptrs[5] = &cmp_par->fc_background_outlier_pixels;
+		break;
+	case CHUNK_TYPE_UNKNOWN:
+	default: /*
+		  * default case never reached because cmp_col_get_chunk_type
+		  * returns CHUNK_TYPE_UNKNOWN if the type is unknown
+		  */
+		break;
+	}
+
+	/* init */
+	for (i = 0; param_ptrs[i] != NULL; i++)
+		*param_ptrs[i] = 1;
+
+	for (i = 0; param_ptrs[i] != NULL; i++) {
+		uint32_t best_g = *param_ptrs[i];
+		uint32_t g;
+
+		for (g = MIN_NON_IMA_GOLOMB_PAR; g < MAX_NON_IMA_GOLOMB_PAR; g =  get_next_g_par(g, guess_level)) {
+			uint32_t cmp_size;
+
+			*param_ptrs[i] = g;
+			cmp_size = compress_chunk(chunk, chunk_size, chunk_model,
+						  NULL, NULL, 0, cmp_par);
+			FORWARD_IF_ERROR(cmp_size, "");
+			if (cmp_size < cmp_size_best) {
+				cmp_size_best = cmp_size;
+				best_g = g;
+			}
+		}
+		*param_ptrs[i] = best_g;
+	}
+
+	return cmp_size_best;
+}
+
+
+/**
+ * @brief estimate an optimal compression parameters for the given chunk
+ *
+ * @param chunk		pointer to the chunk data to analyse
+ * @param chunk_size	size of the chunk in bytes
+ * @param chunk_model	pointer to the model data (can be NULL)
+ * @param cmp_par	pointer to where to store the optimized compression parameters
+ * @param guess_level	controls the granularity of the parameter search; 2 is
+ *			the default
+ *
+ * @returns the size of the compressed data with the estimated parameters; error
+ *	code on failure
+ */
+
+uint32_t cmp_guess_chunk(const void *chunk, uint32_t chunk_size,
+			 const void *chunk_model, struct cmp_par *cmp_par,
+			 int guess_level)
+{
+	uint32_t cmp_size_zero, cmp_size_multi;
+	struct cmp_par cmp_par_zero;
+	struct cmp_par cmp_par_multi;
+
+	memset(&cmp_par_zero, 0, sizeof(cmp_par_zero));
+	memset(&cmp_par_multi, 0, sizeof(cmp_par_multi));
+
+	if (chunk_model) {
+		cmp_par_zero.cmp_mode = CMP_MODE_DIFF_ZERO;
+		cmp_par_multi.cmp_mode = CMP_MODE_MODEL_MULTI;
+	} else {
+		cmp_par_zero.cmp_mode = CMP_MODE_DIFF_ZERO;
+		cmp_par_multi.cmp_mode = CMP_MODE_DIFF_MULTI;
+	}
+	cmp_size_zero = cmp_guess_chunk_par(chunk, chunk_size, chunk_model,
+					    &cmp_par_zero, guess_level);
+	FORWARD_IF_ERROR(cmp_size_zero, "");
+
+	cmp_size_multi = cmp_guess_chunk_par(chunk, chunk_size, chunk_model,
+					     &cmp_par_multi, guess_level);
+	FORWARD_IF_ERROR(cmp_size_multi, "");
+
+	if (cmp_size_zero <= cmp_size_multi) {
+		*cmp_par = cmp_par_zero;
+		return cmp_size_zero;
+	}
+
+	*cmp_par = cmp_par_multi;
+	return cmp_size_multi;
+}
diff --git a/programs/cmp_guess.h b/programs/cmp_guess.h
index efca334022833735b6c65c4bf96506184474dc17..0893a9ae4a5860ba72f96d86f5df97ba29a1ab94 100644
--- a/programs/cmp_guess.h
+++ b/programs/cmp_guess.h
@@ -21,6 +21,7 @@
 #define CMP_GUESS_H
 
 #include <cmp_support.h>
+#include <cmp_chunk.h>
 
 
 #define DEFAULT_GUESS_LEVEL 2
@@ -33,7 +34,12 @@
 /* how often the model is updated before it is reset default value */
 #define CMP_GUESS_N_MODEL_UPDATE_DEF	8
 
-uint32_t cmp_guess(struct cmp_cfg *cfg, int level);
+uint32_t cmp_guess(struct rdcu_cfg *rcfg, int level);
+
+uint32_t cmp_guess_chunk(const void *chunk, uint32_t chunk_size,
+			 const void *chunk_model, struct cmp_par *cmp_par,
+			 int guess_level);
+
 void cmp_guess_set_model_updates(int n_model_updates);
 
 uint32_t cmp_rdcu_get_good_spill(unsigned int golomb_par, enum cmp_mode cmp_mode);
diff --git a/programs/cmp_io.c b/programs/cmp_io.c
index 9b026343debc55ac6db8093871cb0ceb173b7eee..f4938dc15cb7e7f866ec7abab22baabbe1300a5d 100644
--- a/programs/cmp_io.c
+++ b/programs/cmp_io.c
@@ -158,16 +158,16 @@ static FILE *open_file(const char *dirname, const char *filename)
  *
  * @param data			the data to write a file
  * @param data_size		size of the data in bytes
- * @param data_type		compression data type of the data
+ * @param cmp_type		RDCU or chunk compression?
  * @param output_prefix		file name without file extension
  * @param name_extension	extension (with leading point character)
  * @param flags			CMP_IO_VERBOSE_EXTRA	print verbose output if set
- *				CMP_IO_BINARY	write file in binary format if set
+ *				CMP_IO_BINARY	write the file in binary format if set
  *
  * @returns 0 on success, error otherwise
  */
 
-int write_input_data_to_file(const void *data, uint32_t data_size, enum cmp_data_type data_type,
+int write_input_data_to_file(const void *data, uint32_t data_size, enum cmp_type cmp_type,
 			     const char *output_prefix, const char *name_extension, int flags)
 {
 	uint8_t *tmp_buf;
@@ -185,10 +185,18 @@ int write_input_data_to_file(const void *data, uint32_t data_size, enum cmp_data
 
 	memcpy(tmp_buf, data, data_size);
 
-	if (data_type == DATA_TYPE_CHUNK)
+	switch (cmp_type) {
+	case CMP_TYPE_CHUNK:
 		return_value = cpu_to_be_chunk(tmp_buf, data_size);
-	else
-		return_value = cmp_input_big_to_cpu_endianness(tmp_buf, data_size, data_type);
+		break;
+	case CMP_TYPE_RDCU:
+		return_value = be_to_cpu_data_type(tmp_buf, data_size, DATA_TYPE_IMAGETTE);
+		break;
+	case CMP_TYPE_ERROR:
+	default:
+		return_value = -1;
+		break;
+	}
 
 	if (!return_value)
 		return_value = write_data_to_file(tmp_buf, data_size, output_prefix,
@@ -210,7 +218,7 @@ int write_input_data_to_file(const void *data, uint32_t data_size, enum cmp_data
  * @param name_extension file extension (with leading point character)
  *
  * @param flags		CMP_IO_VERBOSE_EXTRA	print verbose output if set
- *			CMP_IO_BINARY	write file in binary format if set
+ *			CMP_IO_BINARY	write the file in binary format if set
  *
  * @returns 0 on success, error otherwise
  */
@@ -352,7 +360,7 @@ static int sram_addr_to_int(const char *addr)
 	}
 
 	if (i > RDCU_SRAM_END) {
-		printf("%s: The sram address is out of the rdcu range\n",
+		printf("%s: The SRAM address is out of the rdcu range\n",
 		       PROGRAM_NAME);
 		return -1;
 	}
@@ -370,7 +378,7 @@ static int sram_addr_to_int(const char *addr)
  * @brief Interprets an uint32_t integer value in a byte string
  *
  * @param dep_str	description string of the read in value
- * @param val_str	value string contain the value to convert in uint32_t
+ * @param val_str	value string contains the value to convert in uint32_t
  * @param red_val	address for storing the converted result
  *
  * @returns 0 on success, error otherwise
@@ -467,7 +475,43 @@ const char *data_type2string(enum cmp_data_type data_type)
 
 
 /**
- * @brief parse a compression mode vale string to an integer
+ * @brief compares two strings case-insensitively
+ *
+ * @param s1	the first string to compare
+ * @param s2	the second string to compare
+ *
+ * @returns an integer greater than, equal to, or less than 0, according as s1
+ *	is lexicographically greater than, equal to, or less than s2 after
+ *	translation of each corresponding character to lower-case.  The strings
+ *	themselves are not modified.
+ */
+
+int case_insensitive_compare(const char *s1, const char *s2)
+{
+	size_t i;
+
+	for (i = 0;  ; ++i) {
+		unsigned int x1 = (unsigned char)s1[i];
+		unsigned int x2 = (unsigned char)s2[i];
+		int r;
+
+		if (x1 - 'A' < 26U)
+			x1 += 32; /* tolower */
+		if (x2 - 'A' < 26U)
+			x2 += 32; /* tolower */
+
+		r = (int)x1 - (int)x2;
+		if (r)
+			return r;
+
+		if (!x1)
+			return 0;
+	}
+}
+
+
+/**
+ * @brief parse a compression mode value string to an integer
  * @note string can be either a number or the name of the compression mode
  *
  * @param cmp_mode_str	string containing the compression mode value to parse
@@ -503,7 +547,7 @@ int cmp_mode_parse(const char *cmp_mode_str, enum cmp_mode *cmp_mode)
 		size_t j;
 
 		for (j = 0; j < ARRAY_SIZE(conversion); j++) {
-			if (!strcmp(cmp_mode_str, conversion[j].str)) {
+			if (!case_insensitive_compare(cmp_mode_str, conversion[j].str)) {
 				*cmp_mode = conversion[j].cmp_mode;
 				return 0;
 			}
@@ -511,6 +555,7 @@ int cmp_mode_parse(const char *cmp_mode_str, enum cmp_mode *cmp_mode)
 		return -1;
 	} else {
 		uint32_t read_val;
+
 		if (atoui32(cmp_mode_str, cmp_mode_str, &read_val))
 			return -1;
 		*cmp_mode = read_val;
@@ -528,23 +573,26 @@ int cmp_mode_parse(const char *cmp_mode_str, enum cmp_mode *cmp_mode)
  * @note internal use only!
  *
  * @param fp	FILE pointer
- * @param cfg	compression configuration structure holding the read in
+ * @param rcfg	RDCU compression configuration structure holding the read in
  *		configuration
  * @param par	chunk compression parameters structure holding the read in
  *		chunk configuration
  *
- * @returns 0 on success, error otherwise
+ * @returns CMP_TYPE_CHUNK if a chunk configuration is detected (stored in par),
+ *	CMP_TYPE_RDCU if an RDCU configuration is detected (stored in cfg) or
+ *	CMP_TYPE_ERROR on error
  */
 
-static int parse_cfg(FILE *fp, struct cmp_cfg *cfg, struct cmp_par *par)
+static enum cmp_type parse_cfg(FILE *fp, struct rdcu_cfg *rcfg, struct cmp_par *par)
 {
-#define chunk_parse_uint32_parmter(parmter)			\
-	if (!strcmp(token1, #parmter)) {			\
-		if (atoui32(token1, token2, &par->parmter))	\
-			return -1;				\
-		cfg->data_type = DATA_TYPE_CHUNK;		\
+#define chunk_parse_uint32_parameter(parameter)			\
+	if (!strcmp(token1, #parameter)) {			\
+		if (atoui32(token1, token2, &par->parameter))	\
+			return CMP_TYPE_ERROR;			\
+		cmp_type = CMP_TYPE_CHUNK;			\
 		continue;					\
 }
+	enum cmp_type cmp_type = CMP_TYPE_RDCU;
 	char *token1, *token2;
 	char line[MAX_CONFIG_LINE];
 	enum {CMP_MODE, SAMPLES, BUFFER_LENGTH, LAST_ITEM};
@@ -552,9 +600,9 @@ static int parse_cfg(FILE *fp, struct cmp_cfg *cfg, struct cmp_par *par)
 
 	if (!fp)
 		abort();
-	if (!cfg)
+	if (!rcfg)
 		abort();
-	if(!par)
+	if (!par)
 		abort();
 
 	while (fgets(line, sizeof(line), fp) != NULL) {
@@ -564,7 +612,7 @@ static int parse_cfg(FILE *fp, struct cmp_cfg *cfg, struct cmp_par *par)
 		if (!strchr(line, '\n')) { /* detect a to long line */
 			fprintf(stderr, "%s: Error read in line to long. Maximal line length is %d characters.\n",
 				PROGRAM_NAME, MAX_CONFIG_LINE-1);
-			return -1;
+			return CMP_TYPE_ERROR;
 		}
 
 		remove_comments(line);
@@ -578,58 +626,52 @@ static int parse_cfg(FILE *fp, struct cmp_cfg *cfg, struct cmp_par *par)
 			continue;
 
 
-		if (!strcmp(token1, "data_type")) {
-			cfg->data_type = string2data_type(token2);
-			if (cfg->data_type == DATA_TYPE_UNKNOWN)
-				return -1;
-			continue;
-		}
 		if (!strcmp(token1, "cmp_mode")) {
 			must_read_items[CMP_MODE] = 1;
-			if (cmp_mode_parse(token2, &cfg->cmp_mode))
-				return -1;
-			par->cmp_mode = cfg->cmp_mode;
+			if (cmp_mode_parse(token2, &rcfg->cmp_mode))
+				return CMP_TYPE_ERROR;
+			par->cmp_mode = rcfg->cmp_mode;
 			continue;
 		}
 		if (!strcmp(token1, "golomb_par")) {
-			if (atoui32(token1, token2, &cfg->golomb_par))
-				return -1;
+			if (atoui32(token1, token2, &rcfg->golomb_par))
+				return CMP_TYPE_ERROR;
 			continue;
 		}
 		if (!strcmp(token1, "spill")) {
-			if (atoui32(token1, token2, &cfg->spill))
-				return -1;
+			if (atoui32(token1, token2, &rcfg->spill))
+				return CMP_TYPE_ERROR;
 			continue;
 		}
 		if (!strcmp(token1, "model_value")) {
-			if (atoui32(token1, token2, &cfg->model_value))
-				return -1;
-			par->model_value = cfg->model_value;
+			if (atoui32(token1, token2, &rcfg->model_value))
+				return CMP_TYPE_ERROR;
+			par->model_value = rcfg->model_value;
 			continue;
 		}
 		if (!strcmp(token1, "round")) {
-			if (atoui32(token1, token2, &cfg->round))
-				return -1;
+			if (atoui32(token1, token2, &rcfg->round))
+				return CMP_TYPE_ERROR;
 			continue;
 		}
 		if (!strcmp(token1, "ap1_golomb_par")) {
-			if (atoui32(token1, token2, &cfg->ap1_golomb_par))
-				return -1;
+			if (atoui32(token1, token2, &rcfg->ap1_golomb_par))
+				return CMP_TYPE_ERROR;
 			continue;
 		}
 		if (!strcmp(token1, "ap1_spill")) {
-			if (atoui32(token1, token2, &cfg->ap1_spill))
-				return -1;
+			if (atoui32(token1, token2, &rcfg->ap1_spill))
+				return CMP_TYPE_ERROR;
 			continue;
 		}
 		if (!strcmp(token1, "ap2_golomb_par")) {
-			if (atoui32(token1, token2, &cfg->ap2_golomb_par))
-				return -1;
+			if (atoui32(token1, token2, &rcfg->ap2_golomb_par))
+				return CMP_TYPE_ERROR;
 			continue;
 		}
 		if (!strcmp(token1, "ap2_spill")) {
-			if (atoui32(token1, token2, &cfg->ap2_spill))
-				return -1;
+			if (atoui32(token1, token2, &rcfg->ap2_spill))
+				return CMP_TYPE_ERROR;
 			continue;
 		}
 
@@ -639,9 +681,9 @@ static int parse_cfg(FILE *fp, struct cmp_cfg *cfg, struct cmp_par *par)
 			if (i < 0) {
 				printf("%s: Error read in rdcu_data_adr_par\n",
 				       PROGRAM_NAME);
-				return -1;
+				return CMP_TYPE_ERROR;
 			}
-			cfg->rdcu_data_adr = (uint32_t)i;
+			rcfg->rdcu_data_adr = (uint32_t)i;
 			continue;
 		}
 		if (!strcmp(token1, "rdcu_model_adr")) {
@@ -650,9 +692,9 @@ static int parse_cfg(FILE *fp, struct cmp_cfg *cfg, struct cmp_par *par)
 			if (i < 0) {
 				printf("%s: Error read in rdcu_model_adr_par\n",
 				       PROGRAM_NAME);
-				return -1;
+				return CMP_TYPE_ERROR;
 			}
-			cfg->rdcu_model_adr = (uint32_t)i;
+			rcfg->rdcu_model_adr = (uint32_t)i;
 			continue;
 		}
 		if (!strcmp(token1, "rdcu_new_model_adr")) {
@@ -661,14 +703,14 @@ static int parse_cfg(FILE *fp, struct cmp_cfg *cfg, struct cmp_par *par)
 			if (i < 0) {
 				printf("%s: Error read in rdcu_new_model_adr_par\n",
 				       PROGRAM_NAME);
-				return -1;
+				return CMP_TYPE_ERROR;
 			}
-			cfg->rdcu_new_model_adr = (uint32_t)i;
+			rcfg->rdcu_new_model_adr = (uint32_t)i;
 			continue;
 		}
 		if (!strcmp(token1, "samples")) {
-			if (atoui32(token1, token2, &cfg->samples))
-				return -1;
+			if (atoui32(token1, token2, &rcfg->samples))
+				return CMP_TYPE_ERROR;
 			must_read_items[SAMPLES] = 1;
 			continue;
 		}
@@ -678,72 +720,72 @@ static int parse_cfg(FILE *fp, struct cmp_cfg *cfg, struct cmp_par *par)
 			if (i < 0) {
 				printf("%s: Error read in rdcu_buffer_adr_par\n",
 				       PROGRAM_NAME);
-				return -1;
+				return CMP_TYPE_ERROR;
 			}
-			cfg->rdcu_buffer_adr = (uint32_t)i;
+			rcfg->rdcu_buffer_adr = (uint32_t)i;
 			continue;
 		}
 		if (!strcmp(token1, "buffer_length")) {
-			if (atoui32(token1, token2, &cfg->buffer_length))
-				return -1;
+			if (atoui32(token1, token2, &rcfg->buffer_length))
+				return CMP_TYPE_ERROR;
 			must_read_items[BUFFER_LENGTH] = 1;
 			continue;
 		}
 
-		/* chunk_parse_uint32_parmter(model_value); */
-		chunk_parse_uint32_parmter(lossy_par);
-
-		chunk_parse_uint32_parmter(nc_imagette);
-
-		chunk_parse_uint32_parmter(s_exp_flags);
-		chunk_parse_uint32_parmter(s_fx);
-		chunk_parse_uint32_parmter(s_ncob);
-		chunk_parse_uint32_parmter(s_efx);
-		chunk_parse_uint32_parmter(s_ecob);
-
-		chunk_parse_uint32_parmter(l_exp_flags);
-		chunk_parse_uint32_parmter(l_fx);
-		chunk_parse_uint32_parmter(l_ncob);
-		chunk_parse_uint32_parmter(l_efx);
-		chunk_parse_uint32_parmter(l_ecob);
-		chunk_parse_uint32_parmter(l_fx_cob_variance);
-
-		chunk_parse_uint32_parmter(saturated_imagette);
-
-		chunk_parse_uint32_parmter(nc_offset_mean);
-		chunk_parse_uint32_parmter(nc_offset_variance);
-		chunk_parse_uint32_parmter(nc_background_mean);
-		chunk_parse_uint32_parmter(nc_background_variance);
-		chunk_parse_uint32_parmter(nc_background_outlier_pixels);
-
-		chunk_parse_uint32_parmter(smearing_mean);
-		chunk_parse_uint32_parmter(smearing_variance_mean);
-		chunk_parse_uint32_parmter(smearing_outlier_pixels);
-
-		chunk_parse_uint32_parmter(fc_imagette);
-		chunk_parse_uint32_parmter(fc_offset_mean);
-		chunk_parse_uint32_parmter(fc_offset_variance);
-		chunk_parse_uint32_parmter(fc_background_mean);
-		chunk_parse_uint32_parmter(fc_background_variance);
-		chunk_parse_uint32_parmter(fc_background_outlier_pixels);
+		/* chunk_parse_uint32_parameter(model_value); */
+		chunk_parse_uint32_parameter(lossy_par);
+
+		chunk_parse_uint32_parameter(nc_imagette);
+
+		chunk_parse_uint32_parameter(s_exp_flags);
+		chunk_parse_uint32_parameter(s_fx);
+		chunk_parse_uint32_parameter(s_ncob);
+		chunk_parse_uint32_parameter(s_efx);
+		chunk_parse_uint32_parameter(s_ecob);
+
+		chunk_parse_uint32_parameter(l_exp_flags);
+		chunk_parse_uint32_parameter(l_fx);
+		chunk_parse_uint32_parameter(l_ncob);
+		chunk_parse_uint32_parameter(l_efx);
+		chunk_parse_uint32_parameter(l_ecob);
+		chunk_parse_uint32_parameter(l_fx_cob_variance);
+
+		chunk_parse_uint32_parameter(saturated_imagette);
+
+		chunk_parse_uint32_parameter(nc_offset_mean);
+		chunk_parse_uint32_parameter(nc_offset_variance);
+		chunk_parse_uint32_parameter(nc_background_mean);
+		chunk_parse_uint32_parameter(nc_background_variance);
+		chunk_parse_uint32_parameter(nc_background_outlier_pixels);
+
+		chunk_parse_uint32_parameter(smearing_mean);
+		chunk_parse_uint32_parameter(smearing_variance_mean);
+		chunk_parse_uint32_parameter(smearing_outlier_pixels);
+
+		chunk_parse_uint32_parameter(fc_imagette);
+		chunk_parse_uint32_parameter(fc_offset_mean);
+		chunk_parse_uint32_parameter(fc_offset_variance);
+		chunk_parse_uint32_parameter(fc_background_mean);
+		chunk_parse_uint32_parameter(fc_background_variance);
+		chunk_parse_uint32_parameter(fc_background_outlier_pixels);
 	}
 
-	if (cfg->data_type != DATA_TYPE_CHUNK) {
-		if (raw_mode_is_used(cfg->cmp_mode))
+	if (cmp_type == CMP_TYPE_RDCU) {
+		if (raw_mode_is_used(rcfg->cmp_mode))
 			if (must_read_items[CMP_MODE] == 1 &&
 			    must_read_items[BUFFER_LENGTH] == 1)
-				return 0;
+				return cmp_type;
 
 		for (j = 0; j < LAST_ITEM; j++) {
 			if (must_read_items[j] < 1) {
 				fprintf(stderr, "%s: Some parameters are missing. Check if the following parameters: cmp_mode, golomb_par, spill, samples and buffer_length are all set in the configuration file.\n",
 					PROGRAM_NAME);
-				return -1;
+				return CMP_TYPE_ERROR;
 			}
 		}
 	}
 
-	return 0;
+	return cmp_type;
 }
 
 
@@ -751,25 +793,27 @@ static int parse_cfg(FILE *fp, struct cmp_cfg *cfg, struct cmp_par *par)
  * @brief reading a compressor configuration file
  *
  * @param file_name	file containing the compression configuration file
- * @param cfg		compression configuration structure holding the read in
+ * @param rcfg		RDCU compression configuration structure holding the read in
  *			configuration
  * @param par		chunk compression parameters structure holding the read
  *			in chunk configuration
  * @param verbose_en	print verbose output if not zero
  *
- * @returns 0 on success, error otherwise
+ * @returns CMP_TYPE_CHUNK if a chunk configuration is detected (stored in par),
+ *	CMP_TYPE_RDCU if an RDCU configuration is detected (stored in cfg) or
+ *	CMP_TYPE_ERROR on error
  */
 
-int cmp_cfg_read(const char *file_name, struct cmp_cfg *cfg, struct cmp_par *par,
-		 int verbose_en)
+enum cmp_type cmp_cfg_read(const char *file_name, struct rdcu_cfg *rcfg,
+			   struct cmp_par *par, int verbose_en)
 {
-	int err;
+	enum cmp_type cmp_type;
 	FILE *fp;
 
 	if (!file_name)
 		abort();
 
-	if (!cfg)
+	if (!rcfg)
 		abort();
 
 	if (strstr(file_name, ".info")) {
@@ -785,18 +829,16 @@ int cmp_cfg_read(const char *file_name, struct cmp_cfg *cfg, struct cmp_par *par
 		return -1;
 	}
 
-	err = parse_cfg(fp, cfg, par);
+	cmp_type = parse_cfg(fp, rcfg, par);
 	fclose(fp);
-	if (err)
-		return err;
 
-	if (verbose_en) {
+	if (verbose_en && cmp_type == CMP_TYPE_RDCU) {
 		printf("\n\n");
-		cmp_cfg_print(cfg);
+		cmp_cfg_print(rcfg, 1);
 		printf("\n");
 	}
 
-	return 0;
+	return cmp_type;
 }
 
 
@@ -1099,17 +1141,18 @@ static const char *skip_comment(const char *str)
 
 
 /**
- * @brief Interprets an hex-encoded 8 bit integer value in a byte string pointed
+ * @brief Interprets a hex-encoded 8-bit integer value in a byte string pointed
  *	to by str.
  * @details Discards any whitespace characters (as identified by calling isspace)
- *	until the first non-whitespace character is found, then takes maximum 2
- *	characters (with base 16) unsigned integer number representation and
- *	converts them to an uint8_t value. The function set the pointer
+ *	until the first non-whitespace character is found, then takes a maximum
+ *	of 2 characters (with base 16) unsigned integer number representation
+ *	and converts them to an uint8_t value. The function sets the pointer
  *	pointed to by str_end to point to the character past the last character
  *	interpreted. If str_end is a null pointer, it is ignored.
  *
- * @param str     pointer to the null-terminated byte string to be interpreted
- * @param str_end pointer to a pointer to character (can be NULL)
+ * @param str		pointer to the null-terminated byte string to be interpreted
+ * @param str_end	point to the character past the last numeric character
+ *			interpreted (can be NULL)
  *
  * @returns Integer value corresponding to the contents of str on success. If no
  *	conversion can be performed, 0 is returned (errno is set to EINVAL)).
@@ -1184,7 +1227,7 @@ static __inline ssize_t str2uint8_arr(const char *str, uint8_t *data, uint32_t b
 {
 	const char *nptr = str;
 	const char *eptr = NULL;
-	size_t i = 0;
+	uint32_t i = 0;
 
 	errno = 0;
 
@@ -1202,7 +1245,7 @@ static __inline ssize_t str2uint8_arr(const char *str, uint8_t *data, uint32_t b
 			if (!data)  /* finished counting the sample */
 				break;
 
-			fprintf(stderr, "%s: %s: Error: The files do not contain enough data. Expected: 0x%x, has 0x%lx.\n",
+			fprintf(stderr, "%s: %s: Error: The files do not contain enough data. Expected: 0x%x, has 0x%x.\n",
 				PROGRAM_NAME, file_name, buf_size, i);
 			return -1;
 		}
@@ -1222,7 +1265,7 @@ static __inline ssize_t str2uint8_arr(const char *str, uint8_t *data, uint32_t b
 		c = *eptr;
 		if (c != '\0' && !isxdigit(c) && !isspace(c) && c != '#') {
 			if (isprint(c))
-				fprintf(stderr, "%s: %s: Error read in '%.*s'. The data are not correct formatted.\n",
+				fprintf(stderr, "%s: %s: Error read in '%.*s'. The data are not correctly formatted.\n",
 					PROGRAM_NAME, file_name, (int)(eptr-nptr+1), nptr);
 			else
 				fprintf(stderr, "%s: %s: Error: Non printable character found. If you want to read binary files, use the --binary option.\n",
@@ -1349,7 +1392,7 @@ ssize_t read_file8(const char *file_name, uint8_t *buf, uint32_t buf_size, int f
 			printf("%s: %s: Error: unexpected end of file.\n", PROGRAM_NAME, file_name);
 		goto fail;
 	}
-	/* just to be save we have a zero terminated string */
+	/* just to be safe we have a zero terminated string */
 	file_cpy[file_size] = '\0';
 
 	fclose(fp);
@@ -1376,7 +1419,7 @@ fail:
  * @brief reads hex-encoded data from a file into a buffer
  *
  * @param file_name	data/model file name
- * @param data_type	compression data type used for the data
+ * @param cmp_type	RDCU or chunk compression?
  * @param buf		buffer to write the file content (can be NULL)
  * @param buf_size	size in bytes of the buffer
  * @param flags		CMP_IO_VERBOSE_EXTRA	print verbose output if set
@@ -1385,36 +1428,33 @@ fail:
  * @returns the size in bytes to store the file content; negative on error
  */
 
-ssize_t read_file_data(const char *file_name, enum cmp_data_type data_type,
+ssize_t read_file_data(const char *file_name, enum cmp_type cmp_type,
 		       void *buf, uint32_t buf_size, int flags)
 {
 	ssize_t size;
-	int32_t samples;
 	int err;
 
 	size = read_file8(file_name, (uint8_t *)buf, buf_size, flags);
-	if (size > UINT32_MAX)
+	if (size > INT32_MAX)
 		return -1;
 
 	if (size < 0)
 		return size;
 
-	if (data_type != DATA_TYPE_CHUNK) {
-		samples = cmp_input_size_to_samples((uint32_t)size, data_type);
-		if (samples < 0) {
-			fprintf(stderr, "%s: %s: Error: The data are not correct formatted for the used compression data type.\n",
-					PROGRAM_NAME, file_name);
-			return -1;
-		}
-
-		err = cmp_input_big_to_cpu_endianness(buf, (uint32_t)size, data_type);
-		if (err)
-			return -1;
-	} else {
+	switch (cmp_type) {
+	case CMP_TYPE_RDCU:
+		err = be_to_cpu_data_type(buf, (uint32_t)size, DATA_TYPE_IMAGETTE);
+		break;
+	case CMP_TYPE_CHUNK:
 		err = be_to_cpu_chunk(buf, (uint32_t)size);
-		if (err)
-			return -1;
+		break;
+	case CMP_TYPE_ERROR:
+	default:
+		err = -1;
 	}
+
+	if (err)
+		return -1;
 	return size;
 }
 
@@ -1461,7 +1501,7 @@ ssize_t read_file_cmp_entity(const char *file_name, struct cmp_entity *ent,
 		}
 		if (size != (ssize_t)cmp_ent_get_size(ent)) {
 			fprintf(stderr, "%s: %s: The size of the compression entity set in the header of the compression entity is not the same size as the read-in file has. Expected: 0x%x, has 0x%lx.\n",
-				PROGRAM_NAME, file_name, cmp_ent_get_size(ent), (size_t)size);
+				PROGRAM_NAME, file_name, cmp_ent_get_size(ent), (unsigned long)size);
 			return -1;
 		}
 	}
@@ -1522,29 +1562,27 @@ uint32_t cmp_tool_gen_version_id(const char *version)
  * @note internal use only!
  *
  * @param fp		FILE pointer
- * @param cfg		pointer to a configuration to print
+ * @param rcfg		pointer to a RDCU configuration to print
+ * @param add_ap_pars	if non-zero write the adaptive RDCU parameter in the
+ *			file
  */
 
-static void write_cfg_internal(FILE *fp, const struct cmp_cfg *cfg)
+static void write_cfg_internal(FILE *fp, const struct rdcu_cfg *rcfg,
+			       int add_ap_pars)
 {
 	if (!fp)
 		return;
 
-	if (!cfg) {
+	if (!rcfg) {
 		fprintf(fp, "Pointer to the compressor configuration is NULL.\n");
 		return;
 	}
 
 	fprintf(fp, "#-------------------------------------------------------------------------------\n");
-	fprintf(fp, "# Selected compression data type\n");
 	fprintf(fp, "\n");
-	fprintf(fp, "data_type = %s\n", data_type2string(cfg->data_type));
+	fprintf(fp, "# RDCU compression configuration\n");
 	fprintf(fp, "\n");
 	fprintf(fp, "#-------------------------------------------------------------------------------\n");
-
-	if (cmp_data_type_is_invalid(cfg->data_type))
-		return;
-
 	fprintf(fp, "# Selected compression mode\n");
 	fprintf(fp, "# 0: raw mode\n");
 	fprintf(fp, "# 1: model mode with zero escape symbol mechanism\n");
@@ -1552,232 +1590,112 @@ static void write_cfg_internal(FILE *fp, const struct cmp_cfg *cfg)
 	fprintf(fp, "# 3: model mode with multi escape symbol mechanism\n");
 	fprintf(fp, "# 4: 1d differencing mode without input model multi escape symbol mechanism\n");
 	fprintf(fp, "\n");
-	fprintf(fp, "cmp_mode = %d\n", cfg->cmp_mode);
+	fprintf(fp, "cmp_mode = %d\n", rcfg->cmp_mode);
 	fprintf(fp, "\n");
 	fprintf(fp, "#-------------------------------------------------------------------------------\n");
 	fprintf(fp, "# Number of samples to compress, length of the data and model buffer\n");
 	fprintf(fp, "\n");
-	fprintf(fp, "samples = %" PRIu32 "\n", cfg->samples);
+	fprintf(fp, "samples = %" PRIu32 "\n", rcfg->samples);
 	fprintf(fp, "\n");
 	fprintf(fp, "#-------------------------------------------------------------------------------\n");
 	fprintf(fp, "# Length of the compressed data buffer in number of samples\n");
 	fprintf(fp, "\n");
-	fprintf(fp, "buffer_length = %" PRIu32 "\n", cfg->buffer_length);
+	fprintf(fp, "buffer_length = %" PRIu32 "\n", rcfg->buffer_length);
 	fprintf(fp, "\n");
 	fprintf(fp, "#-------------------------------------------------------------------------------\n");
 	fprintf(fp, "# Model weighting parameter\n");
 	fprintf(fp, "\n");
-	fprintf(fp, "model_value = %" PRIu32 "\n", cfg->model_value);
+	fprintf(fp, "model_value = %" PRIu32 "\n", rcfg->model_value);
 	fprintf(fp, "\n");
 	fprintf(fp, "#-------------------------------------------------------------------------------\n");
 	fprintf(fp, "# Number of noise bits to be rounded\n");
 	fprintf(fp, "\n");
-	fprintf(fp, "round = %" PRIu32 "\n", cfg->round);
+	fprintf(fp, "round = %" PRIu32 "\n", rcfg->round);
 	fprintf(fp, "\n");
 	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+	fprintf(fp, "# Golomb parameter for dictionary selection\n");
+	fprintf(fp, "\n");
+	fprintf(fp, "golomb_par = %" PRIu32 "\n", rcfg->golomb_par);
+	fprintf(fp, "\n");
 	fprintf(fp, "#-------------------------------------------------------------------------------\n");
-	fprintf(fp, "# Data Type Specific Compression Parameters\n");
-	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+	fprintf(fp, "# Spillover threshold for encoding outliers\n");
+	fprintf(fp, "\n");
+	fprintf(fp, "spill = %" PRIu32 "\n", rcfg->spill);
+	fprintf(fp, "\n");
 	fprintf(fp, "#-------------------------------------------------------------------------------\n");
 
-	if (cmp_imagette_data_type_is_used(cfg->data_type)) {
-		fprintf(fp, "# Golomb parameter for dictionary selection\n");
-		fprintf(fp, "\n");
-		fprintf(fp, "golomb_par = %" PRIu32 "\n", cfg->golomb_par);
-		fprintf(fp, "\n");
-		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		fprintf(fp, "# Spillover threshold for encoding outliers\n");
-		fprintf(fp, "\n");
-		fprintf(fp, "spill = %" PRIu32 "\n", cfg->spill);
-		fprintf(fp, "\n");
-		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-	}
-
-	if (cmp_ap_imagette_data_type_is_used(cfg->data_type)) {
+	if (add_ap_pars) {
+		fprintf(fp, "# Adaptive 1 Golomb parameter\n");
 		fprintf(fp, "\n");
-		fprintf(fp, "# Adaptive 1 Golomb parameter; HW only\n");
-		fprintf(fp, "\n");
-		fprintf(fp, "ap1_golomb_par = %" PRIu32 "\n", cfg->ap1_golomb_par);
+		fprintf(fp, "ap1_golomb_par = %" PRIu32 "\n", rcfg->ap1_golomb_par);
 		fprintf(fp, "\n");
 		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		fprintf(fp, "# Adaptive 1 spillover threshold; HW only\n");
+		fprintf(fp, "# Adaptive 1 spillover threshold\n");
 		fprintf(fp, "\n");
-		fprintf(fp, "ap1_spill = %" PRIu32 "\n", cfg->ap1_spill);
+		fprintf(fp, "ap1_spill = %" PRIu32 "\n", rcfg->ap1_spill);
 		fprintf(fp, "\n");
 		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		fprintf(fp, "# Adaptive 2 Golomb parameter; HW only\n");
+		fprintf(fp, "# Adaptive 2 Golomb parameter\n");
 		fprintf(fp, "\n");
-		fprintf(fp, "ap2_golomb_par = %" PRIu32 "\n", cfg->ap2_golomb_par);
+		fprintf(fp, "ap2_golomb_par = %" PRIu32 "\n", rcfg->ap2_golomb_par);
 		fprintf(fp, "\n");
 		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		fprintf(fp, "# Adaptive 2 spillover threshold; HW only\n");
+		fprintf(fp, "# Adaptive 2 spillover threshold\n");
 		fprintf(fp, "\n");
-		fprintf(fp, "ap2_spill = %" PRIu32 "\n", cfg->ap2_spill);
+		fprintf(fp, "ap2_spill = %" PRIu32 "\n", rcfg->ap2_spill);
 		fprintf(fp, "\n");
 		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		fprintf(fp, "# RDCU data to compress start address, the first data address in the RDCU SRAM; HW only\n");
+		fprintf(fp, "# RDCU data to compress start address, the first data address in the RDCU SRAM\n");
 		fprintf(fp, "\n");
-		fprintf(fp, "rdcu_data_adr = 0x%06"PRIX32"\n", cfg->rdcu_data_adr);
+		fprintf(fp, "rdcu_data_adr = 0x%06"PRIX32"\n", rcfg->rdcu_data_adr);
 		fprintf(fp, "\n");
 		fprintf(fp, "#-------------------------------------------------------------------------------\n");
 		fprintf(fp, "# RDCU model start address, the first model address in the RDCU SRAM\n");
 		fprintf(fp, "\n");
-		fprintf(fp, "rdcu_model_adr = 0x%06"PRIX32"\n", cfg->rdcu_model_adr);
+		fprintf(fp, "rdcu_model_adr = 0x%06"PRIX32"\n", rcfg->rdcu_model_adr);
 		fprintf(fp, "\n");
 		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		fprintf(fp, "# RDCU updated model start address, the address in the RDCU SRAM where the updated model is stored\n");
+		fprintf(fp, "# RDCU updated model start address, the first address in the RDCU SRAM where the\n");
+		fprintf(fp, "# updated model is stored\n");
 		fprintf(fp, "\n");
-		fprintf(fp, "rdcu_new_model_adr = 0x%06"PRIX32"\n", cfg->rdcu_new_model_adr);
+		fprintf(fp, "rdcu_new_model_adr = 0x%06"PRIX32"\n", rcfg->rdcu_new_model_adr);
 		fprintf(fp, "\n");
 		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		fprintf(fp, "# RDCU compressed data start address, the first output data address in the RDCU SRAM\n");
+		fprintf(fp, "# RDCU compressed data start address, the first output data address in the SRAM\n");
 		fprintf(fp, "\n");
-		fprintf(fp, "rdcu_buffer_adr = 0x%06"PRIX32"\n", cfg->rdcu_buffer_adr);
+		fprintf(fp, "rdcu_buffer_adr = 0x%06"PRIX32"\n", rcfg->rdcu_buffer_adr);
 		fprintf(fp, "\n");
 		fprintf(fp, "#-------------------------------------------------------------------------------\n");
 	}
-#if 0
-	if (cmp_aux_data_type_is_used(cfg->data_type)) {
-		fprintf(fp, "# mean compression parameter\n");
-		fprintf(fp, "\n");
-		fprintf(fp, "cmp_par_mean = %" PRIu32 "\n", cfg->cmp_par_mean);
-		fprintf(fp, "\n");
-		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		fprintf(fp, "# mean spillover threshold parameter\n");
-		fprintf(fp, "\n");
-		fprintf(fp, "spill_mean = %" PRIu32 "\n", cfg->spill_mean);
-		fprintf(fp, "\n");
-		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		fprintf(fp, "# variance compression parameter\n");
-		fprintf(fp, "\n");
-		fprintf(fp, "cmp_par_variance = %" PRIu32 "\n", cfg->cmp_par_variance);
-		fprintf(fp, "\n");
-		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		fprintf(fp, "# variance spillover threshold parameter\n");
-		fprintf(fp, "\n");
-		fprintf(fp, "spill_variance = %" PRIu32 "\n", cfg->spill_variance);
-		fprintf(fp, "\n");
-		fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		if (cfg->data_type != DATA_TYPE_OFFSET &&
-		    cfg->data_type != DATA_TYPE_F_CAM_OFFSET) {
-			fprintf(fp, "# outlier pixels number compression parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "cmp_par_pixels_error = %" PRIu32 "\n", cfg->cmp_par_pixels_error);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-			fprintf(fp, "# outlier pixels number spillover threshold parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "spill_pixels_error = %" PRIu32 "\n", cfg->spill_pixels_error);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		}
-	}
-#endif
-
-	if (cmp_fx_cob_data_type_is_used(cfg->data_type)) {
-		struct fx_cob_par needed_pars;
-
-		cmp_cfg_fx_cob_get_need_pars(cfg->data_type, &needed_pars);
-
-		if (needed_pars.exp_flags) {
-			fprintf(fp, "# exposure flags compression parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "cmp_par_exp_flags = %" PRIu32 "\n", cfg->cmp_par_exp_flags);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-			fprintf(fp, "# exposure flags spillover threshold parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "spill_exp_flags = %" PRIu32 "\n", cfg->spill_exp_flags);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		}
-		if (needed_pars.fx) {
-			fprintf(fp, "# normal light flux compression parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "cmp_par_fx = %" PRIu32 "\n", cfg->cmp_par_fx);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-			fprintf(fp, "# normal light flux spillover threshold parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "spill_fx = %" PRIu32 "\n", cfg->spill_fx);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		}
-		if (needed_pars.ncob) {
-			fprintf(fp, "# normal center of brightness compression parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "cmp_par_ncob = %" PRIu32 "\n", cfg->cmp_par_ncob);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-			fprintf(fp, "# normal center of brightness spillover threshold parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "spill_nocb = %" PRIu32 "\n", cfg->spill_ncob);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		}
-		if (needed_pars.efx) {
-			fprintf(fp, "# extended light flux compression parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "cmp_par_efx = %" PRIu32 "\n", cfg->cmp_par_efx);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-			fprintf(fp, "# extended light flux spillover threshold parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "spill_efx = %" PRIu32 "\n", cfg->spill_efx);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		}
-		if (needed_pars.ecob) {
-			fprintf(fp, "# extended center of brightness compression parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "cmp_par_ecob = %" PRIu32 "\n", cfg->cmp_par_ecob);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-			fprintf(fp, "# extended center of brightness spillover threshold parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "spill_ecob = %" PRIu32 "\n", cfg->spill_ecob);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		}
-		if (needed_pars.fx_cob_variance) {
-			fprintf(fp, "# flux/COB variance compression parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "cmp_par_fx_cob_variance = %" PRIu32 "\n", cfg->cmp_par_fx_cob_variance);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-			fprintf(fp, "# flux/COB variance  spillover threshold parameter\n");
-			fprintf(fp, "\n");
-			fprintf(fp, "spill_fx_cob_variance = %" PRIu32 "\n", cfg->spill_fx_cob_variance);
-			fprintf(fp, "\n");
-			fprintf(fp, "#-------------------------------------------------------------------------------\n");
-		}
-	}
 }
 
 
 /**
  * @brief prints config struct
  *
- * @param cfg		configuration to print
+ * @param rcfg		pointer to a RDCU configuration to print
+ * @param add_ap_pars	if non-zero write the adaptive RDCU parameter in the file
  */
 
-void cmp_cfg_print(const struct cmp_cfg *cfg)
+void cmp_cfg_print(const struct rdcu_cfg *rcfg, int add_ap_pars)
 {
-	write_cfg_internal(stdout, cfg);
+	write_cfg_internal(stdout, rcfg, add_ap_pars);
 }
 
 
 /**
  * @brief write compression configuration to a file
  *
- * @param cfg		configuration to print
+ * @param rcfg		pointer to a RDCU configuration to print
  * @param output_prefix prefix of the written file (.cfg is added to the prefix)
  * @param verbose	print verbose output if not zero
+ * @param add_ap_pars	if non-zero write the adaptive RDCU parameter in the file
  *
  * @returns 0 on success, error otherwise
  */
 
-int cmp_cfg_fo_file(const struct cmp_cfg *cfg, const char *output_prefix, int verbose)
+int cmp_cfg_fo_file(const struct rdcu_cfg *rcfg, const char *output_prefix,
+		    int verbose, int add_ap_pars)
 {
 	FILE *fp = open_file(output_prefix, ".cfg");
 
@@ -1787,12 +1705,12 @@ int cmp_cfg_fo_file(const struct cmp_cfg *cfg, const char *output_prefix, int ve
 		return -1;
 	}
 
-	write_cfg_internal(fp, cfg);
+	write_cfg_internal(fp, rcfg, add_ap_pars);
 
 	fclose(fp);
 
 	if (verbose)
-		cmp_cfg_print(cfg);
+		cmp_cfg_print(rcfg, add_ap_pars);
 
 	return 0;
 }
@@ -1801,16 +1719,17 @@ int cmp_cfg_fo_file(const struct cmp_cfg *cfg, const char *output_prefix, int ve
 /**
  * @brief write a decompression information structure to a file
  *
- * @param info	 compressor information contains information of an executed
- *		 compression
- * @param output_prefix prefix of the written file (.info is added to the prefix)
- * @param rdcu_cfg - if non-zero write additional RDCU parameter in the file
+ * @param info		compressor information contains information of an
+ *			executed compression
+ * @param output_prefix	prefix of the written file (.info is added to the prefix)
+ * @param add_ap_pars	if non-zero write the additional RDCU parameter in the
+ *			file
  *
  * @returns 0 on success, error otherwise
  */
 
 int cmp_info_to_file(const struct cmp_info *info, const char *output_prefix,
-		     int rdcu_cfg)
+		     int add_ap_pars)
 {
 	FILE *fp = open_file(output_prefix, ".info");
 
@@ -1864,7 +1783,7 @@ int cmp_info_to_file(const struct cmp_info *info, const char *output_prefix,
 	fprintf(fp, "\n");
 	fprintf(fp, "#-------------------------------------------------------------------------------\n");
 
-	if (rdcu_cfg) {
+	if (add_ap_pars) {
 		fprintf(fp, "#-------------------------------------------------------------------------------\n");
 		fprintf(fp, "# Hardware Compressor Settings (not need for SW compression)\n");
 		fprintf(fp, "#-------------------------------------------------------------------------------\n");
@@ -1911,3 +1830,120 @@ int cmp_info_to_file(const struct cmp_info *info, const char *output_prefix,
 
 	return 0;
 }
+
+
+/**
+ * @brief write compression parameters to a stream
+ * @note internal use only!
+ *
+ * @param fp	FILE pointer
+ * @param par	pointer to a compression parameters struct to print
+ */
+
+static void write_cmp_par_internal(FILE *fp, const struct cmp_par *par)
+{
+	if (!fp)
+		return;
+
+	if (!par) {
+		fprintf(fp, "Pointer to the compression parameters is NULL.\n");
+		return;
+	}
+
+
+	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+	fprintf(fp, "\n");
+	fprintf(fp, "# Chunk compression parameters\n");
+	fprintf(fp, "\n");
+	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+
+	fprintf(fp, "cmp_mode = %d\n", par->cmp_mode);
+	fprintf(fp, "model_value = %" PRIu32 "\n", par->model_value);
+	fprintf(fp, "lossy_par = %" PRIu32 "\n", par->lossy_par);
+	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+
+	fprintf(fp, "nc_imagette = %" PRIu32 "\n", par->nc_imagette);
+	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+
+	fprintf(fp, "s_exp_flags = %" PRIu32 "\n", par->s_exp_flags);
+	fprintf(fp, "s_fx = %" PRIu32 "\n", par->s_fx);
+	fprintf(fp, "s_ncob = %" PRIu32 "\n", par->s_ncob);
+	fprintf(fp, "s_efx = %" PRIu32 "\n", par->s_efx);
+	fprintf(fp, "s_ecob = %" PRIu32 "\n", par->s_ecob);
+	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+
+	fprintf(fp, "l_exp_flags = %" PRIu32 "\n", par->l_exp_flags);
+	fprintf(fp, "l_fx = %" PRIu32 "\n", par->l_fx);
+	fprintf(fp, "l_ncob = %" PRIu32 "\n", par->l_ncob);
+	fprintf(fp, "l_efx = %" PRIu32 "\n", par->l_efx);
+	fprintf(fp, "l_ecob = %" PRIu32 "\n", par->l_ecob);
+	fprintf(fp, "l_fx_cob_variance = %" PRIu32 "\n", par->l_fx_cob_variance);
+	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+
+	fprintf(fp, "saturated_imagette = %" PRIu32 "\n", par->saturated_imagette);
+	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+
+	fprintf(fp, "nc_offset_mean = %" PRIu32 "\n", par->nc_offset_mean);
+	fprintf(fp, "nc_offset_variance = %" PRIu32 "\n", par->nc_offset_variance);
+	fprintf(fp, "nc_background_mean = %" PRIu32 "\n", par->nc_background_mean);
+	fprintf(fp, "nc_background_variance = %" PRIu32 "\n", par->nc_background_variance);
+	fprintf(fp, "nc_background_outlier_pixels = %" PRIu32 "\n", par->nc_background_outlier_pixels);
+	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+
+	fprintf(fp, "smearing_mean = %" PRIu32 "\n", par->smearing_mean);
+	fprintf(fp, "smearing_variance_mean = %" PRIu32 "\n", par->smearing_variance_mean);
+	fprintf(fp, "smearing_outlier_pixels = %" PRIu32 "\n", par->smearing_outlier_pixels);
+	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+
+	fprintf(fp, "fc_imagette = %" PRIu32 "\n", par->fc_imagette);
+	fprintf(fp, "fc_offset_mean = %" PRIu32 "\n", par->fc_offset_mean);
+	fprintf(fp, "fc_offset_variance = %" PRIu32 "\n", par->fc_offset_variance);
+	fprintf(fp, "fc_background_mean = %" PRIu32 "\n", par->fc_background_mean);
+	fprintf(fp, "fc_background_variance = %" PRIu32 "\n", par->fc_background_variance);
+	fprintf(fp, "fc_background_outlier_pixels = %" PRIu32 "\n", par->fc_background_outlier_pixels);
+	fprintf(fp, "#-------------------------------------------------------------------------------\n");
+}
+
+
+/**
+ * @brief prints cmp_par struct
+ *
+ * @param par	pointer to a compression parameters struct to print
+ */
+
+void cmp_par_print(const struct cmp_par *par)
+{
+	write_cmp_par_internal(stdout, par);
+}
+
+
+/**
+ * @brief write the compression parameters to a file
+ *
+ * @param par		pointer to a compression parameters struct
+ * @param output_prefix	prefix of the written file (.par is added to the prefix)
+ * @param verbose	print verbose output if not zero
+ *
+ * @returns 0 on success, error otherwise
+ */
+
+int cmp_par_fo_file(const struct cmp_par *par, const char *output_prefix,
+		    int verbose)
+{
+	FILE *fp = open_file(output_prefix, ".par");
+
+	if (fp == NULL) {
+		fprintf(stderr, "%s: %s%s: %s\n", PROGRAM_NAME, output_prefix,
+			".cfg", strerror(errno));
+		return -1;
+	}
+
+	write_cmp_par_internal(fp, par);
+
+	fclose(fp);
+
+	if (verbose)
+		cmp_par_print(par);
+
+	return 0;
+}
diff --git a/programs/cmp_io.h b/programs/cmp_io.h
index c1f4e86f80d9f12e47c0662d7e97ab3fa0cea575..0d2540c5e4366bd83613d2b85bc53b611bb4fb74 100644
--- a/programs/cmp_io.h
+++ b/programs/cmp_io.h
@@ -38,13 +38,22 @@
 #define CMP_IO_VERBOSE 0x2
 #define CMP_IO_VERBOSE_EXTRA 0x4
 
+
+enum cmp_type {
+	CMP_TYPE_RDCU,
+	CMP_TYPE_CHUNK,
+	CMP_TYPE_ERROR = -1
+};
+
+
 void print_help(const char *program_name);
 
-int cmp_cfg_read(const char *file_name, struct cmp_cfg *cfg, struct cmp_par *par, int verbose_en);
+enum cmp_type cmp_cfg_read(const char *file_name, struct rdcu_cfg *rcfg,
+			   struct cmp_par *par, int verbose_en);
 int cmp_info_read(const char *file_name, struct cmp_info *info, int verbose_en);
 
 ssize_t read_file8(const char *file_name, uint8_t *buf, uint32_t buf_size, int flags);
-ssize_t read_file_data(const char *file_name, enum cmp_data_type data_type,
+ssize_t read_file_data(const char *file_name, enum cmp_type cmp_type,
 		       void *buf, uint32_t buf_size, int flags);
 ssize_t read_file_cmp_entity(const char *file_name, struct cmp_entity *ent,
 			     uint32_t ent_size, int flags);
@@ -53,16 +62,22 @@ uint32_t cmp_tool_gen_version_id(const char *version);
 
 int write_data_to_file(const void *buf, uint32_t buf_size, const char *output_prefix,
 		       const char *name_extension, int flags);
-int write_input_data_to_file(const void *data, uint32_t data_size, enum cmp_data_type data_type,
+int write_input_data_to_file(const void *data, uint32_t data_size, enum cmp_type cmp_type,
 			     const char *output_prefix, const char *name_extension, int flags);
-int cmp_info_to_file(const struct cmp_info *info, const char *output_prefix, int rdcu_cfg);
-int cmp_cfg_fo_file(const struct cmp_cfg *cfg, const char *output_prefix, int verbose);
-void cmp_cfg_print(const struct cmp_cfg *cfg);
+int cmp_cfg_fo_file(const struct rdcu_cfg *rcfg, const char *output_prefix,
+		    int verbose, int add_ap_pars);
+int cmp_info_to_file(const struct cmp_info *info, const char *output_prefix,
+		     int add_ap_pars);
+int cmp_par_fo_file(const struct cmp_par *par, const char *output_prefix,
+		    int verbose);
+void cmp_cfg_print(const struct rdcu_cfg *rcfg, int add_ap_pars);
+void cmp_par_print(const struct cmp_par *par);
 
 int atoui32(const char *dep_str, const char *val_str, uint32_t *red_val);
 int cmp_mode_parse(const char *cmp_mode_str, enum cmp_mode *cmp_mode);
 
 enum cmp_data_type string2data_type(const char *data_type_str);
 const char *data_type2string(enum cmp_data_type data_type);
+int case_insensitive_compare(const char *s1, const char *s2);
 
 #endif /* CMP_IO_H */
diff --git a/programs/cmp_tool.c b/programs/cmp_tool.c
index fc608b2d888436891c0c97540e4e000c0a942419..bae19f9d93878f1a37552b06ece78c03c4a6840d 100644
--- a/programs/cmp_tool.c
+++ b/programs/cmp_tool.c
@@ -19,48 +19,70 @@
  * @see Data Compression User Manual PLATO-UVIE-PL-UM-0001
  */
 
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <limits.h>
+#include <string.h>
+#include <errno.h>
 #include <getopt.h>
 
+#include "cmp_support.h"
 #include "cmp_tool-config.h"
 #include "cmp_io.h"
 #include "cmp_icu.h"
 #include "cmp_chunk.h"
-#include "cmp_rdcu.h"
+#include "cmp_rdcu_cfg.h"
 #include "decmp.h"
 #include "cmp_guess.h"
 #include "cmp_entity.h"
 #include "rdcu_pkt_to_file.h"
-#include "cmp_data_types.h"
 
 
 #define BUFFER_LENGTH_DEF_FAKTOR 2
 
 #define DEFAULT_MODEL_ID 53264  /* random default id */
 
+/**
+ * @brief checks if an optional argument is present
+ *
+ * this macro evaluates whether the current argument pointer optarg is null and
+ * if there is a valid argument present at the current index of argv it updates
+ * optarg and increments the index optind if an argument is found it also
+ * ensures that the argument is not null empty or another option
+ *
+ * @return true if an optional argument is present and updates optarg
+ * @see https://stackoverflow.com/a/69177115
+ */
+
+#define OPTIONAL_ARGUMENT_IS_PRESENT \
+	((optarg == NULL \
+	&& optind < argc /* make sure optind is valid */ \
+	&& NULL != argv[optind] /* make sure it's not a null string */ \
+	&& '\0' != argv[optind][0] /* ... or an empty string */ \
+	&& '-' != argv[optind][0]) /* ... or another option */ \
+	? ((optarg = argv[optind++]) != NULL) /* update optind so the next getopt_long invocation skips argv[optind] */ \
+	: (optarg != NULL))
 
-/* parse a data_type option argument */
-static enum cmp_data_type parse_data_type(const char *data_type_str);
 
 /* find a good set of compression parameters for a given dataset */
-static int guess_cmp_pars(struct cmp_cfg *cfg, const char *guess_cmp_mode,
-			  int guess_level);
+static int guess_cmp_pars(struct rdcu_cfg *rcfg, struct cmp_par *chunk_par,
+			  uint32_t input_size, const char *guess_option, const
+			  char *guess_level_str);
 
 /* compress chunk data and write the results to files */
-static int compression_of_chunk(void *chunk, uint32_t size, void *model, struct cmp_par *chunk_par);
+static int compression_of_chunk(const void *chunk, uint32_t size, void *model,
+				const struct cmp_par *chunk_par);
 
 /* compress the data and write the results to files */
-static int compression(struct cmp_cfg *cfg, struct cmp_info *info);
+static int compression_for_rdcu(struct rdcu_cfg *rcfg);
 
 /* decompress the data and write the results in file(s)*/
-static int decompression(struct cmp_entity *ent, uint16_t *input_model_buf);
+static int decompression(const struct cmp_entity *ent, uint16_t *input_model_buf);
 
 /* create a default configuration for a compression data type */
 enum cfg_default_opt {DIFF_CFG, MODEL_CFG};
-static int cmp_cfg_create_default(struct cmp_cfg *cfg, enum cmp_data_type data_type,
-				  enum cfg_default_opt mode);
+static void cmp_cfg_create_default(struct rdcu_cfg *rcfg, enum cfg_default_opt mode);
 
 
 /*
@@ -80,13 +102,13 @@ enum {
 
 static const struct option long_options[] = {
 	{"rdcu_par", no_argument, NULL, 'a'},
-	{"model_cfg", optional_argument, NULL, 'n'},
+	{"model_cfg", no_argument, NULL, 'n'},
 	{"help", no_argument, NULL, 'h'},
 	{"verbose", no_argument, NULL, 'v'},
 	{"version", no_argument, NULL, 'V'},
 	{"rdcu_pkt", no_argument, NULL, RDCU_PKT_OPTION},
-	{"diff_cfg", optional_argument, NULL, DIFF_CFG_OPTION},
-	{"guess", required_argument, NULL, GUESS_OPTION},
+	{"diff_cfg", no_argument, NULL, DIFF_CFG_OPTION},
+	{"guess", optional_argument, NULL, GUESS_OPTION},
 	{"guess_level", required_argument, NULL, GUESS_LEVEL},
 	{"last_info", required_argument, NULL, LAST_INFO},
 	{"no_header", no_argument, NULL, NO_HEADER},
@@ -142,13 +164,13 @@ int main(int argc, char **argv)
 	const char *info_file_name = NULL;
 	const char *data_file_name = NULL;
 	const char *model_file_name = NULL;
-	const char *guess_cmp_mode = NULL;
+	const char *guess_option = NULL;
+	const char *guess_level_str = NULL;
 	const char *program_name = argv[0];
 
 	int cmp_operation = 0;
 	int print_model_cfg = 0;
 	int guess_operation = 0;
-	int guess_level = DEFAULT_GUESS_LEVEL;
 	int print_diff_cfg = 0;
 
 	/* buffer containing all read in compressed data for decompression */
@@ -156,14 +178,12 @@ int main(int argc, char **argv)
 	/* buffer containing the read in model */
 	uint16_t *input_model_buf = NULL;
 	/* size of the data to be compressed and the model of it */
-	uint32_t input_size;
+	uint32_t input_size = 0;
 
-	struct cmp_info info = {0}; /* decompression information struct */
-	struct cmp_cfg cfg = {0}; /* compressor configuration struct */
+	struct cmp_info info = {0}; /* RDCU decompression information struct */
+	struct rdcu_cfg rcfg = {0}; /* RDCU compressor configuration struct */
 	struct cmp_par chunk_par = {0}; /* compressor parameters for chunk compression */
-
-	cfg.data_type = DATA_TYPE_IMAGETTE; /* use imagette as default data type */
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE; /* define max_used_bits default */
+	enum cmp_type cmp_type;
 
 	/* show help if no arguments are provided */
 	if (argc < 2) {
@@ -200,9 +220,6 @@ int main(int argc, char **argv)
 			break;
 		case 'n': /* --model_cfg */
 			print_model_cfg = 1;
-			cfg.data_type = parse_data_type(optarg);
-			if (cfg.data_type == DATA_TYPE_UNKNOWN)
-				exit(EXIT_FAILURE);
 			break;
 		case 'o':
 			output_prefix = optarg;
@@ -218,16 +235,14 @@ int main(int argc, char **argv)
 			break;
 		case DIFF_CFG_OPTION:
 			print_diff_cfg = 1;
-			cfg.data_type = parse_data_type(optarg);
-			if (cfg.data_type == DATA_TYPE_UNKNOWN)
-				exit(EXIT_FAILURE);
 			break;
 		case GUESS_OPTION:
 			guess_operation = 1;
-			guess_cmp_mode = optarg;
+			if (OPTIONAL_ARGUMENT_IS_PRESENT)
+				guess_option = optarg;
 			break;
 		case GUESS_LEVEL:
-			guess_level = atoi(optarg);
+			guess_level_str = optarg;
 			break;
 		case LAST_INFO:
 			last_info_file_name = optarg;
@@ -298,19 +313,17 @@ int main(int argc, char **argv)
 	}
 #endif
 
-	if (print_model_cfg == 1) {
-		if (add_rdcu_pars)
-			cfg.data_type = DATA_TYPE_IMAGETTE_ADAPTIVE;
-		cmp_cfg_create_default(&cfg, cfg.data_type, MODEL_CFG);
-		cmp_cfg_print(&cfg);
-		exit(EXIT_SUCCESS);
-	}
-
-	if (print_diff_cfg == 1) {
-		if (add_rdcu_pars)
-			cfg.data_type = DATA_TYPE_IMAGETTE_ADAPTIVE;
-		cmp_cfg_create_default(&cfg, cfg.data_type, DIFF_CFG);
-		cmp_cfg_print(&cfg);
+	if (print_model_cfg || print_diff_cfg) {
+		if (print_model_cfg && print_diff_cfg) {
+			fprintf(stderr, "%s: Cannot use -n, --model_cfg and -diff_cfg together.\n",
+				PROGRAM_NAME);
+			exit(EXIT_FAILURE);
+		}
+		if (print_model_cfg)
+			cmp_cfg_create_default(&rcfg, MODEL_CFG);
+		else
+			cmp_cfg_create_default(&rcfg, DIFF_CFG);
+		cmp_cfg_print(&rcfg, add_rdcu_pars);
 		exit(EXIT_SUCCESS);
 	}
 
@@ -347,45 +360,45 @@ int main(int argc, char **argv)
 		if (cmp_operation) {
 			printf("## Starting the compression ##\n");
 			printf("Importing configuration file %s ... ", cfg_file_name);
-			error = cmp_cfg_read(cfg_file_name, &cfg, &chunk_par, io_flags & CMP_IO_VERBOSE);
-			if (error)
+			cmp_type = cmp_cfg_read(cfg_file_name, &rcfg, &chunk_par, io_flags & CMP_IO_VERBOSE);
+			if (cmp_type == CMP_TYPE_ERROR)
 				goto fail;
 			printf("DONE\n");
-		} else {
+		} else { /* guess_operation */
 			printf("## Search for a good set of compression parameters ##\n");
+
+			if (guess_option == NULL || !case_insensitive_compare(guess_option, "chunk"))
+				cmp_type = CMP_TYPE_CHUNK;
+			else
+				cmp_type = CMP_TYPE_RDCU;
 		}
 
 		printf("Importing data file %s ... ", data_file_name);
-		/* count the samples in the data file when samples == 0 */
-		if (cfg.data_type != DATA_TYPE_CHUNK) {
-			if (cfg.samples == 0) {
-				int32_t samples;
-
-				size = read_file_data(data_file_name, cfg.data_type, NULL, 0, io_flags);
-				if (size <= 0 || size > UINT32_MAX) /* empty file is treated as an error */
+		if (cmp_type == CMP_TYPE_RDCU) {
+			if (rcfg.samples == 0) {
+				/* count the samples in the data file when samples == 0 */
+				size = read_file_data(data_file_name, cmp_type, NULL, 0, io_flags);
+				if (size <= 0 || size > INT32_MAX || (size_t)size % sizeof(uint16_t)) /* empty file is treated as an error */
 					goto fail;
-				samples = cmp_input_size_to_samples((uint32_t)size, cfg.data_type);
-				if (samples < 0)
-					goto fail;
-				cfg.samples = (uint32_t)samples;
-				printf("\nNo samples parameter set. Use samples = %u.\n... ", cfg.samples);
+				rcfg.samples = (uint32_t)((size_t)size/sizeof(uint16_t));
+				printf("\nNo samples parameter set. Use samples = %u.\n... ", rcfg.samples);
 			}
 
-			input_size = cmp_cal_size_of_data(cfg.samples, cfg.data_type);
+			input_size = rcfg.samples * sizeof(uint16_t);
 		} else {
-			size  = read_file_data(data_file_name, cfg.data_type, NULL, 0, io_flags);
-			if (size <= 0 || size > UINT32_MAX) /* empty file is treated as an error */
+			size  = read_file_data(data_file_name, cmp_type, NULL, 0, io_flags);
+			if (size <= 0 || size > INT32_MAX) /* empty file is treated as an error */
 				goto fail;
 			input_size = (uint32_t)size;
 		}
 
-		cfg.input_buf = malloc(input_size);
-		if (!cfg.input_buf) {
+		rcfg.input_buf = malloc(input_size);
+		if (!rcfg.input_buf) {
 			fprintf(stderr, "%s: Error allocating memory for input data buffer.\n", PROGRAM_NAME);
 			goto fail;
 		}
 
-		size = read_file_data(data_file_name, cfg.data_type, cfg.input_buf,
+		size = read_file_data(data_file_name, cmp_type, rcfg.input_buf,
 				      input_size, io_flags);
 		if (size < 0)
 			goto fail;
@@ -433,7 +446,7 @@ int main(int argc, char **argv)
 
 			printf("Importing compressed data file %s ... ", data_file_name);
 			size = read_file_cmp_entity(data_file_name, NULL, 0, io_flags);
-			if (size < 0 || size > UINT32_MAX)
+			if (size < 0 || size > INT32_MAX)
 				goto fail;
 			/* to be save allocate at least the size of the cmp_entity struct */
 			buf_size = (size_t)size;
@@ -454,22 +467,27 @@ int main(int argc, char **argv)
 				cmp_ent_print(decomp_entity);
 				printf("\n");
 			}
+
 		}
+		if (cmp_ent_get_data_type(decomp_entity) == DATA_TYPE_CHUNK)
+			cmp_type = CMP_TYPE_CHUNK;
+		else
+			cmp_type = CMP_TYPE_RDCU;
+
 		printf("DONE\n");
 	}
 
 	if (model_file_name && !guess_operation &&
-	    ((cmp_operation && !model_mode_is_used(cfg.cmp_mode)) ||
+	    ((cmp_operation && !model_mode_is_used(rcfg.cmp_mode)) ||
 	     (!cmp_operation && !model_mode_is_used(cmp_ent_get_cmp_mode(decomp_entity)))))
 		printf("Warring: Model file (-m option) specified but no model is used.\n");
 
 	/* read in model */
-	if ((cmp_operation && model_mode_is_used(cfg.cmp_mode)) ||
+	if ((cmp_operation && model_mode_is_used(rcfg.cmp_mode)) ||
 	    (!cmp_operation && model_mode_is_used(cmp_ent_get_cmp_mode(decomp_entity))) ||
 	    (guess_operation && model_file_name)) {
 		ssize_t size;
 		uint32_t model_size;
-		enum cmp_data_type data_type;
 
 		printf("Importing model file %s ... ", model_file_name ? model_file_name : "");
 		if (!model_file_name) {
@@ -477,13 +495,11 @@ int main(int argc, char **argv)
 			goto fail;
 		}
 
-		if (cmp_operation || guess_operation) {
-			data_type = cfg.data_type;
+		if (cmp_operation || guess_operation)
 			model_size = input_size;
-		} else {
-			data_type = cmp_ent_get_data_type(decomp_entity);
+		else
 			model_size = cmp_ent_get_original_size(decomp_entity);
-		}
+
 
 		input_model_buf = malloc(model_size);
 		if (!input_model_buf) {
@@ -491,58 +507,52 @@ int main(int argc, char **argv)
 			goto fail;
 		}
 
-		size = read_file_data(model_file_name, data_type, input_model_buf,
+		size = read_file_data(model_file_name, cmp_type, input_model_buf,
 				      model_size, io_flags);
 		if (size < 0)
 			goto fail;
 		printf("DONE\n");
 
-		cfg.model_buf = input_model_buf;
-		cfg.icu_new_model_buf = input_model_buf; /* in-place model update */
+		rcfg.model_buf = input_model_buf;
+		rcfg.icu_new_model_buf = input_model_buf; /* in-place model update */
 	}
 
 	if (guess_operation) {
-		error = guess_cmp_pars(&cfg, guess_cmp_mode, guess_level);
-		if (error)
-			goto fail;
+		error = guess_cmp_pars(&rcfg, &chunk_par, input_size,
+				       guess_option, guess_level_str);
 	} else if (cmp_operation) {
-		if (cfg.data_type == DATA_TYPE_CHUNK)
-			error = compression_of_chunk(cfg.input_buf, input_size,
+		if (cmp_type == CMP_TYPE_CHUNK)
+			error = compression_of_chunk(rcfg.input_buf, input_size,
 						     input_model_buf, &chunk_par);
 		else
-			error = compression(&cfg, &info);
-		if (error)
-			goto fail;
+			error = compression_for_rdcu(&rcfg);
 	} else {
 		error = decompression(decomp_entity, input_model_buf);
-		if (error)
-			goto fail;
 	}
+	if (error)
+		goto fail;
 
 	/* write our the updated model for compressed or decompression */
 	if (!guess_operation &&
-	    ((cmp_operation && model_mode_is_used(cfg.cmp_mode)) ||
+	    ((cmp_operation && model_mode_is_used(rcfg.cmp_mode)) ||
 	    (!cmp_operation && model_mode_is_used(cmp_ent_get_cmp_mode(decomp_entity))))) {
-		enum cmp_data_type data_type = DATA_TYPE_UNKNOWN;
 		uint32_t model_size;
 
 		printf("Write updated model to file %s_upmodel.dat ... ", output_prefix);
-		if (cmp_operation) {
-			data_type = cfg.data_type;
+		if (cmp_operation)
 			model_size = input_size;
-		} else {
-			data_type = cmp_ent_get_data_type(decomp_entity);
+		else
 			model_size = cmp_ent_get_original_size(decomp_entity);
-		}
 
-		error = write_input_data_to_file(input_model_buf, model_size, data_type,
+
+		error = write_input_data_to_file(input_model_buf, model_size, cmp_type,
 						 output_prefix, "_upmodel.dat", io_flags);
 		if (error)
 			goto fail;
 		printf("DONE\n");
 	}
 
-	free(cfg.input_buf);
+	free(rcfg.input_buf);
 	free(decomp_entity);
 	free(input_model_buf);
 
@@ -551,7 +561,7 @@ int main(int argc, char **argv)
 fail:
 	printf("FAILED\n");
 
-	free(cfg.input_buf);
+	free(rcfg.input_buf);
 	free(decomp_entity);
 	free(input_model_buf);
 
@@ -559,76 +569,92 @@ fail:
 }
 
 
-/**
- * @brief parse a data_type option argument
- */
-
-static enum cmp_data_type parse_data_type(const char *data_type_str)
-{
-	/* default data type if no optional argument is used */
-	enum cmp_data_type data_type = DATA_TYPE_IMAGETTE;
-
-	if (data_type_str) {
-		data_type = string2data_type(optarg);
-		if (data_type == DATA_TYPE_UNKNOWN)
-			printf("Do not recognize %s compression data type.\n",
-			       data_type_str);
-	}
-	return data_type;
-}
-
-
 /**
  * @brief find a good set of compression parameters for a given dataset
  */
 
-static int guess_cmp_pars(struct cmp_cfg *cfg, const char *guess_cmp_mode,
-			  int guess_level)
+static int guess_cmp_pars(struct rdcu_cfg *rcfg, struct cmp_par *chunk_par,
+			  uint32_t input_size, const char *guess_option,
+			  const char *guess_level_str)
 {
 	int error;
 	uint32_t cmp_size_bit;
 	double cr;
+	enum cmp_data_type data_type;
+	char *endptr;
+	int guess_level;
+
+	if (guess_level_str) {
+		long number = strtol(guess_level_str, &endptr, 10);
+
+		if (errno != 0 || *endptr != '\0' || number < INT_MIN || number > INT_MAX) {
+			printf("Invalid guess level number: %s\n", guess_level_str);
+			return -1;
+		}
+		guess_level = (int)number;
+	} else {
+		guess_level = DEFAULT_GUESS_LEVEL;
+	}
 
 	printf("Search for a good set of compression parameters (level: %d) ... ", guess_level);
-	if (!strcmp(guess_cmp_mode, "RDCU")) {
+	fflush(stdout);
+	if (!case_insensitive_compare(guess_option, "rdcu")) {
 		if (add_rdcu_pars)
-			cfg->data_type = DATA_TYPE_IMAGETTE_ADAPTIVE;
+			data_type = DATA_TYPE_IMAGETTE_ADAPTIVE;
 		else
-			cfg->data_type = DATA_TYPE_IMAGETTE;
-		if (cfg->model_buf)
-			cfg->cmp_mode = CMP_GUESS_DEF_MODE_MODEL;
+			data_type = DATA_TYPE_IMAGETTE;
+		if (rcfg->model_buf)
+			rcfg->cmp_mode = CMP_GUESS_DEF_MODE_MODEL;
 		else
-			cfg->cmp_mode = CMP_GUESS_DEF_MODE_DIFF;
+			rcfg->cmp_mode = CMP_GUESS_DEF_MODE_DIFF;
+	} else if (!case_insensitive_compare(guess_option, "chunk")) {
+		data_type = DATA_TYPE_CHUNK;
 	} else {
-		cfg->data_type = DATA_TYPE_IMAGETTE; /* TODO*/
-		error = cmp_mode_parse(guess_cmp_mode, &cfg->cmp_mode);
+		data_type = DATA_TYPE_IMAGETTE;
+		error = cmp_mode_parse(guess_option, &rcfg->cmp_mode);
 		if (error) {
-			fprintf(stderr, "%s: Error: unknown compression mode: %s\n", PROGRAM_NAME, guess_cmp_mode);
+			fprintf(stderr, "%s: Error: unknown guess option: %s\n", PROGRAM_NAME, guess_option);
 			return -1;
 		}
 	}
-	if (model_mode_is_used(cfg->cmp_mode) && !cfg->model_buf) {
+	if (model_mode_is_used(rcfg->cmp_mode) && !rcfg->model_buf) {
 		fprintf(stderr, "%s: Error: model mode needs model data (-m option)\n", PROGRAM_NAME);
 		return -1;
 	}
 
-	cmp_size_bit = cmp_guess(cfg, guess_level);
-	if (!cmp_size_bit)
-		return -1;
+	if (data_type == DATA_TYPE_CHUNK) {
+		uint32_t result = cmp_guess_chunk(rcfg->input_buf, input_size,
+					rcfg->model_buf, chunk_par, guess_level);
+
+		if (cmp_is_error(result))
+			return -1;
+		else
+			cmp_size_bit = 8 * result;
+		printf("DONE\n");
 
-	if (include_cmp_header)
-		cmp_size_bit = CHAR_BIT * (cmp_bit_to_byte(cmp_size_bit) +
-			cmp_ent_cal_hdr_size(cfg->data_type, cfg->cmp_mode == CMP_MODE_RAW));
+		printf("Write the guessed compression chunk parameters to file %s.par ... ", output_prefix);
+		error = cmp_par_fo_file(chunk_par, output_prefix, io_flags & CMP_IO_VERBOSE);
+		if (error)
+			return -1;
+	} else {
+		input_size = rcfg->samples * sizeof(uint16_t);
+		cmp_size_bit = cmp_guess(rcfg, guess_level);
+		if (!cmp_size_bit)
+			return -1;
+		if (include_cmp_header)
+			cmp_size_bit = CHAR_BIT * (cmp_bit_to_byte(cmp_size_bit) +
+				cmp_ent_cal_hdr_size(data_type, rcfg->cmp_mode == CMP_MODE_RAW));
+		printf("DONE\n");
 
-	printf("DONE\n");
+		printf("Write the guessed compression configuration to file %s.cfg ... ", output_prefix);
+		error = cmp_cfg_fo_file(rcfg, output_prefix, io_flags & CMP_IO_VERBOSE, add_rdcu_pars);
+		if (error)
+			return -1;
+	}
 
-	printf("Write the guessed compression configuration to file %s.cfg ... ", output_prefix);
-	error = cmp_cfg_fo_file(cfg, output_prefix, io_flags & CMP_IO_VERBOSE);
-	if (error)
-		return -1;
 	printf("DONE\n");
 
-	cr = (8.0 * cmp_cal_size_of_data(cfg->samples, cfg->data_type))/cmp_size_bit;
+	cr = (8.0 * input_size)/cmp_size_bit;
 	printf("Guessed parameters can compress the data with a CR of %.2f.\n", cr);
 
 	return 0;
@@ -639,7 +665,7 @@ static int guess_cmp_pars(struct cmp_cfg *cfg, const char *guess_cmp_mode,
  * @brief generate packets to setup an RDCU compression
  */
 
-static int gen_rdcu_write_pkts(const struct cmp_cfg *cfg)
+static int gen_rdcu_write_pkts(const struct rdcu_cfg *rcfg)
 {
 	int error;
 
@@ -661,13 +687,13 @@ static int gen_rdcu_write_pkts(const struct cmp_cfg *cfg)
 			return -1;
 		}
 
-		error = gen_rdcu_parallel_pkts(cfg, &last_info);
+		error = gen_rdcu_parallel_pkts(rcfg, &last_info);
 		if (error)
 			return -1;
 	}
 
 	/* generation of packets for non-parallel read/write RDCU setup */
-	error = gen_write_rdcu_pkts(cfg);
+	error = gen_write_rdcu_pkts(rcfg);
 	if (error)
 		return -1;
 
@@ -676,66 +702,10 @@ static int gen_rdcu_write_pkts(const struct cmp_cfg *cfg)
 
 
 /**
- * @brief generate the compression information used based on the compression
- *	configuration, to emulate the RDCU behaviour
- *
- * @param cfg		compression configuration struct
- * @param cmp_size_bit	length of the bitstream in bits
- * @param ap1_cmp_size_bit	length of the adaptive 1 bitstream in bits
- * @param ap2_cmp_size_bit	length of the adaptive 2 bitstream in bits
- * @param info		compressor information struct to set the used compression
- *	parameters (can be NULL)
- *
- * @returns 0 on success, error otherwise
- * TODO: set cmp_mode_err, set model_value_err, etc, in error case
+ * return a current PLATO timestamp
  */
 
-static int cmp_gernate_rdcu_info(const struct cmp_cfg *cfg, int cmp_size_bit,
-				 int ap1_cmp_size_bit, int ap2_cmp_size_bit,
-				 struct cmp_info *info)
-{
-	if (!cfg)
-		return -1;
-
-	if (cfg->cmp_mode > UINT8_MAX)
-		return -1;
-
-	if (cfg->round > UINT8_MAX)
-		return -1;
-
-	if (cfg->model_value > UINT8_MAX)
-		return -1;
-
-	if (info) {
-		info->cmp_err = 0;
-		info->cmp_mode_used = (uint8_t)cfg->cmp_mode;
-		info->model_value_used = (uint8_t)cfg->model_value;
-		info->round_used = (uint8_t)cfg->round;
-		info->spill_used = cfg->spill;
-		info->golomb_par_used = cfg->golomb_par;
-		info->samples_used = cfg->samples;
-		info->rdcu_new_model_adr_used = cfg->rdcu_new_model_adr;
-		info->rdcu_cmp_adr_used = cfg->rdcu_buffer_adr;
-		info->ap1_cmp_size = (uint32_t)ap1_cmp_size_bit;
-		info->ap2_cmp_size = (uint32_t)ap2_cmp_size_bit;
-
-		if (cmp_size_bit == CMP_ERROR_SMALL_BUF)
-			/* the icu_output_buf is to small to store the whole bitstream */
-			info->cmp_err |= 1UL << SMALL_BUFFER_ERR_BIT; /* set small buffer error */
-		if (cmp_size_bit < 0)
-			info->cmp_size = 0;
-		else
-			info->cmp_size = (uint32_t)cmp_size_bit;
-
-	}
-	return 0;
-}
-
-
-/**
- * retrun a current PLATO timestamp
- */
-uint64_t return_timestamp(void)
+static uint64_t return_timestamp(void)
 {
 	return cmp_ent_create_timestamp(NULL);
 }
@@ -745,12 +715,13 @@ uint64_t return_timestamp(void)
  * @brief compress chunk data and write the results to files
  */
 
-static int compression_of_chunk(void *chunk, uint32_t size, void *model, struct cmp_par *chunk_par)
+static int compression_of_chunk(const void *chunk, uint32_t size, void *model,
+				const struct cmp_par *chunk_par)
 {
 	uint32_t bound = compress_chunk_cmp_size_bound(chunk, size);
 	uint32_t *cmp_data;
 	uint32_t cmp_size;
-	int error;
+	int error = 0;
 
 	compress_chunk_init(&return_timestamp, cmp_tool_gen_version_id(CMP_TOOL_VERSION));
 
@@ -774,8 +745,7 @@ static int compression_of_chunk(void *chunk, uint32_t size, void *model, struct
 		goto cmp_chunk_fail;
 
 	printf("DONE\nWrite compressed data to file %s.cmp ... ", output_prefix);
-	error = write_data_to_file(cmp_data, (uint32_t)cmp_size, output_prefix,
-				   ".cmp", io_flags);
+	error = write_data_to_file(cmp_data, cmp_size, output_prefix, ".cmp", io_flags);
 
 cmp_chunk_fail:
 	free(cmp_data);
@@ -798,90 +768,81 @@ cmp_chunk_fail:
  * @brief compress the data and write the results to files
  */
 
-static int compression(struct cmp_cfg *cfg, struct cmp_info *info)
+static int compression_for_rdcu(struct rdcu_cfg *rcfg)
 {
-	int cmp_size, error;
-	int ap1_cmp_size = 0, ap2_cmp_size = 0;
+	uint64_t start_time = cmp_ent_create_timestamp(NULL);
+	enum cmp_data_type data_type = add_rdcu_pars ?
+		DATA_TYPE_IMAGETTE_ADAPTIVE : DATA_TYPE_IMAGETTE;
+	uint32_t cmp_size;
+	int error;
 	uint32_t cmp_size_byte, out_buf_size;
 	size_t s;
-	uint64_t start_time = cmp_ent_create_timestamp(NULL);
 	struct cmp_entity *cmp_entity = NULL;
 	void *data_to_write_to_file;
+	struct cmp_info info;
 
-	if (cfg->buffer_length == 0) {
-		cfg->buffer_length = (cfg->samples+1) * BUFFER_LENGTH_DEF_FAKTOR; /* +1 to prevent malloc(0)*/
+	if (rcfg->buffer_length == 0) {
+		rcfg->buffer_length = (rcfg->samples+1) * BUFFER_LENGTH_DEF_FAKTOR; /* +1 to prevent malloc(0)*/
 		printf("No buffer_length parameter set. Use buffer_length = %u as compression buffer size.\n",
-		       cfg->buffer_length);
+		       rcfg->buffer_length);
 	}
 
 	if (rdcu_pkt_mode) {
-		void *tmp = cfg->icu_new_model_buf;
+		void *tmp = rcfg->icu_new_model_buf;
 
-		cfg->icu_new_model_buf = NULL;
+		rcfg->icu_new_model_buf = NULL;
 		printf("Generate compression setup packets ...\n");
-		error = gen_rdcu_write_pkts(cfg);
+		error = gen_rdcu_write_pkts(rcfg);
 		if (error)
 			goto error_cleanup;
 		printf("... DONE\n");
-		cfg->icu_new_model_buf = tmp;
-	}
-	if (add_rdcu_pars) {
-		struct cmp_cfg cfg_cpy = *cfg;
-
-		cfg_cpy.icu_output_buf = NULL;
-		cfg_cpy.icu_new_model_buf = NULL;
-
-		cfg_cpy.golomb_par = cfg_cpy.ap1_golomb_par;
-		cfg_cpy.spill = cfg_cpy.ap1_spill;
-		ap1_cmp_size = icu_compress_data(&cfg_cpy);
-		if (ap1_cmp_size < 0)
-			ap1_cmp_size = 0;
-
-		cfg_cpy.golomb_par = cfg_cpy.ap2_golomb_par;
-		cfg_cpy.spill = cfg_cpy.ap2_spill;
-		ap2_cmp_size = icu_compress_data(&cfg_cpy);
-		if (ap2_cmp_size < 0)
-			ap2_cmp_size = 0;
+		rcfg->icu_new_model_buf = tmp;
 	}
 
 	printf("Compress data ... ");
-
-	out_buf_size = cmp_cal_size_of_data(cfg->buffer_length, cfg->data_type);
+	out_buf_size = rcfg->buffer_length * sizeof(uint16_t);
 	cmp_entity = calloc(1, out_buf_size + sizeof(struct cmp_entity));
 	if (cmp_entity == NULL) {
 		fprintf(stderr, "%s: Error allocating memory for output buffer.\n", PROGRAM_NAME);
 		goto error_cleanup;
 	}
-	s = cmp_ent_create(cmp_entity, cfg->data_type, cfg->cmp_mode == CMP_MODE_RAW, out_buf_size);
+	s = cmp_ent_create(cmp_entity, data_type, rcfg->cmp_mode == CMP_MODE_RAW, out_buf_size);
 	if (!s) {
 		fprintf(stderr, "%s: error occurred while creating the compression entity header.\n", PROGRAM_NAME);
 		goto error_cleanup;
 	}
-	cfg->icu_output_buf = cmp_ent_get_data_buf(cmp_entity);
+	rcfg->icu_output_buf = cmp_ent_get_data_buf(cmp_entity);
 
-	cmp_size = icu_compress_data(cfg);
-	if (cmp_size < 0) {
-		if (cmp_size == CMP_ERROR_SMALL_BUF)
+	cmp_size = compress_like_rdcu(rcfg, &info);
+	if (cmp_is_error(cmp_size)) {
+		if (cmp_get_error_code(cmp_size) == CMP_ERROR_SMALL_BUFFER)
 			fprintf(stderr, "Error: The buffer for the compressed data is too small to hold the compressed data. Try a larger buffer_length parameter.\n");
 		goto error_cleanup;
 	}
 
-	if (!model_counter && model_mode_is_used(cfg->cmp_mode))
+	if (!model_counter && model_mode_is_used(rcfg->cmp_mode))
 		model_counter++;
 
-	s = cmp_ent_build(cmp_entity,  cmp_tool_gen_version_id(CMP_TOOL_VERSION),
-			  start_time, cmp_ent_create_timestamp(NULL), (uint16_t)model_id,
-			  (uint8_t)model_counter, cfg, cmp_size);
+	s = cmp_ent_create(cmp_entity, data_type, rcfg->cmp_mode == CMP_MODE_RAW, cmp_bit_to_byte(cmp_size));
 	if (!s) {
 		fprintf(stderr, "%s: error occurred while creating the compression entity header.\n", PROGRAM_NAME);
 		goto error_cleanup;
 	}
+	error = cmp_ent_set_version_id(cmp_entity, cmp_tool_gen_version_id(CMP_TOOL_VERSION));
+	error |= cmp_ent_set_start_timestamp(cmp_entity, start_time);
+	error |= cmp_ent_set_end_timestamp(cmp_entity, cmp_ent_create_timestamp(NULL));
+	error |= cmp_ent_set_model_id(cmp_entity, model_id);
+	error |= cmp_ent_set_model_counter(cmp_entity, model_counter);
+	error |= cmp_ent_write_rdcu_cmp_pars(cmp_entity, &info, rcfg);
+	if (error) {
+		fprintf(stderr, "%s: error occurred while creating the compression entity header.\n", PROGRAM_NAME);
+		goto error_cleanup;
+	}
+
 	if (include_cmp_header) {
 		data_to_write_to_file = cmp_entity;
 		cmp_size_byte = cmp_ent_get_size(cmp_entity);
 	} else {
-		if (cmp_gernate_rdcu_info(cfg, cmp_size, ap1_cmp_size, ap2_cmp_size, info))
-			goto error_cleanup;
 		data_to_write_to_file = cmp_ent_get_data_buf(cmp_entity);
 		cmp_size_byte = cmp_ent_get_cmp_data_size(cmp_entity);
 	}
@@ -890,7 +851,7 @@ static int compression(struct cmp_cfg *cfg, struct cmp_info *info)
 
 	if (rdcu_pkt_mode) {
 		printf("Generate the read results packets ... ");
-		error = gen_read_rdcu_pkts(info);
+		error = gen_read_rdcu_pkts(&info);
 		if (error)
 			goto error_cleanup;
 		printf("DONE\n");
@@ -906,26 +867,26 @@ static int compression(struct cmp_cfg *cfg, struct cmp_info *info)
 	if (!include_cmp_header) {
 		printf("Write decompression information to file %s.info ... ",
 		       output_prefix);
-		error = cmp_info_to_file(info, output_prefix, add_rdcu_pars);
+		error = cmp_info_to_file(&info, output_prefix, add_rdcu_pars);
 		if (error)
 			goto error_cleanup;
 		printf("DONE\n");
 
 		if (io_flags & CMP_IO_VERBOSE) {
 			printf("\n");
-			print_cmp_info(info);
+			print_cmp_info(&info);
 			printf("\n");
 		}
 	}
 
 	free(cmp_entity);
-	cfg->icu_output_buf = NULL;
+	rcfg->icu_output_buf = NULL;
 
 	return 0;
 
 error_cleanup:
 	free(cmp_entity);
-	cfg->icu_output_buf = NULL;
+	rcfg->icu_output_buf = NULL;
 
 	return -1;
 }
@@ -935,11 +896,12 @@ error_cleanup:
  * @brief decompress the data and write the results in file(s)
  */
 
-static int decompression(struct cmp_entity *ent, uint16_t *input_model_buf)
+static int decompression(const struct cmp_entity *ent, uint16_t *input_model_buf)
 {
 	int error;
 	int decomp_size;
 	uint16_t *decomp_output;
+	enum cmp_type cmp_type;
 
 	printf("Decompress data ... ");
 
@@ -968,7 +930,11 @@ static int decompression(struct cmp_entity *ent, uint16_t *input_model_buf)
 
 	printf("Write decompressed data to file %s.dat ... ", output_prefix);
 
-	error = write_input_data_to_file(decomp_output, (uint32_t)decomp_size, cmp_ent_get_data_type(ent),
+	if (cmp_ent_get_data_type(ent) == DATA_TYPE_CHUNK)
+		cmp_type = CMP_TYPE_CHUNK;
+	else
+		cmp_type = CMP_TYPE_RDCU;
+	error = write_input_data_to_file(decomp_output, (uint32_t)decomp_size, cmp_type,
 					 output_prefix, ".dat", io_flags);
 
 	free(decomp_output);
@@ -985,42 +951,28 @@ static int decompression(struct cmp_entity *ent, uint16_t *input_model_buf)
  * @brief create a default configuration for a compression data type
  */
 
-static int cmp_cfg_create_default(struct cmp_cfg *cfg, enum cmp_data_type data_type,
-				  enum cfg_default_opt mode)
+static void cmp_cfg_create_default(struct rdcu_cfg *rcfg, enum cfg_default_opt mode)
 {
-	if (cmp_data_type_is_invalid(data_type))
-		return -1;
-
-	if (!cfg) /* nothing to do */
-		return 0;
-
-	if (cmp_imagette_data_type_is_used(data_type)) {
-		switch (mode) {
-		case MODEL_CFG:
-			*cfg = rdcu_cfg_create(data_type, CMP_DEF_IMA_MODEL_CMP_MODE,
-					       CMP_DEF_IMA_MODEL_MODEL_VALUE, CMP_DEF_IMA_MODEL_LOSSY_PAR);
-			rdcu_cfg_buffers(cfg, NULL, 0, NULL, CMP_DEF_IMA_MODEL_RDCU_DATA_ADR,
-					 CMP_DEF_IMA_MODEL_RDCU_MODEL_ADR, CMP_DEF_IMA_MODEL_RDCU_UP_MODEL_ADR,
-					 CMP_DEF_IMA_MODEL_RDCU_BUFFER_ADR, 0);
-			rdcu_cfg_imagette(cfg,
-					  CMP_DEF_IMA_MODEL_GOLOMB_PAR, CMP_DEF_IMA_MODEL_SPILL_PAR,
-					  CMP_DEF_IMA_MODEL_AP1_GOLOMB_PAR, CMP_DEF_IMA_MODEL_AP1_SPILL_PAR,
-					  CMP_DEF_IMA_MODEL_AP2_GOLOMB_PAR, CMP_DEF_IMA_MODEL_AP2_SPILL_PAR);
-			break;
-		case DIFF_CFG:
-			*cfg = rdcu_cfg_create(data_type, CMP_DEF_IMA_DIFF_CMP_MODE,
-					       CMP_DEF_IMA_DIFF_MODEL_VALUE, CMP_DEF_IMA_DIFF_LOSSY_PAR);
-			rdcu_cfg_buffers(cfg, NULL, 0, NULL, CMP_DEF_IMA_DIFF_RDCU_DATA_ADR,
-					 CMP_DEF_IMA_DIFF_RDCU_MODEL_ADR, CMP_DEF_IMA_DIFF_RDCU_UP_MODEL_ADR,
-					 CMP_DEF_IMA_DIFF_RDCU_BUFFER_ADR, 0);
-			rdcu_cfg_imagette(cfg,
-					  CMP_DEF_IMA_DIFF_GOLOMB_PAR, CMP_DEF_IMA_DIFF_SPILL_PAR,
-					  CMP_DEF_IMA_DIFF_AP1_GOLOMB_PAR, CMP_DEF_IMA_DIFF_AP1_SPILL_PAR,
-					  CMP_DEF_IMA_DIFF_AP2_GOLOMB_PAR, CMP_DEF_IMA_DIFF_AP2_SPILL_PAR);
-			break;
-		}
+	if (!rcfg) /* nothing to do */
+		return;
+
+	switch (mode) {
+	case MODEL_CFG:
+		rdcu_cfg_create(rcfg, CMP_DEF_IMA_MODEL_CMP_MODE, CMP_DEF_IMA_MODEL_MODEL_VALUE,
+				CMP_DEF_IMA_MODEL_LOSSY_PAR);
+		rdcu_cfg_buffers(rcfg, NULL, 0, NULL, CMP_DEF_IMA_MODEL_RDCU_DATA_ADR,
+				CMP_DEF_IMA_MODEL_RDCU_MODEL_ADR, CMP_DEF_IMA_MODEL_RDCU_UP_MODEL_ADR,
+				CMP_DEF_IMA_MODEL_RDCU_BUFFER_ADR, 0);
+		rdcu_cfg_imagette_default(rcfg);
+		break;
+	case DIFF_CFG:
+		rdcu_cfg_create(rcfg, CMP_DEF_IMA_DIFF_CMP_MODE,
+				CMP_DEF_IMA_DIFF_MODEL_VALUE,
+				CMP_DEF_IMA_DIFF_LOSSY_PAR);
+		rdcu_cfg_buffers(rcfg, NULL, 0, NULL, CMP_DEF_IMA_DIFF_RDCU_DATA_ADR,
+				CMP_DEF_IMA_DIFF_RDCU_MODEL_ADR, CMP_DEF_IMA_DIFF_RDCU_UP_MODEL_ADR,
+				CMP_DEF_IMA_DIFF_RDCU_BUFFER_ADR, 0);
+		rdcu_cfg_imagette_default(rcfg);
+		break;
 	}
-	/* TODO: implement other data types */
-	/* TODO: implement error checks */
-	return 0;
 }
diff --git a/header_pars.c b/programs/header_pars.c
similarity index 100%
rename from header_pars.c
rename to programs/header_pars.c
diff --git a/programs/rdcu_pkt_to_file.c b/programs/rdcu_pkt_to_file.c
index bc8734f6895e5680246488a2fd78ff4e2ca32c2a..cfa7ff82d384110df63f19914f1bfe1810e8b128 100644
--- a/programs/rdcu_pkt_to_file.c
+++ b/programs/rdcu_pkt_to_file.c
@@ -37,14 +37,14 @@
 #include <cmp_rdcu_testing.h>
 
 
-/* Name of directory were the RMAP packages are stored */
+/* Name of the directory where the RMAP packages are stored */
 static char tc_folder_dir[MAX_TC_FOLDER_DIR_LEN] = "TC_FILES";
 
 
 /**
- * @brief set the directory name were the RMAP packages are stored
+ * @brief set the directory name where the RMAP packages are stored
  *
- * @param dir_name	Name of directory were the RMAP packages are stored
+ * @param dir_name	name of the directory where the RMAP packages are stored
  */
 
 void set_tc_folder_dir(const char *dir_name)
@@ -62,7 +62,7 @@ void set_tc_folder_dir(const char *dir_name)
  * @brief return a file to write with the name format dir_name/XXX.tc, where XXX
  *	is n_tc in decimal representation
  *
- * @param dir_name	name of directory were the RMAP packages are stored
+ * @param dir_name	name of the directory where the RMAP packages are stored
  * @param n_tc		number of TC commands
  *
  * @return	pointer to the new file stream
@@ -103,8 +103,8 @@ static FILE *open_file_tc(const char *dir_name, int n_tc)
 
 
 /**
- * @brief Implementation of the rmap_rx function for the rdcu_rmap lib. All
- *	generated packages are write to a file.
+ * @brief implementation of the rmap_rx function for the rdcu_rmap lib, all
+ *	generated packages are written to a file.
  */
 
 static int32_t rmap_tx_to_file(const void *hdr, uint32_t hdr_size,
@@ -242,7 +242,8 @@ static int read_rdcu_pkt_mode_cfg(uint8_t *icu_addr, uint8_t *rdcu_addr,
 
 		if (line[0] == ' ' || line[0] == '\t' || line[0] == '#')
 			continue;
-		if (!strncmp(line, "ICU_ADDR", l = strlen("ICU_ADDR"))) {
+		l = strlen("ICU_ADDR");
+		if (!strncmp(line, "ICU_ADDR", l)) {
 			end = NULL;
 			errno = 0;
 			i = strtoul(line + l, &end, 0);
@@ -255,7 +256,8 @@ static int read_rdcu_pkt_mode_cfg(uint8_t *icu_addr, uint8_t *rdcu_addr,
 			*icu_addr = (uint8_t)i;
 			continue;
 		}
-		if (!strncmp(line, "RDCU_ADDR", l = strlen("RDCU_ADDR"))) {
+		l = strlen("RDCU_ADDR");
+		if (!strncmp(line, "RDCU_ADDR", l)) {
 			end = NULL;
 			errno = 0;
 			i = strtoul(line + l, &end, 0);
@@ -268,7 +270,8 @@ static int read_rdcu_pkt_mode_cfg(uint8_t *icu_addr, uint8_t *rdcu_addr,
 			*rdcu_addr = (uint8_t)i;
 			continue;
 		}
-		if (!strncmp(line, "MTU", l = strlen("MTU"))) {
+		l = strlen("MTU");
+		if (!strncmp(line, "MTU", l)) {
 			end = NULL;
 			errno = 0;
 			i = strtoul(line + l, &end, 0);
@@ -317,23 +320,23 @@ int init_rmap_pkt_to_file(void)
 
 
 /**
- * @brief generate the rmap packets to set up an RDCU compression
+ * @brief generates the RMAP packets to set up an RDCU compression
  * @note note that the initialization function init_rmap_pkt_to_file() must be
  *	executed before
  * @note the configuration of the ICU_ADDR, RDCU_ADDR, MTU settings are in the
  *	.rdcu_pkt_mode_cfg file
  *
- * @param cfg	compressor configuration contains all parameters required for
- *		compression
+ * @param rcfg	RDCU compressor configuration contains all parameters required
+ *		for compression
  *
  * @returns 0 on success, error otherwise
  */
 
-int gen_write_rdcu_pkts(const struct cmp_cfg *cfg)
+int gen_write_rdcu_pkts(const struct rdcu_cfg *rcfg)
 {
 	struct stat st = { 0 };
 
-	if (!cfg)
+	if (!rcfg)
 		return -1;
 
 	/* creating TC_DIR directory if that directory does not exist */
@@ -349,7 +352,7 @@ int gen_write_rdcu_pkts(const struct cmp_cfg *cfg)
 	}
 
 	set_tc_folder_dir(TC_DIR "/compress_data");
-	if (rdcu_compress_data(cfg))
+	if (rdcu_compress_data(rcfg))
 		return -1;
 
 	return 0;
@@ -357,7 +360,7 @@ int gen_write_rdcu_pkts(const struct cmp_cfg *cfg)
 
 
 /**
- * @brief generate the rmap packets to read the result of an RDCU compression
+ * @brief generates the RMAP packets to read the result of an RDCU compression
  * @note note that the initialization function init_rmap_pkt_to_file() must be
  *	executed before
  * @note the configuration of the ICU_ADDR, RDCU_ADDR, MTU settings are in the
@@ -428,7 +431,7 @@ int gen_read_rdcu_pkts(const struct cmp_info *info)
 
 
 /**
- * @brief generate the rmap packets to set up an RDCU compression, read the
+ * @brief generate the RMAP packets to set up an RDCU compression, read the
  *	bitstream and the updated model in parallel to write the data to compressed
  *	and the model and start the compression
  * @note the compressed data are read from cfg->rdcu_buffer_adr with the length
@@ -438,20 +441,20 @@ int gen_read_rdcu_pkts(const struct cmp_info *info)
  * @note the configuration of the ICU_ADDR, RDCU_ADDR, MTU settings are in the
  *	.rdcu_pkt_mode_cfg file
  *
- * @param cfg		compressor configuration contains all parameters required for
- *			compression
+ * @param rcfg		RDCU compressor configuration contains all parameters
+ *			required for compression
  * @param last_info	compression information from the last executed
  *			compression
  *
  * @returns 0 on success, error otherwise
  */
 
-int gen_rdcu_parallel_pkts(const struct cmp_cfg *cfg,
+int gen_rdcu_parallel_pkts(const struct rdcu_cfg *rcfg,
 			   const struct cmp_info *last_info)
 {
 	struct stat st = { 0 };
 
-	if (!cfg)
+	if (!rcfg)
 		return -1;
 
 	/* creating TC_DIR directory if that directory does not exist */
@@ -467,7 +470,7 @@ int gen_rdcu_parallel_pkts(const struct cmp_cfg *cfg,
 	}
 
 	set_tc_folder_dir(TC_DIR "/compress_data_parallel");
-	if (rdcu_compress_data_parallel(cfg, last_info))
+	if (rdcu_compress_data_parallel(rcfg, last_info))
 		return -1;
 
 	return 0;
diff --git a/programs/rdcu_pkt_to_file.h b/programs/rdcu_pkt_to_file.h
index d185e59a2179e933e38dbec1d061e320b183d5ca..7f6b771fa689843570450d3c1ad7738fcfc93867 100644
--- a/programs/rdcu_pkt_to_file.h
+++ b/programs/rdcu_pkt_to_file.h
@@ -37,9 +37,9 @@ int init_rmap_pkt_to_file(void);
 
 void set_tc_folder_dir(const char *dir_name);
 
-int gen_write_rdcu_pkts(const struct cmp_cfg *cfg);
+int gen_write_rdcu_pkts(const struct rdcu_cfg *rcfg);
 int gen_read_rdcu_pkts(const struct cmp_info *info);
-int gen_rdcu_parallel_pkts(const struct cmp_cfg *cfg,
+int gen_rdcu_parallel_pkts(const struct rdcu_cfg *rcfg,
 			   const struct cmp_info *last_info);
 
 #endif /* RDCU_PKT_TO_FILE_H */
diff --git a/test/bench/bench.c b/test/bench/bench.c
index 35854fbe3e0d41dcfd49c37bed715a8e01eaf7b9..c25e6ddeab05dc22cd07a899ff67785af430d04b 100644
--- a/test/bench/bench.c
+++ b/test/bench/bench.c
@@ -45,7 +45,7 @@
 #define TIMELOOP_NANOSEC (1 * 1000000000ULL) /* 1 second */
 #define MB_UNIT 1000000
 
-enum bench_name {MEMCPY_BENCH, CMP_CHUNK_BENCH=32 };
+enum bench_name {MEMCPY_BENCH, CMP_CHUNK_BENCH = 32};
 
 /* TODO: replace with default config? */
 const struct cmp_par DIFF_CMP_PAR = {
@@ -170,8 +170,7 @@ static size_t local_compress_chunk(const void *src, size_t srcSize, const void *
 {
 	struct cmp_par *par = (struct cmp_par *)payload;
 
-	/* FIXME: cast from 'const void *' to 'void *' drops const qualifier */
-	return compress_chunk((void *)src, (uint32_t)srcSize, (void *)model, upmodel,
+	return compress_chunk(src, (uint32_t)srcSize, model, upmodel,
 			      dst, (uint32_t)dstSize, par);
 }
 
@@ -214,6 +213,7 @@ static int bench_mem(unsigned int benchNb, const void *src, size_t srcSize,
 		void *const avoidStrictAliasingPtr = &dstBuff;
 		BMK_benchParams_t bp;
 		BMK_runTime_t bestResult;
+
 		bestResult.sumOfReturn = 0;
 		bestResult.nanoSecPerRun = (double)TIMELOOP_NANOSEC * 2000000000; /* hopefully large enough : must be larger than any potential measurement */
 		CONTROL(tfs != NULL);
@@ -232,7 +232,7 @@ static int bench_mem(unsigned int benchNb, const void *src, size_t srcSize,
 		bp.dstCapacities = &dstBuffSize;
 		bp.blockResults = NULL;
 
-		while(1) {
+		while (1) {
 			BMK_runOutcome_t const bOutcome = BMK_benchTimedFn(tfs, bp);
 			BMK_runTime_t newResult;
 
@@ -261,7 +261,7 @@ static int bench_mem(unsigned int benchNb, const void *src, size_t srcSize,
 
 static int bench_ref_data(void)
 {
-	int i,d, err = -1;
+	int i, d, err = -1;
 	enum {
 		SHORT_CADENCE,
 		NB_DATA_SETS
@@ -295,11 +295,11 @@ static int bench_ref_data(void)
 			data_set_name = "short cadence (1.4MB)";
 
 			/* reference data are stored compressed */
-			decmp_size = decompress_cmp_entiy((void *)ref_short_cadence_1_cmp,
+			decmp_size = decompress_cmp_entiy((const void *)ref_short_cadence_1_cmp,
 							  NULL, NULL, model);
 			CONTROL(decmp_size > 0);
 			size = (size_t)decmp_size;
-			decmp_size = decompress_cmp_entiy((void *)ref_short_cadence_2_cmp,
+			decmp_size = decompress_cmp_entiy((const void *)ref_short_cadence_2_cmp,
 							  model, NULL, data);
 			CONTROL(decmp_size == (int)size);
 
diff --git a/test/bench/benchfn.c b/test/bench/benchfn.c
index d9a746bb9c581187bf266213522fd209ad65e093..7b01db3a018d6e6b99803e7fb95fa1c236cdf954 100644
--- a/test/bench/benchfn.c
+++ b/test/bench/benchfn.c
@@ -37,9 +37,9 @@
 /* *************************************
 *  Debug errors
 ***************************************/
-__extension__
 #if defined(DEBUGLEVEL) && (DEBUGLEVEL >= 1)
 #  include <stdio.h> /* fprintf */
+__extension__
 #  define DISPLAY(...) fprintf(stderr, __VA_ARGS__)
 #  define DEBUGOUTPUT(...)                    \
 	{                                     \
@@ -47,6 +47,7 @@ __extension__
 			DISPLAY(__VA_ARGS__); \
 	}
 #else
+__extension__
 #  define DEBUGOUTPUT(...)
 #endif
 
@@ -95,6 +96,7 @@ size_t BMK_extract_errorResult(BMK_runOutcome_t outcome)
 static BMK_runOutcome_t BMK_runOutcome_error(size_t errorResult)
 {
 	BMK_runOutcome_t b;
+
 	memset(&b, 0, sizeof(b));
 	b.error_tag_never_ever_use_directly = 1;
 	b.error_result_never_ever_use_directly = errorResult;
@@ -104,6 +106,7 @@ static BMK_runOutcome_t BMK_runOutcome_error(size_t errorResult)
 static BMK_runOutcome_t BMK_setValid_runTime(BMK_runTime_t runTime)
 {
 	BMK_runOutcome_t outcome;
+
 	outcome.error_tag_never_ever_use_directly = 0;
 	outcome.internal_never_ever_use_directly = runTime;
 	return outcome;
@@ -119,11 +122,12 @@ static BMK_runOutcome_t BMK_setValid_runTime(BMK_runTime_t runTime)
 BMK_runOutcome_t BMK_benchFunction(BMK_benchParams_t p, unsigned int nbLoops)
 {
 	size_t dstSize = 0;
-	nbLoops += !nbLoops; /* minimum nbLoops is 1 */
 
+	nbLoops += !nbLoops; /* minimum nbLoops is 1 */
 	/* init */
 	{
 		size_t i;
+
 		for (i = 0; i < p.blockCount; i++)
 			memset(p.dstBuffers[i], 0xE5, p.dstCapacities[i]); /* warm up and erase result buffer */
 
@@ -136,6 +140,7 @@ BMK_runOutcome_t BMK_benchFunction(BMK_benchParams_t p, unsigned int nbLoops)
 	{
 		UTIL_time_t const clockStart = UTIL_getTime();
 		unsigned int loopNb, blockNb;
+
 		if (p.initFn != NULL)
 			p.initFn(p.initPayload);
 		for (loopNb = 0; loopNb < nbLoops; loopNb++) {
@@ -154,7 +159,7 @@ BMK_runOutcome_t BMK_benchFunction(BMK_benchParams_t p, unsigned int nbLoops)
 					if ((p.errorFn != NULL) && (p.errorFn(res))) {
 						RETURN_QUIET_ERROR(BMK_runOutcome_error(res),
 							"Function benchmark failed on block %u (of size %u) with error %i",
-							blockNb, (unsigned int)p.srcSizes [blockNb], (int)res);
+							blockNb, (unsigned int)p.srcSizes[blockNb], (int)res);
 					}
 					dstSize += res;
 				}
@@ -164,6 +169,7 @@ BMK_runOutcome_t BMK_benchFunction(BMK_benchParams_t p, unsigned int nbLoops)
 		{
 			PTime const totalTime = UTIL_clockSpanNano(clockStart);
 			BMK_runTime_t rt;
+
 			rt.nanoSecPerRun = (double)totalTime / nbLoops;
 			rt.sumOfReturn = dstSize;
 			return BMK_setValid_runTime(rt);
@@ -185,6 +191,7 @@ struct BMK_timedFnState_s {
 BMK_timedFnState_t *BMK_createTimedFnState(unsigned int total_ms, unsigned int run_ms)
 {
 	BMK_timedFnState_t *const r = (BMK_timedFnState_t *)malloc(sizeof(*r));
+
 	if (r == NULL)
 		return NULL; /* malloc() error */
 	BMK_resetTimedFnState(r, total_ms, run_ms);
@@ -199,13 +206,14 @@ void BMK_freeTimedFnState(BMK_timedFnState_t *state)
 BMK_timedFnState_t *BMK_initStatic_timedFnState(void *buffer, size_t size,
 						unsigned int total_ms, unsigned int run_ms)
 {
-	typedef char check_size [2 * (sizeof(BMK_timedFnState_shell) >= sizeof(struct BMK_timedFnState_s)) - 1]; /* static assert : a compilation failure indicates that BMK_timedFnState_shell is not large enough */
+	typedef char check_size[2 * (sizeof(BMK_timedFnState_shell) >= sizeof(struct BMK_timedFnState_s)) - 1]; /* static assert : a compilation failure indicates that BMK_timedFnState_shell is not large enough */
 	typedef struct {
 		check_size c;
 		BMK_timedFnState_t tfs;
 	} tfs_align; /* force tfs to be aligned at its next best position */
-	size_t const tfs_alignment = offsetof( tfs_align, tfs); /* provides the minimal alignment restriction for BMK_timedFnState_t */
+	size_t const tfs_alignment = offsetof(tfs_align, tfs); /* provides the minimal alignment restriction for BMK_timedFnState_t */
 	BMK_timedFnState_t *const r = (BMK_timedFnState_t *)buffer;
+
 	if (buffer == NULL)
 		return NULL;
 	if (size < sizeof(struct BMK_timedFnState_s))
@@ -268,10 +276,12 @@ BMK_runOutcome_t BMK_benchTimedFn(BMK_timedFnState_t *cont, BMK_benchParams_t p)
 			/* estimate nbLoops for next run to last approximately 1 second */
 			if (loopDuration_ns > ((double)runBudget_ns / 50)) {
 				double const fastestRun_ns = MIN(bestRunTime.nanoSecPerRun, newRunTime.nanoSecPerRun);
+
 				cont->nbLoops = (unsigned int)((double)runBudget_ns / fastestRun_ns) + 1;
 			} else {
 				/* previous run was too short : blindly increase workload by x multiplier */
 				const unsigned int multiplier = 10;
+
 				assert(cont->nbLoops < ((unsigned int)-1) / multiplier); /* avoid overflow */
 				cont->nbLoops *= multiplier;
 			}
@@ -281,9 +291,9 @@ BMK_runOutcome_t BMK_benchTimedFn(BMK_timedFnState_t *cont, BMK_benchParams_t p)
 				assert(completed == 0);
 				continue;
 			} else {
-				if (newRunTime.nanoSecPerRun < bestRunTime.nanoSecPerRun) {
+				if (newRunTime.nanoSecPerRun < bestRunTime.nanoSecPerRun)
 					bestRunTime = newRunTime;
-				}
+
 				completed = 1;
 			}
 		}
diff --git a/test/bench/leon3_grtimer.c b/test/bench/leon3_grtimer.c
index a86d7823bc327dfd133c33434894301aebe97346..2fcf199a17e28f1b36c29fffd03f51dc9c937588 100644
--- a/test/bench/leon3_grtimer.c
+++ b/test/bench/leon3_grtimer.c
@@ -32,7 +32,7 @@
 /**
  * @brief set scaler reload value of the timer block
  * @param rtu a struct grtimer_unit
- *
+ * @param value scaler reload value
  */
 
 void grtimer_set_scaler_reload(struct grtimer_unit *rtu, uint32_t value)
@@ -44,7 +44,6 @@ void grtimer_set_scaler_reload(struct grtimer_unit *rtu, uint32_t value)
 /**
  * @brief get scaler reload value of the timer block
  * @param rtu a struct grtimer_unit
- *
  */
 
 uint32_t grtimer_get_scaler_reload(struct grtimer_unit *rtu)
@@ -190,7 +189,7 @@ void grtimer_clear_restart(struct grtimer_unit *rtu, uint32_t timer)
 
 
 /**
- * @brief set timer to chain to the preceeding timer
+ * @brief set timer to chain to the preceding timer
  * @param rtu a struct grtimer_unit
  * @param timer the selected timer
  */
@@ -207,7 +206,7 @@ void grtimer_set_chained(struct grtimer_unit *rtu, uint32_t timer)
 
 
 /**
- * @brief clear timer to chain to the preceeding timer
+ * @brief clear timer to chain to the preceding timer
  * @param rtu a struct grtimer_unit
  * @param timer the selected timer
  */
diff --git a/test/bench/leon3_grtimer_longcount.c b/test/bench/leon3_grtimer_longcount.c
index 2c95387b74bc4801bc06846279546ed389533d97..c88640457972b41e3b2d1eaf3525901c11f43102 100644
--- a/test/bench/leon3_grtimer_longcount.c
+++ b/test/bench/leon3_grtimer_longcount.c
@@ -100,16 +100,13 @@ void grtimer_longcount_get_uptime(struct grtimer_unit *rtu,
 	t0c = ioread32be(&rtu->timer[0].value);
 	t1c = ioread32be(&rtu->timer[1].value);
 
-	if ((t0a >= t0b) && (t1a >= t1b))
-	  {
-	    t0 = t0a;
-	    t1 = t1a;
-	  }
-	else
-	  {
-	    t0 = t0c;
-	    t1 = t1c;
-	  }
+	if ((t0a >= t0b) && (t1a >= t1b)) {
+		t0 = t0a;
+		t1 = t1a;
+	} else {
+		t0 = t0c;
+		t1 = t1c;
+	}
 
 	r0 = ioread32be(&rtu->timer[0].reload);
 	r1 = ioread32be(&rtu->timer[1].reload);
@@ -120,12 +117,12 @@ void grtimer_longcount_get_uptime(struct grtimer_unit *rtu,
 
 
 /**
- * @brief
- *	get the number of seconds elapsed between timestamps taken from the
+ * @brief get the number of seconds elapsed between timestamps taken from the
  *	longcount timer
  *
- * @bparam time1 a struct grtime_uptime
- * @bparam time0 a struct grtime_uptime
+ * @param rtu a struct grtimer_unit
+ * @param time1 a struct grtime_uptime
+ * @param time0 a struct grtime_uptime
  *
  * @return time difference in seconds represented as double
  */
diff --git a/test/bench/leon3_timers.h b/test/bench/leon3_timers.h
index 907279b23de967fe0d4acbbce6c8b495bc99208a..34445c962d7bc5cce6d3040dea79fb3f05abf0e2 100644
--- a/test/bench/leon3_timers.h
+++ b/test/bench/leon3_timers.h
@@ -26,7 +26,7 @@
 #define LEON3_TIMER_LD	0x00000004U      /* load counter    */
 #define LEON3_TIMER_IE	0x00000008U      /* irq enable      */
 #define LEON3_TIMER_IP	0x00000010U      /* irq pending (clear by writing 0 */
-#define LEON3_TIMER_CH	0x00000020U      /* chain with preceeding timer */
+#define LEON3_TIMER_CH	0x00000020U      /* chain with preceding timer */
 
 #define LEON3_CFG_TIMERS_MASK	0x00000007
 #define LEON3_CFG_IRQNUM_MASK	0x000000f8
diff --git a/test/bench/leon_reg.h b/test/bench/leon_reg.h
index 4bb0e5eb7b4d2de7bc8a84e09e68b2e5e9e58ab3..94ad2a7f95ab0ff2b03504c39e61753416d40536 100644
--- a/test/bench/leon_reg.h
+++ b/test/bench/leon_reg.h
@@ -1,5 +1,5 @@
 /**
- * @file leon/leon_reg.h
+ * @file leon_reg.h
  *
  * @author  Armin Luntzer (armin.luntzer@univie.ac.at)
  * @date    2015
diff --git a/test/bench/timefn.c b/test/bench/timefn.c
index 620f7b05dc15b06327774e5aaf7c2bb5c9198bcc..c73cbd20c032daf152ad52cb93194d3553d22dfa 100644
--- a/test/bench/timefn.c
+++ b/test/bench/timefn.c
@@ -47,7 +47,7 @@ UTIL_time_t UTIL_getTime(void)
 {
 	static struct grtimer_unit *rtu = (struct grtimer_unit *)LEON3_BASE_ADDRESS_GRTIMER;
 	static struct grtimer_uptime start;
-	static int init = 0;
+	static int init;
 
 	if (!init) {
 		int32_t const err = grtimer_longcount_start(rtu, GRTIMER_RELOAD,
@@ -77,7 +77,7 @@ UTIL_time_t UTIL_getTime(void)
 UTIL_time_t UTIL_getTime(void)
 {
 	static LARGE_INTEGER ticksPerSecond;
-	static int init = 0;
+	static int init;
 
 	if (!init) {
 		if (!QueryPerformanceFrequency(&ticksPerSecond)) {
@@ -89,6 +89,7 @@ UTIL_time_t UTIL_getTime(void)
 	{
 		UTIL_time_t r;
 		LARGE_INTEGER x;
+
 		QueryPerformanceCounter(&x);
 		r.t = (PTime)(x.QuadPart * 1000000000ULL / ticksPerSecond.QuadPart);
 		return r;
@@ -102,7 +103,7 @@ UTIL_time_t UTIL_getTime(void)
 UTIL_time_t UTIL_getTime(void)
 {
 	static mach_timebase_info_data_t rate;
-	static int init = 0;
+	static int init;
 
 	if (!init) {
 		mach_timebase_info(&rate);
@@ -110,6 +111,7 @@ UTIL_time_t UTIL_getTime(void)
 	}
 	{
 		UTIL_time_t r;
+
 		r.t = mach_absolute_time() * (PTime)rate.numer /
 		      (PTime)rate.denom;
 		return r;
@@ -136,6 +138,7 @@ UTIL_time_t UTIL_getTime(void)
 	}
 	{
 		UTIL_time_t r;
+
 		r.t = (PTime)time.tv_sec * 1000000000ULL + (PTime)time.tv_nsec;
 		return r;
 	}
@@ -145,11 +148,11 @@ UTIL_time_t UTIL_getTime(void)
  * C11 requires support of timespec_get().
  * However, FreeBSD 11 claims C11 compliance while lacking timespec_get().
  * Double confirm timespec_get() support by checking the definition of TIME_UTC.
- * However, some versions of Android manage to simultanously define TIME_UTC
+ * However, some versions of Android manage to simultaneously define TIME_UTC
  * and lack timespec_get() support...
  */
-#elif (defined(__STDC_VERSION__) &&                \
-       (__STDC_VERSION__ >= 201112L) /* C11 */) && \
+#elif (defined(__STDC_VERSION__) &&			\
+	(__STDC_VERSION__ >= 201112L) /* C11 */) &&	\
 	defined(TIME_UTC) && !defined(__ANDROID__)
 
 #include <stdlib.h> /* abort */
@@ -162,12 +165,14 @@ UTIL_time_t UTIL_getTime(void)
 	 * reason, likely a limitation of timespec_get() for some target
 	 */
 	struct timespec time = { 0, 0 };
+
 	if (timespec_get(&time, TIME_UTC) != TIME_UTC) {
 		perror("timefn::timespec_get(TIME_UTC)");
 		abort();
 	}
 	{
 		UTIL_time_t r;
+
 		r.t = (PTime)time.tv_sec * 1000000000ULL + (PTime)time.tv_nsec;
 		return r;
 	}
@@ -178,6 +183,7 @@ UTIL_time_t UTIL_getTime(void)
 UTIL_time_t UTIL_getTime(void)
 {
 	UTIL_time_t r;
+
 	r.t = (PTime)clock() * 1000000000ULL / CLOCKS_PER_SEC;
 	return r;
 }
@@ -201,12 +207,14 @@ PTime UTIL_getSpanTimeMicro(UTIL_time_t begin, UTIL_time_t end)
 PTime UTIL_clockSpanMicro(UTIL_time_t clockStart)
 {
 	UTIL_time_t const clockEnd = UTIL_getTime();
+
 	return UTIL_getSpanTimeMicro(clockStart, clockEnd);
 }
 
 PTime UTIL_clockSpanNano(UTIL_time_t clockStart)
 {
 	UTIL_time_t const clockEnd = UTIL_getTime();
+
 	return UTIL_getSpanTimeNano(clockStart, clockEnd);
 }
 
@@ -214,6 +222,7 @@ void UTIL_waitForNextTick(void)
 {
 	UTIL_time_t const clockStart = UTIL_getTime();
 	UTIL_time_t clockEnd;
+
 	do {
 		clockEnd = UTIL_getTime();
 	} while (UTIL_getSpanTimeNano(clockStart, clockEnd) == 0);
diff --git a/test/cmp_data_types/test_cmp_data_types.c b/test/cmp_data_types/test_cmp_data_types.c
index ebb858893bca7978215eb7e275ff0cf6f8320e0c..51e8f538fa5cbb0fc9ea988eca51f0b52a0ada18 100644
--- a/test/cmp_data_types/test_cmp_data_types.c
+++ b/test/cmp_data_types/test_cmp_data_types.c
@@ -46,12 +46,12 @@ void test_cmp_col_get_and_set(void)
 	int err;
 	size_t i;
 	struct collection_hdr *col = malloc(sizeof(struct collection_hdr));
-	uint8_t *u8_p = (uint8_t *)col;
+	const uint8_t *u8_p = (const uint8_t *)col;
 	uint64_t timestamp;
 	uint16_t configuration_id, collection_id, collection_length;
 	uint8_t pkt_type, subservice, ccd_id, sequence_num;
 
-	TEST_ASSERT_TRUE(col);
+	TEST_ASSERT_NOT_NULL(col);
 
 	memset(col, 0, sizeof(struct collection_hdr));
 
@@ -141,9 +141,9 @@ void test_cmp_col_get_and_set(void)
 	err = cmp_col_set_data_length(NULL, 0x0A0B);
 	TEST_ASSERT_TRUE(err);
 
-	for (i = 0; i < sizeof(struct collection_hdr); i++) {
+	for (i = 0; i < sizeof(struct collection_hdr); i++)
 		TEST_ASSERT_EQUAL_HEX8(i, u8_p[i]);
-	}
+
 	free(col);
 }
 
@@ -206,92 +206,6 @@ void test_size_of_a_sample(void)
 }
 
 
-/**
- * @test cmp_cal_size_of_data
- */
-
-void test_cmp_cal_size_of_data(void)
-{
-	uint32_t s;
-
-	s = cmp_cal_size_of_data(1, DATA_TYPE_IMAGETTE);
-	TEST_ASSERT_EQUAL_UINT(sizeof(uint16_t), s);
-
-	s = cmp_cal_size_of_data(32, DATA_TYPE_IMAGETTE);
-	TEST_ASSERT_EQUAL_UINT(32 * sizeof(uint16_t), s);
-
-	s = cmp_cal_size_of_data(1, DATA_TYPE_F_FX);
-	TEST_ASSERT_EQUAL_UINT(sizeof(struct f_fx)+COLLECTION_HDR_SIZE, s);
-
-	s = cmp_cal_size_of_data(4, DATA_TYPE_F_FX);
-	TEST_ASSERT_EQUAL_UINT(4*sizeof(struct f_fx)+COLLECTION_HDR_SIZE, s);
-
-	/* error cases */
-	s = cmp_cal_size_of_data(33, DATA_TYPE_UNKNOWN);
-	TEST_ASSERT_EQUAL_UINT(0, s);
-
-	/* overflow tests */
-	s = cmp_cal_size_of_data(0x1999999A, DATA_TYPE_BACKGROUND);
-	TEST_ASSERT_EQUAL_UINT(0, s);
-	s = cmp_cal_size_of_data(0x19999999, DATA_TYPE_BACKGROUND);
-	TEST_ASSERT_EQUAL_UINT(0, s);
-	s = cmp_cal_size_of_data(UINT_MAX, DATA_TYPE_L_FX_EFX_NCOB_ECOB);
-	TEST_ASSERT_EQUAL_UINT(0, s);
-}
-
-
-/**
- * @test cmp_input_size_to_samples
- */
-
-void test_cmp_input_size_to_samples(void)
-{
-	enum cmp_data_type data_type;
-	uint32_t size, samples;
-	int32_t samples_get;
-
-	data_type = DATA_TYPE_IMAGETTE;
-	samples = 42;
-	size = cmp_cal_size_of_data(samples, data_type);
-	samples_get = cmp_input_size_to_samples(size, data_type);
-	TEST_ASSERT_EQUAL(samples, samples_get);
-
-	data_type = DATA_TYPE_IMAGETTE;
-	samples = 0;
-	size = cmp_cal_size_of_data(samples, data_type);
-	samples_get = cmp_input_size_to_samples(size, data_type);
-	TEST_ASSERT_EQUAL(samples, samples_get);
-
-	data_type = DATA_TYPE_S_FX_NCOB;
-	samples = 42;
-	size = cmp_cal_size_of_data(samples, data_type);
-	samples_get = cmp_input_size_to_samples(size, data_type);
-	TEST_ASSERT_EQUAL(samples, samples_get);
-
-	data_type = DATA_TYPE_S_FX_NCOB;
-	samples = 0;
-	size = cmp_cal_size_of_data(samples, data_type);
-	samples_get = cmp_input_size_to_samples(size, data_type);
-	TEST_ASSERT_EQUAL(samples, samples_get);
-
-	/* error cases */
-	data_type = DATA_TYPE_S_FX_NCOB;
-	size = COLLECTION_HDR_SIZE - 1;
-	samples_get = cmp_input_size_to_samples(size, data_type);
-	TEST_ASSERT_EQUAL(-1, samples_get);
-	data_type = DATA_TYPE_S_FX_NCOB;
-
-	size = COLLECTION_HDR_SIZE + 4*sizeof(struct s_fx_ncob) - 1;
-	samples_get = cmp_input_size_to_samples(size, data_type);
-	TEST_ASSERT_EQUAL(-1, samples_get);
-
-	data_type = DATA_TYPE_UNKNOWN;
-	size = 32;
-	samples_get = cmp_input_size_to_samples(size, data_type);
-	TEST_ASSERT_EQUAL(-1, samples_get);
-}
-
-
 static void check_endianness(void *data, uint16_t size, enum cmp_data_type data_type)
 {
 	int error;
@@ -341,7 +255,7 @@ void test_cmp_input_big_to_cpu_endianness(void)
 			struct offset entry[2];
 		} __attribute__((packed)) data = {0};
 		size_t i;
-		uint8_t *p_8 = (uint8_t *)&data;
+		const uint8_t *p_8 = (const uint8_t *)&data;
 
 		data_type = DATA_TYPE_OFFSET;
 
@@ -370,6 +284,27 @@ void test_be_to_cpu_chunk(void)
 {
 	enum cmp_data_type data_type;
 
+	{
+		struct {
+			uint8_t hdr[COLLECTION_HDR_SIZE];
+			uint16_t entry[2];
+		} __attribute__((packed)) data = {0};
+
+		data_type = DATA_TYPE_IMAGETTE;
+		data.entry[0] = 0x0001;
+		data.entry[1] = 0x0203;
+		check_endianness(&data, sizeof(data), data_type);
+
+		data_type = DATA_TYPE_SAT_IMAGETTE;
+		data.entry[0] = 0x0001;
+		data.entry[1] = 0x0203;
+		check_endianness(&data, sizeof(data), data_type);
+
+		data_type = DATA_TYPE_F_CAM_IMAGETTE;
+		data.entry[0] = 0x0001;
+		data.entry[1] = 0x0203;
+		check_endianness(&data, sizeof(data), data_type);
+	}
 	{
 		struct {
 			uint8_t hdr[COLLECTION_HDR_SIZE];
@@ -764,4 +699,34 @@ void test_cmp_input_big_to_cpu_endianness_error_cases(void)
 	data_type = DATA_TYPE_UNKNOWN;
 	error = cmp_input_big_to_cpu_endianness(data, data_size_byte, data_type);
 	TEST_ASSERT_EQUAL(-1, error);
+
+	{ /* test adaptive data types */
+		size_t i;
+		uint16_t data_ap[2];
+
+		data_type = DATA_TYPE_IMAGETTE_ADAPTIVE;
+		data_ap[0] = 0x0001;
+		data_ap[1] = 0x0203;
+		error = cmp_input_big_to_cpu_endianness(data_ap, sizeof(data_ap), data_type);
+		TEST_ASSERT_EQUAL(00, error);
+		for (i = 0; i < sizeof(data_ap); i++)
+			TEST_ASSERT_EQUAL(i, ((uint8_t *)data_ap)[i]);
+
+		data_type = DATA_TYPE_SAT_IMAGETTE_ADAPTIVE;
+		data_ap[0] = 0x0001;
+		data_ap[1] = 0x0203;
+		error = cmp_input_big_to_cpu_endianness(data_ap, sizeof(data_ap), data_type);
+		TEST_ASSERT_EQUAL(00, error);
+		for (i = 0; i < sizeof(data_ap); i++)
+			TEST_ASSERT_EQUAL(i, ((uint8_t *)data_ap)[i]);
+
+		data_type = DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE;
+		data_ap[0] = 0x0001;
+		data_ap[1] = 0x0203;
+		error = cmp_input_big_to_cpu_endianness(data_ap, sizeof(data_ap), data_type);
+		TEST_ASSERT_EQUAL(00, error);
+		for (i = 0; i < sizeof(data_ap); i++)
+			TEST_ASSERT_EQUAL(i, ((uint8_t *)data_ap)[i]);
+	}
+
 }
diff --git a/test/cmp_decmp/test_cmp_decmp.c b/test/cmp_decmp/test_cmp_decmp.c
index 0a9d21ce9c1b4be9a2f726e6c19484a921fbcf90..53e1a0030740837004e0a1064635a679877b07db 100644
--- a/test/cmp_decmp/test_cmp_decmp.c
+++ b/test/cmp_decmp/test_cmp_decmp.c
@@ -23,23 +23,31 @@
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <math.h>
 
 #include <unity.h>
 #include "../test_common/test_common.h"
+#include "../test_common/chunk_round_trip.h"
+#include "cmp_support.h"
 
 #include <cmp_icu.h>
 #include <cmp_chunk.h>
 #include <decmp.h>
 #include <cmp_data_types.h>
+#include <cmp_rdcu_cfg.h>
 #include <leon_inttypes.h>
 #include <byteorder.h>
 #include <cmp_error.h>
-
-#if defined __has_include
-#  if __has_include(<time.h>)
-#    include <time.h>
-#    include <unistd.h>
-#    define HAS_TIME_H 1
+#include <cmp_max_used_bits.h>
+#include <cmp_cal_up_model.h>
+
+#ifndef ICU_ASW
+#  if defined __has_include
+#    if __has_include(<time.h>) && !defined(__sparc__)
+#      include <time.h>
+#      include <unistd.h>
+#      define HAS_TIME_H 1
+#    endif
 #  endif
 #endif
 
@@ -57,7 +65,6 @@ void setUp(void)
 
 #ifdef HAS_TIME_H
 	seed = (uint64_t)(time(NULL) ^ getpid()  ^ (intptr_t)&setUp);
-	seed = 0;
 #else
 	seed = 1;
 #endif
@@ -65,6 +72,7 @@ void setUp(void)
 	if (!n) {
 		uint32_t high = seed >> 32;
 		uint32_t low = seed & 0xFFFFFFFF;
+
 		n = 1;
 		cmp_rand_seed(seed);
 		printf("seed: 0x%08"PRIx32"%08"PRIx32"\n", high, low);
@@ -72,8 +80,72 @@ void setUp(void)
 }
 
 
+/**
+ * @brief generate a geometric distribution (bernoulli trial with probability p)
+ *
+ * prob(k) =  p (1 - p)^k for k = 0, 1, 2, 3, ...
+ *
+ * @param p	probability of geometric distribution (0 < p <= 1)
+ *
+ * @returns random number following a geometric distribution
+ */
+
+static uint32_t cmp_rand_geometric(double p)
+{
+	double u = ldexp(cmp_rand32(), -32); /*see: https://www.pcg-random.org/using-pcg-c-basic.html */
+
+	if (p >= 1.0)
+		return 0;
+
+	return (uint32_t)(log(u) / log(1 - p));
+}
+
+
+/**
+ * @brief generate geometric distribution data with a specified number of bits
+ *
+ * @param n_bits	number of bits for the output (1 <= n_bits <= 32)
+ * @param extra		pointer to a double containing the probability of
+ *			geometric distribution (0 < p <= 1)
+ *
+ * @returns random number following a geometric distribution, masked with n_bits
+ */
+
+static uint32_t gen_geometric_data(uint32_t n_bits, void *extra)
+{
+	double *p = (double *)extra;
+	uint32_t mask;
+
+	TEST_ASSERT(n_bits > 0);
+	TEST_ASSERT(n_bits <= 32);
+	TEST_ASSERT_NOT_NULL(p);
+	TEST_ASSERT(*p > 0);
+	TEST_ASSERT(*p <= 1.0);
+
+	mask = ~0U >> (32 - n_bits);
+	return cmp_rand_geometric(*p) & mask;
+}
+
+
+/**
+ * @brief Generate uniform distribution data with a specified number of bits
+ *
+ * @param n_bits	number of bits for the output (1 <= n_bits <= 32)
+ * @param unused	unused parameter
+ *
+ * @returns random number following a uniform distribution, masked with n_bits
+ */
+
+static uint32_t gen_uniform_data(uint32_t n_bits, void *unused UNUSED)
+{
+	return cmp_rand_nbits(n_bits);
+}
+
+
 static size_t gen_ima_data(uint16_t *data, enum cmp_data_type data_type,
-			   uint32_t samples, const struct cmp_max_used_bits *max_used_bits)
+			   uint32_t samples,
+			   uint32_t (*gen_data_f)(uint32_t max_data_bits, void *extra),
+			   void *extra)
 {
 	uint32_t i;
 
@@ -83,35 +155,35 @@ static size_t gen_ima_data(uint16_t *data, enum cmp_data_type data_type,
 		switch (data_type) {
 		case DATA_TYPE_IMAGETTE:
 		case DATA_TYPE_IMAGETTE_ADAPTIVE:
-			max_data_bits = max_used_bits->nc_imagette;
+			max_data_bits = MAX_USED_BITS.nc_imagette;
 			break;
 		case DATA_TYPE_SAT_IMAGETTE:
 		case DATA_TYPE_SAT_IMAGETTE_ADAPTIVE:
-			max_data_bits = max_used_bits->saturated_imagette;
+			max_data_bits = MAX_USED_BITS.saturated_imagette;
 			break;
 		case DATA_TYPE_F_CAM_IMAGETTE:
 		case DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE:
-			max_data_bits = max_used_bits->fc_imagette;
+			max_data_bits = MAX_USED_BITS.fc_imagette;
 			break;
 		default:
 			TEST_FAIL();
 		}
 		for (i = 0; i < samples; i++)
-			data[i] = (uint16_t)cmp_rand_nbits(max_data_bits);
+			data[i] = (uint16_t)gen_data_f(max_data_bits, extra);
 	}
 	return sizeof(*data) * samples;
 }
 
 
 static size_t gen_nc_offset_data(struct offset *data, uint32_t samples,
-				 const struct cmp_max_used_bits *max_used_bits)
+				 uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].mean = cmp_rand_nbits(max_used_bits->nc_offset_mean);
-			data[i].variance = cmp_rand_nbits(max_used_bits->nc_offset_variance);
+			data[i].mean = gen_data_f(MAX_USED_BITS.nc_offset_mean, extra);
+			data[i].variance = gen_data_f(MAX_USED_BITS.nc_offset_variance, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -119,14 +191,14 @@ static size_t gen_nc_offset_data(struct offset *data, uint32_t samples,
 
 
 static size_t gen_fc_offset_data(struct offset *data, uint32_t samples,
-				 const struct cmp_max_used_bits *max_used_bits)
+				 uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].mean = cmp_rand_nbits(max_used_bits->fc_offset_mean);
-			data[i].variance = cmp_rand_nbits(max_used_bits->fc_offset_variance);
+			data[i].mean = gen_data_f(MAX_USED_BITS.fc_offset_mean, extra);
+			data[i].variance = gen_data_f(MAX_USED_BITS.fc_offset_variance, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -134,15 +206,16 @@ static size_t gen_fc_offset_data(struct offset *data, uint32_t samples,
 
 
 static size_t gen_nc_background_data(struct background *data, uint32_t samples,
-				     const struct cmp_max_used_bits *max_used_bits)
+				     uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].mean = cmp_rand_nbits(max_used_bits->nc_background_mean);
-			data[i].variance = cmp_rand_nbits(max_used_bits->nc_background_variance);
-			data[i].outlier_pixels = (__typeof__(data[i].outlier_pixels))cmp_rand_nbits(max_used_bits->nc_background_outlier_pixels);
+			data[i].mean = gen_data_f(MAX_USED_BITS.nc_background_mean, extra);
+			data[i].variance = gen_data_f(MAX_USED_BITS.nc_background_variance, extra);
+			data[i].outlier_pixels =
+				(__typeof__(data[i].outlier_pixels))gen_data_f(MAX_USED_BITS.nc_background_outlier_pixels, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -150,15 +223,16 @@ static size_t gen_nc_background_data(struct background *data, uint32_t samples,
 
 
 static size_t gen_fc_background_data(struct background *data, uint32_t samples,
-				     const struct cmp_max_used_bits *max_used_bits)
+				     uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].mean = cmp_rand_nbits(max_used_bits->fc_background_mean);
-			data[i].variance = cmp_rand_nbits(max_used_bits->fc_background_variance);
-			data[i].outlier_pixels = (__typeof__(data[i].outlier_pixels))cmp_rand_nbits(max_used_bits->fc_background_outlier_pixels);
+			data[i].mean = gen_data_f(MAX_USED_BITS.fc_background_mean, extra);
+			data[i].variance = gen_data_f(MAX_USED_BITS.fc_background_variance, extra);
+			data[i].outlier_pixels =
+				(__typeof__(data[i].outlier_pixels))gen_data_f(MAX_USED_BITS.fc_background_outlier_pixels, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -166,15 +240,17 @@ static size_t gen_fc_background_data(struct background *data, uint32_t samples,
 
 
 static size_t gen_smearing_data(struct smearing *data, uint32_t samples,
-				const struct cmp_max_used_bits *max_used_bits)
+				uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].mean = cmp_rand_nbits(max_used_bits->smearing_mean);
-			data[i].variance_mean = (__typeof__(data[i].variance_mean))cmp_rand_nbits(max_used_bits->smearing_variance_mean);
-			data[i].outlier_pixels = (__typeof__(data[i].outlier_pixels))cmp_rand_nbits(max_used_bits->smearing_outlier_pixels);
+			data[i].mean = gen_data_f(MAX_USED_BITS.smearing_mean, extra);
+			data[i].variance_mean =
+				(__typeof__(data[i].variance_mean))gen_data_f(MAX_USED_BITS.smearing_variance_mean, extra);
+			data[i].outlier_pixels =
+				(__typeof__(data[i].outlier_pixels))gen_data_f(MAX_USED_BITS.smearing_outlier_pixels, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -182,14 +258,15 @@ static size_t gen_smearing_data(struct smearing *data, uint32_t samples,
 
 
 static size_t gen_s_fx_data(struct s_fx *data, uint32_t samples,
-			    const struct cmp_max_used_bits *max_used_bits)
+			    uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].exp_flags = (__typeof__(data[i].exp_flags))cmp_rand_nbits(max_used_bits->s_exp_flags);
-			data[i].fx = cmp_rand_nbits(max_used_bits->s_fx);
+			data[i].exp_flags =
+				(__typeof__(data[i].exp_flags))gen_data_f(MAX_USED_BITS.s_exp_flags, extra);
+			data[i].fx = gen_data_f(MAX_USED_BITS.s_fx, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -197,15 +274,16 @@ static size_t gen_s_fx_data(struct s_fx *data, uint32_t samples,
 
 
 static size_t gen_s_fx_efx_data(struct s_fx_efx *data, uint32_t samples,
-				const struct cmp_max_used_bits *max_used_bits)
+				uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].exp_flags = (__typeof__(data[i].exp_flags))cmp_rand_nbits(max_used_bits->s_exp_flags);
-			data[i].fx = cmp_rand_nbits(max_used_bits->s_fx);
-			data[i].efx = cmp_rand_nbits(max_used_bits->s_efx);
+			data[i].exp_flags =
+				(__typeof__(data[i].exp_flags))gen_data_f(MAX_USED_BITS.s_exp_flags, extra);
+			data[i].fx = gen_data_f(MAX_USED_BITS.s_fx, extra);
+			data[i].efx = gen_data_f(MAX_USED_BITS.s_efx, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -213,16 +291,17 @@ static size_t gen_s_fx_efx_data(struct s_fx_efx *data, uint32_t samples,
 
 
 static size_t gen_s_fx_ncob_data(struct s_fx_ncob *data, uint32_t samples,
-				 const struct cmp_max_used_bits *max_used_bits)
+				 uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].exp_flags = (__typeof__(data[i].exp_flags))cmp_rand_nbits(max_used_bits->s_exp_flags);
-			data[i].fx = cmp_rand_nbits(max_used_bits->s_fx);
-			data[i].ncob_x = cmp_rand_nbits(max_used_bits->s_ncob);
-			data[i].ncob_y = cmp_rand_nbits(max_used_bits->s_ncob);
+			data[i].exp_flags =
+				(__typeof__(data[i].exp_flags))gen_data_f(MAX_USED_BITS.s_exp_flags, extra);
+			data[i].fx = gen_data_f(MAX_USED_BITS.s_fx, extra);
+			data[i].ncob_x = gen_data_f(MAX_USED_BITS.s_ncob, extra);
+			data[i].ncob_y = gen_data_f(MAX_USED_BITS.s_ncob, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -230,19 +309,20 @@ static size_t gen_s_fx_ncob_data(struct s_fx_ncob *data, uint32_t samples,
 
 
 static size_t gen_s_fx_efx_ncob_ecob_data(struct s_fx_efx_ncob_ecob *data, uint32_t samples,
-					  const struct cmp_max_used_bits *max_used_bits)
+					  uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].exp_flags = (__typeof__(data[i].exp_flags))cmp_rand_nbits(max_used_bits->s_exp_flags);
-			data[i].fx = cmp_rand_nbits(max_used_bits->s_fx);
-			data[i].ncob_x = cmp_rand_nbits(max_used_bits->s_ncob);
-			data[i].ncob_y = cmp_rand_nbits(max_used_bits->s_ncob);
-			data[i].efx = cmp_rand_nbits(max_used_bits->s_efx);
-			data[i].ecob_x = cmp_rand_nbits(max_used_bits->s_ecob);
-			data[i].ecob_y = cmp_rand_nbits(max_used_bits->s_ecob);
+			data[i].exp_flags =
+				(__typeof__(data[i].exp_flags))gen_data_f(MAX_USED_BITS.s_exp_flags, extra);
+			data[i].fx = gen_data_f(MAX_USED_BITS.s_fx, extra);
+			data[i].ncob_x = gen_data_f(MAX_USED_BITS.s_ncob, extra);
+			data[i].ncob_y = gen_data_f(MAX_USED_BITS.s_ncob, extra);
+			data[i].efx = gen_data_f(MAX_USED_BITS.s_efx, extra);
+			data[i].ecob_x = gen_data_f(MAX_USED_BITS.s_ecob, extra);
+			data[i].ecob_y = gen_data_f(MAX_USED_BITS.s_ecob, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -250,26 +330,26 @@ static size_t gen_s_fx_efx_ncob_ecob_data(struct s_fx_efx_ncob_ecob *data, uint3
 
 
 static size_t gen_f_fx_data(struct f_fx *data, uint32_t samples,
-			    const struct cmp_max_used_bits *max_used_bits)
+			    uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data)
 		for (i = 0; i < samples; i++)
-			data[i].fx = cmp_rand_nbits(max_used_bits->f_fx);
+			data[i].fx = gen_data_f(MAX_USED_BITS.f_fx, extra);
 	return sizeof(*data) * samples;
 }
 
 
 static size_t gen_f_fx_efx_data(struct f_fx_efx *data, uint32_t samples,
-				const struct cmp_max_used_bits *max_used_bits)
+				uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].fx = cmp_rand_nbits(max_used_bits->f_fx);
-			data[i].efx = cmp_rand_nbits(max_used_bits->f_efx);
+			data[i].fx = gen_data_f(MAX_USED_BITS.f_fx, extra);
+			data[i].efx = gen_data_f(MAX_USED_BITS.f_efx, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -277,15 +357,15 @@ static size_t gen_f_fx_efx_data(struct f_fx_efx *data, uint32_t samples,
 
 
 static size_t gen_f_fx_ncob_data(struct f_fx_ncob *data, uint32_t samples,
-				 const struct cmp_max_used_bits *max_used_bits)
+				 uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].fx = cmp_rand_nbits(max_used_bits->f_fx);
-			data[i].ncob_x = cmp_rand_nbits(max_used_bits->f_ncob);
-			data[i].ncob_y = cmp_rand_nbits(max_used_bits->f_ncob);
+			data[i].fx = gen_data_f(MAX_USED_BITS.f_fx, extra);
+			data[i].ncob_x = gen_data_f(MAX_USED_BITS.f_ncob, extra);
+			data[i].ncob_y = gen_data_f(MAX_USED_BITS.f_ncob, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -293,18 +373,18 @@ static size_t gen_f_fx_ncob_data(struct f_fx_ncob *data, uint32_t samples,
 
 
 static size_t gen_f_fx_efx_ncob_ecob_data(struct f_fx_efx_ncob_ecob *data, uint32_t samples,
-					  const struct cmp_max_used_bits *max_used_bits)
+					  uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].fx = cmp_rand_nbits(max_used_bits->f_fx);
-			data[i].ncob_x = cmp_rand_nbits(max_used_bits->f_ncob);
-			data[i].ncob_y = cmp_rand_nbits(max_used_bits->f_ncob);
-			data[i].efx = cmp_rand_nbits(max_used_bits->f_efx);
-			data[i].ecob_x = cmp_rand_nbits(max_used_bits->f_ecob);
-			data[i].ecob_y = cmp_rand_nbits(max_used_bits->f_ecob);
+			data[i].fx = gen_data_f(MAX_USED_BITS.f_fx, extra);
+			data[i].ncob_x = gen_data_f(MAX_USED_BITS.f_ncob, extra);
+			data[i].ncob_y = gen_data_f(MAX_USED_BITS.f_ncob, extra);
+			data[i].efx = gen_data_f(MAX_USED_BITS.f_efx, extra);
+			data[i].ecob_x = gen_data_f(MAX_USED_BITS.f_ecob, extra);
+			data[i].ecob_y = gen_data_f(MAX_USED_BITS.f_ecob, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -312,15 +392,15 @@ static size_t gen_f_fx_efx_ncob_ecob_data(struct f_fx_efx_ncob_ecob *data, uint3
 
 
 static size_t gen_l_fx_data(struct l_fx *data, uint32_t samples,
-			    const struct cmp_max_used_bits *max_used_bits)
+			    uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].exp_flags = cmp_rand_nbits(max_used_bits->l_exp_flags);
-			data[i].fx = cmp_rand_nbits(max_used_bits->l_fx);
-			data[i].fx_variance = cmp_rand_nbits(max_used_bits->l_fx_variance);
+			data[i].exp_flags = gen_data_f(MAX_USED_BITS.l_exp_flags, extra);
+			data[i].fx = gen_data_f(MAX_USED_BITS.l_fx, extra);
+			data[i].fx_variance = gen_data_f(MAX_USED_BITS.l_fx_cob_variance, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -328,16 +408,16 @@ static size_t gen_l_fx_data(struct l_fx *data, uint32_t samples,
 
 
 static size_t gen_l_fx_efx_data(struct l_fx_efx *data, uint32_t samples,
-				const struct cmp_max_used_bits *max_used_bits)
+				uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	uint32_t i;
 
 	if (data) {
 		for (i = 0; i < samples; i++) {
-			data[i].exp_flags = cmp_rand_nbits(max_used_bits->l_exp_flags);
-			data[i].fx = cmp_rand_nbits(max_used_bits->l_fx);
-			data[i].efx = cmp_rand_nbits(max_used_bits->l_efx);
-			data[i].fx_variance = cmp_rand_nbits(max_used_bits->l_fx_variance);
+			data[i].exp_flags = gen_data_f(MAX_USED_BITS.l_exp_flags, extra);
+			data[i].fx = gen_data_f(MAX_USED_BITS.l_fx, extra);
+			data[i].efx = gen_data_f(MAX_USED_BITS.l_efx, extra);
+			data[i].fx_variance = gen_data_f(MAX_USED_BITS.l_fx_cob_variance, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -345,19 +425,19 @@ static size_t gen_l_fx_efx_data(struct l_fx_efx *data, uint32_t samples,
 
 
 static size_t gen_l_fx_ncob_data(struct l_fx_ncob *data, uint32_t samples,
-				 const struct cmp_max_used_bits *max_used_bits)
+				 uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	if (data) {
 		uint32_t i;
 
 		for (i = 0; i < samples; i++) {
-			data[i].exp_flags = cmp_rand_nbits(max_used_bits->l_exp_flags);
-			data[i].fx = cmp_rand_nbits(max_used_bits->l_fx);
-			data[i].ncob_x = cmp_rand_nbits(max_used_bits->l_ncob);
-			data[i].ncob_y = cmp_rand_nbits(max_used_bits->l_ncob);
-			data[i].fx_variance = cmp_rand_nbits(max_used_bits->l_fx_variance);
-			data[i].cob_x_variance = cmp_rand_nbits(max_used_bits->l_cob_variance);
-			data[i].cob_y_variance = cmp_rand_nbits(max_used_bits->l_cob_variance);
+			data[i].exp_flags = gen_data_f(MAX_USED_BITS.l_exp_flags, extra);
+			data[i].fx = gen_data_f(MAX_USED_BITS.l_fx, extra);
+			data[i].ncob_x = gen_data_f(MAX_USED_BITS.l_ncob, extra);
+			data[i].ncob_y = gen_data_f(MAX_USED_BITS.l_ncob, extra);
+			data[i].fx_variance = gen_data_f(MAX_USED_BITS.l_fx_cob_variance, extra);
+			data[i].cob_x_variance = gen_data_f(MAX_USED_BITS.l_fx_cob_variance, extra);
+			data[i].cob_y_variance = gen_data_f(MAX_USED_BITS.l_fx_cob_variance, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -365,22 +445,22 @@ static size_t gen_l_fx_ncob_data(struct l_fx_ncob *data, uint32_t samples,
 
 
 static size_t gen_l_fx_efx_ncob_ecob_data(struct l_fx_efx_ncob_ecob *data, uint32_t samples,
-					  const struct cmp_max_used_bits *max_used_bits)
+					  uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	if (data) {
 		uint32_t i;
 
 		for (i = 0; i < samples; i++) {
-			data[i].exp_flags = cmp_rand_nbits(max_used_bits->l_exp_flags);
-			data[i].fx = cmp_rand_nbits(max_used_bits->l_fx);
-			data[i].ncob_x = cmp_rand_nbits(max_used_bits->l_ncob);
-			data[i].ncob_y = cmp_rand_nbits(max_used_bits->l_ncob);
-			data[i].efx = cmp_rand_nbits(max_used_bits->l_efx);
-			data[i].ecob_x = cmp_rand_nbits(max_used_bits->l_ecob);
-			data[i].ecob_y = cmp_rand_nbits(max_used_bits->l_ecob);
-			data[i].fx_variance = cmp_rand_nbits(max_used_bits->l_fx_variance);
-			data[i].cob_x_variance = cmp_rand_nbits(max_used_bits->l_cob_variance);
-			data[i].cob_y_variance = cmp_rand_nbits(max_used_bits->l_cob_variance);
+			data[i].exp_flags = gen_data_f(MAX_USED_BITS.l_exp_flags, extra);
+			data[i].fx = gen_data_f(MAX_USED_BITS.l_fx, extra);
+			data[i].ncob_x = gen_data_f(MAX_USED_BITS.l_ncob, extra);
+			data[i].ncob_y = gen_data_f(MAX_USED_BITS.l_ncob, extra);
+			data[i].efx = gen_data_f(MAX_USED_BITS.l_efx, extra);
+			data[i].ecob_x = gen_data_f(MAX_USED_BITS.l_ecob, extra);
+			data[i].ecob_y = gen_data_f(MAX_USED_BITS.l_ecob, extra);
+			data[i].fx_variance = gen_data_f(MAX_USED_BITS.l_fx_cob_variance, extra);
+			data[i].cob_x_variance = gen_data_f(MAX_USED_BITS.l_fx_cob_variance, extra);
+			data[i].cob_y_variance = gen_data_f(MAX_USED_BITS.l_fx_cob_variance, extra);
 		}
 	}
 	return sizeof(*data) * samples;
@@ -422,14 +502,16 @@ uint32_t generate_random_collection_hdr(struct collection_hdr *col, enum cmp_dat
  *			random collection
  * @param data_type	specifies the compression data type of the test data
  * @param samples	the number of random test data samples to generate
- * @param max_used_bits	pointer to a structure that tracks the maximum number of
- *			bits used
+ * @param gen_data_f	function pointer to a data generation function
+ * @param extra		pointer to additional data required by the data
+ *			generation function
  *
  * @return the size of the generated random collection in bytes
  */
 
 size_t generate_random_collection(struct collection_hdr *col, enum cmp_data_type data_type,
-				  uint32_t samples, const struct cmp_max_used_bits *max_used_bits)
+				  uint32_t samples, uint32_t (*gen_data_f)(uint32_t, void *),
+				  void *extra)
 {
 	size_t size;
 	void *science_data = NULL;
@@ -438,16 +520,6 @@ size_t generate_random_collection(struct collection_hdr *col, enum cmp_data_type
 		science_data = col->entry;
 
 	size = generate_random_collection_hdr(col, data_type, samples);
-#if 0
-	{	int i;
-
-		for (i = 0; i < size_of_a_sample(data_type)*samples; i++) {
-			if (col)
-				col->entry[i] = i;
-		}
-		return size+i;
-	}
-#endif
 
 	switch (data_type) {
 	case DATA_TYPE_IMAGETTE:
@@ -456,59 +528,67 @@ size_t generate_random_collection(struct collection_hdr *col, enum cmp_data_type
 	case DATA_TYPE_SAT_IMAGETTE_ADAPTIVE:
 	case DATA_TYPE_F_CAM_IMAGETTE:
 	case DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE:
-		size += gen_ima_data(science_data, data_type, samples, max_used_bits);
+		size += gen_ima_data(science_data, data_type, samples,
+				     gen_data_f, extra);
 		break;
 	case DATA_TYPE_OFFSET:
-		size += gen_nc_offset_data(science_data, samples, max_used_bits);
+		size += gen_nc_offset_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_BACKGROUND:
-		size += gen_nc_background_data(science_data, samples, max_used_bits);
+		size += gen_nc_background_data(science_data, samples,
+					       gen_data_f, extra);
 		break;
 	case DATA_TYPE_SMEARING:
-		size += gen_smearing_data(science_data, samples, max_used_bits);
+		size += gen_smearing_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_S_FX:
-		size += gen_s_fx_data(science_data, samples, max_used_bits);
+		size += gen_s_fx_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_S_FX_EFX:
-		size += gen_s_fx_efx_data(science_data, samples, max_used_bits);
+		size += gen_s_fx_efx_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_S_FX_NCOB:
-		size += gen_s_fx_ncob_data(science_data, samples, max_used_bits);
+		size += gen_s_fx_ncob_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_S_FX_EFX_NCOB_ECOB:
-		size += gen_s_fx_efx_ncob_ecob_data(science_data, samples, max_used_bits);
+		size += gen_s_fx_efx_ncob_ecob_data(science_data, samples,
+						    gen_data_f, extra);
 		break;
 	case DATA_TYPE_L_FX:
-		size += gen_l_fx_data(science_data, samples, max_used_bits);
+		size += gen_l_fx_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_L_FX_EFX:
-		size += gen_l_fx_efx_data(science_data, samples, max_used_bits);
+		size += gen_l_fx_efx_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_L_FX_NCOB:
-		size += gen_l_fx_ncob_data(science_data, samples, max_used_bits);
+		size += gen_l_fx_ncob_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_L_FX_EFX_NCOB_ECOB:
-		size += gen_l_fx_efx_ncob_ecob_data(science_data, samples, max_used_bits);
+		size += gen_l_fx_efx_ncob_ecob_data(science_data, samples,
+						    gen_data_f, extra);
 		break;
 	case DATA_TYPE_F_FX:
-		size += gen_f_fx_data(science_data, samples, max_used_bits);
+		size += gen_f_fx_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_F_FX_EFX:
-		size += gen_f_fx_efx_data(science_data, samples, max_used_bits);
+		size += gen_f_fx_efx_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_F_FX_NCOB:
-		size += gen_f_fx_ncob_data(science_data, samples, max_used_bits);
+		size += gen_f_fx_ncob_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_F_FX_EFX_NCOB_ECOB:
-		size += gen_f_fx_efx_ncob_ecob_data(science_data, samples, max_used_bits);
+		size += gen_f_fx_efx_ncob_ecob_data(science_data, samples,
+						    gen_data_f, extra);
 		break;
 	case DATA_TYPE_F_CAM_OFFSET:
-		size += gen_fc_offset_data(science_data, samples, max_used_bits);
+		size += gen_fc_offset_data(science_data, samples, gen_data_f, extra);
 		break;
 	case DATA_TYPE_F_CAM_BACKGROUND:
-		size += gen_fc_background_data(science_data, samples, max_used_bits);
+		size += gen_fc_background_data(science_data, samples,
+					       gen_data_f, extra);
 		break;
+	case DATA_TYPE_CHUNK:
+	case DATA_TYPE_UNKNOWN:
 	default:
 		TEST_FAIL();
 	}
@@ -533,14 +613,16 @@ struct chunk_def {
  *			random chunk
  * @param col_array	specifies which collections are contained in the chunk
  * @param array_elements	number of elements in the col_array
- * @param max_used_bits	pointer to a structure that tracks the maximum number of
- *			bits used
+ * @param gen_data_f	function pointer to a data generation function
+ * @param extra		pointer to additional data required by the data
+ *			generation function
  *
  * @return the size of the generated random chunk in bytes
  */
 
-static uint32_t generate_random_chunk(void *chunk, struct chunk_def col_array[], size_t array_elements,
-				    const struct cmp_max_used_bits *max_used_bits)
+static uint32_t generate_random_chunk(void *chunk, struct chunk_def col_array[],
+				      size_t array_elements,
+				      uint32_t (*gen_data_f)(uint32_t, void*), void *extra)
 {
 	size_t i;
 	uint32_t chunk_size = 0;
@@ -551,7 +633,8 @@ static uint32_t generate_random_chunk(void *chunk, struct chunk_def col_array[],
 			col = (struct collection_hdr *)((uint8_t *)chunk + chunk_size);
 
 		chunk_size += generate_random_collection(col, col_array[i].data_type,
-							 col_array[i].samples, max_used_bits);
+							 col_array[i].samples, gen_data_f,
+							 extra);
 	}
 	return chunk_size;
 }
@@ -560,32 +643,17 @@ static uint32_t generate_random_chunk(void *chunk, struct chunk_def col_array[],
 /**
  * @brief generate random compression configuration
  *
- * @param cfg	pointer to a compression configuration
+ * @param rcfg	pointer to a RDCU compression configuration
  */
 
-void generate_random_cmp_cfg(struct cmp_cfg *cfg)
+void generate_random_rdcu_cfg(struct rdcu_cfg *rcfg)
 {
-	if (cmp_imagette_data_type_is_used(cfg->data_type)) {
-		cfg->cmp_par_imagette = cmp_rand_between(MIN_IMA_GOLOMB_PAR, MAX_IMA_GOLOMB_PAR);
-		cfg->ap1_golomb_par = cmp_rand_between(MIN_IMA_GOLOMB_PAR, MAX_IMA_GOLOMB_PAR);
-		cfg->ap2_golomb_par = cmp_rand_between(MIN_IMA_GOLOMB_PAR, MAX_IMA_GOLOMB_PAR);
-		cfg->spill_imagette = cmp_rand_between(MIN_IMA_SPILL, cmp_ima_max_spill(cfg->golomb_par));
-		cfg->ap1_spill = cmp_rand_between(MIN_IMA_SPILL, cmp_ima_max_spill(cfg->ap1_golomb_par));
-		cfg->ap2_spill = cmp_rand_between(MIN_IMA_SPILL, cmp_ima_max_spill(cfg->ap2_golomb_par));
-	} else {
-		cfg->cmp_par_1 = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		cfg->cmp_par_2 = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		cfg->cmp_par_3 = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		cfg->cmp_par_4 = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		cfg->cmp_par_5 = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		cfg->cmp_par_6 = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		cfg->spill_par_1 = cmp_rand_between(MIN_NON_IMA_SPILL, cmp_icu_max_spill(cfg->cmp_par_exp_flags));
-		cfg->spill_par_2 = cmp_rand_between(MIN_NON_IMA_SPILL, cmp_icu_max_spill(cfg->cmp_par_fx));
-		cfg->spill_par_3 = cmp_rand_between(MIN_NON_IMA_SPILL, cmp_icu_max_spill(cfg->cmp_par_ncob));
-		cfg->spill_par_4 = cmp_rand_between(MIN_NON_IMA_SPILL, cmp_icu_max_spill(cfg->cmp_par_efx));
-		cfg->spill_par_5 = cmp_rand_between(MIN_NON_IMA_SPILL, cmp_icu_max_spill(cfg->cmp_par_ecob));
-		cfg->spill_par_6 = cmp_rand_between(MIN_NON_IMA_SPILL, cmp_icu_max_spill(cfg->cmp_par_fx_cob_variance));
-	}
+		rcfg->golomb_par = cmp_rand_between(MIN_IMA_GOLOMB_PAR, MAX_IMA_GOLOMB_PAR);
+		rcfg->ap1_golomb_par = cmp_rand_between(MIN_IMA_GOLOMB_PAR, MAX_IMA_GOLOMB_PAR);
+		rcfg->ap2_golomb_par = cmp_rand_between(MIN_IMA_GOLOMB_PAR, MAX_IMA_GOLOMB_PAR);
+		rcfg->spill = cmp_rand_between(MIN_IMA_SPILL, cmp_ima_max_spill(rcfg->golomb_par));
+		rcfg->ap1_spill = cmp_rand_between(MIN_IMA_SPILL, cmp_ima_max_spill(rcfg->ap1_golomb_par));
+		rcfg->ap2_spill = cmp_rand_between(MIN_IMA_SPILL, cmp_ima_max_spill(rcfg->ap2_golomb_par));
 }
 
 
@@ -597,45 +665,47 @@ void generate_random_cmp_cfg(struct cmp_cfg *cfg)
 
 void generate_random_cmp_par(struct cmp_par *par)
 {
-	if (par) {
-		par->cmp_mode = cmp_rand_between(0, MAX_RDCU_CMP_MODE);
-		par->model_value = cmp_rand_between(0, MAX_MODEL_VALUE);
-		par->lossy_par = cmp_rand_between(0, MAX_ICU_ROUND);
-
-		par->nc_imagette = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-
-		par->s_exp_flags = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->s_fx = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->s_ncob = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->s_efx = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->s_ecob = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-
-		par->l_exp_flags = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->l_fx = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->l_ncob = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->l_efx = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->l_ecob = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->l_fx_cob_variance = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-
-		par->saturated_imagette = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-
-		par->nc_offset_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->nc_offset_variance = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->nc_background_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->nc_background_variance = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->nc_background_outlier_pixels = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-
-		par->smearing_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->smearing_variance_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->smearing_outlier_pixels = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-
-		par->fc_imagette = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->fc_offset_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->fc_offset_variance = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->fc_background_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->fc_background_variance = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-		par->fc_background_outlier_pixels = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
-	}
+	if (!par)
+		return;
+
+	par->cmp_mode = cmp_rand_between(0, MAX_RDCU_CMP_MODE);
+	par->model_value = cmp_rand_between(0, MAX_MODEL_VALUE);
+	par->lossy_par = cmp_rand_between(0, MAX_ICU_ROUND);
+
+	par->nc_imagette = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+
+	par->s_exp_flags = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->s_fx = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->s_ncob = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->s_efx = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->s_ecob = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+
+	par->l_exp_flags = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->l_fx = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->l_ncob = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->l_efx = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->l_ecob = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->l_fx_cob_variance = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+
+	par->saturated_imagette = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+
+	par->nc_offset_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->nc_offset_variance = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->nc_background_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->nc_background_variance = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->nc_background_outlier_pixels = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+
+	par->smearing_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->smearing_variance_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->smearing_outlier_pixels = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+
+	par->fc_imagette = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->fc_offset_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->fc_offset_variance = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->fc_background_mean = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->fc_background_variance = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+	par->fc_background_outlier_pixels = cmp_rand_between(MIN_NON_IMA_GOLOMB_PAR, MAX_NON_IMA_GOLOMB_PAR);
+
 }
 
 
@@ -643,72 +713,62 @@ void generate_random_cmp_par(struct cmp_par *par)
  * @brief compress the given configuration and decompress it afterwards; finally
  *	compare the results
  *
- * @param cfg	pointer to a compression configuration
+ * @param rcfg	pointer to a RDCU compression configuration
  */
 
-void compression_decompression(struct cmp_cfg *cfg)
+void compression_decompression_like_rdcu(struct rdcu_cfg *rcfg)
 {
-	int cmp_size_bits, s, error;
-	uint32_t data_size, cmp_data_size, cmp_ent_size;
+	int s, error;
+	uint32_t cmp_size_bits, data_size, cmp_data_size, cmp_ent_size;
 	struct cmp_entity *ent;
 	void *decompressed_data;
 	static void *model_of_data;
 	void *updated_model = NULL;
+	struct cmp_info info;
 
-	if (!cfg) {
+	if (!rcfg) {
 		free(model_of_data);
 		return;
 	}
 
-	TEST_ASSERT_NOT_NULL(cfg);
+	TEST_ASSERT_NOT_NULL(rcfg);
 
-	TEST_ASSERT_NULL(cfg->icu_output_buf);
+	TEST_ASSERT_NULL(rcfg->icu_output_buf);
 
-	data_size = cmp_cal_size_of_data(cfg->samples, cfg->data_type);
+	data_size = rcfg->samples * sizeof(uint16_t);
+	TEST_ASSERT_NOT_EQUAL_UINT(0, data_size);
 
 	/* create a compression entity */
-	cmp_data_size = cmp_cal_size_of_data(cfg->buffer_length, cfg->data_type);
-	/* cmp_data_size &= ~0x3U; /1* the size of the compressed data should be a multiple of 4 *1/ */
-	TEST_ASSERT_NOT_EQUAL_INT(0, cmp_data_size);
+	cmp_data_size = rcfg->buffer_length * sizeof(uint16_t);
+	TEST_ASSERT_NOT_EQUAL_UINT(0, cmp_data_size);
 
-	cmp_ent_size = cmp_ent_create(NULL, cfg->data_type, cfg->cmp_mode == CMP_MODE_RAW, cmp_data_size);
+	cmp_ent_size = cmp_ent_create(NULL, DATA_TYPE_IMAGETTE, rcfg->cmp_mode == CMP_MODE_RAW, cmp_data_size);
 	TEST_ASSERT_NOT_EQUAL_UINT(0, cmp_ent_size);
 	ent = malloc(cmp_ent_size); TEST_ASSERT_TRUE(ent);
-	cmp_ent_size = cmp_ent_create(ent, cfg->data_type, cfg->cmp_mode == CMP_MODE_RAW, cmp_data_size);
+	cmp_ent_size = cmp_ent_create(ent, DATA_TYPE_IMAGETTE, rcfg->cmp_mode == CMP_MODE_RAW, cmp_data_size);
 	TEST_ASSERT_NOT_EQUAL_UINT(0, cmp_ent_size);
 
 	/* we put the compressed data direct into the compression entity */
-	cfg->icu_output_buf = cmp_ent_get_data_buf(ent);
-	TEST_ASSERT_NOT_NULL(cfg->icu_output_buf);
+	rcfg->icu_output_buf = cmp_ent_get_data_buf(ent);
+	TEST_ASSERT_NOT_NULL(rcfg->icu_output_buf);
 
 	/* now compress the data */
-	cmp_size_bits = icu_compress_data(cfg);
-
-	TEST_ASSERT(cmp_size_bits > 0);
+	cmp_size_bits = compress_like_rdcu(rcfg, &info);
+	TEST_ASSERT(!cmp_is_error(cmp_size_bits));
 
 	/* put the compression parameters in the entity header */
-	{
-		/* mock values */
-		uint32_t version_id = ~0U;
-		uint64_t start_time = 32;
-		uint64_t end_time = 42;
-		uint16_t model_id = 0xCAFE;
-		uint8_t model_counter = 0;
-		uint32_t ent_size;
-
-		ent_size = cmp_ent_build(ent, version_id, start_time, end_time,
-					 model_id, model_counter, cfg, cmp_size_bits);
-		TEST_ASSERT_NOT_EQUAL_UINT(0, ent_size);
-		error = cmp_ent_set_size(ent, ent_size);
-		TEST_ASSERT_FALSE(error);
-	}
+	cmp_ent_size = cmp_ent_create(ent, DATA_TYPE_IMAGETTE, rcfg->cmp_mode == CMP_MODE_RAW,
+				      cmp_bit_to_byte(cmp_size_bits));
+	TEST_ASSERT_NOT_EQUAL_UINT(0, cmp_ent_size);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, rcfg);
+	TEST_ASSERT_FALSE(error);
 
 	/* allocate the buffers for decompression */
 	TEST_ASSERT_NOT_EQUAL_INT(0, data_size);
 	s = decompress_cmp_entiy(ent, model_of_data, NULL, NULL);
 	decompressed_data = malloc((size_t)s); TEST_ASSERT_NOT_NULL(decompressed_data);
 
-	if (model_mode_is_used(cfg->cmp_mode)) {
+	if (model_mode_is_used(rcfg->cmp_mode)) {
 		updated_model = malloc(data_size);
 		TEST_ASSERT_NOT_NULL(updated_model);
 	}
@@ -716,12 +776,12 @@ void compression_decompression(struct cmp_cfg *cfg)
 	/* now we try to decompress the data */
 	s = decompress_cmp_entiy(ent, model_of_data, updated_model, decompressed_data);
 	TEST_ASSERT_EQUAL_INT(data_size, s);
-	TEST_ASSERT_FALSE(memcmp(decompressed_data, cfg->input_buf, data_size));
+	TEST_ASSERT_FALSE(memcmp(decompressed_data, rcfg->input_buf, data_size));
 
-	if (model_mode_is_used(cfg->cmp_mode)) {
+	if (model_mode_is_used(rcfg->cmp_mode)) {
 		TEST_ASSERT_NOT_NULL(updated_model);
 		TEST_ASSERT_NOT_NULL(model_of_data);
-		TEST_ASSERT_FALSE(memcmp(updated_model, cfg->icu_new_model_buf, data_size));
+		TEST_ASSERT_FALSE(memcmp(updated_model, rcfg->icu_new_model_buf, data_size));
 		memcpy(model_of_data, updated_model, data_size);
 	} else { /* non-model mode */
 		/* reset model */
@@ -730,7 +790,7 @@ void compression_decompression(struct cmp_cfg *cfg)
 		memcpy(model_of_data, decompressed_data, data_size);
 	}
 
-	cfg->icu_output_buf = NULL;
+	rcfg->icu_output_buf = NULL;
 	free(ent);
 	free(decompressed_data);
 	free(updated_model);
@@ -750,10 +810,9 @@ void compression_decompression(struct cmp_cfg *cfg)
 
 void test_random_round_trip_like_rdcu_compression(void)
 {
-	enum cmp_data_type data_type;
+	enum cmp_data_type data_type = DATA_TYPE_IMAGETTE;
 	enum cmp_mode cmp_mode;
-	struct cmp_cfg cfg;
-	uint32_t cmp_buffer_size;
+	struct rdcu_cfg rcfg;
 	enum {
 		MAX_DATA_TO_COMPRESS_SIZE = 0x1000B,
 		CMP_BUFFER_FAKTOR = 3 /* compression data buffer size / data to compress buffer size */
@@ -761,45 +820,69 @@ void test_random_round_trip_like_rdcu_compression(void)
 	void *data_to_compress1 = malloc(MAX_DATA_TO_COMPRESS_SIZE);
 	void *data_to_compress2 = malloc(MAX_DATA_TO_COMPRESS_SIZE);
 	void *updated_model = calloc(1, MAX_DATA_TO_COMPRESS_SIZE);
+	int run;
 
-	for (data_type = 1; data_type <= DATA_TYPE_F_CAM_BACKGROUND; data_type++) {
-		/* printf("%s\n", data_type2string(data_type)); */
-		/* generate random data*/
+	for (run = 0; run < 2; run++) {
+		uint32_t (*gen_data_f)(uint32_t max_data_bits, void *extra);
+		void *extra;
+		double p = 0.01;
 		size_t size;
-		uint32_t samples = cmp_rand_between(1, UINT16_MAX/size_of_a_sample(data_type));
-		uint32_t model_value = cmp_rand_between(0, MAX_MODEL_VALUE);
+		uint32_t samples, model_value;
+
+		/* generate random data*/
+		switch (run) {
+		case 0:
+			gen_data_f = gen_uniform_data;
+			extra = NULL;
+			break;
+		case 1:
+			gen_data_f = gen_geometric_data;
+			extra = &p;
+			break;
+		default:
+			TEST_FAIL();
+		}
+		samples = cmp_rand_between(1, UINT16_MAX/size_of_a_sample(data_type));
+		model_value = cmp_rand_between(0, MAX_MODEL_VALUE);
 
 		if (!rdcu_supported_data_type_is_used(data_type))
 			continue;
 
-		size = gen_ima_data(NULL, data_type, samples, &MAX_USED_BITS_V1);
+		size = gen_ima_data(NULL, data_type, samples, gen_data_f, extra);
 		TEST_ASSERT(size <= MAX_DATA_TO_COMPRESS_SIZE);
-		size = gen_ima_data(data_to_compress1, data_type, samples, &MAX_USED_BITS_V1);
+		size = gen_ima_data(data_to_compress1, data_type, samples, gen_data_f, extra);
 		TEST_ASSERT(size <= MAX_DATA_TO_COMPRESS_SIZE);
-		size = gen_ima_data(data_to_compress2, data_type, samples, &MAX_USED_BITS_V1);
+		size = gen_ima_data(data_to_compress2, data_type, samples, gen_data_f, extra);
 		TEST_ASSERT(size <= MAX_DATA_TO_COMPRESS_SIZE);
 		/* for (cmp_mode = CMP_MODE_RAW; cmp_mode <= CMP_MODE_STUFF; cmp_mode++) { */
 		for (cmp_mode = CMP_MODE_RAW; cmp_mode <= CMP_MODE_DIFF_MULTI; cmp_mode++) {
 			/* printf("cmp_mode: %i\n", cmp_mode); */
-			cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value,
-						 CMP_LOSSLESS);
-			TEST_ASSERT_NOT_EQUAL_INT(cfg.data_type, DATA_TYPE_UNKNOWN);
-
-			generate_random_cmp_cfg(&cfg);
-
-			if (!model_mode_is_used(cmp_mode))
-				cmp_buffer_size = cmp_cfg_icu_buffers(&cfg, data_to_compress1,
-								      samples, NULL, NULL, NULL, samples*CMP_BUFFER_FAKTOR);
-			else
-				cmp_buffer_size = cmp_cfg_icu_buffers(&cfg, data_to_compress2,
-								      samples, data_to_compress1, updated_model, NULL, samples*CMP_BUFFER_FAKTOR);
-
-			TEST_ASSERT_EQUAL_UINT(cmp_buffer_size, cmp_cal_size_of_data(CMP_BUFFER_FAKTOR*samples, data_type));
-
-			compression_decompression(&cfg);
+			int error = rdcu_cfg_create(&rcfg, cmp_mode,
+						    model_value, CMP_LOSSLESS);
+			TEST_ASSERT_FALSE(error);
+
+			generate_random_rdcu_cfg(&rcfg);
+
+			if (!model_mode_is_used(cmp_mode)) {
+				rcfg.input_buf = data_to_compress1;
+				rcfg.samples = samples;
+				rcfg.model_buf = NULL;
+				rcfg.icu_new_model_buf = NULL;
+				rcfg.icu_output_buf = NULL;
+				rcfg.buffer_length = samples*CMP_BUFFER_FAKTOR;
+			} else {
+				rcfg.input_buf = data_to_compress2;
+				rcfg.samples = samples;
+				rcfg.model_buf = data_to_compress1;
+				rcfg.icu_new_model_buf = updated_model;
+				rcfg.icu_output_buf = NULL;
+				rcfg.buffer_length = samples*CMP_BUFFER_FAKTOR;
+			}
+
+			compression_decompression_like_rdcu(&rcfg);
 		}
 	}
-	compression_decompression(NULL);
+	compression_decompression_like_rdcu(NULL);
 	free(data_to_compress1);
 	free(data_to_compress2);
 	free(updated_model);
@@ -812,10 +895,10 @@ void test_random_round_trip_like_rdcu_compression(void)
 
 void test_random_compression_decompress_rdcu_data(void)
 {
-	struct cmp_cfg cfg;
+	struct rdcu_cfg rcfg;
 	struct cmp_info info = {0};
-	uint32_t cmp_buffer_size;
-	int s, i, cmp_size_bits;
+	int error, s, i;
+	uint32_t cmp_size_bits;
 	void *compressed_data;
 	uint16_t *decompressed_data;
 	enum {N_SAMPLES = 5};
@@ -824,27 +907,17 @@ void test_random_compression_decompress_rdcu_data(void)
 		CMP_BUFFER_FAKTOR = 2 /* compression data buffer size / data to compress buffer size */
 	};
 
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_RAW, 8, CMP_LOSSLESS);
-	TEST_ASSERT_NOT_EQUAL_INT(cfg.data_type, DATA_TYPE_UNKNOWN);
-
-	cmp_buffer_size = cmp_cfg_icu_buffers(&cfg, data, N_SAMPLES, NULL, NULL,
-					      NULL, N_SAMPLES*CMP_BUFFER_FAKTOR);
-	compressed_data = malloc(cmp_buffer_size);
-	cmp_buffer_size = cmp_cfg_icu_buffers(&cfg, data, N_SAMPLES, NULL, NULL,
-					      compressed_data, N_SAMPLES*CMP_BUFFER_FAKTOR);
-	TEST_ASSERT_EQUAL_INT(cmp_buffer_size, cmp_cal_size_of_data(CMP_BUFFER_FAKTOR*N_SAMPLES, DATA_TYPE_IMAGETTE));
-
-	cmp_size_bits = icu_compress_data(&cfg);
-	TEST_ASSERT(cmp_size_bits > 0);
-	info.cmp_size = (uint32_t)cmp_size_bits;
-	info.cmp_mode_used = (uint8_t)cfg.cmp_mode;
-	info.model_value_used = (uint8_t)cfg.model_value;
-	info.round_used = (uint8_t)cfg.round;
-	info.spill_used = cfg.spill;
-	info.golomb_par_used = cfg.golomb_par;
-	info.samples_used = cfg.samples;
-	info.rdcu_new_model_adr_used = cfg.rdcu_new_model_adr;
-	info.rdcu_cmp_adr_used = cfg.rdcu_buffer_adr;
+	compressed_data = malloc(sizeof(uint16_t)*N_SAMPLES*CMP_BUFFER_FAKTOR);
+	error = rdcu_cfg_create(&rcfg, CMP_MODE_RAW, 8, CMP_LOSSLESS);
+	TEST_ASSERT_FALSE(error);
+
+	rcfg.input_buf = data;
+	rcfg.samples = N_SAMPLES;
+	rcfg.icu_output_buf = compressed_data;
+	rcfg.buffer_length = CMP_BUFFER_FAKTOR*N_SAMPLES;
+
+	cmp_size_bits = compress_like_rdcu(&rcfg, &info);
+	TEST_ASSERT(!cmp_is_error(cmp_size_bits));
 
 	s = decompress_rdcu_data(compressed_data, &info, NULL, NULL, NULL);
 	TEST_ASSERT_EQUAL(sizeof(data), s);
@@ -860,91 +933,6 @@ void test_random_compression_decompress_rdcu_data(void)
 }
 
 
-static uint32_t chunk_round_trip(void *data, uint32_t data_size,
-				 void *model, void *up_model,
-				 uint32_t *cmp_data, uint32_t cmp_data_capacity,
-				 struct cmp_par *cmp_par, int use_decmp_buf, int use_decmp_up_model)
-{
-	uint32_t cmp_size;
-	void *model_cpy = NULL;
-
-	/* if in-place model update is used (up_model == model), the model
-	 * needed for decompression is destroyed; therefore we make a copy
-	 */
-	if (model) {
-		if (up_model == model) {
-			model_cpy = TEST_malloc(data_size);
-			memcpy(model_cpy, model, data_size);
-		} else {
-			model_cpy = model;
-		}
-	}
-
-	cmp_size = compress_chunk(data, data_size, model, up_model,
-				  cmp_data, cmp_data_capacity, cmp_par);
-
-#if 0
-	{ /* Compress a second time and check for determinism */
-		int32_t cSize2;
-		void *compressed2 = NULL;
-		void *up_model2 = NULL;
-
-		if (compressed)
-			compressed2 = FUZZ_malloc(compressedCapacity);
-
-		if (up_model)
-			up_model2 = FUZZ_malloc(srcSize);
-		cSize2 = compress_chunk((void *)src, srcSize, (void *)model, up_model2,
-					   compressed2, compressedCapacity, cmp_par);
-		FUZZ_ASSERT(cSize == cSize2);
-		FUZZ_ASSERT_MSG(!FUZZ_memcmp(compressed, compressed2, cSize), "Not deterministic!");
-		FUZZ_ASSERT_MSG(!FUZZ_memcmp(up_model, compressed2, cSize), "NO deterministic!");
-		free(compressed2);
-		free(up_model2);
-	}
-#endif
-	if (!cmp_is_error(cmp_size) && cmp_data) {
-		void *decmp_data = NULL;
-		void *up_model_decmp = NULL;
-		int decmp_size;
-
-		decmp_size = decompress_cmp_entiy((struct cmp_entity *)cmp_data, model_cpy, NULL, NULL);
-		TEST_ASSERT(decmp_size >= 0);
-		TEST_ASSERT_EQUAL((uint32_t)decmp_size, data_size);
-
-		if (use_decmp_buf)
-			decmp_data = TEST_malloc(data_size);
-		if (use_decmp_up_model)
-			up_model_decmp = TEST_malloc(data_size);
-
-		decmp_size = decompress_cmp_entiy((struct cmp_entity *)cmp_data, model_cpy,
-						  up_model_decmp, decmp_data);
-		TEST_ASSERT(decmp_size >= 0);
-		TEST_ASSERT((uint32_t)decmp_size == data_size);
-
-		if (use_decmp_buf) {
-			TEST_ASSERT_EQUAL_HEX8_ARRAY(data, decmp_data, data_size);
-			TEST_ASSERT(!memcmp(data, decmp_data, data_size));
-
-			/*
-			 * the model is only updated when the decompressed_data
-			 * buffer is set
-			 */
-			if (up_model && up_model_decmp)
-				TEST_ASSERT(!memcmp(up_model, up_model_decmp, data_size));
-		}
-
-		free(decmp_data);
-		free(up_model_decmp);
-	}
-
-	if (up_model == model)
-		free(model_cpy);
-
-	return cmp_size;
-}
-
-
 /**
  * @brief random compression decompression round trip test
  *
@@ -961,7 +949,8 @@ void test_random_collection_round_trip(void)
 	enum cmp_data_type data_type;
 	enum cmp_mode cmp_mode;
 	enum { MAX_DATA_TO_COMPRESS_SIZE = UINT16_MAX};
-	uint32_t cmp_data_capacity = COMPRESS_CHUNK_BOUND(MAX_DATA_TO_COMPRESS_SIZE, 1);
+	uint32_t cmp_data_capacity = COMPRESS_CHUNK_BOUND(MAX_DATA_TO_COMPRESS_SIZE, 1U);
+	int run;
 #ifdef __sparc__
 	void *data          = (void *)0x63000000;
 	void *model         = (void *)0x64000000;
@@ -979,36 +968,85 @@ void test_random_collection_round_trip(void)
 	TEST_ASSERT_NOT_NULL(updated_model);
 	TEST_ASSERT_NOT_NULL(cmp_data);
 
-	for (data_type = 1; data_type <= DATA_TYPE_F_CAM_BACKGROUND; data_type++) {
-		/* printf("%s\n", data_type2string(data_type)); */
-		/* generate random data*/
-		size_t size;
-		uint32_t samples = cmp_rand_between(1, UINT16_MAX/size_of_a_sample(data_type));
+	for (run = 0; run < 2; run++) {
+		uint32_t (*gen_data_f)(uint32_t max_data_bits, void *extra);
+		void *extra;
+		double p = 0.01;
 
-		size = generate_random_collection(NULL, data_type, samples, &MAX_USED_BITS_SAFE);
-		TEST_ASSERT(size <= MAX_DATA_TO_COMPRESS_SIZE);
-		size = generate_random_collection(data, data_type, samples, &MAX_USED_BITS_SAFE);
-		TEST_ASSERT(size <= MAX_DATA_TO_COMPRESS_SIZE);
-		size = generate_random_collection(model, data_type, samples, &MAX_USED_BITS_SAFE);
-		TEST_ASSERT(size <= MAX_DATA_TO_COMPRESS_SIZE);
+		switch (run) {
+		case 0:
+			gen_data_f = gen_uniform_data;
+			extra = NULL;
+			break;
+		case 1:
+			gen_data_f = gen_geometric_data;
+			extra = &p;
+			break;
+		default:
+			TEST_FAIL();
+		}
 
-		for (cmp_mode = CMP_MODE_RAW; cmp_mode <= CMP_MODE_DIFF_MULTI; cmp_mode++) {
-			struct cmp_par par;
-			uint32_t cmp_size;
-
-			generate_random_cmp_par(&par);
-			par.cmp_mode = cmp_mode;
-			par.lossy_par = CMP_LOSSLESS;
-
-			cmp_size = chunk_round_trip(data, (uint32_t)size, model, updated_model,
-						   cmp_data, cmp_data_capacity,
-						   &par, 1, model_mode_is_used(par.cmp_mode));
-			/* No chunk is defined for fast cadence subservices */
-			if (data_type == DATA_TYPE_F_FX || data_type == DATA_TYPE_F_FX_EFX ||
-			    data_type == DATA_TYPE_F_FX_NCOB || data_type == DATA_TYPE_F_FX_EFX_NCOB_ECOB)
-				TEST_ASSERT_EQUAL_INT(CMP_ERROR_COL_SUBSERVICE_UNSUPPORTED, cmp_get_error_code(cmp_size));
-			else
-				TEST_ASSERT_FALSE(cmp_is_error(cmp_size));
+		for (data_type = 1; data_type <= DATA_TYPE_F_CAM_BACKGROUND; data_type++) {
+			/* printf("%s\n", data_type2string(data_type)); */
+			/* generate random data*/
+			size_t size;
+			uint32_t samples = cmp_rand_between(1, UINT16_MAX/size_of_a_sample(data_type) - COLLECTION_HDR_SIZE);
+
+			size = generate_random_collection(NULL, data_type, samples, gen_data_f, extra);
+			TEST_ASSERT(size <= MAX_DATA_TO_COMPRESS_SIZE);
+			size = generate_random_collection(data, data_type, samples, gen_data_f, extra);
+			TEST_ASSERT(size <= MAX_DATA_TO_COMPRESS_SIZE);
+			size = generate_random_collection(model, data_type, samples, gen_data_f, extra);
+			TEST_ASSERT(size <= MAX_DATA_TO_COMPRESS_SIZE);
+
+			for (cmp_mode = CMP_MODE_RAW; cmp_mode <= CMP_MODE_DIFF_MULTI; cmp_mode++) {
+				struct cmp_par par;
+				uint32_t cmp_size, cmp_size2;
+
+				cmp_data_capacity = COMPRESS_CHUNK_BOUND(MAX_DATA_TO_COMPRESS_SIZE, 1U);
+
+				generate_random_cmp_par(&par);
+				par.cmp_mode = cmp_mode;
+				par.lossy_par = CMP_LOSSLESS;
+
+				cmp_size = chunk_round_trip(data, (uint32_t)size, model, updated_model,
+							   cmp_data, cmp_data_capacity,
+							   &par, 1, model_mode_is_used(par.cmp_mode));
+				/* No chunk is defined for fast cadence subservices */
+				if (data_type == DATA_TYPE_F_FX || data_type == DATA_TYPE_F_FX_EFX ||
+				    data_type == DATA_TYPE_F_FX_NCOB || data_type == DATA_TYPE_F_FX_EFX_NCOB_ECOB) {
+					TEST_ASSERT_EQUAL_INT(CMP_ERROR_COL_SUBSERVICE_UNSUPPORTED, cmp_get_error_code(cmp_size));
+					continue;
+				} else {
+					TEST_ASSERT_EQUAL_INT(CMP_ERROR_NO_ERROR, cmp_get_error_code(cmp_size));
+				}
+
+
+				/* test with minimum compressed data capacity */
+				cmp_data_capacity = ROUND_UP_TO_MULTIPLE_OF_4(cmp_size);
+				cmp_size2 = chunk_round_trip(data, (uint32_t)size, model, updated_model,
+							     cmp_data, cmp_data_capacity,
+							     &par, 1, model_mode_is_used(par.cmp_mode));
+
+				TEST_ASSERT_EQUAL_UINT(cmp_size, cmp_size2);
+				TEST_ASSERT_FALSE(cmp_is_error(cmp_size2));
+
+				/* error: the capacity for the compressed data is to small */
+				for (cmp_data_capacity = cmp_size2 - 1;
+				     cmp_data_capacity <= cmp_size - 32  && cmp_data_capacity > 1;
+				     cmp_data_capacity--) {
+					cmp_size = chunk_round_trip(data, (uint32_t)size, model, updated_model,
+								    cmp_data, cmp_data_capacity,
+								    &par, 1, model_mode_is_used(par.cmp_mode));
+					TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
+				}
+
+				cmp_data_capacity = cmp_size2 - cmp_rand_between(1, cmp_size2);
+				cmp_size = chunk_round_trip(data, (uint32_t)size, model, updated_model,
+							    cmp_data, cmp_data_capacity,
+							    &par, 1, model_mode_is_used(par.cmp_mode));
+				TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
+			}
 		}
 	}
 #ifndef __sparc__
@@ -1082,7 +1120,7 @@ void test_cmp_collection_raw(void)
 
 	/* error case: buffer for the compressed data is to small */
 	dst_capacity -= 1;
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_,
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER,
 			      cmp_get_error_code(compress_chunk(col, col_size, NULL, NULL, dst, dst_capacity, &par)));
 
 	free(col);
@@ -1167,7 +1205,7 @@ void test_cmp_collection_diff(void)
 
 	/* error cases dst buffer to small */
 	dst_capacity -= 1;
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(compress_chunk(col, col_size, NULL, NULL, dst, dst_capacity, &par)));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(compress_chunk(col, col_size, NULL, NULL, dst, dst_capacity, &par)));
 
 	free(col);
 	free(dst);
@@ -1363,11 +1401,11 @@ void test_cmp_decmp_chunk_raw(void)
 	uint32_t dst_capacity = 0;
 
 	/* generate test data */
-	chunk_size = generate_random_chunk(chunk, chunk_def, ARRAY_SIZE(chunk_def), &MAX_USED_BITS_SAFE);
+	chunk_size = generate_random_chunk(chunk, chunk_def, ARRAY_SIZE(chunk_def), gen_uniform_data, NULL);
 	TEST_ASSERT_EQUAL_size_t(chunk_size_exp, chunk_size);
 	chunk = calloc(1, chunk_size);
 	TEST_ASSERT_NOT_NULL(chunk);
-	chunk_size = generate_random_chunk(chunk, chunk_def, ARRAY_SIZE(chunk_def), &MAX_USED_BITS_SAFE);
+	chunk_size = generate_random_chunk(chunk, chunk_def, ARRAY_SIZE(chunk_def), gen_uniform_data, NULL);
 	TEST_ASSERT_EQUAL_size_t(chunk_size_exp, chunk_size);
 
 	/* "compress" data */
@@ -1382,7 +1420,7 @@ void test_cmp_decmp_chunk_raw(void)
 		dst_capacity = (uint32_t)cmp_size;
 		dst = malloc(dst_capacity); TEST_ASSERT_NOT_NULL(dst);
 		cmp_size = compress_chunk(chunk, chunk_size, NULL, NULL, dst, dst_capacity, &par);
-		TEST_ASSERT_EQUAL_INT(cmp_size_exp, dst_capacity);
+		TEST_ASSERT_EQUAL_INT(cmp_size_exp, cmp_size);
 	}
 
 	/* check results */
@@ -1430,6 +1468,7 @@ void test_cmp_decmp_chunk_raw(void)
 	{
 		void *decompressed_data = NULL;
 		int decmp_size = decompress_cmp_entiy((void *)dst, NULL, NULL, decompressed_data);
+
 		TEST_ASSERT_EQUAL_size_t(chunk_size, decmp_size);
 
 		decompressed_data = malloc((size_t)decmp_size); TEST_ASSERT_NOT_NULL(decompressed_data);
@@ -1444,7 +1483,7 @@ void test_cmp_decmp_chunk_raw(void)
 
 		dst_capacity -= 1;
 		cmp_size = compress_chunk(chunk, chunk_size, NULL, NULL, dst, dst_capacity, &par);
-		TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(cmp_size));
+		TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
 	}
 
 	free(dst);
@@ -1466,7 +1505,7 @@ void test_cmp_decmp_chunk_worst_case(void)
 		uint16_t s;
 		uint8_t *p, i;
 
-		chunk = malloc(chunk_size); TEST_ASSERT_NOT_NULL(chunk);
+		chunk = calloc(1, chunk_size); TEST_ASSERT_NOT_NULL(chunk);
 		generate_random_collection_hdr(chunk, DATA_TYPE_S_FX, 2);
 		p = chunk;
 		p += COLLECTION_HDR_SIZE;
@@ -1557,7 +1596,7 @@ void test_cmp_decmp_chunk_worst_case(void)
 
 	/* error case: buffer to small for compressed data */
 	cmp_size_byte = compress_chunk(chunk, chunk_size, NULL, NULL, dst, chunk_size, &par);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(cmp_size_byte));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size_byte));
 
 	free(chunk);
 }
@@ -1576,11 +1615,11 @@ void test_cmp_decmp_diff(void)
 		struct collection_hdr *col;
 		size_t chunk_size_exp = 2*sizeof(struct s_fx) + 3*sizeof(struct s_fx_efx_ncob_ecob) + 2*COLLECTION_HDR_SIZE;
 
-		chunk_size = generate_random_chunk(chunk, chunk_def, ARRAY_SIZE(chunk_def), &MAX_USED_BITS_SAFE);
+		chunk_size = generate_random_chunk(chunk, chunk_def, ARRAY_SIZE(chunk_def), gen_uniform_data, NULL);
 		TEST_ASSERT_EQUAL_size_t(chunk_size_exp, chunk_size);
 		chunk = calloc(1, chunk_size);
 		TEST_ASSERT_NOT_NULL(chunk);
-		chunk_size = generate_random_chunk(chunk, chunk_def, ARRAY_SIZE(chunk_def), &MAX_USED_BITS_SAFE);
+		chunk_size = generate_random_chunk(chunk, chunk_def, ARRAY_SIZE(chunk_def), gen_uniform_data, NULL);
 		TEST_ASSERT_EQUAL_size_t(chunk_size_exp, chunk_size);
 
 		col = (struct collection_hdr *)chunk;
diff --git a/test/cmp_entity/test_cmp_entity.c b/test/cmp_entity/test_cmp_entity.c
index 89c3534547421e60d3f0677371cd2eeb8c4970a3..d7dc03ac7e0583a85e25fc5c22400ba114d521bd 100644
--- a/test/cmp_entity/test_cmp_entity.c
+++ b/test/cmp_entity/test_cmp_entity.c
@@ -19,10 +19,13 @@
 
 #include <stdlib.h>
 #include <string.h>
-#if defined __has_include
-#  if __has_include(<time.h>)
-#    include <time.h>
-#    define HAS_TIME_H 1
+
+#ifndef ICU_ASW
+#  if defined __has_include
+#    if __has_include(<time.h>)
+#      include <time.h>
+#      define HAS_TIME_H 1
+#    endif
 #  endif
 #endif
 
@@ -98,7 +101,7 @@ void test_ent_version_id(void)
 	struct cmp_entity ent = {0};
 	uint32_t version_id;
 	uint32_t version_id_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	version_id = 0x12345678;
 	error = cmp_ent_set_version_id(&ent, version_id);
@@ -132,7 +135,7 @@ void test_ent_size(void)
 	struct cmp_entity ent = {0};
 	uint32_t size;
 	uint32_t size_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	size = 0x123456;
 	error = cmp_ent_set_size(&ent, size);
@@ -168,7 +171,7 @@ void test_ent_original_size(void)
 	struct cmp_entity ent = {0};
 	uint32_t original_size;
 	uint32_t original_size_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	original_size = 0x123456;
 	error = cmp_ent_set_original_size(&ent, original_size);
@@ -206,14 +209,14 @@ void test_ent_start_timestamp(void)
 	uint64_t start_timestamp_read;
 	uint32_t coarse_start_timestamp_read;
 	uint16_t fine_start_timestamp_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	start_timestamp = 0x123456789ABCULL;
 	error = cmp_ent_set_start_timestamp(&ent, start_timestamp);
 	TEST_ASSERT_FALSE(error);
 
 	start_timestamp_read = cmp_ent_get_start_timestamp(&ent);
-	TEST_ASSERT_EQUAL_UINT64(start_timestamp, start_timestamp_read);
+	TEST_ASSERT_EQUAL(start_timestamp, start_timestamp_read);
 
 	/* check the right position in the header */
 	TEST_ASSERT_EQUAL_HEX(0x12, entity_p[10]);
@@ -224,9 +227,9 @@ void test_ent_start_timestamp(void)
 	TEST_ASSERT_EQUAL_HEX(0xBC, entity_p[15]);
 
 	coarse_start_timestamp_read = cmp_ent_get_coarse_start_time(&ent);
-	TEST_ASSERT_EQUAL_UINT64(0x12345678, coarse_start_timestamp_read);
+	TEST_ASSERT_EQUAL(0x12345678, coarse_start_timestamp_read);
 	fine_start_timestamp_read = cmp_ent_get_fine_start_time(&ent);
-	TEST_ASSERT_EQUAL_UINT64(0x9ABC, fine_start_timestamp_read);
+	TEST_ASSERT_EQUAL(0x9ABC, fine_start_timestamp_read);
 
 	/* error cases */
 	start_timestamp = 0x1000000000000ULL;
@@ -250,7 +253,7 @@ void test_ent_coarse_start_time(void)
 	struct cmp_entity ent = {0};
 	uint32_t coarse_start_time;
 	uint32_t coarse_start_time_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	coarse_start_time = 0x12345678;
 	error = cmp_ent_set_coarse_start_time(&ent, coarse_start_time);
@@ -284,7 +287,7 @@ void test_ent_fine_start_time(void)
 	struct cmp_entity ent = {0};
 	uint16_t fine_start_time;
 	uint16_t fine_start_time_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	fine_start_time = 0x1234;
 	error = cmp_ent_set_fine_start_time(&ent, fine_start_time);
@@ -318,14 +321,14 @@ void test_ent_end_timestamp(void)
 	uint64_t end_timestamp_read;
 	uint32_t coarse_end_timestamp_read;
 	uint16_t fine_end_timestamp_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	end_timestamp	= 0x123456789ABCULL;
 	error = cmp_ent_set_end_timestamp(&ent, end_timestamp);
 	TEST_ASSERT_FALSE(error);
 
 	end_timestamp_read = cmp_ent_get_end_timestamp(&ent);
-	TEST_ASSERT_EQUAL_HEX64(end_timestamp, end_timestamp_read);
+	TEST_ASSERT_EQUAL(end_timestamp, end_timestamp_read);
 
 	/* check the right position in the header */
 	TEST_ASSERT_EQUAL_HEX(0x12, entity_p[16]);
@@ -336,9 +339,9 @@ void test_ent_end_timestamp(void)
 	TEST_ASSERT_EQUAL_HEX(0xBC, entity_p[21]);
 
 	coarse_end_timestamp_read = cmp_ent_get_coarse_end_time(&ent);
-	TEST_ASSERT_EQUAL_UINT64(0x12345678, coarse_end_timestamp_read);
+	TEST_ASSERT_EQUAL(0x12345678, coarse_end_timestamp_read);
 	fine_end_timestamp_read = cmp_ent_get_fine_end_time(&ent);
-	TEST_ASSERT_EQUAL_UINT64(0x9ABC, fine_end_timestamp_read);
+	TEST_ASSERT_EQUAL(0x9ABC, fine_end_timestamp_read);
 
 	/* error cases */
 	end_timestamp = 0x1000000000000ULL;
@@ -362,7 +365,7 @@ void test_ent_coarse_end_time(void)
 	struct cmp_entity ent = {0};
 	uint32_t coarse_end_time;
 	uint32_t coarse_end_time_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	coarse_end_time = 0x12345678;
 	error = cmp_ent_set_coarse_end_time(&ent, coarse_end_time);
@@ -396,7 +399,7 @@ void test_ent_fine_end_time(void)
 	struct cmp_entity ent = {0};
 	uint16_t fine_end_time;
 	uint16_t fine_end_time_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	fine_end_time = 0x1234;
 	error = cmp_ent_set_fine_end_time(&ent, fine_end_time);
@@ -429,7 +432,7 @@ void test_cmp_ent_data_type(void)
 	struct cmp_entity ent = {0};
 	enum cmp_data_type data_type, data_type_read;
 	int raw_mode_flag, raw_mode_flag_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	/* test raw_mode */
 	raw_mode_flag = 1;
@@ -486,7 +489,7 @@ void test_ent_cmp_mode(void)
 	int error;
 	struct cmp_entity ent = {0};
 	enum cmp_mode cmp_mode, cmp_mode_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	cmp_mode = (enum cmp_mode)0x12;
 	error = cmp_ent_set_cmp_mode(&ent, cmp_mode);
@@ -519,7 +522,7 @@ void test_ent_model_value(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t model_value, model_value_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	model_value = 0x12;
 	error = cmp_ent_set_model_value(&ent, model_value);
@@ -552,7 +555,7 @@ void test_ent_model_id(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t model_id, model_id_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	model_id = 0x1234;
 	error = cmp_ent_set_model_id(&ent, model_id);
@@ -586,7 +589,7 @@ void test_ent_model_counter(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t model_counter, model_counter_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	model_counter = 0x12;
 	error = cmp_ent_set_model_counter(&ent, model_counter);
@@ -610,32 +613,32 @@ void test_ent_model_counter(void)
 
 
 /**
- * @test cmp_ent_set_max_used_bits_version
- * @test cmp_ent_get_max_used_bits_version
+ * @test cmp_ent_set_reserved
+ * @test cmp_ent_get_reserved
  */
 
-void test_ent_max_used_bits_version(void)
+void test_ent_reserved(void)
 {
 	int error;
 	struct cmp_entity ent = {0};
-	uint8_t max_used_bits_version, max_used_bits_version_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	uint8_t reserved, reserved_read;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
-	max_used_bits_version = 0x12;
-	error = cmp_ent_set_max_used_bits_version(&ent, max_used_bits_version);
+	reserved = 0x12;
+	error = cmp_ent_set_reserved(&ent, reserved);
 	TEST_ASSERT_FALSE(error);
 
-	max_used_bits_version_read = cmp_ent_get_max_used_bits_version(&ent);
-	TEST_ASSERT_EQUAL_UINT32(max_used_bits_version, max_used_bits_version_read);
+	reserved_read = cmp_ent_get_reserved(&ent);
+	TEST_ASSERT_EQUAL_UINT32(reserved, reserved_read);
 
 	/* check the right position in the header */
 	TEST_ASSERT_EQUAL_HEX(0x12, entity_p[29]);
 
 	/* error cases */
-	error = cmp_ent_set_max_used_bits_version(NULL, max_used_bits_version);
+	error = cmp_ent_set_reserved(NULL, reserved);
 	TEST_ASSERT_TRUE(error);
-	max_used_bits_version_read = cmp_ent_get_max_used_bits_version(NULL);
-	TEST_ASSERT_EQUAL_UINT32(0, max_used_bits_version_read);
+	reserved_read = cmp_ent_get_reserved(NULL);
+	TEST_ASSERT_EQUAL_UINT32(0, reserved_read);
 }
 
 
@@ -649,7 +652,7 @@ void test_ent_lossy_cmp_par(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t lossy_cmp_par, lossy_cmp_par_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	lossy_cmp_par = 0x1234;
 	error = cmp_ent_set_lossy_cmp_par(&ent, lossy_cmp_par);
@@ -683,7 +686,7 @@ void test_ent_ima_spill(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t ima_spill, ima_spill_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	ima_spill = 0x1234;
 	error = cmp_ent_set_ima_spill(&ent, ima_spill);
@@ -717,7 +720,7 @@ void test_ent_ima_golomb_par(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t ima_golomb_par, ima_golomb_par_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	ima_golomb_par = 0x12;
 	error = cmp_ent_set_ima_golomb_par(&ent, ima_golomb_par);
@@ -750,7 +753,7 @@ void test_ent_ima_ap1_spill(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t ima_ap1_spill, ima_ap1_spill_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	ima_ap1_spill = 0x1234;
 	error = cmp_ent_set_ima_ap1_spill(&ent, ima_ap1_spill);
@@ -784,7 +787,7 @@ void test_ent_ima_ap1_golomb_par(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t ima_ap1_golomb_par, ima_ap1_golomb_par_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	ima_ap1_golomb_par = 0x12;
 	error = cmp_ent_set_ima_ap1_golomb_par(&ent, ima_ap1_golomb_par);
@@ -817,7 +820,7 @@ void test_ent_ima_ap2_spill(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t ima_ap2_spill, ima_ap2_spill_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	ima_ap2_spill = 0x1234;
 	error = cmp_ent_set_ima_ap2_spill(&ent, ima_ap2_spill);
@@ -851,7 +854,7 @@ void test_ent_ima_ap2_golomb_par(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t ima_ap2_golomb_par, ima_ap2_golomb_par_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	ima_ap2_golomb_par = 0x12;
 	error = cmp_ent_set_ima_ap2_golomb_par(&ent, ima_ap2_golomb_par);
@@ -884,7 +887,7 @@ void test_ent_non_ima_spill1(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_spill1, non_ima_spill1_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_spill1 = 0x123456;
 	error = cmp_ent_set_non_ima_spill1(&ent, non_ima_spill1);
@@ -919,7 +922,7 @@ void test_ent_non_ima_cmp_par1(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_cmp_par1, non_ima_cmp_par1_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_cmp_par1 = 0x1234;
 	error = cmp_ent_set_non_ima_cmp_par1(&ent, non_ima_cmp_par1);
@@ -953,7 +956,7 @@ void test_ent_non_ima_spill2(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_spill2, non_ima_spill2_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_spill2 = 0x123456;
 	error = cmp_ent_set_non_ima_spill2(&ent, non_ima_spill2);
@@ -988,7 +991,7 @@ void test_ent_non_ima_cmp_par2(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_cmp_par2, non_ima_cmp_par2_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_cmp_par2 = 0x1234;
 	error = cmp_ent_set_non_ima_cmp_par2(&ent, non_ima_cmp_par2);
@@ -1022,7 +1025,7 @@ void test_ent_non_ima_spill3(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_spill3, non_ima_spill3_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_spill3 = 0x123456;
 	error = cmp_ent_set_non_ima_spill3(&ent, non_ima_spill3);
@@ -1057,7 +1060,7 @@ void test_ent_non_ima_cmp_par3(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_cmp_par3, non_ima_cmp_par3_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_cmp_par3 = 0x1234;
 	error = cmp_ent_set_non_ima_cmp_par3(&ent, non_ima_cmp_par3);
@@ -1091,7 +1094,7 @@ void test_ent_non_ima_spill4(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_spill4, non_ima_spill4_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_spill4 = 0x123456;
 	error = cmp_ent_set_non_ima_spill4(&ent, non_ima_spill4);
@@ -1126,7 +1129,7 @@ void test_ent_non_ima_cmp_par4(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_cmp_par4, non_ima_cmp_par4_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_cmp_par4 = 0x1234;
 	error = cmp_ent_set_non_ima_cmp_par4(&ent, non_ima_cmp_par4);
@@ -1160,7 +1163,7 @@ void test_ent_non_ima_spill5(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_spill5, non_ima_spill5_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_spill5 = 0x123456;
 	error = cmp_ent_set_non_ima_spill5(&ent, non_ima_spill5);
@@ -1195,7 +1198,7 @@ void test_ent_non_ima_cmp_par5(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_cmp_par5, non_ima_cmp_par5_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_cmp_par5 = 0x1234;
 	error = cmp_ent_set_non_ima_cmp_par5(&ent, non_ima_cmp_par5);
@@ -1229,7 +1232,7 @@ void test_ent_non_ima_spill6(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_spill6, non_ima_spill6_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_spill6 = 0x123456;
 	error = cmp_ent_set_non_ima_spill6(&ent, non_ima_spill6);
@@ -1264,7 +1267,7 @@ void test_ent_non_ima_cmp_par6(void)
 	int error;
 	struct cmp_entity ent = {0};
 	uint32_t non_ima_cmp_par6, non_ima_cmp_par6_read;
-	uint8_t *entity_p = (uint8_t *)&ent;
+	const uint8_t *entity_p = (const uint8_t *)&ent;
 
 	non_ima_cmp_par6 = 0x1234;
 	error = cmp_ent_set_non_ima_cmp_par6(&ent, non_ima_cmp_par6);
@@ -1296,7 +1299,7 @@ void test_cmp_ent_get_data_buf(void)
 {
 	enum cmp_data_type data_type;
 	struct cmp_entity ent = {0};
-	char *adr;
+	const char *adr;
 	uint32_t s, hdr_size;
 	int error;
 
@@ -1315,7 +1318,7 @@ void test_cmp_ent_get_data_buf(void)
 
 	/* RAW mode test */
 	for (data_type = DATA_TYPE_IMAGETTE;
-	     data_type <= DATA_TYPE_F_CAM_BACKGROUND;
+	     data_type <= DATA_TYPE_CHUNK;
 	     data_type++) {
 		s = cmp_ent_create(&ent, data_type, 1, 0);
 		TEST_ASSERT_NOT_EQUAL_INT(0, s);
@@ -1344,6 +1347,62 @@ void test_cmp_ent_get_data_buf(void)
 }
 
 
+/**
+ * @test cmp_ent_get_data_buf_const
+ */
+
+void test_cmp_ent_get_data_buf_const(void)
+{
+	enum cmp_data_type data_type;
+	struct cmp_entity ent = {0};
+	const char *adr;
+	uint32_t s, hdr_size;
+	int error;
+
+	for (data_type = DATA_TYPE_IMAGETTE;
+	     data_type <= DATA_TYPE_F_CAM_BACKGROUND;
+	     data_type++) {
+		s = cmp_ent_create(&ent, data_type, 0, 0);
+		TEST_ASSERT_NOT_EQUAL_INT(0, s);
+
+		adr = cmp_ent_get_data_buf_const(&ent);
+		TEST_ASSERT_NOT_NULL(adr);
+
+		hdr_size = cmp_ent_cal_hdr_size(data_type, 0);
+		TEST_ASSERT_EQUAL_INT(hdr_size, adr-(char *)&ent);
+	}
+
+	/* RAW mode test */
+	for (data_type = DATA_TYPE_IMAGETTE;
+	     data_type <= DATA_TYPE_CHUNK;
+	     data_type++) {
+		s = cmp_ent_create(&ent, data_type, 1, 0);
+		TEST_ASSERT_NOT_EQUAL_INT(0, s);
+
+		adr = cmp_ent_get_data_buf_const(&ent);
+		TEST_ASSERT_NOT_NULL(adr);
+
+		hdr_size = cmp_ent_cal_hdr_size(data_type, 1);
+		TEST_ASSERT_EQUAL_INT(hdr_size, adr-(char *)&ent);
+	}
+
+	/* ent = NULL test */
+	adr = cmp_ent_get_data_buf_const(NULL);
+	TEST_ASSERT_NULL(adr);
+
+	/* compression data type not supported test */
+	error = cmp_ent_set_data_type(&ent, DATA_TYPE_UNKNOWN, 0);
+	TEST_ASSERT_FALSE(error);
+	adr = cmp_ent_get_data_buf_const(&ent);
+	TEST_ASSERT_NULL(adr);
+
+	error = cmp_ent_set_data_type(&ent, (enum cmp_data_type)234, 1);
+	TEST_ASSERT_FALSE(error);
+	adr = cmp_ent_get_data_buf_const(&ent);
+	TEST_ASSERT_NULL(adr);
+}
+
+
 /**
  * @test cmp_ent_get_cmp_data
  */
@@ -1436,7 +1495,7 @@ void test_cmp_ent_write_rdcu_cmp_pars(void)
 	uint32_t size;
 	struct cmp_entity *ent;
 	struct cmp_info info;
-	struct cmp_cfg cfg;
+	struct rdcu_cfg rcfg;
 
 	info.cmp_mode_used = CMP_MODE_DIFF_ZERO;
 	info.spill_used = 42;
@@ -1461,10 +1520,10 @@ void test_cmp_ent_write_rdcu_cmp_pars(void)
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_data_type_raw_bit(ent));
 	TEST_ASSERT_EQUAL_INT(12, cmp_ent_get_cmp_data_size(ent));
 
-	TEST_ASSERT_EQUAL_INT(cmp_cal_size_of_data(info.samples_used, DATA_TYPE_IMAGETTE), cmp_ent_get_original_size(ent));
+	TEST_ASSERT_EQUAL_INT(info.samples_used * sizeof(uint16_t), cmp_ent_get_original_size(ent));
 	TEST_ASSERT_EQUAL_INT(info.cmp_mode_used, cmp_ent_get_cmp_mode(ent));
 	TEST_ASSERT_EQUAL_INT(info.model_value_used, cmp_ent_get_model_value(ent));
-	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_max_used_bits_version(ent));
+	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_reserved(ent));
 	TEST_ASSERT_EQUAL_INT(info.round_used, cmp_ent_get_lossy_cmp_par(ent));
 
 	TEST_ASSERT_EQUAL_INT(info.spill_used, cmp_ent_get_ima_spill(ent));
@@ -1488,20 +1547,20 @@ void test_cmp_ent_write_rdcu_cmp_pars(void)
 	TEST_ASSERT_EQUAL_INT(1, cmp_ent_get_data_type_raw_bit(ent));
 	TEST_ASSERT_EQUAL_INT(12, cmp_ent_get_cmp_data_size(ent));
 
-	TEST_ASSERT_EQUAL_INT(cmp_cal_size_of_data(info.samples_used, DATA_TYPE_IMAGETTE), cmp_ent_get_original_size(ent));
+	TEST_ASSERT_EQUAL_INT(info.samples_used * sizeof(uint16_t), cmp_ent_get_original_size(ent));
 	TEST_ASSERT_EQUAL_INT(info.cmp_mode_used, cmp_ent_get_cmp_mode(ent));
 	TEST_ASSERT_EQUAL_INT(info.model_value_used, cmp_ent_get_model_value(ent));
-	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_max_used_bits_version(ent));
+	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_reserved(ent));
 	TEST_ASSERT_EQUAL_INT(info.round_used, cmp_ent_get_lossy_cmp_par(ent));
 
 	free(ent);
 
 	/* adaptive configuration */
 	info.cmp_mode_used = CMP_MODE_MODEL_MULTI;
-	cfg.ap1_golomb_par = 0xFF;
-	cfg.ap1_spill = 1;
-	cfg.ap2_golomb_par = 0x32;
-	cfg.ap2_spill = 201;
+	rcfg.ap1_golomb_par = 0xFF;
+	rcfg.ap1_spill = 1;
+	rcfg.ap2_golomb_par = 0x32;
+	rcfg.ap2_spill = 201;
 
 	/* create a adaptive imagette compression entity */
 	size = cmp_ent_create(NULL, DATA_TYPE_IMAGETTE_ADAPTIVE, info.cmp_mode_used == CMP_MODE_RAW, 12);
@@ -1510,35 +1569,35 @@ void test_cmp_ent_write_rdcu_cmp_pars(void)
 	size = cmp_ent_create(ent, DATA_TYPE_IMAGETTE_ADAPTIVE, info.cmp_mode_used == CMP_MODE_RAW, 12);
 	TEST_ASSERT_NOT_EQUAL_INT(0, size);
 
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	TEST_ASSERT_EQUAL_INT(DATA_TYPE_IMAGETTE_ADAPTIVE, cmp_ent_get_data_type(ent));
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_data_type_raw_bit(ent));
 	TEST_ASSERT_EQUAL_INT(12, cmp_ent_get_cmp_data_size(ent));
 
-	TEST_ASSERT_EQUAL_INT(cmp_cal_size_of_data(info.samples_used, DATA_TYPE_IMAGETTE_ADAPTIVE), cmp_ent_get_original_size(ent));
+	TEST_ASSERT_EQUAL_INT(info.samples_used * sizeof(uint16_t), cmp_ent_get_original_size(ent));
 	TEST_ASSERT_EQUAL_INT(info.cmp_mode_used, cmp_ent_get_cmp_mode(ent));
 	TEST_ASSERT_EQUAL_INT(info.model_value_used, cmp_ent_get_model_value(ent));
-	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_max_used_bits_version(ent));
+	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_reserved(ent));
 	TEST_ASSERT_EQUAL_INT(info.round_used, cmp_ent_get_lossy_cmp_par(ent));
 
 	TEST_ASSERT_EQUAL_INT(info.spill_used, cmp_ent_get_ima_spill(ent));
 	TEST_ASSERT_EQUAL_INT(info.golomb_par_used, cmp_ent_get_ima_golomb_par(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap1_spill, cmp_ent_get_ima_ap1_spill(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap1_golomb_par, cmp_ent_get_ima_ap1_golomb_par(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap2_spill, cmp_ent_get_ima_ap2_spill(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap2_golomb_par, cmp_ent_get_ima_ap2_golomb_par(ent));
+	TEST_ASSERT_EQUAL_INT(rcfg.ap1_spill, cmp_ent_get_ima_ap1_spill(ent));
+	TEST_ASSERT_EQUAL_INT(rcfg.ap1_golomb_par, cmp_ent_get_ima_ap1_golomb_par(ent));
+	TEST_ASSERT_EQUAL_INT(rcfg.ap2_spill, cmp_ent_get_ima_ap2_spill(ent));
+	TEST_ASSERT_EQUAL_INT(rcfg.ap2_golomb_par, cmp_ent_get_ima_ap2_golomb_par(ent));
 
 
 	/** error cases **/
 
 	/* ent = NULL */
-	error = cmp_ent_write_rdcu_cmp_pars(NULL, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(NULL, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
 
 	/* info = NULL */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, NULL, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, NULL, &rcfg);
 	TEST_ASSERT_TRUE(error);
 
 	/* cfg = NULL and adaptive data type */
@@ -1547,35 +1606,35 @@ void test_cmp_ent_write_rdcu_cmp_pars(void)
 
 	/* compressed data are to big for the compression entity */
 	info.cmp_size = 12*8 + 1;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
 	info.cmp_size = 1;
 
 	/* wrong data_type */
 	cmp_ent_set_data_type(ent, DATA_TYPE_S_FX, 0);
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
 	cmp_ent_set_data_type(ent, DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE, 0);
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* original_size to high */
 	info.samples_used = 0x800000;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
 	info.samples_used = 0x7FFFFF;
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* cmp_mode to high */
 	info.cmp_mode_used = 0x100;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
 	info.cmp_mode_used = 0xFF;
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	TEST_ASSERT_EQUAL_INT(1, sizeof(info.model_value_used));
@@ -1602,79 +1661,79 @@ void test_cmp_ent_write_rdcu_cmp_pars(void)
 
 	/* spill to high */
 	info.spill_used = 0x10000;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
 	info.spill_used = 0xFFFF;
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* golomb_par to high */
 	info.golomb_par_used = 0x100;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
 	info.golomb_par_used = 0xFF;
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* adaptive 1 spill to high */
-	cfg.ap1_spill = 0x10000;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	rcfg.ap1_spill = 0x10000;
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
-	cfg.ap1_spill = 0xFFFF;
+	rcfg.ap1_spill = 0xFFFF;
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* adaptive 1  golomb_par to high */
-	cfg.ap1_golomb_par = 0x100;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	rcfg.ap1_golomb_par = 0x100;
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
-	cfg.ap1_golomb_par = 0xFF;
+	rcfg.ap1_golomb_par = 0xFF;
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* adaptive 2 spill to high */
-	cfg.ap2_spill = 0x10000;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	rcfg.ap2_spill = 0x10000;
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
-	cfg.ap2_spill = 0xFFFF;
+	rcfg.ap2_spill = 0xFFFF;
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* adaptive 2  golomb_par to high */
-	cfg.ap2_golomb_par = 0x100;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	rcfg.ap2_golomb_par = 0x100;
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
-	cfg.ap2_golomb_par = 0xFF;
+	rcfg.ap2_golomb_par = 0xFF;
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* The entity's raw data bit is not set, but the configuration contains raw data */
 	info.cmp_mode_used = CMP_MODE_RAW;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
 	info.cmp_mode_used = CMP_MODE_MODEL_MULTI;
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* The entity's raw data bit is set, but the configuration contains no raw data */
 	cmp_ent_set_data_type(ent, DATA_TYPE_IMAGETTE_ADAPTIVE, 1); /* set raw bit */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
 	cmp_ent_set_data_type(ent, DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE, 0);
 	/* this should work */
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* compression error set */
 	info.cmp_err = 1;
-	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &cfg);
+	error = cmp_ent_write_rdcu_cmp_pars(ent, &info, &rcfg);
 	TEST_ASSERT_TRUE(error);
 	info.cmp_err = 0;
 
@@ -1712,7 +1771,7 @@ void test_cmp_ent_create(void)
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_original_size(ent));
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_cmp_mode(ent));
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_model_value(ent));
-	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_max_used_bits_version(ent));
+	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_reserved(ent));
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_lossy_cmp_par(ent));
 
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_ima_spill(ent));
@@ -1736,7 +1795,7 @@ void test_cmp_ent_create(void)
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_original_size(ent));
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_cmp_mode(ent));
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_model_value(ent));
-	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_max_used_bits_version(ent));
+	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_reserved(ent));
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_lossy_cmp_par(ent));
 
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_ima_spill(ent));
@@ -1760,7 +1819,7 @@ void test_cmp_ent_create(void)
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_original_size(ent));
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_cmp_mode(ent));
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_model_value(ent));
-	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_max_used_bits_version(ent));
+	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_reserved(ent));
 	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_lossy_cmp_par(ent));
 	free(ent);
 
@@ -1793,148 +1852,6 @@ void test_cmp_ent_create(void)
 }
 
 
-/**
- * @test cmp_ent_build
- */
-
-void test_cmp_ent_build(void)
-{
-	size_t size;
-	struct cmp_entity *ent;
-	uint32_t version_id;
-	uint64_t start_time, end_time;
-	uint16_t model_id;
-	uint8_t model_counter;
-	struct cmp_cfg cfg;
-	int cmp_size_bits;
-	struct cmp_max_used_bits max_used_bits = {0};
-
-	/* set up max used bit version */
-	max_used_bits.version = 42;
-	cfg.max_used_bits = &max_used_bits;
-
-	version_id = 42;
-	start_time = 100;
-	end_time = 200;
-	model_id = 12;
-	model_counter = 23;
-	cfg.data_type = DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE;
-	cfg.cmp_mode = CMP_MODE_MODEL_MULTI;
-	cfg.model_value = 11;
-	cfg.round = 2;
-	cfg.samples = 9;
-	cfg.spill = MIN_IMA_SPILL;
-	cfg.golomb_par = MAX_IMA_GOLOMB_PAR;
-	cfg.ap1_spill = 555;
-	cfg.ap1_golomb_par = 14;
-	cfg.ap2_spill = 333;
-	cfg.ap2_golomb_par = 43;
-	cmp_size_bits = 60*8;
-
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+60, size);
-	ent = malloc(size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+60, size);
-
-	TEST_ASSERT_EQUAL_INT(version_id, cmp_ent_get_version_id(ent));
-	TEST_ASSERT_EQUAL_INT(60, cmp_ent_get_cmp_data_size(ent));
-	TEST_ASSERT_EQUAL_INT(cmp_cal_size_of_data(cfg.samples, cfg.data_type), cmp_ent_get_original_size(ent));
-	TEST_ASSERT_EQUAL_INT(start_time, cmp_ent_get_start_timestamp(ent));
-	TEST_ASSERT_EQUAL_INT(end_time, cmp_ent_get_end_timestamp(ent));
-	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_data_type_raw_bit(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.data_type, cmp_ent_get_data_type(ent));
-
-	TEST_ASSERT_EQUAL_INT(cfg.cmp_mode, cmp_ent_get_cmp_mode(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.model_value, cmp_ent_get_model_value(ent));
-	TEST_ASSERT_EQUAL_INT(model_id, cmp_ent_get_model_id(ent));
-	TEST_ASSERT_EQUAL_INT(model_counter, cmp_ent_get_model_counter(ent));
-	TEST_ASSERT_EQUAL_INT(max_used_bits.version, cmp_ent_get_max_used_bits_version(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.round, cmp_ent_get_lossy_cmp_par(ent));
-
-	TEST_ASSERT_EQUAL_INT(cfg.spill, cmp_ent_get_ima_spill(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.golomb_par, cmp_ent_get_ima_golomb_par(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap1_spill, cmp_ent_get_ima_ap1_spill(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap1_golomb_par, cmp_ent_get_ima_ap1_golomb_par(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap2_spill, cmp_ent_get_ima_ap2_spill(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap2_golomb_par, cmp_ent_get_ima_ap2_golomb_par(ent));
-
-	/* entity size is smaller than */
-	cmp_size_bits = 2;
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+cmp_bit_to_byte((unsigned int)cmp_size_bits), size);
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+cmp_bit_to_byte((unsigned int)cmp_size_bits), size);
-
-	/** error cases **/
-	/* cfg = NULL */
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, NULL, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(0, size);
-
-	/* cmp_size_bits negative */
-	cmp_size_bits = -1;
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(0, size);
-	cmp_size_bits = 60*8;
-
-	/* unknown data type */
-	cfg.data_type = DATA_TYPE_UNKNOWN;
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(0, size);
-	cfg.data_type = DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE;
-
-#if 0
-	/* version id to high */
-	version_id = 0x100000000;
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(0, size);
-#endif
-
-	/* start_time to high */
-	start_time = 0x1000000000000ULL;
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(0, size);
-	/* this should work */
-	start_time = 0xFFFFFFFFFFFFULL;
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+60, size);
-
-	/* end_time to high */
-	end_time = 0x1000000000000ULL;
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(0, size);
-	/* this should work */
-	end_time = 0xFFFFFFFFFFFFULL;
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+60, size);
-
-	/* golomb_par to high */
-	cfg.golomb_par = 0x100;
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(0, size);
-	/* this should work */
-	cfg.golomb_par = 0xFF;
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+60, size);
-
-	free(ent);
-}
-
-
 /**
  * @test cmp_ent_create_timestamp
  */
@@ -1950,7 +1867,7 @@ void test_cmp_ent_create_timestamp(void)
 	ts.tv_nsec = 0;
 	timestamp1 = cmp_ent_create_timestamp(&ts);
 	ts.tv_sec = EPOCH + 1;
-	ts.tv_nsec = 15258;
+	ts.tv_nsec = 15259;
 	timestamp2 = cmp_ent_create_timestamp(&ts);
 	TEST_ASSERT_EQUAL_HEX(0x10001, timestamp2-timestamp1);
 
@@ -1985,44 +1902,56 @@ void test_cmp_ent_print(void)
 {
 	size_t size;
 	struct cmp_entity *ent;
-	uint32_t version_id;
-	uint64_t start_time, end_time;
-	uint16_t model_id;
-	uint8_t model_counter;
-	struct cmp_cfg cfg = {0};
-	int cmp_size_bits;
-	struct cmp_max_used_bits max_used_bits = {0};
-
-	/* set up max used bit version */
-	max_used_bits.version = 42;
-	cfg.max_used_bits = &max_used_bits;
-
-	version_id = 42;
-	start_time = 100;
-	end_time = 200;
-	model_id = 12;
-	model_counter = 23;
-	cfg.data_type = DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE;
-	cfg.cmp_mode = CMP_MODE_MODEL_MULTI;
-	cfg.model_value = 11;
-	cfg.round = 2;
-	cfg.samples = 9;
-	cfg.spill = MIN_IMA_SPILL;
-	cfg.golomb_par = MAX_IMA_GOLOMB_PAR;
-	cfg.ap1_spill = 555;
-	cfg.ap1_golomb_par = 14;
-	cfg.ap2_spill = 333;
-	cfg.ap2_golomb_par = 43;
-	cmp_size_bits = 60*8;
-
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
+
+	uint32_t version_id = 42;
+	uint64_t start_timestamp = 100;
+	uint64_t end_timestamp = 200;
+	uint16_t model_id = 12;
+	uint8_t model_counter = 23;
+	uint32_t data_type = DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE;
+	uint32_t cmp_mode = CMP_MODE_MODEL_MULTI;
+	uint32_t model_value_used = 11;
+	uint32_t lossy_cmp_par_used = 2;
+	uint32_t original_size = 18;
+	uint32_t spill = MIN_IMA_SPILL;
+	uint32_t golomb_par = MAX_IMA_GOLOMB_PAR;
+	uint32_t ap1_spill = 555;
+	uint32_t ap1_golomb_par = 14;
+	uint32_t ap2_spill = 333;
+	uint32_t ap2_golomb_par = 43;
+	uint32_t cmp_size_byte = 60;
+	uint8_t reserved = 42;
+
+	size = cmp_ent_create(NULL, data_type, 0, cmp_size_byte);
 	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+60, size);
 	ent = calloc(1, size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
+	size = cmp_ent_create(ent, data_type, 0, cmp_size_byte);
 	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+60, size);
 
+	cmp_ent_set_version_id(ent, version_id);
+
+	cmp_ent_set_original_size(ent, original_size);
+
+	cmp_ent_set_start_timestamp(ent, start_timestamp);
+	cmp_ent_set_end_timestamp(ent, end_timestamp);
+
+	cmp_ent_set_cmp_mode(ent, cmp_mode);
+	cmp_ent_set_model_value(ent, model_value_used);
+	cmp_ent_set_model_id(ent, model_id);
+	cmp_ent_set_model_counter(ent, model_counter);
+	cmp_ent_set_reserved(ent, reserved);
+	cmp_ent_set_lossy_cmp_par(ent, lossy_cmp_par_used);
+
+	cmp_ent_set_ima_spill(ent, spill);
+	cmp_ent_set_ima_golomb_par(ent, golomb_par);
+
+	cmp_ent_set_ima_ap1_spill(ent, ap1_spill);
+	cmp_ent_set_ima_ap1_golomb_par(ent, ap1_golomb_par);
+
+	cmp_ent_set_ima_ap2_spill(ent, ap2_spill);
+	cmp_ent_set_ima_ap2_golomb_par(ent, ap2_golomb_par);
+
+
 	cmp_ent_print(ent);
 
 	/* error case */
@@ -2040,86 +1969,80 @@ void test_cmp_ent_parse(void)
 {
 	size_t size;
 	struct cmp_entity *ent;
-	uint32_t version_id;
-	uint64_t start_time, end_time;
-	uint16_t model_id;
-	uint8_t model_counter;
-	struct cmp_cfg cfg = {0};
-	int cmp_size_bits;
-	struct cmp_max_used_bits max_used_bits = {0};
-
-	/* set up max used bit version */
-	max_used_bits.version = 42;
-	cfg.max_used_bits = &max_used_bits;
-
-	version_id = 42;
-	start_time = 100;
-	end_time = 200;
-	model_id = 12;
-	model_counter = 23;
-	cfg.data_type = DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE;
-	cfg.cmp_mode = CMP_MODE_MODEL_MULTI;
-	cfg.model_value = 11;
-	cfg.round = 2;
-	cfg.samples = 9;
-	cfg.spill = MIN_IMA_SPILL;
-	cfg.golomb_par = MAX_IMA_GOLOMB_PAR;
-	cfg.ap1_spill = 555;
-	cfg.ap1_golomb_par = 14;
-	cfg.ap2_spill = 333;
-	cfg.ap2_golomb_par = 43;
-	cmp_size_bits = 60*8;
-
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
+
+	uint32_t version_id = 42;
+	uint64_t start_timestamp = 100;
+	uint64_t end_timestamp = 200;
+	uint16_t model_id = 12;
+	uint8_t model_counter = 23;
+	uint32_t data_type = DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE;
+	uint32_t cmp_mode = CMP_MODE_MODEL_MULTI;
+	uint32_t model_value_used = 11;
+	uint32_t lossy_cmp_par_used = 2;
+	uint32_t original_size = 18;
+	uint32_t spill = MIN_IMA_SPILL;
+	uint32_t golomb_par = MAX_IMA_GOLOMB_PAR;
+	uint32_t ap1_spill = 555;
+	uint32_t ap1_golomb_par = 14;
+	uint32_t ap2_spill = 333;
+	uint32_t ap2_golomb_par = 43;
+	uint32_t cmp_size_byte = 60;
+	uint8_t resvered = 42;
+
+	size = cmp_ent_create(NULL, data_type, 0, cmp_size_byte);
 	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+60, size);
 	ent = calloc(1, size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
+	size = cmp_ent_create(ent, data_type, 0, cmp_size_byte);
 	TEST_ASSERT_EQUAL_UINT(IMAGETTE_ADAPTIVE_HEADER_SIZE+60, size);
 
-	cmp_ent_parse(ent);
+	cmp_ent_set_version_id(ent, version_id);
 
-	free(ent);
+	cmp_ent_set_original_size(ent, original_size);
 
+	cmp_ent_set_start_timestamp(ent, start_timestamp);
+	cmp_ent_set_end_timestamp(ent, end_timestamp);
 
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(IMAGETTE_HEADER_SIZE+60, size);
-	ent = calloc(1, size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
+	cmp_ent_set_cmp_mode(ent, cmp_mode);
+	cmp_ent_set_model_value(ent, model_value_used);
+	cmp_ent_set_model_id(ent, model_id);
+	cmp_ent_set_model_counter(ent, model_counter);
+	cmp_ent_set_reserved(ent, resvered);
+	cmp_ent_set_lossy_cmp_par(ent, lossy_cmp_par_used);
+
+	cmp_ent_set_ima_spill(ent, spill);
+	cmp_ent_set_ima_golomb_par(ent, golomb_par);
+
+	cmp_ent_set_ima_ap1_spill(ent, ap1_spill);
+	cmp_ent_set_ima_ap1_golomb_par(ent, ap1_golomb_par);
+
+	cmp_ent_set_ima_ap2_spill(ent, ap2_spill);
+	cmp_ent_set_ima_ap2_golomb_par(ent, ap2_golomb_par);
+
+	cmp_ent_parse(ent);
+
+
+	data_type = DATA_TYPE_IMAGETTE;
+	size = cmp_ent_create(ent, data_type, 0, cmp_size_byte);
 	TEST_ASSERT_EQUAL_UINT(IMAGETTE_HEADER_SIZE+60, size);
 
 	cmp_ent_parse(ent);
 
-	free(ent);
 
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.cmp_mode = CMP_MODE_RAW;
+	data_type = DATA_TYPE_IMAGETTE;
+	cmp_mode = CMP_MODE_RAW;
 	version_id = 0x800F0003;
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(GENERIC_HEADER_SIZE+60, size);
-	ent = calloc(1, size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
+	size = cmp_ent_create(ent, data_type, cmp_mode == CMP_MODE_RAW, cmp_size_byte);
 	TEST_ASSERT_EQUAL_UINT(GENERIC_HEADER_SIZE+60, size);
+	cmp_ent_set_version_id(ent, version_id);
+	cmp_ent_set_cmp_mode(ent, cmp_mode);
 
 	cmp_ent_parse(ent);
 
-	free(ent);
 
-	cfg.data_type = DATA_TYPE_CHUNK;
-	cfg.cmp_mode = CMP_MODE_MODEL_ZERO;
-	version_id = 0x800F0003;
-	size = cmp_ent_build(NULL, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
-	TEST_ASSERT_EQUAL_UINT(NON_IMAGETTE_HEADER_SIZE+60, size);
-	ent = calloc(1, size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_build(ent, version_id, start_time, end_time, model_id,
-			     model_counter, &cfg, cmp_size_bits);
+	data_type = DATA_TYPE_CHUNK;
+	cmp_mode = CMP_MODE_MODEL_ZERO;
+	cmp_ent_set_cmp_mode(ent, cmp_mode);
+	size = cmp_ent_create(ent, data_type, cmp_mode == CMP_MODE_RAW, cmp_size_byte);
 	TEST_ASSERT_EQUAL_UINT(NON_IMAGETTE_HEADER_SIZE+60, size);
 
 	cmp_ent_parse(ent);
diff --git a/test/cmp_icu/test_cmp_icu.c b/test/cmp_icu/test_cmp_icu.c
index 49823b5e9e48b9bd2c970079ada05d08849794da..7b8b5c94a1eae5d51d8d2697c70dfe27b63ac862 100644
--- a/test/cmp_icu/test_cmp_icu.c
+++ b/test/cmp_icu/test_cmp_icu.c
@@ -20,11 +20,13 @@
 #include <stdlib.h>
 #include <leon_inttypes.h>
 
-#if defined __has_include
-#  if __has_include(<time.h>)
-#    include <time.h>
-#    include <unistd.h>
-#    define HAS_TIME_H 1
+#ifndef ICU_ASW
+#  if defined __has_include
+#    if __has_include(<time.h>)
+#      include <time.h>
+#      include <unistd.h>
+#      define HAS_TIME_H 1
+#    endif
 #  endif
 #endif
 
@@ -33,6 +35,7 @@
 
 #include <cmp_icu.h>
 #include <cmp_data_types.h>
+#include <cmp_rdcu_cfg.h>
 #include "../../lib/icu_compress/cmp_icu.c" /* this is a hack to test static functions */
 
 
@@ -65,1206 +68,6 @@ void setUp(void)
 }
 
 
-/**
- * @test cmp_cfg_icu_create
- */
-
-void test_cmp_cfg_icu_create(void)
-{
-	struct cmp_cfg cfg;
-	enum cmp_data_type data_type;
-	enum cmp_mode cmp_mode;
-	uint32_t model_value, lossy_par;
-	const enum cmp_data_type biggest_data_type = DATA_TYPE_F_CAM_BACKGROUND;
-
-	/* wrong data type tests */
-	data_type = DATA_TYPE_UNKNOWN; /* not valid data type */
-	cmp_mode = CMP_MODE_RAW;
-	model_value = 0;
-	lossy_par = CMP_LOSSLESS;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_UNKNOWN, cfg.data_type);
-	memset(&cfg, 0, sizeof(cfg));
-
-	data_type = biggest_data_type + 1; /* not valid data type */
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_UNKNOWN, cfg.data_type);
-	memset(&cfg, 0, sizeof(cfg));
-
-	data_type = biggest_data_type;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(biggest_data_type, cfg.data_type);
-	TEST_ASSERT_EQUAL_INT(CMP_MODE_RAW, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL_INT(0, cfg.model_value);
-	TEST_ASSERT_EQUAL_INT(0, cfg.round);
-	TEST_ASSERT_EQUAL(&MAX_USED_BITS_SAFE, cfg.max_used_bits);
-	memset(&cfg, 0, sizeof(cfg));
-
-	/* this should work */
-	data_type = DATA_TYPE_IMAGETTE;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_IMAGETTE, cfg.data_type);
-	TEST_ASSERT_EQUAL_INT(CMP_MODE_RAW, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL_INT(0, cfg.model_value);
-	TEST_ASSERT_EQUAL_INT(0, cfg.round);
-	TEST_ASSERT_EQUAL(&MAX_USED_BITS_SAFE, cfg.max_used_bits);
-	memset(&cfg, 0, sizeof(cfg));
-
-	/* wrong compression mode tests */
-	cmp_mode = (enum cmp_mode)(MAX_CMP_MODE + 1);
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_UNKNOWN, cfg.data_type);
-	memset(&cfg, 0, sizeof(cfg));
-
-	cmp_mode = (enum cmp_mode)-1;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_UNKNOWN, cfg.data_type);
-	memset(&cfg, 0, sizeof(cfg));
-
-	/* this should work */
-	cmp_mode = MAX_CMP_MODE;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_IMAGETTE, cfg.data_type);
-	TEST_ASSERT_EQUAL_INT(MAX_CMP_MODE, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL_INT(0, cfg.model_value);
-	TEST_ASSERT_EQUAL_INT(0, cfg.round);
-	TEST_ASSERT_EQUAL(&MAX_USED_BITS_SAFE, cfg.max_used_bits);
-	memset(&cfg, 0, sizeof(cfg));
-
-	/* wrong model_value tests */
-	cmp_mode = CMP_MODE_MODEL_MULTI; /* model value checks only active on model mode */
-	model_value = MAX_MODEL_VALUE + 1;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_UNKNOWN, cfg.data_type);
-
-	model_value = -1U;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_UNKNOWN, cfg.data_type);
-
-	/* this should work */
-	model_value = MAX_MODEL_VALUE;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_IMAGETTE, cfg.data_type);
-	TEST_ASSERT_EQUAL_INT(CMP_MODE_MODEL_MULTI, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL_INT(16, cfg.model_value);
-	TEST_ASSERT_EQUAL_INT(0, cfg.round);
-	TEST_ASSERT_EQUAL(&MAX_USED_BITS_SAFE, cfg.max_used_bits);
-
-	/* no checks for model mode -> no model cmp_mode */
-	cmp_mode = CMP_MODE_RAW;
-	model_value = MAX_MODEL_VALUE + 1;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_IMAGETTE, cfg.data_type);
-	TEST_ASSERT_EQUAL_INT(CMP_MODE_RAW, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL_INT(MAX_MODEL_VALUE + 1, cfg.model_value);
-	TEST_ASSERT_EQUAL_INT(0, cfg.round);
-	TEST_ASSERT_EQUAL(&MAX_USED_BITS_SAFE, cfg.max_used_bits);
-	model_value = MAX_MODEL_VALUE;
-
-	/* wrong lossy_par tests */
-	lossy_par = MAX_ICU_ROUND + 1;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_UNKNOWN, cfg.data_type);
-
-	lossy_par = -1U;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_UNKNOWN, cfg.data_type);
-
-	/* this should work */
-	lossy_par = MAX_ICU_ROUND;
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(DATA_TYPE_IMAGETTE, cfg.data_type);
-	TEST_ASSERT_EQUAL_INT(CMP_MODE_RAW, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL_INT(16, cfg.model_value);
-	TEST_ASSERT_EQUAL_INT(3, cfg.round);
-	TEST_ASSERT_EQUAL(&MAX_USED_BITS_SAFE, cfg.max_used_bits);
-
-	/* random test */
-	data_type = cmp_rand_between(DATA_TYPE_IMAGETTE, biggest_data_type);
-	cmp_mode = cmp_rand_between(CMP_MODE_RAW, MAX_CMP_MODE);
-	model_value = cmp_rand_between(0, MAX_MODEL_VALUE);
-	lossy_par = cmp_rand_between(CMP_LOSSLESS, MAX_ICU_ROUND);
-	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL_INT(data_type, cfg.data_type);
-	TEST_ASSERT_EQUAL_INT(cmp_mode, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL_INT(model_value, cfg.model_value);
-	TEST_ASSERT_EQUAL_INT(lossy_par, cfg.round);
-	TEST_ASSERT_EQUAL(&MAX_USED_BITS_SAFE, cfg.max_used_bits);
-}
-
-
-/**
- * @test cmp_cfg_icu_buffers
- */
-
-void test_cmp_cfg_icu_buffers(void)
-{
-	struct cmp_cfg cfg;
-	void *data_to_compress;
-	uint32_t data_samples;
-	void *model_of_data;
-	void *updated_model;
-	uint32_t *compressed_data;
-	uint32_t compressed_data_len_samples;
-	size_t s;
-	uint16_t ima_data[4] = {42, 23, 0, 0xFFFF};
-	uint16_t ima_model[4] = {0xC, 0xA, 0xFF, 0xE};
-	uint16_t ima_up_model[4] = {0};
-	uint32_t cmp_data[2] = {0};
-
-	/* error case: unknown  data_type */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_UNKNOWN, CMP_MODE_DIFF_ZERO, 16, CMP_LOSSLESS);
-	data_to_compress = ima_data;
-	data_samples = 4;
-	model_of_data = NULL;
-	updated_model = NULL;
-	compressed_data = cmp_data;
-	compressed_data_len_samples = 4;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* error case: no data test */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_DIFF_ZERO, 16, CMP_LOSSLESS);
-	data_to_compress = NULL; /* no data set */
-	data_samples = 4;
-	model_of_data = NULL;
-	updated_model = NULL;
-	compressed_data = cmp_data;
-	compressed_data_len_samples = 4;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* now its should work */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_DIFF_ZERO, 16, CMP_LOSSLESS);
-	data_to_compress = ima_data;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(8, s);
-	TEST_ASSERT_EQUAL(ima_data, cfg.input_buf);
-	TEST_ASSERT_EQUAL_INT(NULL, cfg.model_buf);
-	TEST_ASSERT_EQUAL_INT(4, cfg.samples);
-	TEST_ASSERT_EQUAL(NULL, cfg.icu_new_model_buf);
-	TEST_ASSERT_EQUAL(cmp_data, cfg.icu_output_buf);
-	TEST_ASSERT_EQUAL_INT(4, cfg.buffer_length);
-
-	/* error case: model mode and no model */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	model_of_data = NULL;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* now its should work */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	model_of_data = ima_model;
-	updated_model = ima_model;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(8, s);
-	TEST_ASSERT_EQUAL(ima_data, cfg.input_buf);
-	TEST_ASSERT_EQUAL_INT(ima_model, cfg.model_buf);
-	TEST_ASSERT_EQUAL_INT(4, cfg.samples);
-	TEST_ASSERT_EQUAL(ima_model, cfg.icu_new_model_buf);
-	TEST_ASSERT_EQUAL(cmp_data, cfg.icu_output_buf);
-	TEST_ASSERT_EQUAL_INT(4, cfg.buffer_length);
-
-	/* error case: data == model */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	data_to_compress = ima_data;
-	model_of_data = ima_data;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* error case: data == compressed_data */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	data_to_compress = ima_data;
-	model_of_data = ima_model;
-	compressed_data = (void *)ima_data;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* error case: data == updated_model */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	data_to_compress = ima_data;
-	model_of_data = ima_model;
-	updated_model = ima_data;
-	compressed_data = (void *)ima_data;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* error case: model == compressed_data */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	data_to_compress = ima_data;
-	model_of_data = ima_model;
-	compressed_data = (void *)ima_model;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* error case: updated_model == compressed_data */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	data_to_compress = ima_data;
-	model_of_data = ima_model;
-	updated_model = ima_up_model;
-	compressed_data = (void *)ima_up_model;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* warning case: samples = 0 */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	data_to_compress = ima_data;
-	data_samples = 0;
-	model_of_data = ima_model;
-	updated_model = ima_up_model;
-	compressed_data = cmp_data;
-	compressed_data_len_samples = 4;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(8, s);
-	TEST_ASSERT_EQUAL(ima_data, cfg.input_buf);
-	TEST_ASSERT_EQUAL_INT(ima_model, cfg.model_buf);
-	TEST_ASSERT_EQUAL_INT(0, cfg.samples);
-	TEST_ASSERT_EQUAL(ima_up_model, cfg.icu_new_model_buf);
-	TEST_ASSERT_EQUAL(cmp_data, cfg.icu_output_buf);
-	TEST_ASSERT_EQUAL_INT(4, cfg.buffer_length);
-	memset(&cfg, 0, sizeof(cfg));
-
-	/* error case: compressed_data_len_samples = 0 */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	data_samples = 4;
-	compressed_data_len_samples = 0;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* this should now work */
-	/* if data_samples = 0 -> compressed_data_len_samples = 0 is allowed */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	data_samples = 0;
-	compressed_data_len_samples = 0;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s); /* not an error, it is the size of the compressed data */
-	TEST_ASSERT_EQUAL(ima_data, cfg.input_buf);
-	TEST_ASSERT_EQUAL_INT(ima_model, cfg.model_buf);
-	TEST_ASSERT_EQUAL_INT(0, cfg.samples);
-	TEST_ASSERT_EQUAL(ima_up_model, cfg.icu_new_model_buf);
-	TEST_ASSERT_EQUAL(cmp_data, cfg.icu_output_buf);
-	TEST_ASSERT_EQUAL_INT(0, cfg.buffer_length);
-
-	/* this should now work */
-	/* if compressed_data = NULL -> compressed_data_len_samples = 0 is allowed */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	data_samples = 4;
-	compressed_data = NULL;
-	compressed_data_len_samples = 0;
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s); /* not an error, it is the size of the compressed data */
-	TEST_ASSERT_EQUAL(ima_data, cfg.input_buf);
-	TEST_ASSERT_EQUAL_INT(ima_model, cfg.model_buf);
-	TEST_ASSERT_EQUAL_INT(4, cfg.samples);
-	TEST_ASSERT_EQUAL(ima_up_model, cfg.icu_new_model_buf);
-	TEST_ASSERT_EQUAL(NULL, cfg.icu_output_buf);
-	TEST_ASSERT_EQUAL_INT(0, cfg.buffer_length);
-
-	/* error case: RAW mode compressed_data smaller than data_samples */
-	compressed_data = cmp_data;
-	compressed_data_len_samples = 3;
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_RAW, 16, CMP_LOSSLESS);
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* this should now work */
-	compressed_data = NULL;
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_RAW, 16, CMP_LOSSLESS);
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(6, s);
-	TEST_ASSERT_EQUAL(ima_data, cfg.input_buf);
-	TEST_ASSERT_EQUAL_INT(ima_model, cfg.model_buf);
-	TEST_ASSERT_EQUAL_INT(4, cfg.samples);
-	TEST_ASSERT_EQUAL(ima_up_model, cfg.icu_new_model_buf);
-	TEST_ASSERT_EQUAL(NULL, cfg.icu_output_buf);
-	TEST_ASSERT_EQUAL_INT(3, cfg.buffer_length);
-
-	/* this should also now work */
-	compressed_data = cmp_data;
-	compressed_data_len_samples = 4;
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_RAW, 16, CMP_LOSSLESS);
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(8, s);
-	TEST_ASSERT_EQUAL(ima_data, cfg.input_buf);
-	TEST_ASSERT_EQUAL_INT(ima_model, cfg.model_buf);
-	TEST_ASSERT_EQUAL_INT(4, cfg.samples);
-	TEST_ASSERT_EQUAL(ima_up_model, cfg.icu_new_model_buf);
-	TEST_ASSERT_EQUAL(cmp_data, cfg.icu_output_buf);
-	TEST_ASSERT_EQUAL_INT(4, cfg.buffer_length);
-
-	/* error case: compressed data buffer bigger than max compression entity
-	 * data size */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_DIFF_ZERO, 16, CMP_LOSSLESS);
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				0x7FFFED+1);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_DIFF_ZERO, 16, CMP_LOSSLESS);
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				0x7FFFFFFF);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-
-	/* this should also now work */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_DIFF_ZERO, 16, CMP_LOSSLESS);
-	s = cmp_cfg_icu_buffers(&cfg, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				0x7FFFED);
-	TEST_ASSERT_EQUAL_size_t(0xFFFFDA, s);
-
-	/* error case: cfg = NULL */
-	s = cmp_cfg_icu_buffers(NULL, data_to_compress, data_samples,
-				model_of_data, updated_model, compressed_data,
-				compressed_data_len_samples);
-	TEST_ASSERT_EQUAL_size_t(0, s);
-}
-
-
-/**
- * @test cmp_cfg_icu_max_used_bits
- */
-
-void test_cmp_cfg_icu_max_used_bits(void)
-{
-	int error;
-	struct cmp_cfg cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 0, CMP_LOSSLESS);
-	struct cmp_max_used_bits max_used_bits = MAX_USED_BITS_SAFE;
-
-	error = cmp_cfg_icu_max_used_bits(&cfg, &max_used_bits);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL(&max_used_bits, cfg.max_used_bits);
-
-	/* error cases */
-	max_used_bits.s_fx = 33;  /* this value is to big */
-	error = cmp_cfg_icu_max_used_bits(&cfg, &max_used_bits);
-	TEST_ASSERT_TRUE(error);
-	max_used_bits.s_fx = 1;
-
-	error = cmp_cfg_icu_max_used_bits(NULL, &max_used_bits);
-	TEST_ASSERT_TRUE(error);
-
-	error = cmp_cfg_icu_max_used_bits(&cfg, NULL);
-	TEST_ASSERT_TRUE(error);
-}
-
-
-/**
- * @test cmp_cfg_icu_imagette
- */
-
-void test_cmp_cfg_icu_imagette(void)
-{
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par;
-	uint32_t spillover_par;
-	enum cmp_data_type data_type;
-
-	int error;
-
-	/* lowest values 1d/model mode */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_ZERO, 0, CMP_LOSSLESS);
-	cmp_par = MIN_IMA_GOLOMB_PAR;
-	spillover_par = MIN_IMA_SPILL;
-	error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cfg.golomb_par, 1);
-	TEST_ASSERT_EQUAL_INT(cfg.spill, 2);
-
-	/* highest values 1d/model mode */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_CAM_IMAGETTE, CMP_MODE_DIFF_MULTI, 16, CMP_LOSSLESS);
-	cmp_par = MAX_IMA_GOLOMB_PAR;
-	spillover_par = cmp_ima_max_spill(cmp_par);
-	error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cfg.golomb_par, MAX_IMA_GOLOMB_PAR);
-	TEST_ASSERT_EQUAL_INT(cfg.spill, cmp_ima_max_spill(MAX_IMA_GOLOMB_PAR));
-
-	/* wrong data type  test */
-	for (data_type = 0; data_type <= DATA_TYPE_F_CAM_BACKGROUND; data_type++) {
-		cfg = cmp_cfg_icu_create(data_type, CMP_MODE_DIFF_MULTI, 16, CMP_LOSSLESS);
-		error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-		if (data_type == DATA_TYPE_IMAGETTE ||
-		    data_type == DATA_TYPE_SAT_IMAGETTE ||
-		    data_type == DATA_TYPE_F_CAM_IMAGETTE) {
-			TEST_ASSERT_FALSE(error);
-			TEST_ASSERT_EQUAL_INT(data_type, cfg.data_type);
-			TEST_ASSERT_EQUAL_INT(cfg.golomb_par, MAX_IMA_GOLOMB_PAR);
-			TEST_ASSERT_EQUAL_INT(cfg.spill, cmp_ima_max_spill(MAX_IMA_GOLOMB_PAR));
-		} else {
-			TEST_ASSERT_TRUE(error);
-		}
-	}
-
-	/* model/1d MODE tests */
-
-	/* cmp_par to big */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_MULTI, 16, CMP_LOSSLESS);
-	cmp_par = MAX_NON_IMA_GOLOMB_PAR + 1;
-	spillover_par = MIN_IMA_SPILL;
-	error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-	TEST_ASSERT_TRUE(error);
-	/* ignore in RAW MODE */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_RAW, 16, CMP_LOSSLESS);
-	error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-	TEST_ASSERT_FALSE(error);
-
-	/* cmp_par to small */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_MULTI, 16, CMP_LOSSLESS);
-	cmp_par = MIN_IMA_GOLOMB_PAR - 1;
-	spillover_par = MIN_IMA_SPILL;
-	error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-	TEST_ASSERT_TRUE(error);
-	/* ignore in RAW MODE */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_RAW, 16, CMP_LOSSLESS);
-	error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-	TEST_ASSERT_FALSE(error);
-
-	/* spillover_par to big */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_MULTI, 16, CMP_LOSSLESS);
-	cmp_par = MIN_IMA_GOLOMB_PAR;
-	spillover_par = cmp_icu_max_spill(cmp_par)+1;
-	error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-	TEST_ASSERT_TRUE(error);
-	/* ignore in RAW MODE */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_RAW, 16, CMP_LOSSLESS);
-	error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-	TEST_ASSERT_FALSE(error);
-
-	/* spillover_par to small */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	cmp_par = MAX_IMA_GOLOMB_PAR;
-	spillover_par = MIN_IMA_SPILL-1;
-	error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-	TEST_ASSERT_TRUE(error);
-	/* ignore in RAW MODE */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_RAW, 16, CMP_LOSSLESS);
-	error = cmp_cfg_icu_imagette(&cfg, cmp_par, spillover_par);
-	TEST_ASSERT_FALSE(error);
-
-	/* cfg = NULL test*/
-	error = cmp_cfg_icu_imagette(NULL, cmp_par, spillover_par);
-	TEST_ASSERT_TRUE(error);
-}
-
-
-/**
- * @test cmp_cfg_fx_cob
- */
-
-void test_cmp_cfg_fx_cob(void)
-{
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_exp_flags = 2;
-	uint32_t spillover_exp_flags = 2;
-	uint32_t cmp_par_fx = 2;
-	uint32_t spillover_fx = 2;
-	uint32_t cmp_par_ncob = 2;
-	uint32_t spillover_ncob = 2;
-	uint32_t cmp_par_efx = 2;
-	uint32_t spillover_efx = 2;
-	uint32_t cmp_par_ecob = 2;
-	uint32_t spillover_ecob = 2;
-	uint32_t cmp_par_fx_cob_variance = 2;
-	uint32_t spillover_fx_cob_variance = 2;
-	int error;
-	enum cmp_data_type data_type;
-
-
-	/* wrong data type test */
-	for (data_type = 0; data_type <= DATA_TYPE_F_CAM_BACKGROUND; data_type++) {
-		cfg = cmp_cfg_icu_create(data_type, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-		error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-				       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-				       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-				       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-		if (data_type == DATA_TYPE_S_FX ||
-		    data_type == DATA_TYPE_S_FX_EFX ||
-		    data_type == DATA_TYPE_S_FX_NCOB ||
-		    data_type == DATA_TYPE_S_FX_EFX_NCOB_ECOB ||
-		    data_type == DATA_TYPE_L_FX ||
-		    data_type == DATA_TYPE_L_FX_EFX ||
-		    data_type == DATA_TYPE_L_FX_NCOB ||
-		    data_type == DATA_TYPE_L_FX_EFX_NCOB_ECOB ||
-		    data_type == DATA_TYPE_F_FX ||
-		    data_type == DATA_TYPE_F_FX_EFX ||
-		    data_type == DATA_TYPE_F_FX_NCOB ||
-		    data_type == DATA_TYPE_F_FX_EFX_NCOB_ECOB) {
-			TEST_ASSERT_FALSE(error);
-			TEST_ASSERT_EQUAL_INT(data_type, cfg.data_type);
-			TEST_ASSERT_EQUAL_INT(2, cfg.cmp_par_fx);
-			TEST_ASSERT_EQUAL_INT(2, cfg.spill_fx);
-			TEST_ASSERT_EQUAL_INT(2, cfg.cmp_par_exp_flags);
-			TEST_ASSERT_EQUAL_INT(2, cfg.spill_exp_flags);
-			TEST_ASSERT_EQUAL_INT(2, cfg.cmp_par_efx);
-			TEST_ASSERT_EQUAL_INT(2, cfg.spill_efx);
-			TEST_ASSERT_EQUAL_INT(2, cfg.cmp_par_ncob);
-			TEST_ASSERT_EQUAL_INT(2, cfg.spill_ncob);
-			TEST_ASSERT_EQUAL_INT(2, cfg.cmp_par_ecob);
-			TEST_ASSERT_EQUAL_INT(2, cfg.spill_ecob);
-			TEST_ASSERT_EQUAL_INT(2, cfg.cmp_par_fx_cob_variance);
-			TEST_ASSERT_EQUAL_INT(2, cfg.spill_fx_cob_variance);
-		} else {
-			TEST_ASSERT_TRUE(error);
-		}
-	}
-
-	/* cfg == NULL test */
-	error = cmp_cfg_fx_cob(NULL, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_TRUE(error);
-
-	/* test DATA_TYPE_S_FX */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_S_FX, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-	cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = ~0U; /* invalid parameter */
-	spillover_ncob = ~0U; /* invalid parameter */
-	cmp_par_efx = ~0U; /* invalid parameter */
-	spillover_efx = ~0U; /* invalid parameter */
-	cmp_par_ecob = ~0U; /* invalid parameter */
-	spillover_ecob = ~0U; /* invalid parameter */
-	cmp_par_fx_cob_variance = ~0U; /* invalid parameter */
-	spillover_fx_cob_variance = ~0U; /* invalid parameter */
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_exp_flags, cfg.cmp_par_exp_flags);
-	TEST_ASSERT_EQUAL_INT(spillover_exp_flags, cfg.spill_exp_flags);
-
-	/* invalid spillover_exp_flags parameter */
-	cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags)+1;
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_TRUE(error);
-
-	/* invalid cmp_par_fx parameter */
-	cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR - 1;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_TRUE(error);
-
-
-	/* test DATA_TYPE_S_FX_EFX */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_S_FX_EFX, CMP_MODE_MODEL_ZERO, 0, 1);
-	cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = ~0U; /* invalid parameter */
-	spillover_ncob = ~0U; /* invalid parameter */
-	cmp_par_efx = 23;
-	spillover_efx = 42;
-	cmp_par_ecob = ~0U; /* invalid parameter */
-	spillover_ecob = ~0U; /* invalid parameter */
-	cmp_par_fx_cob_variance = ~0U; /* invalid parameter */
-	spillover_fx_cob_variance = ~0U; /* invalid parameter */
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_exp_flags, cfg.cmp_par_exp_flags);
-	TEST_ASSERT_EQUAL_INT(spillover_exp_flags, cfg.spill_exp_flags);
-	TEST_ASSERT_EQUAL_INT(cmp_par_efx, cfg.cmp_par_efx);
-	TEST_ASSERT_EQUAL_INT(spillover_efx, cfg.spill_efx);
-
-	/* invalid spillover_efx parameter */
-	spillover_efx = 0;
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_TRUE(error);
-
-
-	/* test DATA_TYPE_S_FX_NCOB */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_S_FX_NCOB, CMP_MODE_MODEL_ZERO, 0, 1);
-	cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = 19;
-	spillover_ncob = 5;
-	cmp_par_efx = ~0U; /* invalid parameter */
-	spillover_efx = ~0U; /* invalid parameter */
-	cmp_par_ecob = ~0U; /* invalid parameter */
-	spillover_ecob = ~0U; /* invalid parameter */
-	cmp_par_fx_cob_variance = ~0U; /* invalid parameter */
-	spillover_fx_cob_variance = ~0U; /* invalid parameter */
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_exp_flags, cfg.cmp_par_exp_flags);
-	TEST_ASSERT_EQUAL_INT(spillover_exp_flags, cfg.spill_exp_flags);
-	TEST_ASSERT_EQUAL_INT(cmp_par_ncob, cfg.cmp_par_ncob);
-	TEST_ASSERT_EQUAL_INT(spillover_ncob, cfg.spill_ncob);
-
-	/* invalid cmp_par_ncob parameter */
-	cmp_par_ncob = 0;
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_TRUE(error);
-
-
-	/* test DATA_TYPE_S_FX_EFX_NCOB_ECOB */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_S_FX_EFX_NCOB_ECOB, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = 19;
-	spillover_ncob = 5;
-	cmp_par_efx = 23;
-	spillover_efx = 42;
-	cmp_par_ecob = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_ecob = MIN_NON_IMA_SPILL;
-	cmp_par_fx_cob_variance = ~0U; /* invalid parameter */
-	spillover_fx_cob_variance = ~0U; /* invalid parameter */
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_exp_flags, cfg.cmp_par_exp_flags);
-	TEST_ASSERT_EQUAL_INT(spillover_exp_flags, cfg.spill_exp_flags);
-	TEST_ASSERT_EQUAL_INT(cmp_par_ncob, cfg.cmp_par_ncob);
-	TEST_ASSERT_EQUAL_INT(spillover_ncob, cfg.spill_ncob);
-	TEST_ASSERT_EQUAL_INT(cmp_par_efx, cfg.cmp_par_efx);
-	TEST_ASSERT_EQUAL_INT(spillover_efx, cfg.spill_efx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_ecob, cfg.cmp_par_ecob);
-	TEST_ASSERT_EQUAL_INT(spillover_ecob, cfg.spill_ecob);
-
-	/* invalid cmp_par_ecob parameter */
-	cmp_par_ecob = -1U;
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_TRUE(error);
-
-
-	/* DATA_TYPE_L_FX */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_L_FX, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = ~0U; /* invalid parameter */
-	spillover_ncob = ~0U; /* invalid parameter */
-	cmp_par_efx = ~0U; /* invalid parameter */
-	spillover_efx = ~0U; /* invalid parameter */
-	cmp_par_ecob = ~0U; /* invalid parameter */
-	spillover_ecob = ~0U; /* invalid parameter */
-	cmp_par_fx_cob_variance = 30;
-	spillover_fx_cob_variance = 8;
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_exp_flags, cfg.cmp_par_exp_flags);
-	TEST_ASSERT_EQUAL_INT(spillover_exp_flags, cfg.spill_exp_flags);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx_cob_variance, cfg.cmp_par_fx_cob_variance);
-	TEST_ASSERT_EQUAL_INT(spillover_fx_cob_variance, cfg.spill_fx_cob_variance);
-
-	/* invalid spillover_fx_cob_variance parameter */
-	spillover_fx_cob_variance = 1;
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_TRUE(error);
-
-
-	/* DATA_TYPE_L_FX_EFX */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_L_FX_EFX, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = ~0U; /* invalid parameter */
-	spillover_ncob = ~0U; /* invalid parameter */
-	cmp_par_efx = 23;
-	spillover_efx = 42;
-	cmp_par_ecob = ~0U; /* invalid parameter */
-	spillover_ecob = ~0U; /* invalid parameter */
-	cmp_par_fx_cob_variance = 30;
-	spillover_fx_cob_variance = 8;
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_exp_flags, cfg.cmp_par_exp_flags);
-	TEST_ASSERT_EQUAL_INT(spillover_exp_flags, cfg.spill_exp_flags);
-	TEST_ASSERT_EQUAL_INT(cmp_par_efx, cfg.cmp_par_efx);
-	TEST_ASSERT_EQUAL_INT(spillover_efx, cfg.spill_efx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx_cob_variance, cfg.cmp_par_fx_cob_variance);
-	TEST_ASSERT_EQUAL_INT(spillover_fx_cob_variance, cfg.spill_fx_cob_variance);
-
-
-	/* DATA_TYPE_L_FX_NCOB */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_L_FX_NCOB, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = 19;
-	spillover_ncob = 5;
-	cmp_par_efx = ~0U; /* invalid parameter */
-	spillover_efx = ~0U; /* invalid parameter */
-	cmp_par_ecob = ~0U; /* invalid parameter */
-	spillover_ecob = ~0U; /* invalid parameter */
-	cmp_par_fx_cob_variance = 30;
-	spillover_fx_cob_variance = 8;
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_exp_flags, cfg.cmp_par_exp_flags);
-	TEST_ASSERT_EQUAL_INT(spillover_exp_flags, cfg.spill_exp_flags);
-	TEST_ASSERT_EQUAL_INT(cmp_par_ncob, cfg.cmp_par_ncob);
-	TEST_ASSERT_EQUAL_INT(spillover_ncob, cfg.spill_ncob);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx_cob_variance, cfg.cmp_par_fx_cob_variance);
-	TEST_ASSERT_EQUAL_INT(spillover_fx_cob_variance, cfg.spill_fx_cob_variance);
-
-
-	/* DATA_TYPE_L_FX_EFX_NCOB_ECOB */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_L_FX_EFX_NCOB_ECOB, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = 19;
-	spillover_ncob = 5;
-	cmp_par_efx = 23;
-	spillover_efx = 42;
-	cmp_par_ecob = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_ecob = MIN_NON_IMA_SPILL;
-	cmp_par_fx_cob_variance = 30;
-	spillover_fx_cob_variance = 8;
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_exp_flags, cfg.cmp_par_exp_flags);
-	TEST_ASSERT_EQUAL_INT(spillover_exp_flags, cfg.spill_exp_flags);
-	TEST_ASSERT_EQUAL_INT(cmp_par_efx, cfg.cmp_par_efx);
-	TEST_ASSERT_EQUAL_INT(spillover_efx, cfg.spill_efx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_ncob, cfg.cmp_par_ncob);
-	TEST_ASSERT_EQUAL_INT(spillover_ncob, cfg.spill_ncob);
-	TEST_ASSERT_EQUAL_INT(cmp_par_ecob, cfg.cmp_par_ecob);
-	TEST_ASSERT_EQUAL_INT(spillover_ecob, cfg.spill_ecob);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx_cob_variance, cfg.cmp_par_fx_cob_variance);
-	TEST_ASSERT_EQUAL_INT(spillover_fx_cob_variance, cfg.spill_fx_cob_variance);
-
-
-	/* DATA_TYPE_F_FX */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_FX, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_exp_flags = ~0U; /* invalid parameter */
-	spillover_exp_flags = ~0U; /* invalid parameter */
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = ~0U; /* invalid parameter */
-	spillover_ncob = ~0U; /* invalid parameter */
-	cmp_par_efx = ~0U; /* invalid parameter */
-	spillover_efx = ~0U; /* invalid parameter */
-	cmp_par_ecob = ~0U; /* invalid parameter */
-	spillover_ecob = ~0U; /* invalid parameter */
-	cmp_par_fx_cob_variance = ~0U; /* invalid parameter */
-	spillover_fx_cob_variance = ~0U; /* invalid parameter */
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-
-
-	/* DATA_TYPE_F_FX_EFX */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_FX_EFX, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_exp_flags = ~0U; /* invalid parameter */
-	spillover_exp_flags = ~0U; /* invalid parameter */
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = ~0U; /* invalid parameter */
-	spillover_ncob = ~0U; /* invalid parameter */
-	cmp_par_efx = 23;
-	spillover_efx = 42;
-	cmp_par_ecob = ~0U; /* invalid parameter */
-	spillover_ecob = ~0U; /* invalid parameter */
-	cmp_par_fx_cob_variance = ~0U; /* invalid parameter */
-	spillover_fx_cob_variance = ~0U; /* invalid parameter */
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_efx, cfg.cmp_par_efx);
-	TEST_ASSERT_EQUAL_INT(spillover_efx, cfg.spill_efx);
-
-
-	/* DATA_TYPE_F_FX_NCOB */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_FX_NCOB, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_exp_flags = ~0U; /* invalid parameter */
-	spillover_exp_flags = ~0U; /* invalid parameter */
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_ncob = cmp_icu_max_spill(cmp_par_ncob);
-	cmp_par_efx = ~0U; /* invalid parameter */
-	spillover_efx = ~0U; /* invalid parameter */
-	cmp_par_ecob = ~0U; /* invalid parameter */
-	spillover_ecob = ~0U; /* invalid parameter */
-	cmp_par_fx_cob_variance = ~0U; /* invalid parameter */
-	spillover_fx_cob_variance = ~0U; /* invalid parameter */
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_ncob, cfg.cmp_par_ncob);
-	TEST_ASSERT_EQUAL_INT(spillover_ncob, cfg.spill_ncob);
-
-
-	/* DATA_TYPE_F_FX_EFX_NCOB_ECOB */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_FX_EFX_NCOB_ECOB, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_exp_flags = ~0U; /* invalid parameter */
-	spillover_exp_flags = ~0U; /* invalid parameter */
-	cmp_par_fx = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_fx = MIN_NON_IMA_SPILL;
-	cmp_par_ncob = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_ncob = cmp_icu_max_spill(cmp_par_ncob);
-	cmp_par_efx = 23;
-	spillover_efx = 42;
-	cmp_par_ecob = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_ecob = MIN_NON_IMA_SPILL;
-	cmp_par_fx_cob_variance = ~0U; /* invalid parameter */
-	spillover_fx_cob_variance = ~0U; /* invalid parameter */
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(cmp_par_fx, cfg.cmp_par_fx);
-	TEST_ASSERT_EQUAL_INT(spillover_fx, cfg.spill_fx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_ncob, cfg.cmp_par_ncob);
-	TEST_ASSERT_EQUAL_INT(spillover_ncob, cfg.spill_ncob);
-	TEST_ASSERT_EQUAL_INT(cmp_par_efx, cfg.cmp_par_efx);
-	TEST_ASSERT_EQUAL_INT(spillover_efx, cfg.spill_efx);
-	TEST_ASSERT_EQUAL_INT(cmp_par_ecob, cfg.cmp_par_ecob);
-	TEST_ASSERT_EQUAL_INT(spillover_ecob, cfg.spill_ecob);
-}
-
-
-/**
- * @test cmp_cfg_aux
- */
-
-void test_cmp_cfg_aux(void)
-{	struct cmp_cfg cfg;
-	uint32_t cmp_par_mean = 2;
-	uint32_t spillover_mean = 3;
-	uint32_t cmp_par_variance = 4;
-	uint32_t spillover_variance = 5;
-	uint32_t cmp_par_pixels_error = 6;
-	uint32_t spillover_pixels_error = 7;
-	int error;
-	enum cmp_data_type data_type;
-
-	/* wrong data type test */
-	for (data_type = 0; data_type <= DATA_TYPE_F_CAM_BACKGROUND; data_type++) {
-		cfg = cmp_cfg_icu_create(data_type, CMP_MODE_MODEL_ZERO, 16, CMP_LOSSLESS);
-		error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-				    cmp_par_variance, spillover_variance,
-				    cmp_par_pixels_error, spillover_pixels_error);
-		if (data_type == DATA_TYPE_OFFSET || data_type == DATA_TYPE_F_CAM_OFFSET) {
-			TEST_ASSERT_FALSE(error);
-			TEST_ASSERT_EQUAL_INT(data_type, cfg.data_type);
-			TEST_ASSERT_EQUAL_INT(2, cfg.cmp_par_offset_mean);
-			TEST_ASSERT_EQUAL_INT(3, cfg.spill_offset_mean);
-			TEST_ASSERT_EQUAL_INT(4, cfg.cmp_par_offset_variance);
-			TEST_ASSERT_EQUAL_INT(5, cfg.spill_offset_variance);
-		} else if (data_type == DATA_TYPE_BACKGROUND ||
-			   data_type == DATA_TYPE_F_CAM_BACKGROUND) {
-			TEST_ASSERT_FALSE(error);
-			TEST_ASSERT_EQUAL_INT(data_type, cfg.data_type);
-			TEST_ASSERT_EQUAL_INT(2, cfg.cmp_par_background_mean);
-			TEST_ASSERT_EQUAL_INT(3, cfg.spill_background_mean);
-			TEST_ASSERT_EQUAL_INT(4, cfg.cmp_par_background_variance);
-			TEST_ASSERT_EQUAL_INT(5, cfg.spill_background_variance);
-			TEST_ASSERT_EQUAL_INT(6, cfg.cmp_par_background_pixels_error);
-			TEST_ASSERT_EQUAL_INT(7, cfg.spill_background_pixels_error);
-		} else if (data_type == DATA_TYPE_SMEARING) {
-			TEST_ASSERT_FALSE(error);
-			TEST_ASSERT_EQUAL_INT(data_type, cfg.data_type);
-			TEST_ASSERT_EQUAL_INT(2, cfg.cmp_par_smearing_mean);
-			TEST_ASSERT_EQUAL_INT(3, cfg.spill_smearing_mean);
-			TEST_ASSERT_EQUAL_INT(4, cfg.cmp_par_smearing_variance);
-			TEST_ASSERT_EQUAL_INT(5, cfg.spill_smearing_variance);
-			TEST_ASSERT_EQUAL_INT(6, cfg.cmp_par_smearing_pixels_error);
-			TEST_ASSERT_EQUAL_INT(7, cfg.spill_smearing_pixels_error);
-		} else {
-			TEST_ASSERT_TRUE(error);
-		}
-	}
-
-	/* cfg == NULL test */
-	error = cmp_cfg_aux(NULL, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_TRUE(error);
-
-
-	/* DATA_TYPE_OFFSET */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_OFFSET, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_mean = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_mean = cmp_icu_max_spill(MIN_NON_IMA_GOLOMB_PAR);
-	cmp_par_variance = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_variance = MIN_NON_IMA_SPILL;
-	cmp_par_pixels_error = ~0U;
-	spillover_pixels_error = ~0U;
-
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_GOLOMB_PAR, cfg.cmp_par_offset_mean);
-	TEST_ASSERT_EQUAL_INT(cmp_icu_max_spill(MIN_NON_IMA_GOLOMB_PAR), cfg.spill_offset_mean);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_GOLOMB_PAR, cfg.cmp_par_offset_variance);
-	TEST_ASSERT_EQUAL_INT(2, cfg.spill_offset_variance);
-
-	/* This should fail */
-	cmp_par_mean = MIN_NON_IMA_GOLOMB_PAR-1;
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_TRUE(error);
-
-
-	/* DATA_TYPE_F_CAM_OFFSET */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_CAM_OFFSET, CMP_MODE_DIFF_MULTI, 7, CMP_LOSSLESS);
-	cmp_par_mean = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_mean = cmp_icu_max_spill(MIN_NON_IMA_GOLOMB_PAR);
-	cmp_par_variance = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_variance = MIN_NON_IMA_SPILL;
-	cmp_par_pixels_error = ~0U;
-	spillover_pixels_error = ~0U;
-
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_GOLOMB_PAR, cfg.cmp_par_offset_mean);
-	TEST_ASSERT_EQUAL_INT(cmp_icu_max_spill(MIN_NON_IMA_GOLOMB_PAR), cfg.spill_offset_mean);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_GOLOMB_PAR, cfg.cmp_par_offset_variance);
-	TEST_ASSERT_EQUAL_INT(2, cfg.spill_offset_variance);
-
-	/* This should fail */
-	cmp_par_variance = MIN_NON_IMA_GOLOMB_PAR-1;
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_TRUE(error);
-
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_BACKGROUND, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_mean = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_mean = cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	cmp_par_variance = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_variance = MIN_NON_IMA_SPILL;
-	cmp_par_pixels_error = 42;
-	spillover_pixels_error = 23;
-
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(MAX_NON_IMA_GOLOMB_PAR, cfg.cmp_par_background_mean);
-	TEST_ASSERT_EQUAL_INT(cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR), cfg.spill_background_mean);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_GOLOMB_PAR, cfg.cmp_par_background_variance);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_SPILL, cfg.spill_background_variance);
-	TEST_ASSERT_EQUAL_INT(42, cfg.cmp_par_background_pixels_error);
-	TEST_ASSERT_EQUAL_INT(23, cfg.spill_background_pixels_error);
-
-	/* This should fail */
-	cmp_par_variance = MIN_NON_IMA_GOLOMB_PAR-1;
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_TRUE(error);
-
-
-	/* DATA_TYPE_BACKGROUND */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_BACKGROUND, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_mean = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_mean = cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	cmp_par_variance = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_variance = MIN_NON_IMA_SPILL;
-	cmp_par_pixels_error = 42;
-	spillover_pixels_error = 23;
-
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(MAX_NON_IMA_GOLOMB_PAR, cfg.cmp_par_background_mean);
-	TEST_ASSERT_EQUAL_INT(cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR), cfg.spill_background_mean);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_GOLOMB_PAR, cfg.cmp_par_background_variance);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_SPILL, cfg.spill_background_variance);
-	TEST_ASSERT_EQUAL_INT(42, cfg.cmp_par_background_pixels_error);
-	TEST_ASSERT_EQUAL_INT(23, cfg.spill_background_pixels_error);
-
-	/* This should fail */
-	cmp_par_variance = MIN_NON_IMA_GOLOMB_PAR-1;
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_TRUE(error);
-
-
-	/* DATA_TYPE_F_CAM_BACKGROUND */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_CAM_BACKGROUND, CMP_MODE_DIFF_MULTI, 7, CMP_LOSSLESS);
-	cmp_par_mean = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_mean = cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	cmp_par_variance = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_variance = MIN_NON_IMA_SPILL;
-	cmp_par_pixels_error = 42;
-	spillover_pixels_error = 23;
-
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(MAX_NON_IMA_GOLOMB_PAR, cfg.cmp_par_background_mean);
-	TEST_ASSERT_EQUAL_INT(cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR), cfg.spill_background_mean);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_GOLOMB_PAR, cfg.cmp_par_background_variance);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_SPILL, cfg.spill_background_variance);
-	TEST_ASSERT_EQUAL_INT(42, cfg.cmp_par_background_pixels_error);
-	TEST_ASSERT_EQUAL_INT(23, cfg.spill_background_pixels_error);
-
-	/* This should fail */
-	cmp_par_pixels_error = MIN_NON_IMA_GOLOMB_PAR-1;
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_TRUE(error);
-
-
-	/* DATA_TYPE_SMEARING */
-	cfg = cmp_cfg_icu_create(DATA_TYPE_SMEARING, CMP_MODE_DIFF_ZERO, 7, CMP_LOSSLESS);
-	cmp_par_mean = MAX_NON_IMA_GOLOMB_PAR;
-	spillover_mean = cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	cmp_par_variance = MIN_NON_IMA_GOLOMB_PAR;
-	spillover_variance = MIN_NON_IMA_SPILL;
-	cmp_par_pixels_error = 42;
-	spillover_pixels_error = 23;
-
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL_INT(MAX_NON_IMA_GOLOMB_PAR, cfg.cmp_par_smearing_mean);
-	TEST_ASSERT_EQUAL_INT(cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR), cfg.spill_smearing_mean);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_GOLOMB_PAR, cfg.cmp_par_smearing_variance);
-	TEST_ASSERT_EQUAL_INT(MIN_NON_IMA_SPILL, cfg.spill_smearing_variance);
-	TEST_ASSERT_EQUAL_INT(42, cfg.cmp_par_smearing_pixels_error);
-	TEST_ASSERT_EQUAL_INT(23, cfg.spill_smearing_pixels_error);
-
-	/* This should fail */
-	spillover_pixels_error = cmp_icu_max_spill(42)+1;
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_TRUE(error);
-}
-
-
 /**
  * @test map_to_pos
  */
@@ -1714,7 +517,7 @@ void test_put_n_bits32(void)
 	/* re-init input arrays after clobbering */
 	init_PB32_arrays(testarray0, testarray1);
 
-	/*** error cases ***/
+	/* error cases */
 	/* n too large */
 	v = 0x0; n = 33; o = 1;
 	rval = put_n_bits32(v, n, o, testarray0, l);
@@ -1731,7 +534,7 @@ void test_put_n_bits32(void)
 	v = 0x1; n = 1; o = 96;
 	rval = put_n_bits32(v, n, o, testarray0, l);
 	TEST_ASSERT_TRUE(cmp_is_error(rval));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(rval));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(rval));
 	TEST_ASSERT(testarray0[0] == 0);
 	TEST_ASSERT(testarray0[1] == 0);
 	TEST_ASSERT(testarray0[2] == 0);
@@ -1744,7 +547,7 @@ void test_put_n_bits32(void)
 	v = 0x0; n = 32; o = INT32_MAX;
 	rval = put_n_bits32(v, n, o, testarray1, l);
 	TEST_ASSERT_TRUE(cmp_is_error(rval));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(rval));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(rval));
 	TEST_ASSERT(testarray1[0] == 0xffffffff);
 	TEST_ASSERT(testarray1[1] == 0xffffffff);
 	TEST_ASSERT(testarray1[2] == 0xffffffff);
@@ -2053,7 +856,7 @@ void test_encode_value_zero(void)
 	data = 23; model = 26;
 	stream_len = encode_value_zero(data, model, stream_len, &setup);
 	TEST_ASSERT_TRUE(cmp_is_error(stream_len));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(stream_len));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(stream_len));
 
 	/* reset bitstream to all bits set */
 	bitstream[0] = ~0U;
@@ -2105,7 +908,7 @@ void test_encode_value_zero(void)
 	data = 31; model = 0;
 	stream_len = encode_value_zero(data, model, stream_len, &setup);
 	TEST_ASSERT_TRUE(cmp_is_error(stream_len));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(stream_len));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(stream_len));
 	TEST_ASSERT_EQUAL_HEX(0, be32_to_cpu(bitstream[0]));
 	TEST_ASSERT_EQUAL_HEX(0, be32_to_cpu(bitstream[1]));
 	TEST_ASSERT_EQUAL_HEX(0, be32_to_cpu(bitstream[2]));
@@ -2188,7 +991,7 @@ void test_encode_value_multi(void)
 	/* small buffer error */
 	data = 0; model = 38;
 	stream_len = encode_value_multi(data, model, stream_len, &setup);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(stream_len));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(stream_len));
 
 	/* small buffer error when creating the multi escape symbol*/
 	bitstream[0] = 0;
@@ -2198,22 +1001,46 @@ void test_encode_value_multi(void)
 	stream_len = 32;
 	data = 31; model = 0;
 	stream_len = encode_value_multi(data, model, stream_len, &setup);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(stream_len));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(stream_len));
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[0]);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[1]);
 }
 
-#if 0
+
+/**
+ * @brief put the value unencoded with setup->cmp_par_1 bits without any changes
+ *      in the bitstream
+ *
+ * @param value		value to put unchanged in the bitstream
+ *			(setup->cmp_par_1 how many bits of the value are used)
+ * @param unused	this parameter is ignored
+ * @param stream_len	length of the bitstream in bits
+ * @param setup		pointer to the encoder setup
+ *
+ * @returns the bit length of the bitstream with the added unencoded value on
+ *	success; negative on error
+ */
+
+static uint32_t encode_value_none(uint32_t value, uint32_t unused, uint32_t stream_len,
+				  const struct encoder_setup *setup)
+{
+	(void)(unused);
+
+	return put_n_bits32(value, setup->encoder_par1, stream_len,
+			    setup->bitstream_adr, setup->max_stream_len);
+}
+
+
 /**
  * @test encode_value
  */
 
-void no_test_encode_value(void)
+void test_encode_value(void)
 {
 	struct encoder_setup setup = {0};
 	uint32_t bitstream[4] = {0};
 	uint32_t data, model;
-	int cmp_size;
+	uint32_t cmp_size;
 
 	setup.encode_method_f = encode_value_none;
 	setup.bitstream_adr = bitstream;
@@ -2227,7 +1054,7 @@ void no_test_encode_value(void)
 
 	data = 0; model = 0;
 	cmp_size = encode_value(data, model, cmp_size, &setup);
-	TEST_ASSERT_EQUAL_INT(32, cmp_size);
+	TEST_ASSERT_EQUAL_UINT(32, cmp_size);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[0]);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[1]);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[2]);
@@ -2235,7 +1062,7 @@ void no_test_encode_value(void)
 
 	data = UINT32_MAX; model = 0;
 	cmp_size = encode_value(data, model, cmp_size, &setup);
-	TEST_ASSERT_EQUAL_INT(64, cmp_size);
+	TEST_ASSERT_EQUAL_UINT(64, cmp_size);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[0]);
 	TEST_ASSERT_EQUAL_HEX(0xFFFFFFFF, bitstream[1]);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[2]);
@@ -2245,7 +1072,7 @@ void no_test_encode_value(void)
 	setup.lossy_par = 1;
 	data = UINT32_MAX; model = 0;
 	cmp_size = encode_value(data, model, cmp_size, &setup);
-	TEST_ASSERT_EQUAL_INT(96, cmp_size);
+	TEST_ASSERT_EQUAL_UINT(96, cmp_size);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[0]);
 	TEST_ASSERT_EQUAL_HEX(0xFFFFFFFF, be32_to_cpu(bitstream[1]));
 	TEST_ASSERT_EQUAL_HEX(0x7FFFFFFF, be32_to_cpu(bitstream[2]));
@@ -2254,7 +1081,7 @@ void no_test_encode_value(void)
 	setup.lossy_par = 2;
 	data = 0x3; model = 0;
 	cmp_size = encode_value(data, model, cmp_size, &setup);
-	TEST_ASSERT_EQUAL_INT(128, cmp_size);
+	TEST_ASSERT_EQUAL_UINT(128, cmp_size);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[0]);
 	TEST_ASSERT_EQUAL_HEX(0xFFFFFFFF, bitstream[1]);
 	TEST_ASSERT_EQUAL_HEX(0x7FFFFFFF, be32_to_cpu(bitstream[2]));
@@ -2262,7 +1089,7 @@ void no_test_encode_value(void)
 
 	/* small buffer error bitstream can not hold more data*/
 	cmp_size = encode_value(data, model, cmp_size, &setup);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF, cmp_size);
+	TEST_ASSERT_EQUAL_UINT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
 
 	/* reset bitstream */
 	bitstream[0] = 0;
@@ -2278,7 +1105,7 @@ void no_test_encode_value(void)
 
 	data = 0; model = 0;
 	cmp_size = encode_value(data, model, cmp_size, &setup);
-	TEST_ASSERT_EQUAL_INT(31, cmp_size);
+	TEST_ASSERT_EQUAL_UINT(31, cmp_size);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[0]);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[1]);
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[2]);
@@ -2286,7 +1113,7 @@ void no_test_encode_value(void)
 
 	data = 0x7FFFFFFF; model = 0;
 	cmp_size = encode_value(data, model, cmp_size, &setup);
-	TEST_ASSERT_EQUAL_INT(62, cmp_size);
+	TEST_ASSERT_EQUAL_UINT(62, cmp_size);
 	TEST_ASSERT_EQUAL_HEX(0x00000001, be32_to_cpu(bitstream[0]));
 	TEST_ASSERT_EQUAL_HEX(0xFFFFFFFC, be32_to_cpu(bitstream[1]));
 	TEST_ASSERT_EQUAL_HEX(0, bitstream[2]);
@@ -2296,7 +1123,7 @@ void no_test_encode_value(void)
 	setup.lossy_par = 1;
 	data = UINT32_MAX; model = UINT32_MAX;
 	cmp_size = encode_value(data, model, cmp_size, &setup);
-	TEST_ASSERT_EQUAL_INT(93, cmp_size);
+	TEST_ASSERT_EQUAL_UINT(93, cmp_size);
 	TEST_ASSERT_EQUAL_HEX(0x00000001, be32_to_cpu(bitstream[0]));
 	TEST_ASSERT_EQUAL_HEX(0xFFFFFFFF, be32_to_cpu(bitstream[1]));
 	TEST_ASSERT_EQUAL_HEX(0xFFFFFFF8, be32_to_cpu(bitstream[2]));
@@ -2306,16 +1133,15 @@ void no_test_encode_value(void)
 	setup.lossy_par = 0;
 	data = UINT32_MAX; model = 0;
 	cmp_size = encode_value(data, model, cmp_size, &setup);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_size);
+	TEST_ASSERT_EQUAL_UINT(CMP_ERROR_DATA_VALUE_TOO_LARGE, cmp_get_error_code(cmp_size));
 
 	/* model are bigger than max_data_bits */
 	setup.lossy_par = 0;
 	cmp_size = 93;
 	data = 0; model = UINT32_MAX;
 	cmp_size = encode_value(data, model, cmp_size, &setup);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_size);
+	TEST_ASSERT_EQUAL_UINT(CMP_ERROR_DATA_VALUE_TOO_LARGE, cmp_get_error_code(cmp_size));
 }
-#endif
 
 
 /**
@@ -2326,33 +1152,102 @@ void test_compress_imagette_diff(void)
 {
 	uint16_t data[] = {0xFFFF, 1, 0, 42, 0x8000, 0x7FFF, 0xFFFF};
 	uint32_t output_buf[3] = {0xFFFF, 0xFFFF, 0xFFFF};
-	uint32_t output_buf_size;
-	struct cmp_cfg cfg = {0};
-	int error, cmp_size;
+	struct rdcu_cfg rcfg = {0};
+	int error;
+	uint32_t cmp_size;
+	struct cmp_info info;
 
 	uint32_t golomb_par = 1;
 	uint32_t spill = 8;
 	uint32_t samples = 7;
 
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_DIFF_ZERO,
-				 CMP_PAR_UNUSED, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-	output_buf_size = cmp_cfg_icu_buffers(&cfg, data, samples, NULL, NULL,
-					      (uint32_t *)output_buf, samples);
-	TEST_ASSERT_EQUAL_INT(samples*sizeof(uint16_t), output_buf_size);
-
-	error = cmp_cfg_icu_imagette(&cfg, golomb_par, spill);
+	error = rdcu_cfg_create(&rcfg, CMP_MODE_DIFF_ZERO, 8, CMP_LOSSLESS);
 	TEST_ASSERT_FALSE(error);
+	rcfg.input_buf = data;
+	rcfg.samples = samples;
+	rcfg.icu_output_buf = output_buf;
+	rcfg.buffer_length = samples;
+	rcfg.golomb_par = golomb_par;
+	rcfg.spill = spill;
+
+
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_EQUAL_INT(66, cmp_size);
+	TEST_ASSERT_EQUAL_HEX(0xDF6002AB, be32_to_cpu(output_buf[0]));
+	TEST_ASSERT_EQUAL_HEX(0xFEB70000, be32_to_cpu(output_buf[1]));
+	TEST_ASSERT_EQUAL_HEX(0x00000000, be32_to_cpu(output_buf[2]));
 
-	cmp_size = icu_compress_data(&cfg);
+	rcfg.ap1_golomb_par = 2;
+	rcfg.ap1_spill = 1000;
+	rcfg.ap2_golomb_par = 1;
+	rcfg.ap2_spill = 0;
+	cmp_size = compress_like_rdcu(&rcfg, &info);
 	TEST_ASSERT_EQUAL_INT(66, cmp_size);
 	TEST_ASSERT_EQUAL_HEX(0xDF6002AB, be32_to_cpu(output_buf[0]));
 	TEST_ASSERT_EQUAL_HEX(0xFEB70000, be32_to_cpu(output_buf[1]));
 	TEST_ASSERT_EQUAL_HEX(0x00000000, be32_to_cpu(output_buf[2]));
+	TEST_ASSERT_EQUAL_INT(CMP_MODE_DIFF_ZERO, info.cmp_mode_used);
+	TEST_ASSERT_EQUAL_INT(8, info.spill_used);
+	TEST_ASSERT_EQUAL_INT(1, info.golomb_par_used);
+	TEST_ASSERT_EQUAL_INT(7, info.samples_used);
+	TEST_ASSERT_EQUAL_INT(66, info.cmp_size);
+	TEST_ASSERT_EQUAL_INT(0, info.ap1_cmp_size);
+	TEST_ASSERT_EQUAL_INT(0, info.ap2_cmp_size);
+	TEST_ASSERT_EQUAL_INT(0, info.rdcu_new_model_adr_used);
+	TEST_ASSERT_EQUAL_INT(0, info.rdcu_cmp_adr_used);
+	TEST_ASSERT_EQUAL_INT(8, info.model_value_used);
+	TEST_ASSERT_EQUAL_INT(0, info.round_used);
+	TEST_ASSERT_EQUAL_INT(0, info.cmp_err);
+
+	rcfg.ap1_golomb_par = 0;
+	rcfg.ap1_spill = 1000;
+	rcfg.ap2_golomb_par = 0;
+	rcfg.ap2_spill = 0;
+	cmp_size = compress_like_rdcu(&rcfg, &info);
+	TEST_ASSERT_EQUAL_INT(66, cmp_size);
+	TEST_ASSERT_EQUAL_HEX(0xDF6002AB, be32_to_cpu(output_buf[0]));
+	TEST_ASSERT_EQUAL_HEX(0xFEB70000, be32_to_cpu(output_buf[1]));
+	TEST_ASSERT_EQUAL_HEX(0x00000000, be32_to_cpu(output_buf[2]));
+	TEST_ASSERT_EQUAL_INT(CMP_MODE_DIFF_ZERO, info.cmp_mode_used);
+	TEST_ASSERT_EQUAL_INT(8, info.spill_used);
+	TEST_ASSERT_EQUAL_INT(1, info.golomb_par_used);
+	TEST_ASSERT_EQUAL_INT(7, info.samples_used);
+	TEST_ASSERT_EQUAL_INT(66, info.cmp_size);
+	TEST_ASSERT_EQUAL_INT(0, info.ap1_cmp_size);
+	TEST_ASSERT_EQUAL_INT(0, info.ap2_cmp_size);
+	TEST_ASSERT_EQUAL_INT(0, info.rdcu_new_model_adr_used);
+	TEST_ASSERT_EQUAL_INT(0, info.rdcu_cmp_adr_used);
+	TEST_ASSERT_EQUAL_INT(8, info.model_value_used);
+	TEST_ASSERT_EQUAL_INT(0, info.round_used);
+	TEST_ASSERT_EQUAL_INT(0, info.cmp_err);
+
+	/* small buffer error */
+	rcfg.ap1_golomb_par = 1;
+	rcfg.ap1_spill = 8;
+	rcfg.ap2_golomb_par = 1;
+	rcfg.ap2_spill = 8;
+	rcfg.buffer_length = 3;
+	cmp_size = compress_like_rdcu(&rcfg, &info);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_EQUAL_HEX(0xDF6002AB, be32_to_cpu(output_buf[0]));
+	TEST_ASSERT_EQUAL_HEX(0xFEB70000, be32_to_cpu(output_buf[1]));
+	TEST_ASSERT_EQUAL_HEX(0x00000000, be32_to_cpu(output_buf[2]));
+	TEST_ASSERT_EQUAL_INT(CMP_MODE_DIFF_ZERO, info.cmp_mode_used);
+	TEST_ASSERT_EQUAL_INT(8, info.spill_used);
+	TEST_ASSERT_EQUAL_INT(1, info.golomb_par_used);
+	TEST_ASSERT_EQUAL_INT(7, info.samples_used);
+	TEST_ASSERT_EQUAL_INT(0, info.cmp_size);
+	TEST_ASSERT_EQUAL_INT(0, info.ap1_cmp_size);
+	TEST_ASSERT_EQUAL_INT(0, info.ap2_cmp_size);
+	TEST_ASSERT_EQUAL_INT(0, info.rdcu_new_model_adr_used);
+	TEST_ASSERT_EQUAL_INT(0, info.rdcu_cmp_adr_used);
+	TEST_ASSERT_EQUAL_INT(8, info.model_value_used);
+	TEST_ASSERT_EQUAL_INT(0, info.round_used);
+	TEST_ASSERT_EQUAL_INT(0x1, info.cmp_err);
 
 	/* test: icu_output_buf = NULL */
-	cfg.icu_output_buf = NULL;
-	cmp_size = icu_compress_data(&cfg);
+	rcfg.icu_output_buf = NULL;
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
 	TEST_ASSERT_EQUAL_INT(66, cmp_size);
 }
 
@@ -2366,26 +1261,28 @@ void test_compress_imagette_model(void)
 	uint16_t data[]  = {0x0000, 0x0001, 0x0042, 0x8000, 0x7FFF, 0xFFFF, 0xFFFF};
 	uint16_t model[] = {0x0000, 0xFFFF, 0xF301, 0x8FFF, 0x0000, 0xFFFF, 0x0000};
 	uint16_t model_up[7] = {0};
-	uint32_t output_buf[3] = {~0U, ~0U, ~0U};
-	uint32_t output_buf_size;
-	struct cmp_cfg cfg = {0};
+	uint32_t output_buf[4] = {~0U, ~0U, ~0U, ~0U};
+	struct rdcu_cfg rcfg = {0};
 	uint32_t model_value = 8;
 	uint32_t samples = 7;
 	uint32_t buffer_length = 8;
 	uint32_t golomb_par = 3;
 	uint32_t spill = 8;
-	int cmp_size, error;
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_MULTI,
-				 model_value, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-	output_buf_size = cmp_cfg_icu_buffers(&cfg, data, samples, model, model_up,
-					      output_buf, buffer_length);
-	TEST_ASSERT_EQUAL_INT(buffer_length*sizeof(uint16_t), output_buf_size);
-	error = cmp_cfg_icu_imagette(&cfg, golomb_par, spill);
+	uint32_t cmp_size;
+	int error;
+
+	error = rdcu_cfg_create(&rcfg, CMP_MODE_MODEL_MULTI, model_value, CMP_LOSSLESS);
 	TEST_ASSERT_FALSE(error);
+	rcfg.input_buf = data;
+	rcfg.samples = samples;
+	rcfg.model_buf = model;
+	rcfg.icu_new_model_buf = model_up;
+	rcfg.icu_output_buf = output_buf;
+	rcfg.buffer_length = buffer_length;
+	rcfg.golomb_par = golomb_par;
+	rcfg.spill = spill;
 
-	cmp_size = icu_compress_data(&cfg);
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
 
 	TEST_ASSERT_EQUAL_INT(76, cmp_size);
 	TEST_ASSERT_EQUAL_HEX(0x2BDB4F5E, be32_to_cpu(output_buf[0]));
@@ -2402,10 +1299,10 @@ void test_compress_imagette_model(void)
 
 
 	/* error case: model mode without model data */
-	cfg.model_buf = NULL; /* this is the error */
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_size));
-	TEST_ASSERT_EQUAL(CMP_ERROR_PAR_BUFFERS, cmp_get_error_code((uint32_t)cmp_size));
+	rcfg.model_buf = NULL; /* this is the error */
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_TRUE(cmp_is_error(cmp_size));
+	TEST_ASSERT_EQUAL(CMP_ERROR_PAR_NO_MODEL, cmp_get_error_code(cmp_size));
 }
 
 
@@ -2418,18 +1315,17 @@ void test_compress_imagette_raw(void)
 	uint16_t data[] = {0x0, 0x1, 0x23, 0x42, (uint16_t)INT16_MIN, INT16_MAX, UINT16_MAX};
 	void *output_buf = malloc(7*sizeof(uint16_t));
 	uint16_t cmp_data[7];
-	struct cmp_cfg cfg = {0};
-	int cmp_size;
+	struct rdcu_cfg rcfg = {0};
+	uint32_t cmp_size;
 
-	cfg.cmp_mode = CMP_MODE_RAW;
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.model_buf = NULL;
-	cfg.input_buf = data;
-	cfg.samples = 7;
-	cfg.icu_output_buf = output_buf;
-	cfg.buffer_length = 7;
+	rcfg.cmp_mode = CMP_MODE_RAW;
+	rcfg.model_buf = NULL;
+	rcfg.input_buf = data;
+	rcfg.samples = 7;
+	rcfg.icu_output_buf = output_buf;
+	rcfg.buffer_length = 7;
 
-	cmp_size = icu_compress_data(&cfg);
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
 	memcpy(cmp_data, output_buf, sizeof(cmp_data));
 	TEST_ASSERT_EQUAL_INT(7*16, cmp_size);
 	TEST_ASSERT_EQUAL_HEX16(0x0, be16_to_cpu(cmp_data[0]));
@@ -2442,44 +1338,42 @@ void test_compress_imagette_raw(void)
 
 
 	/* compressed data buf = NULL test */
-	memset(&cfg, 0, sizeof(struct cmp_cfg));
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.input_buf = data;
-	cfg.samples = 7;
-	cfg.icu_output_buf = NULL;
-	cfg.buffer_length = 7;
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
+	memset(&rcfg, 0, sizeof(rcfg));
+	rcfg.input_buf = data;
+	rcfg.samples = 7;
+	rcfg.icu_output_buf = NULL;
+	rcfg.buffer_length = 7;
 
-	cmp_size = icu_compress_data(&cfg);
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
 	TEST_ASSERT_EQUAL_INT(7*16, cmp_size);
 
+	/* error case: cfg = NULL */
+	cmp_size = compress_like_rdcu(NULL, NULL);
+	TEST_ASSERT_TRUE(cmp_is_error(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_GENERIC, cmp_get_error_code(cmp_size));
 
 	/* error case: input_buf = NULL */
-	memset(&cfg, 0, sizeof(struct cmp_cfg));
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.input_buf = NULL; /* no data to compress */
-	cfg.samples = 7;
-	cfg.icu_output_buf = output_buf;
-	cfg.buffer_length = 7;
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
+	memset(&rcfg, 0, sizeof(rcfg));
+	rcfg.input_buf = NULL; /* no data to compress */
+	rcfg.samples = 7;
+	rcfg.icu_output_buf = output_buf;
+	rcfg.buffer_length = 7;
 
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_size));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_BUFFERS, cmp_get_error_code((uint32_t)cmp_size));
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_TRUE(cmp_is_error(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_CHUNK_NULL, cmp_get_error_code(cmp_size));
 
 
 	/* error case: compressed data buffer to small */
-	memset(&cfg, 0, sizeof(struct cmp_cfg));
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.input_buf = data;
-	cfg.samples = 7;
-	cfg.icu_output_buf = output_buf;
-	cfg.buffer_length = 6; /* the buffer is to small */
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
+	memset(&rcfg, 0, sizeof(rcfg));
+	rcfg.input_buf = data;
+	rcfg.samples = 7;
+	rcfg.icu_output_buf = output_buf;
+	rcfg.buffer_length = 6; /* the buffer is to small */
 
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_size));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code((uint32_t)cmp_size));
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_TRUE(cmp_is_error(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
 
 	free(output_buf);
 }
@@ -2493,1789 +1387,247 @@ void test_compress_imagette_error_cases(void)
 {
 	uint16_t data[] = {0xFFFF, 1, 0, 42, 0x8000, 0x7FFF, 0xFFFF};
 	uint32_t output_buf[2] = {0xFFFF, 0xFFFF};
-	struct cmp_cfg cfg = {0};
-	int cmp_size;
-	struct cmp_max_used_bits my_max_used_bits;
+	struct rdcu_cfg rcfg = {0};
+	uint32_t cmp_size;
 
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
-	cfg.input_buf = NULL;
-	cfg.samples = 0;  /* nothing to compress */
-	cfg.golomb_par = 1;
-	cfg.spill = 8;
-	cfg.icu_output_buf = NULL;
-	cfg.buffer_length = 0;
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
-
-	cmp_size = icu_compress_data(&cfg);
+	rcfg.cmp_mode = CMP_MODE_DIFF_ZERO;
+	rcfg.input_buf = data;
+	rcfg.samples = 0;  /* nothing to compress */
+	rcfg.golomb_par = 1;
+	rcfg.spill = 8;
+	rcfg.icu_output_buf = NULL;
+	rcfg.buffer_length = 0;
+
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
 	TEST_ASSERT_EQUAL_INT(0, cmp_size);
 
 
 	/* compressed data buffer to small test */
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
-	cfg.input_buf = data;
-	cfg.samples = 7;
-	cfg.golomb_par = 1;
-	cfg.spill = 8;
-	cfg.icu_output_buf = (uint32_t *)output_buf;
-	cfg.buffer_length = 4;
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
+	rcfg.cmp_mode = CMP_MODE_DIFF_ZERO;
+	rcfg.input_buf = data;
+	rcfg.samples = 7;
+	rcfg.golomb_par = 1;
+	rcfg.spill = 8;
+	rcfg.icu_output_buf = (uint32_t *)output_buf;
+	rcfg.buffer_length = 4;
 
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF, cmp_size);
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
 
 	/* compressed data buffer to small test part 2 */
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
-	cfg.input_buf = data;
-	cfg.samples = 7;
-	cfg.golomb_par = 1;
-	cfg.spill = 8;
-	cfg.icu_output_buf = (uint32_t *)output_buf;
-	cfg.buffer_length = 1;
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
-
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF, cmp_size);
-
-	/* error invalid data_type */
-	cfg.data_type = DATA_TYPE_UNKNOWN;
-	cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
-	cfg.input_buf = data;
-	cfg.samples = 7;
-	cfg.golomb_par = 1;
-	cfg.spill = 8;
-	cfg.icu_output_buf = (uint32_t *)output_buf;
-	cfg.buffer_length = 4;
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(-1, cmp_size);
-
-	cfg.data_type = DATA_TYPE_F_CAM_BACKGROUND+1;
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(-1, cmp_size);
-
-	/* error my_max_used_bits.nc_imagette value is to high */
-	my_max_used_bits = MAX_USED_BITS_SAFE;
-	my_max_used_bits.nc_imagette = 33;
-
-	cfg.max_used_bits = &my_max_used_bits;
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
-	cfg.input_buf = data;
-	cfg.samples = 2;
-	cfg.golomb_par = 1;
-	cfg.spill = 8;
-	cfg.icu_output_buf = (uint32_t *)output_buf;
-	cfg.buffer_length = 4;
-
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_size));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_size));
-
-	/* error my_max_used_bits.saturated_imagette value is to high */
-	my_max_used_bits = MAX_USED_BITS_SAFE;
-	my_max_used_bits.saturated_imagette = 17;
-
-	cfg.max_used_bits = &my_max_used_bits;
-	cfg.data_type = DATA_TYPE_SAT_IMAGETTE_ADAPTIVE;
-	cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
-	cfg.input_buf = data;
-	cfg.samples = 2;
-	cfg.golomb_par = 1;
-	cfg.spill = 8;
-	cfg.icu_output_buf = (uint32_t *)output_buf;
-	cfg.buffer_length = 4;
+	rcfg.cmp_mode = CMP_MODE_DIFF_ZERO;
+	rcfg.input_buf = data;
+	rcfg.samples = 7;
+	rcfg.golomb_par = 1;
+	rcfg.spill = 8;
+	rcfg.icu_output_buf = (uint32_t *)output_buf;
+	rcfg.buffer_length = 1;
 
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_size));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_size));
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
 
-	/* error my_max_used_bits.fc_imagette value is to high */
-	my_max_used_bits = MAX_USED_BITS_SAFE;
-	my_max_used_bits.fc_imagette = 17;
-
-	cfg.max_used_bits = &my_max_used_bits;
-	cfg.data_type = DATA_TYPE_F_CAM_IMAGETTE;
-	cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
-	cfg.input_buf = data;
-	cfg.samples = 2;
-	cfg.golomb_par = 1;
-	cfg.spill = 8;
-	cfg.icu_output_buf = (uint32_t *)output_buf;
-	cfg.buffer_length = 4;
-
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_size));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_size));
 
 	/* test unknown cmp_mode */
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
-	cfg.data_type = DATA_TYPE_F_CAM_IMAGETTE;
-	cfg.cmp_mode = (enum cmp_mode)(MAX_CMP_MODE+1);
-	cfg.input_buf = data;
-	cfg.samples = 2;
-	cfg.golomb_par = 1;
-	cfg.spill = 8;
-	cfg.icu_output_buf = (uint32_t *)output_buf;
-	cfg.buffer_length = 4;
-
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_size));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_GENERIC, cmp_get_error_code((uint32_t)cmp_size));
+	rcfg.cmp_mode = (enum cmp_mode)(MAX_CMP_MODE+1);
+	rcfg.input_buf = data;
+	rcfg.samples = 2;
+	rcfg.golomb_par = 1;
+	rcfg.spill = 8;
+	rcfg.icu_output_buf = (uint32_t *)output_buf;
+	rcfg.buffer_length = 4;
+
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_TRUE(cmp_is_error(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_GENERIC, cmp_get_error_code(cmp_size));
 
 	/* test golomb_par = 0 */
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
-	cfg.data_type = DATA_TYPE_F_CAM_IMAGETTE;
-	cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
-	cfg.input_buf = data;
-	cfg.samples = 2;
-	cfg.golomb_par = 0;
-	cfg.spill = 8;
-	cfg.icu_output_buf = (uint32_t *)output_buf;
-	cfg.buffer_length = 4;
-
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_size));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_SPECIFIC, cmp_get_error_code((uint32_t)cmp_size));
+	rcfg.cmp_mode = CMP_MODE_DIFF_ZERO;
+	rcfg.input_buf = data;
+	rcfg.samples = 2;
+	rcfg.golomb_par = 0;
+	rcfg.spill = 8;
+	rcfg.icu_output_buf = (uint32_t *)output_buf;
+	rcfg.buffer_length = 4;
+
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_TRUE(cmp_is_error(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_SPECIFIC, cmp_get_error_code(cmp_size));
+
+	/* test golomb_par to high */
+	rcfg.cmp_mode = CMP_MODE_DIFF_ZERO;
+	rcfg.input_buf = data;
+	rcfg.samples = 2;
+	rcfg.golomb_par = MAX_CHUNK_CMP_PAR+1;
+	rcfg.spill = 8;
+	rcfg.icu_output_buf = (uint32_t *)output_buf;
+	rcfg.buffer_length = 4;
+
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_TRUE(cmp_is_error(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_SPECIFIC, cmp_get_error_code(cmp_size));
+
+	/* round to high */
+	rcfg.cmp_mode = CMP_MODE_DIFF_ZERO;
+	rcfg.input_buf = data;
+	rcfg.samples = 2;
+	rcfg.golomb_par = MAX_CHUNK_CMP_PAR;
+	rcfg.spill = 8;
+	rcfg.icu_output_buf = (uint32_t *)output_buf;
+	rcfg.buffer_length = 4;
+	rcfg.round = MAX_ICU_ROUND+1;
+
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_TRUE(cmp_is_error(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_GENERIC, cmp_get_error_code(cmp_size));
+
+	/* model_value to high */
+	rcfg.cmp_mode = CMP_MODE_MODEL_ZERO;
+	rcfg.input_buf = data;
+	rcfg.samples = 2;
+	rcfg.golomb_par = MAX_CHUNK_CMP_PAR;
+	rcfg.spill = 8;
+	rcfg.icu_output_buf = (uint32_t *)output_buf;
+	rcfg.buffer_length = 4;
+	rcfg.round = MAX_ICU_ROUND;
+	rcfg.model_value = MAX_MODEL_VALUE+1;
+
+	cmp_size = compress_like_rdcu(&rcfg, NULL);
+	TEST_ASSERT_TRUE(cmp_is_error(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_GENERIC, cmp_get_error_code(cmp_size));
 }
 
-#if 0
+
 /**
- * @test compress_multi_entry_hdr
+ * @test pad_bitstream
  */
 
-void no_test_compress_multi_entry_hdr(void)
-{
-	int stream_len;
-	uint8_t data[COLLECTION_HDR_SIZE];
-	uint8_t model[COLLECTION_HDR_SIZE];
-	uint8_t up_model[COLLECTION_HDR_SIZE];
-	uint8_t cmp_data[COLLECTION_HDR_SIZE];
-	uint8_t *data_p = NULL;
-	uint8_t *model_p = NULL;
-	uint8_t *up_model_p = NULL;
-
-	memset(data, 0x42, sizeof(data));
-
-	/* no data; no cmp_data no model test */
-	/* no data; no model; no up_model; no cmp_data */
-	stream_len = compress_multi_entry_hdr((void **)&data_p, (void **)&model_p,
-					      (void **)&up_model_p, NULL);
-	TEST_ASSERT_EQUAL_INT(96, stream_len);
-
-	/* no model; no up_model */
-	data_p = data;
-	stream_len = compress_multi_entry_hdr((void **)&data_p, (void **)&model_p,
-					      (void **)&up_model_p, cmp_data);
-	TEST_ASSERT_EQUAL_INT(96, stream_len);
-	TEST_ASSERT_FALSE(memcmp(cmp_data, data, COLLECTION_HDR_SIZE));
-	TEST_ASSERT_EQUAL(data_p-data, COLLECTION_HDR_SIZE);
-
-	/* no up_model */
-	memset(cmp_data, 0, sizeof(cmp_data));
-	data_p = data;
-	model_p = model;
-	up_model_p = NULL;
-	stream_len = compress_multi_entry_hdr((void **)&data_p, (void **)&model_p,
-					      (void **)&up_model_p, cmp_data);
-	TEST_ASSERT_EQUAL_INT(96, stream_len);
-	TEST_ASSERT_FALSE(memcmp(cmp_data, data, COLLECTION_HDR_SIZE));
-	TEST_ASSERT_EQUAL(data_p-data, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_EQUAL(model_p-model, COLLECTION_HDR_SIZE);
-
-	/* all buffer test */
-	memset(cmp_data, 0, sizeof(cmp_data));
-	data_p = data;
-	model_p = model;
-	up_model_p = up_model;
-	stream_len = compress_multi_entry_hdr((void **)&data_p, (void **)&model_p,
-					      (void **)&up_model_p, cmp_data);
-	TEST_ASSERT_EQUAL_INT(96, stream_len);
-	TEST_ASSERT_FALSE(memcmp(cmp_data, data, COLLECTION_HDR_SIZE));
-	TEST_ASSERT_FALSE(memcmp(up_model, data, COLLECTION_HDR_SIZE));
-	TEST_ASSERT_EQUAL(data_p-data, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_EQUAL(model_p-model, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_EQUAL(up_model_p-up_model, COLLECTION_HDR_SIZE);
-
-	/* all buffer test; no cmp_data */
-	memset(cmp_data, 0, sizeof(cmp_data));
-	data_p = data;
-	model_p = model;
-	up_model_p = up_model;
-	stream_len = compress_multi_entry_hdr((void **)&data_p, (void **)&model_p,
-					      (void **)&up_model_p, NULL);
-	TEST_ASSERT_EQUAL_INT(96, stream_len);
-	TEST_ASSERT_FALSE(memcmp(up_model, data, COLLECTION_HDR_SIZE));
-	TEST_ASSERT_EQUAL(data_p-data, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_EQUAL(model_p-model, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_EQUAL(up_model_p-up_model, COLLECTION_HDR_SIZE);
-
-	/* no data, use up_model test */
-	memset(cmp_data, 0, sizeof(cmp_data));
-	data_p = NULL;
-	model_p = model;
-	up_model_p = up_model;
-	stream_len = compress_multi_entry_hdr((void **)&data_p, (void **)&model_p,
-					      (void **)&up_model_p, NULL);
-	TEST_ASSERT_EQUAL_INT(96, stream_len);
-	TEST_ASSERT_EQUAL(model_p-model, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_EQUAL(up_model_p-up_model, COLLECTION_HDR_SIZE);
-}
-#endif
-
-
-void test_compress_s_fx_raw(void)
+void test_pad_bitstream(void)
 {
-	struct s_fx data[7];
 	struct cmp_cfg cfg = {0};
-	int cmp_size, cmp_size_exp;
-	size_t i;
-	struct collection_hdr *hdr;
-
-	cfg.data_type = DATA_TYPE_S_FX;
-	cfg.model_buf = NULL;
-	cfg.samples = 7;
-	cfg.input_buf = malloc(cmp_cal_size_of_data(cfg.samples, cfg.data_type));
-	cfg.buffer_length = 7;
-	cfg.icu_output_buf = malloc(cmp_cal_size_of_data(cfg.buffer_length, cfg.data_type));
-	TEST_ASSERT_NOT_NULL(cfg.icu_output_buf);
-	TEST_ASSERT_NOT_NULL(cfg.input_buf);
-
-	data[0].exp_flags = 0x0;
-	data[0].fx = 0x0;
-	data[1].exp_flags = 0x1;
-	data[1].fx = 0x1;
-	data[2].exp_flags = 0x2;
-	data[2].fx = 0x23;
-	data[3].exp_flags = 0x3;
-	data[3].fx = 0x42;
-	data[4].exp_flags = 0x0;
-	data[4].fx = (uint32_t)INT32_MIN;
-	data[5].exp_flags = 0x3;
-	data[5].fx = INT32_MAX;
-	data[6].exp_flags = 0x1;
-	data[6].fx = UINT32_MAX;
-
-	hdr = cfg.input_buf;
-	memset(hdr, 0x42, sizeof(struct collection_hdr));
-	memcpy(hdr->entry, data, sizeof(data));
-
-	cmp_size = icu_compress_data(&cfg);
-
-	cmp_size_exp = (sizeof(data) + sizeof(struct collection_hdr)) * CHAR_BIT;
-	TEST_ASSERT_EQUAL_INT(cmp_size_exp, cmp_size);
-
-	for (i = 0; i < ARRAY_SIZE(data); i++) {
-		struct s_fx *p;
-
-		hdr = (struct collection_hdr *)cfg.icu_output_buf;
-		p = (struct s_fx *)hdr->entry;
-
-		TEST_ASSERT_EQUAL_HEX(data[i].exp_flags, p[i].exp_flags);
-		TEST_ASSERT_EQUAL_HEX(data[i].fx, cpu_to_be32(p[i].fx));
-	}
+	uint32_t cmp_size;
+	uint32_t cmp_size_return;
+	uint32_t cmp_data[3];
+	const int MAX_BIT_LEN = 96;
 
-	free(cfg.input_buf);
-	free(cfg.icu_output_buf);
-}
+	memset(cmp_data, 0xFF, sizeof(cmp_data));
+	cfg.dst = cmp_data;
+	cfg.data_type = DATA_TYPE_IMAGETTE; /* 16 bit samples */
+	cfg.stream_size = sizeof(cmp_data); /* 6 * 16 bit samples -> 3 * 32 bit */
 
+	/* test negative cmp_size */
+	cmp_size = -1U;
+	cmp_size_return = pad_bitstream(&cfg, cmp_size);
+	TEST_ASSERT_EQUAL_UINT32(-1U, cmp_size_return);
+	cmp_size = -3U;
+	cmp_size_return = pad_bitstream(&cfg, cmp_size);
+	TEST_ASSERT_EQUAL_UINT32(-3U, cmp_size_return);
 
-void test_compress_s_fx_model_multi(void)
-{
-	struct s_fx data[6], model[6];
-	struct s_fx *up_model_buf;
-	struct cmp_cfg cfg = {0};
-	int cmp_size;
-	struct collection_hdr *hdr;
-	uint32_t *cmp_data;
-	struct cmp_max_used_bits my_max_used_bits;
+	/* test RAW_MODE */
+	cfg.cmp_mode = CMP_MODE_RAW;
+	cmp_size = MAX_BIT_LEN;
+	cmp_size_return = pad_bitstream(&cfg, cmp_size);
+	TEST_ASSERT_EQUAL_INT(MAX_BIT_LEN, cmp_size_return);
+	TEST_ASSERT_EQUAL_INT(cmp_data[0], 0xFFFFFFFF);
+	TEST_ASSERT_EQUAL_INT(cmp_data[1], 0xFFFFFFFF);
+	TEST_ASSERT_EQUAL_INT(cmp_data[2], 0xFFFFFFFF);
 
-	/* setup configuration */
-	cfg.data_type = DATA_TYPE_S_FX;
+	/* test Normal operation */
 	cfg.cmp_mode = CMP_MODE_MODEL_MULTI;
-	cfg.model_value = 11;
-	cfg.samples = 6;
-	cfg.input_buf = malloc(cmp_cal_size_of_data(cfg.samples, cfg.data_type));
-	TEST_ASSERT_NOT_NULL(cfg.input_buf);
-	cfg.model_buf = malloc(cmp_cal_size_of_data(cfg.samples, cfg.data_type));
-	TEST_ASSERT_NOT_NULL(cfg.model_buf);
-	cfg.icu_new_model_buf = malloc(cmp_cal_size_of_data(cfg.samples, cfg.data_type));
-	TEST_ASSERT_NOT_NULL(cfg.icu_new_model_buf);
-	cfg.buffer_length = 6;
-	cfg.icu_output_buf = malloc(cmp_cal_size_of_data(cfg.buffer_length, cfg.data_type));
-	TEST_ASSERT_NOT_NULL(cfg.icu_output_buf);
-	cfg.cmp_par_exp_flags = 1;
-	cfg.spill_exp_flags = 8;
-	cfg.cmp_par_fx = 3;
-	cfg.spill_fx = 35;
-
-
-	/* generate input data */
-	hdr = cfg.input_buf;
-	/* use dummy data for the header */
-	memset(hdr, 0x42, sizeof(struct collection_hdr));
-	data[0].exp_flags = 0x0;
-	data[0].fx = 0x0;
-	data[1].exp_flags = 0x1;
-	data[1].fx = 0x1;
-	data[2].exp_flags = 0x2;
-	data[2].fx = 0x23;
-	data[3].exp_flags = 0x3;
-	data[3].fx = 0x42;
-	data[4].exp_flags = 0x0;
-	data[4].fx = 0x001FFFFF;
-	data[5].exp_flags = 0x0;
-	data[5].fx = 0x0;
-	memcpy(hdr->entry, data, sizeof(data));
-
-	/* generate model data */
-	hdr = cfg.model_buf;
-	/* use dummy data for the header */
-	memset(hdr, 0x41, sizeof(struct collection_hdr));
-	model[0].exp_flags = 0x0;
-	model[0].fx = 0x0;
-	model[1].exp_flags = 0x3;
-	model[1].fx = 0x1;
-	model[2].exp_flags = 0x0;
-	model[2].fx = 0x42;
-	model[3].exp_flags = 0x0;
-	model[3].fx = 0x23;
-	model[4].exp_flags = 0x3;
-	model[4].fx = 0x0;
-	model[5].exp_flags = 0x2;
-	model[5].fx = 0x001FFFFF;
-	memcpy(hdr->entry, model, sizeof(model));
-
-	my_max_used_bits = MAX_USED_BITS_SAFE;
-	my_max_used_bits.s_exp_flags = 2;
-	my_max_used_bits.s_fx = 21;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	cmp_size = icu_compress_data(&cfg);
-
-	TEST_ASSERT_EQUAL_INT(166, cmp_size);
-	TEST_ASSERT_FALSE(memcmp(cfg.input_buf, cfg.icu_output_buf, COLLECTION_HDR_SIZE));
-	cmp_data = &cfg.icu_output_buf[COLLECTION_HDR_SIZE/sizeof(uint32_t)];
-	TEST_ASSERT_EQUAL_HEX(0x1C77FFA6, be32_to_cpu(cmp_data[0]));
-	TEST_ASSERT_EQUAL_HEX(0xAFFF4DE5, be32_to_cpu(cmp_data[1]));
-	TEST_ASSERT_EQUAL_HEX(0xCC000000, be32_to_cpu(cmp_data[2]));
-
-	hdr = cfg.icu_new_model_buf;
-	up_model_buf = (struct s_fx *)hdr->entry;
-	TEST_ASSERT_FALSE(memcmp(hdr, cfg.icu_output_buf, COLLECTION_HDR_SIZE));
-	TEST_ASSERT_EQUAL_HEX(0x0, up_model_buf[0].exp_flags);
-	TEST_ASSERT_EQUAL_HEX(0x0, up_model_buf[0].fx);
-	TEST_ASSERT_EQUAL_HEX(0x2, up_model_buf[1].exp_flags);
-	TEST_ASSERT_EQUAL_HEX(0x1, up_model_buf[1].fx);
-	TEST_ASSERT_EQUAL_HEX(0x0, up_model_buf[2].exp_flags);
-	TEST_ASSERT_EQUAL_HEX(0x38, up_model_buf[2].fx);
-	TEST_ASSERT_EQUAL_HEX(0x0, up_model_buf[3].exp_flags);
-	TEST_ASSERT_EQUAL_HEX(0x2C, up_model_buf[3].fx);
-	TEST_ASSERT_EQUAL_HEX(0x2, up_model_buf[4].exp_flags);
-	TEST_ASSERT_EQUAL_HEX(0x9FFFF, up_model_buf[4].fx);
-	TEST_ASSERT_EQUAL_HEX(0x1, up_model_buf[5].exp_flags);
-	TEST_ASSERT_EQUAL_HEX(0x15FFFF, up_model_buf[5].fx);
-
-	free(cfg.input_buf);
-	free(cfg.model_buf);
-	free(cfg.icu_new_model_buf);
-	free(cfg.icu_output_buf);
+	cmp_size = 0;
+	/* set the first 32 bits zero no change should occur */
+	cmp_size = put_n_bits32(0, 32, cmp_size, cfg.dst, MAX_BIT_LEN);
+	cmp_size_return = pad_bitstream(&cfg, cmp_size);
+	TEST_ASSERT_EQUAL_INT(cmp_size, cmp_size_return);
+	TEST_ASSERT_EQUAL_INT(cmp_data[0], 0);
+	TEST_ASSERT_EQUAL_INT(cmp_data[1], 0xFFFFFFFF);
+	TEST_ASSERT_EQUAL_INT(cmp_data[2], 0xFFFFFFFF);
+
+	/* set the first 33 bits zero; and checks the padding  */
+	cmp_size = put_n_bits32(0, 1, cmp_size, cfg.dst, MAX_BIT_LEN);
+	cmp_size_return = pad_bitstream(&cfg, cmp_size);
+	TEST_ASSERT_EQUAL_INT(cmp_size, cmp_size_return);
+	TEST_ASSERT_EQUAL_INT(cmp_data[0], 0);
+	TEST_ASSERT_EQUAL_INT(cmp_data[1], 0);
+	TEST_ASSERT_EQUAL_INT(cmp_data[2], 0xFFFFFFFF);
+
+	/* set the first 63 bits zero; and checks the padding  */
+	cmp_data[1] = 0xFFFFFFFF;
+	cmp_size = 32;
+	cmp_size = put_n_bits32(0, 31, cmp_size, cfg.dst, MAX_BIT_LEN);
+	cmp_size_return = pad_bitstream(&cfg, cmp_size);
+	TEST_ASSERT_EQUAL_INT(cmp_size, cmp_size_return);
+	TEST_ASSERT_EQUAL_INT(cmp_data[0], 0);
+	TEST_ASSERT_EQUAL_INT(cmp_data[1], 0);
+	TEST_ASSERT_EQUAL_INT(cmp_data[2], 0xFFFFFFFF);
+
+	/* error case the rest of the compressed data are to small for a 32 bit
+	 * access  */
+	cfg.stream_size -= 1;
+	cmp_size = 64;
+	cmp_size = put_n_bits32(0, 1, cmp_size, cfg.dst, MAX_BIT_LEN);
+	cmp_size_return = pad_bitstream(&cfg, cmp_size);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size_return));
 }
 
 
 /**
- * @test compress_s_fx
+ * @test compress_data_internal
  */
 
-void test_compress_s_fx_error_cases(void)
+void test_compress_data_internal_error_cases(void)
 {
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_exp_flags = 6;
-	uint32_t cmp_par_fx = 2;
-	uint32_t spillover_fx = 8;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct s_fx)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct s_fx)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct s_fx *data_p = (struct s_fx *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_S_FX, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED);
-	TEST_ASSERT_FALSE(error);
+	uint32_t cmp_size;
 
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, NULL,
-						   NULL, (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
+	uint16_t data[2] = {0, 0};
+	uint32_t dst[3] = {0};
 
-	my_max_used_bits.s_exp_flags = 2;
-	my_max_used_bits.s_fx = 21;
-	error = cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	TEST_ASSERT_FALSE(error);
+	cfg.data_type = DATA_TYPE_IMAGETTE;
+	cfg.src = data;
+	cfg.samples = 2;
+	cfg.dst = dst;
+	cfg.stream_size = sizeof(dst);
 
-	/* test if data are higher than max used bits value */
-	data_p[0].fx = 0x200000; /* has more than 21 bits (my_max_used_bits.s_fx) */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
 
-	/* compressed data are to small for the compressed_data buffer */
-	my_max_used_bits.s_exp_flags = 8;
-	my_max_used_bits.s_fx = 32;
-	error = cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	TEST_ASSERT_FALSE(error);
-	memset(data_to_compress, 0xff, sizeof(data_to_compress));
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF, cmp_bits);
-
-	my_max_used_bits.s_exp_flags = 33; /* more than 32 bits are not allowed */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.s_exp_flags = 32;
-	my_max_used_bits.s_fx = 33; /* more than 32 bits are not allowed */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
+	cmp_size = compress_data_internal(&cfg, -2U);
+	TEST_ASSERT_EQUAL_INT(-2U, cmp_size);
 
+	cmp_size = compress_data_internal(&cfg, 7);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_GENERIC, cmp_get_error_code(cmp_size));
 
-/**
- * @test compress_s_fx_efx
- */
+	cmp_size = compress_data_internal(&cfg, 7);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_GENERIC, cmp_get_error_code(cmp_size));
 
-void test_compress_s_fx_efx_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_exp_flags = 2;
-	uint32_t spillover_exp_flags = 6;
-	uint32_t cmp_par_fx = 1;
-	uint32_t spillover_fx = 8;
-	uint32_t cmp_par_efx = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_efx = cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+2*sizeof(struct s_fx_efx)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct s_fx_efx)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct s_fx_efx *data_p = (struct s_fx_efx *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_S_FX_EFX, CMP_MODE_DIFF_MULTI, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED, cmp_par_efx, spillover_efx,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 2, NULL,
-						   NULL, (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	my_max_used_bits.s_exp_flags = 2;
-	my_max_used_bits.s_fx = 21;
-	my_max_used_bits.s_efx = 16;
-	error = cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	TEST_ASSERT_FALSE(error);
-
-	/* test if data are higher than max used bits value */
-	data_p[0].exp_flags = 0x4; /* has more than 2 bits (my_max_used_bits.s_exp_flags) */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[0].exp_flags = 0x3;
-	data_p[1].fx = 0x200000; /* has more than 21 bits (my_max_used_bits.fx) */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].fx = 0x1FFFFF;
-	data_p[1].efx = 0x100000; /* has more than 16 bits (my_max_used_bits.efx) */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	/* error case exp_flag */
-	my_max_used_bits.s_exp_flags = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	/* error case fx */
-	my_max_used_bits.s_exp_flags = 2;
-	my_max_used_bits.s_fx = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	/* error case efx */
-	my_max_used_bits.s_fx = 21;
-	my_max_used_bits.s_efx = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_s_fx_ncob
- */
-
-void test_compress_s_fx_ncob_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_exp_flags = 3;
-	uint32_t spillover_exp_flags = 6;
-	uint32_t cmp_par_fx = 1;
-	uint32_t spillover_fx = 8;
-	uint32_t cmp_par_ncob = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_ncob = cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct s_fx_ncob)] = {0};
-	uint8_t model_data[COLLECTION_HDR_SIZE+3*sizeof(struct s_fx_ncob)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct s_fx_ncob)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct s_fx_ncob *data_p = (struct s_fx_ncob *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-
-	my_max_used_bits.s_exp_flags = 2;
-	my_max_used_bits.s_fx = 21;
-	my_max_used_bits.s_ncob = 31;
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_S_FX_NCOB, CMP_MODE_MODEL_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED);
-	TEST_ASSERT_FALSE(error);
-
-	error = cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, model_data,
-						   NULL, (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	/* the compressed_data buffer is to small */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF, cmp_bits);
-
-	/* test if data are higher than max used bits value */
-	data_p[2].exp_flags = 0x4; /* has more than 2 bits (my_max_used_bits.s_exp_flags) */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].exp_flags = 0x3;
-	data_p[1].fx = 0x200000; /* value to high */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].fx = 0x1FFFFF; /* value to high */
-	data_p[0].ncob_y = 0x80000000; /* value to high */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-	data_p[0].ncob_y = 0x7FFFFFFF; /* value to high */
-
-	/* error case exp_flag */
-	my_max_used_bits.s_exp_flags = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-
-	/* error case fx */
-	my_max_used_bits.s_exp_flags = 2;
-	my_max_used_bits.s_fx = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	/* error case efx */
-	my_max_used_bits.s_fx = 21;
-	my_max_used_bits.s_ncob = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_s_fx_efx_ncob_ecob
- */
-
-void test_compress_s_fx_efx_ncob_ecob_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_exp_flags = 3;
-	uint32_t spillover_exp_flags = 6;
-	uint32_t cmp_par_fx = 1;
-	uint32_t spillover_fx = 8;
-	uint32_t cmp_par_ncob = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_ncob = cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	uint32_t cmp_par_efx = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_efx =  cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	uint32_t cmp_par_ecob = 23;
-	uint32_t spillover_ecob = cmp_icu_max_spill(23);
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct s_fx_efx_ncob_ecob)] = {0};
-	uint8_t model_data[COLLECTION_HDR_SIZE+3*sizeof(struct s_fx_efx_ncob_ecob)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct s_fx_efx_ncob_ecob)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct s_fx_efx_ncob_ecob *data_p = (struct s_fx_efx_ncob_ecob *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_S_FX_EFX_NCOB_ECOB, CMP_MODE_MODEL_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob,
-			       spillover_ncob, cmp_par_efx, spillover_efx,
-			       cmp_par_ecob, spillover_ecob, CMP_PAR_UNUSED, CMP_PAR_UNUSED);
-
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, model_data,
-						   NULL, (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	my_max_used_bits.s_exp_flags = 2;
-	my_max_used_bits.s_fx = 21;
-	my_max_used_bits.s_ncob = 31;
-	my_max_used_bits.s_efx = 23;
-	my_max_used_bits.s_ecob = 7;
-	error = cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	TEST_ASSERT_FALSE(error);
-
-	/* the compressed_data buffer is to small */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF, cmp_bits);
-
-	/* test if data are higher than max used bits value */
-	data_p[2].exp_flags = 0x4;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].exp_flags = 0x3;
-	data_p[2].fx = 0x200000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].fx = 0x1FFFFF;
-	data_p[1].ncob_x = 0x80000000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].ncob_x = 0x7FFFFFFF;
-	data_p[1].ncob_y = 0x80000000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].ncob_y = 0x7FFFFFFF;
-	data_p[1].efx = 0x800000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].efx = 0x7FFFFF;
-	data_p[1].ecob_y = 0x80;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-	data_p[1].ecob_y = 0x7F;
-
-	/* error case exp_flag */
-	my_max_used_bits.s_exp_flags = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	/* error case fx */
-	my_max_used_bits.s_exp_flags = 32;
-	my_max_used_bits.s_fx = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	/* error case efx */
-	my_max_used_bits.s_fx = 32;
-	my_max_used_bits.s_ncob = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.s_ncob = 32;
-	my_max_used_bits.s_efx = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.s_efx = 32;
-	my_max_used_bits.s_ecob = 33;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_f_fx
- */
-
-void test_compress_f_fx_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_fx = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_fx = 8;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct f_fx)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct f_fx)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-
-	my_max_used_bits.f_fx = 23;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_FX, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       cmp_par_fx, spillover_fx, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, NULL, NULL, (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	/* compressed data are to small for the compressed_data buffer */
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF, cmp_bits);
-
-	my_max_used_bits.f_fx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_f_fx_efx
- */
-
-void test_compress_f_fx_efx_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_fx = 1;
-	uint32_t spillover_fx = 8;
-	uint32_t cmp_par_efx = 1;
-	uint32_t spillover_efx = 8;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+2*sizeof(struct f_fx_efx)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct f_fx_efx)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct f_fx_efx *data_p = (struct f_fx_efx *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	my_max_used_bits.f_fx = 23;
-	my_max_used_bits.f_efx = 31;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_FX_EFX, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       cmp_par_fx, spillover_fx, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED, cmp_par_efx, spillover_efx,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 2, NULL, NULL,
-						   (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	/* compressed data are to small for the compressed_data buffer */
-	data_p[0].fx = 42;
-	data_p[0].efx = 42;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF, cmp_bits);
-
-	/* fx value is to big for the max used bits values */
-	data_p[0].fx = 0x800000;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-	data_p[0].fx = 0x7FFFFF;
-
-	/* efx value is to big for the max used bits values */
-	data_p[0].efx = 0x80000000;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-	data_p[0].efx = 0x7FFFFFFF;
-
-	my_max_used_bits.f_fx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.f_fx = 32;
-	my_max_used_bits.f_efx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_f_fx_ncob
- */
-
-void test_compress_f_fx_ncob_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_fx = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_fx = 8;
-	uint32_t cmp_par_ncob = 1;
-	uint32_t spillover_ncob = 8;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+2*sizeof(struct f_fx_ncob)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct f_fx_ncob)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct f_fx_ncob *data_p = (struct f_fx_ncob *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	my_max_used_bits.f_fx = 31;
-	my_max_used_bits.f_ncob = 23;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_FX_NCOB, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 2, NULL, NULL,
-						   (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	/* compressed data are to small for the compressed_data buffer */
-	data_p[0].fx = 42;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF, cmp_bits);
-
-	/* value is to big for the max used bits values */
-	data_p[0].ncob_x = 0x800000;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-	data_p[0].ncob_x = 0x7FFFFF;
-	data_p[0].ncob_y = 0x800000;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-	data_p[0].ncob_y = 0x7FFFFF;
-
-	my_max_used_bits.f_fx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.f_fx = 32;
-	my_max_used_bits.f_ncob = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_f_fx_efx_ncob_ecob
- */
-
-void test_compress_f_fx_efx_ncob_ecob(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_fx = 1;
-	uint32_t spillover_fx = 8;
-	uint32_t cmp_par_ncob = 2;
-	uint32_t spillover_ncob = 10;
-	uint32_t cmp_par_efx = 3;
-	uint32_t spillover_efx = 44;
-	uint32_t cmp_par_ecob = 5;
-	uint32_t spillover_ecob = 55;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+4*sizeof(struct f_fx_efx_ncob_ecob)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct f_fx_efx_ncob_ecob)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct f_fx_efx_ncob_ecob *data_p = (struct f_fx_efx_ncob_ecob *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_F_FX_EFX_NCOB_ECOB, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 4, NULL, NULL,
-						   (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	my_max_used_bits.f_fx = 31;
-	my_max_used_bits.f_ncob = 3;
-	my_max_used_bits.f_efx = 16;
-	my_max_used_bits.f_ecob = 8;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	/* value is to big for the max used bits values */
-	data_p[3].fx = 0x80000000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[3].fx = 0x80000000-1;
-	data_p[2].ncob_x = 0x8;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].ncob_x = 0x7;
-	data_p[1].ncob_y = 0x8;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].ncob_y = 0x7;
-	data_p[0].efx = 0x10000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[0].efx = 0x10000-1;
-	data_p[2].ecob_x = 0x100;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].ecob_x = 0x100-1;
-	data_p[3].ecob_y = 0x100;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-	data_p[3].ecob_y = 0x100-1;
-
-	my_max_used_bits.f_fx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.f_fx = 32;
-	my_max_used_bits.f_ncob = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.f_ncob = 32;
-	my_max_used_bits.f_efx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.f_efx = 32;
-	my_max_used_bits.f_ecob = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_l_fx
- */
-
-void test_compress_l_fx_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_exp_flags = 3;
-	uint32_t spillover_exp_flags = 10;
-	uint32_t cmp_par_fx = 1;
-	uint32_t spillover_fx = 8;
-	uint32_t cmp_par_fx_cob_variance = 30;
-	uint32_t spillover_fx_cob_variance = 8;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct l_fx)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct l_fx)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct l_fx *data_p = (struct l_fx *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_L_FX, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, NULL, NULL,
-						   (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	my_max_used_bits.l_exp_flags = 23;
-	my_max_used_bits.l_fx = 31;
-	my_max_used_bits.l_efx = 1;
-	my_max_used_bits.l_fx_variance = 23;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	/* value is to big for the max used bits values */
-	data_p[2].exp_flags = 0x800000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].exp_flags = 0x800000-1;
-	data_p[2].fx = 0x80000000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].fx = 0x80000000-1;
-	data_p[0].fx_variance = 0x800000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[0].fx_variance = 0x800000-1;
-
-	my_max_used_bits.l_exp_flags = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_exp_flags = 32;
-	my_max_used_bits.l_fx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_fx = 32;
-	my_max_used_bits.l_fx_variance = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_l_fx_efx
- */
-
-void test_compress_l_fx_efx_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	uint32_t cmp_par_fx = 1;
-	uint32_t spillover_fx = 8;
-	uint32_t cmp_par_efx = 3;
-	uint32_t spillover_efx = 44;
-	uint32_t cmp_par_fx_cob_variance = 30;
-	uint32_t spillover_fx_cob_variance = 8;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct l_fx_efx)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct l_fx_efx)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct l_fx_efx *data_p = (struct l_fx_efx *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_L_FX_EFX, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       cmp_par_efx, spillover_efx, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, NULL, NULL,
-						   (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	my_max_used_bits.l_exp_flags = 23;
-	my_max_used_bits.l_fx = 31;
-	my_max_used_bits.l_efx = 1;
-	my_max_used_bits.l_fx_variance = 23;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	/* value is to big for the max used bits values */
-	data_p[2].exp_flags = 0x800000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].exp_flags = 0x800000-1;
-	data_p[2].fx = 0x80000000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].fx = 0x80000000-1;
-	data_p[1].efx = 0x2;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].efx = 0x1;
-	data_p[0].fx_variance = 0x800000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[0].fx_variance = 0x800000-1;
-
-	my_max_used_bits.l_exp_flags = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_exp_flags = 32;
-	my_max_used_bits.l_fx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_fx = 32;
-	my_max_used_bits.l_efx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_efx = 32;
-	my_max_used_bits.l_fx_variance = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_l_fx_ncob
- */
-
-void test_compress_l_fx_ncob_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	uint32_t cmp_par_fx = 1;
-	uint32_t spillover_fx = 8;
-	uint32_t cmp_par_ncob = 2;
-	uint32_t spillover_ncob = 10;
-	uint32_t cmp_par_fx_cob_variance = 30;
-	uint32_t spillover_fx_cob_variance = 8;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct l_fx_ncob)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct l_fx_ncob)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct l_fx_ncob *data_p = (struct l_fx_ncob *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_L_FX_NCOB, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED, CMP_PAR_UNUSED,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, NULL, NULL,
-						   (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	my_max_used_bits.l_exp_flags = 23;
-	my_max_used_bits.l_fx = 31;
-	my_max_used_bits.l_ncob = 2;
-	my_max_used_bits.l_fx_variance = 23;
-	my_max_used_bits.l_cob_variance = 11;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	/* value is to big for the max used bits values */
-	data_p[2].exp_flags = 0x800000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].exp_flags = 0x800000-1;
-	data_p[2].fx = 0x80000000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].fx = 0x80000000-1;
-	data_p[2].ncob_x = 0x4;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].ncob_x = 0x3;
-	data_p[2].ncob_y = 0x4;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].ncob_y = 0x3;
-	data_p[0].fx_variance = 0x800000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[0].fx_variance = 0x800000-1;
-	data_p[2].cob_x_variance = 0x800;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].cob_x_variance = 0x800-1;
-	data_p[2].cob_y_variance = 0x800;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].cob_y_variance = 0x800-1;
-
-	my_max_used_bits.l_exp_flags = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_exp_flags = 32;
-	my_max_used_bits.l_fx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_fx = 32;
-	my_max_used_bits.l_ncob = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_ncob = 32;
-	my_max_used_bits.l_fx_variance = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_fx_variance = 32;
-	my_max_used_bits.l_cob_variance = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_l_fx_efx_ncob_ecob
- */
-
-void test_compress_l_fx_efx_ncob_ecob_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
-	uint32_t cmp_par_fx = 1;
-	uint32_t spillover_fx = 8;
-	uint32_t cmp_par_ncob = 2;
-	uint32_t spillover_ncob = 10;
-	uint32_t cmp_par_efx = 3;
-	uint32_t spillover_efx = 44;
-	uint32_t cmp_par_ecob = 5;
-	uint32_t spillover_ecob = 55;
-	uint32_t cmp_par_fx_cob_variance = 30;
-	uint32_t spillover_fx_cob_variance = 8;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct l_fx_efx_ncob_ecob)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct l_fx_efx_ncob_ecob)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct l_fx_efx_ncob_ecob *data_p = (struct l_fx_efx_ncob_ecob *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_L_FX_EFX_NCOB_ECOB, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_fx_cob(&cfg, cmp_par_exp_flags, spillover_exp_flags,
-			       cmp_par_fx, spillover_fx, cmp_par_ncob, spillover_ncob,
-			       cmp_par_efx, spillover_efx, cmp_par_ecob, spillover_ecob,
-			       cmp_par_fx_cob_variance, spillover_fx_cob_variance);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, NULL, NULL,
-						   (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	my_max_used_bits.l_exp_flags = 23;
-	my_max_used_bits.l_fx = 31;
-	my_max_used_bits.l_ncob = 2;
-	my_max_used_bits.l_efx = 1;
-	my_max_used_bits.l_ecob = 3;
-	my_max_used_bits.l_fx_variance = 23;
-	my_max_used_bits.l_cob_variance = 11;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	/* value is to big for the max used bits values */
-	data_p[2].exp_flags = 0x800000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].exp_flags = 0x800000-1;
-	data_p[2].fx = 0x80000000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].fx = 0x80000000-1;
-	data_p[2].ncob_x = 0x4;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].ncob_x = 0x3;
-	data_p[2].ncob_y = 0x4;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].ncob_y = 0x3;
-	data_p[1].efx = 0x2;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].efx = 0x1;
-	data_p[1].ecob_x = 0x8;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].ecob_x = 0x7;
-	data_p[1].ecob_y = 0x8;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].ecob_y = 0x7;
-	data_p[0].fx_variance = 0x800000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[0].fx_variance = 0x800000-1;
-	data_p[2].cob_x_variance = 0x800;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].cob_x_variance = 0x800-1;
-	data_p[2].cob_y_variance = 0x800;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[2].cob_y_variance = 0x800-1;
-
-	my_max_used_bits.l_exp_flags = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_exp_flags = 32;
-	my_max_used_bits.l_fx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_fx = 32;
-	my_max_used_bits.l_ncob = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_ncob = 32;
-	my_max_used_bits.l_efx = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_efx = 32;
-	my_max_used_bits.l_ecob = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_ecob = 32;
-	my_max_used_bits.l_fx_variance = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.l_fx_variance = 32;
-	my_max_used_bits.l_cob_variance = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
+	cfg.data_type = DATA_TYPE_UNKNOWN;
+	cmp_size = compress_data_internal(&cfg, 0);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_INT_DATA_TYPE_UNSUPPORTED, cmp_get_error_code(cmp_size));
 
+	cfg.cmp_mode = CMP_MODE_DIFF_MULTI;
+	cmp_size = compress_data_internal(&cfg, 0);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_INT_DATA_TYPE_UNSUPPORTED, cmp_get_error_code(cmp_size));
 
-/**
- * @test compress_offset
- */
+	cmp_size = compress_data_internal(&cfg, 0);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_INT_DATA_TYPE_UNSUPPORTED, cmp_get_error_code(cmp_size));
 
-void test_compress_offset_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_mean = 1;
-	uint32_t spillover_mean = 2;
-	uint32_t cmp_par_variance = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_variance = cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct offset)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct offset)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct offset *data_p = (struct offset *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_OFFSET, CMP_MODE_DIFF_MULTI, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    CMP_PAR_UNUSED, CMP_PAR_UNUSED);
-	TEST_ASSERT_FALSE(error);
+	cfg.data_type = DATA_TYPE_F_FX_EFX;
+	cmp_size = compress_data_internal(&cfg, 0);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_INT_DATA_TYPE_UNSUPPORTED, cmp_get_error_code(cmp_size));
 
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, NULL, NULL,
-						   (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	my_max_used_bits.nc_offset_mean = 1;
-	my_max_used_bits.nc_offset_variance = 31;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	/* value is to big for the max used bits values */
-	data_p[0].mean = 0x2;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[0].mean = 0x1;
-	data_p[1].variance = 0x80000000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].variance = 0x80000000-1;
-
-	my_max_used_bits.nc_offset_mean = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.nc_offset_mean = 32;
-	my_max_used_bits.nc_offset_variance = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-
-	cfg.data_type = DATA_TYPE_F_CAM_OFFSET;
-	my_max_used_bits.fc_offset_mean = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.fc_offset_mean = 32;
-	my_max_used_bits.fc_offset_variance = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
+	cfg.data_type = DATA_TYPE_F_FX_NCOB;
+	cmp_size = compress_data_internal(&cfg, 0);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_INT_DATA_TYPE_UNSUPPORTED, cmp_get_error_code(cmp_size));
 
+	cfg.data_type = DATA_TYPE_F_FX_EFX_NCOB_ECOB;
+	cmp_size = compress_data_internal(&cfg, 0);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_INT_DATA_TYPE_UNSUPPORTED, cmp_get_error_code(cmp_size));
 
-/**
- * @test compress_background
- */
+	cfg.data_type = DATA_TYPE_F_FX_EFX_NCOB_ECOB;
+	cmp_size = compress_data_internal(&cfg, 0);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_INT_DATA_TYPE_UNSUPPORTED, cmp_get_error_code(cmp_size));
 
-void test_compress_background_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_mean = 1;
-	uint32_t spillover_mean = 2;
-	uint32_t cmp_par_variance = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_variance = cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	uint32_t cmp_par_pixels_error = 23;
-	uint32_t spillover_pixels_error = 42;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct background)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct background)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct background *data_p = (struct background *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_BACKGROUND, CMP_MODE_DIFF_MULTI, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, NULL, NULL,
-						   (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	my_max_used_bits.nc_background_mean = 1;
-	my_max_used_bits.nc_background_variance = 31;
-	my_max_used_bits.nc_background_outlier_pixels = 2;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	/* value is to big for the max used bits values */
-	data_p[0].mean = 0x2;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[0].mean = 0x1;
-	data_p[1].variance = 0x80000000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].variance = 0x80000000-1;
-	data_p[1].outlier_pixels = 0x4;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].outlier_pixels = 0x3;
-
-	my_max_used_bits.nc_background_mean = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.nc_background_mean = 32;
-	my_max_used_bits.nc_background_variance = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.nc_background_variance = 32;
-	my_max_used_bits.nc_background_outlier_pixels = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-
-	cfg.data_type = DATA_TYPE_F_CAM_BACKGROUND;
-	my_max_used_bits.fc_background_mean = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.fc_background_mean = 32;
-	my_max_used_bits.fc_background_variance = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.fc_background_variance = 32;
-	my_max_used_bits.fc_background_outlier_pixels = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test compress_smearing
- */
-
-void test_compress_smearing_error_cases(void)
-{
-	int error, cmp_bits;
-	uint32_t compressed_data_size;
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_par_mean = 1;
-	uint32_t spillover_mean = 2;
-	uint32_t cmp_par_variance = MAX_NON_IMA_GOLOMB_PAR;
-	uint32_t spillover_variance = cmp_icu_max_spill(MAX_NON_IMA_GOLOMB_PAR);
-	uint32_t cmp_par_pixels_error = 23;
-	uint32_t spillover_pixels_error = 42;
-	uint8_t data_to_compress[COLLECTION_HDR_SIZE+3*sizeof(struct smearing)] = {0};
-	uint8_t compressed_data[COLLECTION_HDR_SIZE+1*sizeof(struct smearing)] = {0};
-	struct cmp_max_used_bits my_max_used_bits = MAX_USED_BITS_SAFE;
-	struct smearing *data_p = (struct smearing *)&data_to_compress[COLLECTION_HDR_SIZE];
-
-	cfg = cmp_cfg_icu_create(DATA_TYPE_SMEARING, CMP_MODE_DIFF_MULTI, 0, CMP_LOSSLESS);
-	TEST_ASSERT(cfg.data_type != DATA_TYPE_UNKNOWN);
-
-	error = cmp_cfg_aux(&cfg, cmp_par_mean, spillover_mean,
-			    cmp_par_variance, spillover_variance,
-			    cmp_par_pixels_error, spillover_pixels_error);
-	TEST_ASSERT_FALSE(error);
-
-	compressed_data_size = cmp_cfg_icu_buffers(&cfg, data_to_compress, 3, NULL, NULL,
-						   (uint32_t *)compressed_data, 1);
-	TEST_ASSERT_EQUAL_INT(sizeof(compressed_data), compressed_data_size);
-
-	my_max_used_bits.smearing_mean = 1;
-	my_max_used_bits.smearing_variance_mean = 15;
-	my_max_used_bits.smearing_outlier_pixels = 2;
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-
-	/* value is to big for the max used bits values */
-	data_p[0].mean = 0x2;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[0].mean = 0x1;
-	data_p[1].variance_mean = 0x8000;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].variance_mean = 0x8000-1;
-	data_p[1].outlier_pixels = 0x4;
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_HIGH_VALUE, cmp_bits);
-
-	data_p[1].outlier_pixels = 0x3;
-
-	my_max_used_bits.smearing_mean = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.smearing_mean = 32;
-	my_max_used_bits.smearing_variance_mean = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-
-	my_max_used_bits.smearing_variance_mean = 32;
-	my_max_used_bits.smearing_outlier_pixels = 33; /* more than 32 bits are not allowed */
-	cmp_cfg_icu_max_used_bits(&cfg, &my_max_used_bits);
-	cmp_bits = icu_compress_data(&cfg);
-	TEST_ASSERT_TRUE(cmp_is_error((uint32_t)cmp_bits));
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_MAX_USED_BITS, cmp_get_error_code((uint32_t)cmp_bits));
-}
-
-
-/**
- * @test pad_bitstream
- */
-
-void test_pad_bitstream(void)
-{
-	struct cmp_cfg cfg = {0};
-	uint32_t cmp_size;
-	uint32_t cmp_size_return;
-	uint32_t cmp_data[3];
-	const int MAX_BIT_LEN = 96;
-
-	memset(cmp_data, 0xFF, sizeof(cmp_data));
-	cfg.icu_output_buf = cmp_data;
-	cfg.data_type = DATA_TYPE_IMAGETTE; /* 16 bit samples */
-	cfg.buffer_length = sizeof(cmp_data); /* 6 * 16 bit samples -> 3 * 32 bit */
-
-	/* test negative cmp_size */
-	cmp_size = -1U;
-	cmp_size_return = pad_bitstream(&cfg, cmp_size);
-	TEST_ASSERT_EQUAL_UINT32(-1U, cmp_size_return);
-	cmp_size = -3U;
-	cmp_size_return = pad_bitstream(&cfg, cmp_size);
-	TEST_ASSERT_EQUAL_UINT32(-3U, cmp_size_return);
-
-	/* test RAW_MODE */
-	cfg.cmp_mode = CMP_MODE_RAW;
-	cmp_size = MAX_BIT_LEN;
-	cmp_size_return = pad_bitstream(&cfg, cmp_size);
-	TEST_ASSERT_EQUAL_INT(MAX_BIT_LEN, cmp_size_return);
-	TEST_ASSERT_EQUAL_INT(cmp_data[0], 0xFFFFFFFF);
-	TEST_ASSERT_EQUAL_INT(cmp_data[1], 0xFFFFFFFF);
-	TEST_ASSERT_EQUAL_INT(cmp_data[2], 0xFFFFFFFF);
-
-	/* test Normal operation */
-	cfg.cmp_mode = CMP_MODE_MODEL_MULTI;
-	cmp_size = 0;
-	/* set the first 32 bits zero no change should occur */
-	cmp_size = put_n_bits32(0, 32, cmp_size, cfg.icu_output_buf, MAX_BIT_LEN);
-	cmp_size_return = pad_bitstream(&cfg, cmp_size);
-	TEST_ASSERT_EQUAL_INT(cmp_size, cmp_size_return);
-	TEST_ASSERT_EQUAL_INT(cmp_data[0], 0);
-	TEST_ASSERT_EQUAL_INT(cmp_data[1], 0xFFFFFFFF);
-	TEST_ASSERT_EQUAL_INT(cmp_data[2], 0xFFFFFFFF);
-
-	/* set the first 33 bits zero; and checks the padding  */
-	cmp_size = put_n_bits32(0, 1, cmp_size, cfg.icu_output_buf, MAX_BIT_LEN);
-	cmp_size_return = pad_bitstream(&cfg, cmp_size);
-	TEST_ASSERT_EQUAL_INT(cmp_size, cmp_size_return);
-	TEST_ASSERT_EQUAL_INT(cmp_data[0], 0);
-	TEST_ASSERT_EQUAL_INT(cmp_data[1], 0);
-	TEST_ASSERT_EQUAL_INT(cmp_data[2], 0xFFFFFFFF);
-
-	/* set the first 63 bits zero; and checks the padding  */
-	cmp_data[1] = 0xFFFFFFFF;
-	cmp_size = 32;
-	cmp_size = put_n_bits32(0, 31, cmp_size, cfg.icu_output_buf, MAX_BIT_LEN);
-	cmp_size_return = pad_bitstream(&cfg, cmp_size);
-	TEST_ASSERT_EQUAL_INT(cmp_size, cmp_size_return);
-	TEST_ASSERT_EQUAL_INT(cmp_data[0], 0);
-	TEST_ASSERT_EQUAL_INT(cmp_data[1], 0);
-	TEST_ASSERT_EQUAL_INT(cmp_data[2], 0xFFFFFFFF);
-
-	/* error case the rest of the compressed data are to small for a 32 bit
-	 * access  */
-	cfg.buffer_length -= 1;
-	cmp_size = 64;
-	cmp_size = put_n_bits32(0, 1, cmp_size, cfg.icu_output_buf, MAX_BIT_LEN);
-	cmp_size_return = pad_bitstream(&cfg, cmp_size);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(cmp_size_return));
+	cfg.data_type = 101;
+	cmp_size = compress_data_internal(&cfg, 0);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_INT_DATA_TYPE_UNSUPPORTED, cmp_get_error_code(cmp_size));
 }
 
 
@@ -4344,11 +1696,15 @@ void test_compress_chunk_raw_singel_col(void)
 	dst = malloc(dst_capacity); TEST_ASSERT_NOT_NULL(dst);
 	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
 				  dst_capacity, &cmp_par);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
 	free(dst);
 }
 
 
+/**
+ * @test compress_chunk
+ */
+
 void test_compress_chunk_raw_two_col(void)
 {
 	enum {	DATA_SIZE_1 = 2*sizeof(struct s_fx),
@@ -4421,6 +1777,7 @@ void test_compress_chunk_raw_two_col(void)
 			(uint8_t *)cmp_ent_get_data_buf(ent) + 2*COLLECTION_HDR_SIZE +
 			DATA_SIZE_1);
 		int i;
+
 		TEST_ASSERT_EQUAL_UINT(CHUNK_SIZE, cmp_ent_get_cmp_data_size(ent));
 		TEST_ASSERT_EQUAL_UINT(CHUNK_SIZE, cmp_ent_get_original_size(ent));
 		TEST_ASSERT_EQUAL_UINT(cmp_par.cmp_mode, cmp_ent_get_cmp_mode(ent));
@@ -4460,142 +1817,100 @@ void test_compress_chunk_raw_two_col(void)
 	dst = malloc(dst_capacity); TEST_ASSERT_NOT_NULL(dst);
 	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
 				  dst_capacity, &cmp_par);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
 	free(dst);
 }
 
 
-#if 0
-void NOOO_test_compress_chunk_model(void)
+/**
+ * @test compress_chunk
+ */
+
+void test_compress_chunk_aux(void)
 {
-	enum {	DATA_SIZE_1 = 1*sizeof(struct background),
-		DATA_SIZE_2 = 2*sizeof(struct offset),
+	enum {	DATA_SIZE_1 = 2*sizeof(struct offset),
+		DATA_SIZE_2 = 3*sizeof(struct background),
 		CHUNK_SIZE = 2*COLLECTION_HDR_SIZE + DATA_SIZE_1 + DATA_SIZE_2
 	};
-	uint8_t chunk[CHUNK_SIZE];
-	uint8_t chunk_model[CHUNK_SIZE];
-	uint8_t chunk_up_model[CHUNK_SIZE];
+	uint8_t chunk[CHUNK_SIZE+100];
 	struct collection_hdr *col1 = (struct collection_hdr *)chunk;
 	struct collection_hdr *col2;
-	struct background *data1 = (struct background *)col1->entry;
-	struct offset *data2;
+	struct offset *data1 = (struct offset *)col1->entry;
+	struct background *data2;
 	struct cmp_par cmp_par = {0};
 	uint32_t *dst;
 	uint32_t cmp_size;
 	uint32_t dst_capacity = 0;
-	uint32_t chunk_size;
 
 	/* create a chunk with two collection */
 	memset(col1, 0, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_FALSE(cmp_col_set_subservice(col1, SST_NCxx_S_SCIENCE_BACKGROUND));
+	TEST_ASSERT_FALSE(cmp_col_set_subservice(col1, SST_NCxx_S_SCIENCE_OFFSET));
 	TEST_ASSERT_FALSE(cmp_col_set_data_length(col1, DATA_SIZE_1));
 	data1[0].mean = 0;
 	data1[0].variance = 1;
-	data1[0].outlier_pixels = 0xF0;
+	data1[1].mean = 0xF0;
+	data1[1].variance = 0xABCDE0FF;
 	col2 = (struct collection_hdr *)(chunk + COLLECTION_HDR_SIZE + DATA_SIZE_1);
 	memset(col2, 0, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_FALSE(cmp_col_set_subservice(col2, SST_NCxx_S_SCIENCE_OFFSET));
+	TEST_ASSERT_FALSE(cmp_col_set_subservice(col2, SST_NCxx_S_SCIENCE_BACKGROUND));
 	TEST_ASSERT_FALSE(cmp_col_set_data_length(col2, DATA_SIZE_2));
-	data2 = (struct offset *)col2->entry;
+	data2 = (struct background *)col2->entry;
 	data2[0].mean = 1;
 	data2[0].variance = 2;
-	data2[1].mean = 3;
-	data2[1].variance = 4;
-
-	/* create a model with two collection */
-	col1 = (struct collection_hdr *)chunk_model;
-	memset(col1, 0, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_FALSE(cmp_col_set_subservice(col1, SST_NCxx_S_SCIENCE_BACKGROUND));
-	TEST_ASSERT_FALSE(cmp_col_set_data_length(col1, DATA_SIZE_1));
-	data1[0].mean = 1;
-	data1[0].variance = 2;
-	data1[0].outlier_pixels = 0xFFFF;
-	col2 = (struct collection_hdr *)(chunk + COLLECTION_HDR_SIZE + DATA_SIZE_1);
-	memset(col2, 0, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_FALSE(cmp_col_set_subservice(col2, SST_NCxx_S_SCIENCE_OFFSET));
-	TEST_ASSERT_FALSE(cmp_col_set_data_length(col2, DATA_SIZE_2));
-	data2 = (struct offset *)col2->entry;
-	data2[0].mean = 0;
-	data2[0].variance = 0;
+	data2[0].outlier_pixels = 3;
 	data2[1].mean = 0;
-	data2[1].variance = 0xEFFFFFFF;
+	data2[1].variance = 0;
+	data2[1].outlier_pixels = 0;
+	data2[2].mean = 0xF;
+	data2[2].variance = 0xFFFF;
+	data2[2].outlier_pixels = 0xFFFF;
 
 	/* compress the data */
-	cmp_par.cmp_mode = CMP_MODE_MODEL_ZERO;
-	cmp_par.model_value = 14;
+	cmp_par.cmp_mode = CMP_MODE_DIFF_MULTI;
 	cmp_par.nc_offset_mean = 1;
-	cmp_par.nc_offset_variance = 2;
-	cmp_par.nc_background_mean = 3;
-	cmp_par.nc_background_variance = 4;
-	cmp_par.nc_background_outlier_pixels = 5;
-	dst = NULL;
+	cmp_par.nc_offset_variance = UINT16_MAX;
 
-	chunk_size = COLLECTION_HDR_SIZE + DATA_SIZE_1;
+	cmp_par.nc_background_mean = UINT16_MAX;
+	cmp_par.nc_background_variance = 1;
+	cmp_par.nc_background_outlier_pixels = 42;
+	dst = NULL;
 
-	cmp_size = compress_chunk(chunk, chunk_size, chunk_model, chunk_up_model, dst,
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
 				  dst_capacity, &cmp_par);
-	TEST_ASSERT_EQUAL_INT(NON_IMAGETTE_HEADER_SIZE + COLLECTION_HDR_SIZE + 4, cmp_size);
-	dst_capacity = cmp_size;
+	TEST_ASSERT_EQUAL_INT(124, cmp_size);
+	dst_capacity = ROUND_UP_TO_4(cmp_size);
 	dst = malloc(dst_capacity); TEST_ASSERT_NOT_NULL(dst);
 	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
 				  dst_capacity, &cmp_par);
-	TEST_ASSERT_EQUAL_INT(GENERIC_HEADER_SIZE + CHUNK_SIZE, cmp_size);
+	TEST_ASSERT_EQUAL_INT(124, cmp_size);
 
-	/* test results */
-	{	struct cmp_entity *ent = (struct cmp_entity *)dst;
-		struct s_fx *raw_cmp_data1 = (struct s_fx *)(
-			(uint8_t *)cmp_ent_get_data_buf(ent) + COLLECTION_HDR_SIZE);
-		struct s_fx_efx_ncob_ecob *raw_cmp_data2 = (struct s_fx_efx_ncob_ecob *)(
-			(uint8_t *)cmp_ent_get_data_buf(ent) + 2*COLLECTION_HDR_SIZE +
-			DATA_SIZE_1);
-		TEST_ASSERT_EQUAL_UINT(CHUNK_SIZE, cmp_ent_get_cmp_data_size(ent));
-		TEST_ASSERT_EQUAL_UINT(CHUNK_SIZE, cmp_ent_get_original_size(ent));
-		TEST_ASSERT_EQUAL_UINT(cmp_par.cmp_mode, cmp_ent_get_cmp_mode(ent));
-		TEST_ASSERT_TRUE(cmp_ent_get_data_type_raw_bit(ent));
-		TEST_ASSERT_EQUAL_INT(DATA_TYPE_CHUNK, cmp_ent_get_data_type(ent));
 
-		TEST_ASSERT_EQUAL_HEX8_ARRAY(col1, cmp_ent_get_data_buf(ent), COLLECTION_HDR_SIZE);
+	/* error case wrong cmp_par */
+	cmp_par.nc_background_outlier_pixels = 0;
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
+				  dst_capacity, &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_SPECIFIC, cmp_get_error_code(cmp_size));
 
-		/* int i; */
-		/* for (i = 0; i < 2; i++) { */
-		/* 	TEST_ASSERT_EQUAL_HEX(data1[i].exp_flags, raw_cmp_data1[i].exp_flags); */
-		/* 	TEST_ASSERT_EQUAL_HEX(data1[i].fx, be32_to_cpu(raw_cmp_data1[i].fx)); */
-		/* } */
-
-		/* TEST_ASSERT_EQUAL_HEX8_ARRAY(col1, cmp_ent_get_data_buf(ent), COLLECTION_HDR_SIZE); */
-
-		/* for (i = 0; i < 2; i++) { */
-		/* 	TEST_ASSERT_EQUAL_HEX(data1[i].exp_flags, raw_cmp_data1[i].exp_flags); */
-		/* 	TEST_ASSERT_EQUAL_HEX(data1[i].fx, be32_to_cpu(raw_cmp_data1[i].fx)); */
-		/* } */
-
-		/* TEST_ASSERT_EQUAL_HEX8_ARRAY(col2, (uint8_t *)cmp_ent_get_data_buf(ent)+cmp_col_get_size(col1), COLLECTION_HDR_SIZE); */
-
-		/* for (i = 0; i < 2; i++) { */
-		/* 	TEST_ASSERT_EQUAL_HEX(data2[i].exp_flags, raw_cmp_data2[i].exp_flags); */
-		/* 	TEST_ASSERT_EQUAL_HEX(data2[i].fx, be32_to_cpu(raw_cmp_data2[i].fx)); */
-		/* 	TEST_ASSERT_EQUAL_HEX(data2[i].efx, be32_to_cpu(raw_cmp_data2[i].efx)); */
-		/* 	TEST_ASSERT_EQUAL_HEX(data2[i].ncob_x, be32_to_cpu(raw_cmp_data2[i].ncob_x)); */
-		/* 	TEST_ASSERT_EQUAL_HEX(data2[i].ncob_y, be32_to_cpu(raw_cmp_data2[i].ncob_y)); */
-		/* 	TEST_ASSERT_EQUAL_HEX(data2[i].ecob_x, be32_to_cpu(raw_cmp_data2[i].ecob_x)); */
-		/* 	TEST_ASSERT_EQUAL_HEX(data2[i].ecob_y, be32_to_cpu(raw_cmp_data2[i].ecob_y)); */
-		/* } */
-	}
-	free(dst);
+	cmp_par.nc_background_outlier_pixels = MAX_CHUNK_CMP_PAR + 1;
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
+				  dst_capacity, &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_SPECIFIC, cmp_get_error_code(cmp_size));
 
-	/* error case: dst buffer to small */
-	dst_capacity -= 1;
-	dst = malloc(dst_capacity); TEST_ASSERT_NOT_NULL(dst);
+	/* wrong cmp_mode */
+	cmp_par.nc_background_outlier_pixels = MAX_CHUNK_CMP_PAR;
+	cmp_par.cmp_mode = 5;
 	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
 				  dst_capacity, &cmp_par);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_GENERIC, cmp_get_error_code(cmp_size));
+
+	/* wrong model value */
+	cmp_par.cmp_mode = CMP_MODE_MODEL_ZERO;
+	cmp_par.model_value = MAX_MODEL_VALUE + 1;
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
+				  dst_capacity, &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_GENERIC, cmp_get_error_code(cmp_size));
 	free(dst);
 }
-/* TODO: chunk tests
- * collection with 0 length;
- * collection with wrong mix collections;
- */
-#endif
 
 
 /**
@@ -4620,6 +1935,7 @@ void test_collection_zero_data_length(void)
 
 	/* compress the data */
 	cmp_par.cmp_mode = CMP_MODE_DIFF_MULTI;
+	cmp_par.nc_imagette = 1;
 	dst = NULL;
 
 	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
@@ -4647,83 +1963,264 @@ void test_collection_zero_data_length(void)
 	dst_capacity -= 1;
 	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
 				  dst_capacity, &cmp_par);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF_, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
 	free(dst);
 }
 
 
+static int n_timestamp_fail; /* fail after n calls */
+static uint64_t get_timstamp_test(void)
+{
+	static int n;
+
+	if (n < n_timestamp_fail) {
+		n++;
+		return 42;
+	}
+	n = 0;
+	return 1ULL << 48; /* invalid time stamp */
+}
+
+
 /**
  * @test compress_chunk
  */
-#if 0
-void nootest_collection_zero_data_length_2(void)
+
+void test_compress_chunk_error_cases(void)
 {
-	enum {	DATA_SIZE = 4,
-		CHUNK_SIZE = COLLECTION_HDR_SIZE + DATA_SIZE + COLLECTION_HDR_SIZE
+	enum {	DATA_SIZE_1 = 2*sizeof(struct s_fx),
+		DATA_SIZE_2 = 3*sizeof(struct s_fx_efx_ncob_ecob),
+		CHUNK_SIZE = 2*COLLECTION_HDR_SIZE + DATA_SIZE_1 + DATA_SIZE_2
 	};
 	uint8_t chunk[CHUNK_SIZE];
-	struct collection_hdr *col = (struct collection_hdr *)chunk;
-	uint16_t *data = (struct s_fx *)col->entry;
+	uint8_t const chunk_model[CHUNK_SIZE] = {0}; /* model is set to zero */
+	uint8_t updated_chunk_model[CHUNK_SIZE];
+	uint32_t dst[COMPRESS_CHUNK_BOUND(CHUNK_SIZE, 2)/sizeof(uint32_t)];
+	uint32_t dst_capacity = sizeof(dst);
 	struct cmp_par cmp_par = {0};
-	uint32_t *dst;
-	int cmp_size;
-	uint32_t dst_capacity = 43; /* random non zero value */
+	uint32_t cmp_size;
+	struct collection_hdr *col2;
 
-	/* create a chunk with a single collection */
-	memset(col, 0, COLLECTION_HDR_SIZE);
-	TEST_ASSERT_FALSE(cmp_col_set_subservice(col, SST_NCxx_S_SCIENCE_IMAGETTE));
+	{ /* create a chunk with two collection */
+		struct collection_hdr *col1 = (struct collection_hdr *)chunk;
+		struct s_fx *data1 = (struct s_fx *)col1->entry;
+		struct s_fx_efx_ncob_ecob *data2;
+
+		memset(col1, 0, COLLECTION_HDR_SIZE);
+		TEST_ASSERT_FALSE(cmp_col_set_subservice(col1, SST_NCxx_S_SCIENCE_S_FX));
+		TEST_ASSERT_FALSE(cmp_col_set_data_length(col1, DATA_SIZE_1));
+		data1[0].exp_flags = 0;
+		data1[0].fx = 1;
+		data1[1].exp_flags = 0xF0;
+		data1[1].fx = 0xABCDE0FF;
+		col2 = (struct collection_hdr *)(chunk + COLLECTION_HDR_SIZE + DATA_SIZE_1);
+		memset(col2, 0, COLLECTION_HDR_SIZE);
+		TEST_ASSERT_FALSE(cmp_col_set_subservice(col2, SST_NCxx_S_SCIENCE_S_FX_EFX_NCOB_ECOB));
+		TEST_ASSERT_FALSE(cmp_col_set_data_length(col2, DATA_SIZE_2));
+		data2 = (struct s_fx_efx_ncob_ecob *)col2->entry;
+		data2[0].exp_flags = 1;
+		data2[0].fx = 2;
+		data2[0].efx = 3;
+		data2[0].ncob_x = 4;
+		data2[0].ncob_y = 5;
+		data2[0].ecob_x = 6;
+		data2[0].ecob_y = 7;
+		data2[1].exp_flags = 0;
+		data2[1].fx = 0;
+		data2[1].efx = 0;
+		data2[1].ncob_x = 0;
+		data2[1].ncob_y = 0;
+		data2[1].ecob_x = 0;
+		data2[1].ecob_y = 0;
+		data2[2].exp_flags = 0xF;
+		data2[2].fx = ~0U;
+		data2[2].efx = ~0U;
+		data2[2].ncob_x = ~0U;
+		data2[2].ncob_y = ~0U;
+		data2[2].ecob_x = ~0U;
+		data2[2].ecob_y = ~0U;
+	}
 
 	/* compress the data */
-	cmp_par.cmp_mode = CMP_MODE_DIFF_MULTI;
-	dst = NULL;
-
-	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
-				  dst_capacity, &cmp_par);
-	TEST_ASSERT_EQUAL_INT(NON_IMAGETTE_HEADER_SIZE + CHUNK_SIZE + CMP_COLLECTION_FILD_SIZE, cmp_size);
-	dst_capacity = (uint32_t)cmp_size;
-	dst = malloc(dst_capacity); TEST_ASSERT_NOT_NULL(dst);
-	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
-				  dst_capacity, &cmp_par);
-	TEST_ASSERT_EQUAL_INT(NON_IMAGETTE_HEADER_SIZE + CHUNK_SIZE + CMP_COLLECTION_FILD_SIZE, cmp_size);
+	cmp_par.cmp_mode = CMP_MODE_MODEL_ZERO;
+	cmp_par.model_value = 16;
+	cmp_par.lossy_par = 0;
+
+	cmp_par.nc_imagette = 1;
+
+	cmp_par.s_exp_flags = MAX_CHUNK_CMP_PAR;
+	cmp_par.s_fx = MIN_CHUNK_CMP_PAR;
+	cmp_par.s_ncob = 2;
+	cmp_par.s_efx = 0xFFFE;
+	cmp_par.s_ecob = 1;
+
+	compress_chunk_init(NULL, 23);
+
+	/* this sound not return an error */
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  NULL, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_NO_ERROR, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_EQUAL(124, cmp_size);
+
+	/* error: no chunk */
+	cmp_size = compress_chunk(NULL, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_CHUNK_NULL, cmp_get_error_code(cmp_size));
+
+	/* error: chunk_size = 0 */
+	cmp_size = compress_chunk(chunk, 0, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_CHUNK_SIZE_INCONSISTENT, cmp_get_error_code(cmp_size));
+
+	/* error: chunk_size does not match up with the collection size */
+	TEST_ASSERT_FALSE(cmp_col_set_data_length((struct collection_hdr *) chunk, 100));
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_CHUNK_SIZE_INCONSISTENT, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_FALSE(cmp_col_set_data_length((struct collection_hdr *) chunk, DATA_SIZE_1));
+
+	/* error: no model when needed */
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_NO_MODEL, cmp_get_error_code(cmp_size));
+	/* this should work */
+	cmp_par.cmp_mode = CMP_MODE_DIFF_ZERO;
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_NO_ERROR, cmp_get_error_code(cmp_size));
+	cmp_par.cmp_mode = CMP_MODE_MODEL_ZERO;
 
-	/* test results */
-	{	struct cmp_entity *ent = (struct cmp_entity *)dst;
+	memset(dst, 0xFF, sizeof(dst));
+
+	/* error chunk and model are the same */
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_BUFFERS, cmp_get_error_code(cmp_size));
+
+	/* error chunk and updated model are the same */
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  chunk, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_BUFFERS, cmp_get_error_code(cmp_size));
+
+	/* buffer and dst are the same */
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, dst,
+				  updated_chunk_model, dst, dst_capacity, &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_BUFFERS, cmp_get_error_code(cmp_size));
+
+	/* error updated model buffer and dst are the same */
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  dst, dst, dst_capacity, &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_BUFFERS, cmp_get_error_code(cmp_size));
+
+	/* chunk buffer and dst are the same */
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, (void *)chunk, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_BUFFERS, cmp_get_error_code(cmp_size));
+
+	/* error: cmp_par = NULL */
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  NULL);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_NULL, cmp_get_error_code(cmp_size));
+
+	/* error: cmp_par invalid*/
+	cmp_par.s_exp_flags = 0;
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_PAR_SPECIFIC, cmp_get_error_code(cmp_size));
+	cmp_par.s_exp_flags = MAX_CHUNK_CMP_PAR;
+
+	/* error: chunk size to big */
+	cmp_size = compress_chunk(chunk, CMP_ENTITY_MAX_ORIGINAL_SIZE+1, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_CHUNK_TOO_LARGE, cmp_get_error_code(cmp_size));
+
+	/* error: dst buffer smaller than entity header */
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, dst, 5, &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUFFER, cmp_get_error_code(cmp_size));
+
+	/* error: invalid collection type */
+	TEST_ASSERT_FALSE(cmp_col_set_subservice((struct collection_hdr *)chunk, 42));
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_COL_SUBSERVICE_UNSUPPORTED, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_FALSE(cmp_col_set_subservice((struct collection_hdr *)chunk, SST_NCxx_S_SCIENCE_S_FX));
+
+	/* error: collection size no a multiple of the data size */
+	TEST_ASSERT_FALSE(cmp_col_set_data_length(col2, DATA_SIZE_2-1));
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE-1, chunk_model,
+				  updated_chunk_model, NULL, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_COL_SIZE_INCONSISTENT, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_FALSE(cmp_col_set_data_length(col2, DATA_SIZE_2));
 
-		TEST_ASSERT_EQUAL_UINT(CHUNK_SIZE+CMP_COLLECTION_FILD_SIZE, cmp_ent_get_cmp_data_size(ent));
-		TEST_ASSERT_EQUAL_UINT(CHUNK_SIZE, cmp_ent_get_original_size(ent));
-		TEST_ASSERT_EQUAL_UINT(cmp_par.cmp_mode, cmp_ent_get_cmp_mode(ent));
-		TEST_ASSERT_FALSE(cmp_ent_get_data_type_raw_bit(ent));
-		TEST_ASSERT_EQUAL_INT(DATA_TYPE_CHUNK, cmp_ent_get_data_type(ent));
+	/* this sound work */
+	cmp_par.lossy_par = 0x1;
+	{
+		size_t i;
 
-		TEST_ASSERT_EQUAL_HEX8_ARRAY(col, cmp_ent_get_data_buf(ent)+CMP_COLLECTION_FILD_SIZE, COLLECTION_HDR_SIZE);
+		for (i = 0; i < ARRAY_SIZE(dst); i++)
+			TEST_ASSERT_EQUAL_HEX(0xFFFFFFFF, dst[i]);
+	}
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_NO_ERROR, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_EQUAL(124, cmp_size);
+
+	/* error: invalid collection combination */
+	TEST_ASSERT_FALSE(cmp_col_set_subservice((struct collection_hdr *)(chunk + COLLECTION_HDR_SIZE + DATA_SIZE_1),
+						 SST_NCxx_S_SCIENCE_SMEARING));
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_CHUNK_SUBSERVICE_INCONSISTENT, cmp_get_error_code(cmp_size));
+	TEST_ASSERT_FALSE(cmp_col_set_subservice((struct collection_hdr *)(chunk + COLLECTION_HDR_SIZE + DATA_SIZE_1),
+						 SST_NCxx_S_SCIENCE_S_FX_EFX_NCOB_ECOB));
+
+	/* error: start time stamp error */
+	compress_chunk_init(&get_timstamp_test, 23);
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_ENTITY_TIMESTAMP, cmp_get_error_code(cmp_size));
+
+	/* error: end time stamp error */
+	n_timestamp_fail = 1;
+	compress_chunk_init(&get_timstamp_test, 23);
+	cmp_size = compress_chunk(chunk, CHUNK_SIZE, chunk_model,
+				  updated_chunk_model, dst, dst_capacity,
+				  &cmp_par);
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_ENTITY_TIMESTAMP, cmp_get_error_code(cmp_size));
+	n_timestamp_fail = INT_MAX;
+
+	{ /* error: trigger CMP_ERROR_ENTITY_HEADER */
+		uint32_t ent_hdr_size;
+		uint32_t entity[25];
+		uint32_t chunk_size = 42;
+		struct cmp_cfg cfg = {0};
+		uint64_t start_timestamp = 123;
+		uint32_t cmp_ent_size_byte = sizeof(entity);
+
+		cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
+		cfg.cmp_par_1 = UINT16_MAX + 1; /* to big for entity header */
+		ent_hdr_size = cmp_ent_build_chunk_header(entity, chunk_size, &cfg,
+							  start_timestamp, cmp_ent_size_byte);
+		TEST_ASSERT_EQUAL_INT(CMP_ERROR_ENTITY_HEADER, cmp_get_error_code(ent_hdr_size));
 	}
-
-	/* error case: dst buffer to small */
-	dst_capacity -= 1;
-	cmp_size = compress_chunk(chunk, CHUNK_SIZE, NULL, NULL, dst,
-				  dst_capacity, &cmp_par);
-	TEST_ASSERT_EQUAL_INT(CMP_ERROR_SMALL_BUF, cmp_size);
-	free(dst);
-}
-#endif
-
-/**
- * @test icu_compress_data
- */
-
-void test_icu_compress_data_error_cases(void)
-{
-	int cmp_size;
-	struct cmp_cfg cfg = {0};
-
-	/* cfg = NULL test */
-	cmp_size = icu_compress_data(NULL);
-	TEST_ASSERT_EQUAL(-1, cmp_size);
-
-	/* samples = 0 test */
-	cfg.samples = 0;
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL(0, cmp_size);
 }
 
 
@@ -4823,7 +2320,7 @@ void test_COMPRESS_CHUNK_BOUND(void)
 		chunk_size);
 	TEST_ASSERT_EQUAL(bound_exp, bound);
 
-	chunk_size = 42*COLLECTION_HDR_SIZE ;
+	chunk_size = 42*COLLECTION_HDR_SIZE;
 	num_col = 42;
 	bound = COMPRESS_CHUNK_BOUND(chunk_size, num_col);
 	bound_exp = ROUND_UP_TO_4(NON_IMAGETTE_HEADER_SIZE + 42*CMP_COLLECTION_FILD_SIZE +
@@ -4867,9 +2364,15 @@ void test_COMPRESS_CHUNK_BOUND(void)
 
 void test_compress_chunk_cmp_size_bound(void)
 {
-	uint8_t chunk[2*COLLECTION_HDR_SIZE + 42 + 3] = {0};
+	enum {
+		CHUNK_SIZE_1 = 42,
+		CHUNK_SIZE_2 = 3
+	};
+	uint8_t chunk[2*COLLECTION_HDR_SIZE + CHUNK_SIZE_1 + CHUNK_SIZE_2] = {0};
 	uint32_t chunk_size;
 	uint32_t bound, bound_exp;
+	struct collection_hdr *col2 = (struct collection_hdr *)
+		(chunk+COLLECTION_HDR_SIZE + CHUNK_SIZE_1);
 
 	TEST_ASSERT_FALSE(cmp_col_set_data_length((struct collection_hdr *)chunk, 0));
 
@@ -4893,8 +2396,8 @@ void test_compress_chunk_cmp_size_bound(void)
 	bound_exp = ROUND_UP_TO_4(NON_IMAGETTE_HEADER_SIZE + COLLECTION_HDR_SIZE + CMP_COLLECTION_FILD_SIZE);
 	TEST_ASSERT_EQUAL(bound_exp, bound);
 
-	chunk_size = COLLECTION_HDR_SIZE + 42;
-	TEST_ASSERT_FALSE(cmp_col_set_data_length((struct collection_hdr *)chunk, 42));
+	chunk_size = COLLECTION_HDR_SIZE + CHUNK_SIZE_1;
+	TEST_ASSERT_FALSE(cmp_col_set_data_length((struct collection_hdr *)chunk, CHUNK_SIZE_1));
 	bound = compress_chunk_cmp_size_bound(chunk, chunk_size);
 	bound_exp = ROUND_UP_TO_4(NON_IMAGETTE_HEADER_SIZE + CMP_COLLECTION_FILD_SIZE +
 		chunk_size);
@@ -4905,15 +2408,53 @@ void test_compress_chunk_cmp_size_bound(void)
 	TEST_ASSERT_TRUE(cmp_is_error(bound));
 	TEST_ASSERT_EQUAL_INT(CMP_ERROR_CHUNK_NULL, cmp_get_error_code(bound));
 
-	TEST_ASSERT_FALSE(cmp_col_set_data_length((struct collection_hdr *)(chunk+chunk_size), 3));
+
+	/* two collections */
+	TEST_ASSERT_FALSE(cmp_col_set_data_length(col2, CHUNK_SIZE_2));
 	chunk_size = sizeof(chunk);
 	bound = compress_chunk_cmp_size_bound(chunk, chunk_size);
 	bound_exp = ROUND_UP_TO_4(NON_IMAGETTE_HEADER_SIZE + 2*CMP_COLLECTION_FILD_SIZE +
 		chunk_size);
 	TEST_ASSERT_EQUAL(bound_exp, bound);
+
+	TEST_ASSERT_FALSE(cmp_col_set_data_length(col2, 0));
+	chunk_size = 2*COLLECTION_HDR_SIZE + CHUNK_SIZE_1;
+	bound = compress_chunk_cmp_size_bound(chunk, chunk_size);
+	bound_exp = ROUND_UP_TO_4(NON_IMAGETTE_HEADER_SIZE + 2*CMP_COLLECTION_FILD_SIZE +
+		chunk_size);
+	TEST_ASSERT_EQUAL(bound_exp, bound);
+
+	/* wrong chunk_size */
+	TEST_ASSERT_FALSE(cmp_col_set_data_length(col2, 0));
+	chunk_size = 1 + 2*COLLECTION_HDR_SIZE + CHUNK_SIZE_1;
+	bound = compress_chunk_cmp_size_bound(chunk, chunk_size);
+	TEST_ASSERT_TRUE(cmp_is_error(bound));
+	TEST_ASSERT_EQUAL_INT(CMP_ERROR_CHUNK_SIZE_INCONSISTENT, cmp_get_error_code(bound));
+
+#ifndef __sparc__
+	{ /* containing only zero data size collections */
+		size_t i;
+		uint8_t *chunk_big;
+		size_t const max_chunk_size = CMP_ENTITY_MAX_ORIGINAL_SIZE
+			- NON_IMAGETTE_HEADER_SIZE - CMP_COLLECTION_FILD_SIZE;
+
+		chunk_big = malloc(max_chunk_size);
+		TEST_ASSERT_NOT_NULL(chunk_big);
+		for (i = 0; i < max_chunk_size-COLLECTION_HDR_SIZE; i = i+COLLECTION_HDR_SIZE)
+			TEST_ASSERT_FALSE(cmp_col_set_data_length((struct collection_hdr *)&chunk_big[i], 0));
+
+		bound = compress_chunk_cmp_size_bound(chunk_big, i);
+		TEST_ASSERT_EQUAL_INT(CMP_ERROR_CHUNK_TOO_LARGE, cmp_get_error_code(bound));
+		free(chunk_big);
+	}
+#endif
 }
 
 
+/**
+ * @test compress_chunk_set_model_id_and_counter
+ */
+
 void test_compress_chunk_set_model_id_and_counter(void)
 {
 	uint32_t ret;
@@ -4948,25 +2489,55 @@ void test_compress_chunk_set_model_id_and_counter(void)
 	ret = compress_chunk_set_model_id_and_counter(NULL, dst_size, model_id, model_counter);
 	TEST_ASSERT_TRUE(cmp_is_error(ret));
 	TEST_ASSERT_EQUAL(CMP_ERROR_ENTITY_NULL, cmp_get_error_code(ret));
+
+	ret = compress_chunk_set_model_id_and_counter(&dst, CMP_ERROR(PAR_GENERIC), model_id, model_counter);
+	TEST_ASSERT_TRUE(cmp_is_error(ret));
+	TEST_ASSERT_EQUAL(CMP_ERROR_PAR_GENERIC, cmp_get_error_code(ret));
 }
 
 
 
 void test_support_function_call_NULL(void)
 {
-	struct cmp_cfg cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_DIFF_ZERO, 16, CMP_LOSSLESS);
+	struct cmp_cfg cfg = {0};
+
+	cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
 
-	TEST_ASSERT_TRUE(cmp_cfg_gen_par_is_invalid(NULL, ICU_CHECK));
-	TEST_ASSERT_TRUE(cmp_cfg_gen_par_is_invalid(&cfg, RDCU_CHECK+1));
-	TEST_ASSERT_TRUE(cmp_cfg_icu_buffers_is_invalid(NULL));
-	TEST_ASSERT_TRUE(cmp_cfg_imagette_is_invalid(NULL, RDCU_CHECK));
+	TEST_ASSERT_TRUE(cmp_cfg_gen_par_is_invalid(NULL));
+	TEST_ASSERT_TRUE(cmp_cfg_gen_par_is_invalid(&cfg));
+	cfg.data_type = DATA_TYPE_F_FX_EFX;
+	TEST_ASSERT_TRUE(cmp_cfg_imagette_is_invalid(&cfg));
+	TEST_ASSERT_TRUE(cmp_cfg_imagette_is_invalid(NULL));
+	cfg.data_type = DATA_TYPE_IMAGETTE;
 	TEST_ASSERT_TRUE(cmp_cfg_fx_cob_is_invalid(NULL));
+	TEST_ASSERT_TRUE(cmp_cfg_fx_cob_is_invalid(&cfg));
 	TEST_ASSERT_TRUE(cmp_cfg_aux_is_invalid(NULL));
 	TEST_ASSERT_TRUE(cmp_cfg_aux_is_invalid(&cfg));
-	TEST_ASSERT_TRUE(cmp_cfg_icu_is_invalid(NULL));
-	cfg.data_type = DATA_TYPE_UNKNOWN;
-	TEST_ASSERT_TRUE(cmp_cfg_icu_is_invalid(&cfg));
+	TEST_ASSERT_FALSE(cmp_aux_data_type_is_used(DATA_TYPE_S_FX));
 	TEST_ASSERT_TRUE(cmp_cfg_fx_cob_get_need_pars(DATA_TYPE_S_FX, NULL));
+	TEST_ASSERT_TRUE(check_compression_buffers(NULL));
+	cfg.cmp_mode = 5;
+	TEST_ASSERT_TRUE(cmp_cfg_imagette_is_invalid(&cfg));
+}
+
+
+/*
+ * @test cmp_cfg_fx_cob_get_need_pars
+ */
+
+void test_missing_cmp_cfg_fx_cob_get_need_pars(void)
+{
+	struct fx_cob_par used_par;
+	enum cmp_data_type data_type;
+
+	data_type = DATA_TYPE_F_FX;
+	TEST_ASSERT_FALSE(cmp_cfg_fx_cob_get_need_pars(data_type, &used_par));
+	data_type = DATA_TYPE_F_FX_EFX;
+	TEST_ASSERT_FALSE(cmp_cfg_fx_cob_get_need_pars(data_type, &used_par));
+	data_type = DATA_TYPE_F_FX_NCOB;
+	TEST_ASSERT_FALSE(cmp_cfg_fx_cob_get_need_pars(data_type, &used_par));
+	data_type = DATA_TYPE_F_FX_EFX_NCOB_ECOB;
+	TEST_ASSERT_FALSE(cmp_cfg_fx_cob_get_need_pars(data_type, &used_par));
 }
 
 
@@ -4994,3 +2565,52 @@ void test_print_cmp_info(void)
 	print_cmp_info(&info);
 	print_cmp_info(NULL);
 }
+
+
+/**
+ * @test detect_buf_overlap
+ */
+
+void test_buffer_overlaps(void)
+{
+	char buf_a[3] = {0};
+	char buf_b[3] = {0};
+	int overlap;
+
+	overlap = buffer_overlaps(buf_a, sizeof(buf_a), buf_b, sizeof(buf_b));
+	TEST_ASSERT_FALSE(overlap);
+	overlap = buffer_overlaps(NULL, sizeof(buf_a), buf_b, sizeof(buf_b));
+	TEST_ASSERT_FALSE(overlap);
+	overlap = buffer_overlaps(buf_a, sizeof(buf_a), NULL, sizeof(buf_b));
+	TEST_ASSERT_FALSE(overlap);
+
+	overlap = buffer_overlaps(buf_a, sizeof(buf_a), buf_a, sizeof(buf_a));
+	TEST_ASSERT_TRUE(overlap);
+
+	overlap = buffer_overlaps(&buf_a[1], 1, buf_a, sizeof(buf_a));
+	TEST_ASSERT_TRUE(overlap);
+
+	overlap = buffer_overlaps(&buf_a[0], 2, &buf_a[1], 2);
+	TEST_ASSERT_TRUE(overlap);
+	overlap = buffer_overlaps(&buf_a[1], 2, &buf_a[0], 2);
+	TEST_ASSERT_TRUE(overlap);
+}
+
+
+/**
+ * @test cmp_get_error_string
+ */
+
+void test_cmp_get_error_string(void)
+{
+	enum cmp_error code;
+	const char *str;
+
+	for (code = CMP_ERROR_NO_ERROR; code <= CMP_ERROR_MAX_CODE; code++) {
+		str = cmp_get_error_string(code);
+		TEST_ASSERT_NOT_EQUAL('\0', str[0]);
+
+		str = cmp_get_error_name((-code));
+		TEST_ASSERT_NOT_EQUAL('\0', str[0]);
+	}
+}
diff --git a/test/cmp_max_used_bits/meson.build b/test/cmp_max_used_bits/meson.build
deleted file mode 100644
index b863442cc615cdd233797020fc204b22638e2da3..0000000000000000000000000000000000000000
--- a/test/cmp_max_used_bits/meson.build
+++ /dev/null
@@ -1 +0,0 @@
-test_cases += [[files('test_cmp_max_used_bits_list.c'), 'max_used_bits List Unit Tests']]
diff --git a/test/cmp_max_used_bits/test_cmp_max_used_bits_list.c b/test/cmp_max_used_bits/test_cmp_max_used_bits_list.c
deleted file mode 100644
index 21e6c08e71e17dd324fe4c11a48fb2f377ec4a81..0000000000000000000000000000000000000000
--- a/test/cmp_max_used_bits/test_cmp_max_used_bits_list.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/**
- * @file   test_cmp_max_used_bits_list.c
- * @author Dominik Loidolt (dominik.loidolt@univie.ac.at)
- * @date   2023
- *
- * @copyright GPLv2
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * @brief max_used_bits list tests
- */
-
-
-#if !defined(__sparc__) && !defined(_WIN32) && !defined(_WIN64)
-#  define MAKE_MALLOC_FAIL_TEST
-#  define _GNU_SOURCE
-#  include <dlfcn.h>
-#  include <stdlib.h>
-#endif
-
-#include <string.h>
-
-#include <unity.h>
-
-#include <cmp_max_used_bits_list.h>
-
-#ifdef MAKE_MALLOC_FAIL_TEST
-/* if set the mock malloc will fail (return NULL) */
-static int malloc_fail;
-
-
-/*
- * mock of the malloc function; can controlled with the global malloc_fail variable
- * see: https://jayconrod.com/posts/23/tutorial--function-interposition-in-linux
- */
-
-void* malloc(size_t size)
-{
-	static void* (*real_malloc)(size_t size) = NULL;
-
-	if(malloc_fail)
-		return NULL;
-
-	if (!real_malloc) {
-		*(void **)(&real_malloc) = dlsym(RTLD_NEXT, "malloc");
-		/* The cast removes a gcc warning https://stackoverflow.com/a/31528674 */
-		TEST_ASSERT_NOT_NULL(real_malloc);
-	}
-
-	return real_malloc(size);
-}
-#endif
-
-
-/**
- * @test cmp_max_used_bits_list_add
- * @test cmp_max_used_bits_list_get
- * @test cmp_max_used_bits_list_delet
- * @test cmp_max_used_bits_list_empty
- */
-
-void test_cmp_max_used_bits_list(void)
-{
-	struct cmp_max_used_bits i_32, i_34, i_35, i_36, i_255, i_0;
-	const struct cmp_max_used_bits *p;
-	int return_val;
-
-	/* set up max_used_bits item */
-	memset(&i_32, 32, sizeof(struct cmp_max_used_bits));
-	i_32.version = 32;
-	memset(&i_34, 34, sizeof(struct cmp_max_used_bits));
-	i_34.version = 34;
-	memset(&i_35, 35, sizeof(struct cmp_max_used_bits));
-	i_35.version = 35;
-	memset(&i_36, 36, sizeof(struct cmp_max_used_bits));
-	i_36.version = 36;
-	memset(&i_255, 0xFF, sizeof(struct cmp_max_used_bits));
-	i_255.version = 255;
-	memset(&i_0, 0, sizeof(struct cmp_max_used_bits));
-	i_0.version = 0;
-
-	return_val = cmp_max_used_bits_list_add(&i_32);
-	TEST_ASSERT_EQUAL_INT(return_val, 0);
-	return_val = cmp_max_used_bits_list_add(&i_34);
-	TEST_ASSERT_EQUAL_INT(return_val, 0);
-	return_val = cmp_max_used_bits_list_add(&i_35);
-	TEST_ASSERT_EQUAL_INT(return_val, 0);
-	return_val = cmp_max_used_bits_list_add(&i_36);
-	TEST_ASSERT_EQUAL_INT(return_val, 0);
-	return_val = cmp_max_used_bits_list_add(&i_255);
-	TEST_ASSERT_EQUAL_INT(return_val, 0);
-
-	/* error cases */
-	return_val = cmp_max_used_bits_list_add(NULL);
-	TEST_ASSERT_EQUAL_INT(return_val, -1);
-	return_val = cmp_max_used_bits_list_add(&i_0);
-	TEST_ASSERT_EQUAL_INT(return_val, -1);
-	i_0.version = CMP_MAX_USED_BITS_RESERVED_VERSIONS-1;
-	return_val = cmp_max_used_bits_list_add(&i_0);
-	TEST_ASSERT_EQUAL_INT(return_val, -1);
-
-	p = cmp_max_used_bits_list_get(32);
-	TEST_ASSERT_EQUAL_INT(p->version, 32);
-	TEST_ASSERT(!memcmp(p, &i_32, sizeof(struct cmp_max_used_bits)));
-
-	p = cmp_max_used_bits_list_get(36);
-	TEST_ASSERT_EQUAL_INT(p->version, 36);
-	TEST_ASSERT(!memcmp(p, &i_36, sizeof(struct cmp_max_used_bits)));
-
-	p = cmp_max_used_bits_list_get(35);
-	TEST_ASSERT_EQUAL_INT(p->version, 35);
-	TEST_ASSERT(!memcmp(p, &i_35, sizeof(struct cmp_max_used_bits)));
-
-	p = cmp_max_used_bits_list_get(255);
-	TEST_ASSERT_EQUAL_INT(p->version, 255);
-	TEST_ASSERT(!memcmp(p, &i_255, sizeof(struct cmp_max_used_bits)));
-
-	p = cmp_max_used_bits_list_get(34);
-	TEST_ASSERT_EQUAL_INT(p->version, 34);
-	TEST_ASSERT(!memcmp(p, &i_34, sizeof(struct cmp_max_used_bits)));
-
-	p = cmp_max_used_bits_list_get(0);
-	TEST_ASSERT_EQUAL_INT(p->version, 0);
-	TEST_ASSERT(!memcmp(p, &MAX_USED_BITS_SAFE, sizeof(struct cmp_max_used_bits)));
-
-	p = cmp_max_used_bits_list_get(1);
-	TEST_ASSERT_EQUAL_INT(p->version, 1);
-	TEST_ASSERT(!memcmp(p, &MAX_USED_BITS_V1, sizeof(struct cmp_max_used_bits)));
-
-	/* Try to get an element that is not in the list */
-	p = cmp_max_used_bits_list_get(42);
-	TEST_ASSERT_NULL(p);
-
-	p = cmp_max_used_bits_list_get(3);
-	TEST_ASSERT_NULL(p);
-
-
-	/* overwrite a list item */
-	memset(&i_35, 0x42, sizeof(struct cmp_max_used_bits));
-	i_35.version = 35;
-	return_val = cmp_max_used_bits_list_add(&i_35);
-	TEST_ASSERT_EQUAL_INT(return_val, 1);
-	p = cmp_max_used_bits_list_get(35);
-	TEST_ASSERT_EQUAL_INT(p->version, 35);
-	TEST_ASSERT(!memcmp(p, &i_35, sizeof(struct cmp_max_used_bits)));
-
-	/* delete item */
-	cmp_max_used_bits_list_delet(35);
-	p = cmp_max_used_bits_list_get(35);
-	TEST_ASSERT_NULL(p);
-
-	cmp_max_used_bits_list_delet(34);
-	p = cmp_max_used_bits_list_get(34);
-	TEST_ASSERT_NULL(p);
-
-	/* empty item */
-	cmp_max_used_bits_list_empty();
-	p = cmp_max_used_bits_list_get(36);
-	TEST_ASSERT_NULL(p);
-
-	cmp_max_used_bits_list_empty();
-	p = cmp_max_used_bits_list_get(34);
-	TEST_ASSERT_NULL(p);
-
-	p = cmp_max_used_bits_list_get(0);
-	TEST_ASSERT_EQUAL_INT(p->version, 0);
-	TEST_ASSERT(!memcmp(p, &MAX_USED_BITS_SAFE, sizeof(struct cmp_max_used_bits)));
-
-	p = cmp_max_used_bits_list_get(1);
-	TEST_ASSERT_EQUAL_INT(p->version, 1);
-	TEST_ASSERT(!memcmp(p, &MAX_USED_BITS_V1, sizeof(struct cmp_max_used_bits)));
-
-	return_val = cmp_max_used_bits_list_add(&i_36);
-	TEST_ASSERT_EQUAL_INT(return_val, 0);
-
-	p = cmp_max_used_bits_list_get(36);
-	TEST_ASSERT_EQUAL_INT(p->version, 36);
-	TEST_ASSERT(!memcmp(p, &i_36, sizeof(struct cmp_max_used_bits)));
-
-	cmp_max_used_bits_list_empty();
-
-	/* error case */
-#ifdef MAKE_MALLOC_FAIL_TEST
-	malloc_fail = 1;
-	return_val = cmp_max_used_bits_list_add(&i_36);
-	TEST_ASSERT_EQUAL_INT(return_val, -1);
-	malloc_fail = 0;
-#endif
-}
diff --git a/test/cmp_rdcu_cfg/test_cmp_rdcu_cfg.c b/test/cmp_rdcu_cfg/test_cmp_rdcu_cfg.c
index 89ab07d35dba5536586b756c2bc94fc600a100ba..c23b3cc625034bd5fabc8c9bfc5fe447b06da021 100644
--- a/test/cmp_rdcu_cfg/test_cmp_rdcu_cfg.c
+++ b/test/cmp_rdcu_cfg/test_cmp_rdcu_cfg.c
@@ -21,6 +21,7 @@
 #include <unity.h>
 #include <cmp_rdcu_cfg.h>
 #include <rdcu_cmd.h>
+#include <cmp_cal_up_model.h>
 
 
 /**
@@ -29,110 +30,72 @@
 
 void test_rdcu_cfg_create(void)
 {
-	struct cmp_cfg cfg;
-	enum cmp_data_type data_type;
+	struct rdcu_cfg rcfg;
 	enum cmp_mode cmp_mode;
 	uint32_t model_value, lossy_par;
-
-	/* wrong data type tests */
-	data_type = DATA_TYPE_UNKNOWN; /* not valid data type */
-	cmp_mode = CMP_MODE_RAW;
-	model_value = 0;
-	lossy_par = CMP_LOSSLESS;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
-
-	/* data_type not supported by RDCU */
-	data_type = DATA_TYPE_OFFSET;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
-
-	data_type = -1U; /* not valid data type */
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
-
-	 /*now it should work */
-	data_type = DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(data_type, cfg.data_type);
-	TEST_ASSERT_EQUAL(cmp_mode, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL(model_value, cfg.model_value);
-	TEST_ASSERT_EQUAL(lossy_par, cfg.round);
+	int error;
 
 
 	/* wrong compression mode tests */
 	cmp_mode = (enum cmp_mode)(CMP_MODE_DIFF_MULTI+1); /* not a RDCU compression mode */
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
+	model_value = 0;
+	lossy_par = CMP_LOSSLESS;
+	error = rdcu_cfg_create(&rcfg, cmp_mode, model_value, lossy_par);
+	TEST_ASSERT_TRUE(error);
 
 	cmp_mode = (enum cmp_mode)-1U;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
+	error = rdcu_cfg_create(&rcfg, cmp_mode, model_value, lossy_par);
+	TEST_ASSERT_TRUE(error);
 
 	/* this should work */
-	cmp_mode = (enum cmp_mode)4;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(data_type, cfg.data_type);
-	TEST_ASSERT_EQUAL(cmp_mode, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL(model_value, cfg.model_value);
-	TEST_ASSERT_EQUAL(lossy_par, cfg.round);
+	cmp_mode = CMP_MODE_DIFF_MULTI;
+	error = rdcu_cfg_create(&rcfg, cmp_mode, model_value, lossy_par);
+	TEST_ASSERT_FALSE(error);
+	TEST_ASSERT_EQUAL(cmp_mode, rcfg.cmp_mode);
+	TEST_ASSERT_EQUAL(model_value, rcfg.model_value);
+	TEST_ASSERT_EQUAL(lossy_par, rcfg.round);
 
 
 	/* wrong model_value tests */
 	cmp_mode = CMP_MODE_DIFF_ZERO;
 	model_value = MAX_MODEL_VALUE + 1;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
+	error = rdcu_cfg_create(&rcfg, cmp_mode, model_value, lossy_par);
+	TEST_ASSERT_TRUE(error);
 
 	cmp_mode = CMP_MODE_RAW;
 	model_value = -1U;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
+	error = rdcu_cfg_create(&rcfg, cmp_mode, model_value, lossy_par);
+	TEST_ASSERT_TRUE(error);
 
 	/* this should work */
 	model_value = MAX_MODEL_VALUE;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(data_type, cfg.data_type);
-	TEST_ASSERT_EQUAL(cmp_mode, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL(model_value, cfg.model_value);
-	TEST_ASSERT_EQUAL(lossy_par, cfg.round);
+	error = rdcu_cfg_create(&rcfg, cmp_mode, model_value, lossy_par);
+	TEST_ASSERT_FALSE(error);
+	TEST_ASSERT_EQUAL(cmp_mode, rcfg.cmp_mode);
+	TEST_ASSERT_EQUAL(model_value, rcfg.model_value);
+	TEST_ASSERT_EQUAL(lossy_par, rcfg.round);
 
 
 	/* wrong lossy_par tests */
 	lossy_par = MAX_RDCU_ROUND + 1;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
+	error = rdcu_cfg_create(&rcfg, cmp_mode, model_value, lossy_par);
+	TEST_ASSERT_TRUE(error);
 
 	lossy_par = -1U;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
+	error = rdcu_cfg_create(&rcfg, cmp_mode, model_value, lossy_par);
+	TEST_ASSERT_TRUE(error);
 
 	/* this should work */
 	lossy_par = MAX_RDCU_ROUND;
-	cfg = rdcu_cfg_create(data_type, cmp_mode, model_value, lossy_par);
-	TEST_ASSERT_EQUAL(data_type, cfg.data_type);
-	TEST_ASSERT_EQUAL(cmp_mode, cfg.cmp_mode);
-	TEST_ASSERT_EQUAL(model_value, cfg.model_value);
-	TEST_ASSERT_EQUAL(lossy_par, cfg.round);
-
-
-	/* wrong data type  test */
-	for (data_type = 0; data_type <= DATA_TYPE_F_CAM_BACKGROUND; data_type++) {
-		cfg = rdcu_cfg_create(data_type, CMP_MODE_DIFF_MULTI, MAX_MODEL_VALUE, CMP_LOSSLESS);
-		if (data_type == DATA_TYPE_IMAGETTE ||
-		    data_type == DATA_TYPE_IMAGETTE_ADAPTIVE ||
-		    data_type == DATA_TYPE_SAT_IMAGETTE ||
-		    data_type == DATA_TYPE_SAT_IMAGETTE_ADAPTIVE ||
-		    data_type == DATA_TYPE_F_CAM_IMAGETTE ||
-		    data_type == DATA_TYPE_F_CAM_IMAGETTE_ADAPTIVE) {
-			TEST_ASSERT_EQUAL(data_type, cfg.data_type);
-			TEST_ASSERT_EQUAL(CMP_MODE_DIFF_MULTI, cfg.cmp_mode);
-			TEST_ASSERT_EQUAL(MAX_MODEL_VALUE, cfg.model_value);
-			TEST_ASSERT_EQUAL(CMP_LOSSLESS, cfg.round);
-		} else {
-			TEST_ASSERT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
-		}
-	}
+	error = rdcu_cfg_create(&rcfg, cmp_mode, model_value, lossy_par);
+	TEST_ASSERT_FALSE(error);
+	TEST_ASSERT_EQUAL(cmp_mode, rcfg.cmp_mode);
+	TEST_ASSERT_EQUAL(model_value, rcfg.model_value);
+	TEST_ASSERT_EQUAL(lossy_par, rcfg.round);
+
+	/* rcfg == NULL */
+	error = rdcu_cfg_create(NULL, cmp_mode, model_value, lossy_par);
+	TEST_ASSERT_TRUE(error);
 }
 
 
@@ -143,7 +106,7 @@ void test_rdcu_cfg_create(void)
 void test_rdcu_cfg_buffers_raw_diff(void)
 {
 	int error;
-	struct cmp_cfg cfg;
+	struct rdcu_cfg rcfg;
 	uint16_t data_to_compress[4] = {0x23, 0x42, 0xFF, 0x32};
 	uint32_t data_samples = 4;
 	uint32_t rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr;
@@ -151,29 +114,30 @@ void test_rdcu_cfg_buffers_raw_diff(void)
 
 
 	/* test a RAW mode buffer configuration */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE_ADAPTIVE, CMP_MODE_RAW,
+	error = rdcu_cfg_create(&rcfg, CMP_MODE_RAW,
 			      MAX_MODEL_VALUE, CMP_LOSSLESS);
+	TEST_ASSERT_FALSE(error);
 
 	rdcu_model_adr = 0x0;
 	rdcu_new_model_adr = 0x0;
 	rdcu_data_adr = 0x0;
 	rdcu_buffer_adr = 0x8;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL(data_to_compress, cfg.input_buf);
-	TEST_ASSERT_EQUAL(data_samples, cfg.samples);
-	TEST_ASSERT_EQUAL(NULL, cfg.model_buf);
-	TEST_ASSERT_EQUAL(rdcu_data_adr, cfg.rdcu_data_adr);
-	TEST_ASSERT_EQUAL(rdcu_model_adr, cfg.rdcu_model_adr);
-	TEST_ASSERT_EQUAL(rdcu_new_model_adr, cfg.rdcu_new_model_adr);
-	TEST_ASSERT_EQUAL(rdcu_buffer_adr, cfg.rdcu_buffer_adr);
-	TEST_ASSERT_EQUAL(rdcu_buffer_lenght, cfg.buffer_length);
+	TEST_ASSERT_EQUAL(data_to_compress, rcfg.input_buf);
+	TEST_ASSERT_EQUAL(data_samples, rcfg.samples);
+	TEST_ASSERT_EQUAL(NULL, rcfg.model_buf);
+	TEST_ASSERT_EQUAL(rdcu_data_adr, rcfg.rdcu_data_adr);
+	TEST_ASSERT_EQUAL(rdcu_model_adr, rcfg.rdcu_model_adr);
+	TEST_ASSERT_EQUAL(rdcu_new_model_adr, rcfg.rdcu_new_model_adr);
+	TEST_ASSERT_EQUAL(rdcu_buffer_adr, rcfg.rdcu_buffer_adr);
+	TEST_ASSERT_EQUAL(rdcu_buffer_lenght, rcfg.buffer_length);
 
 	/* set input buffer to NULL */
-	error = rdcu_cfg_buffers(&cfg, NULL, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, NULL, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_FALSE(error);
@@ -182,7 +146,7 @@ void test_rdcu_cfg_buffers_raw_diff(void)
 	rdcu_data_adr = 0x0;
 	rdcu_buffer_adr = 0x8;
 	rdcu_buffer_lenght = 3;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -191,18 +155,19 @@ void test_rdcu_cfg_buffers_raw_diff(void)
 	rdcu_data_adr = 0x0;
 	rdcu_buffer_adr = 0x4;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
 
 	/* get a diff config */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_MODE_DIFF_MULTI,
-			      MAX_MODEL_VALUE, CMP_LOSSLESS);
+	error = rdcu_cfg_create(&rcfg, CMP_MODE_DIFF_MULTI,
+				MAX_MODEL_VALUE, CMP_LOSSLESS);
+	TEST_ASSERT_FALSE(error);
 	rdcu_data_adr = 0x4;
 	rdcu_buffer_adr = 0x0;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -211,7 +176,7 @@ void test_rdcu_cfg_buffers_raw_diff(void)
 	rdcu_data_adr = RDCU_SRAM_END & ~0x3UL;
 	rdcu_buffer_adr = 0x8;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -219,7 +184,7 @@ void test_rdcu_cfg_buffers_raw_diff(void)
 	rdcu_data_adr = 0x0;
 	rdcu_buffer_adr = 0x8;
 	rdcu_buffer_lenght = RDCU_SRAM_SIZE;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -227,7 +192,7 @@ void test_rdcu_cfg_buffers_raw_diff(void)
 	rdcu_data_adr = 0xFFFFFFFC;
 	rdcu_buffer_adr = 0x8;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -235,7 +200,7 @@ void test_rdcu_cfg_buffers_raw_diff(void)
 	rdcu_data_adr = 0x0;
 	rdcu_buffer_adr = 0x8;
 	rdcu_buffer_lenght = UINT32_MAX;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -244,7 +209,7 @@ void test_rdcu_cfg_buffers_raw_diff(void)
 	rdcu_data_adr = 0x2;
 	rdcu_buffer_adr = 0x10;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -252,7 +217,7 @@ void test_rdcu_cfg_buffers_raw_diff(void)
 	rdcu_data_adr = 0x0;
 	rdcu_buffer_adr = 0x9;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -272,7 +237,7 @@ void test_rdcu_cfg_buffers_raw_diff(void)
 void test_rdcu_cfg_buffers_model(void)
 {
 	int error;
-	struct cmp_cfg cfg;
+	struct rdcu_cfg rcfg;
 	uint16_t data_to_compress[4] = {0x23, 0x42, 0xFF, 0x32};
 	uint16_t model_of_data[4] = {0xFF, 0x12, 0x34, 0xAB};
 	uint32_t data_samples = 4;
@@ -281,36 +246,37 @@ void test_rdcu_cfg_buffers_model(void)
 
 
 	/* test a RAW mode buffer configuration */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_MODE_MODEL_MULTI,
-			      MAX_MODEL_VALUE, CMP_LOSSLESS);
+	error = rdcu_cfg_create(&rcfg, CMP_MODE_MODEL_MULTI, MAX_MODEL_VALUE,
+				CMP_LOSSLESS);
+	TEST_ASSERT_FALSE(error);
 
 	rdcu_data_adr = 0x0;
 	rdcu_model_adr = 0x8;
 	rdcu_new_model_adr = 0x10;
 	rdcu_buffer_adr = 0x18;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, model_of_data,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, model_of_data,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL(data_to_compress, cfg.input_buf);
-	TEST_ASSERT_EQUAL(data_samples, cfg.samples);
-	TEST_ASSERT_EQUAL(model_of_data, cfg.model_buf);
-	TEST_ASSERT_EQUAL(rdcu_data_adr, cfg.rdcu_data_adr);
-	TEST_ASSERT_EQUAL(rdcu_model_adr, cfg.rdcu_model_adr);
-	TEST_ASSERT_EQUAL(rdcu_new_model_adr, cfg.rdcu_new_model_adr);
-	TEST_ASSERT_EQUAL(rdcu_buffer_adr, cfg.rdcu_buffer_adr);
-	TEST_ASSERT_EQUAL(rdcu_buffer_lenght, cfg.buffer_length);
+	TEST_ASSERT_EQUAL(data_to_compress, rcfg.input_buf);
+	TEST_ASSERT_EQUAL(data_samples, rcfg.samples);
+	TEST_ASSERT_EQUAL(model_of_data, rcfg.model_buf);
+	TEST_ASSERT_EQUAL(rdcu_data_adr, rcfg.rdcu_data_adr);
+	TEST_ASSERT_EQUAL(rdcu_model_adr, rcfg.rdcu_model_adr);
+	TEST_ASSERT_EQUAL(rdcu_new_model_adr, rcfg.rdcu_new_model_adr);
+	TEST_ASSERT_EQUAL(rdcu_buffer_adr, rcfg.rdcu_buffer_adr);
+	TEST_ASSERT_EQUAL(rdcu_buffer_lenght, rcfg.buffer_length);
 
 	/* data and model buffers are NULL */
 	rdcu_new_model_adr = rdcu_model_adr;
-	error = rdcu_cfg_buffers(&cfg, NULL, data_samples, NULL,
+	error = rdcu_cfg_buffers(&rcfg, NULL, data_samples, NULL,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_FALSE(error);
 
 	/* error: data and model buffer are the same */
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, data_to_compress,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, data_to_compress,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -321,7 +287,7 @@ void test_rdcu_cfg_buffers_model(void)
 	rdcu_new_model_adr = rdcu_model_adr;
 	rdcu_buffer_adr = 0x14;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, model_of_data,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, model_of_data,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -332,7 +298,7 @@ void test_rdcu_cfg_buffers_model(void)
 	rdcu_new_model_adr = rdcu_model_adr;
 	rdcu_buffer_adr = 0x10;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, model_of_data,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, model_of_data,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -343,7 +309,7 @@ void test_rdcu_cfg_buffers_model(void)
 	rdcu_new_model_adr = rdcu_model_adr;
 	rdcu_buffer_adr = 0x10;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, model_of_data,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, model_of_data,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -354,7 +320,7 @@ void test_rdcu_cfg_buffers_model(void)
 	rdcu_new_model_adr = rdcu_model_adr;
 	rdcu_buffer_adr = 0x10;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, model_of_data,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, model_of_data,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -367,7 +333,7 @@ void test_rdcu_cfg_buffers_model(void)
 	rdcu_new_model_adr = 0x11; /* not 4 byte aligned */
 	rdcu_buffer_adr = 0x1C;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, model_of_data,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, model_of_data,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -378,7 +344,7 @@ void test_rdcu_cfg_buffers_model(void)
 	rdcu_new_model_adr = 0xFFFFFFFC; /* not in SRAM range */
 	rdcu_buffer_adr = 0x18;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, model_of_data,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, model_of_data,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -389,7 +355,7 @@ void test_rdcu_cfg_buffers_model(void)
 	rdcu_new_model_adr = 0xC; /* overlaps with data buffer */
 	rdcu_buffer_adr = 0x18;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, model_of_data,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, model_of_data,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -400,7 +366,7 @@ void test_rdcu_cfg_buffers_model(void)
 	rdcu_new_model_adr = 0x14; /* overlaps with compressed data buffer */
 	rdcu_buffer_adr = 0x18;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, model_of_data,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, model_of_data,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -411,7 +377,7 @@ void test_rdcu_cfg_buffers_model(void)
 	rdcu_new_model_adr = 0xC; /* overlaps with model buffer */
 	rdcu_buffer_adr = 0x18;
 	rdcu_buffer_lenght = 4;
-	error = rdcu_cfg_buffers(&cfg, data_to_compress, data_samples, model_of_data,
+	error = rdcu_cfg_buffers(&rcfg, data_to_compress, data_samples, model_of_data,
 				 rdcu_data_adr, rdcu_model_adr, rdcu_new_model_adr,
 				 rdcu_buffer_adr, rdcu_buffer_lenght);
 	TEST_ASSERT_EQUAL(1, error);
@@ -426,11 +392,14 @@ void test_rdcu_cfg_buffers_model(void)
 void test_rdcu_cfg_imagette(void)
 {
 	int error;
-	struct cmp_cfg cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_MODE_RAW,
-					     10, CMP_LOSSLESS);
+	struct rdcu_cfg rcfg;
 	uint32_t golomb_par, spillover_par, ap1_golomb_par, ap1_spillover_par,
 		 ap2_golomb_par, ap2_spillover_par;
 
+	error = rdcu_cfg_create(&rcfg, CMP_MODE_RAW, 10,
+				CMP_LOSSLESS);
+	TEST_ASSERT_FALSE(error);
+
 	golomb_par = MIN_IMA_GOLOMB_PAR;
 	spillover_par = MIN_IMA_SPILL;
 	ap1_golomb_par = MIN_IMA_GOLOMB_PAR;
@@ -438,117 +407,117 @@ void test_rdcu_cfg_imagette(void)
 	ap2_golomb_par = MIN_IMA_GOLOMB_PAR;
 	ap2_spillover_par = MIN_IMA_SPILL;
 
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL(golomb_par, cfg.golomb_par);
-	TEST_ASSERT_EQUAL(spillover_par, cfg.spill);
-	TEST_ASSERT_EQUAL(ap1_golomb_par, cfg.ap1_golomb_par);
-	TEST_ASSERT_EQUAL(ap1_spillover_par, cfg.ap1_spill);
-	TEST_ASSERT_EQUAL(ap2_golomb_par, cfg.ap2_golomb_par);
-	TEST_ASSERT_EQUAL(ap2_spillover_par, cfg.ap2_spill);
+	TEST_ASSERT_EQUAL(golomb_par, rcfg.golomb_par);
+	TEST_ASSERT_EQUAL(spillover_par, rcfg.spill);
+	TEST_ASSERT_EQUAL(ap1_golomb_par, rcfg.ap1_golomb_par);
+	TEST_ASSERT_EQUAL(ap1_spillover_par, rcfg.ap1_spill);
+	TEST_ASSERT_EQUAL(ap2_golomb_par, rcfg.ap2_golomb_par);
+	TEST_ASSERT_EQUAL(ap2_spillover_par, rcfg.ap2_spill);
 
 
 	/* wrong golomb_par */
 	golomb_par = MIN_IMA_GOLOMB_PAR - 1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_TRUE(error);
 
 	golomb_par = MAX_IMA_GOLOMB_PAR + 1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_TRUE(error);
 
 	/* this should work */
 	golomb_par = MAX_IMA_GOLOMB_PAR;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL(golomb_par, cfg.golomb_par);
-	TEST_ASSERT_EQUAL(spillover_par, cfg.spill);
-	TEST_ASSERT_EQUAL(ap1_golomb_par, cfg.ap1_golomb_par);
-	TEST_ASSERT_EQUAL(ap1_spillover_par, cfg.ap1_spill);
-	TEST_ASSERT_EQUAL(ap2_golomb_par, cfg.ap2_golomb_par);
-	TEST_ASSERT_EQUAL(ap2_spillover_par, cfg.ap2_spill);
+	TEST_ASSERT_EQUAL(golomb_par, rcfg.golomb_par);
+	TEST_ASSERT_EQUAL(spillover_par, rcfg.spill);
+	TEST_ASSERT_EQUAL(ap1_golomb_par, rcfg.ap1_golomb_par);
+	TEST_ASSERT_EQUAL(ap1_spillover_par, rcfg.ap1_spill);
+	TEST_ASSERT_EQUAL(ap2_golomb_par, rcfg.ap2_golomb_par);
+	TEST_ASSERT_EQUAL(ap2_spillover_par, rcfg.ap2_spill);
 
 
 	/* wrong ap1_golomb_par */
 	ap1_golomb_par = MIN_IMA_GOLOMB_PAR - 1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_TRUE(error);
 
 	ap1_golomb_par = MAX_IMA_GOLOMB_PAR + 1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_TRUE(error);
 
 	/* this should work */
 	ap1_golomb_par = MAX_IMA_GOLOMB_PAR;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL(golomb_par, cfg.golomb_par);
-	TEST_ASSERT_EQUAL(spillover_par, cfg.spill);
-	TEST_ASSERT_EQUAL(ap1_golomb_par, cfg.ap1_golomb_par);
-	TEST_ASSERT_EQUAL(ap1_spillover_par, cfg.ap1_spill);
-	TEST_ASSERT_EQUAL(ap2_golomb_par, cfg.ap2_golomb_par);
-	TEST_ASSERT_EQUAL(ap2_spillover_par, cfg.ap2_spill);
+	TEST_ASSERT_EQUAL(golomb_par, rcfg.golomb_par);
+	TEST_ASSERT_EQUAL(spillover_par, rcfg.spill);
+	TEST_ASSERT_EQUAL(ap1_golomb_par, rcfg.ap1_golomb_par);
+	TEST_ASSERT_EQUAL(ap1_spillover_par, rcfg.ap1_spill);
+	TEST_ASSERT_EQUAL(ap2_golomb_par, rcfg.ap2_golomb_par);
+	TEST_ASSERT_EQUAL(ap2_spillover_par, rcfg.ap2_spill);
 
 
 	/* wrong ap2_golomb_par */
-	cfg.cmp_mode = CMP_MODE_DIFF_ZERO;
+	rcfg.cmp_mode = CMP_MODE_DIFF_ZERO;
 	ap2_golomb_par = MIN_IMA_GOLOMB_PAR - 1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_TRUE(error);
 
 	ap2_golomb_par = MAX_IMA_GOLOMB_PAR + 1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_TRUE(error);
 
 	/* this should work */
 	ap2_golomb_par = MAX_IMA_GOLOMB_PAR;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL(golomb_par, cfg.golomb_par);
-	TEST_ASSERT_EQUAL(spillover_par, cfg.spill);
-	TEST_ASSERT_EQUAL(ap1_golomb_par, cfg.ap1_golomb_par);
-	TEST_ASSERT_EQUAL(ap1_spillover_par, cfg.ap1_spill);
-	TEST_ASSERT_EQUAL(ap2_golomb_par, cfg.ap2_golomb_par);
-	TEST_ASSERT_EQUAL(ap2_spillover_par, cfg.ap2_spill);
+	TEST_ASSERT_EQUAL(golomb_par, rcfg.golomb_par);
+	TEST_ASSERT_EQUAL(spillover_par, rcfg.spill);
+	TEST_ASSERT_EQUAL(ap1_golomb_par, rcfg.ap1_golomb_par);
+	TEST_ASSERT_EQUAL(ap1_spillover_par, rcfg.ap1_spill);
+	TEST_ASSERT_EQUAL(ap2_golomb_par, rcfg.ap2_golomb_par);
+	TEST_ASSERT_EQUAL(ap2_spillover_par, rcfg.ap2_spill);
 
 
 	/* wrong spillover_par */
 	golomb_par = MIN_IMA_GOLOMB_PAR;
 	spillover_par = cmp_ima_max_spill(golomb_par)+1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_EQUAL(1, error);
 	golomb_par = MAX_IMA_GOLOMB_PAR;
 	spillover_par = cmp_ima_max_spill(golomb_par)+1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_EQUAL(1, error);
 
 	golomb_par = MIN_IMA_GOLOMB_PAR;
 	spillover_par = MIN_IMA_SPILL - 1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_EQUAL(1, error);
@@ -556,35 +525,35 @@ void test_rdcu_cfg_imagette(void)
 	/* this should work */
 	golomb_par = MAX_IMA_GOLOMB_PAR;
 	spillover_par = cmp_ima_max_spill(golomb_par);
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL(golomb_par, cfg.golomb_par);
-	TEST_ASSERT_EQUAL(spillover_par, cfg.spill);
-	TEST_ASSERT_EQUAL(ap1_golomb_par, cfg.ap1_golomb_par);
-	TEST_ASSERT_EQUAL(ap1_spillover_par, cfg.ap1_spill);
-	TEST_ASSERT_EQUAL(ap2_golomb_par, cfg.ap2_golomb_par);
-	TEST_ASSERT_EQUAL(ap2_spillover_par, cfg.ap2_spill);
+	TEST_ASSERT_EQUAL(golomb_par, rcfg.golomb_par);
+	TEST_ASSERT_EQUAL(spillover_par, rcfg.spill);
+	TEST_ASSERT_EQUAL(ap1_golomb_par, rcfg.ap1_golomb_par);
+	TEST_ASSERT_EQUAL(ap1_spillover_par, rcfg.ap1_spill);
+	TEST_ASSERT_EQUAL(ap2_golomb_par, rcfg.ap2_golomb_par);
+	TEST_ASSERT_EQUAL(ap2_spillover_par, rcfg.ap2_spill);
 
 
 	/* wrong ap1_spillover_par */
 	ap1_golomb_par = MIN_IMA_GOLOMB_PAR;
 	ap1_spillover_par = cmp_ima_max_spill(golomb_par)+1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_EQUAL(1, error);
 	ap1_golomb_par = MAX_IMA_GOLOMB_PAR;
 	ap1_spillover_par = cmp_ima_max_spill(golomb_par)+1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_EQUAL(1, error);
 
 	ap1_golomb_par = MIN_IMA_GOLOMB_PAR;
 	ap1_spillover_par = MIN_IMA_SPILL - 1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_EQUAL(1, error);
@@ -592,35 +561,35 @@ void test_rdcu_cfg_imagette(void)
 	/* this should work */
 	ap1_golomb_par = MAX_IMA_GOLOMB_PAR;
 	ap1_spillover_par = cmp_ima_max_spill(golomb_par);
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL(golomb_par, cfg.golomb_par);
-	TEST_ASSERT_EQUAL(spillover_par, cfg.spill);
-	TEST_ASSERT_EQUAL(ap1_golomb_par, cfg.ap1_golomb_par);
-	TEST_ASSERT_EQUAL(ap1_spillover_par, cfg.ap1_spill);
-	TEST_ASSERT_EQUAL(ap2_golomb_par, cfg.ap2_golomb_par);
-	TEST_ASSERT_EQUAL(ap2_spillover_par, cfg.ap2_spill);
+	TEST_ASSERT_EQUAL(golomb_par, rcfg.golomb_par);
+	TEST_ASSERT_EQUAL(spillover_par, rcfg.spill);
+	TEST_ASSERT_EQUAL(ap1_golomb_par, rcfg.ap1_golomb_par);
+	TEST_ASSERT_EQUAL(ap1_spillover_par, rcfg.ap1_spill);
+	TEST_ASSERT_EQUAL(ap2_golomb_par, rcfg.ap2_golomb_par);
+	TEST_ASSERT_EQUAL(ap2_spillover_par, rcfg.ap2_spill);
 
 
 	/* wrong ap2_spillover_par */
 	ap2_golomb_par = MIN_IMA_GOLOMB_PAR;
 	ap2_spillover_par = cmp_ima_max_spill(golomb_par)+1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_EQUAL(1, error);
 	ap2_golomb_par = MAX_IMA_GOLOMB_PAR;
 	ap2_spillover_par = cmp_ima_max_spill(golomb_par)+1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_EQUAL(1, error);
 
 	ap2_golomb_par = MIN_IMA_GOLOMB_PAR;
 	ap2_spillover_par = MIN_IMA_SPILL - 1;
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_EQUAL(1, error);
@@ -628,16 +597,16 @@ void test_rdcu_cfg_imagette(void)
 	/* this should work */
 	ap2_golomb_par = MAX_IMA_GOLOMB_PAR;
 	ap2_spillover_par = cmp_ima_max_spill(golomb_par);
-	error = rdcu_cfg_imagette(&cfg, golomb_par, spillover_par,
+	error = rdcu_cfg_imagette(&rcfg, golomb_par, spillover_par,
 				  ap1_golomb_par, ap1_spillover_par,
 				  ap2_golomb_par, ap2_spillover_par);
 	TEST_ASSERT_FALSE(error);
-	TEST_ASSERT_EQUAL(golomb_par, cfg.golomb_par);
-	TEST_ASSERT_EQUAL(spillover_par, cfg.spill);
-	TEST_ASSERT_EQUAL(ap1_golomb_par, cfg.ap1_golomb_par);
-	TEST_ASSERT_EQUAL(ap1_spillover_par, cfg.ap1_spill);
-	TEST_ASSERT_EQUAL(ap2_golomb_par, cfg.ap2_golomb_par);
-	TEST_ASSERT_EQUAL(ap2_spillover_par, cfg.ap2_spill);
+	TEST_ASSERT_EQUAL(golomb_par, rcfg.golomb_par);
+	TEST_ASSERT_EQUAL(spillover_par, rcfg.spill);
+	TEST_ASSERT_EQUAL(ap1_golomb_par, rcfg.ap1_golomb_par);
+	TEST_ASSERT_EQUAL(ap1_spillover_par, rcfg.ap1_spill);
+	TEST_ASSERT_EQUAL(ap2_golomb_par, rcfg.ap2_golomb_par);
+	TEST_ASSERT_EQUAL(ap2_spillover_par, rcfg.ap2_spill);
 
 	/* cfg = NULL test */
 	error = rdcu_cfg_imagette(NULL, golomb_par, spillover_par,
@@ -653,35 +622,35 @@ void test_rdcu_cfg_imagette(void)
 void test_rdcu_cfg_imagette_default(void)
 {
 	int error;
-	struct cmp_cfg cfg;
+	struct rdcu_cfg rcfg;
 
 	/* 1d configuration */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
-	TEST_ASSERT_NOT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
+	error = rdcu_cfg_create(&rcfg, CMP_MODE_DIFF_ZERO, 0, CMP_LOSSLESS);
+	TEST_ASSERT_FALSE(error);
 
-	error = rdcu_cfg_imagette_default(&cfg);
+	error = rdcu_cfg_imagette_default(&rcfg);
 	TEST_ASSERT_FALSE(error);
 
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_GOLOMB_PAR, cfg.golomb_par);
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_SPILL_PAR, cfg.spill);
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_AP1_GOLOMB_PAR, cfg.ap1_golomb_par);
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_AP1_SPILL_PAR, cfg.ap1_spill);
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_AP2_GOLOMB_PAR, cfg.ap2_golomb_par);
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_AP2_SPILL_PAR, cfg.ap2_spill);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_GOLOMB_PAR, rcfg.golomb_par);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_SPILL_PAR, rcfg.spill);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_AP1_GOLOMB_PAR, rcfg.ap1_golomb_par);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_AP1_SPILL_PAR, rcfg.ap1_spill);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_AP2_GOLOMB_PAR, rcfg.ap2_golomb_par);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_DIFF_AP2_SPILL_PAR, rcfg.ap2_spill);
 
 	/* 1d configuration */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE_ADAPTIVE, CMP_MODE_MODEL_MULTI, 0, CMP_LOSSLESS);
-	TEST_ASSERT_NOT_EQUAL(DATA_TYPE_UNKNOWN, cfg.data_type);
+	error = rdcu_cfg_create(&rcfg, CMP_MODE_MODEL_MULTI, 0, CMP_LOSSLESS);
+	TEST_ASSERT_FALSE(error);
 
-	error = rdcu_cfg_imagette_default(&cfg);
+	error = rdcu_cfg_imagette_default(&rcfg);
 	TEST_ASSERT_FALSE(error);
 
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_GOLOMB_PAR, cfg.golomb_par);
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_SPILL_PAR, cfg.spill);
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_AP1_GOLOMB_PAR, cfg.ap1_golomb_par);
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_AP1_SPILL_PAR, cfg.ap1_spill);
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_AP2_GOLOMB_PAR, cfg.ap2_golomb_par);
-	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_AP2_SPILL_PAR, cfg.ap2_spill);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_GOLOMB_PAR, rcfg.golomb_par);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_SPILL_PAR, rcfg.spill);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_AP1_GOLOMB_PAR, rcfg.ap1_golomb_par);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_AP1_SPILL_PAR, rcfg.ap1_spill);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_AP2_GOLOMB_PAR, rcfg.ap2_golomb_par);
+	TEST_ASSERT_EQUAL(CMP_DEF_IMA_MODEL_AP2_SPILL_PAR, rcfg.ap2_spill);
 
 	/* error case */
 	error = rdcu_cfg_imagette_default(NULL);
@@ -696,55 +665,61 @@ void test_rdcu_cfg_imagette_default(void)
 void test_rdcu_cmp_cfg_is_invalid(void)
 {
 	int error;
-	struct cmp_cfg cfg;
+	struct rdcu_cfg rcfg;
 	uint16_t data[1] = {1};
 	uint16_t model[1] = {2};
 
 	/* diff test */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_DEF_IMA_DIFF_CMP_MODE,
-			      CMP_DEF_IMA_DIFF_MODEL_VALUE, CMP_DEF_IMA_DIFF_LOSSY_PAR);
-	error = rdcu_cfg_buffers(&cfg, data, 1, NULL, CMP_DEF_IMA_DIFF_RDCU_DATA_ADR,
+	error = rdcu_cfg_create(&rcfg, CMP_DEF_IMA_DIFF_CMP_MODE,
+				CMP_DEF_IMA_DIFF_MODEL_VALUE,
+				CMP_DEF_IMA_DIFF_LOSSY_PAR);
+	TEST_ASSERT_FALSE(error);
+	error = rdcu_cfg_buffers(&rcfg, data, 1, NULL, CMP_DEF_IMA_DIFF_RDCU_DATA_ADR,
 				 CMP_DEF_IMA_DIFF_RDCU_MODEL_ADR, CMP_DEF_IMA_DIFF_RDCU_UP_MODEL_ADR,
 				 CMP_DEF_IMA_DIFF_RDCU_BUFFER_ADR, 1);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cfg_imagette(&cfg,
+	error = rdcu_cfg_imagette(&rcfg,
 				  CMP_DEF_IMA_DIFF_GOLOMB_PAR, CMP_DEF_IMA_DIFF_SPILL_PAR,
 				  CMP_DEF_IMA_DIFF_AP1_GOLOMB_PAR, CMP_DEF_IMA_DIFF_AP1_SPILL_PAR,
 				  CMP_DEF_IMA_DIFF_AP2_GOLOMB_PAR, CMP_DEF_IMA_DIFF_AP2_SPILL_PAR);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cmp_cfg_is_invalid(&cfg);
+	error = rdcu_cmp_cfg_is_invalid(&rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* model test */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_DEF_IMA_MODEL_CMP_MODE,
-			      CMP_DEF_IMA_MODEL_MODEL_VALUE, CMP_DEF_IMA_MODEL_LOSSY_PAR);
-	error = rdcu_cfg_buffers(&cfg, data, 1, model, CMP_DEF_IMA_MODEL_RDCU_DATA_ADR,
+	error = rdcu_cfg_create(&rcfg, CMP_DEF_IMA_MODEL_CMP_MODE,
+				CMP_DEF_IMA_MODEL_MODEL_VALUE,
+				CMP_DEF_IMA_MODEL_LOSSY_PAR);
+	TEST_ASSERT_FALSE(error);
+	error = rdcu_cfg_buffers(&rcfg, data, 1, model, CMP_DEF_IMA_MODEL_RDCU_DATA_ADR,
 				 CMP_DEF_IMA_MODEL_RDCU_MODEL_ADR, CMP_DEF_IMA_MODEL_RDCU_UP_MODEL_ADR,
 				 CMP_DEF_IMA_MODEL_RDCU_BUFFER_ADR, 1);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cfg_imagette(&cfg,
+	error = rdcu_cfg_imagette(&rcfg,
 				  CMP_DEF_IMA_MODEL_GOLOMB_PAR, CMP_DEF_IMA_MODEL_SPILL_PAR,
 				  CMP_DEF_IMA_MODEL_AP1_GOLOMB_PAR, CMP_DEF_IMA_MODEL_AP1_SPILL_PAR,
 				  CMP_DEF_IMA_MODEL_AP2_GOLOMB_PAR, CMP_DEF_IMA_MODEL_AP2_SPILL_PAR);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cmp_cfg_is_invalid(&cfg);
+	error = rdcu_cmp_cfg_is_invalid(&rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* test warnings */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_DEF_IMA_MODEL_CMP_MODE,
-			      CMP_DEF_IMA_MODEL_MODEL_VALUE, CMP_DEF_IMA_MODEL_LOSSY_PAR);
-	error = rdcu_cfg_buffers(&cfg, NULL, 0, NULL, CMP_DEF_IMA_MODEL_RDCU_DATA_ADR,
+	error = rdcu_cfg_create(&rcfg, CMP_DEF_IMA_MODEL_CMP_MODE,
+				CMP_DEF_IMA_MODEL_MODEL_VALUE,
+				CMP_DEF_IMA_MODEL_LOSSY_PAR);
+	TEST_ASSERT_FALSE(error);
+	error = rdcu_cfg_buffers(&rcfg, NULL, 0, NULL, CMP_DEF_IMA_MODEL_RDCU_DATA_ADR,
 				 CMP_DEF_IMA_MODEL_RDCU_MODEL_ADR, CMP_DEF_IMA_MODEL_RDCU_UP_MODEL_ADR,
 				 CMP_DEF_IMA_MODEL_RDCU_BUFFER_ADR, 1);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cfg_imagette(&cfg,
+	error = rdcu_cfg_imagette(&rcfg,
 				  CMP_DEF_IMA_MODEL_GOLOMB_PAR, CMP_DEF_IMA_MODEL_SPILL_PAR,
 				  CMP_DEF_IMA_MODEL_AP1_GOLOMB_PAR, CMP_DEF_IMA_MODEL_AP1_SPILL_PAR,
 				  CMP_DEF_IMA_MODEL_AP2_GOLOMB_PAR, CMP_DEF_IMA_MODEL_AP2_SPILL_PAR);
 	TEST_ASSERT_FALSE(error);
-	cfg.icu_new_model_buf = data;
-	cfg.icu_output_buf = (void *)model;
-	error = rdcu_cmp_cfg_is_invalid(&cfg);
+	rcfg.icu_new_model_buf = data;
+	rcfg.icu_output_buf = (void *)model;
+	error = rdcu_cmp_cfg_is_invalid(&rcfg);
 	TEST_ASSERT_FALSE(error);
 
 	/* error: cfg is NULL */
@@ -752,63 +727,70 @@ void test_rdcu_cmp_cfg_is_invalid(void)
 	TEST_ASSERT_TRUE(error);
 
 	/* error: buffer length = 0 */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_DEF_IMA_MODEL_CMP_MODE,
-			      CMP_DEF_IMA_MODEL_MODEL_VALUE, CMP_DEF_IMA_MODEL_LOSSY_PAR);
-	error = rdcu_cfg_buffers(&cfg, data, 1, model, CMP_DEF_IMA_MODEL_RDCU_DATA_ADR,
+	error = rdcu_cfg_create(&rcfg, CMP_DEF_IMA_MODEL_CMP_MODE,
+				CMP_DEF_IMA_MODEL_MODEL_VALUE,
+				CMP_DEF_IMA_MODEL_LOSSY_PAR);
+	TEST_ASSERT_FALSE(error);
+	error = rdcu_cfg_buffers(&rcfg, data, 1, model, CMP_DEF_IMA_MODEL_RDCU_DATA_ADR,
 				 CMP_DEF_IMA_MODEL_RDCU_MODEL_ADR, CMP_DEF_IMA_MODEL_RDCU_UP_MODEL_ADR,
 				 CMP_DEF_IMA_MODEL_RDCU_BUFFER_ADR, 0);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cfg_imagette(&cfg,
+	error = rdcu_cfg_imagette(&rcfg,
 				  CMP_DEF_IMA_MODEL_GOLOMB_PAR, CMP_DEF_IMA_MODEL_SPILL_PAR,
 				  CMP_DEF_IMA_MODEL_AP1_GOLOMB_PAR, CMP_DEF_IMA_MODEL_AP1_SPILL_PAR,
 				  CMP_DEF_IMA_MODEL_AP2_GOLOMB_PAR, CMP_DEF_IMA_MODEL_AP2_SPILL_PAR);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cmp_cfg_is_invalid(&cfg);
+	error = rdcu_cmp_cfg_is_invalid(&rcfg);
 	TEST_ASSERT_TRUE(error);
 
 	/* error: wrong gen par */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_DEF_IMA_DIFF_CMP_MODE,
-			      MAX_MODEL_VALUE+1, CMP_DEF_IMA_DIFF_LOSSY_PAR);
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	error = rdcu_cfg_buffers(&cfg, data, 1, NULL, CMP_DEF_IMA_DIFF_RDCU_DATA_ADR,
+	error = rdcu_cfg_create(&rcfg, CMP_DEF_IMA_DIFF_CMP_MODE,
+				MAX_MODEL_VALUE+1, CMP_DEF_IMA_DIFF_LOSSY_PAR);
+	TEST_ASSERT_TRUE(error);
+	rcfg.model_value = 32;
+	error = rdcu_cfg_buffers(&rcfg, data, 1, NULL, CMP_DEF_IMA_DIFF_RDCU_DATA_ADR,
 				 CMP_DEF_IMA_DIFF_RDCU_MODEL_ADR, CMP_DEF_IMA_DIFF_RDCU_UP_MODEL_ADR,
 				 CMP_DEF_IMA_DIFF_RDCU_BUFFER_ADR, 1);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cfg_imagette(&cfg,
+	error = rdcu_cfg_imagette(&rcfg,
 				  CMP_DEF_IMA_DIFF_GOLOMB_PAR, CMP_DEF_IMA_DIFF_SPILL_PAR,
 				  CMP_DEF_IMA_DIFF_AP1_GOLOMB_PAR, CMP_DEF_IMA_DIFF_AP1_SPILL_PAR,
 				  CMP_DEF_IMA_DIFF_AP2_GOLOMB_PAR, CMP_DEF_IMA_DIFF_AP2_SPILL_PAR);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cmp_cfg_is_invalid(&cfg);
+	error = rdcu_cmp_cfg_is_invalid(&rcfg);
 	TEST_ASSERT_TRUE(error);
 
 	/* error: wrong buffers config */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_DEF_IMA_DIFF_CMP_MODE,
-			      CMP_DEF_IMA_DIFF_MODEL_VALUE, CMP_DEF_IMA_DIFF_LOSSY_PAR);
-	error = rdcu_cfg_buffers(&cfg, data, 1, NULL, RDCU_SRAM_END+4,
+	error = rdcu_cfg_create(&rcfg, CMP_DEF_IMA_DIFF_CMP_MODE,
+				CMP_DEF_IMA_DIFF_MODEL_VALUE,
+				CMP_DEF_IMA_DIFF_LOSSY_PAR);
+	TEST_ASSERT_FALSE(error);
+	error = rdcu_cfg_buffers(&rcfg, data, 1, NULL, RDCU_SRAM_END+4,
 				 CMP_DEF_IMA_DIFF_RDCU_MODEL_ADR, CMP_DEF_IMA_DIFF_RDCU_UP_MODEL_ADR,
 				 CMP_DEF_IMA_DIFF_RDCU_BUFFER_ADR, 1);
 	TEST_ASSERT_TRUE(error);
-	error = rdcu_cfg_imagette(&cfg,
+	error = rdcu_cfg_imagette(&rcfg,
 				  CMP_DEF_IMA_DIFF_GOLOMB_PAR, CMP_DEF_IMA_DIFF_SPILL_PAR,
 				  CMP_DEF_IMA_DIFF_AP1_GOLOMB_PAR, CMP_DEF_IMA_DIFF_AP1_SPILL_PAR,
 				  CMP_DEF_IMA_DIFF_AP2_GOLOMB_PAR, CMP_DEF_IMA_DIFF_AP2_SPILL_PAR);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cmp_cfg_is_invalid(&cfg);
+	error = rdcu_cmp_cfg_is_invalid(&rcfg);
 	TEST_ASSERT_TRUE(error);
 
 	/* error: wrong compression parameter test */
-	cfg = rdcu_cfg_create(DATA_TYPE_IMAGETTE, CMP_DEF_IMA_DIFF_CMP_MODE,
-			      CMP_DEF_IMA_DIFF_MODEL_VALUE, CMP_DEF_IMA_DIFF_LOSSY_PAR);
-	error = rdcu_cfg_buffers(&cfg, data, 1, NULL, CMP_DEF_IMA_DIFF_RDCU_DATA_ADR,
+	error = rdcu_cfg_create(&rcfg, CMP_DEF_IMA_DIFF_CMP_MODE,
+				CMP_DEF_IMA_DIFF_MODEL_VALUE,
+				CMP_DEF_IMA_DIFF_LOSSY_PAR);
+	TEST_ASSERT_FALSE(error);
+	error = rdcu_cfg_buffers(&rcfg, data, 1, NULL, CMP_DEF_IMA_DIFF_RDCU_DATA_ADR,
 				 CMP_DEF_IMA_DIFF_RDCU_MODEL_ADR, CMP_DEF_IMA_DIFF_RDCU_UP_MODEL_ADR,
 				 CMP_DEF_IMA_DIFF_RDCU_BUFFER_ADR, 1);
 	TEST_ASSERT_FALSE(error);
-	error = rdcu_cfg_imagette(&cfg,
+	error = rdcu_cfg_imagette(&rcfg,
 				  MAX_IMA_GOLOMB_PAR+1, CMP_DEF_IMA_DIFF_SPILL_PAR,
 				  CMP_DEF_IMA_DIFF_AP1_GOLOMB_PAR, CMP_DEF_IMA_DIFF_AP1_SPILL_PAR,
 				  CMP_DEF_IMA_DIFF_AP2_GOLOMB_PAR, CMP_DEF_IMA_DIFF_AP2_SPILL_PAR);
 	TEST_ASSERT_TRUE(error);
-	error = rdcu_cmp_cfg_is_invalid(&cfg);
+	error = rdcu_cmp_cfg_is_invalid(&rcfg);
 	TEST_ASSERT_TRUE(error);
 }
diff --git a/test/cmp_tool/cmp_tool_integration_test.py b/test/cmp_tool/cmp_tool_integration_test.py
index 8eb95da31adb180ccd3bb3895f63e9ff90ee6b7c..c4856c42e75bebe36d93e89184e1d38037bfa6fc 100755
--- a/test/cmp_tool/cmp_tool_integration_test.py
+++ b/test/cmp_tool/cmp_tool_integration_test.py
@@ -81,14 +81,13 @@ def del_directory(directoryPath):
 
 def cuc_timestamp(now):
     epoch = datetime(2020, 1, 1, tzinfo=timezone.utc)
-    timestamp = (now - epoch).total_seconds()
+    seconds = (now - epoch)//timedelta(seconds=1)
+    microseconds = (now - epoch - timedelta(seconds=seconds))//timedelta(microseconds=1)
+    assert((seconds >> 32) == 0)
 
-    cuc_coarse = int( math.floor(timestamp) * 256 * 256)
-    cuc_fine = int(math.floor((timestamp - math.floor(timestamp))*256*256))
+    fine = microseconds * 0x10000 // int(1e6)
 
-    cuc = int(cuc_coarse)+int(cuc_fine)
-
-    return cuc
+    return (seconds << 16) + fine
 
 
 def read_in_cmp_header(compressed_string):
@@ -448,10 +447,6 @@ def test_compression_diff():
                     assert(header['asw_version_id']['value'] == VERSION.split('-')[0])
                     assert(header['cmp_ent_size']['value'] == IMAGETTE_HEADER_SIZE+3)
                     assert(header['original_size']['value'] == 10)
-                    # todo
-                    assert(header['start_time']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
-                    # todo
-                    assert(header['end_timestamp']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
                     assert(header['data_type']['value'] == 1)
                     assert(header['cmp_mode_used']['value'] == 2)
                     # assert(header['model_value_used']['value'] == 8)
@@ -461,6 +456,10 @@ def test_compression_diff():
                     assert(header['spill_used']['value'] == 60)
                     assert(header['golomb_par_used']['value'] == 7)
                     assert(header['compressed_data']['value'] == "444440")
+                    assert(header['start_time']['value'] <= header['end_timestamp']['value'])
+                    if not (os.getenv("GITHUB_ACTIONS") == "true" and os.getenv("MSYSTEM") != None):
+                        assert(header['start_time']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
+                        assert(header['end_timestamp']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
 
             # decompression
             if add_arg == " --no_header":
@@ -523,7 +522,7 @@ def test_model_compression():
             cfg["ap1_golomb_par"] = '20'
             cfg["ap1_spill"] = '70'
             cfg["ap2_golomb_par"] = '63'
-            cfg["ap1_spill"] = '6'
+            cfg["ap2_spill"] = '6'
             for key, value in cfg.items():
                 f.write(key + ' = ' + str(value) + '\n')
 
@@ -583,10 +582,6 @@ def test_model_compression():
                 assert(header['asw_version_id']['value'] == VERSION.split('-')[0])
                 assert(header['cmp_ent_size']['value'] == IMAGETTE_ADAPTIVE_HEADER_SIZE+2)
                 assert(header['original_size']['value'] == 10)
-                # todo
-                assert(header['start_time']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
-                #todo
-                assert(header['end_timestamp']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
                 assert(header['data_type']['value'] == DATA_TYPE_IMAGETTE_ADAPTIVE)
                 assert(header['cmp_mode_used']['value'] == 3)
                 assert(header['model_value_used']['value'] == int(cfg['model_value']))
@@ -596,6 +591,10 @@ def test_model_compression():
                 assert(header['spill_used']['value'] == int(cfg['spill']))
                 assert(header['golomb_par_used']['value'] == int(cfg['golomb_par']))
                 assert(header['compressed_data']['value'] == "4924")
+                assert(header['start_time']['value'] < header['end_timestamp']['value'])
+                if not (os.getenv("GITHUB_ACTIONS") == "true" and os.getenv("MSYSTEM") != None):
+                   assert(header['start_time']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
+                   assert(header['end_timestamp']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
 
             # decompression
             if "--no_header" in add_arg:
@@ -692,10 +691,6 @@ def test_raw_mode_compression():
                     assert(header['asw_version_id']['value'] == VERSION.split('-')[0])
                     assert(header['cmp_ent_size']['value'] == GENERIC_HEADER_SIZE+10)
                     assert(header['original_size']['value'] == 10)
-                    # todo
-                    assert(header['start_time']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
-                    #todo
-                    assert(header['end_timestamp']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
                     assert(header['data_type']['value'] == 1+0x8000)
                     # assert(header['cmp_mode_used']['value'] == 2)
                     # assert(header['model_value_used']['value'] == 8)
@@ -705,6 +700,10 @@ def test_raw_mode_compression():
                     # assert(header['spill_used']['value'] == 60)
                     # assert(header['golomb_par_used']['value'] == 7)
                     assert(header['compressed_data']['value'] == data[:-1].replace(" ",""))
+                    assert(header['start_time']['value'] <= header['end_timestamp']['value'])
+                    if not (os.getenv("GITHUB_ACTIONS") == "true" and os.getenv("MSYSTEM") != None):
+                        assert(header['start_time']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
+                        assert(header['end_timestamp']['value'] < cuc_timestamp(datetime.now(timezone.utc)))
 
             # decompression
             if "--no_header" in arg:
@@ -836,7 +835,7 @@ def test_guess_option():
                        "Search for a good set of compression parameters (level: 2) ... DONE\n" +
                        "Write the guessed compression configuration to file not_exist/guess.cfg ... FAILED\n")
             elif sub_test == 'guess_level_not_supported':
-                assert(stderr == "cmp_tool: guess level not supported!\n")
+                assert(stderr == "cmp_tool: guess level not supported for RDCU guess mode!\n")
                 assert(returncode == EXIT_FAILURE)
                 assert(stdout == CMP_START_STR_GUESS +
                        "Importing data file %s ... \n" % (data_file_name) +
@@ -845,7 +844,7 @@ def test_guess_option():
                        "Search for a good set of compression parameters (level: 10) ... FAILED\n")
             elif sub_test == 'guess_unknown_mode':
                 assert(
-                    stderr == "cmp_tool: Error: unknown compression mode: MODE_UNKNOWN\n")
+                    stderr == "cmp_tool: Error: unknown guess option: MODE_UNKNOWN\n")
                 assert(returncode == EXIT_FAILURE)
                 assert(stdout == CMP_START_STR_GUESS +
                        "Importing data file %s ... \n" % (data_file_name) +
@@ -981,7 +980,7 @@ def test_wrong_formart_data_fiel():
         assert(stdout == CMP_START_STR_CMP +
                "Importing configuration file %s ... DONE\n" % (cfg_file_name) +
                "Importing data file %s ... FAILED\n" % (data_file_name))
-        assert(stderr == "cmp_tool: wrong.data: Error read in 'W'. The data are not correct formatted.\n")
+        assert(stderr == "cmp_tool: wrong.data: Error read in 'W'. The data are not correctly formatted.\n")
         assert(returncode == EXIT_FAILURE)
     finally:
         del_file(data_file_name)
@@ -1005,7 +1004,7 @@ def test_wrong_formart_cmp_fiel():
         assert(stdout == CMP_START_STR_DECMP +
                "Importing decompression information file %s ... DONE\n" % (info_file_name) +
                "Importing compressed data file %s ... FAILED\n" % (cmp_file_name))
-        assert(stderr == "cmp_tool: wrong.cmp: Error read in 'w'. The data are not correct formatted.\n")
+        assert(stderr == "cmp_tool: wrong.cmp: Error read in 'w'. The data are not correctly formatted.\n")
         assert(returncode == EXIT_FAILURE)
     finally:
         del_file(cmp_file_name)
@@ -1164,7 +1163,7 @@ def test_header_wrong_formatted():
         assert(returncode == EXIT_FAILURE)
         assert(stdout == CMP_START_STR_DECMP +
                "Importing compressed data file %s ... FAILED\n" % (cmp_file_name))
-        assert(stderr == "cmp_tool: %s: Error read in '!'. The data are not correct formatted.\n" % (cmp_file_name))
+        assert(stderr == "cmp_tool: %s: Error read in '!'. The data are not correctly formatted.\n" % (cmp_file_name))
 
     finally:
         del_file(cmp_file_name)
@@ -1231,7 +1230,7 @@ def test_header_read_in():
                "header of the compression entity may be corrupted.\n" % (cmp_file_name))
 
         # false cmp_mode_used
-        cmp_mode_used = 0xFF
+        cmp_mode_used = 255
         generic_header = build_generic_header(version_id, cmp_ent_size,
                         original_size, start_time, end_time, data_type,
                         cmp_mode_used, model_value_used, model_id,
@@ -1246,7 +1245,7 @@ def test_header_read_in():
         assert(stdout == CMP_START_STR_DECMP +
                "Importing compressed data file %s ... DONE\n" % (cmp_file_name) +
                "Decompress data ... FAILED\n" )
-        assert(stderr == "Error: The compression mode is not supported.\n")
+        assert(stderr == "Error: selected cmp_mode: 255 is not supported.\n")
 
     finally:
         del_file(cmp_file_name)
@@ -1302,11 +1301,13 @@ def test_model_fiel_erros():
                          "longlonglonglonglonglonglonglonglonglonglonglonglong"
                          "longlonglonglonglonglonglonglonglonglonglonglonglong"
                          "longlonglonglonglonglonglonglonglonglong")
-        if sys.platform == 'win32' or sys.platform == 'cygwin':
+        if sys.platform == 'cygwin':
           output_prefix = ("longlonglonglonglonglonglonglonglonglonglonglonglong"
                            "longlonglonglonglonglonglonglonglonglonglonglonglong"
                            "longlonglonglonglonglonglonglonglonglonglonglonglong"
                            "longlonglonglonglonglonglonglonglonglonglong")
+        elif sys.platform == 'win32':
+            return # TODO: fix this test for msys2 environment
         returncode, stdout, stderr = call_cmp_tool(
             " -c "+cfg_file_name+" -d "+data_file_name + " -m "+model_file_name+" -o "+output_prefix)
         assert(returncode == EXIT_FAILURE)
diff --git a/test/cmp_tool/gen_test_data.c b/test/cmp_tool/gen_test_data.c
index 05c1ddab03ad7067e7e9465b80bd78bf1f3691de..ae0d7ccddb000901e35df327a93aa708fe2cd965 100644
--- a/test/cmp_tool/gen_test_data.c
+++ b/test/cmp_tool/gen_test_data.c
@@ -17,22 +17,22 @@ int main(int argc, char *argv[])
 	for (i = 1; i < argc; i++) {
 		if (strstr(argv[i], "ref_short_cadence_1_cmp")) {
 			fp = fopen(argv[i], "wb");
-			if(!fp)
+			if (!fp)
 				return 1;
 			s = fwrite(ref_short_cadence_1_cmp, 1, ref_short_cadence_1_cmp_len, fp);
 			fclose(fp);
-			if (s!=ref_short_cadence_1_cmp_len)
+			if (s != ref_short_cadence_1_cmp_len)
 				return 1;
 		} else if (strstr(argv[i], "ref_short_cadence_2_cmp")) {
 			fp = fopen(argv[i], "wb");
-			if(!fp)
+			if (!fp)
 				return 1;
 			s = fwrite(ref_short_cadence_2_cmp, 1, ref_short_cadence_2_cmp_len, fp);
 			fclose(fp);
-			if (s!=ref_short_cadence_2_cmp_len)
+			if (s != ref_short_cadence_2_cmp_len)
 				return 1;
 		} else {
-			fprintf(stderr,"Unknown test data\n");
+			fprintf(stderr, "Unknown test data\n");
 			return 1;
 		}
 	}
diff --git a/test/decmp/test_decmp.c b/test/decmp/test_decmp.c
index a1627cb52a17b78e1917b468744c23dff2a55e66..c1881fb4b31898c1dedfad2a8633c04244898456 100644
--- a/test/decmp/test_decmp.c
+++ b/test/decmp/test_decmp.c
@@ -40,14 +40,14 @@
 
 void test_bitstream(void)
 {
-	uint8_t i, data[12];
+	uint8_t data[12];
 	struct bit_decoder dec;
-	size_t ret;
+	size_t i, ret;
 	int status;
 	uint32_t read_bits;
 
 	for (i = 0; i < sizeof(data); ++i)
-		data[i] = i;
+		data[i] = (uint8_t)i;
 
 	ret = bit_init_decoder(&dec, data, sizeof(data));
 	TEST_ASSERT_EQUAL_size_t(sizeof(data), ret);
@@ -116,7 +116,7 @@ void test_bitstream(void)
 			TEST_ASSERT_EQUAL_size_t(j, s);
 			for (j = 0; j < k; j++)
 				TEST_ASSERT_EQUAL_UINT(j, bit_read_bits(&dec, 8));
-			TEST_ASSERT_TRUE(bit_end_of_stream(&dec));
+			TEST_ASSERT_EQUAL(1, bit_end_of_stream(&dec));
 			TEST_ASSERT_EQUAL_INT(BIT_ALL_READ_IN, bit_refill(&dec));
 		}
 	}
@@ -856,7 +856,7 @@ void test_multi_refill_needed(void)
 {
 	uint32_t decoded_value = ~0U;
 	uint8_t cmp_data[] = {0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
-	uint32_t cmp_data2[2];
+	uint32_t cmp_data2[2] = {0};
 	struct bit_decoder dec = {0};
 	struct decoder_setup setup = {0};
 	uint32_t spillover = 16;
@@ -947,87 +947,44 @@ void test_re_map_to_pos(void)
 
 
 /**
- * returns the needed size of the compression entry header plus the max size of the
- * compressed data if ent ==  NULL if ent is set the size of the compression
- * entry (entity header + compressed data)
+ * @test decompress_cmp_entiy
  */
 
-size_t icu_compress_data_entity(struct cmp_entity *ent, const struct cmp_cfg *cfg)
+void test_cmp_decmp_rdcu_raw(void)
 {
-	uint32_t s;
-	struct cmp_cfg cfg_cpy;
-	int cmp_size_bits;
-
-	if (!cfg)
-		return 0;
-
-	if (cfg->icu_output_buf)
-		debug_print("Warning the set buffer for the compressed data is ignored! The compressed data are write to the compression entry.");
-
-	s = cmp_cal_size_of_data(cfg->buffer_length, cfg->data_type);
-	if (!s)
-		return 0;
-	/* we round down to the next 4-byte allied address because we access the
-	 * cmp_buffer in uint32_t words
-	 */
-	if (cfg->cmp_mode != CMP_MODE_RAW)
-		s &= ~0x3U;
-
-	s = cmp_ent_create(ent, cfg->data_type, cfg->cmp_mode == CMP_MODE_RAW, s);
-
-	if (!ent || !s)
-		return s;
-
-	cfg_cpy = *cfg;
-	cfg_cpy.icu_output_buf = cmp_ent_get_data_buf(ent);
-	if (!cfg_cpy.icu_output_buf)
-		return 0;
-	cmp_size_bits = icu_compress_data(&cfg_cpy);
-	if (cmp_size_bits < 0)
-		return 0;
-
-	/* XXX overwrite the size of the compression entity with the size of the actual
-	 * size of the compressed data; not all allocated memory is normally used
-	 */
-	s = cmp_ent_create(ent, cfg->data_type, cfg->cmp_mode == CMP_MODE_RAW,
-			   cmp_bit_to_byte((unsigned int)cmp_size_bits));
-
-	if (cmp_ent_write_cmp_pars(ent, cfg, cmp_size_bits))
-		return 0;
-
-	return s;
-}
-
-
-void test_cmp_decmp_n_imagette_raw(void)
-{
-	int cmp_size, decmp_size;
+	uint32_t cmp_size;
+	int decmp_size;
 	size_t s, i;
-	struct cmp_cfg cfg = cmp_cfg_icu_create(DATA_TYPE_IMAGETTE, CMP_MODE_RAW, 0, CMP_LOSSLESS);
+	struct rdcu_cfg rcfg = {0};
+	struct cmp_info info;
 	uint16_t data[] = {0, 1, 2, 0x42, (uint16_t)INT16_MIN, INT16_MAX, UINT16_MAX};
 	uint32_t *compressed_data;
 	uint16_t *decompressed_data;
 	struct cmp_entity *ent;
 
-	s = cmp_cfg_icu_buffers(&cfg, data, ARRAY_SIZE(data), NULL, NULL,
-				NULL, ARRAY_SIZE(data));
-	TEST_ASSERT_TRUE(s);
-	compressed_data = malloc(s);
+	rcfg.cmp_mode = CMP_MODE_RAW;
+	rcfg.input_buf = data;
+	rcfg.samples = ARRAY_SIZE(data);
+	rcfg.buffer_length = ARRAY_SIZE(data);
+
+	compressed_data = malloc(sizeof(data));
 	TEST_ASSERT_TRUE(compressed_data);
-	s = cmp_cfg_icu_buffers(&cfg, data, ARRAY_SIZE(data), NULL, NULL,
-				compressed_data, ARRAY_SIZE(data));
-	TEST_ASSERT_TRUE(s);
+	rcfg.icu_output_buf = compressed_data;
 
-	cmp_size = icu_compress_data(&cfg);
-	TEST_ASSERT_EQUAL_INT(sizeof(data)*CHAR_BIT, cmp_size);
+	cmp_size = compress_like_rdcu(&rcfg, &info);
+	TEST_ASSERT_EQUAL_UINT(sizeof(data)*CHAR_BIT, cmp_size);
 
-	s = cmp_ent_build(NULL, 0, 0, 0, 0, 0, &cfg, cmp_size);
+	s = cmp_ent_create(NULL, DATA_TYPE_IMAGETTE, rcfg.cmp_mode == CMP_MODE_RAW,
+			   cmp_bit_to_byte(cmp_size));
 	TEST_ASSERT_TRUE(s);
 	ent = malloc(s);
 	TEST_ASSERT_TRUE(ent);
-	s = cmp_ent_build(ent, 0, 0, 0, 0, 0, &cfg, cmp_size);
+	s = cmp_ent_create(ent, DATA_TYPE_IMAGETTE, rcfg.cmp_mode == CMP_MODE_RAW,
+			   cmp_bit_to_byte(cmp_size));
 	TEST_ASSERT_TRUE(s);
-	memcpy(cmp_ent_get_data_buf(ent), compressed_data, ((unsigned int)cmp_size+7)/8);
+	TEST_ASSERT_FALSE(cmp_ent_write_rdcu_cmp_pars(ent, &info, NULL));
+
+	memcpy(cmp_ent_get_data_buf(ent), compressed_data, (cmp_size+7)/8);
 
 	decmp_size = decompress_cmp_entiy(ent, NULL, NULL, NULL);
 	TEST_ASSERT_EQUAL_INT(sizeof(data), decmp_size);
@@ -1046,6 +1003,10 @@ void test_cmp_decmp_n_imagette_raw(void)
 }
 
 
+/**
+ * @test decompress_imagette
+ */
+
 void test_decompress_imagette_model(void)
 {
 	uint16_t data[5]  = {0};
@@ -1060,18 +1021,17 @@ void test_decompress_imagette_model(void)
 
 	cfg.data_type = DATA_TYPE_IMAGETTE;
 	cfg.cmp_mode = CMP_MODE_MODEL_MULTI;
-	cfg.input_buf = data;
+	cfg.dst = data;
 	cfg.model_buf = model;
-	cfg.icu_new_model_buf = up_model;
-	cfg.icu_output_buf = cmp_data;
-	cfg.buffer_length = 4;
+	cfg.updated_model_buf = up_model;
+	cfg.src = cmp_data;
+	cfg.stream_size = 4;
 	cfg.samples = 5;
 	cfg.model_value = 16;
-	cfg.golomb_par = 4;
-	cfg.spill = 48;
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
+	cfg.cmp_par_imagette = 4;
+	cfg.spill_imagette = 48;
 
-	bit_init_decoder(&dec, cfg.icu_output_buf, cfg.buffer_length);
+	bit_init_decoder(&dec, cfg.src, cfg.stream_size);
 
 	err = decompress_imagette(&cfg, &dec, RDCU_DECOMPRESSION);
 	TEST_ASSERT_FALSE(err);
@@ -1089,649 +1049,6 @@ void test_decompress_imagette_model(void)
 }
 
 
-/**
- * @test cmp_ent_write_cmp_pars
- * @test cmp_ent_read_header
- */
-
-void test_cmp_ent_write_cmp_pars(void)
-{
-	int error;
-	struct cmp_entity *ent;
-	struct cmp_cfg cfg = {0}, cfg_read = {0};
-	int cmp_size_bits;
-	uint32_t size;
-	struct cmp_max_used_bits max_used_bits = MAX_USED_BITS_SAFE;
-
-	/* set up max used bit version */
-	max_used_bits.version = 42;
-	cmp_max_used_bits_list_add(&max_used_bits);
-
-	cmp_size_bits = 93;
-	/** RAW mode test **/
-	/* create imagette raw mode configuration */
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.cmp_mode = CMP_MODE_RAW;
-	cfg.model_value = 11;
-	cfg.round = 2;
-	cfg.samples = 9;
-	cfg.max_used_bits = cmp_max_used_bits_list_get(42);
-
-	/* create a compression entity */
-	size = cmp_ent_create(NULL, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, cmp_cal_size_of_data(cfg.samples, cfg.data_type));
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-	ent = malloc(size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_create(ent, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, cmp_cal_size_of_data(cfg.samples, cfg.data_type));
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_FALSE(error);
-
-	TEST_ASSERT_EQUAL_INT(cfg.data_type, cmp_ent_get_data_type(ent));
-	TEST_ASSERT_EQUAL_INT(1, cmp_ent_get_data_type_raw_bit(ent));
-	TEST_ASSERT_EQUAL_INT(cmp_cal_size_of_data(cfg.samples, cfg.data_type), cmp_ent_get_cmp_data_size(ent));
-
-	TEST_ASSERT_EQUAL_INT(cmp_cal_size_of_data(cfg.samples, cfg.data_type), cmp_ent_get_original_size(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.cmp_mode, cmp_ent_get_cmp_mode(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.model_value, cmp_ent_get_model_value(ent));
-	TEST_ASSERT_EQUAL_INT(max_used_bits.version, cmp_ent_get_max_used_bits_version(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.round, cmp_ent_get_lossy_cmp_par(ent));
-
-	error = cmp_ent_read_header(ent, &cfg_read);
-	TEST_ASSERT_FALSE(error);
-	cfg.icu_output_buf = cmp_ent_get_data_buf(ent); /* quick fix that both cfg are equal */
-	cfg.buffer_length = 18; /* quick fix that both cfg are equal */
-	TEST_ASSERT_EQUAL_MEMORY(&cfg, &cfg_read, sizeof(struct cmp_cfg));
-
-	free(ent);
-	memset(&cfg, 0, sizeof(struct cmp_cfg));
-	memset(&cfg_read, 0, sizeof(struct cmp_cfg));
-
-	/** imagette test **/
-	/* create imagette mode configuration */
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.cmp_mode = CMP_MODE_MODEL_ZERO;
-	cfg.model_value = 11;
-	cfg.round = 2;
-	cfg.samples = 9;
-	cfg.spill = MIN_IMA_SPILL;
-	cfg.golomb_par = MAX_IMA_GOLOMB_PAR;
-	cfg.max_used_bits = cmp_max_used_bits_list_get(42);
-
-	/* create a compression entity */
-	size = cmp_ent_create(NULL, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, 12);
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-	ent = malloc(size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_create(ent, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, 12);
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_FALSE(error);
-
-	TEST_ASSERT_EQUAL_INT(cfg.data_type, cmp_ent_get_data_type(ent));
-	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_data_type_raw_bit(ent));
-	TEST_ASSERT_EQUAL_INT(12, cmp_ent_get_cmp_data_size(ent));
-
-	TEST_ASSERT_EQUAL_INT(cmp_cal_size_of_data(cfg.samples, cfg.data_type), cmp_ent_get_original_size(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.cmp_mode, cmp_ent_get_cmp_mode(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.model_value, cmp_ent_get_model_value(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.max_used_bits->version, cmp_ent_get_max_used_bits_version(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.round, cmp_ent_get_lossy_cmp_par(ent));
-
-	TEST_ASSERT_EQUAL_INT(cfg.spill, cmp_ent_get_ima_spill(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.golomb_par, cmp_ent_get_ima_golomb_par(ent));
-
-	error = cmp_ent_read_header(ent, &cfg_read);
-	TEST_ASSERT_FALSE(error);
-	cfg.icu_output_buf = cmp_ent_get_data_buf(ent); /* quick fix that both cfg are equal */
-	cfg.buffer_length = 12; /* quick fix that both cfg are equal */
-	TEST_ASSERT_EQUAL_MEMORY(&cfg, &cfg_read, sizeof(struct cmp_cfg));
-
-	free(ent);
-	memset(&cfg, 0, sizeof(struct cmp_cfg));
-	memset(&cfg_read, 0, sizeof(struct cmp_cfg));
-
-	/** adaptive imagette test **/
-	/* create a configuration */
-	cfg.data_type = DATA_TYPE_IMAGETTE_ADAPTIVE;
-	cfg.cmp_mode = CMP_MODE_MODEL_ZERO;
-	cfg.model_value = 11;
-	cfg.round = 2;
-	cfg.samples = 9;
-	cfg.spill = MIN_IMA_SPILL;
-	cfg.golomb_par = MAX_IMA_GOLOMB_PAR;
-	cfg.ap1_spill = 555;
-	cfg.ap1_golomb_par = 14;
-	cfg.ap2_spill = 333;
-	cfg.ap2_golomb_par = 43;
-	cfg.max_used_bits = NULL; /* no max_used_bits is set */
-
-	/* create a compression entity */
-	size = cmp_ent_create(NULL, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, 12);
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-	ent = malloc(size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_create(ent, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, 12);
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_FALSE(error);
-
-	TEST_ASSERT_EQUAL_INT(cfg.data_type, cmp_ent_get_data_type(ent));
-	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_data_type_raw_bit(ent));
-	TEST_ASSERT_EQUAL_INT(12, cmp_ent_get_cmp_data_size(ent));
-
-	TEST_ASSERT_EQUAL_INT(cmp_cal_size_of_data(cfg.samples, cfg.data_type), cmp_ent_get_original_size(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.cmp_mode, cmp_ent_get_cmp_mode(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.model_value, cmp_ent_get_model_value(ent));
-	/* zero is expected when max_used_bits = NULL */
-	TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_max_used_bits_version(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.round, cmp_ent_get_lossy_cmp_par(ent));
-
-	TEST_ASSERT_EQUAL_INT(cfg.spill, cmp_ent_get_ima_spill(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.golomb_par, cmp_ent_get_ima_golomb_par(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap1_spill, cmp_ent_get_ima_ap1_spill(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap1_golomb_par, cmp_ent_get_ima_ap1_golomb_par(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap2_spill, cmp_ent_get_ima_ap2_spill(ent));
-	TEST_ASSERT_EQUAL_INT(cfg.ap2_golomb_par, cmp_ent_get_ima_ap2_golomb_par(ent));
-
-	error = cmp_ent_read_header(ent, &cfg_read);
-	TEST_ASSERT_FALSE(error);
-	cfg.icu_output_buf = cmp_ent_get_data_buf(ent); /* quick fix that both cfg are equal */
-	cfg.buffer_length = 12; /* quick fix that both cfg are equal */
-	cfg.max_used_bits = &MAX_USED_BITS_SAFE;
-	TEST_ASSERT_EQUAL_MEMORY(&cfg, &cfg_read, sizeof(struct cmp_cfg));
-
-	free(ent);
-	memset(&cfg, 0, sizeof(struct cmp_cfg));
-	memset(&cfg_read, 0, sizeof(struct cmp_cfg));
-
-	/** Error Cases **/
-	/* create imagette raw mode configuration */
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-	cfg.cmp_mode = CMP_MODE_MODEL_ZERO;
-	cfg.model_value = 11;
-	cfg.round = 2;
-	cfg.samples = 9;
-	cfg.max_used_bits = cmp_max_used_bits_list_get(42);
-
-	/* create a compression entity */
-	size = cmp_ent_create(NULL, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, 12);
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-	ent = malloc(size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_create(ent, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, 12);
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-
-
-	/* ent = NULL */
-	error = cmp_ent_write_cmp_pars(NULL, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-
-	/* cfg = NULL */
-	error = cmp_ent_write_cmp_pars(ent, NULL, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-
-	/* cmp_size_bits negative */
-	error = cmp_ent_write_cmp_pars(ent, &cfg, -1);
-	TEST_ASSERT_TRUE(error);
-
-	/* data_type mismatch */
-	cfg.data_type = DATA_TYPE_S_FX;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.data_type = DATA_TYPE_IMAGETTE;
-
-	/* compressed data to big for compression entity */
-	error = cmp_ent_write_cmp_pars(ent, &cfg, 97);
-	TEST_ASSERT_TRUE(error);
-
-	/* original_size to high */
-	cfg.samples = 0x800000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.samples = 0x7FFFFF;
-
-	/* cmp_mode to high */
-	cfg.cmp_mode = 0x100;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_mode = 0xFF;
-
-	/* max model_value to high */
-	cfg.model_value = 0x100;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.model_value = 0xFF;
-
-	/*  max used bit version to high */
-	TEST_ASSERT_EQUAL_INT(1, sizeof(max_used_bits.version));
-
-	/* max lossy_cmp_par to high */
-	cfg.round = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.round = 0xFFFF;
-
-	/* The entity's raw data bit is not set, but the configuration contains raw data */
-	cfg.cmp_mode = CMP_MODE_RAW;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_mode = CMP_MODE_MODEL_MULTI;
-
-	/* The entity's raw data bit is set, but the configuration contains no raw data */
-	cmp_ent_set_data_type(ent, cfg.data_type, 1); /* set raw bit */
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cmp_ent_set_data_type(ent, cfg.data_type, 0);
-
-	/* spill to high */
-	cfg.spill = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill = 0xFFFF;
-
-	/* golomb_par to high */
-	cfg.golomb_par = 0x100;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.golomb_par = 0xFF;
-
-
-	cmp_ent_set_data_type(ent, DATA_TYPE_SAT_IMAGETTE_ADAPTIVE, 0);
-	cfg.data_type = DATA_TYPE_SAT_IMAGETTE_ADAPTIVE;
-	cmp_size_bits = 1;
-	/* adaptive 1 spill to high */
-	cfg.ap1_spill = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.ap1_spill = 0xFFFF;
-
-	/* adaptive 1  golomb_par to high */
-	cfg.ap1_golomb_par = 0x100;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.ap1_golomb_par = 0xFF;
-
-	/* adaptive 2 spill to high */
-	cfg.ap2_spill = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.ap2_spill = 0xFFFF;
-
-	/* adaptive 2  golomb_par to high */
-	cfg.ap2_golomb_par = 0x100;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.ap2_golomb_par = 0xFF;
-
-	cmp_ent_set_data_type(ent, DATA_TYPE_OFFSET, 0);
-	cfg.data_type = DATA_TYPE_OFFSET;
-
-	free(ent);
-
-	/* create a compression entity */
-	cfg.data_type = DATA_TYPE_F_CAM_BACKGROUND;
-	cfg.samples = 9;
-	size = cmp_ent_create(NULL, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, 12);
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-	ent = malloc(size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_create(ent, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, 12);
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-
-	/* mean cmp_par to high */
-	cfg.cmp_par_background_mean = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_background_mean = 0xFFFF;
-
-	/* mean spill to high */
-	cfg.spill_background_mean = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_background_mean = 0xFFFFFF;
-
-	/* variance cmp_par to high */
-	cfg.cmp_par_background_variance = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_background_variance = 0xFFFF;
-
-	/* variance spill to high */
-	cfg.spill_background_variance = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_background_variance = 0xFFFFFF;
-
-	/* pixels_error cmp_par to high */
-	cfg.cmp_par_background_pixels_error = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_background_pixels_error = 0xFFFF;
-
-	/* pixels_error spill to high */
-	cfg.spill_background_pixels_error = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_background_pixels_error = 0xFFFFFF;
-
-
-	cmp_ent_set_data_type(ent, DATA_TYPE_F_FX_EFX_NCOB_ECOB, 0);
-	cfg.data_type = DATA_TYPE_F_FX_EFX_NCOB_ECOB;
-
-	/* exp_flags cmp_par to high */
-	cfg.cmp_par_exp_flags = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_exp_flags = 0xFFFF;
-
-	/* exp_flags spill to high */
-	cfg.spill_exp_flags = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_exp_flags = 0xFFFFFF;
-
-	/* fx cmp_par to high */
-	cfg.cmp_par_fx = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_fx = 0xFFFF;
-
-	/* fx spill to high */
-	cfg.spill_fx = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_fx = 0xFFFFFF;
-
-	/* ncob cmp_par to high */
-	cfg.cmp_par_ncob = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_ncob = 0xFFFF;
-
-	/* ncob spill to high */
-	cfg.spill_ncob = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_ncob = 0xFFFFFF;
-
-	/* efx cmp_par to high */
-	cfg.cmp_par_efx = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_efx = 0xFFFF;
-
-	/* efx spill to high */
-	cfg.spill_efx = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_efx = 0xFFFFFF;
-
-	/* ecob cmp_par to high */
-	cfg.cmp_par_ecob = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_ecob = 0xFFFF;
-
-	/* ecob spill to high */
-	cfg.spill_ecob = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_ecob = 0xFFFFFF;
-
-	/* fx_cob_variance cmp_par to high */
-	cfg.cmp_par_fx_cob_variance = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_fx_cob_variance = 0xFFFF;
-
-	/* fx_cob_variance spill to high */
-	cfg.spill_fx_cob_variance = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_fx_cob_variance = 0xFFFFFF;
-
-	/* test data type = DATA_TYPE_UNKNOWN */
-	cmp_ent_set_data_type(ent, DATA_TYPE_UNKNOWN, 0);
-	cfg.data_type = DATA_TYPE_UNKNOWN;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-
-	/* test data type = DATA_TYPE_F_CAM_BACKGROUND +1 */
-	cmp_ent_set_data_type(ent, DATA_TYPE_F_CAM_BACKGROUND + 10, 0);
-	cfg.data_type = DATA_TYPE_F_CAM_BACKGROUND + 10;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	free(ent);
-	cmp_max_used_bits_list_empty();
-}
-
-
-/**
- * @test cmp_ent_read_header
- */
-
-void test_cmp_ent_read_header_error_cases(void)
-{
-	int error;
-	uint32_t size;
-	struct cmp_entity *ent;
-	struct cmp_cfg cfg;
-	int cmp_size_bits = 10*8;
-
-	/* create a imagette entity */
-	size = cmp_ent_create(NULL, DATA_TYPE_IMAGETTE, 0, 10);
-	/* created size smaller than max entity size -> returns max entity size */
-	TEST_ASSERT_EQUAL_UINT32(sizeof(struct cmp_entity), size);
-	ent = malloc(size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_create(ent, DATA_TYPE_IMAGETTE, 0, 10);
-	TEST_ASSERT_EQUAL_UINT32(sizeof(struct cmp_entity), size);
-	error = cmp_ent_set_cmp_mode(ent, CMP_MODE_DIFF_ZERO);
-	TEST_ASSERT_FALSE(error);
-
-	/* ent = NULL */
-	error = cmp_ent_read_header(NULL, &cfg);
-	TEST_ASSERT_TRUE(error);
-	/* this should work */
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_FALSE(error);
-
-	/* cfg = NULL */
-	error = cmp_ent_read_header(ent, NULL);
-	TEST_ASSERT_TRUE(error);
-	/* this should work */
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_FALSE(error);
-
-	/* unknown data type */
-	cmp_ent_set_data_type(ent, DATA_TYPE_UNKNOWN, 0);
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_TRUE(error);
-	cmp_ent_set_data_type(ent, (enum cmp_data_type)1000, 0);
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_TRUE(error);
-	/* unknown data type */
-	cmp_ent_set_data_type(ent, DATA_TYPE_F_CAM_BACKGROUND+1, 0);
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_TRUE(error);
-	/* this should work */
-	cmp_ent_set_data_type(ent, DATA_TYPE_IMAGETTE, 0);
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_FALSE(error);
-
-	/* original_size and data product type not compatible */
-	cmp_ent_set_original_size(ent, 11);
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_TRUE(error);
-
-	/* this should work */
-	cmp_ent_set_original_size(ent, 12);
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_FALSE(error);
-
-
-	/* create a raw entity */
-	size = cmp_ent_create(ent, DATA_TYPE_IMAGETTE, 1, 10);
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-
-	/* mean cmp_par to high */
-	cfg.cmp_par_background_mean = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_background_mean = 0xFFFF;
-
-	/* mean spill to high */
-	cfg.spill_background_mean = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_background_mean = 0xFFFFFF;
-
-	/* variance cmp_par to high */
-	cfg.cmp_par_background_variance = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_background_variance = 0xFFFF;
-
-	/* variance spill to high */
-	cfg.spill_background_variance = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_background_variance = 0xFFFFFF;
-
-	/* pixels_error cmp_par to high */
-	cfg.cmp_par_background_pixels_error = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_background_pixels_error = 0xFFFF;
-
-	/* pixels_error spill to high */
-	cfg.spill_background_pixels_error = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_background_pixels_error = 0xFFFFFF;
-
-
-	cmp_ent_set_data_type(ent, DATA_TYPE_F_FX_EFX_NCOB_ECOB, 0);
-	cfg.data_type = DATA_TYPE_F_FX_EFX_NCOB_ECOB;
-
-	/* exp_flags cmp_par to high */
-	cfg.cmp_par_exp_flags = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_exp_flags = 0xFFFF;
-
-	/* exp_flags spill to high */
-	cfg.spill_exp_flags = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_exp_flags = 0xFFFFFF;
-
-	/* fx cmp_par to high */
-	cfg.cmp_par_fx = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_fx = 0xFFFF;
-
-	/* fx spill to high */
-	cfg.spill_fx = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_fx = 0xFFFFFF;
-
-	/* ncob cmp_par to high */
-	cfg.cmp_par_ncob = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_ncob = 0xFFFF;
-
-	/* ncob spill to high */
-	cfg.spill_ncob = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_ncob = 0xFFFFFF;
-
-	/* efx cmp_par to high */
-	cfg.cmp_par_efx = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_efx = 0xFFFF;
-
-	/* efx spill to high */
-	cfg.spill_efx = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_efx = 0xFFFFFF;
-
-	/* ecob cmp_par to high */
-	cfg.cmp_par_ecob = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_ecob = 0xFFFF;
-
-	/* ecob spill to high */
-	cfg.spill_ecob = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_ecob = 0xFFFFFF;
-
-	/* fx_cob_variance cmp_par to high */
-	cfg.cmp_par_fx_cob_variance = 0x10000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.cmp_par_fx_cob_variance = 0xFFFF;
-
-	/* fx_cob_variance spill to high */
-	cfg.spill_fx_cob_variance = 0x1000000;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	cfg.spill_fx_cob_variance = 0xFFFFFF;
-
-	/* test data type = DATA_TYPE_UNKNOWN */
-	cmp_ent_set_data_type(ent, DATA_TYPE_UNKNOWN, 0);
-	cfg.data_type = DATA_TYPE_UNKNOWN;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-
-	/* test data type = DATA_TYPE_F_CAM_BACKGROUND +1 */
-	cmp_ent_set_data_type(ent, DATA_TYPE_F_CAM_BACKGROUND + 1, 0);
-	cfg.data_type = DATA_TYPE_F_CAM_BACKGROUND + 1;
-	error = cmp_ent_write_cmp_pars(ent, &cfg, cmp_size_bits);
-	TEST_ASSERT_TRUE(error);
-	free(ent);
-	ent = NULL;
-	cmp_max_used_bits_list_empty();
-
-
-	/* create a imagette entity */
-	size = cmp_ent_create(NULL, DATA_TYPE_IMAGETTE, 1, 10);
-	ent = malloc(size); TEST_ASSERT_NOT_NULL(ent);
-	size = cmp_ent_create(ent, DATA_TYPE_IMAGETTE, 1, 10);
-	TEST_ASSERT_NOT_EQUAL_INT(0, size);
-	cmp_ent_set_cmp_mode(ent, CMP_MODE_RAW);
-	cmp_ent_set_original_size(ent, 10);
-
-	/* this should work */
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_FALSE(error);
-
-	/* cmp_mode CMP_MODE_RAW and no raw data bit */
-	cmp_ent_set_data_type(ent, DATA_TYPE_IMAGETTE, 0);
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_TRUE(error);
-
-	/* this should work */
-	cmp_ent_set_data_type(ent, DATA_TYPE_IMAGETTE, 1);
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_FALSE(error);
-
-	/* cmp_mode CMP_MODE_RAW cmp_data_size != original_size */
-	cmp_ent_set_data_type(ent, DATA_TYPE_IMAGETTE, 0);
-	cmp_ent_set_original_size(ent, 8);
-	error = cmp_ent_read_header(ent, &cfg);
-	TEST_ASSERT_TRUE(error);
-
-	free(ent);
-}
-
-
 /**
  * @test decompress_cmp_entiy
  */
@@ -1744,7 +1061,7 @@ void test_decompress_imagette_chunk_raw(void)
 	uint8_t *decompressed_data;
 	struct cmp_entity *ent;
 	uint32_t ent_size;
-	uint32_t chunk_size = 2*(COLLECTION_HDR_SIZE + sizeof(data));
+	uint32_t const chunk_size = 2*(COLLECTION_HDR_SIZE + sizeof(data));
 	uint8_t *chunk = calloc(1, chunk_size); TEST_ASSERT_TRUE(chunk);
 
 	for (i = 0; i < 2; i++) {
diff --git a/test/fuzz/fuzz_compression.c b/test/fuzz/fuzz_compression.c
index 9962dee6fc181123f5a76c2ce36fcec06a5651fc..9b9b981750af2f6b70975fe7ddb3cbe8af6d9764 100644
--- a/test/fuzz/fuzz_compression.c
+++ b/test/fuzz/fuzz_compression.c
@@ -1,5 +1,5 @@
 /**
- * @file fuzz_copression.c
+ * @file fuzz_compression.c
  * @date 2024
  *
  * @copyright GPLv2
@@ -34,7 +34,7 @@
 int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 {
 	struct cmp_par cmp_par;
-	struct cmp_par *cmp_par_ptr = NULL;
+	const struct cmp_par *cmp_par_ptr = NULL;
 	const uint8_t *model = NULL;
 	void *up_model;
 	uint32_t *cmp_data;
@@ -46,6 +46,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 	/* Give a random portion of src data to the producer, to use for
 	   parameter generation. The rest will be used for data/model */
 	FUZZ_dataProducer_t *producer = (FUZZ_dataProducer_t *)FUZZ_dataProducer_create(src, size);
+
 	size = FUZZ_dataProducer_reserveDataPrefix(producer);
 
 	FUZZ_dataProducer_cmp_par(producer, &cmp_par);
@@ -64,7 +65,6 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 	cmp_data = (uint32_t *)FUZZ_malloc(cmp_data_capacity);
 
 	FUZZ_dataProducer_cmp_par(producer, &cmp_par);
-	cmp_par.lossy_par = 0; /*TODO: implement lossy  */
 	if (FUZZ_dataProducer_uint32Range(producer, 0, 1))
 		cmp_par_ptr = &cmp_par;
 
@@ -88,19 +88,19 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 	}
 
 
-	return_value = compress_chunk((void *)src, size, (void *)model, up_model,
+	return_value = compress_chunk(src, (uint32_t)size, model, up_model,
 				      cmp_data, cmp_data_capacity, cmp_par_ptr);
 
 	switch (cmp_get_error_code(return_value)) {
 	case CMP_ERROR_NO_ERROR:
 	case CMP_ERROR_GENERIC:
-	case CMP_ERROR_SMALL_BUF_:
+	case CMP_ERROR_SMALL_BUFFER:
 	/* compression parameter errors */
 	case CMP_ERROR_PAR_GENERIC:
 	case CMP_ERROR_PAR_SPECIFIC:
 	case CMP_ERROR_PAR_BUFFERS:
-	case CMP_ERROR_PAR_MAX_USED_BITS:
 	case CMP_ERROR_PAR_NULL:
+	case CMP_ERROR_PAR_NO_MODEL:
 	/* chunk errors */
 	case CMP_ERROR_CHUNK_NULL:
 	case CMP_ERROR_CHUNK_TOO_LARGE:
@@ -133,6 +133,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 	default:
 		FUZZ_ASSERT(0);
 	}
+	if (!cmp_is_error(return_value) && model != up_model) {
+		uint32_t return_value2;
+
+		return_value2 = compress_chunk(src, (uint32_t)size, model, up_model,
+					       NULL, cmp_data_capacity, cmp_par_ptr);
+		FUZZ_ASSERT(return_value == return_value2);
+	}
 
 	free(cmp_data);
 	free(up_model);
diff --git a/test/fuzz/fuzz_data_producer.c b/test/fuzz/fuzz_data_producer.c
index 1ee59944a44d2b2754d5ca343542c7493c47f1d1..f4e6990bde9b2780b0afa8ed28adffdf347520dd 100644
--- a/test/fuzz/fuzz_data_producer.c
+++ b/test/fuzz/fuzz_data_producer.c
@@ -25,88 +25,96 @@
 #include "fuzz_data_producer.h"
 #include <cmp_chunk.h>
 
-struct FUZZ_dataProducer_s{
-  const uint8_t *data;
-  size_t size;
+struct FUZZ_dataProducer_s {
+	const uint8_t *data;
+	size_t size;
 };
 
-FUZZ_dataProducer_t *FUZZ_dataProducer_create(const uint8_t *data, size_t size) {
-    FUZZ_dataProducer_t *producer = FUZZ_malloc(sizeof(FUZZ_dataProducer_t));
+FUZZ_dataProducer_t *FUZZ_dataProducer_create(const uint8_t *data, size_t size)
+{
+	FUZZ_dataProducer_t *producer = FUZZ_malloc(sizeof(FUZZ_dataProducer_t));
 
-    producer->data = data;
-    producer->size = size;
-    return producer;
+	producer->data = data;
+	producer->size = size;
+	return producer;
 }
 
-void FUZZ_dataProducer_free(FUZZ_dataProducer_t *producer) { free(producer); }
+void FUZZ_dataProducer_free(FUZZ_dataProducer_t *producer)
+{
+	free(producer);
+}
 
 uint32_t FUZZ_dataProducer_uint32Range(FUZZ_dataProducer_t *producer, uint32_t min,
-                                  uint32_t max) {
-    uint32_t range = max - min;
-    uint32_t rolling = range;
-    uint32_t result = 0;
+				       uint32_t max)
+{
+	uint32_t range = max - min;
+	uint32_t rolling = range;
+	uint32_t result = 0;
 
-    FUZZ_ASSERT(min <= max);
+	FUZZ_ASSERT(min <= max);
 
-    while (rolling > 0 && producer->size > 0) {
-      uint8_t next = *(producer->data + producer->size - 1);
-      producer->size -= 1;
-      result = (result << 8) | next;
-      rolling >>= 8;
-    }
+	while (rolling > 0 && producer->size > 0) {
+		uint8_t next = *(producer->data + producer->size - 1);
 
-    if (range == 0xffffffff) {
-      return result;
-    }
+		producer->size -= 1;
+		result = (result << 8) | next;
+		rolling >>= 8;
+	}
 
-    return min + result % (range + 1);
+	if (range == 0xffffffff)
+		return result;
+
+	return min + result % (range + 1);
 }
 
-uint32_t FUZZ_dataProducer_uint32(FUZZ_dataProducer_t *producer) {
-    return FUZZ_dataProducer_uint32Range(producer, 0, 0xffffffff);
+uint32_t FUZZ_dataProducer_uint32(FUZZ_dataProducer_t *producer)
+{
+	return FUZZ_dataProducer_uint32Range(producer, 0, 0xffffffff);
 }
 
 int32_t FUZZ_dataProducer_int32Range(FUZZ_dataProducer_t *producer,
-                                    int32_t min, int32_t max)
+				     int32_t min, int32_t max)
 {
-    FUZZ_ASSERT(min <= max);
+	FUZZ_ASSERT(min <= max);
 
-    if (min < 0)
-      return (int)FUZZ_dataProducer_uint32Range(producer, 0, max - min) + min;
+	if (min < 0)
+		return (int)FUZZ_dataProducer_uint32Range(producer, 0, max - min) + min;
 
-    return FUZZ_dataProducer_uint32Range(producer, min, max);
+	return FUZZ_dataProducer_uint32Range(producer, min, max);
 }
 
-size_t FUZZ_dataProducer_remainingBytes(FUZZ_dataProducer_t *producer){
-    return producer->size;
+size_t FUZZ_dataProducer_remainingBytes(FUZZ_dataProducer_t *producer)
+{
+	return producer->size;
 }
 
 void FUZZ_dataProducer_rollBack(FUZZ_dataProducer_t *producer, size_t remainingBytes)
 {
-    FUZZ_ASSERT(remainingBytes >= producer->size);
-    producer->size = remainingBytes;
+	FUZZ_ASSERT(remainingBytes >= producer->size);
+	producer->size = remainingBytes;
 }
 
-int FUZZ_dataProducer_empty(FUZZ_dataProducer_t *producer) {
-    return producer->size == 0;
+int FUZZ_dataProducer_empty(FUZZ_dataProducer_t *producer)
+{
+	return producer->size == 0;
 }
 
 size_t FUZZ_dataProducer_contract(FUZZ_dataProducer_t *producer, size_t newSize)
 {
-    size_t remaining;
+	size_t remaining;
 
-    newSize = newSize > producer->size ? producer->size : newSize;
-    remaining = producer->size - newSize;
-    producer->data = producer->data + remaining;
-    producer->size = newSize;
-    return remaining;
+	newSize = newSize > producer->size ? producer->size : newSize;
+	remaining = producer->size - newSize;
+	producer->data = producer->data + remaining;
+	producer->size = newSize;
+	return remaining;
 }
 
 size_t FUZZ_dataProducer_reserveDataPrefix(FUZZ_dataProducer_t *producer)
 {
-    size_t producerSliceSize = FUZZ_dataProducer_uint32Range(
-                                  producer, 0, producer->size);
-    return FUZZ_dataProducer_contract(producer, producerSliceSize);
+	size_t producerSliceSize = FUZZ_dataProducer_uint32Range(
+								 producer, 0, producer->size);
+	return FUZZ_dataProducer_contract(producer, producerSliceSize);
 }
 
 void FUZZ_dataProducer_cmp_par(FUZZ_dataProducer_t *producer, struct cmp_par *cmp_par)
diff --git a/test/fuzz/fuzz_decompression.c b/test/fuzz/fuzz_decompression.c
new file mode 100644
index 0000000000000000000000000000000000000000..220c65686a1bdc6b74781215768b83c6e4756efd
--- /dev/null
+++ b/test/fuzz/fuzz_decompression.c
@@ -0,0 +1,103 @@
+/**
+ * @file defuzz_compression.c
+ * @date 2024
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * @brief decompression fuzz target
+ */
+
+
+#include <stdint.h>
+#include <stddef.h>
+#include <string.h>
+
+#include "fuzz_helpers.h"
+#include "fuzz_data_producer.h"
+
+#include "../../lib/decmp.h"
+
+
+int decompress_cmp_entiy_save(const struct cmp_entity *ent, size_t ent_size, const void *model_of_data,
+			 void *up_model_buf, void *decompressed_data, size_t decmp_size)
+{
+	if (ent && ent_size < GENERIC_HEADER_SIZE)
+		return -1;
+	if (cmp_ent_get_size(ent) > ent_size)
+		return -1;
+
+	if (ent && (decompressed_data || up_model_buf)) {
+		int decmp_size_ent = decompress_cmp_entiy(ent, model_of_data, NULL, NULL);
+
+		if (decmp_size < (size_t)decmp_size_ent || decmp_size_ent < 0)
+			return -1;
+	}
+
+	return decompress_cmp_entiy(ent, model_of_data, up_model_buf, decompressed_data);
+}
+
+int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
+{
+	const struct cmp_entity *ent = NULL;
+	const void *model_of_data = NULL;
+	void *up_model_buf;
+	uint32_t model_of_data_size;
+	uint32_t ent_size;
+	void *decompressed_data;
+
+	/* Give a random portion of src data to the producer, to use for
+	   parameter generation. The rest will be used for data/model */
+	FUZZ_dataProducer_t *producer = (FUZZ_dataProducer_t *)FUZZ_dataProducer_create(src, size);
+
+	size = FUZZ_dataProducer_reserveDataPrefix(producer);
+	FUZZ_ASSERT(size <= UINT32_MAX);
+
+	/* spilt data to compressed data and model data */
+	ent_size = FUZZ_dataProducer_uint32Range(producer, 0, (uint32_t)size);
+	model_of_data_size = FUZZ_dataProducer_uint32Range(producer, 0, (uint32_t)size-ent_size);
+
+	if (ent_size)
+		ent = (const struct cmp_entity *)src;
+	if (FUZZ_dataProducer_uint32Range(producer, 0, 1))
+		model_of_data = src + ent_size;
+	else
+		model_of_data = NULL;
+
+
+	switch (FUZZ_dataProducer_int32Range(producer, 0, 2)) {
+	case 0:
+		up_model_buf = NULL;
+		break;
+	case 1:
+		up_model_buf = FUZZ_malloc(model_of_data_size);
+		break;
+	case 2: /* in-place update */
+		up_model_buf = FUZZ_malloc(model_of_data_size);
+		if (model_of_data && up_model_buf) {
+			memcpy(up_model_buf, model_of_data, model_of_data_size);
+			model_of_data = up_model_buf;
+		}
+		break;
+	default:
+		FUZZ_ASSERT(0);
+	}
+
+	decompressed_data = FUZZ_malloc((size_t)model_of_data_size);
+	decompress_cmp_entiy_save(ent, ent_size, model_of_data, up_model_buf, decompressed_data, model_of_data_size);
+
+	free(up_model_buf);
+	free(decompressed_data);
+	FUZZ_dataProducer_free(producer);
+
+	return 0;
+}
+
+
diff --git a/test/fuzz/fuzz_helpers.c b/test/fuzz/fuzz_helpers.c
index 27f10768511dec42d4060a616206733adb358695..160b153e6f4ac69db6cf5411e567bb09c1bb91e1 100644
--- a/test/fuzz/fuzz_helpers.c
+++ b/test/fuzz/fuzz_helpers.c
@@ -8,42 +8,22 @@
  * You may select, at your option, one of the above-listed licenses.
  */
 
-#include "fuzz_helpers.h"
+/**
+ * Helper functions for fuzzing.
+ */
 
-#include <stddef.h>
 #include <stdlib.h>
-#include <string.h>
-
-void* FUZZ_malloc(size_t size)
-{
-    if (size > 0) {
-        void* const mem = malloc(size);
-        FUZZ_ASSERT(mem);
-        return mem;
-    }
-    return NULL;
-}
 
-void* FUZZ_malloc_rand(size_t size, FUZZ_dataProducer_t *producer)
-{
-    if (size > 0) {
-        void* const mem = malloc(size);
-        FUZZ_ASSERT(mem);
-        return mem;
-    } else {
-        uintptr_t ptr = 0;
-        /* Add +- 1M 50% of the time */
-        if (FUZZ_dataProducer_uint32Range(producer, 0, 1))
-            FUZZ_dataProducer_int32Range(producer, -1000000, 1000000);
-        return (void*)ptr;
-    }
+#include "fuzz_helpers.h"
 
-}
 
-int FUZZ_memcmp(void const* lhs, void const* rhs, int32_t size)
+void *FUZZ_malloc(size_t size)
 {
-    if (size <= 0) {
-        return 0;
-    }
-    return memcmp(lhs, rhs, (size_t)size);
+	if (size > 0) {
+		void *const mem = malloc(size);
+
+		FUZZ_ASSERT(mem);
+		return mem;
+	}
+	return NULL;
 }
diff --git a/test/fuzz/fuzz_helpers.h b/test/fuzz/fuzz_helpers.h
index 70fb3fbb39b123797e340191514c48621260a366..bdaa672c81e9f63dad8d5fe4119be0c085128ecf 100644
--- a/test/fuzz/fuzz_helpers.h
+++ b/test/fuzz/fuzz_helpers.h
@@ -15,18 +15,12 @@
 #ifndef FUZZ_HELPERS_H
 #define FUZZ_HELPERS_H
 
-#include "fuzz.h"
-#include "fuzz_data_producer.h"
-#include <stdint.h>
 #include <stdio.h>
-#include <stdlib.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
 
 #define FUZZ_QUOTE_IMPL(str) #str
 #define FUZZ_QUOTE(str) FUZZ_QUOTE_IMPL(str)
@@ -40,37 +34,9 @@ extern "C" {
                      __LINE__, FUZZ_QUOTE(cond), (msg)),                       \
              abort()))
 #define FUZZ_ASSERT(cond) FUZZ_ASSERT_MSG((cond), "");
-#define FUZZ_ZASSERT(code)                                                     \
-  FUZZ_ASSERT_MSG(!ZSTD_isError(code), ZSTD_getErrorName(code))
 
-#if defined(__GNUC__)
-#define FUZZ_STATIC static __inline __attribute__((unused))
-#elif defined(__cplusplus) ||                                                  \
-    (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
-#define FUZZ_STATIC static inline
-#elif defined(_MSC_VER)
-#define FUZZ_STATIC static __inline
-#else
-#define FUZZ_STATIC static
-#endif
-
-/**
- * malloc except return NULL for zero sized data and FUZZ_ASSERT
- * that malloc doesn't fail.
- */
 void* FUZZ_malloc(size_t size);
 
-/**
- * malloc except returns random pointer for zero sized data and FUZZ_ASSERT
- * that malloc doesn't fail.
- */
-void* FUZZ_malloc_rand(size_t size,  FUZZ_dataProducer_t *producer);
-
-/**
- * memcmp but accepts NULL. Ignore negative sizes
- */
-int FUZZ_memcmp(void const* lhs, void const* rhs, int32_t size);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/test/fuzz/fuzz_round_trip.c b/test/fuzz/fuzz_round_trip.c
index d87cb8112d8561e73bbe7c5c099ab9e9259ae4bb..0ffca732d2e89e50787184c0042105c040f10ebc 100644
--- a/test/fuzz/fuzz_round_trip.c
+++ b/test/fuzz/fuzz_round_trip.c
@@ -22,110 +22,17 @@
  */
 
 #include <string.h>
+#include <stdlib.h>
 
 #include "fuzz_helpers.h"
 #include "fuzz_data_producer.h"
-
-#include "../../lib/cmp_chunk.h"
-#include "../../lib/decmp.h"
-
-
-#define TEST_malloc(size) FUZZ_malloc(size)
-#define TEST_ASSERT(cond) FUZZ_ASSERT(cond)
-
-
-static uint32_t chunk_round_trip(void *data, uint32_t data_size,
-				 void *model, void *up_model,
-				 uint32_t *cmp_data, uint32_t cmp_data_capacity,
-				 struct cmp_par *cmp_par, int use_decmp_buf,
-				 int use_decmp_up_model)
-{
-	uint32_t cmp_size;
-	void *model_cpy = NULL;
-
-	/* if in-place model update is used (up_model == model), the model
-	 * needed for decompression is destroyed; therefore we make a copy
-	 */
-	if (model) {
-		if (up_model == model) {
-			model_cpy = TEST_malloc(data_size);
-			memcpy(model_cpy, model, data_size);
-		} else {
-			model_cpy = model;
-		}
-	}
-
-	cmp_size = compress_chunk(data, data_size, model, up_model,
-				  cmp_data, cmp_data_capacity, cmp_par);
-
-#if 0
-	{ /* Compress a second time and check for determinism */
-		int32_t cSize2;
-		void *compressed2 = NULL;
-		void *up_model2 = NULL;
-
-		if (compressed)
-			compressed2 = FUZZ_malloc(compressedCapacity);
-
-		if (up_model)
-			up_model2 = FUZZ_malloc(srcSize);
-		cSize2 = compress_chunk((void *)src, srcSize, (void *)model, up_model2,
-					   compressed2, compressedCapacity, cmp_par);
-		FUZZ_ASSERT(cSize == cSize2);
-		FUZZ_ASSERT_MSG(!FUZZ_memcmp(compressed, compressed2, cSize), "Not deterministic!");
-		FUZZ_ASSERT_MSG(!FUZZ_memcmp(up_model, compressed2, cSize), "NO deterministic!");
-		free(compressed2);
-		free(up_model2);
-	}
-#endif
-	if (!cmp_is_error(cmp_size) && cmp_data) {
-		void *decmp_data = NULL;
-		void *up_model_decmp = NULL;
-		int decmp_size;
-
-		decmp_size = decompress_cmp_entiy((struct cmp_entity *)cmp_data, model_cpy, NULL, NULL);
-		TEST_ASSERT(decmp_size >= 0);
-		TEST_ASSERT((uint32_t)decmp_size == data_size);
-
-		if (use_decmp_buf)
-			decmp_data = TEST_malloc(data_size);
-		if (use_decmp_up_model) {
-			up_model_decmp = TEST_malloc(data_size);
-			if (!model_mode_is_used(cmp_par->cmp_mode))
-				memset(up_model_decmp, 0, data_size); /* up_model is not used */
-		}
-
-		decmp_size = decompress_cmp_entiy((struct cmp_entity *)cmp_data, model_cpy,
-						  up_model_decmp, decmp_data);
-		TEST_ASSERT(decmp_size >= 0);
-		TEST_ASSERT((uint32_t)decmp_size == data_size);
-
-		if (use_decmp_buf) {
-			TEST_ASSERT(!memcmp(data, decmp_data, data_size));
-
-			/*
-			 * the model is only updated when the decompressed_data
-			 * buffer is set
-			 */
-			if (up_model && up_model_decmp)
-				TEST_ASSERT(!memcmp(up_model, up_model_decmp, data_size));
-		}
-
-		free(decmp_data);
-		free(up_model_decmp);
-	}
-
-	if (up_model == model)
-		free(model_cpy);
-
-	return cmp_size;
-}
+#include "../test_common/chunk_round_trip.h"
 
 
 int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 {
 	struct cmp_par cmp_par;
-	struct cmp_par *cmp_par_ptr=NULL;
+	struct cmp_par *cmp_par_ptr = NULL;
 	const uint8_t *model = NULL;
 	void *up_model = NULL;
 	uint32_t cmp_size_bound;
@@ -138,6 +45,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 	/* Give a random portion of src data to the producer, to use for
 	   parameter generation. The rest will be used for (de)compression */
 	FUZZ_dataProducer_t *producer = (FUZZ_dataProducer_t *)FUZZ_dataProducer_create(src, size);
+
 	size = FUZZ_dataProducer_reserveDataPrefix(producer);
 
 	/* 1/2 of the cases we use a model */
@@ -149,7 +57,6 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 
 	/* generate compression parameters */
 	FUZZ_dataProducer_cmp_par(producer, &cmp_par);
-	cmp_par.lossy_par = 0; /*TODO: implement lossy  */
 	if (FUZZ_dataProducer_uint32Range(producer, 0, 1))
 		cmp_par_ptr = &cmp_par;
 
@@ -169,19 +76,19 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 	use_decmp_buf = FUZZ_dataProducer_int32Range(producer, 0, 1);
 	use_decmp_up_model = FUZZ_dataProducer_int32Range(producer, 0, 1);
 
-	return_value = chunk_round_trip(src, size, model, up_model, cmp_data,
-				        cmp_data_capacity, cmp_par_ptr,
-				        use_decmp_buf, use_decmp_up_model);
+	return_value = chunk_round_trip(src, (uint32_t)size, model, up_model, cmp_data,
+					cmp_data_capacity, cmp_par_ptr,
+					use_decmp_buf, use_decmp_up_model);
 	switch (cmp_get_error_code(return_value)) {
 	case CMP_ERROR_NO_ERROR:
 	case CMP_ERROR_GENERIC:
-	case CMP_ERROR_SMALL_BUF_:
+	case CMP_ERROR_SMALL_BUFFER:
 	/* compression parameter errors */
 	case CMP_ERROR_PAR_GENERIC:
 	case CMP_ERROR_PAR_SPECIFIC:
 	case CMP_ERROR_PAR_BUFFERS:
-	case CMP_ERROR_PAR_MAX_USED_BITS:
 	case CMP_ERROR_PAR_NULL:
+	case CMP_ERROR_PAR_NO_MODEL:
 	/* chunk errors */
 	case CMP_ERROR_CHUNK_NULL:
 	case CMP_ERROR_CHUNK_TOO_LARGE:
diff --git a/test/fuzz/meson.build b/test/fuzz/meson.build
index f7da779e90bd6576d380c75db37a58c33c13d3c7..c9a73c9a8f05bc30add39690e8c983ea75bd9113 100644
--- a/test/fuzz/meson.build
+++ b/test/fuzz/meson.build
@@ -2,8 +2,8 @@ if get_option('fuzzer').disabled()
   subdir_done()
 endif
 
-fuzz_common = files('fuzz_helpers.c', 'fuzz_data_producer.c')
-fuzz_targets = ['fuzz_compression.c', 'fuzz_round_trip.c']
+fuzz_common = files('fuzz_data_producer.c', 'fuzz_helpers.c')
+fuzz_targets = ['fuzz_compression.c', 'fuzz_round_trip.c', 'fuzz_decompression.c']
 
 add_languages('cpp', native: false) # libFuzzingEngine needs c++
 
@@ -12,9 +12,9 @@ foreach target : fuzz_targets
   target_name = file_name.split('.').get(0)
 
   fuzz_exe = executable(target_name,
-    fuzz_common, file_name,
+    fuzz_common, chunk_round_trip, file_name,
     include_directories : incdir,
-    link_with : cmp_lib,
+    link_with : [cmp_lib],
     link_args : get_option('fuzzer_ldflags'),
     link_language : 'cpp' # libFuzzingEngine needs c++
   )
diff --git a/test/meson.build b/test/meson.build
index f145b5d16c3a0eb113a5cbe1f834eb5cff927303..b3aac802980d2981721b321e191c1b6b6c06f268 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -48,12 +48,12 @@ test_env.set('ASAN_OPTIONS',
   'use_sigaltstack=1',
   'dedup_token_length=3'
 )
-if cc.has_argument('-fsanitize=leak')
+if cc.has_argument('-fsanitize=leak') and not (host_machine.system() == 'darwin' and host_machine.cpu_family() == 'aarch64' and cc.get_id() == 'clang')
   test_env.append('ASAN_OPTIONS', 'detect_leaks=1')
 endif
 
 test_env.set('UBSAN_OPTIONS',
-  'abort_on_error=1',
+  'halt_on_error=1',
   'print_stacktrace=1',
   'print_summary=1',
   'symbolize=1',
@@ -71,6 +71,7 @@ subdir('tools')
 subdir('cmp_tool')
 
 unity_dep = dependency('unity', fallback : ['unity', 'unity_dep'])
+m_dep = cc.find_library('m', required : false)
 subdir('test_common')
 subdir('fuzz')
 
@@ -81,7 +82,6 @@ subdir('cmp_decmp')
 subdir('cmp_data_types')
 subdir('cmp_entity')
 subdir('cmp_rdcu_cfg')
-subdir('cmp_max_used_bits')
 
 
 test_args = '-Wno-missing-declarations' # The test runner generator does not generate header files
@@ -104,7 +104,7 @@ if ruby.found()
       test_src, test_runner,
       include_directories : incdir,
       link_with : test_libs,
-      dependencies : unity_dep,
+      dependencies : [unity_dep, m_dep],
       c_args : test_args,
       build_by_default : false
     )
diff --git a/test/test_common/chunk_round_trip.c b/test/test_common/chunk_round_trip.c
new file mode 100644
index 0000000000000000000000000000000000000000..dcda351f69f219d30590ee21e62287897c930fb0
--- /dev/null
+++ b/test/test_common/chunk_round_trip.c
@@ -0,0 +1,170 @@
+/**
+ * @file chunk_round_trip.c
+ * @date 2024
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * @brief chunk compression/decompression test
+ *
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "../test_common/test_common.h"
+#include "../../lib/cmp_chunk.h"
+#include "../../lib/decmp.h"
+#include "chunk_round_trip.h"
+
+#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
+#  include "../fuzz/fuzz_helpers.h"
+#  define TEST_ASSERT(cond) FUZZ_ASSERT(cond)
+#else
+#  include <unity.h>
+#endif
+
+
+
+/**
+ * @brief allocates memory safely for tests
+ *
+ * @param size the size of memory to allocate
+ *
+ * @returns a pointer to the allocated memory, or NULL if allocation fails
+ */
+
+static void *TEST_malloc(size_t size)
+{
+	if (size > 0) {
+		void *mem = malloc(size);
+
+		TEST_ASSERT(mem);
+		return mem;
+	}
+	return NULL;
+}
+
+
+/**
+ * @brief performs chunk compression and checks if a decompression is possible
+ *
+ * @param chunk			pointer to the chunk to be compressed
+ * @param chunk_size		byte size of the chunk
+ * @param chunk_model		pointer to a model of a chunk; has the same size
+ *				as the chunk (can be NULL if no model compression
+ *				mode is used)
+ * @param updated_chunk_model	pointer to store the updated model for the next
+ *				model mode compression; has the same size as the
+ *				chunk (can be the same as the model_of_data
+ *				buffer for in-place update or NULL if updated
+ *				model is not needed)
+ * @param dst			destination pointer to the compressed data
+ *				buffer; has to be 4-byte aligned; can be NULL to
+ *				only get the compressed data size
+ * @param dst_capacity		capacity of the dst buffer; it's recommended to
+ *				provide a dst_capacity >=
+ *				compress_chunk_cmp_size_bound(chunk, chunk_size)
+ *				as it eliminates one potential failure scenario:
+ *				not enough space in the dst buffer to write the
+ *				compressed data; size is internally rounded down
+ *				to a multiple of 4
+ * @param use_decmp_buf		if non-zero, a buffer is allocated for the
+ *				decompressed data
+ * @param use_decmp_up_model	if non-zero, a buffer for the updated model is
+ *				allocated during the decompression
+ * @param cmp_par		pointer to a compression parameters struct
+ *
+ * @returns the return value of the compress_chunk() function
+ */
+
+uint32_t chunk_round_trip(const void *chunk, uint32_t chunk_size,
+			  const void *chunk_model, void *updated_chunk_model,
+			  uint32_t *dst, uint32_t dst_capacity,
+			  const struct cmp_par *cmp_par,
+			  int use_decmp_buf, int use_decmp_up_model)
+{
+	uint32_t cmp_size;
+	void *model_cpy_p = NULL;
+	const void *model_cpy = NULL;
+
+	/* if in-place model update is used (up_model == model), the model
+	 * needed for decompression is destroyed; therefore we make a copy
+	 */
+	if (chunk_model) {
+		if (updated_chunk_model == chunk_model) {
+			model_cpy_p = TEST_malloc(chunk_size);
+			memcpy(model_cpy_p, chunk_model, chunk_size);
+			model_cpy = model_cpy_p;
+		} else {
+			model_cpy = chunk_model;
+		}
+	}
+
+	cmp_size = compress_chunk(chunk, chunk_size, chunk_model, updated_chunk_model,
+				  dst, dst_capacity, cmp_par);
+
+	if (!cmp_is_error(cmp_size)) { /* second run with dst = NULL */
+		uint32_t cmp_size2;
+
+		/* reset model if in-place update was used */
+		if (chunk_model && updated_chunk_model == chunk_model)
+			memcpy(updated_chunk_model, model_cpy, chunk_size);
+
+		cmp_size2 = compress_chunk(chunk, chunk_size, chunk_model, updated_chunk_model,
+					   NULL, dst_capacity, cmp_par);
+		if (cmp_get_error_code(cmp_size) != CMP_ERROR_SMALL_BUFFER)
+			TEST_ASSERT(cmp_size == cmp_size2);
+	}
+
+
+	/* decompress the data if the compression was successful */
+	if (!cmp_is_error(cmp_size) && dst) {
+		void *decmp_data = NULL;
+		void *up_model_decmp = NULL;
+		int decmp_size;
+
+		decmp_size = decompress_cmp_entiy((struct cmp_entity *)dst, model_cpy, NULL, NULL);
+		TEST_ASSERT(decmp_size >= 0);
+		TEST_ASSERT((uint32_t)decmp_size == chunk_size);
+
+		if (use_decmp_buf)
+			decmp_data = TEST_malloc(chunk_size);
+		if (use_decmp_up_model) {
+			up_model_decmp = TEST_malloc(chunk_size);
+			if (!model_mode_is_used(cmp_par->cmp_mode))
+				memset(up_model_decmp, 0, chunk_size); /* up_model is not used */
+		}
+
+		decmp_size = decompress_cmp_entiy((struct cmp_entity *)dst, model_cpy,
+						  up_model_decmp, decmp_data);
+		TEST_ASSERT(decmp_size >= 0);
+		TEST_ASSERT((uint32_t)decmp_size == chunk_size);
+
+		if (use_decmp_buf) {
+			TEST_ASSERT(!memcmp(chunk, decmp_data, chunk_size));
+
+			/*
+			 * the model is only updated when the decompressed_data
+			 * buffer is set
+			 */
+			if (use_decmp_up_model && updated_chunk_model)
+				TEST_ASSERT(!memcmp(updated_chunk_model, up_model_decmp, chunk_size));
+		}
+
+		free(decmp_data);
+		free(up_model_decmp);
+	}
+
+	if (updated_chunk_model == chunk_model)
+		free(model_cpy_p);
+
+	return cmp_size;
+}
diff --git a/test/test_common/chunk_round_trip.h b/test/test_common/chunk_round_trip.h
new file mode 100644
index 0000000000000000000000000000000000000000..cc049d1142be9708f7f92a7349648d8213eb7451
--- /dev/null
+++ b/test/test_common/chunk_round_trip.h
@@ -0,0 +1,34 @@
+/**
+ * @file chunk_round_trip.h
+ * @date 2024
+ *
+ * @copyright GPLv2
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * @brief chunk compression/decompression
+ */
+
+
+#ifndef CHUNK_ROUND_TRIP_H
+#define CHUNK_ROUND_TRIP_H
+
+#include <stdint.h>
+#include "../../lib/cmp_chunk.h"
+
+
+uint32_t chunk_round_trip(const void *chunk, uint32_t chunk_size,
+			  const void *chunk_model, void *updated_chunk_model,
+			  uint32_t *dst, uint32_t dst_capacity,
+			  const struct cmp_par *cmp_par, int use_decmp_buf,
+			  int use_decmp_up_model);
+
+
+#endif /* CHUNK_ROUND_TRIP_H */
+
diff --git a/test/test_common/meson.build b/test/test_common/meson.build
index 082ac4c1c8a79e1e30ea3147bf445c513b569da7..ecc5614874603747e38f52d1d4ecb6ce5d8ea577 100644
--- a/test/test_common/meson.build
+++ b/test/test_common/meson.build
@@ -1,8 +1,10 @@
 pcg_proj = subproject('pcg-c-basic')
 pcb_dep = pcg_proj.get_variable('libpcg_basic_dep')
 
+chunk_round_trip = files('chunk_round_trip.c')
 test_common_lib = static_library(
    'test_common',
    'test_common.c',
+   chunk_round_trip,
    dependencies: [pcb_dep, unity_dep]
 )
diff --git a/test/test_common/test_common.c b/test/test_common/test_common.c
index 7a1b25f222677da77c292e8a0ea96b85ac6f5bfb..1a3e79d8eff4d06ae52a56e14c32ba647b4c4402 100644
--- a/test/test_common/test_common.c
+++ b/test/test_common/test_common.c
@@ -6,7 +6,12 @@
 #include "pcg_basic.h"
 #include "test_common.h"
 
-#include <unity.h>
+#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
+#  include "../fuzz/fuzz_helpers.h"
+#  define TEST_ASSERT(cond) FUZZ_ASSERT(cond)
+#else
+#  include <unity.h>
+#endif
 
 void cmp_rand_seed(uint64_t seed)
 {
@@ -38,28 +43,10 @@ uint32_t cmp_rand_between(uint32_t min, uint32_t max)
 }
 
 
-uint32_t cmp_rand_nbits(unsigned int nbits)
+uint32_t cmp_rand_nbits(unsigned int n_bits)
 {
-	TEST_ASSERT(nbits > 0);
+	TEST_ASSERT(n_bits > 0);
+	TEST_ASSERT(n_bits <= 32);
 
-	return cmp_rand32() >> (32 - nbits);
-}
-
-
-/**
- * @brief allocates memory safely for tests
- *
- * @param size The size of memory to allocate.
- *
- * @returns a pointer to the allocated memory, or NULL if allocation fails
- */
-
-void* TEST_malloc(size_t size)
-{
-    if (size > 0) {
-        void* const mem = malloc(size);
-        TEST_ASSERT(mem);
-        return mem;
-    }
-    return NULL;
+	return cmp_rand32() >> (32 - n_bits);
 }
diff --git a/test/test_common/test_common.h b/test/test_common/test_common.h
index e27d68a860bd17083712c94e05d9476da3fd61bf..870b083d087600d3534c7b9e300f3750decbefea 100644
--- a/test/test_common/test_common.h
+++ b/test/test_common/test_common.h
@@ -10,8 +10,6 @@ uint32_t cmp_rand32(void);
 
 uint32_t cmp_rand_between(uint32_t min, uint32_t max);
 
-uint32_t cmp_rand_nbits(unsigned int nbits);
-
-void* TEST_malloc(size_t size);
+uint32_t cmp_rand_nbits(unsigned int n_bits);
 
 #endif /* TEST_COMMON_H */
diff --git a/test/tools/generate_test_runner.rb b/test/tools/generate_test_runner.rb
index 50c93f533e45d5aced318fa4b34cf4f853015936..7f3cda00fd15ac82995e542760280f38896f26b1 100755
--- a/test/tools/generate_test_runner.rb
+++ b/test/tools/generate_test_runner.rb
@@ -115,7 +115,7 @@ class UnityTestRunnerGenerator
     # @ is not a valid C character, so there should be no clashes with files genuinely containing these markers
     substring_subs = { '{' => '@co@', '}' => '@cc@', ';' => '@ss@', '/' => '@fs@' }
     substring_re = Regexp.union(substring_subs.keys)
-    substring_unsubs = substring_subs.invert                   # the inverse map will be used to fix the strings afterwords
+    substring_unsubs = substring_subs.invert                   # the inverse map will be used to fix the strings afterwards
     substring_unsubs['@quote@'] = '\\"'
     substring_unsubs['@apos@'] = '\\\''
     substring_unre = Regexp.union(substring_unsubs.keys)