diff --git a/app/convbin/convbin.c b/app/convbin/convbin.c
index 6736183c0c48f4812f5c08302fb7ed409e8a5009..0d5b713ae1e5bf0007161c79e13afd5d4326020c 100644
--- a/app/convbin/convbin.c
+++ b/app/convbin/convbin.c
@@ -326,7 +326,7 @@ static void setmask(const char *argv, rnxopt_t *opt, int mask)
         else if (p[0]=='C') i=5;
         else if (p[0]=='I') i=6;
         else continue;
-        if ((code=obs2code(p+2,NULL))) {
+        if ((code=obs2code(0,p+2,NULL))) {
             opt->mask[i][code-1]=mask?'1':'0';
         }
     }
diff --git a/app/rtknavi/mondlg.cpp b/app/rtknavi/mondlg.cpp
index b5e75e07025e70614a9a10e0533767b57c3592ad..68ab7adcfa091488b2fcd02b91bc591634c636e9 100644
--- a/app/rtknavi/mondlg.cpp
+++ b/app/rtknavi/mondlg.cpp
@@ -1017,7 +1017,7 @@ void __fastcall TMonitorDialog::ShowObs(void)
 			Tbl->Cells[j++][i+1]=s.sprintf("%d",obs[i].LLI[k]);
 		}
 		for (k=0;k<NFREQ+nex;k++) {
-			code=code2obs(obs[i].code[k],NULL);
+			code=code2obs(0,obs[i].code[k],NULL);
 			if (*code) Tbl->Cells[j++][i+1]=s.sprintf("L%s",code);
 			else       Tbl->Cells[j++][i+1]="";
 		}
@@ -1917,13 +1917,13 @@ void __fastcall TMonitorDialog::ShowRtcmSsr(void)
 		buff[0]='\0';
 		for (p=buff,k=0;k<MAXCODE;k++) {
 			if (ssr[i].cbias[k]==0.0) continue;
-			p+=sprintf(p,"%s:%.3f ",code2obs(k+1,NULL),ssr[i].cbias[k]);
+			p+=sprintf(p,"%s:%.3f ",code2obs(0,k+1,NULL),ssr[i].cbias[k]);
 		}
 		Tbl->Cells[j++][i+1]=buff;
 		buff[0]='\0';
 		for (p=buff,k=0;k<MAXCODE;k++) {
 			if (ssr[i].pbias[k]==0.0) continue;
-			p+=sprintf(p,"%s:%.3f ",code2obs(k+1,NULL),ssr[i].pbias[k]);
+			p+=sprintf(p,"%s:%.3f ",code2obs(0,k+1,NULL),ssr[i].pbias[k]);
 		}
 		Tbl->Cells[j++][i+1]=buff;
 	}
diff --git a/app/rtkplot/plotcmn.cpp b/app/rtkplot/plotcmn.cpp
index 077588bd91fe210c85603466d31c084421f728f3..7cb1fb05bd2f1b1e85f2c94f9aebc8140d712fd4 100644
--- a/app/rtkplot/plotcmn.cpp
+++ b/app/rtkplot/plotcmn.cpp
@@ -294,8 +294,8 @@ TColor __fastcall TPlot::ObsColor(const obsd_t *obs, double az, double el)
 {
     TColor color=clBlack;
     AnsiString ObsType_Text;
-    char *code="";
-    int i;
+    char *code="",*codeType="";
+    int i,frq,frqType,sys;
     
     trace(4,"ObsColor\n");
     
@@ -303,18 +303,22 @@ TColor __fastcall TPlot::ObsColor(const obsd_t *obs, double az, double el)
     
     if (PlotType==PLOT_SNR||PlotType==PLOT_SNRE) {
         ObsType_Text=ObsType2->Text;
-        code=ObsType_Text.c_str()+1;
+        codeType=ObsType_Text.c_str()+1;
+        frqType=ObsType2->ItemIndex;
     }
     else if (ObsType->ItemIndex) {
         ObsType_Text=ObsType->Text;
-        code=ObsType_Text.c_str()+1;
+        codeType=ObsType_Text.c_str()+1;
+        frqType=ObsType->ItemIndex;
     }
     if (SimObs) {
         color=SysColor(obs->sat);
     }
-    else if (*code) {
+    else if (*codeType) {
         for (i=0;i<NFREQ+NEXOBS;i++) {
-            if (!strstr(code2obs(obs->code[i],NULL),code)) continue;
+            sys=satsys(obs->sat,NULL);
+            code=code2obs(sys,obs->code[i],&frq);
+            if (frq!=frqType&&!strstr(code,codeType)) continue;
             color=SnrColor(obs->SNR[i]*0.25);
             break;
         }
diff --git a/app/rtkplot/plotdata.cpp b/app/rtkplot/plotdata.cpp
index 3f991ee8f95bfd839149ef5abdb5076257e1fd7e..40266536dbf9750cd7a65cf0375ca87a3c935ecf 100644
--- a/app/rtkplot/plotdata.cpp
+++ b/app/rtkplot/plotdata.cpp
@@ -937,7 +937,7 @@ void __fastcall TPlot::SaveSnrMp(AnsiString file)
             if (Obs.data[j].sat!=i+1) continue;
             
             for (k=0;k<NFREQ+NEXOBS;k++) {
-                if (strstr(code2obs(Obs.data[j].code[k],NULL),code)) break;
+                if (strstr(code2obs(0,Obs.data[j].code[k],NULL),code)) break;
             }
             if (k>=NFREQ+NEXOBS) continue;
             
@@ -1204,14 +1204,10 @@ void __fastcall TPlot::UpdateMp(void)
         for (j=0;j<NFREQ+NEXOBS;j++) {
             Mp[j][i]=0.0;
             
-            code2obs(data->code[j],&f1);
-            
-            if (sys==SYS_CMP) {
-                if      (f1==5) f1=2; /* B2 */
-                else if (f1==4) f1=3; /* B3 */
-            }
-            if      (sys==SYS_GAL) f2=f1==1?3:1; /* E1/E5a */
-            else if (sys==SYS_SBS) f2=f1==1?3:1; /* L1/L5 */
+            code2obs(sys,data->code[j],&f1);
+
+            if      (sys==SYS_GAL) f2=f1==1?3:1; /* E1/E5b */
+            else if (sys==SYS_SBS) f2=f1==1?4:1; /* L1/L5 */
             else if (sys==SYS_CMP) f2=f1==1?2:1; /* B1/B2 */
             else                   f2=f1==1?2:1; /* L1/L2 */
             
@@ -1232,12 +1228,8 @@ void __fastcall TPlot::UpdateMp(void)
         for (j=k=n=0,B=0.0;j<Obs.n;j++) {
             if (Obs.data[j].sat!=sat) continue;
             
-            code2obs(Obs.data[j].code[i],&f1);
-            
-            if (sys==SYS_CMP) {
-                if      (f1==5) f1=2; /* B2 */
-                else if (f1==4) f1=3; /* B3 */
-            }
+            code2obs(sys,Obs.data[j].code[i],&f1);
+
             if      (sys==SYS_GAL) f2=f1==1?3:1;
             else if (sys==SYS_CMP) f2=f1==1?2:1;
             else                   f2=f1==1?2:1;
diff --git a/app/rtkplot/plotdraw.cpp b/app/rtkplot/plotdraw.cpp
index f7613b2d16007c917dcb9db055d4cfd6e37e70c8..fd66ff273ef26f992006692123ae993f1b4a415c 100644
--- a/app/rtkplot/plotdraw.cpp
+++ b/app/rtkplot/plotdraw.cpp
@@ -66,6 +66,32 @@ void __fastcall TPlot::UpdateDisp(void)
     }
     Flush=0;
 }
+// check ObsType for code or freq match ---------------------------------------------
+int __fastcall TPlot::CheckObsTypeForMatch(const obsd_t *obs,int i)
+{
+    AnsiString ObsTypeText=ObsType->Text;
+    char *obs1, *obsType;
+    int frq,frqType,sys;
+
+    obsType=ObsTypeText.c_str()+1;
+    frqType=ObsType->ItemIndex;
+    sys=satsys(obs->sat,NULL);
+    obs1=code2obs(sys,obs->code[i],&frq);
+    return frq==frqType||strstr(obs1,obsType);
+}
+// check ObsType2 for code or freq match ---------------------------------------------
+int __fastcall TPlot::CheckObsType2ForMatch(const obsd_t *obs,int i)
+{
+    AnsiString ObsTypeText=ObsType2->Text;
+    char *obs1, *obsType;
+    int frq,frqType,sys;
+
+    obsType=ObsTypeText.c_str()+1;
+    frqType=ObsType->ItemIndex;
+    sys=satsys(obs->sat,NULL);
+    obs1=code2obs(sys,obs->code[i],&frq);
+    return frq==frqType||strstr(obs1,obsType);
+}
 // draw track-plot ----------------------------------------------------------
 void __fastcall TPlot::DrawTrk(int level)
 {
@@ -1002,8 +1028,8 @@ void __fastcall TPlot::DrawObsSlip(double *yp)
             if (!SatSel[obs->sat-1]) continue;
             slip=0;
             for (j=0;j<NFREQ+NEXOBS;j++) {
-                if ((!*code||strstr(code2obs(obs->code[j],NULL),code))&&
-                    (obs->LLI[j]&2)) slip=1;
+                if ((!*code||CheckObsTypeForMatch(obs,j))&&(obs->LLI[j]&2))
+                   slip=1;
             }
             if (!slip) continue;
             if (!GraphR->ToPoint(TimePos(obs->time),yp[obs->sat-1],ps[0])) continue;
@@ -1022,8 +1048,9 @@ void __fastcall TPlot::DrawObsSlip(double *yp)
             slip=0;
             if (ShowSlip==2) { // LLI
                 for (j=0;j<NFREQ+NEXOBS;j++) {
-                    if ((!*code||strstr(code2obs(obs->code[j],NULL),code))&&
-                        (obs->LLI[j]&1)) slip=1;
+                    if ((!*code||CheckObsTypeForMatch(obs,j))&&
+                        (obs->LLI[j]&1))
+                        slip=1;
                 }
             }
             else if (!*code||!strcmp(code,"1")||!strcmp(code,"2")) {
@@ -1213,8 +1240,7 @@ void __fastcall TPlot::DrawSky(int level)
             slip=0;
             if (ShowSlip==2) { // LLI
                 for (j=0;j<NFREQ+NEXOBS;j++) {
-                    if ((!*code||strstr(code2obs(obs->code[j],NULL),code))&&
-                        (obs->LLI[j]&1)) slip=1;
+                    if ((!*code||CheckObsTypeForMatch(obs,j))&&(obs->LLI[j]&1)) slip=1;
                 }
             }
             else if (!*code||!strcmp(code,"1")||!strcmp(code,"2")) {
@@ -1308,14 +1334,14 @@ void __fastcall TPlot::DrawSky(int level)
             }
             else {
                 for (j=0;j<NFREQ+NEXOBS;j++) {
-                    if (strstr(code2obs(obs->code[j],NULL),code)) break;
+                    if (CheckObsTypeForMatch(obs,j)) break;
                 }
                 if (j>=NFREQ+NEXOBS) continue;
-                
+
                 s+=ss.sprintf("%s%s%s : %04.1f : %d : %s",obs->P[j]==0.0?"-":"C",
                               obs->L[j]==0.0?"-":"L",obs->D[j]==0.0?"-":"D",
                               obs->SNR[j]*0.25,obs->LLI[j],
-                              code2obs(obs->code[j],NULL));
+                              code2obs(0,obs->code[j],NULL));
             }
             TColor col=ObsColor(obs,Az[i],El[i]);
             p2.y+=hh;
@@ -1566,7 +1592,7 @@ void __fastcall TPlot::DrawSnr(int level)
                     if (Obs.data[j].sat!=sat) continue;
                     
                     for (k=0;k<NFREQ+NEXOBS;k++) {
-                        if (strstr(code2obs(Obs.data[j].code[k],NULL),code)) break;
+                        if (CheckObsType2ForMatch(&Obs.data[j],k)) break;
                     }
                     if (k>=NFREQ+NEXOBS) continue;
                     
@@ -1709,7 +1735,7 @@ void __fastcall TPlot::DrawSnrE(int level)
                 if (Obs.data[j].sat!=sat) continue;
                 
                 for (k=0;k<NFREQ+NEXOBS;k++) {
-                    if (strstr(code2obs(Obs.data[j].code[k],NULL),code)) break;
+                    if (CheckObsType2ForMatch(&Obs.data[j],k)) break;
                 }
                 if (k>=NFREQ+NEXOBS) continue;
                 if (El[j]<=0.0) continue;
@@ -1831,7 +1857,7 @@ void __fastcall TPlot::DrawMpS(int level)
             if (Obs.data[i].sat!=sat) continue;
             
             for (j=0;j<NFREQ+NEXOBS;j++) {
-                if (strstr(code2obs(Obs.data[i].code[j],NULL),code)) break;
+                if (CheckObsType2ForMatch(&Obs.data[i],j)) break;
             }
             if (j>=NFREQ+NEXOBS) continue;
             if (El[i]<=0.0) continue;
@@ -1857,7 +1883,7 @@ void __fastcall TPlot::DrawMpS(int level)
             obs=&Obs.data[i];
             if (SatMask[obs->sat-1]||!SatSel[obs->sat-1]||El[i]<=0.0) continue;
             for (j=0;j<NFREQ+NEXOBS;j++) {
-                if (strstr(code2obs(obs->code[j],NULL),code)) break;
+                if (CheckObsTypeForMatch(obs,j)) break;
             }
             if (j>=NFREQ+NEXOBS) continue;
             col=MpColor(!Mp[j]?0.0:Mp[j][i]);
diff --git a/app/rtkplot/plotinfo.cpp b/app/rtkplot/plotinfo.cpp
index 0a8a3078141888b88b8b2abd13f75e474cf95f6c..c01e00f5f74d81de2c8d4e06c780fc16853cc519 100644
--- a/app/rtkplot/plotinfo.cpp
+++ b/app/rtkplot/plotinfo.cpp
@@ -318,7 +318,8 @@ void __fastcall TPlot::UpdateSatList(void)
 void __fastcall TPlot::UpdateObsType(void)
 {
     AnsiString s;
-    char *codes[MAXCODE+1],freqs[]="125678";
+    char *codes[MAXCODE+1];
+    const char *freqs[]={"L1","L2","E5b","L5","E6","E5ab"};
     int i,j,n=0,cmask[MAXCODE+1]={0},fmask[6]={0};
     
     trace(3,"UpdateObsType\n");
@@ -328,7 +329,8 @@ void __fastcall TPlot::UpdateObsType(void)
     }
     for (i=1;i<=MAXCODE;i++) {
         if (!cmask[i]) continue;
-        codes[n++]=code2obs(i,&j);
+
+        codes[n++]=code2obs(satsys(Obs.data[i].sat,NULL),i,&j);
         fmask[j-1]=1;
     }
     ObsType ->Items->Clear();
@@ -337,8 +339,8 @@ void __fastcall TPlot::UpdateObsType(void)
     
     for (i=0;i<6;i++) {
         if (!fmask[i]) continue;
-        ObsType ->Items->Add(s.sprintf("L%c",freqs[i]));
-        ObsType2->Items->Add(s.sprintf("L%c",freqs[i]));
+        ObsType ->Items->Add(s.sprintf("%s",freqs[i]));
+        ObsType2->Items->Add(s.sprintf("%s",freqs[i]));
     }
     for (i=0;i<n;i++) {
         ObsType ->Items->Add(s.sprintf("L%s",codes[i]));
diff --git a/app/rtkplot/plotmain.cpp b/app/rtkplot/plotmain.cpp
index 14f506f7a02b35df8b3a191902a3c16b285f6920..f73af191a57228bdb744c6a1b558f268dfbbfb42 100644
--- a/app/rtkplot/plotmain.cpp
+++ b/app/rtkplot/plotmain.cpp
@@ -176,10 +176,10 @@ __fastcall TPlot::TPlot(TComponent* Owner) : TForm(Owner)
     FrqType->Items->Clear();
     FrqType->Items->Add("L1/LC");
     if (nfreq>=2) FrqType->Items->Add("L2");
-    if (nfreq>=3) FrqType->Items->Add("L5");
-    if (nfreq>=4) FrqType->Items->Add("L6");
-    if (nfreq>=5) FrqType->Items->Add("L7");
-    if (nfreq>=6) FrqType->Items->Add("L8");
+    if (nfreq>=3) FrqType->Items->Add("E5b");
+    if (nfreq>=4) FrqType->Items->Add("L5");
+    if (nfreq>=5) FrqType->Items->Add("E6");
+    if (nfreq>=6) FrqType->Items->Add("E5ab");
     FrqType->ItemIndex=0;
     
     TLEData.n=TLEData.nmax=0;
diff --git a/app/rtkplot/plotmain.dfm b/app/rtkplot/plotmain.dfm
index 811d0b58ed281abddfb1170101b62e73b10410b1..9ce60565039ca7c7cb3c44c89b4e993fbc8860c9 100644
--- a/app/rtkplot/plotmain.dfm
+++ b/app/rtkplot/plotmain.dfm
@@ -196,7 +196,6 @@ object Plot: TPlot
             'NMEA (*.nmea)'
             'Solution Status (*.stat)'
             'All (*.*)')
-          ExplicitWidth = 150
         end
       end
     end
diff --git a/app/rtkplot/plotmain.h b/app/rtkplot/plotmain.h
index 287849d890264d6a5e61ba3458e29bb094afee9b..7ff52eb0cc900aa44bdda5b86e8f5b189ea46bd1 100644
--- a/app/rtkplot/plotmain.h
+++ b/app/rtkplot/plotmain.h
@@ -492,6 +492,8 @@ private:
     void __fastcall MouseMoveSol (int X, int Y, double dx, double dy, double dxs, double dys);
     void __fastcall MouseMoveObs (int X, int Y, double dx, double dy, double dxs, double dys);
 
+    int  __fastcall CheckObsTypeForMatch(const obsd_t *obs, int i);
+    int  __fastcall CheckObsType2ForMatch(const obsd_t *obs, int i);
     void __fastcall DrawTrk      (int level);
     void __fastcall DrawTrkImage (int level);
     void __fastcall DrawTrkMap   (int level);
diff --git a/src/rcv/ublox.c b/src/rcv/ublox.c
index aa6ecf211e6cb090918a0bb6b56a5b06461e080c..884e8068234f186c5db52690efa5f3b271d4d4c0 100644
--- a/src/rcv/ublox.c
+++ b/src/rcv/ublox.c
@@ -387,8 +387,9 @@ static int decode_rxmrawx(raw_t *raw)
         if (slip) raw->lockflag[sat-1][f-1]=slip;
         raw->lockt[sat-1][f-1]=lockt*1E-3;
         raw->halfc[sat-1][f-1]=halfc;
-        /* LLI: bit1=slip,bit2=half-cycle-invalid, bit7=half-cycle-subtract */
-        LLI=(halfc?LLI_HALFS:0)|(!halfv&&L!=0.0?LLI_HALFC:0);
+        /* LLI: bit1=slip,bit2=half-cycle-invalid */
+        LLI=!halfv&&L!=0.0?LLI_HALFC:0;
+        LLI|=halfc!=raw->halfc[sat-1][f-1]?1:0;
         if (L!=0.0) LLI|=raw->lockflag[sat-1][f-1]>0.0?LLI_SLIP:0;
 
         for (j=0;j<n;j++) {