diff --git a/1.2/HalPolicy.cpp b/1.2/HalPolicy.cpp
index 79d117a..4cefd59 100644
--- a/1.2/HalPolicy.cpp
+++ b/1.2/HalPolicy.cpp
@@ -64,6 +64,8 @@
             return ConvertBatchToSpaceNd(operation, model, data);
         case V1_2::OperationType::CAST:
             return ConvertCast(operation, model, data);
+        case V1_2::OperationType::CHANNEL_SHUFFLE:
+            return ConvertChannelShuffle(operation, model, data);
         case V1_2::OperationType::CONCATENATION:
             return ConvertConcatenation(operation, model, data);
         case V1_2::OperationType::CONV_2D:
@@ -221,6 +223,12 @@
     return ::ConvertCast<hal_1_2::HalPolicy>(operation, model, data);
 }
 
+bool HalPolicy::ConvertChannelShuffle(const Operation& operation, const Model& model, ConversionData& data)
+{
+    ALOGV("hal_1_2::HalPolicy::ConvertChannelShuffle()");
+    return ::ConvertChannelShuffle<hal_1_2::HalPolicy>(operation, model, data);
+}
+
 bool HalPolicy::ConvertComparison(const Operation& operation,
                                   const Model& model,
                                   ConversionData& data,
diff --git a/1.2/HalPolicy.hpp b/1.2/HalPolicy.hpp
index 0662e1b..9fb7457 100644
--- a/1.2/HalPolicy.hpp
+++ b/1.2/HalPolicy.hpp
@@ -52,6 +52,8 @@
 
     static bool ConvertCast(const Operation& operation, const Model& model, ConversionData& data);
 
+    static bool ConvertChannelShuffle(const Operation& operation, const Model& model, ConversionData& data);
+
     static bool ConvertComparison(const Operation& operation,
                                   const Model& model,
                                   ConversionData& data,
diff --git a/1.3/HalPolicy.cpp b/1.3/HalPolicy.cpp
index 161ef80..de48742 100644
--- a/1.3/HalPolicy.cpp
+++ b/1.3/HalPolicy.cpp
@@ -35,6 +35,8 @@
             return ConvertBatchToSpaceNd(operation, model, data);
         case V1_3::OperationType::CAST:
             return ConvertCast(operation, model, data);
+        case V1_3::OperationType::CHANNEL_SHUFFLE:
+            return ConvertChannelShuffle(operation, model, data);
         case V1_3::OperationType::CONCATENATION:
             return ConvertConcatenation(operation, model, data);
         case V1_3::OperationType::CONV_2D:
@@ -208,6 +210,12 @@
     return ::ConvertCast<hal_1_3::HalPolicy>(operation, model, data);
 }
 
+bool HalPolicy::ConvertChannelShuffle(const Operation& operation, const Model& model, ConversionData& data)
+{
+    ALOGV("hal_1_3::HalPolicy::ConvertChannelShuffle()");
+    return ::ConvertChannelShuffle<hal_1_3::HalPolicy>(operation, model, data);
+}
+
 bool HalPolicy::ConvertComparison(const Operation& operation,
                                   const Model& model,
                                   ConversionData& data,
@@ -217,7 +225,6 @@
     return ::ConvertComparison_1_2<hal_1_3::HalPolicy>(operation, model, data, comparisonOperation);
 }
 
-
 bool HalPolicy::ConvertConcatenation(const Operation& operation, const Model& model, ConversionData& data)
 {
     ALOGV("hal_1_3::HalPolicy::ConvertConcatenation()");
diff --git a/1.3/HalPolicy.hpp b/1.3/HalPolicy.hpp
index cf1d366..dee391a 100644
--- a/1.3/HalPolicy.hpp
+++ b/1.3/HalPolicy.hpp
@@ -49,6 +49,8 @@
 
     static bool ConvertCast(const Operation& operation, const Model& model, ConversionData& data);
 
+    static bool ConvertChannelShuffle(const Operation& operation, const Model& model, ConversionData& data);
+
     static bool ConvertComparison(const Operation& operation,
                                   const Model& model,
                                   ConversionData& data,
diff --git a/ConversionUtils_1_2.hpp b/ConversionUtils_1_2.hpp
index 594b8e1..404ff32 100644
--- a/ConversionUtils_1_2.hpp
+++ b/ConversionUtils_1_2.hpp
@@ -172,6 +172,90 @@
 template<typename HalPolicy,
          typename HalOperation = typename HalPolicy::Operation,
          typename HalModel     = typename HalPolicy::Model>
+bool ConvertChannelShuffle(const HalOperation& operation,
+                           const HalModel& model,
+                           ConversionData& data)
+{
+    using HalOperand = typename HalPolicy::Operand;
+    using HalOperandType = typename HalPolicy::OperandType;
+
+    ALOGV("HalPolicy::ConvertChannelShuffle()");
+
+    LayerInputHandle input = ConvertToLayerInputHandle<HalPolicy>(operation, 0, model, data);
+    if (!input.IsValid())
+    {
+        return Fail("%s: Operation has invalid inputs", __func__);
+    }
+    auto inputDimensions = static_cast<int32_t>(input.GetTensorInfo().GetNumDimensions());
+
+    ChannelShuffleDescriptor descriptor;
+
+    int32_t groups;
+    if (!GetInputScalar<HalPolicy>(operation, 1, HalOperandType::INT32, groups, model, data))
+    {
+        return Fail("%s: Operation has invalid or unsupported number of groups operand", __func__);
+    }
+    descriptor.m_NumGroups = static_cast<uint32_t>(groups);
+
+    int32_t axis;
+    if (!GetInputScalar<HalPolicy>(operation, 2, HalOperandType::INT32, axis, model, data))
+    {
+        return Fail("%s: Operation has invalid or unsupported dimension channel shuffle operand", __func__);
+    }
+    if (((axis < -inputDimensions) && (axis < 0)) || ((axis >= inputDimensions) && (axis > 0)))
+    {
+        return Fail("%s: Operation has invalid dimension: %d. It is out of bounds [-%d, %d))", __func__, axis,
+                    inputDimensions, inputDimensions);
+    }
+    int positiveAxis = (axis < 0) ? inputDimensions + axis : axis;
+    descriptor.m_Axis = static_cast<uint32_t>(positiveAxis);
+
+    const HalOperand* output = GetOutputOperand<HalPolicy>(operation, 0, model);
+    if (!output)
+    {
+        return Fail("%s: Could not read output 0", __func__);
+    }
+
+    const TensorInfo& inputInfo  = input.GetTensorInfo();
+    const TensorInfo& outputInfo = GetTensorInfoForOperand(*output);
+
+    bool isSupported = false;
+
+    auto validateFunc = [&](const armnn::TensorInfo& outputInfo, bool& isSupported)
+    {
+        FORWARD_LAYER_SUPPORT_FUNC(__func__,
+                                   IsChannelShuffleSupported,
+                                   data.m_Backends,
+                                   isSupported,
+                                   inputInfo,
+                                   outputInfo,
+                                   descriptor);
+    };
+
+    if(!IsDynamicTensor(outputInfo))
+    {
+        validateFunc(outputInfo, isSupported);
+    }
+    else
+    {
+        isSupported = AreDynamicTensorsSupported();
+    }
+
+    if (!isSupported)
+    {
+        return false;
+    }
+
+    IConnectableLayer* layer = data.m_Network->AddChannelShuffleLayer(descriptor);
+    assert(layer != nullptr);
+    input.Connect(layer->GetInputSlot(0));
+
+    return SetupAndTrackLayerOutputSlot<HalPolicy>(operation, 0, *layer, model, data, nullptr, validateFunc);
+}
+
+template<typename HalPolicy,
+         typename HalOperation = typename HalPolicy::Operation,
+         typename HalModel     = typename HalPolicy::Model>
 bool ConvertComparison_1_2(const HalOperation& operation,
                            const HalModel& model,
                            ConversionData& data,
diff --git a/NnapiSupport.txt b/NnapiSupport.txt
index 2d2e77f..e46735e 100644
--- a/NnapiSupport.txt
+++ b/NnapiSupport.txt
@@ -22,6 +22,7 @@
 BATCH_TO_SPACE_ND            (FLOAT32, FLOAT16, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED)
 CAST                         (FLOAT32, FLOAT16, INT32, QUANT8_ASYMM)
 CONCATENATION                (FLOAT32, FLOAT16, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED)
+CHANNEL_SHUFFLE              (FLOAT32, FLOAT16, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED)
 CONV_2D                      (FLOAT32, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED)
 DEPTH_TO_SPACE               (FLOAT32, FLOAT16, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED)
 DEPTHWISE_CONV_2D            (FLOAT32, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED)
