diff --git a/include/gnss_utils/gnss_utils.h b/include/gnss_utils/gnss_utils.h
index 197232cf32167a0cd5fd1fd0fdb8252bb94d20b3..626030968e0fa13278085403435d955227a8a2f3 100644
--- a/include/gnss_utils/gnss_utils.h
+++ b/include/gnss_utils/gnss_utils.h
@@ -18,8 +18,6 @@ extern "C"
     #include "rtklib.h"
 }
 
-#define GNSSUTILS_MSG "--GNSSUtils--"
-
 namespace GNSSUtils
 {
   struct ComputePosOutput{
@@ -45,12 +43,6 @@ namespace GNSSUtils
                                     const prcopt_t & _prcopt);
   
   Eigen::Vector3d ecefToLatLon(const Eigen::Vector3d & _ecef);
-
-  void print(std::string & _msg);
-  void printArray(std::string _name, int * _array, int size);
-  void printArray(std::string _name, unsigned char * _array, int size);
-  void printArray(std::string _name, double * _array, int size);
-  void printArray(std::string _name, float * _array, int size);
 }
 
 #endif
diff --git a/include/gnss_utils/observations.h b/include/gnss_utils/observations.h
index b1e6ab26d22dcbfa7a35578dc39f142c6c44f9a9..e84820c2ab4dc86ef80ee79d06acc59da5047812 100644
--- a/include/gnss_utils/observations.h
+++ b/include/gnss_utils/observations.h
@@ -5,6 +5,8 @@
 #include <iostream>
 #include <memory>
 
+#include "gnss_utils/utils.h"
+
 extern "C"
 {
     #include "rtklib.h"
diff --git a/include/gnss_utils/utils.h b/include/gnss_utils/utils.h
new file mode 100644
index 0000000000000000000000000000000000000000..4d19e40ab78baa88c2d15a78184f7dafa23e357a
--- /dev/null
+++ b/include/gnss_utils/utils.h
@@ -0,0 +1,23 @@
+#ifndef UTILS_H
+#define UTILS_H
+
+#include <vector>
+#include <iostream>
+#include <memory>
+#include <string>
+
+#define ARRAY_SIZE(arr) sizeof(arr)/sizeof(arr[0])
+#define GNSSUTILS_MSG "--GNSSUtils--"
+
+namespace GNSSUtils
+{
+  
+
+  void print(std::string & _msg);
+  void printArray(std::string _name, int * _array, int size);
+  void printArray(std::string _name, unsigned char * _array, int size);
+  void printArray(std::string _name, double * _array, int size);
+  void printArray(std::string _name, float * _array, int size);
+}
+
+#endif
\ No newline at end of file
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index de5d77d2e4c021a1562ced7d450337a4ff22a814..bf6f31f6e439b57c78c3d7a9ed52da3c7462a125 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -6,7 +6,8 @@ SET(RTKLIB_SRC_DIR ${RTKLIB_DIR}/src)
 SET(SOURCES
     gnss_utils.cpp
     observations.cpp
-    navigation.cpp)
+    navigation.cpp
+    utils.cpp)
 
 SET(RTKLIB_SRC
     ${RTKLIB_SRC_DIR}/pntpos.c
@@ -26,6 +27,7 @@ SET(RTKLIB_SRC
 # application header files
 SET(HEADERS
     ../include/gnss_utils/gnss_utils.h
+    ../include/gnss_utils/utils.h
     ../include/gnss_utils/observations.h
     ../include/gnss_utils/navigation.h
   ${RTKLIB_SRC_DIR}/rtklib.h)
diff --git a/src/gnss_utils.cpp b/src/gnss_utils.cpp
index a976c3b2ec1f55e87e63bcc14c0397b6f2485c7a..dcc3f24cc5aa51cb925e9211b4b610f9fe4b1502 100644
--- a/src/gnss_utils.cpp
+++ b/src/gnss_utils.cpp
@@ -61,63 +61,4 @@ namespace GNSSUtils
     return Eigen::Vector3d(pos);
   }
 
-  void print(std::string & _msg) 
-  {
-    std::string msg = GNSSUTILS_MSG + _msg;
-
-    std::cout << msg << "\n";
-     
-  }
-
-  void printArray(std::string _name, int * _array, int size)
-  {  
-    std::cout << _name << ": [";
-    for (int ii=0; ii<size; ++ii)
-    {
-      std::cout << _array[ii];
-      if (ii==size-1) 
-        std::cout << "] \n";
-      else
-        std::cout << ",";
-    }
-  }
-
-  void printArray(std::string _name, unsigned char * _array, int size)
-  {
-    std::cout << _name << ": [";
-    for (int ii=0; ii<size; ++ii)
-    {
-      std::cout << (unsigned)_array[ii];
-      if (ii==size-1) 
-        std::cout << "] \n";
-      else
-        std::cout << ",";
-    }
-  }
-
-  void printArray(std::string _name, double * _array, int size)
-  {   
-    std::cout << _name << ": [";
-    for (int ii=0; ii<size; ++ii)
-    {
-      std::cout << _array[ii];
-      if (ii==size-1) 
-        std::cout << "] \n";
-      else
-        std::cout << ",";
-    }
-  }
-
-  void printArray(std::string _name, float * _array, int size)
-  {   
-    std::cout << _name << ": [";
-    for (int ii=0; ii<size; ++ii)
-    {
-      std::cout << _array[ii];
-      if (ii==size-1) 
-        std::cout << "] \n";
-      else
-        std::cout << ",";
-    }
-  }
 }
diff --git a/src/observations.cpp b/src/observations.cpp
index 9892903180717c65a832ca35dda5cdc428a6fd20..4ef5448237b6e98ba5fc17f92e9f3da2cc3a6a6a 100644
--- a/src/observations.cpp
+++ b/src/observations.cpp
@@ -40,12 +40,12 @@ void Observations::print(obsd_t & _obs)
   std::string msg = "Observation of satellite #" + std::to_string(_obs.sat);
   GNSSUtils::print(msg);
   std::cout << "Time [s]: " << _obs.time.time << "\n";
-  printArray("SNR: ", _obs.SNR, sizeof(_obs.SNR) / sizeof(_obs.SNR[0]));
-  printArray("LLI: ", _obs.LLI, sizeof(_obs.LLI) / sizeof(_obs.LLI[0]));
-  printArray("code: ", _obs.code, sizeof(_obs.code) / sizeof(_obs.code[0]));
-  printArray("L: ", _obs.L, sizeof(_obs.L) / sizeof(_obs.L));
-  printArray("P: ", _obs.P, sizeof(_obs.P) / sizeof(_obs.P));
-  printArray("D: ", _obs.D, sizeof(_obs.D) / sizeof(_obs.D));
+  printArray("SNR: ", _obs.SNR, ARRAY_SIZE(_obs.SNR));
+  printArray("LLI: ", _obs.LLI, ARRAY_SIZE(_obs.LLI));
+  printArray("code: ", _obs.code, ARRAY_SIZE(_obs.code));
+  printArray("L: ", _obs.L, ARRAY_SIZE(_obs.L));
+  printArray("P: ", _obs.P, ARRAY_SIZE(_obs.P));
+  printArray("D: ", _obs.D, ARRAY_SIZE(_obs.D));
 }
 
 void Observations::print(int _obs_idx)
diff --git a/src/utils.cpp b/src/utils.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3e41a0e2461e417c8e3ce267963f681d9ca6614e
--- /dev/null
+++ b/src/utils.cpp
@@ -0,0 +1,66 @@
+#include "gnss_utils/utils.h"
+
+
+namespace GNSSUtils
+{
+void print(std::string & _msg) 
+  {
+    std::string msg = GNSSUTILS_MSG + _msg;
+
+    std::cout << msg << "\n";
+     
+  }
+
+  void printArray(std::string _name, int * _array, int size)
+  {  
+    std::cout << _name << ": [";
+    for (int ii=0; ii<size; ++ii)
+    {
+      std::cout << _array[ii];
+      if (ii==size-1) 
+        std::cout << "] \n";
+      else
+        std::cout << ",";
+    }
+  }
+
+  void printArray(std::string _name, unsigned char * _array, int size)
+  {
+    std::cout << _name << ": [";
+    for (int ii=0; ii<size; ++ii)
+    {
+      std::cout << (unsigned)_array[ii];
+      if (ii==size-1) 
+        std::cout << "] \n";
+      else
+        std::cout << ",";
+    }
+  }
+
+  void printArray(std::string _name, double * _array, int size)
+  {   
+    std::cout << _name << ": [";
+    for (int ii=0; ii<size; ++ii)
+    {
+      std::cout << _array[ii];
+      if (ii==size-1) 
+        std::cout << "] \n";
+      else
+        std::cout << ",";
+    }
+  }
+
+  void printArray(std::string _name, float * _array, int size)
+  {   
+    std::cout << _name << ": [";
+    for (int ii=0; ii<size; ++ii)
+    {
+      std::cout << _array[ii];
+      if (ii==size-1) 
+        std::cout << "] \n";
+      else
+        std::cout << ",";
+    }
+  }
+
+}
\ No newline at end of file