diff --git a/user_channel/channelcommands.cpp b/user_channel/channelcommands.cpp
index 714c05a..4bf8071 100644
--- a/user_channel/channelcommands.cpp
+++ b/user_channel/channelcommands.cpp
@@ -47,16 +47,17 @@
                                uint2_t chanAccess, uint4_t channelPrivLimit,
                                uint2_t reserved2, uint2_t channelPrivMode)
 {
-    const uint8_t chNum =
-        convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
-
-    if (!isValidChannel(chNum) || reserved1 != 0 || reserved2 != 0)
+    if (reserved1 || reserved2 ||
+        !isValidPrivLimit(static_cast<uint8_t>(channelPrivLimit)))
     {
         log<level::DEBUG>("Set channel access - Invalid field in request");
         return responseInvalidFieldRequest();
     }
 
-    if (getChannelSessionSupport(chNum) == EChannelSessSupported::none)
+    const uint8_t chNum =
+        convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
+    if ((getChannelSessionSupport(chNum) == EChannelSessSupported::none) ||
+        (!isValidChannel(chNum)))
     {
         log<level::DEBUG>("Set channel access - No support on channel");
         return response(ccActionNotSupportedForChannel);
@@ -95,7 +96,7 @@
         case reserved:
         default:
             log<level::DEBUG>("Set channel access - Invalid access set mode");
-            return responseInvalidFieldRequest();
+            return response(ccAccessModeNotSupportedForChannel);
     }
 
     // cannot static cast directly from uint2_t to enum; must go via int
@@ -116,7 +117,7 @@
         case reserved:
         default:
             log<level::DEBUG>("Set channel access - Invalid access priv mode");
-            return responseInvalidFieldRequest();
+            return response(ccAccessModeNotSupportedForChannel);
     }
 
     if (setNVFlag != 0)
@@ -170,10 +171,7 @@
     ipmiGetChannelAccess(Context::ptr ctx, uint4_t channel, uint4_t reserved1,
                          uint6_t reserved2, uint2_t accessSetMode)
 {
-    const uint8_t chNum =
-        convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
-
-    if (!isValidChannel(chNum) || reserved1 != 0 || reserved2 != 0)
+    if (reserved1 || reserved2)
     {
         log<level::DEBUG>("Get channel access - Invalid field in request");
         return responseInvalidFieldRequest();
@@ -182,10 +180,14 @@
     if ((accessSetMode == doNotSet) || (accessSetMode == reserved))
     {
         log<level::DEBUG>("Get channel access - Invalid Access mode");
-        return responseInvalidFieldRequest();
+        return response(ccAccessModeNotSupportedForChannel);
     }
 
-    if (getChannelSessionSupport(chNum) == EChannelSessSupported::none)
+    const uint8_t chNum =
+        convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
+
+    if ((getChannelSessionSupport(chNum) == EChannelSessSupported::none) ||
+        (!isValidChannel(chNum)))
     {
         log<level::DEBUG>("Get channel access - No support on channel");
         return response(ccActionNotSupportedForChannel);
@@ -245,14 +247,20 @@
         >
     ipmiGetChannelInfo(Context::ptr ctx, uint4_t channel, uint4_t reserved)
 {
-    uint8_t chNum =
-        convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
-    if (!isValidChannel(chNum) || reserved)
+    if (reserved)
     {
         log<level::DEBUG>("Get channel access - Invalid field in request");
         return responseInvalidFieldRequest();
     }
 
+    uint8_t chNum =
+        convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
+    if (!isValidChannel(chNum))
+    {
+        log<level::DEBUG>("Get channel Info - No support on channel");
+        return response(ccActionNotSupportedForChannel);
+    }
+
     ChannelInfo chInfo;
     Cc compCode = getChannelInfo(chNum, chInfo);
     if (compCode != ccSuccess)
@@ -315,20 +323,19 @@
 {
     uint8_t chNum =
         convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
-    if (!isValidChannel(chNum) || reserved)
+
+    if (!doesDeviceExist(chNum) || !isValidChannel(chNum) || reserved)
     {
-        log<level::DEBUG>("Get channel access - Invalid field in request");
+        log<level::DEBUG>("Get channel payload - Invalid field in request");
         return responseInvalidFieldRequest();
     }
 
     // Session support is available in active LAN channels.
-    if ((getChannelSessionSupport(chNum) == EChannelSessSupported::none) ||
-        !(doesDeviceExist(chNum)))
+    if (getChannelSessionSupport(chNum) == EChannelSessSupported::none)
     {
-        log<level::DEBUG>("Get channel payload - Device not exist");
-        return responseInvalidFieldRequest();
+        log<level::DEBUG>("Get channel payload - No support on channel");
+        return response(ccActionNotSupportedForChannel);
     }
-
     constexpr uint16_t stdPayloadType = standardPayloadBit(PayloadType::IPMI) |
                                         standardPayloadBit(PayloadType::SOL);
     constexpr uint16_t sessSetupPayloadType =
@@ -361,15 +368,24 @@
     uint8_t channel =
         convertCurrentChannelNum(static_cast<uint8_t>(chNum), ctx->channel);
 
-    if (reserved || !isValidChannel(channel) ||
-        (getChannelSessionSupport(channel)) == EChannelSessSupported::none)
+    if (reserved || !isValidChannel(channel))
     {
+        log<level::DEBUG>(
+            "Get channel payload version - Invalid field in request");
         return responseInvalidFieldRequest();
     }
 
+    if (getChannelSessionSupport(channel) == EChannelSessSupported::none)
+    {
+        log<level::DEBUG>(
+            "Get channel payload version - No support on channel");
+        return response(ccActionNotSupportedForChannel);
+    }
+
     if (!isValidPayloadType(static_cast<PayloadType>(payloadTypeNum)))
     {
-        log<level::ERR>("Channel payload version - Payload type unavailable");
+        log<level::ERR>(
+            "Get channel payload version - Payload type unavailable");
 
         constexpr uint8_t payloadTypeNotSupported = 0x80;
         return response(payloadTypeNotSupported);
