Index: trunk/BNC/src/RTCM3/RTCM3Decoder.cpp
===================================================================
--- trunk/BNC/src/RTCM3/RTCM3Decoder.cpp	(revision 10658)
+++ trunk/BNC/src/RTCM3/RTCM3Decoder.cpp	(revision 10688)
@@ -1690,5 +1690,5 @@
   bool decoded = false;
   uint64_t numbits = 0, bitfield = 0;
-  int i, week, mnum;
+  int i, week;
 
   data += 3; /* header */
@@ -1704,5 +1704,5 @@
     eph._inav = (i == 1046);
     eph._fnav = (i == 1045);
-    mnum = i;
+    int mnum = i;
     GETBITS(i, 6)
     if (i < 1 || i > 36 ) { // max. constellation within I/NAV / F/NAV frames is 36
@@ -2046,4 +2046,44 @@
 //
 ////////////////////////////////////////////////////////////////////////////
+bool RTCM3Decoder::DecodeGLONASSCodePhaseBiases(unsigned char* data, int size) {
+  t_GloBiasInfo gloBiases;
+  uint64_t numbits = 0, bitfield = 0;
+
+  data += 3; // header
+  size -= 6; // header + crc
+
+  SKIPBITS(12) // Message Number
+  GETBITS(gloBiases.staID, 12)
+  GETBITS(gloBiases.indicator, 1) // 0.. not aligned, 1.. aligned
+  SKIPBITS(3) // reserved bits
+  unsigned bitmask;
+  GETBITS(bitmask, 4)
+  bool L1C_valid = bitExtracted(unsigned(bitmask), 1, 0);
+  bool L1P_valid = bitExtracted(unsigned(bitmask), 1, 1);
+  bool L2C_valid = bitExtracted(unsigned(bitmask), 1, 2);
+  bool L2P_valid = bitExtracted(unsigned(bitmask), 1, 3);
+
+  if (L1C_valid) {
+    GETBITS(gloBiases.L1C_value, 16)
+  }
+  if (L1P_valid) {
+    GETBITS(gloBiases.L1P_value, 16)
+  }
+  if (L2C_valid) {
+    GETBITS(gloBiases.L2C_value, 16)
+  }
+  if (L2P_valid) {
+    GETBITS(gloBiases.L2P_value, 16)
+  }
+
+  if (!(_gloBiases == gloBiases)) {
+    _gloBiases.set(gloBiases);
+  }
+
+  return true;
+}
+
+//
+////////////////////////////////////////////////////////////////////////////
 bool RTCM3Decoder::DecodeServiceCRS(unsigned char* data, int size) {
   t_serviceCrs serviceCrs;
@@ -2209,6 +2249,8 @@
       if (_rawFile)
         _staID = _rawFile->staID();
-      /* store the id into the list of loaded blocks */
-      _typeList.push_back(id);
+      /* store the id and message size into the list of loaded blocks */
+      _typeList.push_back(t_typeInfo());
+      _typeList.back().type = id;
+      _typeList.back().size = _BlockSize -6; /* header + crc */
 
       /* SSR I+II data handled in another function, already pass the
@@ -2300,4 +2342,7 @@
             DecodeAntennaPosition(_Message, _BlockSize);
             break;
+          case 1230:
+            DecodeGLONASSCodePhaseBiases(_Message, _BlockSize);
+            break;
           case 1300:
             DecodeServiceCRS(_Message, _BlockSize);
Index: trunk/BNC/src/RTCM3/RTCM3Decoder.h
===================================================================
--- trunk/BNC/src/RTCM3/RTCM3Decoder.h	(revision 10658)
+++ trunk/BNC/src/RTCM3/RTCM3Decoder.h	(revision 10688)
@@ -176,4 +176,11 @@
   bool DecodeServiceCRS(unsigned char* buffer, int bufLen);
   /**
+   * Extract GLONASS L1 and L2 Code-Phase bias messages from 1230 RTCM3 messages
+   * @param buffer the buffer containing CLONASS L1 and L2 Code-Phase biases per station
+   * @param bufLen the length of the buffer (the message length including header+crc)
+   * @return <code>true</code> when data block was decodable
+   */
+  bool DecodeGLONASSCodePhaseBiases(unsigned char* buffer, int bufLen);
+  /**
    * Extract Helmert transformation parameters from 1301 RTCM3 messages
    * @param buffer the buffer containing Helmert transformation parameters RTCM block
