diff --git a/src/rtcm3.c b/src/rtcm3.c
index ac06c50664b966c4183edbe23ad12cc98bf68ce4..693a2cb5249e31237c6fc101da1d7efa6719dbcf 100644
--- a/src/rtcm3.c
+++ b/src/rtcm3.c
@@ -1875,6 +1875,7 @@ static void save_msm_obs(rtcm_t *rtcm, int sys, msm_h_t *h, const double *r,
                     fn=ex[i]-7;
                     wl=CLIGHT/((freq[k]==2?FREQ2_GLO:FREQ1_GLO)+
                                (freq[k]==2?DFRQ2_GLO:DFRQ1_GLO)*fn);
+                    rtcm->obs.data[index].freq=(char)ex[i];
                 }
                 /* pseudorange (m) */
                 if (r[i]!=0.0&&pr[j]>-1E12) {
diff --git a/src/rtcm3e.c b/src/rtcm3e.c
index 7b03933748782279a2757c79303a9e3809b67cce..f4e7dc6e63cdf5872606f93c6bfcf9ac76a8063c 100644
--- a/src/rtcm3e.c
+++ b/src/rtcm3e.c
@@ -92,11 +92,19 @@ static double locktime_d(gtime_t time, gtime_t *lltime, unsigned char LLI)
     return timediff(time,*lltime);
 }
 /* glonass frequency channel number in rtcm (0-13,-1:error) ------------------*/
-static int fcn_glo(int sat, rtcm_t *rtcm)
+static int fcn_glo(int sat, rtcm_t *rtcm, int obs_index)
 {
-    int prn;
-    if (satsys(sat,&prn)!=SYS_GLO||rtcm->nav.geph[prn-1].sat!=sat) return -1;
-    return rtcm->nav.geph[prn-1].frq+7;
+    int prn,fcn;
+
+    if (satsys(sat,&prn)!=SYS_GLO) return -1;
+    if (rtcm->nav.geph[prn-1].sat==sat) {
+        fcn=rtcm->nav.geph[prn-1].frq+7;
+    } else {
+        /* if freq slot not available from nav data check MSM obs data */
+        fcn=(int)rtcm->obs.data[obs_index].freq;
+        if (fcn>13) fcn=-1;  // set invalid result flag */
+    }
+    return fcn;
 }
 /* lock time indicator (ref [2] table 3.4-2) ---------------------------------*/
 static int to_lock(int lock)
@@ -524,7 +532,7 @@ static int encode_type1005(rtcm_t *rtcm, int sync)
     setbitu(rtcm->buff,i, 6,0          ); i+= 6; /* itrf realization year */
     setbitu(rtcm->buff,i, 1,1          ); i+= 1; /* gps indicator */
     setbitu(rtcm->buff,i, 1,1          ); i+= 1; /* glonass indicator */
-    setbitu(rtcm->buff,i, 1,0          ); i+= 1; /* galileo indicator */
+    setbitu(rtcm->buff,i, 1,1          ); i+= 1; /* galileo indicator */
     setbitu(rtcm->buff,i, 1,0          ); i+= 1; /* ref station indicator */
     set38bits(rtcm->buff,i,p[0]/0.0001 ); i+=38; /* antenna ref point ecef-x */
     setbitu(rtcm->buff,i, 1,1          ); i+= 1; /* oscillator indicator */
@@ -631,7 +639,7 @@ static int encode_type1009(rtcm_t *rtcm, int sync)
     for (j=0;j<rtcm->obs.n&&nsat<MAXOBS;j++) {
         sat=rtcm->obs.data[j].sat;
         if (satsys(sat,&prn)!=SYS_GLO) continue;
-        fcn=fcn_glo(sat,rtcm);
+        fcn=fcn_glo(sat,rtcm,j);
         
         /* generate obs field data glonass */
         gen_obs_glo(rtcm,rtcm->obs.data+j,fcn,&code1,&pr1,&ppr1,&lock1,&amb,
@@ -668,7 +676,7 @@ static int encode_type1010(rtcm_t *rtcm, int sync)
     for (j=0;j<rtcm->obs.n&&nsat<MAXOBS;j++) {
         sat=rtcm->obs.data[j].sat;
         if (satsys(sat,&prn)!=SYS_GLO) continue;
-        fcn=fcn_glo(sat,rtcm);
+        fcn=fcn_glo(sat,rtcm,j);
         
         /* generate obs field data glonass */
         gen_obs_glo(rtcm,rtcm->obs.data+j,fcn,&code1,&pr1,&ppr1,&lock1,&amb,
@@ -707,7 +715,7 @@ static int encode_type1011(rtcm_t *rtcm, int sync)
     for (j=0;j<rtcm->obs.n&&nsat<MAXOBS;j++) {
         sat=rtcm->obs.data[j].sat;
         if (satsys(sat,&prn)!=SYS_GLO) continue;
-        fcn=fcn_glo(sat,rtcm);
+        fcn=fcn_glo(sat,rtcm,j);
         
         /* generate obs field data glonass */
         gen_obs_glo(rtcm,rtcm->obs.data+j,fcn,&code1,&pr1,&ppr1,&lock1,&amb,
@@ -748,7 +756,7 @@ static int encode_type1012(rtcm_t *rtcm, int sync)
     for (j=0;j<rtcm->obs.n&&nsat<MAXOBS;j++) {
         sat=rtcm->obs.data[j].sat;
         if (satsys(sat,&prn)!=SYS_GLO) continue;
-        fcn=fcn_glo(sat,rtcm);
+        fcn=fcn_glo(sat,rtcm,j);
         
         /* generate obs field data glonass */
         gen_obs_glo(rtcm,rtcm->obs.data+j,fcn,&code1,&pr1,&ppr1,&lock1,&amb,
@@ -1839,13 +1847,17 @@ static void gen_msm_sat(rtcm_t *rtcm, int sys, int nsat,
     for (i=0;i<rtcm->obs.n;i++) {
         data=rtcm->obs.data+i;
         if (!(sat=to_satid(sys,data->sat))) continue;
-        fcn=fcn_glo(data->sat,rtcm);
+        fcn=fcn_glo(data->sat,rtcm,i);
         
         for (j=0;j<NFREQ+NEXOBS;j++) {
             if (!(sig=to_sigid(sys,data->code[j],&f))) continue;
             k=sat_ind[sat-1]-1;
-            lambda=satwavelen(data->sat,f-1,&rtcm->nav);
-            
+            if (sys==SYS_GLO&&fcn>=0) {
+                lambda=CLIGHT/((j==1?FREQ2_GLO:FREQ1_GLO)+
+                           (j==1?DFRQ2_GLO:DFRQ1_GLO)*(fcn-7));
+            } else {
+                lambda=satwavelen(data->sat,f-1,&rtcm->nav);
+            }
             /* rough range (ms) and rough phase-range-rate (m/s) */
             rrng_s =ROUND( data->P[j]/RANGE_MS/P2_10)*RANGE_MS*P2_10;
             rrate_s=ROUND(-data->D[j]*lambda)*1.0;
@@ -1868,7 +1880,7 @@ static void gen_msm_sig(rtcm_t *rtcm, int sys, int nsat, int nsig, int ncell,
 {
     obsd_t *data;
     double lambda,psrng_s,phrng_s,rate_s,lt;
-    int i,j,k,sat,sig,cell,f,LLI;
+    int i,j,k,fcn,sat,sig,cell,f,LLI;
     
     for (i=0;i<ncell;i++) {
         if (psrng) psrng[i]=0.0;
@@ -1879,13 +1891,18 @@ static void gen_msm_sig(rtcm_t *rtcm, int sys, int nsat, int nsig, int ncell,
         data=rtcm->obs.data+i;
         
         if (!(sat=to_satid(sys,data->sat))) continue;
+        fcn=fcn_glo(data->sat,rtcm,i);
         
         for (j=0;j<NFREQ+NEXOBS;j++) {
             if (!(sig=to_sigid(sys,data->code[j],&f))) continue;
             k=sat_ind[sat-1]-1;
             if ((cell=cell_ind[sig_ind[sig-1]-1+k*nsig])>=64) continue;
-            
-            lambda=satwavelen(data->sat,f-1,&rtcm->nav);
+            if (sys==SYS_GLO&&fcn>=0) {
+                lambda=CLIGHT/((j==1?FREQ2_GLO:FREQ1_GLO)+
+                           (j==1?DFRQ2_GLO:DFRQ1_GLO)*(fcn-7));
+            } else {
+                lambda=satwavelen(data->sat,f-1,&rtcm->nav);
+            }
             psrng_s=data->P[j]==0.0?0.0:data->P[j]-rrng[k];
             phrng_s=data->L[j]==0.0||lambda<=0.0?0.0: data->L[j]*lambda-rrng [k];
             rate_s =data->D[j]==0.0||lambda<=0.0?0.0:-data->D[j]*lambda-rrate[k];
diff --git a/src/rtklib.h b/src/rtklib.h
index e9083a83d27b54aff0999a3b075b8e445982086c..8443dbc7e86eed3d04b4f8a6cf4f59094fe9a88b 100644
--- a/src/rtklib.h
+++ b/src/rtklib.h
@@ -58,7 +58,7 @@ extern "C" {
 
 #define VER_RTKLIB  "demo5"             /* library version */
 
-#define PATCH_LEVEL "b33"               /* patch level */
+#define PATCH_LEVEL "b33a"               /* patch level */
 
 #define COPYRIGHT_RTKLIB \
             "Copyright (C) 2007-2019 T.Takasu\nAll rights reserved."
@@ -558,6 +558,7 @@ typedef struct {        /* observation data record */
     unsigned char code[NFREQ+NEXOBS]; /* code indicator (CODE_???) */
     unsigned char qualL[NFREQ+NEXOBS]; /* quality of carrier phase measurement */
     unsigned char qualP[NFREQ+NEXOBS]; /* quality of pseudorange measurement */
+    unsigned char freq; /* GLONASS frequency channel (0-13) */
     double L[NFREQ+NEXOBS]; /* observation data carrier-phase (cycle) */
     double P[NFREQ+NEXOBS]; /* observation data pseudorange (m) */
     float  D[NFREQ+NEXOBS]; /* observation data doppler frequency (Hz) */