diff --git a/src/core/GLES_COMPUTE/GCKernelLibrary.cpp b/src/core/GLES_COMPUTE/GCKernelLibrary.cpp
index 549c869..dd040e3 100644
--- a/src/core/GLES_COMPUTE/GCKernelLibrary.cpp
+++ b/src/core/GLES_COMPUTE/GCKernelLibrary.cpp
@@ -221,6 +221,7 @@
     { "concatenate_depth", "concatenate.cs" },
     { "dropout", "dropout.cs" },
     { "normalize_planar_yuv_layer", "normalize_planar_yuv_layer.cs" },
+    { "scale_nearest_neighbour", "scale.cs" },
 };
 
 const std::map<std::string, std::string> GCKernelLibrary::_program_source_map =
@@ -294,6 +295,10 @@
         "normalize_planar_yuv_layer.cs",
 #include "./cs_shaders/normalize_planar_yuv_layer.csembed"
     },
+    {
+        "scale.cs",
+#include "./cs_shaders/scale.csembed"
+    },
 #endif /* EMBEDDED_KERNELS */
 };
 
diff --git a/src/core/GLES_COMPUTE/cs_shaders/scale.cs b/src/core/GLES_COMPUTE/cs_shaders/scale.cs
new file mode 100644
index 0000000..08233ab
--- /dev/null
+++ b/src/core/GLES_COMPUTE/cs_shaders/scale.cs
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2016, 2017 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.
+ */
+
+layout(local_size_x = LOCAL_SIZE_X, local_size_y = LOCAL_SIZE_Y, local_size_z = LOCAL_SIZE_Z) in;
+
+#include "helpers_cs.h"
+
+/** Performs an affine transformation on an image interpolating with the NEAREAST NEIGHBOUR method. Input and output are single channel FP16.
+ *
+ * @param[in]  src_ptr      Pointer to the source tensor. Supported data types: FP16.
+ * @param[in]  src_attrs    The attributes of the source tensor
+ * @param[out] dst_ptr      Pointer to the destination tensor. Supported data types: FP16. (Must be the same as the input)
+ * @param[in]  dst_attrs    The attributes of the destination tensor
+ * @param[in]  input_width  Input image width
+ * @param[in]  input_height Input image height
+ * @param[in]  scale_x      The scale factor along x dimension
+ * @param[in]  scale_y      The scale factor along y dimension
+ */
+SHADER_PARAMS_DECLARATION
+{
+    ImageAttributes src_attrs;
+    ImageAttributes dst_attrs;
+    float           input_width;
+    float           input_height;
+    float           scale_x;
+    float           scale_y;
+};
+
+#if defined(DATA_TYPE_FP16)
+#if defined(SCALE_NEAREST_GENERIC)
+TENSOR_DECLARATION(1, srcBuffer, uint, src_ptr, src_shift, 2, readonly);
+TENSOR_DECLARATION(2, dstBuffer, uvec2, dst_ptr, dst_shift, 3, writeonly);
+
+vec4[2] transform_nearest(vec2 coord, vec2 scale)
+{
+    vec4 in_x_coords = vec4(coord.x, 1.f + coord.x, 2.f + coord.x, 3.f + coord.x);
+
+    vec4[2] t;
+    t[0] = (in_x_coords + (vec4(0.5f))) * scale.x;
+    t[1] = vec4((coord.y + 0.5f) * scale.y);
+
+    return t;
+}
+
+vec4[2] clamp_to_border_with_size(vec4[2] coords, float width, float height, float border_size)
+{
+    vec4[2] c;
+    c[0] = clamp(coords[0], 0.0f - border_size, width - 1.f + border_size);
+    c[1] = clamp(coords[1], 0.0f - border_size, height - 1.f + border_size);
+
+    return c;
+}
+
+void main()
+{
+    ImageIterator src_iter = CONVERT_TO_IMAGE_ITERATOR_NO_STEP(src_attrs, src_shift);
+    ImageIterator dst_iter = CONVERT_TO_IMAGE_ITERATOR(dst_attrs, dst_shift);
+
+    vec2 r     = vec2(scale_x, scale_y);
+    vec4[2] tc = clamp_to_border_with_size(transform_nearest(vec2(gl_GlobalInvocationID.x << uint(2), gl_GlobalInvocationID.y), r), input_width, input_height, float(BORDER_SIZE));
+
+    mediump vec2 s = vec2(0.0f);
+    mediump vec4 d = vec4(0.0f);
+
+    for(int i = 0; i < 4; i++)
+    {
+        uint offset = image_offset_in_bytes(src_iter, int(tc[0][i]), int(tc[1][i]));
+
+        s = LOAD_UNPACK2_HALF(src_ptr, uint(offset >> src_shift));
+
+        if(offset % uint(4) == uint(0))
+        {
+            d[i] = s.x;
+        }
+        else
+        {
+            d[i] = s.y;
+        }
+    }
+
+    STORE_PACK4_CURRENT_ITEM_HALF(dst_ptr, dst_iter, d);
+}
+#elif defined(SCALE_NEAREST_8X) /* SCALE_NEAREST_GENERIC */
+TENSOR_DECLARATION(1, srcBuffer, uvec2, src_ptr, src_shift, 3, readonly);
+TENSOR_DECLARATION(2, dstBuffer, uvec4, dst_ptr, dst_shift, 4, writeonly);
+
+void main()
+{
+    ImageIterator src_iter = CONVERT_TO_IMAGE_ITERATOR_NO_STEP(src_attrs, src_shift);
+    ImageIterator dst_iter = CONVERT_TO_IMAGE_ITERATOR(dst_attrs, dst_shift);
+
+    uvec2 tc = uvec2(gl_GlobalInvocationID.x << uint(2), gl_GlobalInvocationID.y >> uint(1));
+
+    mediump vec4 s = vec4(0.0f);
+    mediump      vec4[2] d;
+
+    uint offset = image_offset_in_bytes(src_iter, int(tc[0]), int(tc[1]));
+    s           = LOAD_UNPACK4_HALF(src_ptr, uint(offset >> src_shift));
+
+    d[0] = vec4(s.x, s.x, s.y, s.y);
+    d[1] = vec4(s.z, s.z, s.w, s.w);
+
+    STORE_PACK8_CURRENT_ITEM_HALF(dst_ptr, dst_iter, d);
+}
+#endif                          /* SCALE_NEAREST_GENERIC */
+
+#else /* DATA_TYPE_FP16 */
+#error Data type not supported
+#endif /* DATA_TYPE_FP16 */
diff --git a/src/core/GLES_COMPUTE/kernels/GCScaleKernel.cpp b/src/core/GLES_COMPUTE/kernels/GCScaleKernel.cpp
new file mode 100644
index 0000000..7461c54
--- /dev/null
+++ b/src/core/GLES_COMPUTE/kernels/GCScaleKernel.cpp
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2016, 2017 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.
+ */
+#include "arm_compute/core/GLES_COMPUTE/kernels/GCScaleKernel.h"
+
+#include "arm_compute/core/AccessWindowStatic.h"
+#include "arm_compute/core/Error.h"
+#include "arm_compute/core/GLES_COMPUTE/GCHelpers.h"
+#include "arm_compute/core/GLES_COMPUTE/GCKernelLibrary.h"
+#include "arm_compute/core/GLES_COMPUTE/IGCKernel.h"
+#include "arm_compute/core/GLES_COMPUTE/IGCTensor.h"
+#include "arm_compute/core/GLES_COMPUTE/OpenGLES.h"
+#include "arm_compute/core/Helpers.h"
+#include "arm_compute/core/TensorInfo.h"
+#include "arm_compute/core/Validate.h"
+
+#include <set>
+#include <string>
+
+using namespace arm_compute;
+
+BorderSize GCScaleKernel::border_size() const
+{
+    return BorderSize(1);
+}
+
+void GCScaleKernel::configure(const IGCTensor *input, IGCTensor *output, InterpolationPolicy policy, bool border_undefined, SamplingPolicy sampling_policy)
+{
+    ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(input, 1, DataType::F16);
+    ARM_COMPUTE_ERROR_ON_NULLPTR(output);
+    ARM_COMPUTE_ERROR_ON_MISMATCHING_DATA_TYPES(input, output);
+    ARM_COMPUTE_ERROR_ON(output == input);
+    ARM_COMPUTE_ERROR_ON(policy != InterpolationPolicy::NEAREST_NEIGHBOR);
+    ARM_COMPUTE_UNUSED(sampling_policy);
+
+    _input  = input;
+    _output = output;
+
+    // Compute the ratio between source width/height and destination width/height
+    const auto wr = static_cast<float>(input->info()->dimension(0)) / static_cast<float>(output->info()->dimension(0));
+    const auto hr = static_cast<float>(input->info()->dimension(1)) / static_cast<float>(output->info()->dimension(1));
+
+    // Compute actual border size
+    BorderSize border = border_undefined ? BorderSize(0) : border_size();
+
+    // Area interpolation behaves as Nearest Neighbour in case of up-sampling
+    if(policy == InterpolationPolicy::AREA && wr <= 1.f && hr <= 1.f)
+    {
+        policy = InterpolationPolicy::NEAREST_NEIGHBOR;
+    }
+    else
+    {
+        ARM_COMPUTE_ERROR_ON(policy == InterpolationPolicy::AREA);
+    }
+
+    // Create kernel
+    std::set<std::string> build_opts;
+    build_opts.emplace("#define LOCAL_SIZE_X " + support::cpp11::to_string(1));
+    build_opts.emplace("#define LOCAL_SIZE_Y " + support::cpp11::to_string(1));
+    build_opts.emplace("#define LOCAL_SIZE_Z " + support::cpp11::to_string(1));
+
+    build_opts.emplace("#define DATA_TYPE_FP16");
+    build_opts.emplace("#define BORDER_SIZE " + support::cpp11::to_string(border.right));
+
+    // Configure kernel window
+    unsigned int num_elems_processed_per_iteration = 4;
+    unsigned int input_width_alignment             = 2;
+
+    // performance optimization for 2x upscaling with no border
+    if((fabs(wr - 0.5) < 1e-6) && (fabs(hr - 0.5) < 1e-6) && border_undefined)
+    {
+        num_elems_processed_per_iteration = 8;
+        input_width_alignment             = 4;
+        build_opts.emplace("#define SCALE_NEAREST_8X");
+    }
+    else
+    {
+        build_opts.emplace("#define SCALE_NEAREST_GENERIC");
+    }
+
+    std::string interpolation_name = string_from_interpolation_policy(policy); // NOLINT
+    std::transform(interpolation_name.begin(), interpolation_name.end(), interpolation_name.begin(), ::tolower);
+    std::string kernel_name = "scale_" + interpolation_name;
+    _kernel                 = GCKernelLibrary::get().create_kernel(kernel_name, build_opts);
+
+    Window win = calculate_max_window(*output->info(), Steps(num_elems_processed_per_iteration));
+
+    const ValidRegion &input_valid_region = input->info()->valid_region();
+
+    const int total_width   = border.left + input_valid_region.anchor[0] + input_valid_region.shape[0] + border.right;
+    const int padding_right = ceil_to_multiple(total_width, input_width_alignment) - border.left - input_valid_region.anchor[0] - input_valid_region.shape[0];
+
+    // Reads can occur within the valid region of the input
+    AccessWindowStatic input_access(input->info(),
+                                    input_valid_region.anchor[0] - border.left, input_valid_region.anchor[1] - border.top,
+                                    input_valid_region.anchor[0] + input_valid_region.shape[0] + padding_right,
+                                    input_valid_region.anchor[1] + input_valid_region.shape[1] + border.bottom);
+
+    AccessWindowHorizontal output_access(output->info(), 0, num_elems_processed_per_iteration);
+
+    update_window_and_padding(win, input_access, output_access);
+
+    output_access.set_valid_region(win, calculate_valid_region_scale(*(input->info()),
+                                                                     output->info()->tensor_shape(),
+                                                                     policy,
+                                                                     border,
+                                                                     border_undefined));
+
+    IGCKernel::configure(win);
+
+    // Set static kernel arguments
+    const float scale_x = static_cast<float>(input->info()->dimension(0)) / output->info()->dimension(0);
+    const float scale_y = static_cast<float>(input->info()->dimension(1)) / output->info()->dimension(1);
+
+    unsigned int idx = 2 * num_arguments_per_2D_tensor(); //Skip the tensor parameters
+    _kernel.set_argument<float>(idx++, static_cast<float>(input->info()->dimension(0)));
+    _kernel.set_argument<float>(idx++, static_cast<float>(input->info()->dimension(1)));
+    _kernel.set_argument(idx++, scale_x);
+    _kernel.set_argument(idx++, scale_y);
+}
