progress on map/array mode
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 2534906..d12f732 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -62,6 +62,27 @@
    return pNesting->pCurrent != &(pNesting->pMapsAndArrays[0]);
 }
 
+inline static bool
+DecodeNesting_AtEnd(const QCBORDecodeNesting *pNesting)
+{
+   if(!DecodeNesting_IsNested(pNesting)){
+      // Always at end if at the top level of nesting
+      return true;
+   }
+   
+   if(!pNesting->pCurrent->uMapMode) {
+      // If not in map mode then it is as IsNested says
+      return false;
+   }
+   
+   // In map mode at the current nesting level. In this
+   // mode we are at the end of a pre-order traversal
+   // if the count is zero
+   // TODO: what about indefinite length maps & arrays?
+   return pNesting->pCurrent->uCount == 0;
+}
+
+
 inline static int
 DecodeNesting_IsIndefiniteLength(const QCBORDecodeNesting *pNesting)
 {
@@ -106,11 +127,11 @@
    return QCBOR_SUCCESS;
 }
 
-// Called on every single item except breaks including open of a map/array
+// Called on every single item except breaks including decode of a map/array
 inline static void
 DecodeNesting_DecrementCount(QCBORDecodeNesting *pNesting)
 {
-   while(DecodeNesting_IsNested(pNesting)) {
+   while(!DecodeNesting_AtEnd(pNesting)) {
       // Not at the top level, so there is decrementing to be done.
 
       if(!DecodeNesting_IsIndefiniteLength(pNesting)) {
@@ -122,6 +143,11 @@
          // Did not close out an array or map, so nothing further
          break;
       }
+      
+      if(pNesting->pCurrent->uMapMode) {
+         // In map mode the level-up must be done explicitly
+         break;
+      }
 
       // Closed out an array or map so level up
       pNesting->pCurrent--;
@@ -1046,6 +1072,12 @@
       nReturn = QCBOR_ERR_NO_MORE_ITEMS;
       goto Done;
    }
+   
+   // This is to handle map and array mode
+   if(UsefulInputBuf_Tell(&(me->InBuf)) != 0 && DecodeNesting_AtEnd(&(me->nesting))) {
+      nReturn = QCBOR_ERR_NO_MORE_ITEMS;
+      goto Done;
+   }
 
    nReturn = GetNext_MapEntry(me, pDecodedItem, pTags);
    if(nReturn) {
@@ -2108,7 +2140,7 @@
 
    QCBORError nReturn = GetItemsInMap(pMe, One, &uOffset);
 
-   if(nReturn) {
+   if(nReturn != QCBOR_SUCCESS) {
       return nReturn;
    }
 
@@ -2139,10 +2171,14 @@
 /* Next item must be map or this generates an error */
 QCBORError QCBORDecode_EnterMap(QCBORDecodeContext *pMe)
 {
-   QCBORItem Item;
+   QCBORItem  Item;
+   QCBORError nReturn;
 
    /* Get the data item that is the map that is being searched */
-   QCBORDecode_GetNext(pMe, &Item);
+   nReturn = QCBORDecode_GetNext(pMe, &Item);
+   if(nReturn != QCBOR_SUCCESS) {
+      return nReturn;
+   }
    if(Item.uDataType != QCBOR_TYPE_MAP) {
       return QCBOR_ERR_UNEXPECTED_TYPE;
    }
@@ -2185,10 +2221,14 @@
 
 QCBORError QCBORDecode_EnterArray(QCBORDecodeContext *pMe)
 {
-   QCBORItem Item;
+   QCBORItem  Item;
+   QCBORError nReturn;
 
    /* Get the data item that is the map that is being searched */
-   QCBORDecode_GetNext(pMe, &Item);
+   nReturn = QCBORDecode_GetNext(pMe, &Item);
+   if(nReturn != QCBOR_SUCCESS) {
+      return nReturn;
+   }
    if(Item.uDataType != QCBOR_TYPE_ARRAY) {
       return QCBOR_ERR_UNEXPECTED_TYPE;
    }