diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 88cc3bf67bc68ad0467fff5e1b627e3e0fa27683..df1f7c4e82af5c853482bbb274526e41190c2bed 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -99,6 +99,8 @@
 
 #define JVET_O0078_SINGLE_HMVPLUT                         1 // JVET-O0078:Single HMVP table for all CUs inside the shared merge list region for IBC
 
+#define JVET_O0126_BPWA_INDEX_CODING_FIX                  1 // JVET-O0126 align BPWA index coding with specification
+
 #define FIX_DB_MAX_TRANSFORM_SIZE                         1
 
 #define MRG_SHARELIST_SHARSIZE                            32
diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp
index 508a26b16ef101a2dbcb3b31c96f3094a842d785..271756b9a9620b4dc606691dda007f1f4186b7b3 100644
--- a/source/Lib/DecoderLib/CABACReader.cpp
+++ b/source/Lib/DecoderLib/CABACReader.cpp
@@ -1068,8 +1068,11 @@ void CABACReader::cu_gbi_flag(CodingUnit& cu)
   uint32_t symbol = m_BinDecoder.decodeBin(Ctx::GBiIdx(0));
 
   int32_t numGBi = (cu.slice->getCheckLDC()) ? 5 : 3;
-
+#if JVET_O0126_BPWA_INDEX_CODING_FIX
+  if(symbol == 1)
+#else
   if(symbol == 0)
+#endif
   {
     uint32_t prefixNumBits = numGBi - 2;
     uint32_t step = 1;
@@ -1079,8 +1082,11 @@ void CABACReader::cu_gbi_flag(CodingUnit& cu)
     for(int ui = 0; ui < prefixNumBits; ++ui)
     {
       symbol = m_BinDecoder.decodeBinEP();
-
+#if JVET_O0126_BPWA_INDEX_CODING_FIX
+      if (symbol == 0)
+#else
       if (symbol == 1)
+#endif
       {
         break;
       }
diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp
index d88d2da8559308f9ee50c73a6e903b5eea2da363..8d13acf847c0cab437b31aa720f05560738442ef 100644
--- a/source/Lib/EncoderLib/CABACWriter.cpp
+++ b/source/Lib/EncoderLib/CABACWriter.cpp
@@ -823,9 +823,11 @@ void CABACWriter::cu_gbi_flag(const CodingUnit& cu)
   const uint8_t gbiCodingIdx = (uint8_t)g_GbiCodingOrder[CU::getValidGbiIdx(cu)];
 
   const int32_t numGBi = (cu.slice->getCheckLDC()) ? 5 : 3;
-
+#if JVET_O0126_BPWA_INDEX_CODING_FIX
+  m_BinEncoder.encodeBin((gbiCodingIdx == 0 ? 0 : 1), Ctx::GBiIdx(0));
+#else
   m_BinEncoder.encodeBin((gbiCodingIdx == 0 ? 1 : 0), Ctx::GBiIdx(0));
-
+#endif
   if(numGBi > 2 && gbiCodingIdx != 0)
   {
     const uint32_t prefixNumBits = numGBi - 2;
@@ -836,12 +838,20 @@ void CABACWriter::cu_gbi_flag(const CodingUnit& cu)
     {
       if (gbiCodingIdx == idx)
       {
+#if JVET_O0126_BPWA_INDEX_CODING_FIX
+        m_BinEncoder.encodeBinEP(0);
+#else
         m_BinEncoder.encodeBinEP(1);
+#endif
         break;
       }
       else
       {
+#if JVET_O0126_BPWA_INDEX_CODING_FIX
+        m_BinEncoder.encodeBinEP(1);
+#else
         m_BinEncoder.encodeBinEP(0);
+#endif
         idx += step;
       }
     }