Index: trunk/source/Lib/TLibEncoder/TEncCavlc.cpp
===================================================================
--- trunk/source/Lib/TLibEncoder/TEncCavlc.cpp	(revision 540)
+++ trunk/source/Lib/TLibEncoder/TEncCavlc.cpp	(revision 547)
@@ -669,4 +669,7 @@
   UInt numBytesInVps = this->m_pcBitIf->getNumberOfWrittenBits();
 #endif
+#if VPS_VUI_OFFSET
+   m_vpsVuiCounter = this->m_pcBitIf->getNumberOfWrittenBits();
+#endif
   WRITE_CODE( pcVPS->getVPSId(),                    4,        "vps_video_parameter_set_id" );
   WRITE_CODE( 3,                                    2,        "vps_reserved_three_2bits" );
@@ -795,5 +798,25 @@
 
   WRITE_FLAG( vps->getAvcBaseLayerFlag(),              "avc_base_layer_flag" );
+#if O0109_MOVE_VPS_VUI_FLAG
+#if !VPS_VUI
+  WRITE_FLAG( 0,                     "vps_vui_present_flag" );
+  vps->setVpsVuiPresentFlag(false);
+#else
+  WRITE_FLAG( 1,                     "vps_vui_present_flag" );
+  vps->setVpsVuiPresentFlag(true);
+#endif
+  if ( vps->getVpsVuiPresentFlag() ) 
+  {
+#if VPS_VUI_OFFSET
+    WRITE_CODE( vps->getVpsVuiOffset(  ), 16,             "vps_vui_offset" );
+#endif
+    WRITE_FLAG( vps->getSplittingFlag(),                 "splitting_flag" );
+  }
+#else
+#if VPS_VUI_OFFSET
+  WRITE_CODE( vps->getVpsVuiOffset(  ), 16,             "vps_vui_offset" );  
+#endif
   WRITE_FLAG( vps->getSplittingFlag(),                 "splitting_flag" );
+#endif // O0109_MOVE_VPS_VUI_FLAG
 
   for(i = 0; i < MAX_VPS_NUM_SCALABILITY_TYPES; i++)
@@ -841,12 +864,29 @@
   //   However, this is a bug in the text since, view_id_len_minus1 is needed to parse view_id_val. 
   {
+#if O0109_VIEW_ID_LEN
+    WRITE_CODE( vps->getViewIdLen( ), 4, "view_id_len" );
+    assert ( vps->getNumViews() >= (1<<vps->getViewIdLen()) );
+#else
     WRITE_CODE( vps->getViewIdLenMinus1( ), 4, "view_id_len_minus1" );
-  }
-
+#endif
+  }
+
+#if O0109_VIEW_ID_LEN
+  if ( vps->getViewIdLen() > 0 )
+  {
+#endif
   for(  i = 0; i < vps->getNumViews(); i++ )
   {
+#if O0109_VIEW_ID_LEN
+    WRITE_CODE( vps->getViewIdVal( i ), vps->getViewIdLen( ), "view_id_val[i]" );
+#else
     WRITE_CODE( vps->getViewIdVal( i ), vps->getViewIdLenMinus1( ) + 1, "view_id_val[i]" );
-  }
-#endif
+#endif
+  }
+#if O0109_VIEW_ID_LEN
+  }
+#endif
+#endif // VIEW_ID_RELATED_SIGNALING
+
 #if VPS_EXTN_DIRECT_REF_LAYERS
   for( Int layerCtr = 1; layerCtr <= vps->getMaxLayers() - 1; layerCtr++)
@@ -931,5 +971,9 @@
   if( numOutputLayerSets > 1 )
   {
+#if O0109_DEFAULT_ONE_OUT_LAYER_IDC
+    WRITE_CODE( vps->getDefaultOneTargetOutputLayerIdc(), 2, "default_one_target_output_layer_idc" );   
+#else
     WRITE_FLAG( vps->getDefaultOneTargetOutputLayerFlag(), "default_one_target_output_layer_flag" );   
+#endif
   }
 
@@ -1072,4 +1116,6 @@
 #endif
 #endif
+
+#if !O0109_O0199_FLAGS_TO_VUI
 #if M0040_ADAPTIVE_RESOLUTION_CHANGE
   WRITE_FLAG(vps->getSingleLayerForNonIrapFlag(), "single_layer_for_non_irap_flag" );
@@ -1078,5 +1124,7 @@
   WRITE_FLAG(vps->getHigherLayerIrapSkipFlag(), "higher_layer_irap_skip_flag" );
 #endif
-
+#endif
+
+#if !O0109_MOVE_VPS_VUI_FLAG
 #if !VPS_VUI
   WRITE_FLAG( 0,                     "vps_vui_present_flag" );
@@ -1089,7 +1137,27 @@
       WRITE_FLAG(1,                  "vps_vui_alignment_bit_equal_to_one");
     }
+#if VPS_VUI_OFFSET
+    Int vpsVuiOffsetValeInBits = this->m_pcBitIf->getNumberOfWrittenBits() - m_vpsVuiCounter + 16; // 2 bytes for NUH
+    assert( vpsVuiOffsetValeInBits % 8 == 0 );
+    vps->setVpsVuiOffset( vpsVuiOffsetValeInBits >> 3 );
+#endif
     codeVPSVUI(vps);  
   }
 #endif 
+#else
+  if(vps->getVpsVuiPresentFlag())   // Should be conditioned on the value of vps_vui_present_flag
+  {
+    while ( m_pcBitIf->getNumberOfWrittenBits() % 8 != 0 )
+    {
+      WRITE_FLAG(1,                  "vps_vui_alignment_bit_equal_to_one");
+    }
+#if VPS_VUI_OFFSET
+    Int vpsVuiOffsetValeInBits = this->m_pcBitIf->getNumberOfWrittenBits() - m_vpsVuiCounter + 16; // 2 bytes for NUH
+    assert( vpsVuiOffsetValeInBits % 8 == 0 );
+    vps->setVpsVuiOffset( vpsVuiOffsetValeInBits >> 3 );
+#endif
+    codeVPSVUI(vps);  
+  }
+#endif // 0109_MOVE_VPS_FLAG
 }
 #endif
@@ -1225,4 +1293,13 @@
     }
   }
+#endif
+
+#if O0109_O0199_FLAGS_TO_VUI
+#if M0040_ADAPTIVE_RESOLUTION_CHANGE
+  WRITE_FLAG(vps->getSingleLayerForNonIrapFlag(), "single_layer_for_non_irap_flag" );
+#endif
+#if HIGHER_LAYER_IRAP_SKIP_FLAG
+  WRITE_FLAG(vps->getHigherLayerIrapSkipFlag(), "higher_layer_irap_skip_flag" );
+#endif
 #endif
 #if N0160_VUI_EXT_ILP_REF
Index: trunk/source/Lib/TLibEncoder/TEncCavlc.h
===================================================================
--- trunk/source/Lib/TLibEncoder/TEncCavlc.h	(revision 540)
+++ trunk/source/Lib/TLibEncoder/TEncCavlc.h	(revision 547)
@@ -68,5 +68,7 @@
   TComSlice*    m_pcSlice;
   UInt          m_uiCoeffCost;
-
+#if VPS_VUI_OFFSET
+  Int m_vpsVuiCounter;
+#endif
   Void codeShortTermRefPicSet              ( TComSPS* pcSPS, TComReferencePictureSet* pcRPS, Bool calledFromSliceHeader, Int idx );
   Bool findMatchingLTRP ( TComSlice* pcSlice, UInt *ltrpsIndex, Int ltrpPOC, Bool usedFlag );
Index: trunk/source/Lib/TLibEncoder/TEncGOP.cpp
===================================================================
--- trunk/source/Lib/TLibEncoder/TEncGOP.cpp	(revision 540)
+++ trunk/source/Lib/TLibEncoder/TEncGOP.cpp	(revision 547)
@@ -1753,4 +1753,7 @@
       OutputNALUnit nalu(NAL_UNIT_VPS);
 #endif
+#if VPS_VUI_OFFSET
+      // The following code also calculates the VPS VUI offset
+#endif
 #if VPS_EXTN_OFFSET_CALC
       OutputNALUnit tempNalu(NAL_UNIT_VPS, 0, 0        ); // The value of nuh_layer_id of VPS NAL unit shall be equal to 0.
