diff --git a/vpdecc/vpdecc.h b/vpdecc/vpdecc.h
index 9995192..2286abe 100644
--- a/vpdecc/vpdecc.h
+++ b/vpdecc/vpdecc.h
@@ -18,63 +18,63 @@
 {
 #endif
 
-    /* TODO  doxygen !!!!!!!! */
+/* TODO  doxygen !!!!!!!! */
 
-    /******************************************************************************/
-    /* vpdecc_create_ecc */
-    /*                                                                            */
-    /* For a given data block (together with the length of the data block */
-    /* this function creates the ECC */
-    /*                                                                            */
-    /* @param     pData           In-Buffer containing the raw VPD data */
-    /*                                            (wont't be changed) */
-    /*                                                                            */
-    /* @param     vDataLength     In        should contain the length of the
-     * Data */
-    /*                                      in the buffer given to vData */
-    /*                                                                            */
-    /* @param     pEcc            Out-Buffer after execution this will be the */
-    /*                                      buffer for the calculated Ecc */
-    /*                                                                            */
-    /* @param     pEccLenght      In/Out    In : size of buffer */
-    /*                                      Out: contains the length of the Ecc
-     */
-    /*                                                                            */
-    /* @return Error returncode */
-    /******************************************************************************/
-    int vpdecc_create_ecc(const unsigned char* data, size_t datalength,
-                          unsigned char* ecc, size_t* ecc_buffersize);
+/******************************************************************************/
+/* vpdecc_create_ecc */
+/*                                                                            */
+/* For a given data block (together with the length of the data block */
+/* this function creates the ECC */
+/*                                                                            */
+/* @param     pData           In-Buffer containing the raw VPD data */
+/*                                            (wont't be changed) */
+/*                                                                            */
+/* @param     vDataLength     In        should contain the length of the
+ * Data */
+/*                                      in the buffer given to vData */
+/*                                                                            */
+/* @param     pEcc            Out-Buffer after execution this will be the */
+/*                                      buffer for the calculated Ecc */
+/*                                                                            */
+/* @param     pEccLenght      In/Out    In : size of buffer */
+/*                                      Out: contains the length of the Ecc
+ */
+/*                                                                            */
+/* @return Error returncode */
+/******************************************************************************/
+int vpdecc_create_ecc(const unsigned char* data, size_t datalength,
+                      unsigned char* ecc, size_t* ecc_buffersize);
 
-    /******************************************************************************/
-    /* vpdecc_check_data */
-    /*                                                                            */
-    /* For a given data block (together with the ecc) */
-    /* this function checks the data for validness */
-    /*                                                                            */
-    /* @param     pData           In-Buffer containing the raw VPD data */
-    /*                            Out-Buffer containing the raw VPD data */
-    /*                                      No error           : data unchanged
-     */
-    /*                                      Correctable error  : data corrected
-     */
-    /*                                      Uncorrectable error: data unchanged
-     */
-    /*                                                                            */
-    /* @param     vDataLength     In        should contain the length of the
-     * Data */
-    /*                                      in the buffer given to vData */
-    /*                                                                            */
-    /* @param     pEcc            In-Buffer should contain the Ecc for the data
-     */
-    /*                                                                            */
-    /*                                                                            */
-    /* @param     vEccLenght      In        should contain the length of the Ecc
-     */
-    /*                                                                            */
-    /* @return Error returncode */
-    /******************************************************************************/
-    int vpdecc_check_data(unsigned char* data, size_t data_length,
-                          const unsigned char* ecc, size_t ecc_length);
+/******************************************************************************/
+/* vpdecc_check_data */
+/*                                                                            */
+/* For a given data block (together with the ecc) */
+/* this function checks the data for validness */
+/*                                                                            */
+/* @param     pData           In-Buffer containing the raw VPD data */
+/*                            Out-Buffer containing the raw VPD data */
+/*                                      No error           : data unchanged
+ */
+/*                                      Correctable error  : data corrected
+ */
+/*                                      Uncorrectable error: data unchanged
+ */
+/*                                                                            */
+/* @param     vDataLength     In        should contain the length of the
+ * Data */
+/*                                      in the buffer given to vData */
+/*                                                                            */
+/* @param     pEcc            In-Buffer should contain the Ecc for the data
+ */
+/*                                                                            */
+/*                                                                            */
+/* @param     vEccLenght      In        should contain the length of the Ecc
+ */
+/*                                                                            */
+/* @return Error returncode */
+/******************************************************************************/
+int vpdecc_check_data(unsigned char* data, size_t data_length,
+                      const unsigned char* ecc, size_t ecc_length);
 
 #ifdef __cplusplus
 } /* end extern "C" */
