diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
index 332f2e13216b5d4509afd36013faf0745b8cf5a7..eb28dd449a14145b501ee7072bc813d8ca52210e 100644
--- a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
+++ b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
@@ -127,7 +127,7 @@ bool AdaptiveLoopFilter::isCrossedByVirtualBoundaries( const CodingStructure& cs
   const Position currCtuPos(xPos, yPos);
   const CodingUnit *currCtu = cs.getCU(currCtuPos, CHANNEL_TYPE_LUMA);
 #if JVET_O1143_LPF_ACROSS_SUBPIC_BOUNDARY
-  SubPic curSubPic = slice.getPPS()->getSubPicFromPos(currCtuPos);
+  const SubPic& curSubPic = slice.getPPS()->getSubPicFromPos(currCtuPos);
   bool loopFilterAcrossSubPicEnabledFlag = curSubPic.getloopFilterAcrossEnabledFlag();
 #endif
   //top
diff --git a/source/Lib/CommonLib/Mv.cpp b/source/Lib/CommonLib/Mv.cpp
index e95ee8f1a9337a0e78a132d8a8c36d79c19daaa6..5587cbecfd66592a5459203335e512728c9e39d2 100644
--- a/source/Lib/CommonLib/Mv.cpp
+++ b/source/Lib/CommonLib/Mv.cpp
@@ -67,7 +67,7 @@ void clipMv( Mv& rcMv, const Position& pos, const struct Size& size, const SPS&
   int iVerMax = ( pps.getPicHeightInLumaSamples() + iOffset - (int)pos.y - 1 ) << iMvShift;
   int iVerMin = ( -( int ) sps.getMaxCUHeight()   - iOffset - ( int ) pos.y + 1 ) << iMvShift;
 #if JVET_O1143_MV_ACROSS_SUBPIC_BOUNDARY 
-  SubPic curSubPic = pps.getSubPicFromPos(pos);
+  const SubPic& curSubPic = pps.getSubPicFromPos(pos);
   if (curSubPic.getTreatedAsPicFlag()) 
   {
     iHorMax = ((curSubPic.getSubPicRight() + 1)  + iOffset - (int)pos.x - 1 ) << iMvShift;
diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 7ab3aabfffc4b0f5631e7b421a6b265612d69555..3731b840ec1219b0ae397892145e0cfe1cc6aa0e 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -3411,7 +3411,7 @@ void PPS::initSubPic(const SPS &sps)
   }
 }
 
-SubPic PPS::getSubPicFromPos(const Position& pos)  const
+const SubPic& PPS::getSubPicFromPos(const Position& pos)  const
 {
   for (int i = 0; i< m_numSubPics; i++)
   {
@@ -3423,7 +3423,7 @@ SubPic PPS::getSubPicFromPos(const Position& pos)  const
   return m_subPics[0];
 }
 
-SubPic  PPS::getSubPicFromCU(const CodingUnit& cu) const 
+const SubPic&  PPS::getSubPicFromCU(const CodingUnit& cu) const 
 {
   const Position lumaPos = cu.Y().valid() ? cu.Y().pos() : recalcPosition(cu.chromaFormat, cu.chType, CHANNEL_TYPE_LUMA, cu.blocks[cu.chType].pos());
   return getSubPicFromPos(lumaPos);
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index 6254ec6d969ab77295e7378a5c252614069e9168..f7ed56e5e778621c977562cd7357d83eea42987b 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -2335,8 +2335,8 @@ public:
   SubPic                 getSubPic(uint32_t idx) const                                    { return m_subPics[idx]; }
 #endif
   void                   initSubPic(const SPS &sps);
-  SubPic                 getSubPicFromPos(const Position& pos)  const;
-  SubPic                 getSubPicFromCU (const CodingUnit& cu) const;
+  const SubPic&          getSubPicFromPos(const Position& pos)  const;
+  const SubPic&          getSubPicFromCU (const CodingUnit& cu) const;
 #endif
   void                   initRasterSliceMap( std::vector<uint32_t> sizes );
   void                   checkSliceMap(); 
diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp
index fb4e57b9c3e444f49eb94589b1b227404678139e..bab812f74866016b2b9fa2dcc29b1e3b1aa7ac05 100644
--- a/source/Lib/CommonLib/UnitTools.cpp
+++ b/source/Lib/CommonLib/UnitTools.cpp
@@ -1123,7 +1123,7 @@ void PU::getInterMergeCandidates( const PredictionUnit &pu, MergeCtx& mrgCtx,
     bool C0Avail = false;
 #if JVET_O1143_MV_ACROSS_SUBPIC_BOUNDARY
     bool boundaryCond = ((posRB.x + pcv.minCUWidth) < pcv.lumaWidth) && ((posRB.y + pcv.minCUHeight) < pcv.lumaHeight);
-    SubPic curSubPic = pu.cs->slice->getPPS()->getSubPicFromPos(pu.lumaPos());
+    const SubPic& curSubPic = pu.cs->slice->getPPS()->getSubPicFromPos(pu.lumaPos());
     if (curSubPic.getTreatedAsPicFlag())
     {
       boundaryCond = ((posRB.x + pcv.minCUWidth) <= curSubPic.getSubPicRight() &&
@@ -1467,7 +1467,7 @@ bool PU::getColocatedMVP(const PredictionUnit &pu, const RefPicList &eRefPicList
 
 #if JVET_O1143_MV_ACROSS_SUBPIC_BOUNDARY
   // Check the position of colocated block is within a subpicture
-  SubPic curSubPic = pu.cs->slice->getPPS()->getSubPicFromPos(pu.lumaPos());
+  const SubPic &curSubPic = pu.cs->slice->getPPS()->getSubPicFromPos(pu.lumaPos());
   if (curSubPic.getTreatedAsPicFlag())
   {
     if (!curSubPic.isContainingPos(pos))
@@ -1860,7 +1860,7 @@ void PU::fillMvpCand(PredictionUnit &pu, const RefPicList &eRefPicList, const in
 
 #if JVET_O1143_MV_ACROSS_SUBPIC_BOUNDARY
     bool boundaryCond = ((posRB.x + pcv.minCUWidth) < pcv.lumaWidth) && ((posRB.y + pcv.minCUHeight) < pcv.lumaHeight);
-    SubPic curSubPic = pu.cs->slice->getPPS()->getSubPicFromPos(pu.lumaPos());
+    const SubPic &curSubPic = pu.cs->slice->getPPS()->getSubPicFromPos(pu.lumaPos());
     if (curSubPic.getTreatedAsPicFlag())
     {
       boundaryCond = ((posRB.x + pcv.minCUWidth) <= curSubPic.getSubPicRight() &&
@@ -2186,7 +2186,7 @@ void PU::fillAffineMvpCand(PredictionUnit &pu, const RefPicList &eRefPicList, co
       Mv cColMv;
 #if JVET_O1143_MV_ACROSS_SUBPIC_BOUNDARY
       bool boundaryCond = ((posRB.x + pcv.minCUWidth) < pcv.lumaWidth) && ((posRB.y + pcv.minCUHeight) < pcv.lumaHeight);
-      SubPic curSubPic = pu.cs->slice->getPPS()->getSubPicFromPos(pu.lumaPos());
+      const SubPic &curSubPic = pu.cs->slice->getPPS()->getSubPicFromPos(pu.lumaPos());
       if (curSubPic.getTreatedAsPicFlag())
       {
         boundaryCond = ((posRB.x + pcv.minCUWidth) <= curSubPic.getSubPicRight() &&
@@ -2787,7 +2787,7 @@ void PU::getAffineMergeCand( const PredictionUnit &pu, AffineMergeCtx& affMrgCtx
 
 #if JVET_O1143_MV_ACROSS_SUBPIC_BOUNDARY
         bool boundaryCond = ((posRB.x + pcv.minCUWidth) < pcv.lumaWidth) && ((posRB.y + pcv.minCUHeight) < pcv.lumaHeight);
-        SubPic curSubPic = pu.cs->slice->getPPS()->getSubPicFromPos(pu.lumaPos());
+        const SubPic &curSubPic = pu.cs->slice->getPPS()->getSubPicFromPos(pu.lumaPos());
         if (curSubPic.getTreatedAsPicFlag())
         {
           boundaryCond = ((posRB.x + pcv.minCUWidth) <= curSubPic.getSubPicRight() &&
@@ -2988,7 +2988,7 @@ void clipColPos(int& posX, int& posY, const PredictionUnit& pu)
   int ctuY = ((puPos.y >> log2CtuSize) << log2CtuSize);
 #if JVET_O1143_MV_ACROSS_SUBPIC_BOUNDARY
   int horMax;
-  SubPic curSubPic = pu.cu->slice->getPPS()->getSubPicFromPos(puPos);
+  const SubPic &curSubPic = pu.cu->slice->getPPS()->getSubPicFromPos(puPos);
   if (curSubPic.getTreatedAsPicFlag())
   {
     horMax = std::min((int)curSubPic.getSubPicRight(), ctuX + (int)pu.cs->sps->getCTUSize() + 3);
diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp
index 9f523a8acda7963b8cb4cf6cf6015c6ffc040b77..86545c8e90f24ea9bf985d5201533a6eed0484c1 100644
--- a/source/Lib/DecoderLib/DecLib.cpp
+++ b/source/Lib/DecoderLib/DecLib.cpp
@@ -2779,7 +2779,7 @@ void DecLib::xCheckMixedNalUnit(Slice* pcSlice, SPS *sps, InputNALUnit &nalu)
     const unsigned  ctuYPosInCtus = ctuRsAddr / pcSlice->getPPS()->getPicWidthInCtu();
     const unsigned  maxCUSize = sps->getMaxCUWidth();
     Position pos(ctuXPosInCtus*maxCUSize, ctuYPosInCtus*maxCUSize);
-    SubPic curSubPic = pcSlice->getPPS()->getSubPicFromPos(pos);
+    const SubPic &curSubPic = pcSlice->getPPS()->getSubPicFromPos(pos);
 
     // check subpicture constraints
     if ((pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_IDR_W_RADL) && (pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA))
diff --git a/source/Lib/DecoderLib/DecSlice.cpp b/source/Lib/DecoderLib/DecSlice.cpp
index 42418bb80697e847ce6113863f2d9272922500b5..9bb2b66c9019c858d3e01d73d266b01dd49a93ba 100644
--- a/source/Lib/DecoderLib/DecSlice.cpp
+++ b/source/Lib/DecoderLib/DecSlice.cpp
@@ -149,7 +149,7 @@ void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb
     Position pos( ctuXPosInCtus*maxCUSize, ctuYPosInCtus*maxCUSize) ;
     UnitArea ctuArea(cs.area.chromaFormat, Area( pos.x, pos.y, maxCUSize, maxCUSize ) );
 #if JVET_O1143_MV_ACROSS_SUBPIC_BOUNDARY
-    SubPic curSubPic = slice->getPPS()->getSubPicFromPos(pos);
+    const SubPic &curSubPic = slice->getPPS()->getSubPicFromPos(pos);
     // padding/restore at slice level
     if (slice->getPPS()->getNumSubPics()>=2 && curSubPic.getTreatedAsPicFlag() && ctuIdx==0)
     {
diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp
index a7d4ff101af1d26fe4eb5a3f66992da7b515b1ae..b5824a67535255612d6c8a9d65140b2543019972 100644
--- a/source/Lib/EncoderLib/EncSlice.cpp
+++ b/source/Lib/EncoderLib/EncSlice.cpp
@@ -1476,7 +1476,7 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons
     }
 
 #if JVET_O1143_MV_ACROSS_SUBPIC_BOUNDARY
-    SubPic curSubPic = pcSlice->getPPS()->getSubPicFromPos(pos);
+    const SubPic &curSubPic = pcSlice->getPPS()->getSubPicFromPos(pos);
     // padding/restore at slice level
     if (pcSlice->getPPS()->getNumSubPics() >= 2 && curSubPic.getTreatedAsPicFlag() && ctuIdx == 0)
     {
diff --git a/source/Lib/EncoderLib/InterSearch.cpp b/source/Lib/EncoderLib/InterSearch.cpp
index 35ba55a6bbea9871b2b734bc7d61baa88f6b6448..aa95e566d5e18088ec4943bd3742dc1c80c8ec9c 100644
--- a/source/Lib/EncoderLib/InterSearch.cpp
+++ b/source/Lib/EncoderLib/InterSearch.cpp
@@ -8072,7 +8072,7 @@ void InterSearch::xClipMv( Mv& rcMv, const Position& pos, const struct Size& siz
   int verMax = ( pps.getPicHeightInLumaSamples() + offset - (int)pos.y - 1 ) << mvShift;
   int verMin = ( -( int ) sps.getMaxCUHeight()   - offset - ( int ) pos.y + 1 ) << mvShift;
 #if JVET_O1143_MV_ACROSS_SUBPIC_BOUNDARY
-  SubPic curSubPic = pps.getSubPicFromPos(pos);
+  const SubPic &curSubPic = pps.getSubPicFromPos(pos);
   if (curSubPic.getTreatedAsPicFlag()) 
   {
     horMax = ((curSubPic.getSubPicRight() + 1)  + offset - (int)pos.x - 1) << mvShift;