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
