diff --git a/examples/cl_events.cpp b/examples/cl_events.cpp
index c9c3e5d..ec02fc3 100644
--- a/examples/cl_events.cpp
+++ b/examples/cl_events.cpp
@@ -33,78 +33,88 @@
 using namespace arm_compute;
 using namespace utils;
 
-void main_cl_events(int argc, char **argv)
+class CLEventsExample : public Example
 {
-    /** [OpenCL events] **/
-    PPMLoader     ppm;
-    CLImage       src, tmp_scale_median, tmp_median_gauss, dst;
-    constexpr int scale_factor = 2;
-
-    CLScheduler::get().default_init();
-
-    if(argc < 2)
+public:
+    void do_setup(int argc, char **argv) override
     {
-        // Print help
-        std::cout << "Usage: ./build/cl_events [input_image.ppm]\n\n";
-        std::cout << "No input_image provided, creating a dummy 640x480 image\n";
-        // Create an empty grayscale 640x480 image
-        src.allocator()->init(TensorInfo(640, 480, Format::U8));
+        /** [OpenCL events] **/
+        PPMLoader     ppm;
+        constexpr int scale_factor = 2;
+
+        CLScheduler::get().default_init();
+
+        if(argc < 2)
+        {
+            // Print help
+            std::cout << "Usage: ./build/cl_events [input_image.ppm]\n\n";
+            std::cout << "No input_image provided, creating a dummy 640x480 image\n";
+            // Create an empty grayscale 640x480 image
+            src.allocator()->init(TensorInfo(640, 480, Format::U8));
+        }
+        else
+        {
+            ppm.open(argv[1]);
+            ppm.init_image(src, Format::U8);
+        }
+
+        TensorInfo dst_info(src.info()->dimension(0) / scale_factor, src.info()->dimension(1) / scale_factor, Format::U8);
+
+        // Configure the temporary and destination images
+        dst.allocator()->init(dst_info);
+        tmp_scale_median.allocator()->init(dst_info);
+        tmp_median_gauss.allocator()->init(dst_info);
+
+        //Configure the functions:
+        scale.configure(&src, &tmp_scale_median, InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::REPLICATE);
+        median.configure(&tmp_scale_median, &tmp_median_gauss, BorderMode::REPLICATE);
+        gauss.configure(&tmp_median_gauss, &dst, BorderMode::REPLICATE);
+
+        // Allocate all the images
+        src.allocator()->allocate();
+        dst.allocator()->allocate();
+        tmp_scale_median.allocator()->allocate();
+        tmp_median_gauss.allocator()->allocate();
+
+        // Fill the input image with the content of the PPM image if a filename was provided:
+        if(ppm.is_open())
+        {
+            ppm.fill_image(src);
+            output_filename = std::string(argv[1]) + "_out.ppm";
+        }
+        /** [OpenCL events] **/
     }
-    else
+    void do_run() override
     {
-        ppm.open(argv[1]);
-        ppm.init_image(src, Format::U8);
+        // Enqueue and flush the scale OpenCL kernel:
+        scale.run();
+        // Create a synchronisation event between scale and median:
+        cl::Event scale_event = CLScheduler::get().enqueue_sync_event();
+        // Enqueue and flush the median OpenCL kernel:
+        median.run();
+        // Enqueue and flush the Gaussian OpenCL kernel:
+        gauss.run();
+
+        //Make sure all the OpenCL jobs are done executing:
+        scale_event.wait();        // Block until Scale is done executing (Median3x3 and Gaussian5x5 might still be running)
+        CLScheduler::get().sync(); // Block until Gaussian5x5 is done executing
+    }
+    void do_teardown() override
+    {
+        // Save the result to file:
+        if(!output_filename.empty())
+        {
+            save_to_ppm(dst, output_filename); // save_to_ppm maps and unmaps the image to store as PPM
+        }
     }
 
-    // Declare and configure the functions to create the following pipeline: scale -> median -> gauss
-    CLScale       scale;
-    CLMedian3x3   median;
-    CLGaussian5x5 gauss;
-
-    TensorInfo dst_info(src.info()->dimension(0) / scale_factor, src.info()->dimension(1) / scale_factor, Format::U8);
-
-    // Configure the temporary and destination images
-    dst.allocator()->init(dst_info);
-    tmp_scale_median.allocator()->init(dst_info);
-    tmp_median_gauss.allocator()->init(dst_info);
-
-    //Configure the functions:
-    scale.configure(&src, &tmp_scale_median, InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::REPLICATE);
-    median.configure(&tmp_scale_median, &tmp_median_gauss, BorderMode::REPLICATE);
-    gauss.configure(&tmp_median_gauss, &dst, BorderMode::REPLICATE);
-
-    // Allocate all the images
-    src.allocator()->allocate();
-    dst.allocator()->allocate();
-    tmp_scale_median.allocator()->allocate();
-    tmp_median_gauss.allocator()->allocate();
-    // Fill the input image with the content of the PPM image if a filename was provided:
-    if(ppm.is_open())
-    {
-        ppm.fill_image(src);
-    }
-
-    // Enqueue and flush the scale OpenCL kernel:
-    scale.run();
-    // Create a synchronisation event between scale and median:
-    cl::Event scale_event = CLScheduler::get().enqueue_sync_event();
-    // Enqueue and flush the median OpenCL kernel:
-    median.run();
-    // Enqueue and flush the Gaussian OpenCL kernel:
-    gauss.run();
-
-    //Make sure all the OpenCL jobs are done executing:
-    scale_event.wait();        // Block until Scale is done executing (Median3x3 and Gaussian5x5 might still be running)
-    CLScheduler::get().sync(); // Block until Gaussian5x5 is done executing
-
-    // Save the result to file:
-    if(ppm.is_open())
-    {
-        const std::string output_filename = std::string(argv[1]) + "_out.ppm";
-        save_to_ppm(dst, output_filename); // save_to_ppm maps and unmaps the image to store as PPM
-    }
-    /** [OpenCL events] **/
-}
+private:
+    CLImage       src{}, tmp_scale_median{}, tmp_median_gauss{}, dst{};
+    CLScale       scale{};
+    CLMedian3x3   median{};
+    CLGaussian5x5 gauss{};
+    std::string   output_filename{};
+};
 
 /** Main program for convolution test
  *
@@ -113,5 +123,5 @@
  */
 int main(int argc, char **argv)
 {
-    return utils::run_example(argc, argv, main_cl_events);
+    return utils::run_example<CLEventsExample>(argc, argv);
 }
