diff --git a/doc/software-manual.tex b/doc/software-manual.tex
index 37126222c1c8a383cbc04bd007b473860d604f8b..70fef7c8b7e604ba615e73179ee54dc788c64bd3 100644
--- a/doc/software-manual.tex
+++ b/doc/software-manual.tex
@@ -1354,6 +1354,12 @@ Specifies the value of gci_no_act_constraint_flag
 Specifies the value of gci_no_explicit_scaling_list_constraint_flag
 \\
 
+\Option{NoChromaQpOffsetConstraintFlag} &
+%\ShortOption{\None} &
+\Default{false} &
+Specifies the value of gic_no_chroma_qp_offset_constraint_flag
+\\
+
 \Option{NoDepQuantConstraintFlag} &
 %\ShortOption{\None} &
 \Default{false} &
diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp
index 21deb722ac2c48a1d64a2ee331c2cd61912a4375..1496af0b16e9da5b0aee50b219f17e4ae750acb3 100644
--- a/source/App/EncoderApp/EncApp.cpp
+++ b/source/App/EncoderApp/EncApp.cpp
@@ -463,6 +463,10 @@ void EncApp::xInitLibCfg()
 
     m_cEncLib.setNoVirtualBoundaryConstraintFlag(m_noVirtualBoundaryConstraintFlag);
     CHECK(m_noVirtualBoundaryConstraintFlag && m_virtualBoundariesEnabledFlag, "Virtuall boundaries shall be deactivated when m_noVirtualBoundaryConstraintFlag is equal to 1");
+#endif
+#if JVET_R0341_GCI
+    m_cEncLib.setNoChromaQpOffsetConstraintFlag(m_noChromaQpOffsetConstraintFlag);
+    CHECK(m_noChromaQpOffsetConstraintFlag && m_cuChromaQpOffsetSubdiv, "Chroma Qp offset shall be 0 when m_noChromaQpOffsetConstraintFlag is equal to 1");
 #endif
   }
   else
@@ -542,6 +546,9 @@ void EncApp::xInitLibCfg()
     m_cEncLib.setNoPaletteConstraintFlag(false);
     m_cEncLib.setNoActConstraintFlag(false);
     m_cEncLib.setNoLmcsConstraintFlag(false);
+#if JVET_R0341_GCI
+    m_cEncLib.setNoChromaQpOffsetConstraintFlag(false);
+#endif
   }
 
   //====== Coding Structure ========
diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp
index d64932d2c098fef271da68813b9bc8f66534244c..b7f24437cc26afff9856f618ad59d1a25bf0e2a5 100644
--- a/source/App/EncoderApp/EncAppCfg.cpp
+++ b/source/App/EncoderApp/EncAppCfg.cpp
@@ -889,6 +889,9 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
   ("NoActConstraintFlag",                             m_noActConstraintFlag,                            false, "Indicate that ACT is deactivated")
 #if JVET_S0050_GCI
   ("NoExplicitScaleListConstraintFlag",               m_noExplicitScaleListConstraintFlag,              false, "Indicate that explicit scaling list is deactivated")
+#endif
+#if JVET_R0341_GCI
+  ("NoChromaQpOffsetConstraintFlag",                  m_noChromaQpOffsetConstraintFlag,                 false, "Indicate that chroma qp offset is zero")
 #endif
   ("NoDepQuantConstraintFlag",                        m_noDepQuantConstraintFlag,                      false, "Indicate that DQ is deactivated")
   ("NoSignDataHidingConstraintFlag",                  m_noSignDataHidingConstraintFlag,                false, "Indicate that SDH is deactivated")
diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h
index a5653b2f3e02a9112e36ee519a81f7318883a80f..bc87daf5edc3bbe99ae2d683721785287cc199eb 100644
--- a/source/App/EncoderApp/EncAppCfg.h
+++ b/source/App/EncoderApp/EncAppCfg.h
@@ -157,6 +157,9 @@ protected:
 #endif
 #if JVET_S0058_GCI
   bool      m_noMttConstraintFlag;
+#endif
+#if JVET_R0341_GCI
+  bool      m_noChromaQpOffsetConstraintFlag;
 #endif
   bool      m_noQtbttDualTreeIntraConstraintFlag;
 #if JVET_S0066_GCI
diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 744889ac7205577700c6552b091b0b899ae0619a..ddbd20b9b8e97b38b1f70c9cf3fbfbe07b2037cc 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -4602,6 +4602,9 @@ bool             operator == (const ConstraintInfo& op1, const ConstraintInfo& o
   if (op1.m_noExplicitScaleListConstraintFlag            != op2.m_noExplicitScaleListConstraintFlag              ) return false;
   if (op1.m_noVirtualBoundaryConstraintFlag              != op2.m_noVirtualBoundaryConstraintFlag                ) return false;
 #endif
+#if JVET_R0341_GCI
+  if (op1.m_noChromaQpOffsetConstraintFlag               != op2.m_noChromaQpOffsetConstraintFlag                 ) return false;
+#endif
 #if JVET_Q0114_ASPECT5_GCI_FLAG
   if (op1.m_noRprConstraintFlag                          != op2.m_noRprConstraintFlag                            ) return false;
   if (op1.m_noResChangeInClvsConstraintFlag              != op2.m_noResChangeInClvsConstraintFlag                ) return false;
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index 4d3b18fe1d0f90a93ae012b207811ea01a3953b8..80848038ff4b9d840aebdb61db2c0a60d1fec836 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -286,6 +286,9 @@ class ConstraintInfo
 #endif
 #if JVET_S0058_GCI
   bool              m_noMttConstraintFlag;
+#endif
+#if JVET_R0341_GCI
+  bool              m_noChromaQpOffsetConstraintFlag;
 #endif
   bool              m_noQtbttDualTreeIntraConstraintFlag;
 #if JVET_S0066_GCI
@@ -392,6 +395,9 @@ public:
 #endif
 #if JVET_S0058_GCI
     , m_noMttConstraintFlag(false)
+#endif
+#if JVET_R0341_GCI
+    , m_noChromaQpOffsetConstraintFlag(false)
 #endif
     , m_noQtbttDualTreeIntraConstraintFlag(false)
 #if JVET_S0066_GCI
@@ -541,6 +547,10 @@ public:
 #if JVET_S0058_GCI
   bool          getNoMttConstraintFlag() const { return m_noMttConstraintFlag; }
   void          setNoMttConstraintFlag(bool bVal) { m_noMttConstraintFlag = bVal; }
+#endif
+#if JVET_R0341_GCI
+  bool          getNoChromaQpOffsetConstraintFlag() const { return m_noChromaQpOffsetConstraintFlag; }
+  void          setNoChromaQpOffsetConstraintFlag(bool b) { m_noChromaQpOffsetConstraintFlag = b; }
 #endif
   bool          getNoQtbttDualTreeIntraConstraintFlag() const { return m_noQtbttDualTreeIntraConstraintFlag; }
   void          setNoQtbttDualTreeIntraConstraintFlag(bool bVal) { m_noQtbttDualTreeIntraConstraintFlag = bVal; }
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 4b9af31596c7401e1c35f7f24408ea2c5c7df472..4b254718a6255a8f1cd66d3b55f6c0abf57bf402 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -54,6 +54,8 @@
 //########### place macros to be removed in next cycle below this line ###############
 #define JVET_S0058_GCI                                    1 // no_mtt_constraint_flag and no_weightedpred_constraint_flag
 
+#define JVET_R0341_GCI                                    1 // JVET-R0341: on constraint flag for local chroma QP control
+
 #define JVET_S0203                                        1 // JVET-S0203 (aspects 1 & 2): change the signalling of sublayer_level_idc[ i ] and ptl_sublayer_level_present_flag[ i ] to be in descending order
 
 #define JVET_S0066_GCI                                    1 // JVET-S0066: Signal new GCI flags gci_three_minus_max_log2_ctu_size_constraint_idc and gci_no_luma_transform_size_64_constraint_flag (no_explicit_scaling_list_constraint_flag already included as part of JVET-S0050)
diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp
index baca3225fa9de7c5ce73bffc6959c65d526d7a56..7cb6755cdef3b42e6ccf28254fd1a90274f34ec9 100644
--- a/source/Lib/DecoderLib/DecLib.cpp
+++ b/source/Lib/DecoderLib/DecLib.cpp
@@ -1910,6 +1910,14 @@ void DecLib::xCheckParameterSetConstraints(const int layerId)
     CHECK((sps->getUseWP() || sps->getUseWPBiPred()), "When gci_no_weighted_prediction_constraint_flag is equal to 1, the values of sps_weighted_pred_flag and sps_weighted_bipred_flag shall be equal to 0");
   }
 #endif
+
+#if JVET_R0341_GCI
+  if (sps->getProfileTierLevel()->getConstraintInfo()->getNoChromaQpOffsetConstraintFlag())
+  {
+    CHECK((pps->getCuChromaQpOffsetListEnabledFlag()), "When gci_no_ChromaQpOffset_constraint_flag is equal to 1, the values of pps_cu_chroma_qp_offset_list_enabled_flag shall be equal to 0");
+  }
+#endif
+
 #if JVET_S0066_GCI
   CHECK(sps->getCTUSize() > (1 << sps->getProfileTierLevel()->getConstraintInfo()->getMaxLog2CtuSizeConstraintIdc()), "The CTU size specified by sps_log2_ctu_size_minus5 shall not exceed the constraint specified by gci_three_minus_max_log2_ctu_size_constraint_idc");
 
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 2093b7c95058844a62f29310f809184771c616be..c5b46369cb699f35b61ae2c29cf3bb2e60b0e329 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -4851,6 +4851,9 @@ void HLSyntaxReader::parseConstraintInfo(ConstraintInfo *cinfo)
     READ_FLAG(symbol, "no_act_constraint_flag");                     cinfo->setNoActConstraintFlag(symbol > 0 ? true : false);
 #if JVET_S0050_GCI
     READ_FLAG(symbol, "no_explicit_scaling_list_constraint_flag");   cinfo->setNoExplicitScaleListConstraintFlag(symbol > 0 ? true : false);
+#endif
+#if JVET_R0341_GCI
+    READ_FLAG(symbol, "gci_no_chroma_qp_offset_constraint_flag");    cinfo->setNoChromaQpOffsetConstraintFlag(symbol > 0 ? true : false);
 #endif
     READ_FLAG(symbol, "no_lmcs_constraint_flag");                    cinfo->setNoLmcsConstraintFlag(symbol > 0 ? true : false);
     READ_FLAG(symbol, "no_qp_delta_constraint_flag");                cinfo->setNoQpDeltaConstraintFlag(symbol > 0 ? true : false);
diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h
index 896610340bcae863479338852c078daf126142d4..df5a09305b56d757e315285260acafdeadf28e6d 100644
--- a/source/Lib/EncoderLib/EncCfg.h
+++ b/source/Lib/EncoderLib/EncCfg.h
@@ -202,6 +202,9 @@ protected:
 #endif
 #if JVET_S0058_GCI
   bool      m_noMttConstraintFlag;
+#endif
+#if JVET_R0341_GCI
+  bool      m_noChromaQpOffsetConstraintFlag;
 #endif
   bool      m_noQtbttDualTreeIntraConstraintFlag;
 #if JVET_S0066_GCI
@@ -856,6 +859,10 @@ public:
 #if JVET_S0058_GCI
   bool          getNoMttConstraintFlag() const { return m_noMttConstraintFlag; }
   void          setNoMttConstraintFlag(bool val) { m_noMttConstraintFlag = val; }
+#endif
+#if JVET_R0341_GCI
+  bool      getNoChromaQpOffsetConstraintFlag() const { return m_noChromaQpOffsetConstraintFlag; }
+  void      setNoChromaQpOffsetConstraintFlag(bool bVal) { m_noChromaQpOffsetConstraintFlag = bVal; }
 #endif
   bool      getNoQtbttDualTreeIntraConstraintFlag() const { return m_noQtbttDualTreeIntraConstraintFlag; }
   void      setNoQtbttDualTreeIntraConstraintFlag(bool val) { m_noQtbttDualTreeIntraConstraintFlag = val; }
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index c8b7fefc1a60a60ddd41ed30f0c153d849d6b3a8..9bfd1e402120aa1d66567e31e7ff00bb73a4cfef 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -1165,6 +1165,9 @@ void EncLib::xInitSPS( SPS& sps )
 #endif
 #if JVET_S0058_GCI
   cinfo->setNoMttConstraintFlag(m_noMttConstraintFlag);
+#endif
+#if JVET_R0341_GCI
+  cinfo->setNoChromaQpOffsetConstraintFlag(m_noChromaQpOffsetConstraintFlag);
 #endif
   cinfo->setNoQtbttDualTreeIntraConstraintFlag(m_noQtbttDualTreeIntraConstraintFlag);
   cinfo->setNoPartitionConstraintsOverrideConstraintFlag(m_noPartitionConstraintsOverrideConstraintFlag);
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 704d9ff9074cdb54d97073f6bed48527563f7249..ace8479ba0803829a8e35cc5c01cf164ca029745 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -2774,6 +2774,9 @@ void  HLSWriter::codeConstraintInfo  ( const ConstraintInfo* cinfo )
     WRITE_FLAG(cinfo->getNoActConstraintFlag() ? 1 : 0, "no_act_constraint_flag");
 #if JVET_S0050_GCI
     WRITE_FLAG(cinfo->getNoExplicitScaleListConstraintFlag() ? 1 : 0, "no_explicit_scaling_list_constraint_flag");
+#endif
+#if JVET_R0341_GCI
+    WRITE_FLAG(cinfo->getNoChromaQpOffsetConstraintFlag() ? 1 : 0, "gic_no_chroma_qp_offset_constraint_flag");
 #endif
     WRITE_FLAG(cinfo->getNoLmcsConstraintFlag() ? 1 : 0, "no_lmcs_constraint_flag");
     WRITE_FLAG(cinfo->getNoQpDeltaConstraintFlag() ? 1 : 0, "no_qp_delta_constraint_flag");