diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 0b607527abf8862924a2b6eefb7dddbe8c5d2f8d..f94e4718785e9da3d852e546ebb279cf8c874b88 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -1718,6 +1718,10 @@ void ChromaQpMappingTable::setParams(const ChromaQpMappingTableParams &params, c
 {
   m_qpBdOffset = qpBdOffset;
   m_sameCQPTableForAllChromaFlag = params.m_sameCQPTableForAllChromaFlag;
+#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
+  m_numQpTables = params.m_numQpTables;
+#endif
+
   for (int i = 0; i < MAX_NUM_CQP_MAPPING_TABLES; i++)
   {
     m_numPtsInCQPTableMinus1[i] = params.m_numPtsInCQPTableMinus1[i];
@@ -1727,7 +1731,11 @@ void ChromaQpMappingTable::setParams(const ChromaQpMappingTableParams &params, c
 }
 void ChromaQpMappingTable::derivedChromaQPMappingTables()
 {
+#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
+  for (int i = 0; i < getNumQpTables(); i++)
+#else
   for (int i = 0; i < (getSameCQPTableForAllChromaFlag() ? 1 : 3); i++)
+#endif
   {
     const int qpBdOffsetC = m_qpBdOffset;
     const int numPtsInCQPTableMinus1 = getNumPtsInCQPTableMinus1(i);
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index dc98597b86cd5268ee8e00872f37ebf0c746c6d8..2473763fcd0fd648df6c2529a6969bda07bff045 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -488,6 +488,9 @@ struct ChromaQpAdj
 struct ChromaQpMappingTableParams {
   int               m_qpBdOffset;
   bool              m_sameCQPTableForAllChromaFlag;
+#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
+  int               m_numQpTables;
+#endif
   int               m_numPtsInCQPTableMinus1[MAX_NUM_CQP_MAPPING_TABLES];
   std::vector<int>  m_deltaQpInValMinus1[MAX_NUM_CQP_MAPPING_TABLES];
   std::vector<int>  m_deltaQpOutVal[MAX_NUM_CQP_MAPPING_TABLES];
@@ -496,6 +499,9 @@ struct ChromaQpMappingTableParams {
   {
     m_qpBdOffset = 12;
     m_sameCQPTableForAllChromaFlag = true;
+#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
+    m_numQpTables = 1;
+#endif
     m_numPtsInCQPTableMinus1[0] = 0;
     m_deltaQpInValMinus1[0] = { 0 };
     m_deltaQpOutVal[0] = { 0 };
@@ -503,6 +509,10 @@ struct ChromaQpMappingTableParams {
 
   void      setSameCQPTableForAllChromaFlag(bool b)                             { m_sameCQPTableForAllChromaFlag = b; }
   bool      getSameCQPTableForAllChromaFlag()                             const { return m_sameCQPTableForAllChromaFlag; }
+#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
+  void      setNumQpTables(int n)                                     { m_numQpTables = n; }
+  int       getNumQpTables()                                     const { return m_numQpTables; }
+#endif
   void      setNumPtsInCQPTableMinus1(int tableIdx, int n)                      { m_numPtsInCQPTableMinus1[tableIdx] = n; }
   int       getNumPtsInCQPTableMinus1(int tableIdx)                       const { return m_numPtsInCQPTableMinus1[tableIdx]; }
   void      setDeltaQpInValMinus1(int tableIdx, std::vector<int> &inVals)       { m_deltaQpInValMinus1[tableIdx] = inVals; }
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 4a220e1062f85b24323fa7ef82c3e1778c19732e..7cf5a6e66fad659eeec664eed66dec55aefcde2f 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -1367,8 +1367,9 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS)
     ChromaQpMappingTableParams chromaQpMappingTableParams;
     READ_FLAG(uiCode, "same_qp_table_for_chroma");        chromaQpMappingTableParams.setSameCQPTableForAllChromaFlag(uiCode);
 #if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
-    int numQPTables = chromaQpMappingTableParams.getSameCQPTableForAllChromaFlag() ? 1 : (pcSPS->getJointCbCrEnabledFlag() ? 3 : 2);
-    for (int i = 0; i < numQPTables; i++)
+    int numQpTables = chromaQpMappingTableParams.getSameCQPTableForAllChromaFlag() ? 1 : (pcSPS->getJointCbCrEnabledFlag() ? 3 : 2);
+    chromaQpMappingTableParams.setNumQpTables(numQpTables);
+    for (int i = 0; i < numQpTables; i++)
 #else
     for (int i = 0; i < (chromaQpMappingTableParams.getSameCQPTableForAllChromaFlag() ? 1 : 3); i++)
 #endif
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index 37a1184f733c7ffe5f8d5803c6fdba2d37c5bdae..172a190ed7352dd13083955a6de302b7538b95f1 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -1112,6 +1112,10 @@ void EncLib::xInitSPS(SPS &sps)
     sps.setLtRefPicPocLsbSps(k, 0);
     sps.setUsedByCurrPicLtSPSFlag(k, 0);
   }
+#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
+  int numQpTables = m_chromaQpMappingTableParams.getSameCQPTableForAllChromaFlag() ? 1 : (sps.getJointCbCrEnabledFlag() ? 3 : 2);
+  m_chromaQpMappingTableParams.setNumQpTables(numQpTables);
+#endif
   sps.setChromaQpMappingTableFromParams(m_chromaQpMappingTableParams, sps.getQpBDOffset(CHANNEL_TYPE_CHROMA));
   sps.derivedChromaQPMappingTables();
 
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index d5d10ce2706fb99d999f243a182079fd916e620c..0f8109952499dbf8bc610a80d6ac937a41e2d63f 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -816,8 +816,9 @@ void HLSWriter::codeSPS( const SPS* pcSPS )
     const ChromaQpMappingTable& chromaQpMappingTable = pcSPS->getChromaQpMappingTable();
     WRITE_FLAG(chromaQpMappingTable.getSameCQPTableForAllChromaFlag(), "same_qp_table_for_chroma");
 #if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
-    int numQPTables = chromaQpMappingTable.getSameCQPTableForAllChromaFlag() ? 1 : (pcSPS->getJointCbCrEnabledFlag() ? 3 : 2);
-    for (int i = 0; i < numQPTables; i++)
+    int numQpTables = chromaQpMappingTable.getSameCQPTableForAllChromaFlag() ? 1 : (pcSPS->getJointCbCrEnabledFlag() ? 3 : 2);
+    CHECK(numQpTables != chromaQpMappingTable.getNumQpTables(), " numQpTables does not match at encoder side ");
+    for (int i = 0; i < numQpTables; i++)
 #else
     for (int i = 0; i < (chromaQpMappingTable.getSameCQPTableForAllChromaFlag() ? 1 : 3); i++)
 #endif