diff --git a/src/util/audio_codec/I2SCC26XX.c b/src/util/audio_codec/I2SCC26XX.c
index 97a3361..44d1168 100644
--- a/src/util/audio_codec/I2SCC26XX.c
+++ b/src/util/audio_codec/I2SCC26XX.c
@@ -105,7 +105,11 @@ typedef struct
 //queueNodeI2S_t nodeTable[NUM_OF_NODES];
 
 #ifdef I2S_DEBUG
+#if (defined AUDIO_RECEIVER) && (defined AUDIO_TRANSMITTER)
+static queueNodeI2S_t * shadowQueueNodeTable[I2SCC26XX_QUEUE_SIZE * 2];
+#else
 static queueNodeI2S_t * shadowQueueNodeTable[I2SCC26XX_QUEUE_SIZE];
+#endif // (defined AUDIO_RECEIVER) && (defined AUDIO_TRANSMITTER)
 #endif //I2S_DEBUG
 
 static queueNodeI2S_t *i2sBlockActiveIn = NULL; // Reference to the element which is currently being filled by I2S DMA In
@@ -197,7 +201,7 @@ I2SCC26XX_Handle I2SCC26XX_open(I2SCC26XX_Handle handle, I2SCC26XX_Params *param
     object->currentStream               = params->currentStream;
     object->currentStream->status       = I2SCC26XX_STREAM_IDLE;
 
-    /* The following are constants that apply to PDM */
+    /* The following are constants that apply to I2S */
     object->i32SampleRate = 0;//I2S_SAMPLE_RATE_16K;                             /* If negative then use user configured clock division */
     object->audioClkCfg.wclkDiv = 250; //16                                  /* I2S Word Clock divider override*/
     object->audioClkCfg.sampleOnPositiveEdge = I2SCC26XX_SampleEdge_Postive; /* I2S Sample Edge */
@@ -209,20 +213,38 @@ I2SCC26XX_Handle I2SCC26XX_open(I2SCC26XX_Handle handle, I2SCC26XX_Params *param
     object->audioClkCfg.bclkSource = I2SCC26XX_BitClockSource_Int;           /* I2S Bit Clock source */
     object->audioClkCfg.mclkDiv = 4;                                         /* I2S Master Clock divider override */
 
+#if (defined AUDIO_RECEIVER) && (!defined AUDIO_TRANSMITTER)
+    // If only Audio Receiver is defined
     object->audioPinCfg.bitFields.ad1Usage = I2SCC26XX_ADUsageDisabled;      /* I2S AD1 usage (0: Disabled, 1: Input, 2: Output) */
+#else
+    object->audioPinCfg.bitFields.ad1Usage = I2SCC26XX_ADUsageInput;         /* I2S AD1 usage (0: Disabled, 1: Input, 2: Output) */
+#endif
     object->audioPinCfg.bitFields.enableMclkPin = I2SCC26XX_GENERIC_DISABLED;/* I2S Enable Master clock output on pin */
     object->audioPinCfg.bitFields.reserved = 0;
+#if (defined AUDIO_RECEIVER) && (!defined AUDIO_TRANSMITTER)
+    // If only Audio Receiver is defined
     object->audioPinCfg.bitFields.ad1NumOfChannels = 0;                      /* I2S AD1 number of channels (1 - 8). !Must match channel mask */
     object->audioPinCfg.bitFields.ad1ChannelMask = I2SCC26XX_DISABLED_MODE;  /* I2S AD1 Channel Mask */
-#ifdef AUDIO_RECEIVER
+#else //AUDIO_TRANSMITTER (and possibly receiver)
+    object->audioPinCfg.bitFields.ad1NumOfChannels = 1;                      /* I2S AD1 number of channels (1 - 8). !Must match channel mask */
+    object->audioPinCfg.bitFields.ad1ChannelMask = I2SCC26XX_MONO_MODE;      /* I2S AD1 Channel Mask */
+#endif
+#if (!defined AUDIO_RECEIVER) && (defined AUDIO_TRANSMITTER)
+    // If only Audio Transmitter is defined
+    object->audioPinCfg.bitFields.ad0Usage = I2SCC26XX_ADUsageDisabled;      /* I2S AD0 usage (0: Disabled, 1: Input, 2: Output) */
+#else // If Audio Receiver (and possibly transmitter)
     object->audioPinCfg.bitFields.ad0Usage = I2SCC26XX_ADUsageOutput;        /* I2S AD0 usage (0: Disabled, 1: Input, 2: Output) */
-#else //AUDIO_TRANSMITTER
-    object->audioPinCfg.bitFields.ad0Usage = I2SCC26XX_ADUsageInput;         /* I2S AD0 usage (0: Disabled, 1: Input, 2: Output) */
 #endif
     object->audioPinCfg.bitFields.enableWclkPin = I2SCC26XX_GENERIC_ENABLED; /* I2S Enable Word clock output on pin */
     object->audioPinCfg.bitFields.enableBclkPin = I2SCC26XX_GENERIC_ENABLED; /* I2S Enable Bit clock output on pin */
+#if (!defined AUDIO_RECEIVER) && (defined AUDIO_TRANSMITTER)
+    // If only Audio Transmitter is defined
+    object->audioPinCfg.bitFields.ad0NumOfChannels = 0;                      /* I2S AD0 number of channels (1 - 8). !Must match channel mask. \sa PDM_NUM_OF_CHANNELS */
+    object->audioPinCfg.bitFields.ad0ChannelMask = I2SCC26XX_DISABLED_MODE;  /* I2S AD0 Channel Mask */
+#else // If Audio Receiver (and possibly transmitter)
     object->audioPinCfg.bitFields.ad0NumOfChannels = 1;                      /* I2S AD0 number of channels (1 - 8). !Must match channel mask. \sa PDM_NUM_OF_CHANNELS */
     object->audioPinCfg.bitFields.ad0ChannelMask = I2SCC26XX_MONO_MODE;      /* I2S AD0 Channel Mask */
+#endif
 
     object->audioFmtCfg.wordLength = I2SCC26XX_WordLength16;                 /* Number of bits per word (8-24). Exact for single phase, max for dual phase */
     object->audioFmtCfg.sampleEdge = I2SCC26XX_PositiveEdge;                 /* Data and Word clock is samples, and clocked out, on opposite edges of BCLK */
@@ -365,11 +387,12 @@ I2SCC26XX_Handle I2SCC26XX_open(I2SCC26XX_Handle handle, I2SCC26XX_Params *param
         Queue_construct(&i2sBlockAvailOut, NULL);
         i2sBlockAvailOutQueue = Queue_handle(&i2sBlockAvailOut);
 
-        uint32_t ui32NumberOfBlocksIn = object->ui32conBufTotalSize/ui32BlockSizeInBytesIn;
+        // Add offset if there are block In
+        uint32_t ui32NumberOfBlocksIn = (ui32BlockSizeInBytesIn) ? ui32NumberOfBlocks : 0;
         for (i = 0; i < ui32NumberOfBlocks ; i++) {
             queueNodeI2S_t * tmpNode = (queueNodeI2S_t *)&((uint8_t *)object->pvContMgtBuffer)[(i * sizeof(queueNodeI2S_t)) + (ui32NumberOfBlocksIn * sizeof(queueNodeI2S_t))];
             // Split continuous buffer
-            tmpNode->buf = &((uint8_t *)object->pvContBuffer)[(i * ui32BlockSizeInBytesOut) + (ui32NumberOfBlocks * ui32BlockSizeInBytesIn)];
+            tmpNode->buf = &((uint8_t *)object->pvContBuffer)[(i * ui32BlockSizeInBytesOut) + (ui32NumberOfBlocksIn * ui32BlockSizeInBytesIn)];
             if (i == (ui32NumberOfBlocks - 1)) {
                 i2sBlockRepeatOut = tmpNode;
 #ifdef I2S_DEBUG
@@ -383,7 +406,7 @@ I2SCC26XX_Handle I2SCC26XX_open(I2SCC26XX_Handle handle, I2SCC26XX_Params *param
 #endif //I2S_DEBUG
             }
 #ifdef I2S_DEBUG
-            shadowQueueNodeTable[i] = tmpNode;
+            shadowQueueNodeTable[i + ui32NumberOfBlocksIn] = tmpNode;
 #endif //I2S_DEBUG
         }
     }
@@ -533,6 +556,8 @@ static void I2SCC26XX_hwiFxn (UArg arg) {
 #ifdef I2S_DEBUG
           i2sBlockActiveIn->queueIndicator = NODE_INDICATOR_READY_QUEUE;
 #endif //I2S_DEBUG
+        } else {
+            Log_print1(Diags_USER2, "I2S:(%p) reusable buffer used In", hwAttrs->baseAddr);
         }
         /* Setup next active buffer */
         i2sBlockActiveIn = i2sBlockNextIn;
@@ -601,6 +626,8 @@ static void I2SCC26XX_hwiFxn (UArg arg) {
 #ifdef I2S_DEBUG
             i2sBlockActiveOut->queueIndicator = NODE_INDICATOR_READY_QUEUE;
 #endif //I2S_DEBUG
+        } else {
+            Log_print1(Diags_USER2, "I2S:(%p) reusable buffer used Out", hwAttrs->baseAddr);
         }
         /* Setup next active buffer */
         i2sBlockActiveOut = i2sBlockNextOut;
@@ -622,7 +649,7 @@ static void I2SCC26XX_hwiFxn (UArg arg) {
             object->currentStream->status = I2SCC26XX_STREAM_STOPPED;
         }
         else if (object->currentStream->status != I2SCC26XX_STREAM_STOPPED) {
-            if ((dbgCntI2SRelBuf > 3) && !Queue_empty(i2sBlockAvailOutQueue))
+            if ((dbgCntI2SRelBuf > 4) && !Queue_empty(i2sBlockAvailOutQueue))
             {
                 i2sBlockNextOut = Queue_get(i2sBlockAvailOutQueue);
 #ifdef I2S_DEBUG
@@ -935,7 +962,27 @@ bool I2SCC26XX_requestBuffer(I2SCC26XX_Handle handle, I2SCC26XX_BufferRequest *b
     * after being notified of available buffers. Hence we may directly
     * check queue and dequeue buffer
     */
-    if (i2sBlockReadyInQueue) {
+
+    // If Input AND Output are both defined both should be available before returning buffers
+    if (bufferRequest->buffersRequested == I2SCC26XX_BUFFER_IN_AND_OUT) {
+        if ((!Queue_empty(i2sBlockReadyInQueue)) && (!Queue_empty(i2sBlockReadyOutQueue))) {
+            queueNodeI2S_t *readyNode = Queue_get(i2sBlockReadyInQueue);
+            bufferRequest->bufferIn = readyNode->buf;
+//                    bufferRequest->status = object->currentStream->status;
+            bufferRequest->bufferHandleIn = readyNode;
+#ifdef I2S_DEBUG
+            readyNode->queueIndicator = NODE_INDICATOR_USER;
+#endif //I2S_DEBUG
+            readyNode = Queue_get(i2sBlockReadyOutQueue);
+            bufferRequest->bufferOut = readyNode->buf;
+            bufferRequest->status = object->currentStream->status;
+            bufferRequest->bufferHandleOut = readyNode;
+#ifdef I2S_DEBUG
+            readyNode->queueIndicator = NODE_INDICATOR_USER;
+#endif //I2S_DEBUG
+            retVal = true;
+        }
+    } else if (bufferRequest->buffersRequested == I2SCC26XX_BUFFER_IN) {
         if (!Queue_empty(i2sBlockReadyInQueue)) {
             queueNodeI2S_t *readyNode = Queue_get(i2sBlockReadyInQueue);
             bufferRequest->bufferIn = readyNode->buf;
@@ -946,9 +993,7 @@ bool I2SCC26XX_requestBuffer(I2SCC26XX_Handle handle, I2SCC26XX_BufferRequest *b
 #endif //I2S_DEBUG
             retVal = true;
         }
-    }
-
-    if (i2sBlockReadyOutQueue) {
+    } else if (bufferRequest->buffersRequested == I2SCC26XX_BUFFER_OUT) {
         if (!Queue_empty(i2sBlockReadyOutQueue)) {
             queueNodeI2S_t *readyNode = Queue_get(i2sBlockReadyOutQueue);
             bufferRequest->bufferOut = readyNode->buf;
diff --git a/src/util/audio_codec/I2SCC26XX.h b/src/util/audio_codec/I2SCC26XX.h
index 9b4d025..d0b961a 100644
--- a/src/util/audio_codec/I2SCC26XX.h
+++ b/src/util/audio_codec/I2SCC26XX.h
@@ -247,7 +247,7 @@ extern "C" {
  *  At least three elements must exist for good flow in driver
  */
 #define I2SCC26XX_MIN_ALLOWED_QUEUE_SIZE        3
-#define I2SCC26XX_QUEUE_SIZE                    5 //7
+#define I2SCC26XX_QUEUE_SIZE                    7 //9
 
 /*!
  *  PDM block overhead size in number of bytes --> sizeof(queueNodeI2S_t)
@@ -320,6 +320,17 @@ typedef enum I2SCC26XX_Mode {
 } I2SCC26XX_Mode;
 
 /*!
+ *  @brief
+ *  Definitions for which I2SCC26XX buffers are requested.
+ */
+typedef enum I2SCC26XX_BuffersRequested {
+    I2SCC26XX_BUFFER_NONE         = 0,    /*!< No I2SCC26XX buffer requested */
+    I2SCC26XX_BUFFER_IN           = 1,    /*!< I2SCC26XX buffer In requested */
+    I2SCC26XX_BUFFER_OUT          = 2,    /*!< I2SCC26XX buffer Out requested */
+    I2SCC26XX_BUFFER_IN_AND_OUT   = 3,    /*!< I2SCC26XX buffer In and Out requested */
+} I2SCC26XX_BuffersRequested;
+
+/*!
  *  We don't use sample stamp generator, but we can't start without
  *  enabling it and configuring the trigger. This is because the
  *  trigger also starts the audio stream
@@ -797,6 +808,7 @@ typedef struct I2SCC26XX_StreamNotification {
  *  \sa I2SCC26XX_requestBuffer
  */
 typedef struct I2SCC26XX_BufferRequest {
+    I2SCC26XX_BuffersRequested buffersRequested; /*!< Indicates which buffers are requested */
     void      *bufferIn;        /*!< Pointer to requested In buffer */
     void      *bufferOut;       /*!< Pointer to requested Out buffer */
     void      *bufferHandleIn;  /*!< Pointer to requested In buffers handle */
