diff --git a/arm_compute/graph/INodeVisitor.h b/arm_compute/graph/INodeVisitor.h
index be43b57..5c5b777 100644
--- a/arm_compute/graph/INodeVisitor.h
+++ b/arm_compute/graph/INodeVisitor.h
@@ -96,6 +96,11 @@
      * @param[in] n Node to visit.
      */
     virtual void visit(FusedConvolutionBatchNormalizationNode &n) = 0;
+    /** Visit FusedDepthwiseConvolutionBatchNormalizationNode.
+     *
+     * @param[in] n Node to visit.
+     */
+    virtual void visit(FusedDepthwiseConvolutionBatchNormalizationNode &n) = 0;
     /** Visit InputNode.
      *
      * @param[in] n Node to visit.
@@ -214,6 +219,10 @@
     {
         default_visit();
     }
+    virtual void visit(FusedDepthwiseConvolutionBatchNormalizationNode &n) override
+    {
+        default_visit();
+    }
     virtual void visit(InputNode &n) override
     {
         default_visit();
diff --git a/arm_compute/graph/TypePrinter.h b/arm_compute/graph/TypePrinter.h
index 4fb5b73..9da0e61 100644
--- a/arm_compute/graph/TypePrinter.h
+++ b/arm_compute/graph/TypePrinter.h
@@ -101,6 +101,9 @@
         case NodeType::FusedConvolutionBatchNormalizationLayer:
             os << "FusedConvolutionBatchNormalizationLayer";
             break;
+        case NodeType::FusedDepthwiseConvolutionBatchNormalizationLayer:
+            os << "FusedDepthwiseConvolutionBatchNormalizationLayer";
+            break;
         case NodeType::GenerateProposalsLayer:
             os << "GenerateProposalsLayer";
             break;
diff --git a/arm_compute/graph/Types.h b/arm_compute/graph/Types.h
index 2f09abb..9f96242 100644
--- a/arm_compute/graph/Types.h
+++ b/arm_compute/graph/Types.h
@@ -141,6 +141,7 @@
     FlattenLayer,
     FullyConnectedLayer,
     FusedConvolutionBatchNormalizationLayer,
+    FusedDepthwiseConvolutionBatchNormalizationLayer,
     GenerateProposalsLayer,
     NormalizationLayer,
     NormalizePlanarYUVLayer,
diff --git a/arm_compute/graph/backends/FunctionHelpers.h b/arm_compute/graph/backends/FunctionHelpers.h
index 5ac4fda..ed5b35c 100644
--- a/arm_compute/graph/backends/FunctionHelpers.h
+++ b/arm_compute/graph/backends/FunctionHelpers.h
@@ -30,6 +30,7 @@
 #include "arm_compute/graph/Types.h"
 #include "arm_compute/graph/Utils.h"
 #include "arm_compute/graph/backends/FusedConvolutionBatchNormalizationFunction.h"
+#include "arm_compute/graph/backends/FusedDepthwiseConvolutionBatchNormalizationFunction.h"
 #include "arm_compute/graph/backends/Utils.h"
 #include "arm_compute/graph/nodes/Nodes.h"
 
@@ -197,12 +198,6 @@
     const ActivationLayerInfo fused_act  = node.fused_activation();
     const float               epsilon    = node.epsilon();
 
-    const bool is_quantized = is_data_type_quantized_asymmetric(input->info()->data_type());
-    if(is_quantized && biases != nullptr)
-    {
-        biases->info()->set_data_type(DataType::S32);
-    }
-
     // Create and configure function
     auto func = support::cpp14::make_unique<FusedConvolutionBatchNormalizationFunction<TargetInfo, FusedLayerTypes>>();
     func->configure(input, weights, biases, output, mean, var, beta, gamma, epsilon, conv_info, num_groups, fast_math, fused_act);
@@ -210,7 +205,55 @@
     // Log info
     ARM_COMPUTE_LOG_GRAPH_INFO("Instantiated "
                                << node.name()
-                               << " Type: " << node.name()
+                               << " Type: " << node.type()
+                               << " Target: " << TargetInfo::TargetType
+                               << " Data Type: " << input->info()->data_type()
+                               << " Input shape: " << input->info()->tensor_shape()
+                               << " Weights shape: " << weights->info()->tensor_shape()
+                               << " Output shape: " << output->info()->tensor_shape()
+                               << (fused_act.enabled() ? " " + to_string(fused_act.activation()) : "")
+                               << std::endl);
+    return std::move(func);
+}
+
+/** Create a backend fused depthwise convolution batch normalization layer function
+ *
+ * @tparam FusedLayerTypes             Fused layer types
+ * @tparam TargetInfo                  Target-specific information
+ *
+ * @param[in] node Node to create the backend function for
+ *
+ * @return Backend fused depthwise convolution batch normalization layer function
+ */
+template <typename FusedLayerTypes, typename TargetInfo>
+std::unique_ptr<IFunction> create_fused_depthwise_convolution_batch_normalization_layer(FusedDepthwiseConvolutionBatchNormalizationNode &node)
+{
+    validate_node<TargetInfo>(node, 7 /* expected inputs */, 1 /* expected outputs */);
+
+    // Extract IO and info
+    typename TargetInfo::TensorType *input   = get_backing_tensor<TargetInfo>(node.input(0));
+    typename TargetInfo::TensorType *weights = get_backing_tensor<TargetInfo>(node.input(1));
+    typename TargetInfo::TensorType *biases  = get_backing_tensor<TargetInfo>(node.input(2));
+    typename TargetInfo::TensorType *mean    = get_backing_tensor<TargetInfo>(node.input(3));
+    typename TargetInfo::TensorType *var     = get_backing_tensor<TargetInfo>(node.input(4));
+    typename TargetInfo::TensorType *beta    = get_backing_tensor<TargetInfo>(node.input(5));
+    typename TargetInfo::TensorType *gamma   = get_backing_tensor<TargetInfo>(node.input(6));
+
+    typename TargetInfo::TensorType *output = get_backing_tensor<TargetInfo>(node.output(0));
+
+    const PadStrideInfo       conv_info        = node.convolution_info();
+    const unsigned int        depth_multiplier = node.depth_multiplier();
+    const ActivationLayerInfo fused_act        = node.fused_activation();
+    const float               epsilon          = node.epsilon();
+
+    // Create and configure function
+    auto func = support::cpp14::make_unique<FusedDepthwiseConvolutionBatchNormalizationFunction<TargetInfo, FusedLayerTypes>>();
+    func->configure(input, weights, biases, output, mean, var, beta, gamma, epsilon, conv_info, depth_multiplier, fused_act);
+
+    // Log info
+    ARM_COMPUTE_LOG_GRAPH_INFO("Instantiated "
+                               << node.name()
+                               << " Type: " << node.type()
                                << " Target: " << TargetInfo::TargetType
                                << " Data Type: " << input->info()->data_type()
                                << " Input shape: " << input->info()->tensor_shape()
diff --git a/arm_compute/graph/backends/FusedConvolutionBatchNormalizationFunction.h b/arm_compute/graph/backends/FusedConvolutionBatchNormalizationFunction.h
index 92af17b..a6da76b 100644
--- a/arm_compute/graph/backends/FusedConvolutionBatchNormalizationFunction.h
+++ b/arm_compute/graph/backends/FusedConvolutionBatchNormalizationFunction.h
@@ -54,7 +54,7 @@
      *                        Data types supported: QASYMM8/F16/F32.
      * @param[in]  weights    Weights tensor. Weights are 4D tensor with dimensions [kernel_x, kernel_y, IFM, OFM]. Data type supported: Same as @p input.
      * @param[in]  bias       Biases tensor. Shared biases supported. Biases are 1D tensor with dimensions [OFM].
-     *                        Data type supported: Should match @p input data type, except for input of QASYMM8 type where biases should be of S32 type.
+     *                        Data type supported: Should match @p input data type.
      * @param[out] output     Destination tensor. 3 lower dimensions represent a single output [width, height, OFM], while the rest represent batch of outputs.
      *                        Data types supported: Same as @p input.
      * @param[in]  mean       Mean values tensor. 1 dimension with size equal to the feature maps [FM]. Data types supported: Same as @p input
diff --git a/arm_compute/graph/backends/FusedDepthwiseConvolutionBatchNormalizationFunction.h b/arm_compute/graph/backends/FusedDepthwiseConvolutionBatchNormalizationFunction.h
new file mode 100644
index 0000000..6f70d3c
--- /dev/null
+++ b/arm_compute/graph/backends/FusedDepthwiseConvolutionBatchNormalizationFunction.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2019 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef __ARM_COMPUTE_GRAPH_BACKENDS_FUSED_DEPTHWISE_CONVOLUTION_BATCH_NORMALIZATION_FUNCTION_H__
+#define __ARM_COMPUTE_GRAPH_BACKENDS_FUSED_DEPTHWISE_CONVOLUTION_BATCH_NORMALIZATION_FUNCTION_H__
+
+#include "arm_compute/core/Types.h"
+#include "arm_compute/runtime/IFunction.h"
+
+namespace arm_compute
+{
+namespace graph
+{
+namespace backends
+{
+/** Wrapper function to first apply {NE, CL}BatchNormalizationLayer on the weights and then run {NE, CL}DepthwiseConvolutionLayer with the modified weights */
+template <typename TargetInfo, typename FusedLayerTypes>
+class FusedDepthwiseConvolutionBatchNormalizationFunction : public IFunction
+{
+public:
+    using TensorType         = typename TargetInfo::TensorType;
+    using TensorConcreteType = typename TargetInfo::TensorConcreteType;
+
+    FusedDepthwiseConvolutionBatchNormalizationFunction()
+        : _depth_conv_layer(), _fused_batch_norm_layer(), _fused_bias(), _is_prepared(false)
+    {
+    }
+
+    /** Set the input and output tensors.
+     *
+     * @param[in]  input            Source tensor. 3 lower dimensions represent a single input [width, height, IFM],
+     *                              while every optional dimension from 4 and above represent a batch of inputs.
+     *                              Data types supported: F16/F32.
+     * @param[in]  weights          Weights tensor.  These are 3D tensors with shape [kernel_x, kernel_y, IFM]. Data type supported: Same as @p input.
+     * @param[in]  bias             Biases tensor. Shared biases supported. Biases are 1D tensor with dimensions [IFM].
+     *                              Data type supported: Should match @p input data type.
+     * @param[out] output           Destination tensor. 3 lower dimensions represent a single output [width, height, OFM], while the rest represent batch of outputs.
+     *                              Data types supported: Same as @p input.
+     * @param[in]  mean             Mean values tensor. 1 dimension with size equal to the feature maps [FM]. Data types supported: Same as @p input
+     * @param[in]  var              Variance values tensor. 1 dimension with size equal to the feature maps [FM]. Data types supported: Same as @p input
+     * @param[in]  beta             Beta values tensor info. 1 dimension with size equal to the feature maps [FM]. If not provided, default value for beta is 0. Data types supported: Same as @p input
+     * @param[in]  gamma            Gamma values tensor info. 1 dimension with size equal to the feature maps [FM]. If not provided, default value for gamma is 1. Data types supported: Same as @p input
+     * @param[in]  epsilon          Small value to avoid division with zero. Default value is 0.001f.
+     * @param[in]  conv_info        Contains padding and stride information described in @ref PadStrideInfo.
+     * @param[in]  depth_multiplier Multiplier to apply to the input's depth in order to retrieve the output's depth. Defaults to 1.
+     * @param[in]  fused_act        Activation layer information in case of a fused activation.
+     *
+     */
+    void configure(TensorType       *input,
+                   TensorType       *weights,
+                   TensorType       *bias,
+                   TensorType       *output,
+                   const TensorType *mean,
+                   const TensorType *var,
+                   const TensorType *beta,
+                   const TensorType *gamma,
+                   float epsilon, const PadStrideInfo &conv_info, unsigned int depth_multiplier, ActivationLayerInfo const &fused_act)
+    {
+        // We don't run any validate, as we assume that the layers have been already validated
+        const bool        has_bias = (bias != nullptr);
+        const TensorType *bias_to_use;
+
+        // We check if the layer has a bias. If yes, use it in-place. If not, we need to create one
+        // as batch normalization might end up with a bias != 0
+        if(has_bias)
+        {
+            _fused_batch_norm_layer.configure(weights, mean, var, nullptr, nullptr, bias, beta, gamma, epsilon, FuseBatchNormalizationType::DEPTHWISECONVOLUTION);
+            bias_to_use = bias;
+        }
+        else
+        {
+            _fused_batch_norm_layer.configure(weights, mean, var, nullptr, &_fused_bias, nullptr, beta, gamma, epsilon, FuseBatchNormalizationType::DEPTHWISECONVOLUTION);
+            bias_to_use = &_fused_bias;
+        }
+
+        _depth_conv_layer.configure(input, weights, bias_to_use, output, conv_info, depth_multiplier, fused_act.enabled() ? fused_act : ActivationLayerInfo());
+
+        if(!has_bias)
+        {
+            _fused_bias.allocator()->allocate();
+        }
+    }
+
+    // Inherited methods overridden:
+    void run()
+    {
+        prepare();
+        _depth_conv_layer.run();
+    }
+
+    void prepare()
+    {
+        if(!_is_prepared)
+        {
+            _fused_batch_norm_layer.run();
+            _is_prepared = true;
+        }
+    }
+
+private:
+    typename FusedLayerTypes::DepthwiseConvolutionLayer _depth_conv_layer;
+    typename FusedLayerTypes::FuseBatchNormalization    _fused_batch_norm_layer;
+    TensorConcreteType                                  _fused_bias;
+    bool                                                _is_prepared;
+};
+} // namespace backends
+} // namespace graph
+} // namespace arm_compute
+
+#endif /* __ARM_COMPUTE_GRAPH_BACKENDS_FUSED_DEPTHWISE_CONVOLUTION_BATCH_NORMALIZATION_FUNCTION_H__ */
diff --git a/arm_compute/graph/nodes/FusedConvolutionBatchNormalizationNode.h b/arm_compute/graph/nodes/FusedConvolutionBatchNormalizationNode.h
index 9b0f5b7..c124c982 100644
--- a/arm_compute/graph/nodes/FusedConvolutionBatchNormalizationNode.h
+++ b/arm_compute/graph/nodes/FusedConvolutionBatchNormalizationNode.h
@@ -41,14 +41,13 @@
      * @param[in] num_groups       (Optional) Number of groups (Defaults to 1)
      * @param[in] method           (Optional) Convolution method to use
      * @param[in] fast_math_hint   (Optional) Fast math hint
-     * @param[in] out_quant_info   (Optional) Output quantization info
      * @param[in] fused_activation (Optional) Fused activation layer. Disabled if not specified
      */
     FusedConvolutionBatchNormalizationNode(float epsilon, PadStrideInfo info,
                                            unsigned int      num_groups     = 1,
                                            ConvolutionMethod method         = ConvolutionMethod::Default,
                                            FastMathHint      fast_math_hint = FastMathHint::Disabled,
-                                           QuantizationInfo out_quant_info = QuantizationInfo(), ActivationLayerInfo fused_activation = ActivationLayerInfo());
+                                           ActivationLayerInfo fused_activation = ActivationLayerInfo());
 
     /** Epsilon parameter accessor
      *
@@ -135,7 +134,6 @@
     unsigned int        _num_groups;
     ConvolutionMethod   _method;
     FastMathHint        _fast_math_hint;
-    QuantizationInfo    _out_quant_info;
     ActivationLayerInfo _fused_activation;
 };
 
diff --git a/arm_compute/graph/nodes/FusedDepthwiseConvolutionBatchNormalizationNode.h b/arm_compute/graph/nodes/FusedDepthwiseConvolutionBatchNormalizationNode.h
new file mode 100644
index 0000000..a2241ef
--- /dev/null
+++ b/arm_compute/graph/nodes/FusedDepthwiseConvolutionBatchNormalizationNode.h
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2019 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_GRAPH_FUSED_DEPTHWISE_CONVOLUTION_BATCH_NORMALIZATION_NODE_H__
+#define __ARM_COMPUTE_GRAPH_FUSED_DEPTHWISE_CONVOLUTION_BATCH_NORMALIZATION_NODE_H__
+
+#include "arm_compute/graph/INode.h"
+
+namespace arm_compute
+{
+namespace graph
+{
+/** Fused Depthwise Convolution Batch Normalization node */
+class FusedDepthwiseConvolutionBatchNormalizationNode final : public INode
+{
+public:
+    /** Constructor
+     *
+     * @param[in] epsilon          Epsilon parameter.
+     * @param[in] info             Convolution layer attributes.
+     * @param[in] depth_multiplier (Optional) Multiplier to apply to the input's depth in order to retrieve the output's depth. Defaults to 1.
+     * @param[in] method           (Optional) Convolution method to use
+     * @param[in] fused_activation (Optional) Fused activation layer. Disabled if not specified
+     */
+    FusedDepthwiseConvolutionBatchNormalizationNode(float                      epsilon,
+                                                    PadStrideInfo              info,
+                                                    unsigned int               depth_multiplier,
+                                                    DepthwiseConvolutionMethod method,
+                                                    ActivationLayerInfo        fused_activation = ActivationLayerInfo());
+
+    /** Sets the depthwise convolution layer method to use
+     *
+     * @param[in] method Method to use for depthwise convolution
+     */
+    void set_depthwise_convolution_method(DepthwiseConvolutionMethod method);
+
+    /** Depthwise convolution layer method accessor
+     *
+     * @note This is an indication on which depthwise convolution layer implementation to use,
+     *       if it fails to be created the library's heuristic approach will be used
+     *
+     * @return Depthwise convolution layer method to be used by the node
+     */
+    DepthwiseConvolutionMethod depthwise_convolution_method() const;
+
+    /** Epsilon parameter accessor
+     *
+     * @return Epsilon parameter
+     */
+    float epsilon() const;
+
+    /** Returns fused activation
+     *
+     * @return Fused activation
+     */
+    ActivationLayerInfo fused_activation() const;
+
+    /** Sets fused activation
+     *
+     * @param[in] fused_activation Fused activation to set
+     */
+    void set_fused_activation(ActivationLayerInfo fused_activation);
+
+    /** Computes convolution output descriptor
+     *
+     * @param[in] input_descriptor   Input descriptor
+     * @param[in] weights_descriptor Weights descriptor
+     * @param[in] info               Convolution operation attributes
+     * @param[in] depth_multiplier   Depth multiplier
+     *
+     * @return Output descriptor
+     */
+    static TensorDescriptor compute_output_descriptor(const TensorDescriptor &input_descriptor,
+                                                      const TensorDescriptor &weights_descriptor,
+                                                      const PadStrideInfo    &info,
+                                                      int                     depth_multiplier);
+
+    /** Sets the convolution layer method to use
+     *
+     * @param[in] method Method to use for convolution
+     */
+    void set_convolution_method(ConvolutionMethod method);
+
+    /** Depth multiplier accessor
+     *
+     * @return Depth multiplier
+     */
+    unsigned int depth_multiplier() const;
+
+    /** Convolution metadata accessor
+     *
+     * @return Convolution information
+     */
+    PadStrideInfo convolution_info() const;
+
+    // Inherited overridden methods:
+    NodeType         type() const override;
+    bool             forward_descriptors() override;
+    TensorDescriptor configure_output(size_t idx) const override;
+    void accept(INodeVisitor &v) override;
+
+public:
+    static constexpr NodeType node_type = NodeType::FusedDepthwiseConvolutionBatchNormalizationLayer;
+
+private:
+    float _epsilon;
+
+    PadStrideInfo              _info;
+    unsigned int               _depth_multiplier;
+    DepthwiseConvolutionMethod _method;
+    ActivationLayerInfo        _fused_activation;
+};
+
+} // namespace graph
+} // namespace arm_compute
+#endif /* __ARM_COMPUTE_GRAPH_FUSED_DEPTHWISE_CONVOLUTION_BATCH_NORMALIZATION_NODE_H__ */
diff --git a/arm_compute/graph/nodes/Nodes.h b/arm_compute/graph/nodes/Nodes.h
index c891bc2..52e2f88 100644
--- a/arm_compute/graph/nodes/Nodes.h
+++ b/arm_compute/graph/nodes/Nodes.h
@@ -39,6 +39,7 @@
 #include "arm_compute/graph/nodes/FlattenLayerNode.h"
 #include "arm_compute/graph/nodes/FullyConnectedLayerNode.h"
 #include "arm_compute/graph/nodes/FusedConvolutionBatchNormalizationNode.h"
+#include "arm_compute/graph/nodes/FusedDepthwiseConvolutionBatchNormalizationNode.h"
 #include "arm_compute/graph/nodes/GenerateProposalsLayerNode.h"
 #include "arm_compute/graph/nodes/InputNode.h"
 #include "arm_compute/graph/nodes/NormalizationLayerNode.h"
diff --git a/arm_compute/graph/nodes/NodesFwd.h b/arm_compute/graph/nodes/NodesFwd.h
index 0f3450b..2c89679 100644
--- a/arm_compute/graph/nodes/NodesFwd.h
+++ b/arm_compute/graph/nodes/NodesFwd.h
@@ -45,6 +45,7 @@
 class FlattenLayerNode;
 class FullyConnectedLayerNode;
 class FusedConvolutionBatchNormalizationNode;
+class FusedDepthwiseConvolutionBatchNormalizationNode;
 class GenerateProposalsLayerNode;
 class InputNode;
 class NormalizationLayerNode;
diff --git a/arm_compute/graph/printers/DotGraphPrinter.h b/arm_compute/graph/printers/DotGraphPrinter.h
index 9d2ea46..c28a17b 100644
--- a/arm_compute/graph/printers/DotGraphPrinter.h
+++ b/arm_compute/graph/printers/DotGraphPrinter.h
@@ -57,6 +57,7 @@
     void visit(DepthwiseConvolutionLayerNode &n) override;
     void visit(EltwiseLayerNode &n) override;
     void visit(FusedConvolutionBatchNormalizationNode &n) override;
+    void visit(FusedDepthwiseConvolutionBatchNormalizationNode &n) override;
     void visit(NormalizationLayerNode &n) override;
     void visit(PoolingLayerNode &n) override;
     void default_visit() override;
