diff --git a/test/cmp_tool/Makefile b/test/cmp_tool/Makefile
index 671acd5582c3e1ef9b8c69ab500a8f3b380c5706..543ea135a4f15e10d25440b3a7e17c9d3e1b41ff 100644
--- a/test/cmp_tool/Makefile
+++ b/test/cmp_tool/Makefile
@@ -3,11 +3,11 @@ SOURCEDIR	 =
 INCLUDES         = -I../../include
 PATH            +=
 CFLAGS          := -O0 -W -Wall -Wextra -std=gnu99 -Werror -pedantic -g3\
-								-fprofile-arcs -ftest-coverage\
-								-fanalyzer
+		-fprofile-arcs -ftest-coverage
 CPPFLAGS        := -D__MAIN__ $(INCLUDES) -I$(SOURCEDIR)
 LDFLAGS         := -lcunit
-SOURCES         := $(wildcard *.c) ../../lib/cmp_tool_lib.c ../../lib/cmp_support.c
+SOURCES         := $(wildcard *.c) ../../lib/cmp_tool_lib.c ../../lib/cmp_guess.c\
+		../../lib/cmp_support.c ../../lib/cmp_icu.c ../../lib/cmp_data_types.c
 OBJECTS         := $(patsubst %.c, $(BUILDDIR)/%.o, $(subst $(SOURCEDIR)/,, $(SOURCES)))
 TARGET          := test_cmp_tool
 
@@ -21,6 +21,5 @@ coverage: all
 	genhtml --rc lcov_branch_coverage=1 --branch-coverage coverage.info --output-directory out
 	#firefox out/index.html
 
-
 clean:
 	rm -r $(TARGET) *.gcno *.gcda coverage.info out/ tmp_stderr.log
diff --git a/test/cmp_tool/cmp_tool_lib_test.c b/test/cmp_tool/cmp_tool_lib_test.c
index bf566e771c8688eba3d51ab275ff70234ed9f619..d55a715acc64053c16c28d585b90cf9387b17375 100644
--- a/test/cmp_tool/cmp_tool_lib_test.c
+++ b/test/cmp_tool/cmp_tool_lib_test.c
@@ -13,9 +13,7 @@
  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  * more details.
  *
- * @brief command line tool for PLATO ICU/RDCU compression/decompression
- * @see README.md
- * @see Data Compression User Manual PLATO-UVIE-PL-UM-0001
+ * @brief unit tests for cmp_tool_lib.c
  */
 
 #include <stdio.h>
@@ -28,13 +26,14 @@
 #include <CUnit/Console.h>
 
 #include "../../include/cmp_tool_lib.h"
+#include "../../include/cmp_guess.h"
 
 #define PROGRAM_NAME "cmp_tool"
 
-/* TODO */
+/* used to redirect stdout to file */
 int fd;
 
-/* TODO */
+/* used to redirect stdout to file */
 fpos_t pos;
 
 /* @brief The init cmp_tool test suite cleanup functionr. Redirect stdout to
@@ -172,7 +171,7 @@ void test_read_file8(void)
 			CU_ASSERT_EQUAL(buf[i], 0);
 		}
 	}
-	CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples parameter.\n");
+	CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples or cmp_size parameter.\n");
 	free(s);
 
 	/* tests read 0 words in */
@@ -185,7 +184,7 @@ void test_read_file8(void)
 	for (i = 0; i < 33; ++i) {
 		CU_ASSERT_EQUAL(buf[i], 0);
 	}
-	CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples parameter.\n");
+	CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples or cmp_size parameter.\n");
 	free(s);
 
 	/* TODO; tests read in 0 empty file */
@@ -258,6 +257,240 @@ void test_read_file8(void)
 }
 
 
+#define CMP_TEST_SAMPLES 5
+void test_cmp_guess(void)
+{
+	struct cmp_cfg cfg = {0};
+	uint16_t data[CMP_TEST_SAMPLES] = {2,4,6,8,10};
+	uint16_t data_exp[CMP_TEST_SAMPLES] = {2,4,6,8,10};
+	uint16_t model[CMP_TEST_SAMPLES] = {4,6,8,10,12};
+	uint16_t model_exp[CMP_TEST_SAMPLES] = {4,6,8,10,12};
+	uint32_t cmp_size;
+	int level;
+
+
+	/* test 1d-diff mode */
+	cfg.input_buf = data;
+	cfg.model_buf = NULL;
+	cfg.samples = CMP_TEST_SAMPLES;
+	cfg.cmp_mode = MODE_DIFF_MULTI;
+	level = 2;
+	cmp_size = cmp_guess(&cfg, level);
+	CU_ASSERT_TRUE(cmp_size);
+
+	CU_ASSERT_EQUAL(cmp_size, 25);
+	CU_ASSERT_EQUAL(cfg.cmp_mode, MODE_DIFF_MULTI);
+	CU_ASSERT_EQUAL(cfg.golomb_par, 1);
+	CU_ASSERT_EQUAL(cfg.spill, 2);
+	/* CU_ASSERT_EQUAL(cfg.model_value, ); model_value is not needed */
+	CU_ASSERT_EQUAL(cfg.round, 0);
+	CU_ASSERT_EQUAL(cfg.ap1_golomb_par, 2);
+	CU_ASSERT_EQUAL(cfg.ap1_spill, 2);
+	CU_ASSERT_EQUAL(cfg.ap2_golomb_par, 3);
+	CU_ASSERT_EQUAL(cfg.ap2_spill, 2);
+	CU_ASSERT_NSTRING_EQUAL(cfg.input_buf, data_exp, CMP_TEST_SAMPLES);
+	/* CU_ASSERT_NSTRING_EQUAL(cfg.model_buf, model_exp, CMP_TEST_SAMPLES); model is
+	 * not used*/
+	CU_ASSERT_EQUAL(cfg.samples, CMP_TEST_SAMPLES);
+	CU_ASSERT_EQUAL(cfg.buffer_length, 2);
+
+
+	/* test model mode */
+	memset(&cfg, 0, sizeof(struct cmp_cfg));
+	cfg.input_buf = data;
+	cfg.model_buf = model;
+	cfg.samples = CMP_TEST_SAMPLES;
+	cfg.cmp_mode = MODE_MODEL_ZERO;
+	level =3;
+
+	cmp_guess_set_model_updates(12);
+	cmp_size = cmp_guess(&cfg, level);
+	CU_ASSERT_TRUE(cmp_size);
+
+	CU_ASSERT_EQUAL(cmp_size, 20);
+	CU_ASSERT_EQUAL(cfg.cmp_mode, 1);
+	CU_ASSERT_EQUAL(cfg.golomb_par, 2);
+	CU_ASSERT_EQUAL(cfg.spill, 22);
+	CU_ASSERT_EQUAL(cfg.model_value, 12);
+	CU_ASSERT_EQUAL(cfg.round, 0);
+	CU_ASSERT_EQUAL(cfg.ap1_golomb_par, 1);
+	CU_ASSERT_EQUAL(cfg.ap1_spill, 8);
+	CU_ASSERT_EQUAL(cfg.ap2_golomb_par, 3);
+	CU_ASSERT_EQUAL(cfg.ap2_spill, 35);
+	CU_ASSERT_NSTRING_EQUAL(cfg.input_buf, data_exp, CMP_TEST_SAMPLES);
+	CU_ASSERT_NSTRING_EQUAL(cfg.model_buf, model_exp, CMP_TEST_SAMPLES);
+	CU_ASSERT_EQUAL(cfg.samples, CMP_TEST_SAMPLES);
+	CU_ASSERT_EQUAL(cfg.buffer_length, 2);
+
+
+	/* test diff mode without model buffer*/
+	cmp_guess_set_model_updates(CMP_GUESS_N_MODEL_UPDATE_DEF);
+	memset(&cfg, 0, sizeof(struct cmp_cfg));
+	cfg.input_buf = data;
+	cfg.model_buf = model;
+	cfg.samples = CMP_TEST_SAMPLES;
+	cfg.cmp_mode = MODE_DIFF_MULTI;
+	level = 3;
+
+	cmp_size = cmp_guess(&cfg, level);
+	CU_ASSERT_TRUE(cmp_size);
+
+	CU_ASSERT_EQUAL(cmp_size, 20);
+	CU_ASSERT_EQUAL(cfg.cmp_mode, MODE_DIFF_MULTI);
+	CU_ASSERT_EQUAL(cfg.golomb_par, 2);
+	CU_ASSERT_EQUAL(cfg.spill, 5);
+	CU_ASSERT_EQUAL(cfg.model_value, 11);
+	CU_ASSERT_EQUAL(cfg.round, 0);
+	CU_ASSERT_EQUAL(cfg.ap1_golomb_par, 1);
+	CU_ASSERT_EQUAL(cfg.ap1_spill, 2);
+	CU_ASSERT_EQUAL(cfg.ap2_golomb_par, 3);
+	CU_ASSERT_EQUAL(cfg.ap2_spill, 2);
+	CU_ASSERT_NSTRING_EQUAL(cfg.input_buf, data_exp, CMP_TEST_SAMPLES);
+	CU_ASSERT_NSTRING_EQUAL(cfg.model_buf, model_exp, CMP_TEST_SAMPLES);
+	CU_ASSERT_EQUAL(cfg.samples, CMP_TEST_SAMPLES);
+	CU_ASSERT_EQUAL(cfg.buffer_length, 2);
+
+
+	/* error test cfg = NULL */
+	level = 2;
+	cmp_size = cmp_guess(NULL, level);
+	CU_ASSERT_FALSE(cmp_size);
+
+
+	/* error test unknown guess_level */
+	level = 4;
+	cmp_size = cmp_guess(&cfg, level);
+	CU_ASSERT_FALSE(cmp_size);
+
+
+	/* error test model mode without model buffer*/
+	memset(&cfg, 0, sizeof(struct cmp_cfg));
+	cfg.input_buf = NULL;
+	cfg.model_buf = NULL;
+	cfg.samples = CMP_TEST_SAMPLES;
+	cfg.cmp_mode = MODE_DIFF_MULTI;
+	level = 2;
+
+	cmp_size = cmp_guess(&cfg, level);
+	CU_ASSERT_FALSE(cmp_size);
+
+
+	/* error test model mode without model buffer*/
+	memset(&cfg, 0, sizeof(struct cmp_cfg));
+	cfg.input_buf = data;
+	cfg.model_buf = NULL;
+	cfg.samples = CMP_TEST_SAMPLES;
+	cfg.cmp_mode = MODE_MODEL_MULTI;
+	level = 2;
+
+	cmp_size = cmp_guess(&cfg, level);
+	CU_ASSERT_FALSE(cmp_size);
+
+
+	/* error test not supported cmp_mode */
+	memset(&cfg, 0, sizeof(struct cmp_cfg));
+	cfg.input_buf = data;
+	cfg.model_buf = model;
+	cfg.samples = CMP_TEST_SAMPLES;
+	cfg.cmp_mode = 5;
+	level = 2;
+
+	cmp_size = cmp_guess(&cfg, level);
+	CU_ASSERT_FALSE(cmp_size);
+
+
+	/* error test samples = 0 */
+	memset(&cfg, 0, sizeof(struct cmp_cfg));
+	cfg.input_buf = data;
+	cfg.model_buf = model;
+	cfg.samples = 0;
+	cfg.cmp_mode = MODE_MODEL_MULTI;
+	level = 2;
+
+	cmp_size = cmp_guess(&cfg, level);
+	CU_ASSERT_FALSE(cmp_size);
+}
+
+void test_cmp_guess_model_value(void)
+{
+	uint16_t model_value;
+
+	model_value = cmp_guess_model_value(0);
+	CU_ASSERT_EQUAL(model_value, 8);
+	model_value = cmp_guess_model_value(1);
+	CU_ASSERT_EQUAL(model_value, 8);
+	model_value = cmp_guess_model_value(2);
+	CU_ASSERT_EQUAL(model_value, 8);
+	model_value = cmp_guess_model_value(3);
+	CU_ASSERT_EQUAL(model_value, 10);
+	model_value = cmp_guess_model_value(4);
+	CU_ASSERT_EQUAL(model_value, 10);
+	model_value = cmp_guess_model_value(5);
+	CU_ASSERT_EQUAL(model_value, 10);
+	model_value = cmp_guess_model_value(6);
+	CU_ASSERT_EQUAL(model_value, 11);
+	model_value = cmp_guess_model_value(10);
+	CU_ASSERT_EQUAL(model_value, 11);
+	model_value = cmp_guess_model_value(11);
+	CU_ASSERT_EQUAL(model_value, 11);
+	model_value = cmp_guess_model_value(12);
+	CU_ASSERT_EQUAL(model_value, 12);
+	model_value = cmp_guess_model_value(20);
+	CU_ASSERT_EQUAL(model_value, 12);
+	model_value = cmp_guess_model_value(21);
+	CU_ASSERT_EQUAL(model_value, 12);
+	model_value = cmp_guess_model_value(22);
+	CU_ASSERT_EQUAL(model_value, 13);
+}
+
+
+void test_cmp_mode_parse(void)
+{
+	uint32_t cmp_mode = ~0;
+	int err;
+
+	/* error cases */
+	err = cmp_mode_parse(NULL, NULL);
+	CU_ASSERT_TRUE(err);
+
+	err = cmp_mode_parse(NULL, &cmp_mode);
+	CU_ASSERT_TRUE(err);
+
+	err = cmp_mode_parse("MODE_RAW", NULL);
+	CU_ASSERT_TRUE(err);
+
+	err = cmp_mode_parse("UNKNOWN", &cmp_mode);
+	CU_ASSERT_TRUE(err);
+
+	err = cmp_mode_parse("9999999999999999999", &cmp_mode);
+	CU_ASSERT_TRUE(err);
+
+	/* mode not defined*/
+	err = cmp_mode_parse("424212", &cmp_mode);
+	CU_ASSERT_TRUE(err);
+
+	/* normal operation */
+	err = cmp_mode_parse("MODE_RAW", &cmp_mode);
+	CU_ASSERT_FALSE(err);
+	CU_ASSERT_EQUAL(cmp_mode, MODE_RAW);
+
+	err = cmp_mode_parse("0", &cmp_mode);
+	CU_ASSERT_FALSE(err);
+	CU_ASSERT_EQUAL(cmp_mode, MODE_RAW);
+
+	err = cmp_mode_parse("0 \n", &cmp_mode);
+	CU_ASSERT_FALSE(err);
+	CU_ASSERT_EQUAL(cmp_mode, MODE_RAW);
+
+	err = cmp_mode_parse(" 2 ", &cmp_mode);
+	CU_ASSERT_FALSE(err);
+	CU_ASSERT_EQUAL(cmp_mode, 2);
+
+	err = cmp_mode_parse("MODE_DIFF_MULTI", &cmp_mode);
+	CU_ASSERT_FALSE(err);
+	CU_ASSERT_EQUAL(cmp_mode, MODE_DIFF_MULTI);
+}
+
 CU_ErrorCode cmp_tool_add_tests(CU_pSuite suite)
 {
 	CU_pTest  __attribute__((unused)) test;
@@ -270,7 +503,10 @@ CU_ErrorCode cmp_tool_add_tests(CU_pSuite suite)
 	}
 
 	/* add the tests to the suite */
-	if ((NULL == CU_add_test(suite, "test of read_file8()", test_read_file8))) {
+	if ((NULL == CU_add_test(suite, "test of read_file8()", test_read_file8)) ||
+	    (NULL == CU_add_test(suite, "test of cmp_mode_parse()", test_cmp_mode_parse))||
+	    (NULL == CU_add_test(suite, "test of cmp_guess_model_value()", test_cmp_guess_model_value))||
+	    (NULL == CU_add_test(suite, "test of cmp_guess()", test_cmp_guess))) {
 		CU_cleanup_registry();
 		return CU_get_error();
 	}