diff --git a/src/armnnDeserializer/Deserializer.cpp b/src/armnnDeserializer/Deserializer.cpp
index 8572023..f8ec2e7 100644
--- a/src/armnnDeserializer/Deserializer.cpp
+++ b/src/armnnDeserializer/Deserializer.cpp
@@ -188,6 +188,7 @@
     m_ParserFunctions[Layer_AbsLayer]                    = &Deserializer::ParseAbs;
     m_ParserFunctions[Layer_ActivationLayer]             = &Deserializer::ParseActivation;
     m_ParserFunctions[Layer_AdditionLayer]               = &Deserializer::ParseAdd;
+    m_ParserFunctions[Layer_ArgMinMaxLayer]              = &Deserializer::ParseArgMinMax;
     m_ParserFunctions[Layer_BatchToSpaceNdLayer]         = &Deserializer::ParseBatchToSpaceNd;
     m_ParserFunctions[Layer_BatchNormalizationLayer]     = &Deserializer::ParseBatchNormalization;
     m_ParserFunctions[Layer_ConcatLayer]                 = &Deserializer::ParseConcat;
@@ -244,6 +245,8 @@
             return graphPtr->layers()->Get(layerIndex)->layer_as_ActivationLayer()->base();
         case Layer::Layer_AdditionLayer:
             return graphPtr->layers()->Get(layerIndex)->layer_as_AdditionLayer()->base();
+        case Layer::Layer_ArgMinMaxLayer:
+            return graphPtr->layers()->Get(layerIndex)->layer_as_ArgMinMaxLayer()->base();
         case Layer::Layer_BatchToSpaceNdLayer:
             return graphPtr->layers()->Get(layerIndex)->layer_as_BatchToSpaceNdLayer()->base();
         case Layer::Layer_BatchNormalizationLayer:
@@ -401,6 +404,18 @@
     }
 }
 
+armnn::ArgMinMaxFunction ToArgMinMaxFunction(armnnSerializer::ArgMinMaxFunction function)
+{
+    switch (function)
+    {
+        case armnnSerializer::ArgMinMaxFunction::ArgMinMaxFunction_Max:
+            return armnn::ArgMinMaxFunction::Max;
+        case armnnSerializer::ArgMinMaxFunction::ArgMinMaxFunction_Min:
+        default:
+            return armnn::ArgMinMaxFunction::Min;
+    }
+}
+
 armnn::ResizeMethod ToResizeMethod(armnnSerializer::ResizeMethod method)
 {
     switch (method)
@@ -922,6 +937,32 @@
     RegisterOutputSlots(graph, layerIndex, layer);
 }
 
+void Deserializer::ParseArgMinMax(GraphPtr graph, unsigned int layerIndex)
+{
+    CHECK_LAYERS(graph, 0, layerIndex);
+    auto inputs = GetInputs(graph, layerIndex);
+    CHECK_LOCATION();
+    CHECK_VALID_SIZE(inputs.size(), 1);
+
+    auto outputs = GetOutputs(graph, layerIndex);
+    CHECK_VALID_SIZE(outputs.size(), 1);
+
+    auto serializerLayer = graph->layers()->Get(layerIndex)->layer_as_ArgMinMaxLayer();
+    auto serializerDescriptor = serializerLayer->descriptor();
+
+    armnn::ArgMinMaxDescriptor descriptor;
+    descriptor.m_Function = ToArgMinMaxFunction(serializerDescriptor->function());
+    descriptor.m_Axis = serializerDescriptor->axis();
+    auto layerName = GetLayerName(graph, layerIndex);
+    IConnectableLayer* layer = m_Network->AddArgMinMaxLayer(descriptor, layerName.c_str());
+
+    armnn::TensorInfo outputTensorInfo = ToTensorInfo(outputs[0]);
+    layer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
+
+    RegisterInputSlots(graph, layerIndex, layer);
+    RegisterOutputSlots(graph, layerIndex, layer);
+}
+
 void Deserializer::ParseBatchToSpaceNd(GraphPtr graph, unsigned int layerIndex)
 {
     CHECK_LAYERS(graph, 0, layerIndex);
diff --git a/src/armnnDeserializer/Deserializer.hpp b/src/armnnDeserializer/Deserializer.hpp
index 9ec59fb..f7743bc 100644
--- a/src/armnnDeserializer/Deserializer.hpp
+++ b/src/armnnDeserializer/Deserializer.hpp
@@ -80,6 +80,7 @@
     void ParseAbs(GraphPtr graph, unsigned int layerIndex);
     void ParseActivation(GraphPtr graph, unsigned int layerIndex);
     void ParseAdd(GraphPtr graph, unsigned int layerIndex);
+    void ParseArgMinMax(GraphPtr graph, unsigned int layerIndex);
     void ParseBatchToSpaceNd(GraphPtr graph, unsigned int layerIndex);
     void ParseBatchNormalization(GraphPtr graph, unsigned int layerIndex);
     void ParseConcat(GraphPtr graph, unsigned int layerIndex);
diff --git a/src/armnnDeserializer/DeserializerSupport.md b/src/armnnDeserializer/DeserializerSupport.md
index c780071..2fd706d 100644
--- a/src/armnnDeserializer/DeserializerSupport.md
+++ b/src/armnnDeserializer/DeserializerSupport.md
@@ -9,6 +9,7 @@
 * Abs
 * Activation
 * Addition
+* ArgMinMax
 * BatchToSpaceNd
 * BatchNormalization
 * Concat
diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs
index 2b3ec49..97d2780 100644
--- a/src/armnnSerializer/ArmnnSchema.fbs
+++ b/src/armnnSerializer/ArmnnSchema.fbs
@@ -22,6 +22,11 @@
     Square = 9
 }
 
+enum ArgMinMaxFunction : byte {
+    Min = 0,
+    Max = 1
+}
+
 enum DataType : byte {
     Float16 = 0,
     Float32 = 1,
@@ -133,7 +138,8 @@
     Resize = 43,
     Stack = 44,
     QuantizedLstm = 45,
-    Abs = 46
+    Abs = 46,
+    ArgMinMax = 47
 }
 
 // Base layer table to be used as part of other layers
@@ -171,6 +177,16 @@
     base:LayerBase;
 }
 
+table ArgMinMaxLayer {
+    base:LayerBase;
+    descriptor:ArgMinMaxDescriptor;
+}
+
+table ArgMinMaxDescriptor{
+    function:ArgMinMaxFunction;
+    axis:int;
+}
+
 table ConstantLayer {
     base:LayerBase;
     input:ConstTensor;
@@ -693,7 +709,8 @@
     TransposeConvolution2dLayer,
     ResizeLayer,
     StackLayer,
-    AbsLayer
+    AbsLayer,
+    ArgMinMaxLayer
 }
 
 table AnyLayer {
diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp
index 595573c..602c4ab 100644
--- a/src/armnnSerializer/Serializer.cpp
+++ b/src/armnnSerializer/Serializer.cpp
@@ -49,6 +49,18 @@
     }
 }
 
+serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
+{
+    switch (function)
+    {
+        case armnn::ArgMinMaxFunction::Max:
+            return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
+        case armnn::ArgMinMaxFunction::Min:
+        default:
+            return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
+    }
+}
+
 uint32_t SerializerVisitor::GetSerializedId(unsigned int guid)
 {
     std::pair<unsigned int, uint32_t> guidPair(guid, m_layerId);
@@ -154,8 +166,20 @@
                                             const armnn::ArgMinMaxDescriptor& descriptor,
                                             const char *name)
 {
-    // This will be implemented in IVGCVSW-3724
-    throw UnimplementedException("SerializerVisitor::VisitArgMinMaxLayer is not implemented");
+    // Create FlatBuffer BaseLayer
+    auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
+
+    // Create FlatBuffer Descriptor
+    auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
+                                                          GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
+                                                          descriptor.m_Axis);
+
+    // Create FlatBuffer ArgMinMaxLayer
+    auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
+                                                flatBufferBaseLayer,
+                                                flatBufferDescriptor);
+
+    CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
 }
 
 // Build FlatBuffer for BatchToSpaceNd Layer
diff --git a/src/armnnSerializer/SerializerSupport.md b/src/armnnSerializer/SerializerSupport.md
index 9babe25..534e9fa 100644
--- a/src/armnnSerializer/SerializerSupport.md
+++ b/src/armnnSerializer/SerializerSupport.md
@@ -9,6 +9,7 @@
 * Abs
 * Activation
 * Addition
+* ArgMinMax
 * BatchToSpaceNd
 * BatchNormalization
 * Concat
diff --git a/src/armnnSerializer/test/SerializerTests.cpp b/src/armnnSerializer/test/SerializerTests.cpp
index b5ef8c6..bbd5402 100644
--- a/src/armnnSerializer/test/SerializerTests.cpp
+++ b/src/armnnSerializer/test/SerializerTests.cpp
@@ -288,6 +288,62 @@
     deserializedNetwork->Accept(verifier);
 }
 
+BOOST_AUTO_TEST_CASE(SerializeArgMinMax)
+{
+    class ArgMinMaxLayerVerifier : public LayerVerifierBase
+    {
+    public:
+        ArgMinMaxLayerVerifier(const std::string& layerName,
+                               const std::vector<armnn::TensorInfo>& inputInfos,
+                               const std::vector<armnn::TensorInfo>& outputInfos,
+                               const armnn::ArgMinMaxDescriptor& descriptor)
+        : LayerVerifierBase(layerName, inputInfos, outputInfos)
+        , m_Descriptor(descriptor) {}
+
+        void VisitArgMinMaxLayer(const armnn::IConnectableLayer* layer,
+                                 const armnn::ArgMinMaxDescriptor& descriptor,
+                                 const char* name) override
+        {
+            VerifyNameAndConnections(layer, name);
+            VerifyDescriptor(descriptor);
+        }
+
+    private:
+        void VerifyDescriptor(const armnn::ArgMinMaxDescriptor& descriptor)
+        {
+            BOOST_CHECK(descriptor.m_Function == m_Descriptor.m_Function);
+            BOOST_CHECK(descriptor.m_Axis == m_Descriptor.m_Axis);
+        }
+
+        armnn::ArgMinMaxDescriptor m_Descriptor;
+    };
+
+    const std::string layerName("argminmax");
+    const armnn::TensorInfo inputInfo({1, 2, 3}, armnn::DataType::Float32);
+    const armnn::TensorInfo outputInfo({1, 3}, armnn::DataType::Signed32);
+
+    armnn::ArgMinMaxDescriptor descriptor;
+    descriptor.m_Function = armnn::ArgMinMaxFunction::Max;
+    descriptor.m_Axis = 1;
+
+    armnn::INetworkPtr network = armnn::INetwork::Create();
+    armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
+    armnn::IConnectableLayer* const argMinMaxLayer = network->AddArgMinMaxLayer(descriptor, layerName.c_str());
+    armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
+
+    inputLayer->GetOutputSlot(0).Connect(argMinMaxLayer->GetInputSlot(0));
+    argMinMaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
+
+    inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
+    argMinMaxLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
+
+    armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
+    BOOST_CHECK(deserializedNetwork);
+
+    ArgMinMaxLayerVerifier verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
+    deserializedNetwork->Accept(verifier);
+}
+
 BOOST_AUTO_TEST_CASE(SerializeBatchNormalization)
 {
     class BatchNormalizationLayerVerifier : public LayerVerifierBase
