diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index ebbca4e..945eadd 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -181,6 +181,16 @@
    return true;
 }
 
+inline static bool
+DecodeNesting_IsBstrWrapped(const QCBORDecodeNesting *pNesting)
+{
+   if(pNesting->pCurrent->uLevelType == QCBOR_TYPE_BYTE_STRING) {
+      /* is a byte string */
+      return true;
+   }
+   return false;
+}
+
 inline static bool DecodeNesting_IsCurrentBounded(const QCBORDecodeNesting *pNesting)
 {
    if(pNesting->pCurrent->uLevelType == QCBOR_TYPE_BYTE_STRING) {
@@ -205,7 +215,7 @@
 }
 
 inline static bool
-DecodeNesting_IsAtEndOfBoundedMapOrArray(const QCBORDecodeNesting *pNesting)
+DecodeNesting_IsAtEndOfBoundedDefiniteLenMapOrArray(const QCBORDecodeNesting *pNesting)
 {
    if(pNesting->pCurrentBounded == NULL) {
       /* No bounded map or array or... set up. */
@@ -292,8 +302,8 @@
 
 inline static QCBORError
 DecodeNesting_DescendMapOrArray(QCBORDecodeNesting *pNesting,
-                      uint8_t uQCBORType,
-                      uint64_t uCount)
+                                uint8_t uQCBORType,
+                                uint64_t uCount)
 {
    QCBORError nReturn = QCBOR_SUCCESS;
 
@@ -1162,7 +1172,7 @@
 }
 
 
-static QCBORError
+static inline QCBORError
 NextIsBreak(UsefulInputBuf *pUIB, bool *pbNextIsBreak)
 {
    *pbNextIsBreak = false;
@@ -1190,63 +1200,51 @@
  An item was just consumed, now figure out if it was the
  end of an array or map that can be closed out. That
  may in turn close out another map or array.
- */
+*/
 static QCBORError Ascender(QCBORDecodeContext *pMe)
 {
    QCBORError uReturn;
-   
-   /* This loops ascending nesting levels as long as there is ascending to do */
-   while(1) {
-      if(!DecodeNesting_IsCurrentAtTop(&(pMe->nesting)) && !DecodeNesting_IsIndefiniteLength(&(pMe->nesting))) {
-         /* 1st Case: in a definite length array (not a CBOR sequence). Simply
-          decrement the item count. If it doesn't go to zero, then all is done.
-          If it does go to zero, the bottom of the loop ascends one nesting level
-          and the loop continues.
 
-          // TODO: check this.
-          */
-         if(DecodeNesting_IsDefiniteLength(&(pMe->nesting))) {
-            DecodeNesting_DecrementDefiniteLengthMapOrArrayCount(&(pMe->nesting));
-            if(!DecodeNesting_IsEndOfDefiniteLengthMapOrArray(&(pMe->nesting))) {
-               /* Didn't close out map or array; all work here is done */
-               break;
-            }
-         }
-         
+   /* This loops ascending nesting levels as long as there is ascending to do */
+   while(!DecodeNesting_IsCurrentAtTop(&(pMe->nesting))) {
+
+      if(DecodeNesting_IsDefiniteLength(&(pMe->nesting))) {
+         /* Definite Length Maps and Arrays */
+         DecodeNesting_DecrementDefiniteLengthMapOrArrayCount(&(pMe->nesting));
+         if(!DecodeNesting_IsEndOfDefiniteLengthMapOrArray(&(pMe->nesting))) {
+             /* Didn't close out map or array; all work here is done */
+             break;
+          }
+         /* fall through to an actual ascend at the end of loop */
+
       } else {
-         /* 2nd, 3rd, 4th and 5th  cases where a check for a following CBOR break must be checked for */
+         /* If not definite length, have to check for a CBOR break. */
          bool bIsBreak = false;
          uReturn = NextIsBreak(&(pMe->InBuf), &bIsBreak);
          if(uReturn != QCBOR_SUCCESS) {
             goto Done;
          }
-         
-         if(bIsBreak) {
-            if(DecodeNesting_IsCurrentAtTop(&(pMe->nesting))) {
-               /* 2nd case where a break occurs at the top level and thus
-                in a CBOR sequence. Always an error because break is
-                not inside an indefinite length map or array. */
-               uReturn = QCBOR_ERR_BAD_BREAK;
-               goto Done;
-            } else {
-               /* 3rd case, the normal end of an indefinite length map
-                  or array. The bottom of the loop ascends one nesting
-                level and the loop continues. */
-            }
-         } else {
-            /* 4th case where an indefinite length array is not closed out
-             and 5th case which is just an item in a CBOR sequence. In either
-             there is no close out so all work here is done.
-             */
+
+         if(!bIsBreak) {
+            /* It's not a break; nothing closes out; all work is done */
             break;
          }
+
+         if(DecodeNesting_IsBstrWrapped(&(pMe->nesting))) {
+            /* Break occurred inside a wrapped bstr or
+             at the top level sequence. This is always an
+             error because it is not in an indefinte length. */
+            uReturn = QCBOR_ERR_BAD_BREAK;
+            goto Done;
+         }
+         /* fall through to an actual ascend at the end of loop */
       }
-      
+
       /* All items in the level have been consumed. */
-      
+
       /* But ascent in bounded mode is only by explicit call to QCBORDecode_ExitBoundedMode() */
       if(DecodeNesting_IsCurrentBounded(&(pMe->nesting))) {
-         /* Set the count to zero for indefinite length arrays to indicate cursor is at end of bounded map / array */
+         /* Set the count to zero for definite length arrays to indicate cursor is at end of bounded map / array */
          pMe->nesting.pCurrent->u.ma.uCountCursor = 0;
          break;
       }
@@ -1254,7 +1252,7 @@
       /* Finally, actually ascend one level. */
       DecodeNesting_Ascend(&(pMe->nesting));
    }
-   
+
    uReturn = QCBOR_SUCCESS;
 
 Done:
@@ -1263,160 +1261,123 @@
 
 
 /*
- Public function, see header qcbor/qcbor_decode.h file
- TODO: correct this comment
+ This the travesal going descending into and asecnding out of maps,
+ arrays and bstr-wrapped CBOR. It figures out the ends of definite and
+ indefinte length maps and arrays by looking at the item count or
+ finding CBOR breaks.  It detects the ends of the top-level sequence
+ and of bstr-wrapped CBOR by byte count.
  */
 static QCBORError
 QCBORDecode_GetNextMapOrArray(QCBORDecodeContext *me, QCBORItem *pDecodedItem)
 {
    QCBORError uReturn;
-   /* === First figure out if at the end of traversal === */
+   /* ==== First figure out if at the end of a traversal ==== */
 
-   /* Case 1. Out of bytes to consume.
+   /*
+    If out of bytes to consume, it is either the end of the top-level
+    sequence of some bstr-wrapped CBOR that was entered.
 
-      This is either the end of the top-level CBOR that was give
-    to QCBORDecode_Init() or the end of a tag 24 bstr wrapped CBOR.
-    It is detected by all bytes being consumed from the UsefulInputBuf.
+    In the case of bstr-wrapped CBOR, the length of the UsefulInputBuf
+    was set to that of the bstr-wrapped CBOR. When the bstr-wrapped
+    CBOR is exited, the length is set back to the top-level's length
+    or to the next highest bstr-wrapped CBOR.
 
-    To go back out of the tag 24 bstr wrapped item, the caller must
-    explicitly call Exit() which will reset the UsefulInputBuf
-    to the next highest bstr wrapped or the top level.
-
-    This is always the end condition that QCBORDecode_Finish()
-    considers complete.
-
-    TODO: can the DecodeNesting_IsAtTop be removed? QCBORDecode_Finish()
-    will perform this check.
-
-    */
-   /* For a pre-order traversal a non-error end occurs when there
-    are no more bytes to consume and the nesting level is at the top.
-    If it's not at the top, then the CBOR is not well formed. This error
-    is caught elsewhere.
-
-    This handles the end of CBOR sequences as well as non-sequences. */
-   if(UsefulInputBuf_BytesUnconsumed(&(me->InBuf)) == 0 && DecodeNesting_IsCurrentAtTop(&(me->nesting))) {
+    Only return the success error code QCBOR_ERR_NO_MORE_ITEMS here
+    when at the top level to allow other code below to process various
+    errors when out of bytes to decode and not at the top level. Note
+    that QCBORDecode_Finish() still needs to be called to be sure all
+    nesting levels were closed out.
+   */
+   if(UsefulInputBuf_BytesUnconsumed(&(me->InBuf)) == 0 &&
+      DecodeNesting_IsCurrentAtTop(&(me->nesting))) {
       uReturn = QCBOR_ERR_NO_MORE_ITEMS;
       goto Done;
    }
 
-
-   /* Case 2. End of map or array in bounded mode
-
-    The caller is attempting traveral of a bounded map or array and
-    has got to the end of it.
-
-    The caller must explicitly exit the bounded mode map or array
-    to get past this condition.
-
-    To complete a decode of the full input CBOR, the caller must
-    exit all maps and arrays in bounded mode and this is never
-    the successful end of decoding.
-
+   /*
+    Check to see if at the end of a bounded definite length map or
+    array. The check for the end of an indefnite length array is
+    later. (TODO: test that).
     */
-   /* It is also an end of the input when in map mode and the cursor
-    is at the end of the map */
-
-
-   // This is to handle bounded mode
-   if(DecodeNesting_IsAtEndOfBoundedMapOrArray(&(me->nesting))) {
+   if(DecodeNesting_IsAtEndOfBoundedDefiniteLenMapOrArray(&(me->nesting))) {
       uReturn = QCBOR_ERR_NO_MORE_ITEMS;
       goto Done;
    }
 
-   /* === Not at the end; get another item === */
+   /* ==== Next, not at the end so get another item ==== */
    uReturn = GetNext_MapEntry(me, pDecodedItem);
    if(uReturn) {
       goto Done;
    }
 
-   // Breaks ending arrays/maps are always processed at the end of this function.
-   // They should never show up here.
+   /*
+    Breaks ending arrays/maps are always processed at the end of this
+    function. They should never show up here.
+    */
    if(pDecodedItem->uDataType == QCBOR_TYPE_BREAK) {
       uReturn = QCBOR_ERR_BAD_BREAK;
       goto Done;
    }
 
-   // Record the nesting level for this data item before processing any of
-   // decrementing and descending.
+   /*
+     Record the nesting level for this data item before processing any
+     of decrementing and descending.
+    */
    pDecodedItem->uNestingLevel = DecodeNesting_GetCurrentLevel(&(me->nesting));
 
-   // Process the item just received for descent or decrement, and
-   // ascend if decrements are enough to close out a definite length array/map
+
+   /* ==== Next, Process the item for descent, ascent, decrement... ==== */
    if(IsMapOrArray(pDecodedItem->uDataType) && pDecodedItem->val.uCount != 0) {
-      // If the new item is array or map, the nesting level descends
-      uReturn = DecodeNesting_DescendMapOrArray(&(me->nesting), pDecodedItem->uDataType, pDecodedItem->val.uCount);
-      // Maps and arrays do count in as items in the map/array that encloses
-      // them so a decrement needs to be done for them too, but that is done
-      // only when all the items in them have been processed, not when they
-      // are opened with the exception of an empty map or array.
+      /*
+       If the new item is a map or array descend. Empty definite
+       length maps and arrays are not handled here as they can be
+       treated as a non-aggreate type. Empty indefinite length maps
+       and arrays are handled here.
+
+       Maps and arrays do count in as items in the map/array that
+       encloses them so a decrement needs to be done for them too, but
+       that is done only when all the items in them have been
+       processed, not when they are opened with the exception of an
+       empty map or array.
+       */
+      uReturn = DecodeNesting_DescendMapOrArray(&(me->nesting),
+                                                pDecodedItem->uDataType,
+                                                pDecodedItem->val.uCount);
       if(uReturn != QCBOR_SUCCESS) {
          goto Done;
       }
    }
 
+   // TODO: not sure the if-then-else logic is right here
    if(!IsMapOrArray(pDecodedItem->uDataType) ||
-      pDecodedItem->val.uCount == 0 || pDecodedItem->val.uCount == UINT16_MAX) {
-      /* The following cases are handled here:
+      pDecodedItem->val.uCount == 0 ||
+      pDecodedItem->val.uCount == UINT16_MAX) {
+      /*
+       The following cases are handled here:
          - A non-aggregate like an integer or string
          - An empty definite length map or array
          - An indefinite length map or array that might be empty or might not.
+
+       The Ascender does the work of decrementing the count for an
+       definite length array and break detection for an indefinite
+       length array. If the end of the map or array was reached, then
+       it ascends nesting levels, possibly all the way to the top.
        */
-      
-
-
-      /* === Figure out if item got closed out maps or arrays === */
-
-      /*
-       This needs to decrement, check for end and ascend
-       the tree until an an ascend is not possible or the bounded
-       limit is reached or the end of the encoded CBOR input
-       is reached. For
-       definite length maps and arrays the end is by count. For
-       indefinite it is by a break.
-
-       Also state needs to be set that can tell the code at the
-       beginning of this function that the end was reached.
-
-       This is complicated...
-
-
-       This will handle an indefinite length array
-       inside a definte length array inside an indefinite
-       length array...
-
-       */
-
-      // Decrement the count of items in the enclosing map/array
-      // If the count in the enclosing map/array goes to zero, that
-      // triggers a decrement in the map/array above that and
-      // an ascend in nesting level.
-      /* If the just consumed item is at the end of a map or
-       array ascend in the nesting tracking. That may
-       in turn may be the end of the above nesting level
-       and so on up to the end of the whole encoded CBOR.
-       
-       Each level could be a definite or indefinte length
-       map or array. These are handled very differently.
-       
-      */
       uReturn = Ascender(me);
       if(uReturn) {
          goto Done;
       }
    }
 
-
-
-   /* === Tell the caller the nest level of the next item === */
-
-   // Tell the caller what level is next. This tells them what maps/arrays
-   // were closed out and makes it possible for them to reconstruct
-   // the tree with just the information returned by GetNext
-   // TODO: pull this into DecodeNesting_GetLevel
-   if(DecodeNesting_IsCurrentBounded(&(me->nesting)) && me->nesting.pCurrent->u.ma.uCountCursor == 0) {
-      // At end of a map / array in map mode, so next nest is 0 to
-      // indicate this end.
+   /* ==== Last, Tell the caller the nest level of the next item ==== */
+   /*
+     Tell the caller what level is next. This tells them what
+     maps/arrays were closed out and makes it possible for them to
+     reconstruct the tree with just the information returned by
+     GetNext
+   */
+   if(DecodeNesting_IsAtEndOfBoundedDefiniteLenMapOrArray(&(me->nesting))) {
+     /* At end of a bounded map / array; next nest is 0 to indicate this */
       pDecodedItem->uNextNestLevel = 0;
    } else {
       pDecodedItem->uNextNestLevel = DecodeNesting_GetCurrentLevel(&(me->nesting));
@@ -1424,7 +1385,7 @@
 
 Done:
    if(uReturn != QCBOR_SUCCESS) {
-      // Make sure uDataType and uLabelType are QCBOR_TYPE_NONE
+      /* This sets uDataType and uLabelType to QCBOR_TYPE_NONE */
       memset(pDecodedItem, 0, sizeof(QCBORItem));
    }
    return uReturn;
