diff --git a/arm_compute/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.h b/arm_compute/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.h
index 64f10b4..87ca4da 100644
--- a/arm_compute/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.h
+++ b/arm_compute/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018 ARM Limited.
+ * Copyright (c) 2017-2019 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -25,12 +25,10 @@
 #define __ARM_COMPUTE_NEDEPTHWISECONVOLUTIONKERNEL3x3_H__
 
 #include "arm_compute/core/NEON/INEKernel.h"
-#include "arm_compute/core/NEON/kernels/convolution/depthwise/depthwise.hpp"
-
-#include <memory>
 
 namespace arm_compute
 {
+// Forward declarations
 class ITensor;
 
 /** Interface for the kernel to run a 3x3 depthwise convolution on a tensor. */
@@ -60,23 +58,8 @@
      * @param[out] output           Destination tensor. Data type supported: Same as @p input.
      * @param[in]  conv_info        Padding and stride information to use for the convolution.
      * @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]  data_layout      (Optional) Data layout of the input and weights tensor
      */
-    void configure(const ITensor *input, const ITensor *weights, ITensor *output, const PadStrideInfo &conv_info, unsigned int depth_multiplier = 1, DataLayout data_layout = DataLayout::NCHW);
-    /** Static method that checks if optimized execution is supported for the given parameters
-     *
-     * @param[in] input_shape      Input shape
-     * @param[in] conv_info        Padding and stride information to use for the convolution.
-     * @param[in] dt               Data type of the input and weights
-     * @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] data_layout      (Optional) Data layout of the input and weights tensor
-     *
-     * @return True if the optimized kernels can be executed else false
-     */
-    static bool is_optimized_execution_possible(TensorShape input_shape, PadStrideInfo conv_info, DataType dt, unsigned int depth_multiplier = 1, DataLayout data_layout = DataLayout::NCHW);
-    /** Generates the convolver object */
-    void generate_convolver();
-
+    void configure(const ITensor *input, const ITensor *weights, ITensor *output, const PadStrideInfo &conv_info, unsigned int depth_multiplier = 1);
     /** Static function to check if given info will lead to a valid configuration of @ref NEDepthwiseConvolutionLayer3x3Kernel
      *
      * @note Supported data layouts: NCHW and NHWC
@@ -96,40 +79,13 @@
     BorderSize border_size() const override;
 
 private:
-    void configure_generic();
-    void configure_optimized();
-
-    void run_generic(const Window &window, const ThreadInfo &info);
-    void run_optimized(const Window &window, const ThreadInfo &info);
-    /** Creates an optimized backend convolver object
-     *
-     * @note Convolver of strides 1,2 and convolution size of 3 is currently supported
-     *
-     * @param[in] conv_info     Padding and stride information to use for the convolution
-     * @param[in] w             Weights tensor
-     * @param[in] in            Input tensor
-     * @param[in] out           Output tensor
-     * @param[in] setup_strides (Optional) Boolean to enable setting the strides of the tensors
-     *                           in the convolver in case of padding. Defaults to false
-     *
-     * @return  A convolver object or nullptr if the configuration is not supported
-     */
-    std::unique_ptr<depthwise::IDepthwiseConvolution> create_convolver_object(PadStrideInfo  conv_info,
-                                                                              const ITensor *w,
-                                                                              const ITensor *in,
-                                                                              ITensor       *out,
-                                                                              bool           setup_strides = false);
-
-private:
-    BorderSize                                        _border_size;
-    const ITensor                                    *_input;
-    ITensor                                          *_output;
-    const ITensor                                    *_weights;
-    PadStrideInfo                                     _conv_info;
-    std::unique_ptr<depthwise::IDepthwiseConvolution> _convolver;
-    unsigned int                                      _num_elems_written_per_iteration;
-    bool                                              _run_optimized;
-    unsigned int                                      _depth_multiplier;
+    BorderSize     _border_size;
+    const ITensor *_input;
+    ITensor       *_output;
+    const ITensor *_weights;
+    PadStrideInfo  _conv_info;
+    unsigned int   _num_elems_written_per_iteration;
+    unsigned int   _depth_multiplier;
 };
 } // namespace arm_compute
 #endif /* __ARM_COMPUTE_NEDEPTHWISECONVOLUTIONKERNEL3x3_H__ */
