diff --git a/src/ngraph/runtime/cpu/CMakeLists.txt b/src/ngraph/runtime/cpu/CMakeLists.txt
index 43e524cdc6b8a3a7e2b6f75b91ec326c2ed1bd32..fc55702ee59b9e122bfcab899c81c5628c9e4340 100644
--- a/src/ngraph/runtime/cpu/CMakeLists.txt
+++ b/src/ngraph/runtime/cpu/CMakeLists.txt
@@ -44,6 +44,7 @@ set(SRC
     builder/relu.cpp
     builder/pad.cpp
     builder/product.cpp
+    builder/reduce_function_window.cpp
     builder/reshape.cpp
     builder/reverse.cpp
     builder/reverse_sequence.cpp
diff --git a/src/ngraph/runtime/cpu/builder/reduce_function_window.cpp b/src/ngraph/runtime/cpu/builder/reduce_function_window.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..01fb977a530159cd8183dd72cb77140d36ee91e3
--- /dev/null
+++ b/src/ngraph/runtime/cpu/builder/reduce_function_window.cpp
@@ -0,0 +1,82 @@
+/*******************************************************************************
+* Copyright 2018 Intel Corporation
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*******************************************************************************/
+
+#include "ngraph/runtime/cpu/kernel/reduce_function_window.hpp"
+#include "ngraph/op/reduce_window.hpp"
+#include "ngraph/runtime/cpu/cpu_builder.hpp"
+#include "ngraph/runtime/cpu/cpu_external_function.hpp"
+#include "ngraph/runtime/tensor_view.hpp"
+
+using namespace std;
+using namespace ngraph;
+
+namespace ngraph
+{
+    namespace runtime
+    {
+        namespace cpu
+        {
+            template <>
+            void Builder::BUILDER_DECL(ngraph::op::ReduceWindow)
+            {
+                auto reduce_window = static_cast<const ngraph::op::ReduceWindow*>(node);
+                auto function = reduce_window->get_functions()[0];
+
+                auto& functors = external_function->get_functors();
+                auto& tensor_data = external_function->get_tensor_data();
+                auto& callees = external_function->get_callees();
+
+                if (!callees.count(function->get_name()))
+                {
+                    callees[function->get_name()] = make_shared<CPU_ExternalFunction>(function);
+                }
+                auto& reducer_external_function = callees[function->get_name()];
+
+                auto& arg0_tensor = tensor_data[args[0].get_name()];
+                auto& arg1_tensor = tensor_data[args[1].get_name()];
+                auto& out_tensor = tensor_data[out[0].get_name()];
+
+                auto arg0_shape = args[0].get_shape();
+                auto out_shape = out[0].get_shape();
+
+                auto window_shape = reduce_window->get_window_shape();
+                auto window_movement_strides = reduce_window->get_window_movement_strides();
+
+                std::function<decltype(runtime::cpu::kernel::reduce_function_window<float>)> kernel;
+
+                SELECT_KERNEL(kernel,
+                              args[0].get_element_type(),
+                              runtime::cpu::kernel::reduce_function_window);
+
+                auto functor =
+                    [&, kernel, arg0_shape, out_shape, window_shape, window_movement_strides](
+                        CPURuntimeContext* ctx) {
+                        kernel(arg0_tensor,
+                               arg1_tensor,
+                               out_tensor,
+                               arg0_shape,
+                               out_shape,
+                               window_shape,
+                               window_movement_strides,
+                               reducer_external_function);
+                    };
+                functors.emplace_back(functor);
+            }
+
+            REGISTER_OP_BUILDER(ReduceWindow);
+        }
+    }
+}
diff --git a/src/ngraph/runtime/cpu/kernel/reduce_function_window.hpp b/src/ngraph/runtime/cpu/kernel/reduce_function_window.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..aab6608a75febaf59cfe97c83559b1062946ba36
--- /dev/null
+++ b/src/ngraph/runtime/cpu/kernel/reduce_function_window.hpp
@@ -0,0 +1,77 @@
+/*******************************************************************************
+* Copyright 2018 Intel Corporation
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*******************************************************************************/
+
+#pragma once
+
+#include "ngraph/runtime/backend.hpp"
+#include "ngraph/runtime/cpu/cpu_external_function.hpp"
+
+#include "ngraph/runtime/reference/reduce_window.hpp"
+
+namespace ngraph
+{
+    namespace runtime
+    {
+        namespace cpu
+        {
+            namespace kernel
+            {
+                template <typename ElementType>
+                void reduce_function_window(
+                    void* input0,
+                    void* input1,
+                    void* output,
+                    const Shape& input_shape,
+                    const Shape& output_shape,
+                    const Shape& window_shape,
+                    const Strides& window_movement_strides,
+                    const std::shared_ptr<CPU_ExternalFunction>& external_function)
+                {
+                    auto backend = runtime::Backend::create("CPU");
+
+                    auto reducer = [&](ElementType a, ElementType b) {
+                        TensorViewPtrs inputs, outputs;
+
+                        ElementType p __attribute__((aligned(64))) = a;
+                        ElementType q __attribute__((aligned(64))) = b;
+                        ElementType r __attribute__((aligned(64)));
+
+                        inputs.emplace_back(backend->create_tensor(
+                            ngraph::element::from<ElementType>(), Shape{}, &p));
+                        inputs.emplace_back(backend->create_tensor(
+                            ngraph::element::from<ElementType>(), Shape{}, &q));
+                        outputs.emplace_back(backend->create_tensor(
+                            ngraph::element::from<ElementType>(), Shape{}, &r));
+
+                        auto call_frame = external_function->make_call_frame();
+                        call_frame->call(outputs, inputs);
+
+                        return r;
+                    };
+
+                    reference::reduce_window<ElementType>(static_cast<const ElementType*>(input0),
+                                                          static_cast<const ElementType*>(input1),
+                                                          static_cast<ElementType*>(output),
+                                                          input_shape,
+                                                          output_shape,
+                                                          reducer,
+                                                          window_shape,
+                                                          window_movement_strides);
+                }
+            }
+        }
+    }
+}