diff --git a/inc/qcbor/qcbor_decode.h b/inc/qcbor/qcbor_decode.h
index 44e9ac7..67bcf73 100644
--- a/inc/qcbor/qcbor_decode.h
+++ b/inc/qcbor/qcbor_decode.h
@@ -366,6 +366,7 @@
       uint64_t    uint64;
    } label;
 
+   // Values below XXX are exact; values above XXX must be mapped
    uint16_t uTags[QCBOR_MAX_TAGS_PER_ITEM];
 
    /*
@@ -387,7 +388,6 @@
 
 
     */
-   uint8_t  auTags[4]; // 4 bytes
 
    /*
     Or use the existing tag mapping strategy, and
@@ -1362,7 +1362,7 @@
 /*
  Indicate if decoding is in map mode more not.
  */
-bool QCBORDecode_InMapMode(QCBORDecodeContext *pCtxt);
+bool QCBORDecode_InBoundedMode(QCBORDecodeContext *pCtxt);
 
 
 
@@ -1716,17 +1716,17 @@
 }
 
 // Semi-private
-void QCBORDecode_ExitMapMode(QCBORDecodeContext *pMe, uint8_t uType);
+void QCBORDecode_ExitBoundedMode(QCBORDecodeContext *pMe, uint8_t uType);
 
 
 static inline void QCBORDecode_ExitArray(QCBORDecodeContext *pMe)
 {
-   QCBORDecode_ExitMapMode(pMe, QCBOR_TYPE_ARRAY);
+   QCBORDecode_ExitBoundedMode(pMe, QCBOR_TYPE_ARRAY);
 }
 
 static inline void QCBORDecode_ExitMap(QCBORDecodeContext *pMe)
 {
-   QCBORDecode_ExitMapMode(pMe, QCBOR_TYPE_MAP);
+   QCBORDecode_ExitBoundedMode(pMe, QCBOR_TYPE_MAP);
 }
 
 
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index bc21df9..bc5842a 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -209,16 +209,20 @@
 
 
 // return 1 if closed out an array or map
-inline static int
-DecodeNesting_Decrement(QCBORDecodeNesting *pNesting)
+inline static void
+DecodeNesting_DecrementX(QCBORDecodeNesting *pNesting)
 {
    pNesting->pCurrent->uCount--;
+}
 
-   if(pNesting->pCurrent->uCount != 0) {
-      return 0;
+inline static bool
+DecodeNesting_IsEndOfDefiniteLengthMapOrArray(QCBORDecodeNesting *pNesting)
+{
+   if(pNesting->pCurrent->uCount == 0) {
+      return true;
+   } else {
+      return false;
    }
-
-   return 1;
 }
 
 inline static void
@@ -228,54 +232,10 @@
 }
 
 
-// Called on every single item except breaks including decode of a map/array
-/* Decrements the map/array counter if possible. If decrement
- closed out a map or array, then level up in nesting and decrement
- again, until, the top is reached or the end of a map mode is reached
 
- return 1 if leveld up, 0 if not
- */
-inline static int
-DecodeNesting_DecrementCount(QCBORDecodeNesting *pNesting)
-{
-   int nReturn = 0;
-
-   while(!DecodeNesting_IsAtTop(pNesting)) {
-      // Not at the top level, so there is decrementing to be done.
-
-      if(DecodeNesting_IsIndefiniteLength(pNesting)) {
-         // Indefinite lengths not handled here
-         break;
-      }
-
-      pNesting->pCurrent->uCount--;
-
-      if(pNesting->pCurrent->uCount != 0) {
-         // Did not close out an array or map, so nothing further
-         break;
-      }
-      
-      if(DecodeNesting_InBoundedMode(pNesting)) {
-         // In map mode the level-up must be done explicitly
-         break;
-      }
-
-      // Closed out an array or map so level up
-      pNesting->pCurrent--;
-      /*if(pNesting->pCurrent->uMapMode) {
-         // Bring the current map level along if new level is a map
-         // TODO: must search up until a mapmode level is found.
-         pNesting->pCurrentMap = pNesting->pCurrent;
-      } */
-
-      // Continue with loop to see if closing out this doesn't close out more
-      nReturn = 1;
-   }
-   return nReturn;
-}
 
 inline static void
-DecodeNesting_EnterMapMode(QCBORDecodeNesting *pNesting, size_t uOffset)
+DecodeNesting_EnterBoundedMode(QCBORDecodeNesting *pNesting, size_t uOffset)
 {
    /* Have descended into this is called. The job here is just to mark it in bounded mode */
    pNesting->pCurrentMap = pNesting->pCurrent;
@@ -284,25 +244,7 @@
    pNesting->pCurrentMap->uOffset  = (uint32_t)uOffset;
 }
 
-inline static void
-DecodeNesting_Exit(QCBORDecodeNesting *pNesting)
-{
-   pNesting->pCurrentMap->uType &= ~QCBOR_NEST_TYPE_IS_BOUND;
-   // TODO: rewrite this. Gonna need a lot of code to ascend through indefinite length maps and arrays
-   pNesting->pCurrent = pNesting->pCurrentMap - 1; // TODO error check
-   
-   DecodeNesting_DecrementCount(pNesting);
 
-   while(1) {
-      pNesting->pCurrentMap--;
-      if(DecodeNesting_InBoundedMode(pNesting)) {
-         break;
-      }
-      if(pNesting->pCurrentMap == &(pNesting->pMapsAndArrays[0])) {
-         break;
-      }
-   }
-}
 
 
 inline static QCBORError
@@ -1159,6 +1101,78 @@
 
 
 /*
+ 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_IsAtTop(&(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.
+          */
+         DecodeNesting_DecrementX(&(pMe->nesting));
+         if(!DecodeNesting_IsEndOfDefiniteLengthMapOrArray(&(pMe->nesting))) {
+            /* Didn't close out map or array; all work here is done */
+            break;
+         }
+         
+      } else {
+         /* 2nd, 3rd, 4th and 5th  cases where a check for a following CBOR break must be checked for */
+         bool bIsBreak = false;
+         uReturn = NextIsBreak(&(pMe->InBuf), &bIsBreak);
+         if(uReturn != QCBOR_SUCCESS) {
+            goto Done;
+         }
+         
+         if(bIsBreak) {
+            if(DecodeNesting_IsAtTop(&(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.
+             */
+            break;
+         }
+      }
+      
+      /* All items in the level have been consumed. */
+      
+      /* But ascent in bounded mode is only by explicit call to QCBORDecode_ExitBoundedMode() */
+      if(DecodeNesting_InBoundedMode(&(pMe->nesting))) {
+         /* Set the count to zero for indefinite length arrays to indicate cursor is at end of bounded map / array */
+         pMe->nesting.pCurrent->uCount = 0;
+         break;
+      }
+
+      /* Finally, actually ascend one level. */
+      DecodeNesting_Ascend(&(pMe->nesting));
+   }
+   
+   uReturn = QCBOR_SUCCESS;
+
+Done:
+   return uReturn;
+}
+
+
+/*
  Public function, see header qcbor/qcbor_decode.h file
  TODO: correct this comment
  */
@@ -1296,62 +1310,9 @@
        map or array. These are handled very differently.
        
       */
-      while(1) {
-         
-         /* three cases:
-           1) at top
-           2) not at top and in indefinite
-           3) not at top and not in indefinite */
-         
-         if(!DecodeNesting_IsAtTop(&(me->nesting)) && !DecodeNesting_IsIndefiniteLength(&(me->nesting))) {
-            /* The simple cases of a non-aggregate type or an empty
-               definite-length array. Decrement the counter and
-               if nothing was closed out, all is done.
-               case 3
-             */
-            if(!DecodeNesting_Decrement(&(me->nesting))) {
-               // Done leveling up
-               break;
-            }
-            
-         } else {
-            /* cases 1 and 2 */
-            /* either at the top or in an indefinite length map / array */
-            /* The cases of an
-               1) indefinite length level
-               2) a sequence (at the top and not in error)
-               3) the error case of extra breaks after reaching the top level
-             For all of these we have to see if next is a break.
-             */
-            bool bIsBreak = false;
-            uReturn = NextIsBreak(&(me->InBuf), &bIsBreak);
-            if(uReturn != QCBOR_SUCCESS) {
-               goto Done;
-            }
-            
-            if(bIsBreak) {
-               if(DecodeNesting_IsAtTop(&(me->nesting))) {
-                  uReturn = QCBOR_ERR_BAD_BREAK;
-                  goto Done;
-               } else {
-                  // A break ending an indefinite length array
-                  // continue with loop and ascend
-               }
-               
-            } else {
-               // Just an item in either an indefinte length amap/arry or in sequence at top level.
-               break;
-            }
-         }
-         
-         if(DecodeNesting_InBoundedMode(&(me->nesting))) {
-            /* Can't ascend because we are in bounded mode where ascent has to be explicit */
-            /* Set the count to zero for indefinite length arrays to indicate cursor is at end of bounded map / array */
-            me->nesting.pCurrent->uCount = 0;
-            break;
-         }
-
-         DecodeNesting_Ascend(&(me->nesting));
+      uReturn = Ascender(me);
+      if(uReturn) {
+         goto Done;
       }
    }
 
@@ -2127,7 +2088,7 @@
             const QCBORItem    *pItemToConsume,
             uint_fast8_t       *puNextNestLevel)
 {
-   QCBORError nReturn;
+   QCBORError uReturn;
    QCBORItem  Item;
    
    printdecode(pMe, "ConsumeItem");
@@ -2139,8 +2100,8 @@
        * maps and arrays by using the nesting level
        */
       do {
-         nReturn = QCBORDecode_GetNext(pMe, &Item);
-         if(nReturn != QCBOR_SUCCESS) {
+         uReturn = QCBORDecode_GetNext(pMe, &Item);
+         if(uReturn != QCBOR_SUCCESS) {
             goto Done;
          }
       } while(Item.uNextNestLevel >= pItemToConsume->uNextNestLevel);
@@ -2148,7 +2109,7 @@
       if(puNextNestLevel != NULL) {
          *puNextNestLevel = Item.uNextNestLevel;
       }
-      nReturn = QCBOR_SUCCESS;
+      uReturn = QCBOR_SUCCESS;
 
    } else {
       /* item_to_consume is not a map or array */
@@ -2156,11 +2117,11 @@
          /* Just pass the nesting level through */
          *puNextNestLevel = pItemToConsume->uNextNestLevel;
       }
-      nReturn = QCBOR_SUCCESS;
+      uReturn = QCBOR_SUCCESS;
    }
 
 Done:
-    return nReturn;
+    return uReturn;
 }
 
 
@@ -2241,15 +2202,11 @@
 {
    QCBORError  uReturn;
 
-   // TODO: what if pre-order cursor is not at the same level as map? This should be OK.
-   if(!DecodeNesting_InBoundedMode(&(pMe->nesting))) {
-      return QCBOR_ERR_NOT_ENTERED;
-   }
-
    QCBORDecodeNesting SaveNesting;
    DecodeNesting_PrepareForMapSearch(&(pMe->nesting), &SaveNesting);
 
-   UsefulInputBuf_Seek(&(pMe->InBuf), pMe->nesting.pCurrent->uOffset);
+   // Reposition to search from the start of the map / array
+   UsefulInputBuf_Seek(&(pMe->InBuf), pMe->nesting.pCurrentMap->uOffset);
 
    /* Loop over all the items in the map. They could be
    * deeply nested and this should handle both definite
@@ -2263,7 +2220,7 @@
 
    /* Iterate over items in the map / array */
    do {
-      /* Remember offset because sometims we have to return it */
+      /* Remember offset of the item because sometimes it has to be returned */
       const size_t uOffset = UsefulInputBuf_Tell(&(pMe->InBuf));
 
       /* Get the item */
@@ -2297,7 +2254,7 @@
                *puOffset = uOffset;
             }
          } else {
-            /* Call the call back on unmatched labels */
+            /* Call the callback on unmatched labels */
             /* It is tempting to do duplicate detection here, but that would
                require dynamic memory allocation because the number of labels
                that might be encountered is unbounded.
@@ -2350,58 +2307,6 @@
 }
 
 
-
-
-void QCBORDecode_ExitMapMode(QCBORDecodeContext *pMe, uint8_t uType)
-{
-   size_t uEndOffset;
-
-   (void)uType; // TODO: error check
-
-/*
-   if(pMe->uMapEndOffset) {
-      uEndOffset = pMe->uMapEndOffset;
-      // It is only valid once.
-      pMe->uMapEndOffset = 0;
-   } else { */
-      QCBORItem Dummy;
-
-      Dummy.uLabelType = QCBOR_TYPE_NONE;
-
-      QCBORError nReturn = MapSearch(pMe, &Dummy, NULL, &uEndOffset, NULL, NULL);
-
-      (void)nReturn; // TODO:
-//   }
-   
-   printdecode(pMe, "start exit");
-   UsefulInputBuf_Seek(&(pMe->InBuf), uEndOffset);
-
-   DecodeNesting_Exit(&(pMe->nesting));
-   printdecode(pMe, "end exit");
-
-}
-
-
-void QCBORDecode_EnterBstrWrapped(QCBORDecodeContext *pMe, uint8_t uTagRequirement, UsefulBufC *pBstr)
-{
-   QCBORItem Item;
-   QCBORDecode_GetNext(pMe, &Item);
-   // Need to set UIB cursor to start of bstr and UIB length to end of bstr
-
-}
-
-//void QCBORDecode_EnterBstrWrappedFromMapN(QCBORDecodeContext *pCtx, int64_t uLabel, UsefulBufC *pBstr);
-
-//void QCBORDecode_EnterBstrWrappedFromMapSZ(QCBORDecodeContext *pCtx, const char  *szLabel, UsefulBufC *pBstr);
-
-void QCBORDecode_ExitBstrWrapped(QCBORDecodeContext *pCtx)
-{
-   // Need to set the cursor to end of the bstr and length to the next length
-   // above in the nesting tree (or the top level length).
-   
-}
-
-
 void QCBORDecode_GetItemInMapN(QCBORDecodeContext *pMe,
                                int64_t             nLabel,
                                uint8_t             uQcborType,
@@ -2540,6 +2445,18 @@
 }
 
 
+QCBORError QCBORDecode_GetItemsInMap(QCBORDecodeContext *pCtx, QCBORItem *pItemList)
+{
+   return MapSearch(pCtx, pItemList, NULL, NULL, NULL, NULL);
+}
+
+
+QCBORError QCBORDecode_GetItemsInMapWithCallback(QCBORDecodeContext *pCtx, QCBORItem *pItemList, void *pCallbackCtx, QCBORItemCallback pfCB)
+{
+   return MapSearch(pCtx, pItemList, NULL, NULL, pCallbackCtx, pfCB);
+}
+
+
 static void SearchAndEnter(QCBORDecodeContext *pMe, QCBORItem pSearch[])
 {
    if(pMe->uLastError != QCBOR_SUCCESS) {
@@ -2628,8 +2545,6 @@
 
 
 
-
-
 /* Next item must be map or this generates an error */
 void QCBORDecode_EnterBoundedMode(QCBORDecodeContext *pMe, uint8_t uType)
 {
@@ -2649,26 +2564,67 @@
       return;
    }
 
-   DecodeNesting_EnterMapMode(&(pMe->nesting), UsefulInputBuf_Tell(&(pMe->InBuf)));
+   DecodeNesting_EnterBoundedMode(&(pMe->nesting), UsefulInputBuf_Tell(&(pMe->InBuf)));
 
    printdecode(pMe, "EnterMapModeDone");
 }
 
-
-
-QCBORError QCBORDecode_GetItemsInMap(QCBORDecodeContext *pCtx, QCBORItem *pItemList)
+void QCBORDecode_ExitBoundedMode(QCBORDecodeContext *pMe, uint8_t uType)
 {
-   return MapSearch(pCtx, pItemList, NULL, NULL, NULL, NULL);
+   QCBORError uErr;
+   size_t uEndOffset;
+
+   (void)uType; // TODO: error check
+
+/*
+   if(pMe->uMapEndOffset) {
+      uEndOffset = pMe->uMapEndOffset;
+      // It is only valid once.
+      pMe->uMapEndOffset = 0;
+   } else { */
+   // Find offset of the end the bounded array / map
+      QCBORItem Dummy;
+
+      Dummy.uLabelType = QCBOR_TYPE_NONE;
+
+      QCBORError nReturn = MapSearch(pMe, &Dummy, NULL, &uEndOffset, NULL, NULL);
+
+      (void)nReturn; // TODO:
+//   }
+   
+   printdecode(pMe, "start exit");
+   
+   /* Before acending mark this level as no longer in bound mode. */
+   pMe->nesting.pCurrentMap->uType &= ~QCBOR_NEST_TYPE_IS_BOUND;
+
+
+   /* Set the pre-order traversal state to just after
+      the map or array that was exited.  */
+   UsefulInputBuf_Seek(&(pMe->InBuf), uEndOffset);
+   
+   // Always go up one level
+   // Need error check to know level is bounded mode and not at top level
+   pMe->nesting.pCurrent = pMe->nesting.pCurrentMap - 1; // TODO error check
+   
+   uErr = Ascender(pMe);
+   
+   /* Also ascend to the next higest bounded mode level if
+    there is one. */
+   while(1) {
+       pMe->nesting.pCurrentMap--;
+      if(DecodeNesting_InBoundedMode(&(pMe->nesting))) {
+         break;
+      }
+      if(pMe->nesting.pCurrentMap == &(pMe->nesting.pMapsAndArrays[0])) {
+         pMe->nesting.pCurrentMap = NULL;
+         break;
+      }
+   }
+
+   printdecode(pMe, "end exit");
 }
 
 
-QCBORError QCBORDecode_GetItemsInMapWithCallback(QCBORDecodeContext *pCtx, QCBORItem *pItemList, void *pCallbackCtx, QCBORItemCallback pfCB)
-{
-   return MapSearch(pCtx, pItemList, NULL, NULL, pCallbackCtx, pfCB);
-}
-
-
-
 void QCBORDecode_RewindMap(QCBORDecodeContext *pMe)
 {
    // TODO: check for map mode; test this
@@ -2713,6 +2669,27 @@
 }
 
 
+void QCBORDecode_EnterBstrWrapped(QCBORDecodeContext *pMe, uint8_t uTagRequirement, UsefulBufC *pBstr)
+{
+   QCBORItem Item;
+   QCBORDecode_GetNext(pMe, &Item);
+   // Need to set UIB cursor to start of bstr and UIB length to end of bstr
+   
+   // TODO: combine with above
+
+}
+
+//void QCBORDecode_EnterBstrWrappedFromMapN(QCBORDecodeContext *pCtx, int64_t uLabel, UsefulBufC *pBstr);
+
+//void QCBORDecode_EnterBstrWrappedFromMapSZ(QCBORDecodeContext *pCtx, const char  *szLabel, UsefulBufC *pBstr);
+
+void QCBORDecode_ExitBstrWrapped(QCBORDecodeContext *pCtx)
+{
+   // Need to set the cursor to end of the bstr and length to the next length
+   // above in the nesting tree (or the top level length).
+   
+}
+
 
 
 
