diff --git a/include/gnss_utils/observations.h b/include/gnss_utils/observations.h
index f41812f2a64ebf5515b47b7a1b7564add10a8cde..f0715dc58893ee4fe3e3b48868089cbc5c480923 100644
--- a/include/gnss_utils/observations.h
+++ b/include/gnss_utils/observations.h
@@ -26,6 +26,7 @@ class Observations
     public:
         // Constructor & Destructor
         Observations();
+        Observations(const Observations& obs);
         ~Observations();
 
         // Public objects
diff --git a/src/observations.cpp b/src/observations.cpp
index 3b2e5fe28b683427e90d16a67111f0ef9a31197f..1b39857bbe0252fdf45491c6ebba405c42c8c051 100644
--- a/src/observations.cpp
+++ b/src/observations.cpp
@@ -10,6 +10,31 @@ Observations::Observations()
 
 }
 
+Observations::Observations(const Observations& obs)
+    : sat_2_idx_(obs.sat_2_idx_)
+    , idx_2_sat_(obs.idx_2_sat_)
+    , obs_(obs.obs_.size())
+{
+    // copy all elements
+    for (auto i = 0; i<obs.obs_.size(); i++)
+    {
+        obs_[i].time       = obs.obs_[i].time;
+        obs_[i].eventime   = obs.obs_[i].eventime;
+        obs_[i].timevalid  = obs.obs_[i].timevalid;
+        obs_[i].sat        = obs.obs_[i].sat;
+        obs_[i].rcv        = obs.obs_[i].rcv;
+        std::copy(obs.obs_[i].SNR,      obs.obs_[i].SNR + NFREQ+NEXOBS,     obs_[i].SNR);
+        std::copy(obs.obs_[i].LLI,      obs.obs_[i].LLI + NFREQ+NEXOBS,     obs_[i].LLI);
+        std::copy(obs.obs_[i].code,     obs.obs_[i].code + NFREQ+NEXOBS,    obs_[i].code);
+        std::copy(obs.obs_[i].qualL,    obs.obs_[i].qualL + NFREQ+NEXOBS,   obs_[i].qualL);
+        std::copy(obs.obs_[i].qualP,    obs.obs_[i].qualP + NFREQ+NEXOBS,   obs_[i].qualP);
+        obs_[i].freq = obs.obs_[i].freq;
+        std::copy(obs.obs_[i].L, obs.obs_[i].L + NFREQ+NEXOBS, obs_[i].L);
+        std::copy(obs.obs_[i].P, obs.obs_[i].P + NFREQ+NEXOBS, obs_[i].P);
+        std::copy(obs.obs_[i].D, obs.obs_[i].D + NFREQ+NEXOBS, obs_[i].D);
+    }
+}
+
 Observations::~Observations()
 {
 }
@@ -28,19 +53,20 @@ void Observations::addObservation(const obsd_t & obs)
 
     // copy obsd_t object
     obsd_t copy_obs;
-    std::copy(obs.D, obs.D + 3, copy_obs.D);
-    std::copy(obs.L, obs.L + 3, copy_obs.L);
-    std::copy(obs.LLI, obs.LLI + 3, copy_obs.LLI);
-    std::copy(obs.P, obs.P + 3, copy_obs.P);
-    std::copy(obs.SNR, obs.SNR + 3, copy_obs.SNR);
-    std::copy(obs.code, obs.code + 3, copy_obs.code);
-    std::copy(obs.qualL, obs.qualL + 3, copy_obs.qualL);
-    copy_obs.eventime = obs.eventime;
+    copy_obs.time       = obs.time;
+    copy_obs.eventime   = obs.eventime;
+    copy_obs.timevalid  = obs.timevalid;
+    copy_obs.sat        = obs.sat;
+    copy_obs.rcv        = obs.rcv;
+    std::copy(obs.SNR,      obs.SNR + NFREQ+NEXOBS,     copy_obs.SNR);
+    std::copy(obs.LLI,      obs.LLI + NFREQ+NEXOBS,     copy_obs.LLI);
+    std::copy(obs.code,     obs.code + NFREQ+NEXOBS,    copy_obs.code);
+    std::copy(obs.qualL,    obs.qualL + NFREQ+NEXOBS,   copy_obs.qualL);
+    std::copy(obs.qualP,    obs.qualP + NFREQ+NEXOBS,   copy_obs.qualP);
     copy_obs.freq = obs.freq;
-    copy_obs.rcv = obs.rcv;
-    copy_obs.sat = obs.sat;
-    copy_obs.time = obs.time;
-    copy_obs.timevalid = obs.timevalid;
+    std::copy(obs.L, obs.L + NFREQ+NEXOBS, copy_obs.L);
+    std::copy(obs.P, obs.P + NFREQ+NEXOBS, copy_obs.P);
+    std::copy(obs.D, obs.D + NFREQ+NEXOBS, copy_obs.D);
 
     assert(!hasSatellite(copy_obs.sat) && "adding an observation of a satellite already stored!");
     this->obs_.push_back(copy_obs);