diff --git a/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp b/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp
index bf0ba9d37357dd0170061b69ca7624a26b3cd97a..22591bd24018ff8a9e6b985db7f32882f91fead6 100644
--- a/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp
+++ b/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp
@@ -902,7 +902,7 @@ uint32_t BitstreamExtractorApp::decode()
 
         // create output NAL unit
         OutputNALUnit out (nalu.m_nalUnitType, nalu.m_nuhLayerId, nalu.m_temporalId);
-        out.m_bitstream.getFIFO() = nalu.getBitstream().getFifo();
+        out.m_bitstream.getFifo() = nalu.getBitstream().getFifo();
         // write with start code emulation prevention
         writeNaluContent (bitstreamFileOut, out);
       }
diff --git a/source/App/StreamMergeApp/StreamMergeApp.cpp b/source/App/StreamMergeApp/StreamMergeApp.cpp
index 1f6811a7e6b4ab0f56963fa560e51a6f3e8b39cb..1c02691f06ed09ce6e92656861f50cd19eca88c8 100644
--- a/source/App/StreamMergeApp/StreamMergeApp.cpp
+++ b/source/App/StreamMergeApp/StreamMergeApp.cpp
@@ -523,7 +523,7 @@ void StreamMergeApp::decodeAndRewriteNalu(MergeLayer &layer, InputNALUnit &inNal
     msg(INFO, " with index %i", inNalu.m_nalUnitType);
     // Copy payload from input nalu to output nalu. Code copied from SubpicMergeApp::copyInputNaluToOutputNalu().
     vector<uint8_t> &inFifo  = inNalu.getBitstream().getFifo();
-    vector<uint8_t> &outFifo = outNalu.m_bitstream.getFIFO();
+    vector<uint8_t> &outFifo = outNalu.m_bitstream.getFifo();
     outFifo                  = vector<uint8_t>(inFifo.begin() + 2, inFifo.end());
     break;
   }
diff --git a/source/App/SubpicMergeApp/SubpicMergeApp.cpp b/source/App/SubpicMergeApp/SubpicMergeApp.cpp
index fc6864f7cad69c8977c73db2d36f96c8c8cb0bdc..a738eaae7092209185b861bdd2dfe84e13fc1d28 100644
--- a/source/App/SubpicMergeApp/SubpicMergeApp.cpp
+++ b/source/App/SubpicMergeApp/SubpicMergeApp.cpp
@@ -812,7 +812,7 @@ void SubpicMergeApp::copyInputNaluToOutputNalu(OutputNALUnit &outNalu, InputNALU
 
   // Copy payload
   std::vector<uint8_t> &inFifo = inNalu.getBitstream().getFifo();
-  std::vector<uint8_t> &outFifo = outNalu.m_bitstream.getFIFO();
+  std::vector<uint8_t> &outFifo = outNalu.m_bitstream.getFifo();
   outFifo = std::vector<uint8_t>(inFifo.begin() + 2, inFifo.end());
 }
 
@@ -941,7 +941,7 @@ void SubpicMergeApp::generateMergedPic(ParameterSetManager &psManager, bool mixe
     OutputNALUnit nalu(NAL_UNIT_VPS);
     hlsWriter.setBitstream(&nalu.m_bitstream);
     hlsWriter.codeVPS(vps);
-    psManager.storeVPS(vps, nalu.m_bitstream.getFIFO());
+    psManager.storeVPS(vps, nalu.m_bitstream.getFifo());
     accessUnit.push_back(new NALUnitEBSP(nalu));
   }
 
@@ -953,7 +953,7 @@ void SubpicMergeApp::generateMergedPic(ParameterSetManager &psManager, bool mixe
     OutputNALUnit nalu(NAL_UNIT_SPS);
     hlsWriter.setBitstream(&nalu.m_bitstream);
     hlsWriter.codeSPS(sps);
-    psManager.storeSPS(sps, nalu.m_bitstream.getFIFO());
+    psManager.storeSPS(sps, nalu.m_bitstream.getFifo());
     accessUnit.push_back(new NALUnitEBSP(nalu));
   }
 
@@ -975,7 +975,7 @@ void SubpicMergeApp::generateMergedPic(ParameterSetManager &psManager, bool mixe
     OutputNALUnit nalu(NAL_UNIT_PPS);
     hlsWriter.setBitstream(&nalu.m_bitstream);
     hlsWriter.codePPS(pps);
-    psManager.storePPS(pps, nalu.m_bitstream.getFIFO());
+    psManager.storePPS(pps, nalu.m_bitstream.getFifo());
     accessUnit.push_back(new NALUnitEBSP(nalu));
 
     if (mixedNaluFlag)
@@ -985,7 +985,7 @@ void SubpicMergeApp::generateMergedPic(ParameterSetManager &psManager, bool mixe
       ppsMixed->setPPSId(ppsMixed->getPPSId() + MIXED_NALU_PPS_OFFSET);
       ppsMixed->setMixedNaluTypesInPicFlag(true);
       hlsWriter.codePPS(ppsMixed);
-      psManager.storePPS(ppsMixed, naluMixed.m_bitstream.getFIFO());
+      psManager.storePPS(ppsMixed, naluMixed.m_bitstream.getFifo());
       accessUnit.push_back(new NALUnitEBSP(naluMixed));
     }
   }
diff --git a/source/Lib/CommonLib/BitStream.cpp b/source/Lib/CommonLib/BitStream.cpp
index 1df93d32a0717152d3e99585ad9ffdb31ed472f1..1bbcf5d6bbcb997992bf9ea18af5ec48fd0be743 100644
--- a/source/Lib/CommonLib/BitStream.cpp
+++ b/source/Lib/CommonLib/BitStream.cpp
@@ -59,23 +59,17 @@ OutputBitstream::~OutputBitstream()
 {
 }
 
-
 InputBitstream::InputBitstream()
-: m_fifo()
-, m_emulationPreventionByteLocation()
-, m_fifo_idx(0)
-, m_num_held_bits(0)
-, m_held_bits(0)
-, m_numBitsRead(0)
+  : m_fifo(), m_emulationPreventionByteLocation(), m_fifoIdx(0), m_numHeldBits(0), m_heldBits(0), m_numBitsRead(0)
 { }
 
 InputBitstream::InputBitstream(const InputBitstream &src)
-: m_fifo(src.m_fifo)
-, m_emulationPreventionByteLocation(src.m_emulationPreventionByteLocation)
-, m_fifo_idx(src.m_fifo_idx)
-, m_num_held_bits(src.m_num_held_bits)
-, m_held_bits(src.m_held_bits)
-, m_numBitsRead(src.m_numBitsRead)
+  : m_fifo(src.m_fifo)
+  , m_emulationPreventionByteLocation(src.m_emulationPreventionByteLocation)
+  , m_fifoIdx(src.m_fifoIdx)
+  , m_numHeldBits(src.m_numHeldBits)
+  , m_heldBits(src.m_heldBits)
+  , m_numBitsRead(src.m_numBitsRead)
 { }
 
 // ====================================================================================================================
@@ -84,16 +78,13 @@ InputBitstream::InputBitstream(const InputBitstream &src)
 
 void InputBitstream::resetToStart()
 {
-  m_fifo_idx=0;
-  m_num_held_bits=0;
-  m_held_bits=0;
-  m_numBitsRead=0;
+  m_fifoIdx     = 0;
+  m_numHeldBits = 0;
+  m_heldBits    = 0;
+  m_numBitsRead = 0;
 }
 
-uint8_t* OutputBitstream::getByteStream() const
-{
-  return (uint8_t*) &m_fifo.front();
-}
+const uint8_t *OutputBitstream::getByteStream() const { return m_fifo.data(); }
 
 uint32_t OutputBitstream::getByteStreamLength()
 {
@@ -103,70 +94,74 @@ uint32_t OutputBitstream::getByteStreamLength()
 void OutputBitstream::clear()
 {
   m_fifo.clear();
-  m_held_bits = 0;
-  m_num_held_bits = 0;
+  m_heldBits    = 0;
+  m_numHeldBits = 0;
 }
 
 void OutputBitstream::write(uint32_t bits, uint32_t numberOfBits)
 {
-  CHECK(numberOfBits > 32, "Number of bits is exceeds '32'");
-  CHECK(numberOfBits != 32 && (bits & (~0u << numberOfBits)) != 0, "Unsupported parameters");
+  CHECK(numberOfBits > BITS_PER_WORD, "Number of bits is exceeds '32'");
+  CHECK(numberOfBits != BITS_PER_WORD && (bits & (~0u << numberOfBits)) != 0, "Unsupported parameters");
 
-  /* any modulo 8 remainder of num_total_bits cannot be written this time,
+  /* any modulo 8 remainder of numTotalBits cannot be written this time,
    * and will be held until next time. */
-  uint32_t num_total_bits     = numberOfBits + m_num_held_bits;
-  uint32_t next_num_held_bits = num_total_bits % 8;
-
-  /* form a byte aligned word (write_bits), by concatenating any held bits
-   * with the new bits, discarding the bits that will form the next_held_bits.
-   * eg: H = held bits, V = n new bits        /---- next_held_bits
-   * len(H)=7, len(V)=1: ... ---- HHHH HHHV . 0000 0000, next_num_held_bits=0
-   * len(H)=7, len(V)=2: ... ---- HHHH HHHV . V000 0000, next_num_held_bits=1
+  uint32_t numTotalBits    = numberOfBits + m_numHeldBits;
+  uint32_t nextNumHeldBits = numTotalBits % BITS_PER_BYTE;
+
+  /* form a byte aligned word (writeBits), by concatenating any held bits
+   * with the new bits, discarding the bits that will form the nextHeldBits.
+   * eg: H = held bits, V = n new bits        /---- nextHeldBits
+   * len(H)=7, len(V)=1: ... ---- HHHH HHHV . 0000 0000, nextNumHeldBits=0
+   * len(H)=7, len(V)=2: ... ---- HHHH HHHV . V000 0000, nextNumHeldBits=1
    * if total_bits < 8, the value of v_ is not used */
-  uint8_t next_held_bits = bits << (8 - next_num_held_bits);
+  uint8_t nextHeldBits = bits << (BITS_PER_BYTE - nextNumHeldBits);
 
-  if (!(num_total_bits >> 3))
+  if (numTotalBits < BITS_PER_BYTE)
   {
     /* insufficient bits accumulated to write out, append new_held_bits to
      * current held_bits */
     /* NB, this requires that v only contains 0 in bit positions {31..n} */
-    m_held_bits |= next_held_bits;
-    m_num_held_bits = next_num_held_bits;
+    m_heldBits |= nextHeldBits;
+    m_numHeldBits = nextNumHeldBits;
     return;
   }
 
   /* topword serves to justify held_bits to align with the msb of bits */
-  uint32_t topword    = (numberOfBits - next_num_held_bits) & ~((1 << 3) - 1);
-  uint32_t write_bits = (m_held_bits << topword) | (bits >> next_num_held_bits);
+  uint32_t topword   = (numberOfBits - nextNumHeldBits) & ~BITS_PER_BYTE_MASK;
+  uint32_t writeBits = (m_heldBits << topword) | (bits >> nextNumHeldBits);
 
-  switch (num_total_bits >> 3)
+  switch (numTotalBits >> BITS_PER_BYTE_LOG2)
   {
-  case 4: m_fifo.push_back(write_bits >> 24);
-  case 3: m_fifo.push_back(write_bits >> 16);
-  case 2: m_fifo.push_back(write_bits >> 8);
-  case 1: m_fifo.push_back(write_bits);
+  case 4:
+    m_fifo.push_back(writeBits >> 3 * BITS_PER_BYTE);
+  case 3:
+    m_fifo.push_back(writeBits >> 2 * BITS_PER_BYTE);
+  case 2:
+    m_fifo.push_back(writeBits >> BITS_PER_BYTE);
+  case 1:
+    m_fifo.push_back(writeBits);
   }
 
-  m_held_bits = next_held_bits;
-  m_num_held_bits = next_num_held_bits;
+  m_heldBits    = nextHeldBits;
+  m_numHeldBits = nextNumHeldBits;
 }
 
 void OutputBitstream::writeAlignOne()
 {
-  uint32_t num_bits = getNumBitsUntilByteAligned();
-  write((1 << num_bits) - 1, num_bits);
+  const uint32_t numBits = getNumBitsUntilByteAligned();
+  write((1 << numBits) - 1, numBits);
   return;
 }
 
 void OutputBitstream::writeAlignZero()
 {
-  if (0 == m_num_held_bits)
+  if (0 == m_numHeldBits)
   {
     return;
   }
-  m_fifo.push_back(m_held_bits);
-  m_held_bits = 0;
-  m_num_held_bits = 0;
+  m_fifo.push_back(m_heldBits);
+  m_heldBits    = 0;
+  m_numHeldBits = 0;
 }
 
 /**
@@ -176,29 +171,32 @@ void OutputBitstream::writeAlignZero()
  */
 void   OutputBitstream::addSubstream( OutputBitstream* pcSubstream )
 {
-  uint32_t uiNumBits = pcSubstream->getNumberOfWrittenBits();
+  uint32_t numBits = pcSubstream->getNumberOfWrittenBits();
 
-  const vector<uint8_t>& rbsp = pcSubstream->getFIFO();
-  for (vector<uint8_t>::const_iterator it = rbsp.begin(); it != rbsp.end();)
+  const vector<uint8_t> &rbsp = pcSubstream->getFifo();
+  for (const uint8_t byte: rbsp)
   {
-    write(*it++, 8);
+    write(byte, BITS_PER_BYTE);
   }
-  if (uiNumBits&0x7)
+
+  const uint32_t numTrailingBits = numBits & BITS_PER_BYTE_MASK;
+
+  if (numTrailingBits != 0)
   {
-    write(pcSubstream->getHeldBits()>>(8-(uiNumBits&0x7)), uiNumBits&0x7);
+    write(pcSubstream->getHeldBits() >> (BITS_PER_BYTE - numTrailingBits), numTrailingBits);
   }
 }
 
 void OutputBitstream::writeByteAlignment()
 {
-  write( 1, 1);
+  write(1, 1);
   writeAlignZero();
 }
 
 int OutputBitstream::countStartCodeEmulations()
 {
   uint32_t cnt = 0;
-  vector<uint8_t>& rbsp   = getFIFO();
+  vector<uint8_t> &rbsp = getFifo();
   for (vector<uint8_t>::iterator it = rbsp.begin(); it != rbsp.end();)
   {
     vector<uint8_t>::iterator found = it;
@@ -229,43 +227,43 @@ int OutputBitstream::countStartCodeEmulations()
 
 /**
  * read numberOfBits from bitstream without updating the bitstream
- * state, storing the result in ruiBits.
+ * state, storing the result in bits.
  *
  * If reading numberOfBits would overrun the bitstream buffer,
  * the bitstream is effectively padded with sufficient zero-bits to
  * avoid the overrun.
  */
-void InputBitstream::pseudoRead(uint32_t numberOfBits, uint32_t &ruiBits)
+void InputBitstream::pseudoRead(uint32_t numberOfBits, uint32_t &bits)
 {
-  uint32_t saved_num_held_bits = m_num_held_bits;
-  uint8_t saved_held_bits = m_held_bits;
-  uint32_t saved_fifo_idx = m_fifo_idx;
+  uint32_t savedNumHeldBits = m_numHeldBits;
+  uint8_t  savedHeldBits    = m_heldBits;
+  uint32_t savedFifoIdx     = m_fifoIdx;
 
-  uint32_t num_bits_to_read = min(numberOfBits, getNumBitsLeft());
-  read(num_bits_to_read, ruiBits);
-  ruiBits <<= (numberOfBits - num_bits_to_read);
+  uint32_t numBitsToRead = min(numberOfBits, getNumBitsLeft());
+  read(numBitsToRead, bits);
+  bits <<= (numberOfBits - numBitsToRead);
 
-  m_fifo_idx = saved_fifo_idx;
-  m_held_bits = saved_held_bits;
-  m_num_held_bits = saved_num_held_bits;
+  m_fifoIdx     = savedFifoIdx;
+  m_heldBits    = savedHeldBits;
+  m_numHeldBits = savedNumHeldBits;
 }
 
 void InputBitstream::read(uint32_t numberOfBits, uint32_t &ruiBits)
 {
-  CHECK(numberOfBits > 32, "Too many bits read");
+  CHECK(numberOfBits > BITS_PER_WORD, "Too many bits read");
 
   m_numBitsRead += numberOfBits;
 
   /* NB, bits are extracted from the MSB of each byte. */
   uint32_t retval = 0;
-  if (numberOfBits <= m_num_held_bits)
+  if (numberOfBits <= m_numHeldBits)
   {
     /* n=1, len(H)=7:   -VHH HHHH, shift_down=6, mask=0xfe
      * n=3, len(H)=7:   -VVV HHHH, shift_down=4, mask=0xf8
      */
-    retval = m_held_bits >> (m_num_held_bits - numberOfBits);
-    retval &= ~(0xff << numberOfBits);
-    m_num_held_bits -= numberOfBits;
+    retval = m_heldBits >> (m_numHeldBits - numberOfBits);
+    retval &= ~(BYTE_MASK << numberOfBits);
+    m_numHeldBits -= numberOfBits;
     ruiBits = retval;
     return;
   }
@@ -275,8 +273,8 @@ void InputBitstream::read(uint32_t numberOfBits, uint32_t &ruiBits)
    *   => align retval with top of extracted word */
   /* n=5, len(H)=3: ---- -VVV, mask=0x07, shift_up=5-3=2,
    * n=9, len(H)=3: ---- -VVV, mask=0x07, shift_up=9-3=6 */
-  numberOfBits -= m_num_held_bits;
-  retval = m_held_bits & ~(0xff << m_num_held_bits);
+  numberOfBits -= m_numHeldBits;
+  retval = m_heldBits & ~(BYTE_MASK << m_numHeldBits);
   retval <<= numberOfBits;
 
   /* number of whole bytes that need to be loaded to form retval */
@@ -287,27 +285,31 @@ void InputBitstream::read(uint32_t numberOfBits, uint32_t &ruiBits)
    * n=8,  len(H)=3, load 1byte,  shift_down=3
    * n=5,  len(H)=1, load 1byte,  shift_down=1+3
    */
-  uint32_t aligned_word = 0;
-  uint32_t num_bytes_to_load = (numberOfBits - 1) >> 3;
-  CHECK(m_fifo_idx + num_bytes_to_load >= m_fifo.size(), "Exceeded FIFO size");
+  uint32_t alignedWord       = 0;
+  uint32_t num_bytes_to_load = (numberOfBits - 1) >> BITS_PER_BYTE_LOG2;
+  CHECK(m_fifoIdx + num_bytes_to_load >= m_fifo.size(), "Exceeded FIFO size");
 
   switch (num_bytes_to_load)
   {
-  case 3: aligned_word  = m_fifo[m_fifo_idx++] << 24;
-  case 2: aligned_word |= m_fifo[m_fifo_idx++] << 16;
-  case 1: aligned_word |= m_fifo[m_fifo_idx++] <<  8;
-  case 0: aligned_word |= m_fifo[m_fifo_idx++];
+  case 3:
+    alignedWord = m_fifo[m_fifoIdx++] << 3 * BITS_PER_BYTE;
+  case 2:
+    alignedWord |= m_fifo[m_fifoIdx++] << 2 * BITS_PER_BYTE;
+  case 1:
+    alignedWord |= m_fifo[m_fifoIdx++] << BITS_PER_BYTE;
+  case 0:
+    alignedWord |= m_fifo[m_fifoIdx++];
   }
 
   /* resolve remainder bits */
-  uint32_t next_num_held_bits = (32 - numberOfBits) % 8;
+  uint32_t nextNumHeldBits = (BITS_PER_WORD - numberOfBits) % BITS_PER_BYTE;
 
-  /* copy required part of aligned_word into retval */
-  retval |= aligned_word >> next_num_held_bits;
+  /* copy required part of alignedWord into retval */
+  retval |= alignedWord >> nextNumHeldBits;
 
   /* store held bits */
-  m_num_held_bits = next_num_held_bits;
-  m_held_bits = aligned_word;
+  m_numHeldBits = nextNumHeldBits;
+  m_heldBits    = alignedWord;
 
   ruiBits = retval;
 }
@@ -318,80 +320,72 @@ void InputBitstream::read(uint32_t numberOfBits, uint32_t &ruiBits)
  */
 void OutputBitstream::insertAt(const OutputBitstream& src, uint32_t pos)
 {
-  CHECK(0 != src.getNumberOfWrittenBits() % 8, "Number of written bits is not a multiple of 8");
+  CHECK(0 != src.getNumberOfWrittenBits() % BITS_PER_BYTE, "Number of written bits is not a multiple of 8");
 
-  vector<uint8_t>::iterator at = m_fifo.begin() + pos;
-  m_fifo.insert(at, src.m_fifo.begin(), src.m_fifo.end());
+  m_fifo.insert(m_fifo.begin() + pos, src.m_fifo.begin(), src.m_fifo.end());
 }
 
 uint32_t InputBitstream::readOutTrailingBits ()
 {
-  uint32_t count=0;
-  uint32_t bits = 0;
+  uint32_t count = 0;
+  uint32_t bits  = 0;
 
-  while ( ( getNumBitsLeft() > 0 ) && (getNumBitsUntilByteAligned()!=0) )
+  while (getNumBitsLeft() > 0 && getNumBitsUntilByteAligned() != 0)
   {
     count++;
     read(1, bits);
   }
   return count;
 }
-//
-//OutputBitstream& OutputBitstream::operator= (const OutputBitstream& src)
-//{
-//  vector<uint8_t>::iterator at = m_fifo.begin();
-//  m_fifo.insert(at, src.m_fifo.begin(), src.m_fifo.end());
-//
-//  m_num_held_bits             = src.m_num_held_bits;
-//  m_held_bits                 = src.m_held_bits;
-//
-//  return *this;
-//}
 
 /**
  Extract substream from the current bitstream.
 
- \param  uiNumBits    number of bits to transfer
+ \param  numBits    number of bits to transfer
  */
-InputBitstream *InputBitstream::extractSubstream( uint32_t uiNumBits )
+InputBitstream *InputBitstream::extractSubstream(uint32_t numBits)
 {
-  uint32_t uiNumBytes = uiNumBits/8;
+  uint32_t        numBytes = numBits / BITS_PER_BYTE;
   InputBitstream *pResult = new InputBitstream;
 
   std::vector<uint8_t> &buf = pResult->getFifo();
-  buf.reserve((uiNumBits+7)>>3);
+  buf.reserve((numBits + BITS_PER_BYTE_MASK) >> BITS_PER_BYTE_LOG2);
 
-  if (m_num_held_bits == 0)
+  if (m_numHeldBits == 0)
   {
-    std::size_t currentOutputBufferSize=buf.size();
-    const uint32_t uiNumBytesToReadFromFifo = std::min<uint32_t>(uiNumBytes, (uint32_t)m_fifo.size() - m_fifo_idx);
-    buf.resize(currentOutputBufferSize+uiNumBytes);
+    const size_t   currentOutputBufferSize = buf.size();
+    const uint32_t numBytesToReadFromFifo  = std::min<uint32_t>(numBytes, (uint32_t) m_fifo.size() - m_fifoIdx);
+    buf.resize(currentOutputBufferSize + numBytes);
     if (!buf.empty())
     {
-      memcpy(&(buf[currentOutputBufferSize]), &(m_fifo[m_fifo_idx]), uiNumBytesToReadFromFifo);
-      m_fifo_idx += uiNumBytesToReadFromFifo;
+      std::copy_n(&m_fifo[m_fifoIdx], numBytesToReadFromFifo, &buf[currentOutputBufferSize]);
+      m_fifoIdx += numBytesToReadFromFifo;
     }
-    if (uiNumBytesToReadFromFifo != uiNumBytes)
+    if (numBytesToReadFromFifo != numBytes)
     {
-      memset(&(buf[currentOutputBufferSize+uiNumBytesToReadFromFifo]), 0, uiNumBytes - uiNumBytesToReadFromFifo);
+      std::fill_n(&buf[currentOutputBufferSize + numBytesToReadFromFifo], numBytes - numBytesToReadFromFifo, 0);
     }
   }
   else
   {
-    for (uint32_t ui = 0; ui < uiNumBytes; ui++)
+    for (uint32_t i = 0; i < numBytes; i++)
     {
-      uint32_t uiByte;
-      read(8, uiByte);
-      buf.push_back(uiByte);
+      uint32_t byte;
+      read(BITS_PER_BYTE, byte);
+      buf.push_back(byte);
     }
   }
-  if (uiNumBits&0x7)
+
+  const uint32_t numTrailingBits = numBits & BITS_PER_BYTE_MASK;
+
+  if (numTrailingBits != 0)
   {
-    uint32_t uiByte = 0;
-    read(uiNumBits&0x7, uiByte);
-    uiByte <<= 8-(uiNumBits&0x7);
-    buf.push_back(uiByte);
+    uint32_t byte = 0;
+    read(numTrailingBits, byte);
+    byte <<= BITS_PER_BYTE - numTrailingBits;
+    buf.push_back(byte);
   }
+
   return pResult;
 }
 
@@ -401,14 +395,14 @@ uint32_t InputBitstream::readByteAlignment()
   read( 1, code );
   CHECK(code != 1, "Code is not '1'");
 
-  uint32_t numBits = getNumBitsUntilByteAligned();
-  if(numBits)
+  const uint32_t numBits = getNumBitsUntilByteAligned();
+  if (numBits > 0)
   {
     CHECK(numBits > getNumBitsLeft(), "More bits available than left");
     read( numBits, code );
     CHECK(code != 0, "Code not '0'");
   }
-  return numBits+1;
+  return numBits + 1;
 }
 
 //! \}
diff --git a/source/Lib/CommonLib/BitStream.h b/source/Lib/CommonLib/BitStream.h
index f17cee742e7e1776f25fafb375a2df46f53ce133..cd91ab4f7ec41b345073eb329f1c3674cbcbc954 100644
--- a/source/Lib/CommonLib/BitStream.h
+++ b/source/Lib/CommonLib/BitStream.h
@@ -50,6 +50,12 @@
 //! \ingroup CommonLib
 //! \{
 
+static constexpr int      BITS_PER_BYTE_LOG2 = 3;
+static constexpr int      BITS_PER_BYTE      = 1 << BITS_PER_BYTE_LOG2;
+static constexpr int      BITS_PER_BYTE_MASK = BITS_PER_BYTE - 1;
+static constexpr int      BITS_PER_WORD      = BITS_PER_BYTE * sizeof(uint32_t);
+static constexpr uint32_t BYTE_MASK          = (1 << BITS_PER_BYTE) - 1;
+
 // ====================================================================================================================
 // Class definition
 // ====================================================================================================================
@@ -68,9 +74,9 @@ class OutputBitstream
    */
   std::vector<uint8_t> m_fifo;
 
-  uint32_t m_num_held_bits; /// number of bits not flushed to bytestream.
-  uint8_t m_held_bits; /// the bits held and not flushed to bytestream.
-                             /// this value is always msb-aligned, bigendian.
+  uint32_t m_numHeldBits;   /// number of bits not flushed to bytestream.
+  uint8_t  m_heldBits;      /// the bits held and not flushed to bytestream.
+                            /// this value is always msb-aligned, bigendian.
 public:
   // create / destroy
   OutputBitstream();
@@ -97,7 +103,7 @@ public:
    * NB, data is arranged such that subsequent bytes in the
    * bytestream are stored in ascending addresses.
    */
-  uint8_t* getByteStream() const;
+  const uint8_t *getByteStream() const;
 
   /**
    * Return the number of valid bytes available from  getByteStream()
@@ -113,25 +119,24 @@ public:
    * returns the number of bits that need to be written to
    * achieve byte alignment.
    */
-  int getNumBitsUntilByteAligned() const { return (8 - m_num_held_bits) & 0x7; }
+  int getNumBitsUntilByteAligned() const { return (8 - m_numHeldBits) & 0x7; }
 
   /**
    * Return the number of bits that have been written since the last clear()
    */
-  uint32_t getNumberOfWrittenBits() const { return uint32_t(m_fifo.size()) * 8 + m_num_held_bits; }
+  uint32_t getNumberOfWrittenBits() const { return uint32_t(m_fifo.size()) * 8 + m_numHeldBits; }
 
   void insertAt(const OutputBitstream& src, uint32_t pos);
 
   /**
    * Return a reference to the internal fifo
    */
-  std::vector<uint8_t>& getFIFO() { return m_fifo; }
+  std::vector<uint8_t> &getFifo() { return m_fifo; }
 
-  uint8_t getHeldBits  ()          { return m_held_bits;          }
+  uint8_t getHeldBits() { return m_heldBits; }
 
-  //OutputBitstream& operator= (const OutputBitstream& src);
   /** Return a reference to the internal fifo */
-  const std::vector<uint8_t>& getFIFO() const { return m_fifo; }
+  const std::vector<uint8_t> &getFifo() const { return m_fifo; }
 
   void          addSubstream    ( OutputBitstream* pcSubstream );
   void writeByteAlignment();
@@ -150,10 +155,10 @@ protected:
   std::vector<uint8_t> m_fifo; /// FIFO for storage of complete bytes
   std::vector<uint32_t>    m_emulationPreventionByteLocation;
 
-  uint32_t m_fifo_idx; /// Read index into m_fifo
+  uint32_t m_fifoIdx;   /// Read index into m_fifo
 
-  uint32_t m_num_held_bits;
-  uint8_t m_held_bits;
+  uint32_t  m_numHeldBits;
+  uint8_t   m_heldBits;
   uint32_t  m_numBitsRead;
 
 public:
@@ -167,12 +172,12 @@ public:
   void resetToStart();
 
   // interface for decoding
-  void        pseudoRead(uint32_t numberOfBits, uint32_t &ruiBits);
+  void        pseudoRead(uint32_t numberOfBits, uint32_t &bits);
   void        read(uint32_t numberOfBits, uint32_t &ruiBits);
   void        readByte        ( uint32_t &ruiBits )
   {
-    CHECK( m_fifo_idx >= m_fifo.size(), "FIFO exceeded" );
-    ruiBits = m_fifo[m_fifo_idx++];
+    CHECK(m_fifoIdx >= m_fifo.size(), "FIFO exceeded");
+    ruiBits = m_fifo[m_fifoIdx++];
 #if ENABLE_TRACING
     m_numBitsRead += 8;
 #endif
@@ -180,14 +185,14 @@ public:
 
   void        peekPreviousByte( uint32_t &byte )
   {
-    CHECK( m_fifo_idx == 0, "FIFO empty" );
-    byte = m_fifo[m_fifo_idx - 1];
+    CHECK(m_fifoIdx == 0, "FIFO empty");
+    byte = m_fifo[m_fifoIdx - 1];
   }
 
   uint32_t        readOutTrailingBits ();
-  uint8_t getHeldBits  ()          { return m_held_bits;          }
+  uint8_t          getHeldBits() { return m_heldBits; }
   OutputBitstream& operator= (const OutputBitstream& src);
-  uint32_t  getByteLocation              ( )                     { return m_fifo_idx                    ; }
+  uint32_t         getByteLocation() { return m_fifoIdx; }
 
   // Peek at bits in word-storage. Used in determining if we have completed reading of current bitstream and therefore slice in LCEC.
   uint32_t peekBits(uint32_t bits)
@@ -200,9 +205,9 @@ public:
   // utility functions
   uint32_t read(uint32_t numberOfBits)      { uint32_t tmp; read(numberOfBits, tmp); return tmp; }
   uint32_t readByte()                   { uint32_t tmp; readByte( tmp ); return tmp; }
-  uint32_t getNumBitsUntilByteAligned() { return m_num_held_bits & (0x7); }
-  uint32_t getNumBitsLeft()             { return 8*((uint32_t)m_fifo.size() - m_fifo_idx) + m_num_held_bits; }
-  InputBitstream *extractSubstream( uint32_t uiNumBits ); // Read the nominated number of bits, and return as a bitstream.
+  uint32_t        getNumBitsUntilByteAligned() { return m_numHeldBits & (0x7); }
+  uint32_t        getNumBitsLeft() { return 8 * ((uint32_t) m_fifo.size() - m_fifoIdx) + m_numHeldBits; }
+  InputBitstream *extractSubstream(uint32_t numBits);   // Read the nominated number of bits, and return as a bitstream.
   uint32_t  getNumBitsRead()            { return m_numBitsRead; }
   uint32_t  readByteAlignment();
 
diff --git a/source/Lib/EncoderLib/NALwrite.cpp b/source/Lib/EncoderLib/NALwrite.cpp
index 3e4887ef24df25fb8daf43935bf8974df0299828..17ea8573691a690274807360ebe95ce190561ba0 100644
--- a/source/Lib/EncoderLib/NALwrite.cpp
+++ b/source/Lib/EncoderLib/NALwrite.cpp
@@ -87,7 +87,7 @@ void writeNaluContent(ostream& out, OutputNALUnit& nalu)
    *  - 0x00000302
    *  - 0x00000303
    */
-  vector<uint8_t> &rbsp = nalu.m_bitstream.getFIFO();
+  vector<uint8_t> &rbsp = nalu.m_bitstream.getFifo();
 
   vector<uint8_t> outputBuffer;
   outputBuffer.resize(rbsp.size()*2+1); //there can never be enough emulation_prevention_three_bytes to require this much space