diff --git a/app/appcmn/aboutdlg.cpp b/app/appcmn/aboutdlg.cpp
index 81229709231c825afa605ebee3896b25af56f7b6..ac08333e515f8fd32015e4d3c5c6198ccf5bc127 100644
--- a/app/appcmn/aboutdlg.cpp
+++ b/app/appcmn/aboutdlg.cpp
@@ -20,7 +20,7 @@ void __fastcall TAboutDialog::FormShow(TObject *Sender)
 	AnsiString s;
 	if (IconIndex>0) icon[IconIndex-1]->Visible=true;
 	LabelAbout->Caption=About;
-	LabelVer->Caption=s.sprintf("with RTKLIB ver.%s %s",VER_RTKLIB,PATCH_LEVEL);
+	LabelVer->Caption=s.sprintf("with RTKLIB ver:%s %s",VER_RTKLIB,PATCH_LEVEL);
 	LabelCopyright->Caption=COPYRIGHT_RTKLIB;
 }
 //---------------------------------------------------------------------------
diff --git a/app/rtkconv/codeopt.cpp b/app/rtkconv/codeopt.cpp
index df21713e1893b4c12cf1c5b689242456105f775c..b95baba75c3e997ffdeeb25fccb0630aab159642 100644
--- a/app/rtkconv/codeopt.cpp
+++ b/app/rtkconv/codeopt.cpp
@@ -81,9 +81,9 @@ void __fastcall TCodeOptDialog::FormShow(TObject *Sender)
 	J35->Checked=mask[3][34]=='1';
 	J36->Checked=mask[3][35]=='1';
 	J33->Checked=mask[3][32]=='1';
-	C47->Checked=mask[5][46]=='1';
-	C48->Checked=mask[5][47]=='1';
-	C12->Checked=mask[5][11]=='1';
+	C40->Checked=mask[5][39]=='1';
+	C41->Checked=mask[5][40]=='1';
+	C18->Checked=mask[5][11]=='1';
 	C27->Checked=mask[5][26]=='1';
 	C28->Checked=mask[5][27]=='1';
 	C29->Checked=mask[5][28]=='1';
@@ -172,9 +172,9 @@ void __fastcall TCodeOptDialog::BtnOkClick(TObject *Sender)
 	if (J35->Checked) mask[3][34]='1';
 	if (J36->Checked) mask[3][35]='1';
 	if (J33->Checked) mask[3][32]='1';
-	if (C47->Checked) mask[5][46]='1';
-	if (C48->Checked) mask[5][47]='1';
-	if (C12->Checked) mask[5][11]='1';
+	if (C40->Checked){mask[5][39]='1';mask[5][46]='1';}
+	if (C41->Checked){mask[5][40]='1';mask[5][47]='1';}
+	if (C18->Checked){mask[5][17]='1';mask[5][11]='1';}
 	if (C27->Checked) mask[5][26]='1';
 	if (C28->Checked) mask[5][27]='1';
 	if (C29->Checked) mask[5][28]='1';
@@ -261,9 +261,9 @@ void __fastcall TCodeOptDialog::BtnSetAllClick(TObject *Sender)
 	J35->Checked=set;
 	J36->Checked=set;
 	J33->Checked=set;
-	C47->Checked=set;
-	C48->Checked=set;
-	C12->Checked=set;
+	C40->Checked=set;
+	C41->Checked=set;
+	C18->Checked=set;
 	C27->Checked=set;
 	C28->Checked=set;
 	C29->Checked=set;
@@ -348,9 +348,9 @@ void __fastcall TCodeOptDialog::UpdateEnable(void)
 	J35->Enabled=(NavSys&SYS_QZS)&&(FreqType&FREQTYPE_E6);
 	J36->Enabled=(NavSys&SYS_QZS)&&(FreqType&FREQTYPE_E6);
 	J33->Enabled=(NavSys&SYS_QZS)&&(FreqType&FREQTYPE_E6);
-	C47->Enabled=(NavSys&SYS_CMP)&&(FreqType&FREQTYPE_L2);
-	C48->Enabled=(NavSys&SYS_CMP)&&(FreqType&FREQTYPE_L2);
-	C12->Enabled=(NavSys&SYS_CMP)&&(FreqType&FREQTYPE_L2);
+	C40->Enabled=(NavSys&SYS_CMP)&&(FreqType&FREQTYPE_L2);
+	C41->Enabled=(NavSys&SYS_CMP)&&(FreqType&FREQTYPE_L2);
+	C18->Enabled=(NavSys&SYS_CMP)&&(FreqType&FREQTYPE_L2);
 	C27->Enabled=(NavSys&SYS_CMP)&&(FreqType&FREQTYPE_E5b);
 	C28->Enabled=(NavSys&SYS_CMP)&&(FreqType&FREQTYPE_E5b);
 	C29->Enabled=(NavSys&SYS_CMP)&&(FreqType&FREQTYPE_E5b);
diff --git a/app/rtkconv/codeopt.dfm b/app/rtkconv/codeopt.dfm
index 8354e847b3cc7fcc381c2b04e399c291cccb3465..b6d398457c9fbf1d0daf04e381cafb83cbc069cc 100644
--- a/app/rtkconv/codeopt.dfm
+++ b/app/rtkconv/codeopt.dfm
@@ -67,7 +67,7 @@ object CodeOptDialog: TCodeOptDialog
     OnClick = BtnOkClick
   end
   object BtnCancel: TButton
-    Left = 324
+    Left = 318
     Top = 301
     Width = 71
     Height = 29
@@ -606,23 +606,23 @@ object CodeOptDialog: TCodeOptDialog
     OnClick = BtnSetAllClick
   end
   object GroupBox6: TGroupBox
-    Left = 0
-    Top = 228
+    Left = 4
+    Top = 230
     Width = 393
     Height = 34
     Caption = 'BeiDou'
     TabOrder = 8
-    object C47: TCheckBox
-      Left = 10
-      Top = 14
-      Width = 35
+    object C40: TCheckBox
+      Left = 5
+      Top = 15
+      Width = 40
       Height = 16
-      Caption = '2I'
+      Caption = '1I/2I'
       Enabled = False
       TabOrder = 2
     end
     object C42: TCheckBox
-      Left = 238
+      Left = 270
       Top = 14
       Width = 32
       Height = 16
@@ -631,25 +631,25 @@ object CodeOptDialog: TCodeOptDialog
       TabOrder = 0
     end
     object C27: TCheckBox
-      Left = 124
+      Left = 157
       Top = 14
-      Width = 34
+      Width = 33
       Height = 16
       Caption = '7I'
       Enabled = False
       TabOrder = 3
     end
     object C28: TCheckBox
-      Left = 162
+      Left = 192
       Top = 14
-      Width = 44
+      Width = 34
       Height = 16
       Caption = '7Q'
       Enabled = False
       TabOrder = 4
     end
     object C29: TCheckBox
-      Left = 201
+      Left = 232
       Top = 14
       Width = 34
       Height = 16
@@ -657,26 +657,26 @@ object CodeOptDialog: TCodeOptDialog
       Enabled = False
       TabOrder = 1
     end
-    object C48: TCheckBox
-      Left = 48
+    object C41: TCheckBox
+      Left = 52
       Top = 14
-      Width = 34
+      Width = 50
       Height = 16
-      Caption = '2Q'
+      Caption = '1Q/2Q'
       Enabled = False
       TabOrder = 5
     end
-    object C12: TCheckBox
-      Left = 86
+    object C18: TCheckBox
+      Left = 106
       Top = 14
-      Width = 34
+      Width = 49
       Height = 16
-      Caption = '2X'
+      Caption = '1X/2X'
       Enabled = False
       TabOrder = 6
     end
     object C43: TCheckBox
-      Left = 276
+      Left = 308
       Top = 14
       Width = 32
       Height = 16
@@ -685,10 +685,10 @@ object CodeOptDialog: TCodeOptDialog
       TabOrder = 7
     end
     object C33: TCheckBox
-      Left = 314
-      Top = 14
-      Width = 32
-      Height = 16
+      Left = 344
+      Top = 12
+      Width = 33
+      Height = 19
       Caption = '6X'
       Enabled = False
       TabOrder = 8
diff --git a/app/rtkconv/codeopt.h b/app/rtkconv/codeopt.h
index 681965165f945363e6d5ae812542ef3f5ce7d78b..c97d21659938ba55a69011eaf2fb7dc3a61c3b1a 100644
--- a/app/rtkconv/codeopt.h
+++ b/app/rtkconv/codeopt.h
@@ -81,13 +81,13 @@ __published:
 	TButton *BtnSetAll;
 	TCheckBox *J33;
 	TGroupBox *GroupBox6;
-	TCheckBox *C47;
+    TCheckBox *C40;
 	TCheckBox *C42;
 	TCheckBox *C27;
 	TCheckBox *C28;
 	TCheckBox *C29;
-	TCheckBox *C48;
-	TCheckBox *C12;
+    TCheckBox *C41;
+    TCheckBox *C18;
 	TCheckBox *C43;
 	TCheckBox *C33;
 	TCheckBox *R44;
diff --git a/app/rtkconv/convmain.cpp b/app/rtkconv/convmain.cpp
index 64779863b43d6072915aea0860ead95e226d6d10..f9b79b8766198fc9cda92c429e69f0556e820991 100644
--- a/app/rtkconv/convmain.cpp
+++ b/app/rtkconv/convmain.cpp
@@ -83,7 +83,7 @@ void __fastcall TMainWindow::FormCreate(TObject *Sender)
 {
 	AnsiString s;
 	
-	Caption=s.sprintf("%s ver.%s %s",PRGNAME,VER_RTKLIB,PATCH_LEVEL);
+	Caption=s.sprintf("%s ver:%s %s",PRGNAME,VER_RTKLIB,PATCH_LEVEL);
 	
 	::DragAcceptFiles(Handle,true);
 }
diff --git a/app/rtkpost/postopt.cpp b/app/rtkpost/postopt.cpp
index 9ddd4544861e74a7f0358a542552216ce319460c..bec5dffd7d48d05918cb195636d8efbb33dfdbca 100644
--- a/app/rtkpost/postopt.cpp
+++ b/app/rtkpost/postopt.cpp
@@ -25,14 +25,14 @@ __fastcall TOptDialog::TOptDialog(TComponent* Owner)
     : TForm(Owner)
 {
     AnsiString label,s;
-    int freq[]={1,2,5,6,7,8,9};
+    const char *freqs[]={"L1","L2","E5b","L5","E6","E5ab"};
     int nglo=MAXPRNGLO,ngal=MAXPRNGAL,nqzs=MAXPRNQZS,ncmp=MAXPRNCMP;
     int nirn=MAXPRNIRN;
     
 #if 0
     Freq->Items->Clear();
     for (int i=0;i<NFREQ;i++) {
-        label=label+(i>0?"+":"L")+s.sprintf("%d",freq[i]);
+        label=label+(i>0?"+":"")+s.sprintf("%s",freqs[i]);
         Freq->Items->Add(label);
     }
 #endif
diff --git a/app/rtkpost/postopt.dfm b/app/rtkpost/postopt.dfm
index 893ca295f63f37c4e2c53138a0057d8e8747998b..337bd989badbc5f691cd9b1d8efdc7ad1099d843 100644
--- a/app/rtkpost/postopt.dfm
+++ b/app/rtkpost/postopt.dfm
@@ -101,41 +101,43 @@ object OptDialog: TOptDialog
     Top = 1
     Width = 411
     Height = 377
-    ActivePage = TabSheet2
+    ActivePage = TabSheet1
     TabOrder = 4
     object TabSheet1: TTabSheet
       Caption = 'Setting&1'
+      ExplicitLeft = 1
+      ExplicitTop = 21
       object Label3: TLabel
         Left = 24
-        Top = 73
+        Top = 95
         Width = 183
         Height = 13
         Caption = 'Rec Dynamics / Earth Tides Correction'
       end
       object Label8: TLabel
         Left = 24
-        Top = 95
-        Width = 108
+        Top = 27
+        Width = 58
         Height = 13
-        Caption = 'Ionosphere Correction'
+        Caption = 'Frequencies'
       end
       object LabelPosMode: TLabel
         Left = 24
-        Top = 7
+        Top = 5
         Width = 80
         Height = 13
         Caption = 'Positioning Mode'
       end
       object LabelFreq: TLabel
         Left = 24
-        Top = 29
-        Width = 119
+        Top = 51
+        Width = 51
         Height = 13
-        Caption = 'Frequencies / Filter Type'
+        Caption = 'Filter Type'
       end
       object LabelElMask: TLabel
         Left = 23
-        Top = 51
+        Top = 73
         Width = 179
         Height = 13
         Caption = 'Elevation Mask ('#176') / SNR Mask (dBHz)'
@@ -157,13 +159,13 @@ object OptDialog: TOptDialog
       object Label9: TLabel
         Left = 23
         Top = 117
-        Width = 114
+        Width = 107
         Height = 13
-        Caption = 'Troposphere Correction'
+        Caption = 'Iono/Tropo Correction'
       end
       object DynamicModel: TComboBox
         Left = 248
-        Top = 70
+        Top = 92
         Width = 75
         Height = 21
         Style = csDropDownList
@@ -176,9 +178,9 @@ object OptDialog: TOptDialog
           'ON')
       end
       object IonoOpt: TComboBox
-        Left = 248
-        Top = 92
-        Width = 152
+        Left = 247
+        Top = 114
+        Width = 76
         Height = 21
         Style = csDropDownList
         DropDownCount = 16
@@ -198,9 +200,9 @@ object OptDialog: TOptDialog
           'Input TEC')
       end
       object TropOpt: TComboBox
-        Left = 248
+        Left = 324
         Top = 114
-        Width = 152
+        Width = 76
         Height = 21
         Style = csDropDownList
         ItemIndex = 0
@@ -217,7 +219,7 @@ object OptDialog: TOptDialog
       end
       object PosMode: TComboBox
         Left = 248
-        Top = 4
+        Top = 2
         Width = 152
         Height = 21
         Style = csDropDownList
@@ -240,24 +242,22 @@ object OptDialog: TOptDialog
       end
       object Freq: TComboBox
         Left = 248
-        Top = 26
-        Width = 75
+        Top = 25
+        Width = 152
         Height = 21
         Style = csDropDownList
-        ItemIndex = 0
         TabOrder = 1
-        Text = 'L1'
         OnChange = FreqChange
         Items.Strings = (
           'L1'
           'L1+L2'
-          'L1+L2+L5'
-          'L1+L5')
+          'L1+L2+E5b'
+          'L1+L2+E5b+L5')
       end
       object Solution: TComboBox
-        Left = 325
-        Top = 26
-        Width = 75
+        Left = 248
+        Top = 48
+        Width = 152
         Height = 21
         Style = csDropDownList
         ItemIndex = 0
@@ -339,7 +339,7 @@ object OptDialog: TOptDialog
       end
       object TideCorr: TComboBox
         Left = 325
-        Top = 70
+        Top = 92
         Width = 75
         Height = 21
         Style = csDropDownList
@@ -363,7 +363,7 @@ object OptDialog: TOptDialog
       end
       object ElMask: TComboBox
         Left = 248
-        Top = 48
+        Top = 70
         Width = 75
         Height = 21
         AutoComplete = False
@@ -422,7 +422,7 @@ object OptDialog: TOptDialog
       end
       object BtnMask: TButton
         Left = 324
-        Top = 47
+        Top = 69
         Width = 77
         Height = 23
         Caption = '...'
@@ -2132,14 +2132,14 @@ object OptDialog: TOptDialog
       '(*.blq)|*.blq|Ionosphere Data File (*.*i,*stec)|*.*i;*.stec'
     Options = [ofHideReadOnly, ofNoChangeDir, ofEnableSizing]
     Title = 'Load File'
-    Left = 201
-    Top = 157
+    Left = 121
+    Top = 309
   end
   object SaveDialog: TSaveDialog
     Filter = 'All (*.*)|*.*|Options File (*.conf)|*.conf'
     Options = [ofHideReadOnly, ofNoChangeDir, ofEnableSizing]
     Title = 'Save File'
-    Left = 203
-    Top = 109
+    Left = 171
+    Top = 309
   end
 end
diff --git a/src/convrnx.c b/src/convrnx.c
index 7d24f894765360bbab7fbe6f17c5597ee32d8d0b..dd71a02143627aeb43172ee42e08270ea30b7100 100644
--- a/src/convrnx.c
+++ b/src/convrnx.c
@@ -432,8 +432,8 @@ static void sort_codes(unsigned char *codes, unsigned char *types, int n)
     int i,j;
     
     for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) {
-       obs1=code2obs(codes[i],NULL);
-       obs2=code2obs(codes[j],NULL);
+       obs1=code2obs(NULL,codes[i],NULL);
+       obs2=code2obs(NULL,codes[j],NULL);
        if (strcmp(obs1,obs2)<=0) continue;
        tmp=codes[i]; codes[i]=codes[j]; codes[j]=tmp;
        tmp=types[i]; types[i]=types[j]; types[j]=tmp;
@@ -455,7 +455,7 @@ static void setopt_obstype(const unsigned char *codes,
     
     for (i=0;codes[i];i++) {
         
-        if (!(id=code2obs(codes[i],&freq))) continue;
+        if (!(id=code2obs(sys,codes[i],&freq))) continue;
         
         if (!(opt->freqtype&(1<<(freq-1)))||opt->mask[sys][codes[i]-1]=='0') {
             continue;
@@ -664,7 +664,7 @@ static int scan_obstype(int format, char **files, int nf, rnxopt_t *opt,
         return 0;
     }
     for (i=0;i<NSATSYS;i++) for (j=0;j<n[i];j++) {
-        trace(2,"scan_obstype: sys=%d code=%s type=%d\n",i,code2obs(codes[i][j],NULL),types[i][j]);
+        trace(2,"scan_obstype: sys=%d code=%s type=%d\n",i,code2obs(NULL,codes[i][j],NULL),types[i][j]);
     }
     for (i=0;i<NSATSYS;i++) {
         
@@ -675,7 +675,7 @@ static int scan_obstype(int format, char **files, int nf, rnxopt_t *opt,
         setopt_obstype(codes[i],types[i],i,opt);
         
         for (j=0;j<n[i];j++) {
-            trace(3,"scan_obstype: sys=%d code=%s\n",i,code2obs(codes[i][j],NULL));
+            trace(3,"scan_obstype: sys=%d code=%s\n",i,code2obs(NULL,codes[i][j],NULL));
         }
     }
     return 1;
@@ -704,8 +704,8 @@ static void set_obstype(int format, rnxopt_t *opt)
         {CODE_L1C,CODE_L1S,CODE_L1L,CODE_L1X,CODE_L1Z,CODE_L2S,CODE_L2L,CODE_L2X,
          CODE_L5I,CODE_L5Q,CODE_L5X,CODE_L6S,CODE_L6L,CODE_L6X},
         {CODE_L1C,CODE_L5I,CODE_L5Q,CODE_L5X},
-        {CODE_L1I,CODE_L1Q,CODE_L1X,CODE_L7I,CODE_L7Q,CODE_L7X,CODE_L6I,CODE_L6Q,
-         CODE_L6X},
+        {CODE_L1I,CODE_L1Q,CODE_L1X,CODE_L2I,CODE_L2Q,CODE_L2X,
+         CODE_L7I,CODE_L7Q,CODE_L7X,CODE_L6I,CODE_L6Q,CODE_L6X},
         {CODE_L5A,CODE_L5B,CODE_L5C,CODE_L5X,CODE_L9A,CODE_L9B,CODE_L9C,CODE_L9X}
     };
     static const unsigned char codes_cnav[NSATSYS][8]={ /* comnav */
@@ -764,8 +764,8 @@ static void set_obstype(int format, rnxopt_t *opt)
         {CODE_L1C,CODE_L1S,CODE_L1L,CODE_L1X,CODE_L1Z,CODE_L2S,CODE_L2L,CODE_L2X,
          CODE_L5I,CODE_L5Q,CODE_L5X,CODE_L6S,CODE_L6L,CODE_L6X},
         {CODE_L1C,CODE_L5I,CODE_L5Q,CODE_L5X},
-        {CODE_L1I,CODE_L1Q,CODE_L1X,CODE_L7I,CODE_L7Q,CODE_L7X,CODE_L6I,CODE_L6Q,
-         CODE_L6X},
+        {CODE_L1I,CODE_L1Q,CODE_L1X,CODE_L2I,CODE_L2Q,CODE_L2X,
+         CODE_L7I,CODE_L7Q,CODE_L7X,CODE_L6I,CODE_L6Q,CODE_L6X},
         {CODE_L5A,CODE_L5B,CODE_L5C,CODE_L5X,CODE_L9A,CODE_L9B,CODE_L9C,CODE_L9X}
     };
     static const unsigned char codes_rt17[NSATSYS][8]={ /* rt17 */
@@ -801,7 +801,7 @@ static void set_obstype(int format, rnxopt_t *opt)
         {CODE_L1C,CODE_L1X,CODE_L7Q},
         {CODE_L1C},
         {CODE_L1C},
-        {CODE_L1I,CODE_L7I},
+        {CODE_L1I,CODE_L2I,CODE_L7I},
         {0}
     };
     const unsigned char *codes;
diff --git a/src/rcv/binex.c b/src/rcv/binex.c
index 03f213f3910ede34d93d7ecc272c03928db2f686..061624432948eee029751afa62fcc7717e3e69c5 100644
--- a/src/rcv/binex.c
+++ b/src/rcv/binex.c
@@ -975,7 +975,7 @@ static unsigned char *decode_bnx_7f_05_obs(raw_t *raw, unsigned char *buff,
     
     /* get code priority */
     for (i=0;i<nobs;i++) {
-        code2obs(codes[code[i]&0x3F],freq+i);
+        code2obs(sys,codes[code[i]&0x3F],freq+i);
         pri[i]=getcodepri(sys,codes[code[i]&0x3F],raw->opt);
         
         /* frequency index for beidou */
diff --git a/src/rcv/ublox.c b/src/rcv/ublox.c
index a524e058d8a1f53458bb404c2f16b2a5b46cc82f..aa6ecf211e6cb090918a0bb6b56a5b06461e080c 100644
--- a/src/rcv/ublox.c
+++ b/src/rcv/ublox.c
@@ -164,8 +164,8 @@ static int ubx_sig(int sys, int sigid)
         if (sigid == 6) return CODE_L7Q; /* E5bQ */
     }
     else if (sys == SYS_CMP) {
-        if (sigid == 0) return CODE_L1I; /* B1I D1 (rinex 3.02) */
-        if (sigid == 1) return CODE_L1I; /* B1I D2 (rinex 3.02) */
+        if (sigid == 0) return CODE_L2I; /* B1I D1 (rinex 3.03) */
+        if (sigid == 1) return CODE_L2I; /* B1I D2 (rinex 3.03) */
         if (sigid == 2) return CODE_L7I; /* B2I D1 */
         if (sigid == 3) return CODE_L7I; /* B2I D2 */
     }
@@ -183,7 +183,7 @@ static double sig_freq(int sys, int f, int fcn)
 {
     static const double freq_glo[8]={FREQ1_GLO,FREQ2_GLO,FREQ3_GLO};
     static const double dfrq_glo[8]={DFRQ1_GLO,DFRQ2_GLO};
-    static const double freq_bds[8]={FREQ1_CMP,0,0,FREQ3_CMP,FREQ2_CMP};
+    static const double freq_bds[8]={FREQ1_CMP,FREQ2_CMP,FREQ3_CMP};
     
     if (sys == SYS_GLO) {
         return freq_glo[f-1]+dfrq_glo[f-1]*fcn;
@@ -363,9 +363,9 @@ static int decode_rxmrawx(raw_t *raw)
             code=ubx_sig(sys,sigid);
             }
         else {
-            code=(sys==SYS_CMP)?CODE_L1I:((sys==SYS_GAL)?CODE_L1X:CODE_L1C);
+            code=(sys==SYS_CMP)?CODE_L2I:((sys==SYS_GAL)?CODE_L1X:CODE_L1C);
         }
-        code2obs(code,&f); /* freq index */
+        code2obs(sys,code,&f); /* freq index */
 
         if (f==0||f>NFREQ) {
             trace(2,"ubx rxmrawx signal error: sys=%2d code=%2d\n",sys,code);
@@ -678,7 +678,7 @@ static int decode_trkmeas(raw_t *raw)
         raw->obs.data[n].L[0]=-adr;
         raw->obs.data[n].D[0]=(float)dop;
         raw->obs.data[n].SNR[0]=(unsigned char)(snr*4.0);
-        raw->obs.data[n].code[0]=sys==SYS_CMP?CODE_L1I:CODE_L1C;
+        raw->obs.data[n].code[0]=sys==SYS_CMP?CODE_L2I:CODE_L1C;
         raw->obs.data[n].qualL[0]=8-qi;
         raw->obs.data[n].LLI[0]=raw->lockt[sat-1][1]>0.0?1:0;
         if (sys==SYS_SBS) { /* half-cycle valid */
@@ -803,7 +803,7 @@ static int decode_trkd5(raw_t *raw)
         raw->obs.data[n].L[0]=-adr;
         raw->obs.data[n].D[0]=(float)dop;
         raw->obs.data[n].SNR[0]=(unsigned char)(snr*4.0);
-        raw->obs.data[n].code[0]=sys==SYS_CMP?CODE_L1I:CODE_L1C;
+        raw->obs.data[n].code[0]=sys==SYS_CMP?CODE_L2I:CODE_L1C;
         raw->obs.data[n].LLI[0]=raw->lockt[sat-1][1]>0.0?1:0;
         raw->lockt[sat-1][1]=0.0;
         
diff --git a/src/rinex.c b/src/rinex.c
index 74cde1536ae1edaa22a69d9a0469603ca9eb09e9..c60835e3cac3c4b7d73c45437a5d9d58f840b18c 100644
--- a/src/rinex.c
+++ b/src/rinex.c
@@ -879,7 +879,7 @@ static void set_index(double ver, int sys, const char *opt,
     int i,j,k,n;
     
     for (i=n=0;*tobs[i];i++,n++) {
-        ind->code[i]=obs2code(tobs[i]+1,ind->frq+i);
+        ind->code[i]=obs2code(sys,tobs[i]+1,ind->frq+i);
         ind->type[i]=(p=strchr(obscodes,tobs[i][0]))?(int)(p-obscodes):0;
         ind->pri[i]=getcodepri(sys,ind->code[i],opt);
         ind->pos[i]=-1;
@@ -903,7 +903,7 @@ static void set_index(double ver, int sys, const char *opt,
     for (p=opt;p&&(p=strchr(p,'-'));p++) {
         if (sscanf(p,optstr,str,&shift)<2) continue;
         for (i=0;i<n;i++) {
-            if (strcmp(code2obs(ind->code[i],NULL),str)) continue;
+            if (strcmp(code2obs(NULL,ind->code[i],NULL),str)) continue;
             ind->shift[i]=shift;
             trace(2,"phase shift: sys=%2d tobs=%s shift=%.3f\n",sys,
                   tobs[i],shift);
@@ -2078,12 +2078,12 @@ static int obsindex(double ver, int sys, const unsigned char *code,
                     return i;
             }
             else {
-                id=code2obs(code[i],NULL);
+                id=code2obs(NULL,code[i],NULL);
                 if (id[0]==tobs[1]) return i;
             }
         }
         else { /* ver.3 */
-            id=code2obs(code[i],NULL);
+            id=code2obs(NULL,code[i],NULL);
             if (!strcmp(id,tobs+1)) return i;
         }
     }
diff --git a/src/rtcm3.c b/src/rtcm3.c
index d831ec12f2427b566e3966808d149ae375959f35..038e2f2bc9a8e5ec093edc271ebeeb954ac74327 100644
--- a/src/rtcm3.c
+++ b/src/rtcm3.c
@@ -1365,8 +1365,8 @@ static const int codes_qzs[]={
     CODE_L5X,CODE_L6S,CODE_L6L,CODE_L6X,CODE_L1X
 };
 static const int codes_bds[]={
-    CODE_L1I,CODE_L1Q,CODE_L1X,CODE_L7I,CODE_L7Q,CODE_L7X,CODE_L6I,CODE_L6Q,
-    CODE_L6X
+    CODE_L1I,CODE_L1Q,CODE_L1X,CODE_L2I,CODE_L2Q,CODE_L2X,
+    CODE_L7I,CODE_L7Q,CODE_L7X,CODE_L6I,CODE_L6Q,CODE_L6X
 };
 static const int codes_sbs[]={
     CODE_L1C,CODE_L5I,CODE_L5Q,CODE_L5X
@@ -1482,7 +1482,7 @@ static int decode_ssr3(rtcm_t *rtcm, int sys)
         case SYS_GLO: np=5; offp=  0; codes=codes_glo; ncode= 4; break;
         case SYS_GAL: np=6; offp=  0; codes=codes_gal; ncode=19; break;
         case SYS_QZS: np=4; offp=192; codes=codes_qzs; ncode=13; break;
-        case SYS_CMP: np=6; offp=  1; codes=codes_bds; ncode= 9; break;
+        case SYS_CMP: np=6; offp=  1; codes=codes_bds; ncode=12; break;
         case SYS_SBS: np=6; offp=120; codes=codes_sbs; ncode= 4; break;
         default: return sync?0:10;
     }
@@ -1706,7 +1706,7 @@ static int decode_ssr7(rtcm_t *rtcm, int sys)
         case SYS_GLO: np=5; offp=  0; codes=codes_glo; ncode= 4; break;
         case SYS_GAL: np=6; offp=  0; codes=codes_gal; ncode=19; break;
         case SYS_QZS: np=4; offp=192; codes=codes_qzs; ncode=13; break;
-        case SYS_CMP: np=6; offp=  1; codes=codes_bds; ncode= 9; break;
+        case SYS_CMP: np=6; offp=  1; codes=codes_bds; ncode=12; break;
         default: return sync?0:10;
     }
     for (j=0;j<nsat&&i+5+17+np<=rtcm->len*8;j++) {
@@ -1820,13 +1820,8 @@ static void save_msm_obs(rtcm_t *rtcm, int sys, msm_h_t *h, const double *r,
             default: sig[i]=""; break;
         }
         /* signal to rinex obs type */
-        code[i]=obs2code(sig[i],freq+i);
-        
-        /* freqency index for beidou */
-        if (sys==SYS_CMP) {
-            if      (freq[i]==5) freq[i]=2; /* B2 */
-            else if (freq[i]==4) freq[i]=3; /* B3 */
-        }
+        code[i]=obs2code(sys,sig[i],freq+i);
+
         if (code[i]!=CODE_NONE) {
             if (q) q+=sprintf(q,"L%s%s",sig[i],i<h->nsig-1?",":"");
         }
diff --git a/src/rtcm3e.c b/src/rtcm3e.c
index 38503df8d8dbb6c262446a7950b40eb6ea5b79b4..7ffcb5e958dc16909789e6f026289afcecc9f39d 100644
--- a/src/rtcm3e.c
+++ b/src/rtcm3e.c
@@ -1387,8 +1387,8 @@ static const int codes_qzs[]={
     CODE_L5X,CODE_L6S,CODE_L6L,CODE_L6X,CODE_L1X
 };
 static const int codes_bds[]={
-    CODE_L1I,CODE_L1Q,CODE_L1X,CODE_L7I,CODE_L7Q,CODE_L7X,CODE_L6I,CODE_L6Q,
-    CODE_L6X
+    CODE_L1I,CODE_L1Q,CODE_L1X,CODE_L2I,CODE_L2Q,CODE_L2X,
+    CODE_L7I,CODE_L7Q,CODE_L7X,CODE_L6I,CODE_L6Q,CODE_L6X
 };
 static const int codes_sbs[]={
     CODE_L1C,CODE_L5I,CODE_L5Q,CODE_L5X
@@ -1506,7 +1506,7 @@ static int encode_ssr3(rtcm_t *rtcm, int sys, int sync)
         case SYS_GLO: np=5; offp=  0; codes=codes_glo; ncode= 4; break;
         case SYS_GAL: np=6; offp=  0; codes=codes_gal; ncode=19; break;
         case SYS_QZS: np=4; offp=192; codes=codes_qzs; ncode=13; break;
-        case SYS_CMP: np=6; offp=  1; codes=codes_bds; ncode= 9; break;
+        case SYS_CMP: np=6; offp=  1; codes=codes_bds; ncode=12; break;
         case SYS_SBS: np=6; offp=120; codes=codes_sbs; ncode= 4; break;
         default: return 0;
     }
@@ -1690,7 +1690,7 @@ static int encode_ssr7(rtcm_t *rtcm, int sys, int sync)
         case SYS_GLO: np=5; offp=  0; codes=codes_glo; ncode= 4; break;
         case SYS_GAL: np=6; offp=  0; codes=codes_gal; ncode=19; break;
         case SYS_QZS: np=4; offp=192; codes=codes_qzs; ncode=13; break;
-        case SYS_CMP: np=6; offp=  1; codes=codes_bds; ncode= 9; break;
+        case SYS_CMP: np=6; offp=  1; codes=codes_bds; ncode=12; break;
         default: return 0;
     }
     /* number of satellites */
@@ -1760,7 +1760,7 @@ static int to_sigid(int sys, unsigned char code, int *freq)
         else if (code==CODE_L2M) code=CODE_L2P;
         else if (code==CODE_L2N) code=CODE_L2P;
     }
-    if (!*(sig=code2obs(code,freq))) return 0;
+    if (!*(sig=code2obs(sys,code,freq))) return 0;
     
     switch (sys) {
         case SYS_GPS: msm_sig=msm_sig_gps; break;
diff --git a/src/rtkcmn.c b/src/rtkcmn.c
index 40f6531fa0ed14d89c4dd8a426ddff3da61735ce..8013b936bf533348d64bee2c75eeeb89ae5e4490 100644
--- a/src/rtkcmn.c
+++ b/src/rtkcmn.c
@@ -252,17 +252,27 @@ static char *obscodes[]={       /* observation code strings */
     "5B","5C","9A","9B","9C", "9X",""  ,""  ,""  ,""    /* 50-59 */
 };
 static unsigned char obsfreqs[]={
-    /* 1:L1/E1, 2:L2/B1, 3:E5b/B2, 4:L5/E5a/L3, 5:L6/LEX/B3, 6:E5(a+b), 7:S */
+    /* 1:L1/E1, 2:L2, 3:E5b, 4:L5/E5a/L3, 5:E6/LEX, 6:E5(a+b), 7:S */
     0, 1, 1, 1, 1,  1, 1, 1, 1, 1, /*  0- 9 */
     1, 1, 1, 1, 2,  2, 2, 2, 2, 2, /* 10-19 */
     2, 2, 2, 2, 4,  4, 4, 3, 3, 3, /* 20-29 */
     5, 5, 5, 5, 5,  5, 5, 6, 6, 6, /* 30-39 */
-    2, 2, 5, 5, 4,  4, 4, 1, 1, 4, /* 40-49 */
+    1, 1, 3, 3, 4,  4, 4, 1, 1, 4, /* 40-49 */
     4, 4, 7, 7, 7,  7, 0, 0, 0, 0  /* 50-59 */
 };
+static unsigned char obsfreqs_cmp[]={
+    /* 1:B1, 2:B2, 3:B3 */
+    0, 1, 1, 1, 1,  1, 1, 1, 1, 1, /*  0- 9 */
+    1, 1, 1, 1, 2,  2, 2, 2, 1, 2, /* 10-19 */
+    2, 2, 2, 2, 4,  4, 4, 2, 2, 2, /* 20-29 */
+    5, 5, 5, 3, 5,  5, 5, 6, 6, 6, /* 30-39 */
+    1, 1, 3, 3, 4,  4, 4, 1, 1, 4, /* 40-49 */
+    4, 4, 7, 7, 7,  7, 0, 0, 0, 0  /* 50-59 */
+};
+
 static char codepris[7][MAXFREQ][16]={  /* code priority table */
 
-   /* L1/E1      L2/B1   E5b/B2  L5/E5a/L3 L6/LEX/B3     E5(a+b)  S */
+   /* L1/E1/B1   L2/B2      E5b/B3  L5/E5a/L3 E6/LEX     E5(a+b)  S */
     {"CPYWMNSL","CLPYWMNDSX","IQX"   ,"IQX"   ,""        ,""      ,""    }, /* GPS */
     {"PC"      ,"PC"        ,"IQX"   ,"IQX"   ,""        ,""      ,""    }, /* GLO */
     {"CABXZ"   ,""          ,"IQX"   ,"IQX"   ,"ABCXZ"   ,"IQX"   ,""    }, /* GAL */
@@ -586,13 +596,19 @@ extern int testsnr(int base, int freq, double el, double snr,
 * return : obs code (CODE_???)
 * notes  : obs codes are based on reference [6] and qzss extension
 *-----------------------------------------------------------------------------*/
-extern unsigned char obs2code(const char *obs, int *freq)
+extern unsigned char obs2code(int sys, const char *obs, int *freq)
 {
     int i;
     if (freq) *freq=0;
     for (i=1;*obscodes[i];i++) {
         if (strcmp(obscodes[i],obs)) continue;
-        if (freq) *freq=obsfreqs[i];
+        
+    if (freq) {
+       if (sys==SYS_CMP)
+           *freq=obsfreqs_cmp[i];
+       else
+           *freq=obsfreqs[i];
+    }
         return (unsigned char)i;
     }
     return CODE_NONE;
@@ -601,16 +617,21 @@ extern unsigned char obs2code(const char *obs, int *freq)
 * convert obs code to obs code string
 * args   : unsigned char code I obs code (CODE_???)
 *          int    *freq  IO     frequency (NULL: no output)
-*                               (1:L1/E1, 2:L2/B1, 3:L5/E5a/L3, 4:L6/LEX/B3,
-                                 5:E5b/B2, 6:E5(a+b), 7:S)
+*                               (1:L1/E1/B1, 2:L2/B2, 3:L5/E5a/L3/B3, 4:L6/LEX,
+                                 5:E5b, 6:E5(a+b), 7:S)
 * return : obs code string ("1C","1P","1P",...)
 * notes  : obs codes are based on reference [6] and qzss extension
 *-----------------------------------------------------------------------------*/
-extern char *code2obs(unsigned char code, int *freq)
+extern char *code2obs(int sys, unsigned char code, int *freq)
 {
     if (freq) *freq=0;
     if (code<=CODE_NONE||MAXCODE<code) return "";
-    if (freq) *freq=obsfreqs[code];
+    if (freq) {
+       if (sys==SYS_CMP)
+           *freq=obsfreqs_cmp[code];
+       else
+           *freq=obsfreqs[code];
+    }
     return obscodes[code];
 }
 /* set code priority -----------------------------------------------------------
@@ -657,7 +678,7 @@ extern int getcodepri(int sys, unsigned char code, const char *opt)
         case SYS_IRN: i=6; optstr="-IL%2s"; break;
         default: return 0;
     }
-    obs=code2obs(code,&j);
+    obs=code2obs(sys,code,&j);
     
     /* parse code options */
     for (p=opt;p&&(p=strchr(p,'-'));p++) {
diff --git a/src/rtklib.h b/src/rtklib.h
index 5b3e21261b9c1aed543df729a0fe1766a8a22e22..b11139a4480c201c65439bb98f8e5eb802c2ee7d 100644
--- a/src/rtklib.h
+++ b/src/rtklib.h
@@ -1449,8 +1449,8 @@ EXPORT int  satno   (int sys, int prn);
 EXPORT int  satsys  (int sat, int *prn);
 EXPORT int  satid2no(const char *id);
 EXPORT void satno2id(int sat, char *id);
-EXPORT unsigned char obs2code(const char *obs, int *freq);
-EXPORT char *code2obs(unsigned char code, int *freq);
+EXPORT unsigned char obs2code(int sys, const char *obs, int *freq);
+EXPORT char *code2obs(int sys, unsigned char code, int *freq);
 EXPORT int  satexclude(int sat, double var, int svh, const prcopt_t *opt);
 EXPORT int  testsnr(int base, int freq, double el, double snr,
                     const snrmask_t *mask);