diff --git a/include/gnss_utils/gnss_utils.h b/include/gnss_utils/gnss_utils.h
index d6429ef7f3ea39318ce1248285ea0d6373677248..cbbaa5ee3dfbbad5fb6ba6a15cf9c69dbaf9d221 100644
--- a/include/gnss_utils/gnss_utils.h
+++ b/include/gnss_utils/gnss_utils.h
@@ -56,6 +56,7 @@ namespace GNSSUtils
                 double *resp, char *msg);
 
   Eigen::Vector3d ecefToLatLon(const Eigen::Vector3d & _ecef);
+  Eigen::Vector3d latLonToEcef(const Eigen::Vector3d & _latlon);
 
   double computeSatElevation(const Eigen::Vector3d& receiver_ecef, const Eigen::Vector3d& sat_ecef);
 
diff --git a/include/gnss_utils/navigation.h b/include/gnss_utils/navigation.h
index d93ed0fe4c1715c3ee11bada887674e452dade2f..f448a53268191d131a010eedae9a6a47ab61e96a 100644
--- a/include/gnss_utils/navigation.h
+++ b/include/gnss_utils/navigation.h
@@ -5,7 +5,6 @@
 #include <iostream>
 #include <memory>
 
-
 extern "C"
 {
     #include "rtklib.h"
@@ -13,50 +12,53 @@ extern "C"
 
 namespace GNSSUtils
 {
-  class Navigation
-  {
+class Navigation
+{
     public:
-      // Constructor & Destructor
-      Navigation();
-      ~Navigation();
+        // Constructor & Destructor
+        Navigation();
+        ~Navigation();
 
-      // Public objects
+        // Public objects
 
-      // Public methods
+        // Public methods
 
-      void clearNavigation();
+        void clearNavigation();
 
-      void setNavigation(nav_t nav);
+        void setNavigation(nav_t nav);
+        void loadFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt = 0.0, const char* opt = "");
 
-      const nav_t & getNavigation() const;
-      nav_t & getNavigation();
+        const nav_t & getNavigation() const;
+        nav_t & getNavigation();
 
 
-      /****************** Array memory management ******************/
+        /****************** Array memory management ******************/
+        // Ephemeris
+        bool addEphemeris(const eph_t& eph);
+        bool addGLONASSEphemeris(const geph_t& geph);
+        bool addSBASEphemeris(const seph_t& seph);
+        bool addAlmanac(const alm_t& alm);
 
+        //void allocateEphemeris(int n_sat = MAXSAT);
+        //void deleteEphemeris();
 
-      // Ephemeris
-      void allocateEphemeris(int n_sat = MAXSAT);
-      void deleteEphemeris();
+        //void allocateGLONASSEphemeris(int n_sat = NSATGLO);
+        //void deleteGLONASSEphemeris();
 
-      void allocateGLONASSEphemeris(int n_sat = NSATGLO);
-      void deleteGLONASSEphemeris();
+        //void allocateSBASEphemeris(int n_sat = NSATSBS*2); //SBAS
+        //void deleteSBASEphemeris();
 
-      void allocateSBASEphemeris(int n_sat = NSATSBS*2); //SBAS
-      void deleteSBASEphemeris();
-
-      void allocateAlmanac(int n_sat = MAXSAT);
-      void deleteAlmanac();
-      void print();
+        //void allocateAlmanac(int n_sat = MAXSAT);
+        //void deleteAlmanac();
+        void print();
 
     private:
 
-      // rtklib-like attribute to represent the different navigation msgs for a given epoch
-      nav_t nav_;
-
-      // Private methods
+        // rtklib-like attribute to represent the different navigation msgs for a given epoch
+        nav_t nav_;
 
+        // Private methods
+};
 
-  };
 }
 #endif
diff --git a/include/gnss_utils/observations.h b/include/gnss_utils/observations.h
index 3e7f56e1b116f1d5680680d78f728cdd9e00c8dc..9c72e9d00dbf91e0a453461710fe70f123a36b2d 100644
--- a/include/gnss_utils/observations.h
+++ b/include/gnss_utils/observations.h
@@ -32,6 +32,7 @@ class Observations
         void clearObservations();
 
         void addObservation(const obsd_t & obs);
+        void loadFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt=0.0, const char* opt="");
 
         void removeObservationByIdx(const int& _idx);
         void removeObservationBySat(const int& _sat);
diff --git a/src/examples/gnss_utils_test.cpp b/src/examples/gnss_utils_test.cpp
index 829192b42efaa91ce47317b7d5faabecf9eb6a43..92970a4de850872b3dade941f1219d331efa106c 100644
--- a/src/examples/gnss_utils_test.cpp
+++ b/src/examples/gnss_utils_test.cpp
@@ -1,5 +1,6 @@
 #include "gnss_utils/observations.h"
 #include "gnss_utils/navigation.h"
+#include "gnss_utils/gnss_utils.h"
 
 #include <typeinfo>
 
@@ -15,7 +16,7 @@ extern "C"
 using namespace GNSSUtils;
 
 
-int createObsAndNav(Observations* observations, char* obs_path,  Navigation* navigation, char* nav_path)
+int createObsAndNav(Observations& observations, const char* obs_path,  Navigation& navigation, const char* nav_path)
 {
   // Time
   double ts_d[] = {2018, 5, 17, 14, 1, 2};
@@ -27,17 +28,19 @@ int createObsAndNav(Observations* observations, char* obs_path,  Navigation* nav
   double tint = 0.1;
 
   // Create options container
-  char* opt = "-SYS=G";
+  const char* opt = "-SYS=G";
 
   // Create receiver identifier
   int rcv = 1;
 
   // Create object types
-  rnxopt_t rnx_opt;
+//  rnxopt_t rnx_opt;
 
   // Create obsd_t object to hold the observations
   obs_t obs;
   obs.data = (obsd_t *) malloc(sizeof(obsd_t)*MAXSAT);
+  obs.n = 0;
+  obs.nmax = MAXSAT;
 
   /* header */
   std::cout << "------------" << std::endl;
@@ -47,34 +50,29 @@ int createObsAndNav(Observations* observations, char* obs_path,  Navigation* nav
   if (readrnx(obs_path, rcv, opt, &obs, NULL, NULL))
   {
     sortobs(&obs);
-    obs.data[0].P[0] = 21597659.275;
-    obs.data[1].P[0] = 22348322.550;
-    obs.data[2].P[0] = 20873167.574;
-    obs.data[3].P[0] = 20920707.830;
+    //obs.data[0].P[0] = 21597659.275;
+    //obs.data[1].P[0] = 22348322.550;
+    //obs.data[2].P[0] = 20873167.574;
+    //obs.data[3].P[0] = 20920707.830;
 
     std::cout << "Obs number: " << obs.n << std::endl;
-
-
   }
-
-
   else
   {
     std::cout << "Couldn't load provided observation file" << std::endl;
     return 0;
   }
 
-
-
   for (int i=0; i < obs.n; i++)
   {
     std::cout << "time: " << time_str(obs.data[i].time, 3) <<  " | sat: " << int(obs.data[i].sat) << " | rcv: " << int(obs.data[i].rcv) <<
                " | SNR: " << int(obs.data[i].SNR[0]) << " | LLI: " << int(obs.data[i].LLI[0]) << " | code: " << int(obs.data[i].code[0]) <<
                  " | L: " << obs.data[i].L[0] <<  " | P: " << obs.data[i].P[0] << " | D: " << obs.data[i].D[0] << std::endl;
-    observations->addObservation(obs.data[i]);
+    observations.addObservation(obs.data[i]);
   }
 
   free(obs.data);
+  observations.print();
 
   /* header */
   std::cout << "----------" << std::endl;
@@ -82,17 +80,17 @@ int createObsAndNav(Observations* observations, char* obs_path,  Navigation* nav
   std::cout << "----------" << std::endl;
 
   /* Load _nav attribute into nav variable */
-  nav_t nav = navigation->getNavigation();
+  //nav_t nav = navigation.getNavigation();
 
 
-  if (readrnx(nav_path, rcv, opt, NULL, &nav, NULL))
+  if (readrnx(nav_path, 1, opt, NULL, &navigation.getNavigation(), NULL))
   {
     std::cout << "Navigation file loaded." << std::endl;
-    std::cout << "GPS satellites in navigation file: " << nav.n << std::endl;
-    std::cout << "GLONASS satellites in navigation file: " << nav.ng << std::endl;
-    std::cout << "SBAS satellites in navigation file: " << nav.ns << std::endl;
-    std::cout << "Almanac satellites in navigation file: " << nav.na << std::endl;
-    uniqnav(&nav);
+    std::cout << "GPS satellites in navigation file: " << navigation.getNavigation().n << std::endl;
+    std::cout << "GLONASS satellites in navigation file: " << navigation.getNavigation().ng << std::endl;
+    std::cout << "SBAS satellites in navigation file: " << navigation.getNavigation().ns << std::endl;
+    std::cout << "Almanac satellites in navigation file: " << navigation.getNavigation().na << std::endl;
+    uniqnav(&navigation.getNavigation());
   }
 
 
@@ -104,30 +102,45 @@ int createObsAndNav(Observations* observations, char* obs_path,  Navigation* nav
 
 
   /* Print Constellation Satellites ids */
-  for (int i=0;i<nav.n;i++)
+  for (int i=0;i<navigation.getNavigation().n;i++)
   {
-    std::cout <<  i << " GPS Sat Id: " << nav.eph[i].sat << std::endl;
+    std::cout <<  i << " GPS Sat Id: " << navigation.getNavigation().eph[i].sat << std::endl;
   }
 
-  for (int i=0;i<nav.ng;i++)
+  for (int i=0;i<navigation.getNavigation().ng;i++)
   {
-    std::cout <<  i << " GLONASS Sat Id: " << nav.geph[i].sat << std::endl;
+    std::cout <<  i << " GLONASS Sat Id: " << navigation.getNavigation().geph[i].sat << std::endl;
   }
 
-  for (int i=0;i<nav.ns;i++)
+  for (int i=0;i<navigation.getNavigation().ns;i++)
   {
-    std::cout <<  i << " SBAS Sat Id: " << nav.seph[i].sat << std::endl;
+    std::cout <<  i << " SBAS Sat Id: " << navigation.getNavigation().seph[i].sat << std::endl;
   }
 
 
   /* Load nav into Navigation object*/
-  navigation->setNavigation(nav);
+  //navigation.setNavigation(nav);
 
   std::cout << "Navigation message loaded to Navigation class." << std::endl;
 
   return 1;
 }
 
+
+void createObsAndNavNew(Observations& observations, const std::string& obs_path,  Navigation& navigation, const std::string& nav_path)
+{
+  gtime_t t_start{0,0}; // no limit
+  gtime_t t_end{0,0};   // no limit
+  double dt = 0.0;      // no limit
+  const char* opt = "-SYS=G"; // only GPS | GPS+GAL: "-SYS=G,L" | ALL: ""
+
+  observations.loadFromRinex(obs_path, t_start, t_end, dt, opt);
+  observations.print();
+
+  navigation.loadFromRinex(nav_path, t_start, t_end, dt, opt);
+  navigation.print();
+}
+
 int main(int argc, char *argv[])
 {
   /* header */
@@ -137,16 +150,13 @@ int main(int argc, char *argv[])
 
 
   // create Observations object
-  Observations observations;
+  Observations observations, observations2;
 
   // create Navigation object
-  Navigation navigation;
-
-  createObsAndNav(&observations, "../src/examples/raw_201805171357.obs", &navigation, "../src/examples/raw_201805171357.nav");
+  Navigation navigation,navigation2;
 
-  nav_t nav = navigation.getNavigation();
-
-  std::cout << "Navigation eph number " << nav.n << std::endl;
+  createObsAndNav(observations, "../src/examples/raw_201805171357.obs", navigation, "../src/examples/raw_201805171357.nav");
+  createObsAndNavNew(observations2, "../src/examples/raw_201805171357.obs", navigation2, "../src/examples/raw_201805171357.nav");
 
   /* Set processing options */
 
@@ -160,19 +170,20 @@ int main(int argc, char *argv[])
   prcopt.soltype = 0;
   prcopt.nf = 1;
   prcopt.navsys = SYS_GPS;
-  //prcopt.elmin = 1.05;  // 60 degrees = 1.05 rad
+  prcopt.elmin = 0.525;  // 60 degrees = 1.05 rad
   prcopt.sateph = EPHOPT_BRDC;
   prcopt.ionoopt = IONOOPT_OFF;
   prcopt.tropopt = TROPOPT_OFF;
   prcopt.dynamics = 0;
   prcopt.tidecorr = 0;
   prcopt.sbascorr = SBSOPT_FCORR;
-  prcopt.ru[0] = 4789374.0336;
-  prcopt.ru[1] = 177048.3292;
-  prcopt.ru[2] = 4194542.6444;
+  prcopt.ru[0] = 0;//4789374.0336;
+  prcopt.ru[1] = 0;//177048.3292;
+  prcopt.ru[2] = 0;//4194542.6444;
 
   std::cout << "Processing options defined" << std::endl;
 
+  Eigen::Vector3d lla_gt(41.383293114*M_PI/180.0, 2.116101115*M_PI/180.0, -91.6641);
 
   //Compute spp
 
@@ -187,8 +198,9 @@ int main(int argc, char *argv[])
 
   char msg[128]="";
 
-  std::vector<obsd_t> obs = observations.getObservations();
 
+  std::cout << "OBS1:\n";
+  std::vector<obsd_t> obs = observations.getObservations();
   for (int i=0; i < obs.size(); i++)
   {
     std::cout << "time: " << time_str(obs[i].time, 3) <<  " | sat: " << int(obs[i].sat) << " | rcv: " << int(obs[i].rcv) <<
@@ -198,12 +210,37 @@ int main(int argc, char *argv[])
 
   std::cout << "obs.size(): " << obs.size() << std::endl;
 
-  stat = pntpos(&obs[0], obs.size(), &nav, &prcopt, &solb, NULL, NULL, msg);
+  stat = pntpos(&obs[0], obs.size(), &navigation.getNavigation(), &prcopt, &solb, NULL, NULL, msg);
+
+  std::cout << "msg: " << msg << std::endl;
+
+  std::cout << "sol.stat: " << int(solb.stat) << std::endl;
+
+  std::cout << "Position: " << solb.rr[0] << ", " << solb.rr[1] << ", " << solb.rr[2] << std::endl;
+  std::cout << "Position GT: " << latLonToEcef(lla_gt).transpose() << std::endl;
+  std::cout << "Position LLA: " << ecefToLatLon(Eigen::Vector3d(solb.rr[0],solb.rr[1],solb.rr[2])).transpose() << std::endl;
+  std::cout << "Position GT LLA: " << lla_gt.transpose() << std::endl;
+
+  std::cout << "OBS2:\n";
+  std::vector<obsd_t> obs2 = observations2.getObservations();
+  for (int i=0; i < obs2.size(); i++)
+  {
+    std::cout << "time: " << time_str(obs2[i].time, 3) <<  " | sat: " << int(obs2[i].sat) << " | rcv: " << int(obs2[i].rcv) <<
+               " | SNR: " << int(obs2[i].SNR[0]) << " | LLI: " << int(obs2[i].LLI[0]) << " | code: " << int(obs2[i].code[0]) <<
+                 " | L: " << obs2[i].L[0] <<  " | P: " << obs2[i].P[0] << " | D: " << obs2[i].D[0] << std::endl;
+  }
+
+  std::cout << "obs2.size(): " << obs2.size() << std::endl;
+
+  stat = pntpos(&obs2[0], obs2.size(), &navigation.getNavigation(), &prcopt, &solb, NULL, NULL, msg);
 
   std::cout << "msg: " << msg << std::endl;
 
-  std::cout << "sol.stat: " << solb.stat << std::endl;
+  std::cout << "sol.stat: " << int(solb.stat) << std::endl;
 
   std::cout << "Position: " << solb.rr[0] << ", " << solb.rr[1] << ", " << solb.rr[2] << std::endl;
+  std::cout << "Position GT: " << latLonToEcef(lla_gt).transpose() << std::endl;
+  std::cout << "Position LLA: " << ecefToLatLon(Eigen::Vector3d(solb.rr[0],solb.rr[1],solb.rr[2])).transpose() << std::endl;
+  std::cout << "Position GT LLA: " << lla_gt.transpose() << std::endl;
 
 }
diff --git a/src/gnss_utils.cpp b/src/gnss_utils.cpp
index c7b69bc3fa6cb1ac8a061477ad8ab614efa0926b..ff9621aa036998d61c1003aaaf5626376a7fa7b2 100644
--- a/src/gnss_utils.cpp
+++ b/src/gnss_utils.cpp
@@ -255,6 +255,14 @@ Eigen::Vector3d ecefToLatLon(const Eigen::Vector3d & _ecef)
     return pos;
 }
 
+Eigen::Vector3d latLonToEcef(const Eigen::Vector3d & _pos)
+{
+    Eigen::Vector3d ecef;
+    pos2ecef(_pos.data(), ecef.data());
+
+    return ecef;
+}
+
 double computeSatElevation(const Eigen::Vector3d& receiver_ecef, const Eigen::Vector3d& sat_ecef)
 {
     // ecef 2 geodetic
diff --git a/src/navigation.cpp b/src/navigation.cpp
index d53cf51287ae59572b4885aa0fba47cf0420dbe4..f9326b7fbddd9a36dcb92e841e2a2be79e27d27c 100644
--- a/src/navigation.cpp
+++ b/src/navigation.cpp
@@ -6,24 +6,24 @@ using namespace GNSSUtils;
 
 Navigation::Navigation()
 {
-    allocateEphemeris(0);
-    allocateGLONASSEphemeris(0);
-    allocateSBASEphemeris(0);
-    allocateAlmanac(0);
+//    allocateEphemeris(0);
+//    allocateGLONASSEphemeris(0);
+//    allocateSBASEphemeris(0);
+//    allocateAlmanac(0);
 }
 
 Navigation::~Navigation()
 {
   clearNavigation();
-  //free(_nav);
 }
 
 void Navigation::clearNavigation()
 {
-  deleteEphemeris();
-  deleteGLONASSEphemeris();
-  deleteSBASEphemeris();
-  deleteAlmanac();
+    freenav(&nav_,255);
+//  deleteEphemeris();
+//  deleteGLONASSEphemeris();
+//  deleteSBASEphemeris();
+//  deleteAlmanac();
 }
 
 void Navigation::setNavigation(nav_t _nav)
@@ -42,56 +42,157 @@ nav_t & Navigation::getNavigation()
   return nav_;
 }
 
-
-/****************** Array memory management ******************/
-void Navigation::allocateEphemeris(int n_sat)
-{
-  eph_t eph0 ={0,-1,-1};
-  int i;
-  nav_.eph = (eph_t *) malloc(sizeof(eph_t)*n_sat);
-  for (i=0;i<n_sat;i++) nav_.eph[i] = eph0;
-}
-void Navigation::deleteEphemeris()
+void Navigation::loadFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt, const char* opt)
 {
-  free(nav_.eph);
+    auto stat = readrnxt(rnx_file.c_str(), 1, t_start, t_end, dt, opt, NULL, &nav_, NULL);
+    if (stat == 0)
+    {
+        std::cout << "Navigation file loaded." << std::endl;
+        std::cout << "GPS satellites in navigation file: " << nav_.n << std::endl;
+        std::cout << "GLONASS satellites in navigation file: " << nav_.ng << std::endl;
+        std::cout << "SBAS satellites in navigation file: " << nav_.ns << std::endl;
+        std::cout << "Almanac satellites in navigation file: " << nav_.na << std::endl;
+        uniqnav(&nav_);
+    }
+    else
+        std::cout << "Couldn't load provided observation file, reason: " << (stat == 0 ? "no data" : "error") << std::endl;
 }
 
-void Navigation::allocateGLONASSEphemeris(int n_sat)
+bool Navigation::addEphemeris(const eph_t& eph)
 {
-  geph_t geph0={0,-1};
-  int i;
-  nav_.geph = (geph_t *)malloc(sizeof(geph_t)*n_sat);
+    // "inspired" from RTKLIB rinex.c
+    eph_t *nav_eph;
+
+    if (nav_.nmax<=nav_.n) {
+        nav_.nmax+=1024;
+        if (!(nav_eph=(eph_t *)realloc(nav_.eph,sizeof(eph_t)*nav_.nmax))) {
+            printf("addEphemeris malloc error: n=%d\n",nav_.nmax);
+            free(nav_.eph); nav_.eph=NULL; nav_.n=nav_.nmax=0;
+            return false;
+        }
+        nav_.eph=nav_eph;
+    }
+    nav_.eph[nav_.n++]=eph;
+    return true;
 }
-void Navigation::deleteGLONASSEphemeris()
+bool Navigation::addGLONASSEphemeris(const geph_t& geph)
 {
-  free(nav_.geph);
+    // "inspired" from RTKLIB rinex.c
+    geph_t *nav_geph;
+
+    if (nav_.ngmax<=nav_.ng) {
+        nav_.ngmax+=1024;
+        if (!(nav_geph=(geph_t *)realloc(nav_.geph,sizeof(geph_t)*nav_.ngmax))) {
+            printf("addGLONASSEphemeris malloc error: n=%d\n",nav_.ngmax);
+            free(nav_.geph); nav_.geph=NULL; nav_.ng=nav_.ngmax=0;
+            return false;
+        }
+        nav_.geph=nav_geph;
+    }
+    nav_.geph[nav_.ng++]=geph;
+    return true;
 }
-
-void Navigation::allocateSBASEphemeris(int n_sat)
+bool Navigation::addSBASEphemeris(const seph_t& seph)
 {
-  seph_t seph0={0};
-  int i;
-
-  nav_.seph = (seph_t *)malloc(sizeof(seph_t)*n_sat);
-  for (i=0; i<n_sat; i++) nav_.seph[i] = seph0;
+    // "inspired" from RTKLIB rinex.c
+    seph_t *nav_seph;
+
+    if (nav_.nsmax<=nav_.ns) {
+        nav_.nsmax+=1024;
+        if (!(nav_seph=(seph_t *)realloc(nav_.seph,sizeof(seph_t)*nav_.nsmax))) {
+            printf("addSBASEphemeris malloc error: n=%d\n",nav_.nsmax);
+            free(nav_.seph); nav_.seph=NULL; nav_.ns=nav_.nsmax=0;
+            return false;
+        }
+        nav_.seph=nav_seph;
+    }
+    nav_.seph[nav_.ns++]=seph;
+    return true;
 }
-void Navigation::deleteSBASEphemeris()
+bool Navigation::addAlmanac(const alm_t& alm)
 {
-  free(nav_.seph);
+    // "inspired" from RTKLIB rinex.c
+    alm_t *nav_alm;
+
+    if (nav_.namax<=nav_.na) {
+        nav_.namax+=1024;
+        if (!(nav_alm=(alm_t *)realloc(nav_.alm,sizeof(alm_t)*nav_.namax))) {
+            printf("addAlmanac malloc error: n=%d\n",nav_.namax);
+            free(nav_.alm); nav_.alm=NULL; nav_.na=nav_.namax=0;
+            return false;
+        }
+        nav_.alm=nav_alm;
+    }
+    nav_.alm[nav_.na++]=alm;
+    return true;
 }
 
-void Navigation::allocateAlmanac(int n_sat)
-{
-  alm_t  alm0 ={0,-1};
-  int i;
-
-  nav_.alm = (alm_t *)malloc(sizeof(alm_t)*n_sat);
-  for (i=0; i<n_sat; i++) nav_.alm[i] = alm0;
-}
-void Navigation::deleteAlmanac()
-{
-  free(nav_.alm);
-}
+/****************** Array memory management ******************/
+//void Navigation::allocateEphemeris(int n_sat)
+//{
+//  eph_t eph0 ={0,-1,-1};
+//  int i;
+//  nav_.eph = (eph_t *) malloc(sizeof(eph_t)*n_sat);
+//  for (i=0;i<n_sat;i++) nav_.eph[i] = eph0;
+//}
+//void Navigation::deleteEphemeris()
+//{
+//    std::cout << "Navigation::deleteEphemeris...\n";
+//    free(nav_.eph);
+//    nav_.eph =NULL;
+//    nav_.n = 0;
+//    nav_.nmax =0;
+//    std::cout << "deleted!\n";
+//}
+
+//void Navigation::allocateGLONASSEphemeris(int n_sat)
+//{
+//  geph_t geph0={0,-1};
+//  int i;
+//  nav_.geph = (geph_t *)malloc(sizeof(geph_t)*n_sat);
+//}
+//void Navigation::deleteGLONASSEphemeris()
+//{
+//    std::cout << "Navigation::deleteGLONASSEphemeris...\n";
+//  free(nav_.geph);
+//  nav_.geph =NULL;
+//  nav_.ng = 0;
+//  nav_.ngmax =0;
+//  std::cout << "deleted!\n";
+//}
+
+//void Navigation::allocateSBASEphemeris(int n_sat)
+//{
+//  seph_t seph0={0};
+//  int i;
+//
+//  nav_.seph = (seph_t *)malloc(sizeof(seph_t)*n_sat);
+//  for (i=0; i<n_sat; i++) nav_.seph[i] = seph0;
+//}
+//void Navigation::deleteSBASEphemeris()
+//{
+//    std::cout << "Navigation::deleteSBASEphemeris...\n";
+//  free(nav_.seph);
+//  nav_.seph =NULL;
+//  nav_.ns = 0;
+//  nav_.nsmax =0;
+//  std::cout << "deleted!\n";
+//}
+
+//void Navigation::allocateAlmanac(int n_sat)
+//{
+//  alm_t  alm0 ={0,-1};
+//  int i;
+//
+//  nav_.alm = (alm_t *)malloc(sizeof(alm_t)*n_sat);
+//  for (i=0; i<n_sat; i++) nav_.alm[i] = alm0;
+//}
+//void Navigation::deleteAlmanac()
+//{
+//    std::cout << "Navigation::deleteAlmanac...\n";
+//  free(nav_.alm);
+//  std::cout << "deleted!\n";
+//}
 
 void Navigation::print()
 {
diff --git a/src/observations.cpp b/src/observations.cpp
index 3ac4ee43fcba98225ce52878877372cbae484243..59d1dfb0020c5f9ad42aa0a7599f2ee183d8d16b 100644
--- a/src/observations.cpp
+++ b/src/observations.cpp
@@ -29,11 +29,39 @@ void Observations::addObservation(const obsd_t & obs)
     sat_2_idx_[obs.sat] = obs_.size()-1;
 }
 
+void Observations::loadFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt, const char* opt)
+{
+    obs_t obs;
+    obs.data = (obsd_t *) malloc(sizeof(obsd_t)*MAXSAT);
+    obs.n = 0;
+    obs.nmax = MAXSAT;
+
+    //const char* opt = "";
+    auto stat = readrnxt(rnx_file.c_str(), 1, t_start, t_end, dt, opt, &obs, NULL, NULL);
+    if (stat == 1)
+        sortobs(&obs);
+    else
+    {
+        std::cout << "Couldn't load provided observation file, reason: " << (stat == 0 ? "no data" : "error") << std::endl;
+        return;
+    }
+
+    for (int i=0; i < obs.n; i++)
+    {
+        // std::cout << "time: " << time_str(obs.data[i].time, 3) <<  " | sat: " << int(obs.data[i].sat) << " | rcv: " << int(obs.data[i].rcv) <<
+        //           " | SNR: " << int(obs.data[i].SNR[0]) << " | LLI: " << int(obs.data[i].LLI[0]) << " | code: " << int(obs.data[i].code[0]) <<
+        //             " | L: " << obs.data[i].L[0] <<  " | P: " << obs.data[i].P[0] << " | D: " << obs.data[i].D[0] << std::endl;
+        addObservation(obs.data[i]);
+    }
+
+    free(obs.data);
+}
+
 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";
+  std::cout << "Time [s]: " << _obs.time.time << " + " << _obs.time.sec << "\n";
   printArray("SNR: ", _obs.SNR, ARRAY_SIZE(_obs.SNR));
   printArray("LLI: ", _obs.LLI, ARRAY_SIZE(_obs.LLI));
   printArray("code: ", _obs.code, ARRAY_SIZE(_obs.code));