diff --git a/src/core/NEON/kernels/NEWinogradConvolutionLayerKernel.cpp b/src/core/NEON/kernels/NEWinogradConvolutionLayerKernel.cpp
index 672684d..cfd53d7 100644
--- a/src/core/NEON/kernels/NEWinogradConvolutionLayerKernel.cpp
+++ b/src/core/NEON/kernels/NEWinogradConvolutionLayerKernel.cpp
@@ -309,9 +309,9 @@
 // Weights transform
 
 template <typename T, int OutputTileRows, int OutputTileCols, int KernelRows, int KernelCols>
-unsigned int NEWinogradLayerTransformWeightsKernel<T, OutputTileRows, OutputTileCols, KernelRows, KernelCols>::get_weight_storage_size(int n_output_channels, int n_input_channels) const
+unsigned int NEWinogradLayerTransformWeightsKernel<T, OutputTileRows, OutputTileCols, KernelRows, KernelCols>::get_weight_storage_size(int num_output_channels, int num_input_channels) const
 {
-    const KernelShape shape(n_output_channels, KernelRows, KernelCols, n_input_channels);
+    const KernelShape shape(num_output_channels, KernelRows, KernelCols, num_input_channels);
     return static_cast<unsigned int>(
                // WinogradConv returns the size in bytes, we divide by `sizeof(T)` to express that in units of T
                WinogradConv::get_kernel_storage_size(shape) / sizeof(T));
@@ -319,7 +319,8 @@
 
 template <typename T, int OutputTileRows, int OutputTileCols, int KernelRows, int KernelCols>
 NEWinogradLayerTransformWeightsKernel<T, OutputTileRows, OutputTileCols, KernelRows, KernelCols>::NEWinogradLayerTransformWeightsKernel()
-    : _transform()
+    : _weights_hwio(nullptr), _output(nullptr), _matrix_stride(0), _num_output_channels(0), _num_input_channels(0)
+
 {
 }
 
@@ -333,15 +334,20 @@
 void NEWinogradLayerTransformWeightsKernel<T, OutputTileRows, OutputTileCols, KernelRows, KernelCols>::configure(
     const ITensor *weights_hwio,
     T *const       output,
-    const int      matrix_stride,     /** Stride across matrices in the output. */
-    const int      n_output_channels, /** Number of filters. */
-    const int      n_input_channels)  /** Number of channels in each filter. */
+    const int      matrix_stride,       /** Stride across matrices in the output. */
+    const int      num_output_channels, /** Number of filters. */
+    const int      num_input_channels)  /** Number of channels in each filter. */
 {
-    const int matrix_row_stride = roundup(n_output_channels, WinogradConv::N_BLOCK);
-    _transform                  = support::cpp14::make_unique<WeightsTransform>(reinterpret_cast<T *>(weights_hwio->buffer()), output, matrix_stride, matrix_row_stride, n_output_channels,
-                                                                                n_input_channels);
-    Window win;
-    auto   win_last = _transform->get_window();
+    _weights_hwio        = weights_hwio;
+    _output              = output;
+    _matrix_stride       = matrix_stride;
+    _num_output_channels = num_output_channels;
+    _num_input_channels  = num_input_channels;
+
+    const int        matrix_row_stride = roundup(num_output_channels, WinogradConv::N_BLOCK);
+    WeightsTransform transform(nullptr, output, matrix_stride, matrix_row_stride, num_output_channels, num_input_channels);
+    Window           win;
+    auto             win_last = transform.get_window();
     win.set(Window::DimX, Window::Dimension(0, win_last, 1));
     INEKernel::configure(win);
 }
@@ -351,9 +357,12 @@
 {
     ARM_COMPUTE_UNUSED(info);
     ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this);
-    const size_t fst = window.x().start();
-    const size_t lst = window.x().end();
-    _transform->run(fst, lst);
+
+    const int        matrix_row_stride = roundup(_num_output_channels, WinogradConv::N_BLOCK);
+    WeightsTransform transform(reinterpret_cast<T *>(_weights_hwio->buffer()), _output, _matrix_stride, matrix_row_stride, _num_output_channels, _num_input_channels);
+    const size_t     fst = window.x().start();
+    const size_t     lst = window.x().end();
+    transform.run(fst, lst);
 }
 
 template <typename T, int OutputTileRows, int OutputTileCols, int KernelRows, int KernelCols>
@@ -379,16 +388,16 @@
 
 template <typename T, int OutputTileRows, int OutputTileCols, int KernelRows, int KernelCols>
 unsigned int NEWinogradLayerTransformInputKernel<T, OutputTileRows, OutputTileCols, KernelRows, KernelCols>::get_input_storage_size(
-    int  n_batches,   /** Number of batches in the input tensor. */
-    int  n_channels,  /** Number of feature maps in the input tensor. */
-    int  n_rows,      /** Number of rows in each feature map. */
-    int  n_cols,      /** Number of columns in each feature map. */
-    bool same_padding /** Use "SAME" padding, otherwise use "VALID". */
+    int  num_batches,  /* Number of batches in the input tensor. */
+    int  num_channels, /* Number of feature maps in the input tensor. */
+    int  num_rows,     /* Number of rows in each feature map. */
+    int  num_cols,     /* Number of columns in each feature map. */
+    bool same_padding  /* Use "SAME" padding, otherwise use "VALID". */
 ) const
 {
     // Construct shapes for the input and kernel tensors.
-    const Tensor4DShape input_shape(n_batches, n_rows, n_cols, n_channels);
-    const KernelShape   kern_shape(1, KernelRows, KernelCols, n_channels);
+    const Tensor4DShape input_shape(num_batches, num_rows, num_cols, num_channels);
+    const KernelShape   kern_shape(1, KernelRows, KernelCols, num_channels);
     const PaddingType   padding = (same_padding) ? PADDING_SAME : PADDING_VALID;
     // Return the size, converted into units of TIn
     return static_cast<unsigned int>(WinogradConv::get_input_storage_size(kern_shape, input_shape, padding) / sizeof(T));
@@ -403,25 +412,32 @@
 
 template <typename T, int OutputTileRows, int OutputTileCols, int KernelRows, int KernelCols>
 NEWinogradLayerTransformInputKernel<T, OutputTileRows, OutputTileCols, KernelRows, KernelCols>::NEWinogradLayerTransformInputKernel()
-    : _transform()
+    : _input_nhwc(), _num_batches(0), _num_rows(0), _num_cols(0), _num_channels(0), _padding(), _output(nullptr), _matrix_stride(0)
 {
 }
 
 template <typename T, int OutputTileRows, int OutputTileCols, int KernelRows, int KernelCols>
 void NEWinogradLayerTransformInputKernel<T, OutputTileRows, OutputTileCols, KernelRows, KernelCols>::configure(
-    const T *const    input,         /** Input tensor data */
-    const int         n_batches,     /** Number of batches in input tensor. */
-    const int         n_rows,        /** Number of rows in input tensor. */
-    const int         n_cols,        /** Number of columns in input tensor. */
-    const int         n_channels,    /** Number of channels in input tensor. */
-    const PaddingType padding,       /** Padding type. */
-    T *const          output,        /** Base of output matrices. */
-    const int         matrix_stride) /** Stride between output matrices. */
+    const ITensor    *input_nhwc,
+    const int         num_batches,   /* Number of batches in input tensor. */
+    const int         num_rows,      /* Number of rows in input tensor. */
+    const int         num_cols,      /* Number of columns in input tensor. */
+    const int         num_channels,  /* Number of channels in input tensor. */
+    const PaddingType padding,       /* Padding type. */
+    T *const          output,        /* Base of output matrices. */
+    const int         matrix_stride) /* Stride between output matrices. */
 {
-    //  _input_matrix_row_stride(n_input_channels),
-    _transform = support::cpp14::make_unique<InputTransform>(input, n_batches, n_rows, n_cols, n_channels, padding, output, matrix_stride, n_channels);
-    Window win;
-    auto   win_last = _transform->get_window();
+    _input_nhwc    = input_nhwc;
+    _num_batches   = num_batches;
+    _num_rows      = num_rows;
+    _num_cols      = num_cols;
+    _num_channels  = num_channels;
+    _padding       = padding;
+    _output        = output;
+    _matrix_stride = matrix_stride;
+    InputTransform transform(nullptr, num_batches, num_rows, num_cols, num_channels, padding, output, matrix_stride, num_channels);
+    Window         win;
+    auto           win_last = transform.get_window();
     win.set(Window::DimX, Window::Dimension(0, win_last, 1));
     INEKernel::configure(win);
 }
@@ -431,9 +447,13 @@
 {
     ARM_COMPUTE_UNUSED(info);
     ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this);
+
+    InputTransform input_transform(reinterpret_cast<const T *>(_input_nhwc->buffer()), _num_batches, _num_rows, _num_cols, _num_channels, _padding, _output, _matrix_stride, _num_channels);
+
+    // The code below cannot be moved to configure because biases hasn't been allocated at that point
     const size_t fst = window.x().start();
     const size_t lst = window.x().end();
-    _transform->run(fst, lst);
+    input_transform.run(fst, lst);
 }
 
 template <typename T, int OutputTileRows, int OutputTileCols, int KernelRows, int KernelCols>
@@ -453,16 +473,16 @@
 
 template <typename T, int OutputTileRows, int OutputTileCols, int KernelRows, int KernelCols>
 unsigned int NEWinogradLayerTransformOutputKernel<T, OutputTileRows, OutputTileCols, KernelRows, KernelCols>::get_output_storage_size(
-    int  n_batches,         /** Number of batches in the output tensor. */
-    int  n_rows,            /** Number of rows in each feature map of the input tensor. */
-    int  n_cols,            /** Number of columns in each feature map of the input tensor. */
-    int  n_output_channels, /** Number of feature maps in the output tensor. */
-    bool same_padding       /** Use "SAME" padding, otherwise use "VALID". */
+    int  num_batches,         /* Number of batches in the output tensor. */
+    int  num_rows,            /* Number of rows in each feature map of the input tensor. */
+    int  num_cols,            /* Number of columns in each feature map of the input tensor. */
+    int  num_output_channels, /* Number of feature maps in the output tensor. */
+    bool same_padding         /* Use "SAME" padding, otherwise use "VALID". */
 ) const
 {
     // Construct shapes for the input and kernel tensors.
-    const Tensor4DShape input_shape(n_batches, n_rows, n_cols, 1);
-    const KernelShape   kern_shape(n_output_channels, KernelRows, KernelCols, 1);
+    const Tensor4DShape input_shape(num_batches, num_rows, num_cols, 1);
+    const KernelShape   kern_shape(num_output_channels, KernelRows, KernelCols, 1);
     const PaddingType   padding = (same_padding) ? PADDING_SAME : PADDING_VALID;
 
     // Return the size, converted into units of TOut
@@ -472,7 +492,7 @@
 
 template <typename T, int OutputTileRows, int OutputTileCols, int KernelRows, int KernelCols>
 NEWinogradLayerTransformOutputKernel<T, OutputTileRows, OutputTileCols, KernelRows, KernelCols>::NEWinogradLayerTransformOutputKernel()
-    : _biases(nullptr), _output_workspace(nullptr), _matrix_stride(0), _matrix_row_stride(0), _output(nullptr), _n_batches(0), _n_rows(0), _n_cols(0), _n_channels(0)
+    : _biases(nullptr), _output_workspace(nullptr), _matrix_stride(0), _matrix_row_stride(0), _output_nhwc(nullptr), _num_batches(0), _num_rows(0), _num_cols(0), _num_channels(0)
 {
 }
 
@@ -494,24 +514,24 @@
     const ITensor *biases,
     const T *const output_workingspace,
     const int      matrix_stride,
-    T *const       output,
-    const int      n_batches,
-    const int      n_rows,
-    const int      n_cols,
-    const int      n_channels)
+    ITensor *const output_nhwc,
+    const int      num_batches,
+    const int      num_rows,
+    const int      num_cols,
+    const int      num_channels)
 {
     _biases            = biases;
     _output_workspace  = output_workingspace;
     _matrix_stride     = matrix_stride;
-    _matrix_row_stride = roundup(n_channels, WinogradConv::N_BLOCK);
-    _output            = output;
-    _n_batches         = n_batches;
-    _n_rows            = n_rows;
-    _n_cols            = n_cols;
-    _n_channels        = n_channels;
+    _matrix_row_stride = roundup(num_channels, WinogradConv::N_BLOCK);
+    _output_nhwc       = output_nhwc;
+    _num_batches       = num_batches;
+    _num_rows          = num_rows;
+    _num_cols          = num_cols;
+    _num_channels      = num_channels;
 
     // We don't have the biases buffer at this stage as it hasn't been allocated, we pass in nullptr OutputTransform is only used here to compute the window
-    OutputTransform output_transform(_output_workspace, _matrix_stride, _matrix_row_stride, nullptr, _output, _n_batches, _n_rows, _n_cols, _n_channels);
+    OutputTransform output_transform(_output_workspace, _matrix_stride, _matrix_row_stride, nullptr, nullptr, _num_batches, _num_rows, _num_cols, _num_channels);
     Window          win;
     auto            win_last = output_transform.get_window();
     win.set(Window::DimX, Window::Dimension(0, win_last, 1));
@@ -524,11 +544,11 @@
     ARM_COMPUTE_UNUSED(info);
     ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this);
     ARM_COMPUTE_ERROR_ON_NULLPTR(_output_workspace);
-    ARM_COMPUTE_ERROR_ON_NULLPTR(_output);
+    ARM_COMPUTE_ERROR_ON_NULLPTR(_output_nhwc);
 
     OutputTransform output_transform(_output_workspace, _matrix_stride, _matrix_row_stride,
-                                     (_biases ? reinterpret_cast<T *>(_biases->buffer()) : nullptr), _output,
-                                     _n_batches, _n_rows, _n_cols, _n_channels);
+                                     (_biases ? reinterpret_cast<T *>(_biases->buffer()) : nullptr), reinterpret_cast<T *>(_output_nhwc->buffer()),
+                                     _num_batches, _num_rows, _num_cols, _num_channels);
 
     // The code below cannot be moved to configure because biases hasn't been allocated at that point
     const size_t fst = window.x().start();
